diff --git a/.claude/commands/todo.md b/.claude/commands/todo.md index 6cafc6c..a2050fb 100644 --- a/.claude/commands/todo.md +++ b/.claude/commands/todo.md @@ -1,6 +1,6 @@ --- -description: 项目 TODO 管理(list / add / status / done / reject / reopen / rm) -argument-hint: "list | add <描述> | status | done [version] | reject <原因> | reopen | rm " +description: 项目 TODO 管理(list / add / status / done / reject / reopen / rm / sub) +argument-hint: "list | add <描述> | status | done [version] | reject <原因> | reopen | rm | sub add ... | sub status ..." model: claude-sonnet-4-6 allowed-tools: Bash, Read --- @@ -13,6 +13,30 @@ allowed-tools: Bash, Read - `done` 状态可被用户 `reject`(拒绝),退回 `open` 并升为最高优先级 - Claude 可设:`open` / `doing` / `done`;用户专属:`accepted`(`/todo done`)、`reject` +**子任务(subtask)**:复杂任务(tier-1/2)可拆出子任务,SID 格式为 `{parentId}{Letter}`(如 `21A`、`21B`)。 +- 父任务在子任务全部 `done` 前**不得**手动设为 `done`;全部完成时**自动**转为 `done` +- 子任务状态与父任务独立,自身有 `open` / `doing` / `done` 三态 +- 子任务可声明依赖(`deps`),HTML 中以绿/红徽章展示依赖完成情况 + +--- + +## 改动等级 (tier) 与开发流程 + +每个 todo 有两个独立维度:**重要度 `level`**(优先级高低)和 **改动等级 `tier`**(复杂度/工作量)。 + +| tier | 名称 | 判定标准 | 开发流程 | +|------|------|---------|---------| +| 1 | 一级 | 涉及接口设计 / 数据库 schema 变更,**或**改动跨越 **2 个以上模块** | **必须先进 plan 模式**,用户批准方案后才能编码;完成后同步更新 `docs/architecture/`、`docs/api/` 等设计文档 | +| 2 | 二级 | 模块内较大改动,涉及 **5 个文件以上** | 可直接开发,完成后本地验证(build/test/analyze) | +| 3 | 三级 | 小改动、局部优化、bugfix | 可直接开发,完成后本地验证 | + +**判定关键词指引:** +- 一级:「新增接口」「改 schema」「新表」「跨模块」「涉及后端+前端」「新增 API」 +- 二级:「重构」「整页改版」「涉及多个 screen」「较大」 +- 三级:「修复」「bugfix」「优化」「调整文案」「小改」「单文件」 + +**重要**:开发完成后只做本地验证(build / test / analyze),**不要**自动触发 `/release`。发版由用户决定。 + --- 根据 `$ARGUMENTS` 分派,缺省等同 `list`: @@ -31,20 +55,21 @@ node todo/todo.mjs list - `--title`:核心一句话标题(简洁,去掉平台/类别信息) - `--level`:`high`(阻断/紧急)/ `mid`(重要,默认)/ `low`(一般/优化) - 关键词「紧急」「阻断」「必须」「严重」→ high;「重要」「需要」→ mid;其余 → low +- `--tier`:**必须推断**,见上方「改动等级」判定标准,取值 `1`/`2`/`3` - `--tags`:从描述推断平台/类别,可多个逗号分隔,常用值:`前端,后端,Web,mac,Windows,Android,iOS,数据库,CI/CD,文档` - `--desc`:补充说明(可选,如有具体文件/路径/上下文则填入) 然后运行: ```bash -node todo/todo.mjs add --title "..." --level mid --tags "前端,Web" --desc "..." +node todo/todo.mjs add --title "..." --level mid --tier 2 --tags "前端,Web" --desc "..." ``` -转述:「已添加 #id [级别] 标题 标签」,并显示 summary。 +转述:「已添加 #id [级别·等级] 标题 标签」,并显示 summary。 ## status **Claude 在开发过程中主动调用**,更新条目的开发状态: -- 开始处理某个 todo → `status doing` +- 开始处理某个 todo → `status doing`(**先确认 tier**:一级须先 plan 模式,二/三级直接开发) - 开发完成提交验收 → `status done` - 退回重做 → `status open` @@ -99,4 +124,35 @@ node todo/todo.mjs rm --- +## sub add --title "..." [--tier N] [--deps "21A,21B"] + +**Claude 在开发过程中主动调用**,为复杂任务(tier-1/2)添加子任务: +- `parent_id`:父任务数字 id(如 `21`) +- `--title`:子任务标题 +- `--tier`:改动等级(`1`/`2`/`3`,默认 `2`) +- `--deps`:依赖的其他子任务 SID,逗号分隔(如 `"21A,21B"`);被依赖项必须已存在 + +SID 自动分配:第一个子任务为 `{parent_id}A`,依此类推(21A, 21B, 21C…)。 +父任务若为 `open` 状态,添加第一个子任务时自动升为 `doing`。 + +```bash +node todo/todo.mjs sub add --title "..." [--tier N] [--deps "21A,21B"] +``` + +转述:「已添加子任务 {SID} [等级]「{title}」→ #parent 依赖: ...」,并显示 summary。 + +## sub status + +**Claude 在开发过程中主动调用**,更新子任务状态: +- SID 格式:`21A`、`21B`(不区分大小写) +- 当**最后一个子任务**标记为 `done` 时,父任务**自动**转为 `done` + +```bash +node todo/todo.mjs sub status +``` + +转述:「{SID}「{title}」→ {状态}」,若触发父任务自动转换则一并提示。 + +--- + 所有命令完成后,在终端显示来自脚本的完整 summary(按 open / doing / done / accepted 分组)。 diff --git a/todo/todo.html b/todo/todo.html index 1b44bcb..40b6ec7 100644 --- a/todo/todo.html +++ b/todo/todo.html @@ -71,7 +71,6 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; } padding: 14px 18px; margin-bottom: 10px; border-left-width: 4px; } -/* 卡片左边框颜色与状态匹配 */ .todo-card.s-open { border-left-color: #3b82f6; } .todo-card.s-doing { border-left-color: #f97316; } .todo-card.s-done { border-left-color: #eab308; } @@ -99,6 +98,7 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; } .t-tag { background: #efefef; color: #555; cursor: pointer; transition: .12s; } .t-tag:hover { background: #d9e8fb; color: #1d4ed8; } .ver-badge { font-weight: 700; color: #1f7a44; } +.sub-progress-badge { background: #f0f4ff; color: #3730a3; } /* 状态徽章 */ .status-badge { font-size: 11.5px; } @@ -112,6 +112,11 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; } .empty-tip { font-size: 14px; color: #8aa3c4; margin: 8px 0 24px; } .hidden { display: none !important; } +/* ── 改动等级徽章 ── */ +.tier-1 { background: #ede9fe; color: #6d28d9; } +.tier-2 { background: #ccfbf1; color: #0f766e; } +.tier-3 { background: #f1f5f9; color: #475569; } + /* ── 拒绝按钮 & 拒绝原因 ── */ .reject-btn { padding: 3px 10px; border-radius: 6px; border: 1.5px solid #dc2626; @@ -126,6 +131,56 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; } } .reject-date { color: #ef9999; font-size: 12px; } +/* ── 子任务区 ── */ +.subtask-block { + margin-top: 12px; padding: 10px 14px; + background: #f8fafc; border: 1px solid #e4e9ef; border-radius: 8px; +} +.subtask-header { + display: flex; align-items: center; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; +} +.subtask-label { + font-size: 11px; font-weight: 700; color: #7b8794; + text-transform: uppercase; letter-spacing: .6px; +} +.subtask-progress-text { font-size: 12px; color: #52606d; } +.subtask-progress-bar { + flex: 1; height: 5px; background: #e4e9ef; border-radius: 3px; min-width: 60px; +} +.subtask-progress-fill { height: 100%; background: #22c55e; border-radius: 3px; transition: width .4s; } +.subtask-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 5px; } +.subtask-item { + display: flex; align-items: center; gap: 7px; flex-wrap: wrap; + padding: 6px 10px; border-radius: 6px; font-size: 13px; + background: #fff; border: 1px solid #e8edf2; +} +.subtask-item.s-done { background: #f0fdf4; border-color: #bbf7d0; } +.subtask-item.s-doing { background: #fff7ed; border-color: #fed7aa; } +.subtask-item.s-accepted { background: #f0fdf4; border-color: #bbf7d0; opacity: .75; } +.sub-icon { + width: 16px; text-align: center; font-size: 13px; font-weight: 700; flex-shrink: 0; +} +.sub-icon.s-done { color: #16a34a; } +.sub-icon.s-doing { color: #ea580c; } +.sub-icon.s-open { color: #93aec8; } +.sub-icon.s-accepted { color: #16a34a; } +.sub-sid { + font-family: "JetBrains Mono", monospace; font-size: 11.5px; + color: #52606d; font-weight: 700; min-width: 32px; flex-shrink: 0; +} +.sub-title { flex: 1; font-size: 13px; min-width: 120px; } +.subtask-item.s-done .sub-title, +.subtask-item.s-accepted .sub-title { text-decoration: line-through; color: #52606d; } +.sub-badges { display: flex; gap: 4px; flex-wrap: wrap; align-items: center; } +.dep-section { display: flex; align-items: center; gap: 3px; } +.dep-label { font-size: 11px; color: #8aa3c4; margin-right: 2px; } +.dep-badge { + padding: 1px 6px; border-radius: 8px; font-size: 11px; + font-weight: 700; font-family: monospace; cursor: default; +} +.dep-done { background: #dcfce7; color: #166534; } +.dep-pending { background: #fee2e2; color: #b91c1c; } + /* ── 拒绝 Modal ── */ .modal-overlay { position: fixed; inset: 0; background: rgba(0,0,0,.45); @@ -166,12 +221,12 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }

酒库管理系统 — 项目 TODO

-
生成于 2026-06-09 · 真相源 todo/todo.json
+
生成于 2026-06-10 · 真相源 todo/todo.json
24全部
-
6待开始
-
0开发中
-
4待验收
+
4待开始
+
1开发中
+
5待验收
14已验收
@@ -195,6 +250,14 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
+
+ 改动等级 + + + + +
+
平台 / 标签 @@ -206,7 +269,7 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; }
- 📋 待开始 6 + 📋 待开始 4 ▴ 收起
@@ -216,6 +279,7 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; } data-id="2" data-level="high" data-status="open" + data-tier="" data-tags="Web">
备案号为占位假值 @@ -223,10 +287,13 @@ ul.todo-list { list-style: none; margin: 0; padding: 0; } 待开始 高优 · 紧急 + +
现为沪ICP备2026000000号(全0),上线前必须替换真实备案号。
+
1. 客户端「关于我们」页面的「打开文档」「更新日志」链接指向需更新为正确地址。2. Web 营销站新增版本更新页面(/changelog 或 /download/),从 CHANGELOG.md 自动渲染,展示所有历史版本更新记录。
+