Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions plugins/todo-neo/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
81 changes: 81 additions & 0 deletions plugins/todo-neo/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# AGENTS.md

这个项目是 ztools 待办插件,框架是 Vue 3 + Vite + TypeScript。

## 基本约定

- 新增 UI 逻辑时优先沿用现有组件和 composable 的拆分方式。
- README 主要写使用说明,不写偏内部实现的开发细节。
- 组件私有样式尽量写在对应 `.vue` 文件的 scoped style 里。
- 交互改动后尽量用浏览器确认一次。
- 修改数据排序时,要区分“展示过滤后的任务”和“完整分组任务”;持久化重排应基于完整任务列表。
- 日期输入按本地年月日解析,不要用 `new Date('YYYY-MM-DD')` 或 `toISOString().slice(0, 10)` 做回显。

## 代码结构

```text
.
├── public/
│ ├── plugin.json # ztools 插件配置
│ ├── logo.png # 插件图标
│ └── preload/
│ ├── services.js # ztools tool 注册和 preload 服务
│ └── package.json # preload 依赖声明
├── src/
│ ├── App.vue # 根组件,根据 route 渲染主界面或子窗口
│ ├── main.ts # Vue 入口
│ ├── main.css # 全局样式和主题变量
│ ├── featureFlags.ts # 功能开关
│ ├── types.ts # 业务类型
│ ├── utils/
│ │ └── inputAttrs.ts # 输入框通用属性
│ ├── assets/
│ │ └── icons/ # 本地图标资源
│ ├── components/
│ │ ├── MainTodo.vue # 主界面组合
│ │ ├── TodoSidebar.vue # 左侧分组栏
│ │ ├── WorkspaceHeader.vue # 当前分组标题和工具按钮
│ │ ├── TaskList.vue # 待办列表、编辑和新建输入
│ │ ├── TaskSearchPicker.vue # `/` 搜索面板
│ │ ├── SettingsDrawer.vue # 设置抽屉
│ │ ├── TaskDetailDrawer.vue # 任务详情抽屉
│ │ ├── GlobalContextMenu.vue # 统一右键菜单
│ │ ├── ConfirmDialog.vue # 删除确认弹窗
│ │ ├── BaseDrawer.vue # 抽屉基础组件
│ │ └── SvgIcon.vue # SVG 图标组件
│ └── composables/
│ ├── useTodoStore.ts # 组合入口,向组件暴露统一 store
│ ├── useTodoTasks.ts # 任务创建、编辑、删除、完成
│ ├── useTodoGroups.ts # 分组创建、编辑、删除
│ ├── useTodoDrag.ts # 拖拽排序和跨分组移动
│ ├── useTodoKeyboard.ts # Vim/方向键快捷键
│ ├── useTaskSearch.ts # 搜索状态和跳转逻辑
│ ├── useTodoContextMenu.ts # 右键菜单状态
│ ├── useTodoWindows.ts # 子窗口相关入口
│ ├── useTomatoTimer.ts # 计时相关状态
│ ├── todoPersistence.ts # ztools/localStorage 读写适配
│ ├── todoFormatters.ts # 日期和计时格式化
│ └── todoConstants.ts # 默认配置、存储 key、常量
├── package.json # npm 脚本和依赖
├── vite.config.js # Vite 配置
└── tsconfig.json # TypeScript 配置
```

## 验证

常规检查:

```bash
npm run build
```

如果改了 preload:

```bash
node --check public/preload/services.js
```

## Git

- 提交信息保持简短明确,参考现有提交风格。
- 不要回退用户或其他 agent 的未提交改动。
77 changes: 77 additions & 0 deletions plugins/todo-neo/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Todo 待办

一个 ztools 待办插件,用来记录和整理日常任务。

它的主要操作方式偏键盘:不用频繁切鼠标,`j/k` 选任务,`h/l` 切分组,`Enter` 编辑,`Tab` 新建,`/` 搜索。熟悉 Vim 的话基本不用重新记一套操作。

## 使用

打开插件后,左侧是待办分组,右侧是当前分组下的任务列表。

常用操作:

- 点击左侧分组切换列表
- 点击任务选中
- 双击任务进入编辑
- 勾选任务表示完成
- 右键任务可以打开详情或删除
- 右键分组可以编辑或删除
- 拖拽任务可以调整顺序
- 拖拽任务到左侧分组可以移动分组
- 点击左下角“添加分组”创建新分组
- 点击右上角加号在当前任务下方新建任务

## 快捷键

快捷键默认启用,核心键位和 Vim 保持一致。列表操作时可以把它当成一个轻量的 Vim buffer:上下移动、左右切组、搜索、跳顶/跳底都可以直接用键盘完成。

| 按键 | 作用 |
| --- | --- |
| `j` / `↓` | 下一个任务 |
| `k` / `↑` | 上一个任务 |
| `h` / `←` | 上一个分组 |
| `l` / `→` | 下一个分组 |
| `Space` | 完成/取消完成 |
| `Enter` / `i` | 编辑任务 |
| `Tab` / `Ctrl + N` | 新建任务 |
| `/` | 搜索待办 |
| `dd` / `Delete` | 删除任务 |
| `gg` | 跳到顶部 |
| `G` | 跳到底部 |
| `?` | 打开设置 |
| `Esc` | 关闭面板或取消编辑 |

## 搜索

按 `/` 打开搜索框。输入内容后会在所有分组的待办中搜索,可以用上下键选择结果,按 `Enter` 跳转到对应分组和任务。这个入口适合待办很多时快速定位,比先切分组再找要快很多。

## Markdown

任务内容可以按 Markdown 写。打开 Markdown 渲染后,非编辑状态会显示渲染结果,适合记录链接、列表、代码片段或稍长一点的任务说明。

## 设置

设置面板里可以调整:

- 是否隐藏已完成任务
- 已完成任务是否置于底部
- 是否启用 Markdown 渲染

## 开发

```bash
npm install
npm run dev
```

开发地址默认是:

```text
http://localhost:5173
```

构建:

```bash
npm run build
```
11 changes: 11 additions & 0 deletions plugins/todo-neo/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
Loading