add-coder 0.1.11 → 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.
Files changed (32) hide show
  1. package/README.md +9 -19
  2. package/dist/index.js +25 -5
  3. package/package.json +1 -1
  4. package/templates/core/agents/add-flow-guardian.md +6 -6
  5. package/templates/core/agents/add-orchestrator.md +2 -2
  6. 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
  7. 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
  8. 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
  9. package/templates/core/reports/REPORT-WORKFLOW.md +2 -2
  10. package/templates/core/reports/index.md +1 -1
  11. package/templates/core/rules/project_rules.md +29 -29
  12. package/templates/core/scripts/mcp-server.ts +17 -17
  13. package/templates/core/skills/add-paradigm/SKILL.md +18 -16
  14. package/templates/core/skills/session-init/SKILL.md +3 -3
  15. package/templates/core/specs/{farm-agent-add-coder-npm-package → add-coder-npm-package}/checklist.md +7 -7
  16. package/templates/core/specs/{farm-agent-add-coder-npm-package → add-coder-npm-package}/spec.md +12 -12
  17. package/templates/core/specs/{farm-agent-add-coder-npm-package → add-coder-npm-package}/tasks.md +17 -17
  18. 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
  19. package/templates/core/templates/TERMINOLOGY.md +1 -1
  20. package/templates/core/templates/checklist-template.md +1 -1
  21. package/templates/core/templates/handoff-multi-round-template.md +10 -10
  22. package/templates/core/templates/handoff-single-round-template.md +1 -1
  23. package/templates/core/templates/index.md +5 -1
  24. package/templates/core/templates/prd-incremental-template.md +103 -0
  25. package/templates/core/templates/prd-incremental-template.schema.json +32 -0
  26. package/templates/core/templates/prd-standard-template.md +219 -0
  27. package/templates/core/templates/prd-standard-template.schema.json +27 -0
  28. package/templates/core/templates/simple-plan-template.md +2 -2
  29. package/templates/core/templates/standard-plan-template.md +9 -9
  30. package/templates/core/tools/README.md +2 -2
  31. package/templates/core/vocabulary/add-governance-vocabulary.md +28 -26
  32. package/templates/core/podman-compose.yml +0 -19
@@ -1,24 +1,24 @@
1
- # farm-agent-add-coder-npm-package-plan-v1
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 名称**: farm-agent-add-coder-npm-package-v1
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: `.qoder/plans/2026-07/08/farm-agent-add-coder-npm-package-add-route-v1.md` ✅
12
- - Handoff: `.qoder/plans/2026-07/08/farm-agent-add-coder-npm-package-handoff-v1.md` ✅
13
- - Review: `.qoder/reviews/farm-agent-add-coder-npm-package-review-v1.md` ✅
14
- - Review v2: `.qoder/reviews/farm-agent-add-coder-npm-package-review-v2.md` ✅ — 代码实现评审,2 条 P0(spawnSync catch 失能、ask 重复定义)
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 | 硬编码 farm-agent 专属 | 参数化占位符 + 通用化 | 待实施 |
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/` 下所有文件直接来自 farm-agent 项目,包含数据库密码、项目名、特定路径等不可移植内容
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. **配置智能合并**:不覆盖用户已有的 `.qoder/settings.json`、`.vscode/settings.json` 等配置
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
- │ → 扫描 .qoder/ .claude/ .vscode/ 存在性 → 确定 targetAdapter
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/ # 产出 .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
- ├── .qoder/ # ★ Qoder IDE 配置
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/`、`.qoder/`、`.claude/` 三个目录。
353
- > IDE 只认自身的 magic path(`.qoder/` / `.claude/`),必须各自包含完整内容。
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/` `.qoder/` `.claude/` 三个目标
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/` | `.qoder/` | `.vscode/` |
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/` | `.qoder/skills/` | 不支持 |
387
- | Subagents 加载 | `.claude/agents/` | `.qoder/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)由 farm-agent 的独立 Plan 承接,add-coder 不耦合业务域。
434
+ > 阶段 ①②(产品文档 → 规则提取 → caijue.toml)由 add-coder 的独立 Plan 承接,add-coder 不耦合业务域。
435
435
 
436
436
  ```
437
437
  ┌─────────────────────────────────────────────────────────────┐
438
- │ 阶段 ①②: farm-agent Plan 承接 │
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: ".qoder/settings.json", existing: true }` | `{ decision: "skip", reason: "--yes" }` |
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
- - 从 farm-agent 的 `prisma/main.prisma` 中提取 DevOperation 和 AuditLog 模型定义
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/大田精准耕播智能决策系统/`、`farm-agent-*` 文件名示例 | `{{docsDir}}/`、`{{projectName}}-*` | Init-time |
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/farm-agent/`、`farm-agent-response-strategy/` 示例 | `{{docsDir}}/`、`{{projectRoot}}/`、`{{projectName}}-*` | Init-time |
650
- | 4 | Skills | `skills/session-init/SKILL.md` | `farm-agent-review-runtime.md` 示例 | `{{projectName}}-review-runtime.md` | Init-time |
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` | `farm-agent` 项目名、`src/agents/` 路径 | `{{projectName}}`、`{{sourceDir}}/agents/` | Init-time |
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 配置 | `.qoder/settings.json` | hook 脚本绝对路径 `/home/xmm/ai/farm-agent/.qoder/hooks/` | `{{projectRoot}}/.qoder/hooks/` | Init-time |
659
- | 13 | MCP 配置 | `.qoder/mcp.json` | `DATABASE_URL` 硬编码密码 | `process.env.DATABASE_URL`(无兜底值) | Runtime |
660
- | 14 | 同步策略 | `.qoder/sync-policy.json` | 无项目特定硬编码 | 检查确认 | — |
661
- | 15 | Hook 脚本 | `.qoder/hooks/` 下 14 个 `.sh` 文件 | `state-detect.sh` 中项目名提取逻辑、hook 脚本内部绝对路径 | 使用 `$CLAUDE_PROJECT_DIR` 或 `{{projectRoot}}` 替代 | Init-time |
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 个文件 | `farm-agent`、`/Users/milkytea/WebstormProjects/rfMain/智能体/farm-agent/` 等绝对路径 | 全部 `{{projectName}}`、`{{projectRoot}}` | Init-time |
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/大田精准耕播智能决策系统/`、`farm-agent-*` 文件名示例(15 处) | `{{docsDir}}/`、`{{projectName}}-*` | Init-time |
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
- | `.qoder/hooks/`(14 个 .sh + lib/) | `templates/adapters/qoder/hooks/` | Qoder 适配器 |
698
- | `.qoder/settings.json` | `templates/adapters/qoder/settings.json` | Qoder 适配器 |
699
- | `.qoder/mcp.json` | `templates/adapters/qoder/mcp.json` | Qoder 适配器 |
700
- | `.qoder/sync-policy.json` | `templates/adapters/qoder/sync-policy.json` | Qoder 适配器 |
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/.qoder/` 迁移到 `templates/adapters/qoder/`,清理 hardcode
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` 生成正确的 `.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` 生成 `.qoder/` 目录
870
+ - [ ] `npx add-coder init --adapter qoder` 生成 `{{magicDir}}/` 目录
871
871
  - [ ] `npx add-coder init --adapter vscode` 生成 `.vscode/` 目录
872
- - [ ] 模板中无 farm-agent 硬编码(`grep -r "farm.agent\|大田" dist/` 返回空)
872
+ - [ ] 模板中无 add-coder 硬编码(`grep -r "farm.agent\|大田" dist/` 返回空)
873
873
  - [ ] `add-coder.config.ts` 可覆盖项目名、源码目录、日志目录等
874
- - [ ] 已有 `.qoder/settings.json` 时 `init` 不覆盖,展示 diff 并交互确认
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 | `.qoder/plans/2026-07/08/farm-agent-add-coder-npm-package-add-route-v1.md` | ✅ |
891
- | Handoff | `.qoder/plans/2026-07/08/farm-agent-add-coder-npm-package-handoff-v1.md` | ✅ |
892
- | Review | `.qoder/reviews/farm-agent-add-coder-npm-package-review-v1.md` | ✅ |
893
- | Spec | `.qoder/specs/farm-agent-add-coder-npm-package/spec.md` | ✅ |
894
- | Tasks | `.qoder/specs/farm-agent-add-coder-npm-package/tasks.md` | ✅ |
895
- | Checklist | `.qoder/specs/farm-agent-add-coder-npm-package/checklist.md` | ✅ |
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
- .qoder/reports/
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
- │ 位置: .qoder/plans/{YYYY-MM}/{DD}/
133
+ │ 位置: {{magicDir}}/plans/{YYYY-MM}/{DD}/
134
134
  │ 模板: plan-template.md
135
135
 
136
136
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > 自动生成: 2026-07-01 11:41:22 | 共 6 份 Report | 下次更新: 每天 2:10 AM
4
4
  >
5
- > 扫描范围: `.qoder/reports/`(Plan Review 在 `.qoder/reviews/`,由 Plan 管线管理)
5
+ > 扫描范围: `{{magicDir}}/reports/`(Plan Review 在 `{{magicDir}}/reviews/`,由 Plan 管线管理)
6
6
 
7
7
  ---
8
8
 
@@ -38,13 +38,13 @@ AI 助手必须先恢复到基线、找到对应的 SKILL 文件并按步骤执
38
38
 
39
39
  ### ADD 词汇→操作映射(L1 预埋)
40
40
 
41
- > **完整词汇表已独立维护**:`.qoder/vocabulary/add-governance-vocabulary.md`
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
- > 完整结构化映射:`.qoder/rules/theory-practice-map.toml`(可被脚本解析验证)
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 文件位于 `.qoder/skills/session-init/SKILL.md`,包含 4 个步骤:
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 文件位于 `.qoder/skills/add-paradigm/SKILL.md`,包含 10 个阶段(Step 0 - Step 9),每个阶段包含若干子步骤:
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 工作流的核心产物由 `.qoder/templates/` 下的 11 个模板定义**,这些模板不是参考资料,而是每次变更必须产出的文档骨架。分析变更影响范围时,必须同步确认需要创建/更新哪些模板产物:
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
- - ✅ `.qoder/plans/{{projectName}}-agrisynapse-integration-plan-v1.md`(.qoder 内文件)
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
- | `.qoder/plans/` | 需求方案(plan)+ 任务拆分(execution)+ 轮间交接手册(handoff) | 开发内部 |
451
- | `.qoder/reviews/` | 方案评审 + 逐轮 spec 评审 | 开发内部 |
452
- | `.qoder/specs/` | 每轮 spec + tasks + checklist(三件套) | 开发内部 |
453
- | `.qoder/templates/` | 文档模板(plan/spec/tasks/checklist/review) | 开发内部 |
454
- | `.qoder/rules/` | 项目规则文件 | 开发内部 |
455
- | `.qoder/skills/` | SKILL 行为定义 | 开发内部 |
456
- | `.qoder/scripts/` | 工具脚本 + MCP 服务器 | 开发内部 |
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
- 需求理解 + 任务拆分 → .qoder/plans/ (plan + execution + handoff)
469
+ 需求理解 + 任务拆分 → {{magicDir}}/plans/ (plan + execution + handoff)
470
470
 
471
- Review(强制关卡) → .qoder/reviews/ (plan-review + roundN-spec-review)
471
+ Review(强制关卡) → {{magicDir}}/reviews/ (plan-review + roundN-spec-review)
472
472
 
473
- Spec 执行 → .qoder/specs/ (三件套:spec + tasks + checklist)
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 文件路径:`.qoder/reviews/{需求域名}-round{N}-{核心内容}-spec-review-v{版本}.md`
479
+ - 每轮的 Review 文件路径:`{{magicDir}}/reviews/{需求域名}-round{N}-{核心内容}-spec-review-v{版本}.md`
480
480
 
481
481
  ### 文档产出物模板
482
482
 
483
- ADD 开发流程产生五类文档,模板文件位于 `.qoder/templates/`:
483
+ ADD 开发流程产生五类文档,模板文件位于 `{{magicDir}}/templates/`:
484
484
 
485
485
  | 模板 | 文件路径 | 说明 |
486
486
  |------|---------|------|
487
- | Plan | `.qoder/templates/plan-template.md` | 元信息 + 背景目标 + 方案选型 + 架构设计 + 实施步骤 + 验收标准 + 关联文档 |
488
- | Spec | `.qoder/templates/spec-template.md` | Why + What Changes + Impact + Requirements(WHEN/THEN) |
489
- | Tasks | `.qoder/templates/tasks-template.md` | Phase → Task → SubTask 层级 |
490
- | Checklist | `.qoder/templates/checklist-template.md` | Phase 检查项 + ADD 规则合规检查 |
491
- | Review | `.qoder/templates/review-template.md` | 元信息 + 问题复现 + 方案对比 + 决策结论 + 影响评估 |
492
- | Handoff(单轮) | `.qoder/templates/handoff-single-round-template.md` | 单轮变更 Handoff 基础格式(9 章节) |
493
- | Handoff(多轮) | `.qoder/templates/handoff-multi-round-template.md` | 多轮原子事务 Handoff(全局结构 + 13 子章节 + 收敛规则 + 启动模板) |
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 文件** | ✅ | `.qoder/specs/{spec-name}/spec.md` + `tasks.md` + `checklist.md` 三件套路径 |
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 助手在**每次新对话启动时**,必须先执行 `.qoder/skills/session-init/SKILL.md`(SKILL-1 会话初始化),作为**不可跳过的前置操作**。
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(`.qoder/skills/session-init/SKILL.md`)
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 服务器配置在 `.qoder/mcp.json`,通过 `npx tsx .qoder/scripts/mcp-server.ts` 启动。
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 qoderDirs = [
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 qoderDirs) {
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-qoder\" }) — 按 Plan 关键词查该 Plan 下所有 devlog\n- query_audit_logs({}) — 查最近的记录(session-init 会话恢复)",
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 qoderCategoryMap: Record<string, string> = {
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" | "qoder" = "docs"): Promise<void> => {
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 === "qoder") {
1245
+ if (sourceType === "magic") {
1246
1246
  // ${MAGIC_DIR}/ 产物按目录分类
1247
1247
  const topDir = relPath.split("/")[0]
1248
- docCategory = qoderCategoryMap[topDir] || "unknown"
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 qoderSearchDirs = ["plans", "specs", "reviews"]
1278
- for (const qDir of qoderSearchDirs) {
1279
- const qPath = join(PROJECT_ROOT, MAGIC_DIR, qDir)
1280
- if (existsSync(qPath)) {
1281
- await walkDir(qPath, qDir, "qoder")
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) {