add-coder 0.1.12 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +25 -5
- package/package.json +1 -1
- package/templates/core/agents/add-flow-guardian.md +6 -6
- package/templates/core/agents/add-orchestrator.md +2 -2
- package/templates/core/plans/2026-07/08/{farm-agent-add-coder-npm-package-add-route-v1.md → add-coder-npm-package-add-route-v1.md} +9 -9
- package/templates/core/plans/2026-07/08/{farm-agent-add-coder-npm-package-handoff-v1.md → add-coder-npm-package-handoff-v1.md} +43 -43
- package/templates/core/plans/2026-07/08/{farm-agent-add-coder-npm-package-plan-v1.md → add-coder-npm-package-plan-v1.md} +47 -47
- package/templates/core/reports/REPORT-WORKFLOW.md +2 -2
- package/templates/core/reports/index.md +1 -1
- package/templates/core/rules/project_rules.md +29 -29
- package/templates/core/scripts/mcp-server.ts +17 -17
- package/templates/core/skills/add-paradigm/SKILL.md +18 -16
- package/templates/core/skills/session-init/SKILL.md +3 -3
- package/templates/core/specs/{farm-agent-add-coder-npm-package → add-coder-npm-package}/checklist.md +7 -7
- package/templates/core/specs/{farm-agent-add-coder-npm-package → add-coder-npm-package}/spec.md +12 -12
- package/templates/core/specs/{farm-agent-add-coder-npm-package → add-coder-npm-package}/tasks.md +17 -17
- package/templates/core/templates/01-/346/236/266/346/236/204//343/200/212ADD/345/274/200/345/217/221/345/267/245/344/275/234/350/267/257/345/276/204/344/270/216/346/226/207/346/241/243/345/215/217/345/220/214/350/247/204/350/214/203/343/200/213.md +25 -25
- package/templates/core/templates/TERMINOLOGY.md +1 -1
- package/templates/core/templates/checklist-template.md +1 -1
- package/templates/core/templates/handoff-multi-round-template.md +10 -10
- package/templates/core/templates/handoff-single-round-template.md +1 -1
- package/templates/core/templates/index.md +5 -1
- package/templates/core/templates/prd-incremental-template.md +103 -0
- package/templates/core/templates/prd-incremental-template.schema.json +32 -0
- package/templates/core/templates/prd-standard-template.md +219 -0
- package/templates/core/templates/prd-standard-template.schema.json +27 -0
- package/templates/core/templates/simple-plan-template.md +2 -2
- package/templates/core/templates/standard-plan-template.md +9 -9
- package/templates/core/tools/README.md +2 -2
- package/templates/core/vocabulary/add-governance-vocabulary.md +28 -26
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
#
|
|
1
|
+
# add-coder-add-coder-npm-package-plan-v1
|
|
2
2
|
|
|
3
3
|
> **Plan/Spec 边界提醒**:Plan 回答"改什么、为什么改、改哪里"——写到让 Review 能判断方向对不对、有没有遗漏维度的程度(文件路径 + Task 验收标准 + 架构维度全覆盖)。**不要**在 Plan 中写完整 TS 类型定义、WHEN-THEN 场景、精确函数签名——那是 Spec 的职责。
|
|
4
4
|
|
|
5
5
|
## PLAN 元信息
|
|
6
6
|
|
|
7
|
-
- **Plan 名称**:
|
|
7
|
+
- **Plan 名称**: add-coder-add-coder-npm-package-v1
|
|
8
8
|
- **启动时间**: 2026-07-08T00:00:00+08:00
|
|
9
9
|
- **主导 AI**: Qoder (Claude 4)
|
|
10
10
|
- **关联文档**:
|
|
11
|
-
- ADD Route:
|
|
12
|
-
- Handoff:
|
|
13
|
-
- Review:
|
|
14
|
-
- Review v2:
|
|
11
|
+
- ADD Route: `{{magicDir}}/plans/2026-07/08/add-coder-add-coder-npm-package-add-route-v1.md` ✅
|
|
12
|
+
- Handoff: `{{magicDir}}/plans/2026-07/08/add-coder-add-coder-npm-package-handoff-v1.md` ✅
|
|
13
|
+
- Review: `{{magicDir}}/reviews/add-coder-add-coder-npm-package-review-v1.md` ✅
|
|
14
|
+
- Review v2: `{{magicDir}}/reviews/add-coder-add-coder-npm-package-review-v2.md` ✅ — 代码实现评审,2 条 P0(spawnSync catch 失能、ask 重复定义)
|
|
15
15
|
- **ADD-7 审计策略**:
|
|
16
16
|
|
|
17
17
|
| 文件 | targetType | action | beforeState | afterState | 状态 |
|
|
18
18
|
|-----|-----------|--------|------------|-----------|------|
|
|
19
19
|
| packages/add-coder/package.json | PACKAGE | PACKAGE_CONFIG_UPDATED | private:true, 无构建流程 | public, TypeScript 构建, 发布就绪 | 待实施 |
|
|
20
20
|
| packages/add-coder/src/ | SOURCE | SOURCE_CREATED | 无 src 目录 | 完整 CLI + 适配器源码 | 待实施 |
|
|
21
|
-
| packages/add-coder/templates/ | TEMPLATE | TEMPLATE_REFACTORED | 硬编码
|
|
21
|
+
| packages/add-coder/templates/ | TEMPLATE | TEMPLATE_REFACTORED | 硬编码 add-coder 专属 | 参数化占位符 + 通用化 | 待实施 |
|
|
22
22
|
|
|
23
23
|
---
|
|
24
24
|
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
|
|
29
29
|
当前 `packages/add-coder/` 是一个 **不可发布的半成品**:
|
|
30
30
|
|
|
31
|
-
1. **模板硬编码**:`templates/` 下所有文件直接来自
|
|
31
|
+
1. **模板硬编码**:`templates/` 下所有文件直接来自 add-coder 项目,包含数据库密码、项目名、特定路径等不可移植内容
|
|
32
32
|
2. **CLI 纯搬运**:`bin/add-coder.js`(113 行 CommonJS)只有 `init/sync/status` 三个命令,全是 `fs.copyFileSync`,无参数化渲染、无配置合并
|
|
33
33
|
3. **无适配层抽象**:`.qoder` 和 `.vscode` 是两套独立静态模板,无共享逻辑。加 Claude 适配需要再复制一套
|
|
34
34
|
4. **VS Code 无 hook 层**:`.vscode/` 只有 MCP 配置,缺少 Qoder 的 11 个 hook 等价物
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
2. **极客可调**:通过 `add-coder.config.ts` 覆盖任意模板变量、自定义 hook 行为
|
|
44
44
|
3. **多 IDE 兼容**:Claude Code(第一公民)、Qoder/QoderCN(Claude 衍生)、VS Code(阉割版),三层适配器共享同一套 ADD 核心逻辑
|
|
45
45
|
4. **模板参数化**:所有硬编码(项目名、数据库密码、特定路径)替换为 `{{placeholder}}`,`init` 时交互式填充或从配置文件读取
|
|
46
|
-
5. **配置智能合并**:不覆盖用户已有的
|
|
46
|
+
5. **配置智能合并**:不覆盖用户已有的 `{{magicDir}}/settings.json`、`.vscode/settings.json` 等配置
|
|
47
47
|
|
|
48
48
|
---
|
|
49
49
|
|
|
@@ -146,7 +146,7 @@ src/cli/commands/init.ts ── 主命令
|
|
|
146
146
|
│
|
|
147
147
|
├── ① 检测 IDE 环境
|
|
148
148
|
│ src/cli/detect.ts
|
|
149
|
-
│ → 扫描
|
|
149
|
+
│ → 扫描 {{magicDir}}/ .claude/ .vscode/ 存在性 → 确定 targetAdapter
|
|
150
150
|
│ → 若 --adapter 未指定,且检测不到任何 IDE 特征:
|
|
151
151
|
│ 无 package.json → 报错退出(无法确定项目根)
|
|
152
152
|
│ 有 package.json → 交互式提示选择 IDE(claude/qoder/vscode/auto)
|
|
@@ -256,7 +256,7 @@ packages/add-coder/
|
|
|
256
256
|
│ │ │ ├── hooks/ # shell 脚本(共享 core 逻辑,matcher 用标准工具名)
|
|
257
257
|
│ │ │ ├── settings.json
|
|
258
258
|
│ │ │ └── mcp.json
|
|
259
|
-
│ │ ├── qoder/ # 产出
|
|
259
|
+
│ │ ├── qoder/ # 产出 {{magicDir}}/
|
|
260
260
|
│ │ │ ├── hooks/ # shell 脚本(matcher 适配双套工具名)
|
|
261
261
|
│ │ │ ├── settings.json
|
|
262
262
|
│ │ │ ├── mcp.json
|
|
@@ -299,7 +299,7 @@ packages/add-coder/
|
|
|
299
299
|
│ ├── settings.json # ← templates/adapters/{target}/settings.json
|
|
300
300
|
│ └── sync-policy.json # ← templates/adapters/qoder/sync-policy.json
|
|
301
301
|
│
|
|
302
|
-
├──
|
|
302
|
+
├── {{magicDir}}/ # ★ Qoder IDE 配置
|
|
303
303
|
│ ├── agents/ # ← 同 .add/agents/
|
|
304
304
|
│ ├── skills/ # ← 同 .add/skills/
|
|
305
305
|
│ ├── templates/ # ← 同 .add/templates/
|
|
@@ -349,13 +349,13 @@ packages/add-coder/
|
|
|
349
349
|
└── .env.development # prisma init 创建,用户配置 DATABASE_URL
|
|
350
350
|
```
|
|
351
351
|
|
|
352
|
-
> **部署策略**:`templates/core/` 内容复制到 `.add/`、`.
|
|
353
|
-
> IDE 只认自身的 magic path
|
|
352
|
+
> **部署策略**:`templates/core/` 内容复制到 `.add/`、`{{magicDir}}/`、`.claude/` 三个目录。
|
|
353
|
+
> IDE 只认自身的 magic path(`{{magicDir}}/` / `.claude/`),必须各自包含完整内容。
|
|
354
354
|
> `.add/` 保留作为 add-coder 推荐蓝图,供未来工具链引用。
|
|
355
355
|
|
|
356
356
|
> **⚠️ 改造待执行**:当前 `renderCore()` 仅输出到 `.add/`,需改造为三目录并行输出:
|
|
357
357
|
> 1. `src/core/renderer.ts`:`renderCore()` 返回值改为 `Map<string, string>[]`(三份)
|
|
358
|
-
> 2. `src/cli/commands/init.ts`:core 文件写入 `.add/`
|
|
358
|
+
> 2. `src/cli/commands/init.ts`:core 文件写入 `.add/` `{{magicDir}}/` `.claude/` 三个目标
|
|
359
359
|
> 3. adapter renderers:不再单独部署 core 内容,只处理 adapter 专属文件(hooks/mcp/settings)
|
|
360
360
|
> 4. 写入去重:三目录同名文件只写一次,后两次 skip(内容相同)
|
|
361
361
|
|
|
@@ -375,7 +375,7 @@ const adapterDir = path.join(TEMPLATES_ROOT, 'adapters', target)
|
|
|
375
375
|
|
|
376
376
|
| 维度 | Claude Code | Qoder | VS Code |
|
|
377
377
|
|------|--------|-------|---------|
|
|
378
|
-
| Magic Path | `.claude/` |
|
|
378
|
+
| Magic Path | `.claude/` | `{{magicDir}}/` | `.vscode/` |
|
|
379
379
|
| Hook 配置格式 | `settings.json` (Claude schema) | `settings.json` (Qoder schema) | 无原生 hook |
|
|
380
380
|
| Hook 事件数量 | 27 个(含 PreToolUse/PostToolUse/Stop/SessionStart/UserPromptSubmit/PermissionRequest 等) | ~11 个 | 0(可用 tasks.json 模拟文件保存触发) |
|
|
381
381
|
| 工具名 matcher | `Write`, `Edit`, `Bash`(标准名) | `Write\|write_to_file`, `Edit\|edit_file`, `Bash`(双套兼容) | N/A |
|
|
@@ -383,8 +383,8 @@ const adapterDir = path.join(TEMPLATES_ROOT, 'adapters', target)
|
|
|
383
383
|
| 退出码机制 | exit 0 = 放行,exit 2 = 阻断 | exit 0 = 放行,exit 2 = 阻断 | N/A |
|
|
384
384
|
| Hook 脚本 | 完整(与 Qoder 共享核心逻辑,差异仅在 matcher 工具名映射) | 完整(matcher 适配) | 无 |
|
|
385
385
|
| MCP 配置 | `mcp.json` (Claude 格式) | `mcp.json` (Qoder 格式) | `settings.json` 内嵌 |
|
|
386
|
-
| Skills 加载 | `.claude/skills/` |
|
|
387
|
-
| Subagents 加载 | `.claude/agents/` |
|
|
386
|
+
| Skills 加载 | `.claude/skills/` | `{{magicDir}}/skills/` | 不支持 |
|
|
387
|
+
| Subagents 加载 | `.claude/agents/` | `{{magicDir}}/agents/` | 不支持 |
|
|
388
388
|
| 能力声明 | 完整 ADD 运行时 | 完整 ADD 运行时 | 仅模板 + MCP,无 hook 执法 |
|
|
389
389
|
|
|
390
390
|
**关键发现**:Claude Code 和 Qoder 的 hook 退出码机制完全一致(exit 0/2),shell 脚本可 90% 复用。SessionStart、UserPromptSubmit、PermissionRequest 三个事件两者均原生支持,不应在迁移时移除。
|
|
@@ -431,11 +431,11 @@ const adapterDir = path.join(TEMPLATES_ROOT, 'adapters', target)
|
|
|
431
431
|
### 3.5 裁决层:CaijueHub(三段式裁决生成管线)
|
|
432
432
|
|
|
433
433
|
> **定位**:add-coder 聚焦管线阶段 ③④——通用转录引擎 + 编译集成。
|
|
434
|
-
> 阶段 ①②(产品文档 → 规则提取 → caijue.toml)由
|
|
434
|
+
> 阶段 ①②(产品文档 → 规则提取 → caijue.toml)由 add-coder 的独立 Plan 承接,add-coder 不耦合业务域。
|
|
435
435
|
|
|
436
436
|
```
|
|
437
437
|
┌─────────────────────────────────────────────────────────────┐
|
|
438
|
-
│ 阶段 ①②:
|
|
438
|
+
│ 阶段 ①②: add-coder Plan 承接 │
|
|
439
439
|
│ │
|
|
440
440
|
│ 产品文档 → 提取函数 → caijue.toml │
|
|
441
441
|
│ (业务规则) (AI/规则引擎) (规则索引) │
|
|
@@ -552,7 +552,7 @@ init 启动
|
|
|
552
552
|
| IDE 检测 | `{ env: {}, dirs: [] }` | `{ detected: "qoder", via: "QODER_CN_IDE" }` |
|
|
553
553
|
| 配置加载 | `{ sources: ["auto-detect", "defaults"] }` | `{ projectName: "test", ... }` |
|
|
554
554
|
| Prisma 注入 | `{ prisma: "missing" }` | `{ decision: "block", reason: "无 Prisma 目录" }` |
|
|
555
|
-
| Writer 写入 | `{ path: "
|
|
555
|
+
| Writer 写入 | `{ path: "{{magicDir}}/settings.json", existing: true }` | `{ decision: "skip", reason: "--yes" }` |
|
|
556
556
|
|
|
557
557
|
#### 3.5.5 目录结构增量
|
|
558
558
|
|
|
@@ -619,7 +619,7 @@ packages/add-coder/
|
|
|
619
619
|
|
|
620
620
|
**范围**:`templates/core/prisma/add.prisma` + `src/cli/prisma-injector.ts`
|
|
621
621
|
|
|
622
|
-
- 从
|
|
622
|
+
- 从 add-coder 的 `prisma/main.prisma` 中提取 DevOperation 和 AuditLog 模型定义
|
|
623
623
|
- 写入 `templates/core/prisma/add.prisma`(模型定义,无参数化)
|
|
624
624
|
- 实现 `src/cli/prisma-injector.ts`:
|
|
625
625
|
- 检测用户项目是否已有 Prisma(`prisma/` 目录 + `schema.prisma`)→ 无则报错
|
|
@@ -644,29 +644,29 @@ packages/add-coder/
|
|
|
644
644
|
|
|
645
645
|
| # | 文件组 | 文件 | 典型硬编码 | 改为 | 变量类型 |
|
|
646
646
|
|---|--------|------|----------|------|---------|
|
|
647
|
-
| 1 | 模板 | 15 个 `.md` 模板(plan/spec/tasks/checklist/handoff/review/add-route 等) | `docs/大田精准耕播智能决策系统/`、`
|
|
647
|
+
| 1 | 模板 | 15 个 `.md` 模板(plan/spec/tasks/checklist/handoff/review/add-route 等) | `docs/大田精准耕播智能决策系统/`、`add-coder-*` 文件名示例 | `{{docsDir}}/`、`{{projectName}}-*` | Init-time |
|
|
648
648
|
| 2 | 模板 Schema | 15 个 `.schema.json` | 无硬编码(结构定义) | 无需修改 | — |
|
|
649
|
-
| 3 | Skills | `skills/add-paradigm/SKILL.md` | `docs/大田精准耕播智能决策系统/`、`/home/xmm/ai/
|
|
650
|
-
| 4 | Skills | `skills/session-init/SKILL.md` | `
|
|
649
|
+
| 3 | Skills | `skills/add-paradigm/SKILL.md` | `docs/大田精准耕播智能决策系统/`、`/home/xmm/ai/add-coder/`、`add-coder-response-strategy/` 示例 | `{{docsDir}}/`、`{{projectRoot}}/`、`{{projectName}}-*` | Init-time |
|
|
650
|
+
| 4 | Skills | `skills/session-init/SKILL.md` | `add-coder-review-runtime.md` 示例 | `{{projectName}}-review-runtime.md` | Init-time |
|
|
651
651
|
| 5 | Agents | `agents/add-flow-guardian.md` | 无项目特定硬编码 | 检查确认 | — |
|
|
652
652
|
| 6 | Agents | `agents/add-orchestrator.md` | 无项目特定硬编码 | 检查确认 | — |
|
|
653
|
-
| 7 | Rules | `rules/project_rules.md` | `
|
|
653
|
+
| 7 | Rules | `rules/project_rules.md` | `add-coder` 项目名、`src/agents/` 路径 | `{{projectName}}`、`{{sourceDir}}/agents/` | Init-time |
|
|
654
654
|
| 8 | Rules | `rules/theory-practice-map.toml` | 无项目特定硬编码 | 检查确认 | — |
|
|
655
655
|
| 9 | 词汇 | `vocabulary/add-governance-vocabulary.md` | 无项目特定硬编码 | 检查确认 | — |
|
|
656
656
|
| 10 | 脚本 | `scripts/mcp-server.ts` | `DATABASE_URL \|\| "postgresql://farm_admin:farm_secure_pass_2024@..."`、`".env.development"` | `process.env.DATABASE_URL`(无兜底值)、`"{{envFilePath}}"` | Runtime + Init-time |
|
|
657
657
|
| 11 | 脚本 | `scripts/add-coder-mcp-server.ts` | 同上 | 同上 | Runtime + Init-time |
|
|
658
|
-
| 12 | Hook 配置 |
|
|
659
|
-
| 13 | MCP 配置 |
|
|
660
|
-
| 14 | 同步策略 |
|
|
661
|
-
| 15 | Hook 脚本 |
|
|
658
|
+
| 12 | Hook 配置 | `{{magicDir}}/settings.json` | hook 脚本绝对路径 `/home/xmm/ai/add-coder/{{magicDir}}/hooks/` | `{{projectRoot}}/{{magicDir}}/hooks/` | Init-time |
|
|
659
|
+
| 13 | MCP 配置 | `{{magicDir}}/mcp.json` | `DATABASE_URL` 硬编码密码 | `process.env.DATABASE_URL`(无兜底值) | Runtime |
|
|
660
|
+
| 14 | 同步策略 | `{{magicDir}}/sync-policy.json` | 无项目特定硬编码 | 检查确认 | — |
|
|
661
|
+
| 15 | Hook 脚本 | `{{magicDir}}/hooks/` 下 14 个 `.sh` 文件 | `state-detect.sh` 中项目名提取逻辑、hook 脚本内部绝对路径 | 使用 `$CLAUDE_PROJECT_DIR` 或 `{{projectRoot}}` 替代 | Init-time |
|
|
662
662
|
| 16 | VS Code | `.vscode/settings.json` | MCP 配置中的项目特定路径 | `{{projectRoot}}` | Init-time |
|
|
663
663
|
| 17 | VS Code | `.vscode/tasks.json` | 无项目特定硬编码 | 检查确认 | — |
|
|
664
664
|
| 18 | VS Code | `.vscode/launch.json` | 无项目特定硬编码 | 检查确认 | — |
|
|
665
665
|
| 19 | VS Code | `.vscode/extensions.json` | 无项目特定硬编码 | 检查确认 | — |
|
|
666
|
-
| 20 | Reports | `reports/` 下 7 个文件 | `
|
|
666
|
+
| 20 | Reports | `reports/` 下 7 个文件 | `add-coder`、`/Users/milkytea/WebstormProjects/rfMain/智能体/add-coder/` 等绝对路径 | 全部 `{{projectName}}`、`{{projectRoot}}` | Init-time |
|
|
667
667
|
| 21 | 工具 | `tools/README.md` | 无项目特定硬编码 | 检查确认 | — |
|
|
668
668
|
| 22 | Prisma | `prisma/add.prisma` | 无硬编码(模型定义,直接复制到用户项目) | 无需修改 | — |
|
|
669
|
-
| 23 | Grounding 文档 | `docs/01-架构/《ADD开发工作路径与文档协同规范》.md` | `docs/大田精准耕播智能决策系统/`、`
|
|
669
|
+
| 23 | Grounding 文档 | `docs/01-架构/《ADD开发工作路径与文档协同规范》.md` | `docs/大田精准耕播智能决策系统/`、`add-coder-*` 文件名示例(15 处) | `{{docsDir}}/`、`{{projectName}}-*` | Init-time |
|
|
670
670
|
|
|
671
671
|
- 创建 `src/core/renderer.ts`:接收 config 对象,执行 `"{{projectName}}".replace("{{projectName}}", config.name)`
|
|
672
672
|
|
|
@@ -694,10 +694,10 @@ packages/add-coder/
|
|
|
694
694
|
| `reports/` | `templates/core/reports/` | IDE 无关 |
|
|
695
695
|
| `tools/` | `templates/core/tools/` | IDE 无关 |
|
|
696
696
|
| `docs/`(grounding 文档:00-需求/01-架构/02-规范) | `templates/core/docs/` | 保留子目录结构 |
|
|
697
|
-
|
|
|
698
|
-
|
|
|
699
|
-
|
|
|
700
|
-
|
|
|
697
|
+
| `{{magicDir}}/hooks/`(14 个 .sh + lib/) | `templates/adapters/qoder/hooks/` | Qoder 适配器 |
|
|
698
|
+
| `{{magicDir}}/settings.json` | `templates/adapters/qoder/settings.json` | Qoder 适配器 |
|
|
699
|
+
| `{{magicDir}}/mcp.json` | `templates/adapters/qoder/mcp.json` | Qoder 适配器 |
|
|
700
|
+
| `{{magicDir}}/sync-policy.json` | `templates/adapters/qoder/sync-policy.json` | Qoder 适配器 |
|
|
701
701
|
| `.vscode/`(4 个文件) | `templates/adapters/vscode/` | VS Code 适配器 |
|
|
702
702
|
| `debug-dump/`, `repowiki/` | `templates/shared/` | 空目录占位,init 时在用户项目中创建 |
|
|
703
703
|
| 无(新建) | `templates/adapters/claude/` | Claude 适配器,从 qoder 派生 |
|
|
@@ -729,12 +729,12 @@ packages/add-coder/
|
|
|
729
729
|
|
|
730
730
|
**范围**:`templates/adapters/qoder/` + `src/adapters/qoder/renderer.ts`
|
|
731
731
|
|
|
732
|
-
- 从现有 `templates
|
|
732
|
+
- 从现有 `templates/{{magicDir}}/` 迁移到 `templates/adapters/qoder/`,清理 hardcode
|
|
733
733
|
- `settings.json` 的 matcher 适配:`Write|write_to_file|create_file|CreateFile` 等双套工具名
|
|
734
734
|
- 保留 Qoder 专有事件:`SessionStart`, `UserPromptSubmit`, `PermissionRequest`
|
|
735
735
|
- 实现 `src/adapters/qoder/renderer.ts`
|
|
736
736
|
|
|
737
|
-
**验收**:`npx add-coder init --adapter qoder` 生成正确的
|
|
737
|
+
**验收**:`npx add-coder init --adapter qoder` 生成正确的 `{{magicDir}}/` 目录
|
|
738
738
|
|
|
739
739
|
#### Task 2: VS Code 适配器实现
|
|
740
740
|
|
|
@@ -867,11 +867,11 @@ packages/add-coder/
|
|
|
867
867
|
|
|
868
868
|
- [ ] `npx add-coder init` 在空白项目中零配置生成完整 ADD 模板
|
|
869
869
|
- [ ] `npx add-coder init --adapter claude` 生成 `.claude/` 目录
|
|
870
|
-
- [ ] `npx add-coder init --adapter qoder` 生成
|
|
870
|
+
- [ ] `npx add-coder init --adapter qoder` 生成 `{{magicDir}}/` 目录
|
|
871
871
|
- [ ] `npx add-coder init --adapter vscode` 生成 `.vscode/` 目录
|
|
872
|
-
- [ ] 模板中无
|
|
872
|
+
- [ ] 模板中无 add-coder 硬编码(`grep -r "farm.agent\|大田" dist/` 返回空)
|
|
873
873
|
- [ ] `add-coder.config.ts` 可覆盖项目名、源码目录、日志目录等
|
|
874
|
-
- [ ] 已有
|
|
874
|
+
- [ ] 已有 `{{magicDir}}/settings.json` 时 `init` 不覆盖,展示 diff 并交互确认
|
|
875
875
|
- [ ] `npx tsc --noEmit` 通过
|
|
876
876
|
- [ ] `npm pack` 产出的 tarball 包含 `dist/` + `templates/` + `bin/`,不包含 `src/`
|
|
877
877
|
- [ ] `package.json` 中 `"private": false`
|
|
@@ -887,9 +887,9 @@ packages/add-coder/
|
|
|
887
887
|
|
|
888
888
|
| 文档 | 路径 | 状态 |
|
|
889
889
|
|------|------|:--:|
|
|
890
|
-
| ADD Route |
|
|
891
|
-
| Handoff |
|
|
892
|
-
| Review |
|
|
893
|
-
| Spec |
|
|
894
|
-
| Tasks |
|
|
895
|
-
| Checklist |
|
|
890
|
+
| ADD Route | `{{magicDir}}/plans/2026-07/08/add-coder-add-coder-npm-package-add-route-v1.md` | ✅ |
|
|
891
|
+
| Handoff | `{{magicDir}}/plans/2026-07/08/add-coder-add-coder-npm-package-handoff-v1.md` | ✅ |
|
|
892
|
+
| Review | `{{magicDir}}/reviews/add-coder-add-coder-npm-package-review-v1.md` | ✅ |
|
|
893
|
+
| Spec | `{{magicDir}}/specs/add-coder-add-coder-npm-package/spec.md` | ✅ |
|
|
894
|
+
| Tasks | `{{magicDir}}/specs/add-coder-add-coder-npm-package/tasks.md` | ✅ |
|
|
895
|
+
| Checklist | `{{magicDir}}/specs/add-coder-add-coder-npm-package/checklist.md` | ✅ |
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
## 目录结构
|
|
8
8
|
|
|
9
9
|
```
|
|
10
|
-
|
|
10
|
+
{{magicDir}}/reports/
|
|
11
11
|
├── REPORT-WORKFLOW.md ← 本文件
|
|
12
12
|
├── boundary-runtime-report.md ← Runtime Report ↔ 静态 Report 边界划分
|
|
13
13
|
├── index.md ← Issue 注册表(由 gen-report-index.sh 每天自动生成,勿手动编辑)
|
|
@@ -130,7 +130,7 @@ runtime-issue-{date}-{seq}.md
|
|
|
130
130
|
▼
|
|
131
131
|
创建 runtime-fix-plan-v1.md
|
|
132
132
|
│ 命名: {子系统}-runtime-fix-{关键词}-plan-v1.md
|
|
133
|
-
│ 位置:
|
|
133
|
+
│ 位置: {{magicDir}}/plans/{YYYY-MM}/{DD}/
|
|
134
134
|
│ 模板: plan-template.md
|
|
135
135
|
│
|
|
136
136
|
▼
|
|
@@ -38,13 +38,13 @@ AI 助手必须先恢复到基线、找到对应的 SKILL 文件并按步骤执
|
|
|
38
38
|
|
|
39
39
|
### ADD 词汇→操作映射(L1 预埋)
|
|
40
40
|
|
|
41
|
-
>
|
|
41
|
+
> **完整词汇表已独立维护**:`{{magicDir}}/vocabulary/add-governance-vocabulary.md`
|
|
42
42
|
> **六类分类**: A.文档类型 / B.ADD阶段 / C.门禁/闸门 / D.MCP工具 / E.Skills/Subagents / F.核心概念
|
|
43
43
|
> **消费者**: IDE 侧 LLM + 未来治理 AI。领域触发词汇(面向 {{projectName}} 运行时用户 LLM)另有独立路径。
|
|
44
44
|
|
|
45
45
|
### 理论→实践映射
|
|
46
46
|
|
|
47
|
-
>
|
|
47
|
+
> 完整结构化映射:`{{magicDir}}/rules/theory-practice-map.toml`(可被脚本解析验证)
|
|
48
48
|
|
|
49
49
|
| 规则 | 实践位置 | 触发时机 |
|
|
50
50
|
|------|---------|---------|
|
|
@@ -73,7 +73,7 @@ AI 助手必须先恢复到基线、找到对应的 SKILL 文件并按步骤执
|
|
|
73
73
|
|
|
74
74
|
**触发条件**:每次新对话启动时,作为第一个操作执行。
|
|
75
75
|
|
|
76
|
-
SKILL 文件位于
|
|
76
|
+
SKILL 文件位于 `{{magicDir}}/skills/session-init/SKILL.md`,包含 4 个步骤:
|
|
77
77
|
1. 查询 `query_audit_logs({})` 获取最近的开发操作记录
|
|
78
78
|
2. 分析审计日志推断上下文
|
|
79
79
|
3. 构建上下文摘要
|
|
@@ -87,7 +87,7 @@ SKILL 文件位于 `.qoder/skills/session-init/SKILL.md`,包含 4 个步骤:
|
|
|
87
87
|
|
|
88
88
|
**触发条件**:用户提出任何功能开发、Bug 修复、系统修改需求时。
|
|
89
89
|
|
|
90
|
-
SKILL 文件位于
|
|
90
|
+
SKILL 文件位于 `{{magicDir}}/skills/add-paradigm/SKILL.md`,包含 10 个阶段(Step 0 - Step 9),每个阶段包含若干子步骤:
|
|
91
91
|
0. 文档先行(Documentation First — 在编写任何代码之前更新项目文档 + 验收后回看架构文档)
|
|
92
92
|
1. 功能分析与审计阶段定义
|
|
93
93
|
2. 审计基础设施实现
|
|
@@ -148,7 +148,7 @@ ADD 是**开发阶段**的编程范式,不是运行时范式。
|
|
|
148
148
|
| 架构文档 | `docs/*/knowledge/01-架构/` 或 `02-架构/` | 架构说明书、系统设计、模块定义 |
|
|
149
149
|
| 规范文档 | `docs/*/knowledge/02-规范/` 或 `03-规范/` | 开发规范、AI 核心规范、状态机规范 |
|
|
150
150
|
|
|
151
|
-
**此外,ADD 工作流的核心产物由
|
|
151
|
+
**此外,ADD 工作流的核心产物由 `{{magicDir}}/templates/` 下的 11 个模板定义**,这些模板不是参考资料,而是每次变更必须产出的文档骨架。分析变更影响范围时,必须同步确认需要创建/更新哪些模板产物:
|
|
152
152
|
|
|
153
153
|
| 模板 | 用途 | 对应阶段 |
|
|
154
154
|
|------|------|---------|
|
|
@@ -425,7 +425,7 @@ reason: 中文/英文说明本次改动的目的
|
|
|
425
425
|
正确示例:
|
|
426
426
|
- ✅ `src/middleware.ts`({{projectName}} workspace 内)
|
|
427
427
|
- ✅ `agrisynapse/src/api/agent/types.ts`(跨项目时带项目名前缀)
|
|
428
|
-
- ✅
|
|
428
|
+
- ✅ `{{magicDir}}/plans/{{projectName}}-agrisynapse-integration-plan-v1.md`(.qoder 内文件)
|
|
429
429
|
|
|
430
430
|
原因:`query_audit_logs({ targetId })` 做精确匹配,绝对路径和相对路径是两条不同的记录,导致漏查。
|
|
431
431
|
|
|
@@ -447,13 +447,13 @@ ADD 开发流程产生多种产物(方案、拆分、交接、评审、spec)
|
|
|
447
447
|
| `docs/哲学理论/` | 哲学理论基础文章 | 公开 |
|
|
448
448
|
| `{{docsDir}}/` | 项目文档(需求/架构/规范) | 公开 |
|
|
449
449
|
| `TODO/` | 开源协作 TODO,与 docs/ 平级 | 公开 |
|
|
450
|
-
|
|
|
451
|
-
|
|
|
452
|
-
|
|
|
453
|
-
|
|
|
454
|
-
|
|
|
455
|
-
|
|
|
456
|
-
|
|
|
450
|
+
| `{{magicDir}}/plans/` | 需求方案(plan)+ 任务拆分(execution)+ 轮间交接手册(handoff) | 开发内部 |
|
|
451
|
+
| `{{magicDir}}/reviews/` | 方案评审 + 逐轮 spec 评审 | 开发内部 |
|
|
452
|
+
| `{{magicDir}}/specs/` | 每轮 spec + tasks + checklist(三件套) | 开发内部 |
|
|
453
|
+
| `{{magicDir}}/templates/` | 文档模板(plan/spec/tasks/checklist/review) | 开发内部 |
|
|
454
|
+
| `{{magicDir}}/rules/` | 项目规则文件 | 开发内部 |
|
|
455
|
+
| `{{magicDir}}/skills/` | SKILL 行为定义 | 开发内部 |
|
|
456
|
+
| `{{magicDir}}/scripts/` | 工具脚本 + MCP 服务器 | 开发内部 |
|
|
457
457
|
|
|
458
458
|
### 命名规范
|
|
459
459
|
|
|
@@ -466,31 +466,31 @@ ADD 开发流程产生多种产物(方案、拆分、交接、评审、spec)
|
|
|
466
466
|
### ADD 工作流三大阶段与目录对应
|
|
467
467
|
|
|
468
468
|
```
|
|
469
|
-
需求理解 + 任务拆分 →
|
|
469
|
+
需求理解 + 任务拆分 → {{magicDir}}/plans/ (plan + execution + handoff)
|
|
470
470
|
↓
|
|
471
|
-
Review(强制关卡) →
|
|
471
|
+
Review(强制关卡) → {{magicDir}}/reviews/ (plan-review + roundN-spec-review)
|
|
472
472
|
↓
|
|
473
|
-
Spec 执行 →
|
|
473
|
+
Spec 执行 → {{magicDir}}/specs/ (三件套:spec + tasks + checklist)
|
|
474
474
|
```
|
|
475
475
|
|
|
476
476
|
**Review 强制关卡约束**:每轮计划在实际代码改动之前,必须先生成 Review 文件并通过评审。
|
|
477
477
|
- Review 是 **spec → 代码** 之间的强制关卡,未通过 Review 不得写代码
|
|
478
478
|
- Review 至少包含:元信息(对象/方案/时间/类型)、问题复现、方案对比、决策结论
|
|
479
|
-
- 每轮的 Review
|
|
479
|
+
- 每轮的 Review 文件路径:`{{magicDir}}/reviews/{需求域名}-round{N}-{核心内容}-spec-review-v{版本}.md`
|
|
480
480
|
|
|
481
481
|
### 文档产出物模板
|
|
482
482
|
|
|
483
|
-
ADD 开发流程产生五类文档,模板文件位于
|
|
483
|
+
ADD 开发流程产生五类文档,模板文件位于 `{{magicDir}}/templates/`:
|
|
484
484
|
|
|
485
485
|
| 模板 | 文件路径 | 说明 |
|
|
486
486
|
|------|---------|------|
|
|
487
|
-
| Plan |
|
|
488
|
-
| Spec |
|
|
489
|
-
| Tasks |
|
|
490
|
-
| Checklist |
|
|
491
|
-
| Review |
|
|
492
|
-
| Handoff(单轮) |
|
|
493
|
-
| Handoff(多轮) |
|
|
487
|
+
| Plan | `{{magicDir}}/templates/plan-template.md` | 元信息 + 背景目标 + 方案选型 + 架构设计 + 实施步骤 + 验收标准 + 关联文档 |
|
|
488
|
+
| Spec | `{{magicDir}}/templates/spec-template.md` | Why + What Changes + Impact + Requirements(WHEN/THEN) |
|
|
489
|
+
| Tasks | `{{magicDir}}/templates/tasks-template.md` | Phase → Task → SubTask 层级 |
|
|
490
|
+
| Checklist | `{{magicDir}}/templates/checklist-template.md` | Phase 检查项 + ADD 规则合规检查 |
|
|
491
|
+
| Review | `{{magicDir}}/templates/review-template.md` | 元信息 + 问题复现 + 方案对比 + 决策结论 + 影响评估 |
|
|
492
|
+
| Handoff(单轮) | `{{magicDir}}/templates/handoff-single-round-template.md` | 单轮变更 Handoff 基础格式(9 章节) |
|
|
493
|
+
| Handoff(多轮) | `{{magicDir}}/templates/handoff-multi-round-template.md` | 多轮原子事务 Handoff(全局结构 + 13 子章节 + 收敛规则 + 启动模板) |
|
|
494
494
|
|
|
495
495
|
使用时直接复制模板文件到目标路径,将 `{...}` 占位符替换为实际内容。
|
|
496
496
|
|
|
@@ -571,7 +571,7 @@ Handoff 分两种场景,格式要求不同:
|
|
|
571
571
|
| 2 | **上游已完成** | ✅ | 列表:上游本轮依赖的能力/文件/状态(不允许靠记忆,必须写清楚) |
|
|
572
572
|
| 3 | **恢复上下文审计查询** | ✅ | MCP 工具调用列表,按"第一步搜索代码 → 第二步搜索文档 → 第三步按行动词"组织。每个 `query_audit_logs` 写清楚预期命中数和返回内容摘要 |
|
|
573
573
|
| 4 | **原子事务目标** | ✅ | 一句话概括本轮目标;覆盖父 Plan 的哪个 Step |
|
|
574
|
-
| 5 | **spec 文件** | ✅ |
|
|
574
|
+
| 5 | **spec 文件** | ✅ | `{{magicDir}}/specs/{spec-name}/spec.md` + `tasks.md` + `checklist.md` 三件套路径 |
|
|
575
575
|
| 6 | **架构文档** | ✅ | 关联的 `docs/` 下架构/技术文档路径 + 对应章节号 |
|
|
576
576
|
| 7 | **你要改的文件** | ✅ | 表格:文件路径 + 操作(新建/修改)+ 改什么(一句话) |
|
|
577
577
|
| 8 | **核心设计** | 🔶 | 本轮最关键的代码片段/设计要点,不超过 10 行 |
|
|
@@ -827,12 +827,12 @@ AI 助手遵循"调用工具 → 获得结果 → 编码 → 验证"的闭环流
|
|
|
827
827
|
|
|
828
828
|
### MCP-5:稀疏推理恢复(Sparse Inference Recovery)
|
|
829
829
|
|
|
830
|
-
AI 助手在**每次新对话启动时**,必须先执行
|
|
830
|
+
AI 助手在**每次新对话启动时**,必须先执行 `{{magicDir}}/skills/session-init/SKILL.md`(SKILL-1 会话初始化),作为**不可跳过的前置操作**。
|
|
831
831
|
|
|
832
832
|
`session-init` SKILL 的 Step 1 要求调用 `query_audit_logs` 工具查询开发操作审计记录,以恢复开发上下文。
|
|
833
833
|
|
|
834
834
|
**执行顺序**(新对话启动时的首个操作):
|
|
835
|
-
1. 定位并执行 `session-init` SKILL
|
|
835
|
+
1. 定位并执行 `session-init` SKILL(`{{magicDir}}/skills/session-init/SKILL.md`)
|
|
836
836
|
2. 按 SKILL 的 Step 1 调用 `query_audit_logs({})` 查询
|
|
837
837
|
3. 按 SKILL 的 Step 2 分析推断上下文
|
|
838
838
|
4. 按 SKILL 的 Step 3 构建摘要
|
|
@@ -867,7 +867,7 @@ AI 助手在**每次新对话启动时**,必须先执行 `.qoder/skills/sessio
|
|
|
867
867
|
|
|
868
868
|
### MCP 配置
|
|
869
869
|
|
|
870
|
-
MCP 服务器配置在
|
|
870
|
+
MCP 服务器配置在 `{{magicDir}}/mcp.json`,通过 `npx tsx {{magicDir}}/scripts/mcp-server.ts` 启动。
|
|
871
871
|
Trae IDE 加载项目时自动连接 MCP 服务器。
|
|
872
872
|
|
|
873
873
|
### 附录
|
|
@@ -394,7 +394,7 @@ server.registerTool(
|
|
|
394
394
|
|
|
395
395
|
// ADD 工作流产物目录
|
|
396
396
|
parts.push(`=== ${MAGIC_DIR}/ ADD 工作流产物 ===`)
|
|
397
|
-
const
|
|
397
|
+
const magicDirs = [
|
|
398
398
|
{ dir: "templates", desc: "ADD 文档模板(11 个)" },
|
|
399
399
|
{ dir: "specs", desc: "specs 三元组(spec+tasks+checklist)" },
|
|
400
400
|
{ dir: "reviews", desc: "方案审查 + 实现审查 + 运行时审查" },
|
|
@@ -403,7 +403,7 @@ server.registerTool(
|
|
|
403
403
|
{ dir: "skills", desc: "SKILL 行为定义(add-paradigm / session-init)" },
|
|
404
404
|
{ dir: "scripts", desc: "工具脚本 + MCP 服务器" },
|
|
405
405
|
]
|
|
406
|
-
for (const { dir, desc } of
|
|
406
|
+
for (const { dir, desc } of magicDirs) {
|
|
407
407
|
const fullPath = join(PROJECT_ROOT, MAGIC_DIR, dir)
|
|
408
408
|
if (existsSync(fullPath)) {
|
|
409
409
|
const entries = await readdir(fullPath)
|
|
@@ -981,7 +981,7 @@ export async function record${featureName}Audit(record: ${featureName}AuditRecor
|
|
|
981
981
|
server.registerTool(
|
|
982
982
|
"query_audit_logs",
|
|
983
983
|
{
|
|
984
|
-
description: "稀疏查询开发操作审计日志(DevOperation 表,MCP-5 稀疏推理恢复)。支持多维度检索,AI 可在不同对话会话中通过任意维度组合查询之前的开发操作记录,实现跨会话的上下文恢复。\n\n典型用法:\n- query_audit_logs({ targetType: \"API_ROUTE\" }) — 查所有 API 路由改动\n- query_audit_logs({ targetId: \"src/app/api/knowledge/route.ts\" }) — 查特定文件改动\n- query_audit_logs({ keyword: \"pagination\" }) — 按关键词搜索\n- query_audit_logs({ planKeyword: \"add-
|
|
984
|
+
description: "稀疏查询开发操作审计日志(DevOperation 表,MCP-5 稀疏推理恢复)。支持多维度检索,AI 可在不同对话会话中通过任意维度组合查询之前的开发操作记录,实现跨会话的上下文恢复。\n\n典型用法:\n- query_audit_logs({ targetType: \"API_ROUTE\" }) — 查所有 API 路由改动\n- query_audit_logs({ targetId: \"src/app/api/knowledge/route.ts\" }) — 查特定文件改动\n- query_audit_logs({ keyword: \"pagination\" }) — 按关键词搜索\n- query_audit_logs({ planKeyword: \"add-coder\" }) — 按 Plan 关键词查该 Plan 下所有 devlog\n- query_audit_logs({}) — 查最近的记录(session-init 会话恢复)",
|
|
985
985
|
inputSchema: {
|
|
986
986
|
targetType: z.string().optional().describe("按目标类型精确过滤"),
|
|
987
987
|
action: z.string().optional().describe("按操作类型精确过滤"),
|
|
@@ -1223,7 +1223,7 @@ server.registerTool(
|
|
|
1223
1223
|
}
|
|
1224
1224
|
|
|
1225
1225
|
// ${MAGIC_DIR}/ 产物类别映射
|
|
1226
|
-
const
|
|
1226
|
+
const magicCategoryMap: Record<string, string> = {
|
|
1227
1227
|
plans: "plan",
|
|
1228
1228
|
specs: "spec",
|
|
1229
1229
|
reviews: "review",
|
|
@@ -1232,7 +1232,7 @@ server.registerTool(
|
|
|
1232
1232
|
// 收集所有 Markdown 文件
|
|
1233
1233
|
const allFiles: Array<{ path: string; relativePath: string; category: string }> = []
|
|
1234
1234
|
|
|
1235
|
-
const walkDir = async (dir: string, relativeDir: string, sourceType: "docs" | "
|
|
1235
|
+
const walkDir = async (dir: string, relativeDir: string, sourceType: "docs" | "magic" = "docs"): Promise<void> => {
|
|
1236
1236
|
try {
|
|
1237
1237
|
const entries = await readdir(dir, { withFileTypes: true })
|
|
1238
1238
|
for (const entry of entries) {
|
|
@@ -1242,10 +1242,10 @@ server.registerTool(
|
|
|
1242
1242
|
await walkDir(fullPath, relPath, sourceType)
|
|
1243
1243
|
} else if (entry.isFile() && (entry.name.endsWith(".md") || entry.name.endsWith(".html"))) {
|
|
1244
1244
|
let docCategory = "unknown"
|
|
1245
|
-
if (sourceType === "
|
|
1245
|
+
if (sourceType === "magic") {
|
|
1246
1246
|
// ${MAGIC_DIR}/ 产物按目录分类
|
|
1247
1247
|
const topDir = relPath.split("/")[0]
|
|
1248
|
-
docCategory =
|
|
1248
|
+
docCategory = magicCategoryMap[topDir] || "unknown"
|
|
1249
1249
|
// handoff 文件特殊识别(存放在 plans/ 下但含 handoff 关键词)
|
|
1250
1250
|
if (topDir === "plans" && entry.name.includes("handoff")) {
|
|
1251
1251
|
docCategory = "handoff"
|
|
@@ -1274,11 +1274,11 @@ server.registerTool(
|
|
|
1274
1274
|
// 搜索 docs/ 目录
|
|
1275
1275
|
await walkDir(docsDir, "", "docs")
|
|
1276
1276
|
// 搜索 ${MAGIC_DIR}/ 产物目录(plans/specs/reviews)
|
|
1277
|
-
const
|
|
1278
|
-
for (const
|
|
1279
|
-
const
|
|
1280
|
-
if (existsSync(
|
|
1281
|
-
await walkDir(
|
|
1277
|
+
const magicSearchDirs = ["plans", "specs", "reviews"]
|
|
1278
|
+
for (const mDir of magicSearchDirs) {
|
|
1279
|
+
const mPath = join(PROJECT_ROOT, MAGIC_DIR, mDir)
|
|
1280
|
+
if (existsSync(mPath)) {
|
|
1281
|
+
await walkDir(mPath, mDir, "magic")
|
|
1282
1282
|
}
|
|
1283
1283
|
}
|
|
1284
1284
|
|
|
@@ -2127,12 +2127,12 @@ server.registerTool(
|
|
|
2127
2127
|
const planContent = await readFileSafe(planPath)
|
|
2128
2128
|
let specDirName = ""
|
|
2129
2129
|
if (planContent) {
|
|
2130
|
-
const specMatch = planContent.match(/Spec:\s*\.qoder\/specs\/([^/\s]+)/)
|
|
2130
|
+
const specMatch = planContent.match(/Spec:\s*\.(qoder|claude|add|vscode)\/specs\/([^/\s]+)/)
|
|
2131
2131
|
if (specMatch) specDirName = specMatch[1]
|
|
2132
2132
|
}
|
|
2133
2133
|
if (!specDirName) {
|
|
2134
2134
|
// 退而求其次:从 tasks.md 引用提取
|
|
2135
|
-
const taskMatch = planContent?.match(/Tasks:\s*\.qoder\/specs\/([^/\s]+)/)
|
|
2135
|
+
const taskMatch = planContent?.match(/Tasks:\s*\.(qoder|claude|add|vscode)\/specs\/([^/\s]+)/)
|
|
2136
2136
|
if (taskMatch) specDirName = taskMatch[1]
|
|
2137
2137
|
}
|
|
2138
2138
|
if (!specDirName) {
|
|
@@ -2809,7 +2809,7 @@ server.registerTool(
|
|
|
2809
2809
|
if (existsSync(reviewsDir)) {
|
|
2810
2810
|
const reviewFiles = await readdir(reviewsDir)
|
|
2811
2811
|
// 从 Plan 全文提取所有 Review 引用,优先匹配含 planKeyword 的
|
|
2812
|
-
const allReviewRefs = Array.from(planContent.matchAll(/\.qoder\/reviews\/([^\s)]+\.md)/g))
|
|
2812
|
+
const allReviewRefs = Array.from(planContent.matchAll(/\.(qoder|claude|add|vscode)\/reviews\/([^\s)]+\.md)/g))
|
|
2813
2813
|
.map(m => m[1].split("/").pop() || "")
|
|
2814
2814
|
.filter(Boolean)
|
|
2815
2815
|
// 策略1: 在所有引用中优先选含 planKeyword 的
|
|
@@ -2837,10 +2837,10 @@ server.registerTool(
|
|
|
2837
2837
|
let specContent = ""
|
|
2838
2838
|
let tasksContent = ""
|
|
2839
2839
|
// 从 Plan 绑定或 §7 提取
|
|
2840
|
-
const specRef = planContent.match(/Spec:\s*\.qoder\/specs\/([^/\s]+)/)
|
|
2840
|
+
const specRef = planContent.match(/Spec:\s*\.(qoder|claude|add|vscode)\/specs\/([^/\s]+)/)
|
|
2841
2841
|
if (specRef) specDirName = specRef[1]
|
|
2842
2842
|
if (!specDirName) {
|
|
2843
|
-
const taskRef = planContent.match(/Tasks:\s*\.qoder\/specs\/([^/\s]+)/)
|
|
2843
|
+
const taskRef = planContent.match(/Tasks:\s*\.(qoder|claude|add|vscode)\/specs\/([^/\s]+)/)
|
|
2844
2844
|
if (taskRef) specDirName = taskRef[1]
|
|
2845
2845
|
}
|
|
2846
2846
|
if (!specDirName) {
|