add-coder 0.3.25-0 → 0.3.25

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 (27) hide show
  1. package/README.en.md +10 -10
  2. package/README.md +20 -46
  3. package/dist/index.js +6 -69
  4. package/package.json +1 -1
  5. package/templates/.add-coder-src-hash.json +18 -22
  6. package/templates/core/scripts/db-ensure.sh +0 -8
  7. package/templates/core/scripts/mcp-server/shared/db-types.ts +208 -0
  8. package/templates/core/scripts/mcp-server/shared/response.ts +2 -3
  9. package/templates/core/scripts/mcp-server/tools/audit.ts +10 -7
  10. package/templates/core/scripts/mcp-server/tools/context.ts +19 -0
  11. package/templates/core/scripts/mcp-server/tools/contract.ts +6 -4
  12. package/templates/core/scripts/mcp-server/tools/gateway/check_rahs.ts +2 -69
  13. package/templates/core/scripts/mcp-server/tools/gateway/check_spec_sync.ts +1 -1
  14. package/templates/core/scripts/mcp-server/tools/hitl.ts +116 -34
  15. package/templates/core/scripts/mcp-server/tools/index.ts +1 -66
  16. package/templates/core/scripts/mcp-server/tools/plan.ts +33 -16
  17. package/templates/core/scripts/mcp-server/tools/review.ts +12 -9
  18. package/templates/core/scripts/mcp-server.ts +1 -2
  19. package/templates/core/templates/simple-plan-template.md +13 -0
  20. package/templates/core/templates/simple-plan-template.schema.json +10 -0
  21. package/templates/core/templates/standard-plan-template.md +13 -0
  22. package/templates/core/templates/standard-plan-template.schema.json +10 -0
  23. package/templates/adapters/codex/config.toml.example +0 -20
  24. package/templates/core/plans/2026-07/08/add-coder-npm-package-add-route-v1.md +0 -331
  25. package/templates/core/plans/2026-07/08/add-coder-npm-package-handoff-v1.md +0 -686
  26. package/templates/core/plans/2026-07/08/add-coder-npm-package-plan-v1.md +0 -895
  27. package/templates/core/scripts/mcp-server/shared/redact.ts +0 -28
package/README.en.md CHANGED
@@ -90,11 +90,11 @@ Each IDE(Claude Code / Qoder CN / VS Code Copilot / Trae / Codex)has its own
90
90
 
91
91
  | IDE | Governance Doc | Events Covered | Hook Config |
92
92
  |---|---|---|---|
93
- | Claude Code | [ADD-governance-claude-code.md](./ADD-governance-claude-code.md) | 14/17 | `.claude/hooks/*.sh` |
94
- | Qoder CN | [ADD-governance-qoder-cn.md](./ADD-governance-qoder-cn.md) | 10/17 | `.qoder/hooks/*.sh` |
95
- | VS Code Copilot | [ADD-governance-vscode-copilot.md](./ADD-governance-vscode-copilot.md) | 10/17 | `.github/hooks/*.json` → `.vscode/hooks/*.sh` |
96
- | Trae | [ADD-governance-trae.md](./ADD-governance-trae.md) | 6/17 | `hooks.json` → `.trae/hooks/*.sh` |
97
- | Codex | [ADD-governance-codex.md](./ADD-governance-codex.md) | 0 native / 14 (via Claude import) | `.codex/hooks.json` |
93
+ | Claude Code | [ADD-governance-claude-code.md](./templates/core/docs/ADD-governance-claude-code.md) | 14/17 | `.claude/hooks/*.sh` |
94
+ | Qoder CN | [ADD-governance-qoder-cn.md](./templates/core/docs/ADD-governance-qoder-cn.md) | 10/17 | `.qoder/hooks/*.sh` |
95
+ | VS Code Copilot | [ADD-governance-vscode-copilot.md](./templates/core/docs/ADD-governance-vscode-copilot.md) | 10/17 | `.github/hooks/*.json` → `.vscode/hooks/*.sh` |
96
+ | Trae | [ADD-governance-trae.md](./templates/core/docs/ADD-governance-trae.md) | 6/17 | `hooks.json` → `.trae/hooks/*.sh` |
97
+ | Codex | [ADD-governance-codex.md](./templates/core/docs/ADD-governance-codex.md) | 0 native / 14 (via Claude import) | `.codex/hooks.json` |
98
98
 
99
99
  ---
100
100
 
@@ -290,11 +290,11 @@ RAHS (Runtime Architecture Health Score) — 运行时架构健康度,< 90% BL
290
290
  ### ⑤ 多 IDE 的 Hook 即治理层
291
291
  | IDE | 治理文档 | 覆盖事件 | Hook 配置 |
292
292
  |---|---|---|---|
293
- | Claude Code | [ADD-governance-claude-code.md](./ADD-governance-claude-code.md) | 14/17 | `.claude/hooks/*.sh` |
294
- | Qoder CN | [ADD-governance-qoder-cn.md](./ADD-governance-qoder-cn.md) | 10/17 | `.qoder/hooks/*.sh` |
295
- | VS Code Copilot | [ADD-governance-vscode-copilot.md](./ADD-governance-vscode-copilot.md) | 10/17 | `.github/hooks/*.json` → `.vscode/hooks/*.sh` |
296
- | Trae | [ADD-governance-trae.md](./ADD-governance-trae.md) | 6/17 | `hooks.json` → `.trae/hooks/*.sh` |
297
- | Codex | [ADD-governance-codex.md](./ADD-governance-codex.md) | 0 (原生) / 14 (导入 Claude) | `.codex/hooks.json` |
293
+ | Claude Code | [ADD-governance-claude-code.md](./templates/core/docs/ADD-governance-claude-code.md) | 14/17 | `.claude/hooks/*.sh` |
294
+ | Qoder CN | [ADD-governance-qoder-cn.md](./templates/core/docs/ADD-governance-qoder-cn.md) | 10/17 | `.qoder/hooks/*.sh` |
295
+ | VS Code Copilot | [ADD-governance-vscode-copilot.md](./templates/core/docs/ADD-governance-vscode-copilot.md) | 10/17 | `.github/hooks/*.json` → `.vscode/hooks/*.sh` |
296
+ | Trae | [ADD-governance-trae.md](./templates/core/docs/ADD-governance-trae.md) | 6/17 | `hooks.json` → `.trae/hooks/*.sh` |
297
+ | Codex | [ADD-governance-codex.md](./templates/core/docs/ADD-governance-codex.md) | 0 (原生) / 14 (导入 Claude) | `.codex/hooks.json` |
298
298
 
299
299
  ## 快速开始
300
300
  ```bash
package/README.md CHANGED
@@ -193,11 +193,11 @@ hook 不是「通知推送」,而是 **ADD 范式在 IDE agent 生命周期中
193
193
 
194
194
  | IDE | 治理文档 | 覆盖事件 | Hook 配置 |
195
195
  |---|---|---|---|
196
- | Claude Code | [ADD-governance-claude-code.md](./ADD-governance-claude-code.md) | 14/17 | `.claude/hooks/*.sh` |
197
- | Qoder CN | [ADD-governance-qoder-cn.md](./ADD-governance-qoder-cn.md) | 10/17 | `.qoder/hooks/*.sh` |
198
- | VS Code Copilot | [ADD-governance-vscode-copilot.md](./ADD-governance-vscode-copilot.md) | 10/17 | `.github/hooks/*.json` → `.vscode/hooks/*.sh` |
199
- | Trae | [ADD-governance-trae.md](./ADD-governance-trae.md) | 6/17 | `hooks.json` → `.trae/hooks/*.sh` |
200
- | Codex | [ADD-governance-codex.md](./ADD-governance-codex.md) | 0 (原生) / 14 (导入 Claude) | `.codex/hooks.json` |
196
+ | Claude Code | [ADD-governance-claude-code.md](./templates/core/docs/ADD-governance-claude-code.md) | 14/17 | `.claude/hooks/*.sh` |
197
+ | Qoder CN | [ADD-governance-qoder-cn.md](./templates/core/docs/ADD-governance-qoder-cn.md) | 10/17 | `.qoder/hooks/*.sh` |
198
+ | VS Code Copilot | [ADD-governance-vscode-copilot.md](./templates/core/docs/ADD-governance-vscode-copilot.md) | 10/17 | `.github/hooks/*.json` → `.vscode/hooks/*.sh` |
199
+ | Trae | [ADD-governance-trae.md](./templates/core/docs/ADD-governance-trae.md) | 6/17 | `hooks.json` → `.trae/hooks/*.sh` |
200
+ | Codex | [ADD-governance-codex.md](./templates/core/docs/ADD-governance-codex.md) | 0 (原生) / 14 (导入 Claude) | `.codex/hooks.json` |
201
201
 
202
202
  > 实施 Plan: [add-coder-hook-full-alignment-plan-v1](./.qoder/plans/2026-07/17/add-coder-hook-full-alignment-plan-v1.md) | 触发源: [GitHub Issue #6](https://github.com/xiaomingming92/add-coder/issues/6)
203
203
 
@@ -220,47 +220,21 @@ Plan 里的 Task 不应该停留在文档里。add-coder 将 tasks.md 末尾的
220
220
  tasks.md §IDE JSON → TodoWrite → IDE 面板
221
221
  ```
222
222
 
223
- ### ⑩ 并发契约体系:协作层 + 进程层双层
223
+ ### ⑩ 并发协作契约:多智能体协作即契约
224
224
 
225
- 多个 Agent 同时改一个仓库,没有契约必然冲突——改同一批文件、审计归因混乱。add-coder 把并行协作变成**经 HITL 审批的契约体系**,分两层:
225
+ 多个 Agent 同时改一个仓库,没有契约必然冲突——改同一批文件、审计归因混乱。add-coder 把并行协作变成一份**经 HITL 审批的契约**:
226
226
 
227
- | | 契约 | 版本 | 职责 |
228
- |----|------|------|------|
229
- | **协作层** | 并发协作契约(collab-contract) | v1(v0.3.18) | 多智能体协作秩序:总控 Plan + N 个子 Plan / 文件边界 / 仲裁链路 / 审计分桶 |
230
- | **进程层** | [多 IDE 进程并发契约](./docs/multi-ide-concurrency-contract.md) | v2(v0.3.25) | MCP Server 并发行为承诺:连接模型 / 幂等键 / PROJECT_ID 校验 / 断开隔离四态 / 生命周期拆分 / client 编排差异矩阵 |
227
+ | 机制 | 实现 |
228
+ |------|------|
229
+ | **总控 Plan + N 个子 Plan** | Lead Agent 调度,专家按 description 触发条件委派,满足即拉起 |
230
+ | **文件边界** | 默认软隔离(git diff 交叉检查),大改升级 git worktree 硬隔离 |
231
+ | **仲裁链路** | 跨边界修改走 BOUNDARY_REQUEST → Lead 裁决 → 落库可查 |
232
+ | **审计分桶** | 每个专家独立 planKeyword,query_audit_logs 各域各查 |
231
233
 
232
- > 协作层模板:`templates/core/templates/collab-contract-template.md`(契约新建/重大变更走 `COLLAB_CONTRACT` 审批)。
233
- > 进程层文档:`docs/multi-ide-concurrency-contract.md`(Codex Parallel MCP / TAgent / Claude Code 并发行为对齐基准)。
234
+ > 契约模板:`templates/core/templates/collab-contract-template.md`(init 后同步到项目 `.add/templates/`),契约新建/重大变更走 `COLLAB_CONTRACT` 审批。
234
235
  >
235
236
  > 📜 溯源:并发契约原创时间戳 → [CHANGELOG v0.3.18「并发协作契约」](https://github.com/xiaomingming92/add-coder/blob/main/CHANGELOG.md#0318---2026-08-05);"酷"的工程学定义 → [what-makes-software-cool.md](https://github.com/xiaomingming92/add-coder/blob/main/docs/what-makes-software-cool.md)——契约的审计分桶与完成判定(DPS ≥ 80)正长在"熵值管控"四维上。
236
237
 
237
- ### ⑪ Codex MCP 原生接入(v0.3.25)
238
-
239
- > **状态区分**:"已生成 Codex 模板" ≠ "Codex MCP 端到端已验证"——以下 6 步是**已验证闭环**,不写自定义脚本即可完成接入。
240
-
241
- ```bash
242
- # 1. 安装 add-coder(已安装可跳过)
243
- npm i -g add-coder
244
-
245
- # 2. 初始化 Codex 适配(hooks 模板 + config.toml 真源)
246
- add-coder init --adapter=codex
247
-
248
- # 3. 输出可直接使用的 config.toml 片段(不写盘,不初始化项目)
249
- add-coder init --adapter=codex --print-mcp-config
250
-
251
- # 4a. 粘贴片段到 ~/.codex/config.toml(Windows: %USERPROFILE%\.codex\config.toml)
252
- # 4b. 或自动写入(显式确认 + 先备份 + 防重复)
253
- add-coder init --adapter=codex --write-user-config
254
-
255
- # 5. 重启 Codex(App/CLI/IDE 扩展通用,修改 config.toml 后需重启生效)
256
-
257
- # 6. 验证:Codex 中发现 add_coder MCP Server,完整工具集可调用(29 tools)
258
- ```
259
-
260
- **Windows 分支**:`--print-mcp-config` 在 win32 平台自动输出 `cmd /c npx.cmd` 启动分支(原生 PowerShell 场景,不依赖 WSL)。
261
-
262
- **命名兼容**:MCP Server ID 归一化为 `add_coder`(连字符→下划线,Codex 约束);`env.PROJECT_ROOT` 由渲染时注入,多项目粘贴错误配置时 mcp-server 启动即校验退出(进程层契约 §4)。
263
-
264
238
  ---
265
239
 
266
240
  ## 📖 案例示范:老安卓设备续命工程
@@ -377,7 +351,7 @@ npx add-coder init
377
351
  | `.qoder/` | Qoder 适配(hooks、settings.json、mcp.json) |
378
352
  | `.vscode/` | VS Code 适配(settings.json、tasks.json) |
379
353
  | `.trae/` | Trae 适配(hooks.json、settings.json) |
380
- | `.codex/` | Codex 适配(hooks.json、settings.json、config.toml.example) |
354
+ | `.codex/` | Codex 适配(hooks.json、settings.json) |
381
355
 
382
356
  ## MCP 审计工具链
383
357
 
@@ -604,11 +578,11 @@ Each IDE(Claude Code / Qoder CN / VS Code Copilot / Trae / Codex)has its own
604
578
 
605
579
  | IDE | Governance Doc | Events Covered | Hook Config |
606
580
  |---|---|---|---|
607
- | Claude Code | [ADD-governance-claude-code.md](./ADD-governance-claude-code.md) | 14/17 | `.claude/hooks/*.sh` |
608
- | Qoder CN | [ADD-governance-qoder-cn.md](./ADD-governance-qoder-cn.md) | 10/17 | `.qoder/hooks/*.sh` |
609
- | VS Code Copilot | [ADD-governance-vscode-copilot.md](./ADD-governance-vscode-copilot.md) | 10/17 | `.github/hooks/*.json` → `.vscode/hooks/*.sh` |
610
- | Trae | [ADD-governance-trae.md](./ADD-governance-trae.md) | 6/17 | `hooks.json` → `.trae/hooks/*.sh` |
611
- | Codex | [ADD-governance-codex.md](./ADD-governance-codex.md) | 0 native / 14 (via Claude import) | `.codex/hooks.json` |
581
+ | Claude Code | [ADD-governance-claude-code.md](./templates/core/docs/ADD-governance-claude-code.md) | 14/17 | `.claude/hooks/*.sh` |
582
+ | Qoder CN | [ADD-governance-qoder-cn.md](./templates/core/docs/ADD-governance-qoder-cn.md) | 10/17 | `.qoder/hooks/*.sh` |
583
+ | VS Code Copilot | [ADD-governance-vscode-copilot.md](./templates/core/docs/ADD-governance-vscode-copilot.md) | 10/17 | `.github/hooks/*.json` → `.vscode/hooks/*.sh` |
584
+ | Trae | [ADD-governance-trae.md](./templates/core/docs/ADD-governance-trae.md) | 6/17 | `hooks.json` → `.trae/hooks/*.sh` |
585
+ | Codex | [ADD-governance-codex.md](./templates/core/docs/ADD-governance-codex.md) | 0 native / 14 (via Claude import) | `.codex/hooks.json` |
612
586
 
613
587
  ### ⑧ HITL Human-in-the-Loop: Approval as Infrastructure
614
588
 
package/dist/index.js CHANGED
@@ -547,9 +547,6 @@ function renderCore(config, dryRun) {
547
547
  const rendered = render(content, config);
548
548
  const targetRel = join4(CORE_TARGET, relative(CORE_DIR, full));
549
549
  files.set(targetRel, rendered);
550
- if (relative(CORE_DIR, full).startsWith("docs/")) {
551
- files.set(name, rendered);
552
- }
553
550
  }
554
551
  }
555
552
  }
@@ -623,18 +620,8 @@ function renderAdapter4(config, targetDir, dryRun, magicDir) {
623
620
  }
624
621
 
625
622
  // src/adapters/codex/renderer.ts
626
- function codexCommandFor(platform) {
627
- return platform === "win32" ? "cmd /c npx.cmd" : "npx";
628
- }
629
623
  function renderAdapter5(config, targetDir, dryRun, magicDir) {
630
- const files = renderAdapterBase(config, magicDir, magicDir === ".vscode", dryRun);
631
- const codexCommand = codexCommandFor(process.platform);
632
- for (const [rel, content] of files) {
633
- if (rel.endsWith("config.toml.example") || rel.endsWith("config.toml")) {
634
- files.set(rel, content.replaceAll("{{codexCommand}}", codexCommand));
635
- }
636
- }
637
- return files;
624
+ return renderAdapterBase(config, magicDir, magicDir === ".vscode", dryRun);
638
625
  }
639
626
 
640
627
  // src/lib/utils.ts
@@ -1376,8 +1363,7 @@ async function injectPrisma2(projectRoot, options = {}) {
1376
1363
  // src/cli/commands/init.ts
1377
1364
  import { readFileSync as readFileSync9, writeFileSync as writeFileSync6, existsSync as existsSync11, mkdirSync as mkdirSync6, copyFileSync as copyFileSync2, readdirSync as readdirSync4 } from "fs";
1378
1365
  import { createHash } from "crypto";
1379
- import { resolve as resolve8, dirname as dirname5, join as pathJoin } from "path";
1380
- import { homedir as homedir2 } from "os";
1366
+ import { resolve as resolve8 } from "path";
1381
1367
  import { createConnection as createConnection2 } from "net";
1382
1368
 
1383
1369
  // src/lib/model-predownload.ts
@@ -1466,10 +1452,6 @@ var ADAPTER_RENDERERS = {
1466
1452
  };
1467
1453
  var MAGIC_DIR_MAP = { claude: ".claude", qoder: ".qoder", vscode: ".vscode", trae: ".trae", codex: ".codex" };
1468
1454
  async function initCommand(options) {
1469
- if (options.printMcpConfig || options.writeUserConfig) {
1470
- await handleCodexMcpConfig(options);
1471
- return;
1472
- }
1473
1455
  const ctx = await prepare(options);
1474
1456
  writeComposeEnv(ctx);
1475
1457
  if (!options.dryRun) {
@@ -1492,51 +1474,6 @@ async function initCommand(options) {
1492
1474
  }
1493
1475
  }
1494
1476
  }
1495
- async function handleCodexMcpConfig(options) {
1496
- const projectRoot = process.cwd();
1497
- const magicDir = MAGIC_DIR_MAP[options.adapter ?? "codex"] ?? ".codex";
1498
- const config = await loadConfig(projectRoot, options.config, { force: true });
1499
- config.projectRoot = projectRoot;
1500
- config.magicDir = magicDir;
1501
- const files = renderAdapter5(config, projectRoot, !!options.dryRun, magicDir);
1502
- const tomlEntry = [...files.entries()].find(
1503
- ([rel]) => rel.endsWith("config.toml.example") || rel.endsWith("config.toml")
1504
- );
1505
- if (!tomlEntry) {
1506
- console.error("\u2717 config.toml \u6E32\u67D3\u4EA7\u7269\u7F3A\u5931\uFF08\u68C0\u67E5 templates/adapters/codex/config.toml.example\uFF09");
1507
- process.exit(1);
1508
- }
1509
- const toml = tomlEntry[1];
1510
- if (options.printMcpConfig) {
1511
- console.log("\n# \u5C06\u4EE5\u4E0B\u7247\u6BB5\u7C98\u8D34\u5230 ~/.codex/config.toml\uFF08\u6216\u4F7F\u7528 --write-user-config \u81EA\u52A8\u5199\u5165\uFF09");
1512
- console.log(toml);
1513
- }
1514
- if (options.writeUserConfig) {
1515
- const userConfigPath = pathJoin(homedir2(), ".codex", "config.toml");
1516
- if (options.dryRun) {
1517
- console.log(`[dry-run] \u5C06\u5199\u5165 ${userConfigPath}`);
1518
- return;
1519
- }
1520
- if (existsSync11(userConfigPath) && readFileSync9(userConfigPath, "utf-8").includes("mcp_servers.add_coder")) {
1521
- console.log(`\u26A0\uFE0F ${userConfigPath} \u5DF2\u5B58\u5728 mcp_servers.add_coder \u914D\u7F6E\uFF0C\u8DF3\u8FC7\uFF08\u907F\u514D\u91CD\u590D\uFF09`);
1522
- return;
1523
- }
1524
- const answer = await ask(`\u5199\u5165 ${userConfigPath}\uFF1F\uFF08y/N\uFF09 \u2192 `);
1525
- if (answer.trim().toLowerCase() !== "y") {
1526
- console.log("\u5DF2\u53D6\u6D88\u5199\u5165");
1527
- return;
1528
- }
1529
- if (existsSync11(userConfigPath)) {
1530
- const backup = `${userConfigPath}.bak-${Date.now()}`;
1531
- copyFileSync2(userConfigPath, backup);
1532
- console.log(`\u5DF2\u5907\u4EFD\u539F\u914D\u7F6E \u2192 ${backup}`);
1533
- }
1534
- mkdirSync6(dirname5(userConfigPath), { recursive: true });
1535
- writeFileSync6(userConfigPath, `
1536
- ${toml}`, { flag: "a" });
1537
- console.log(`\u2705 \u5DF2\u5199\u5165 ${userConfigPath}\uFF0C\u91CD\u542F Codex \u751F\u6548`);
1538
- }
1539
- }
1540
1477
  async function resolveAdapter(projectRoot, specified) {
1541
1478
  if (specified) {
1542
1479
  if (!MAGIC_DIR_MAP[specified]) throw new Error(`\u672A\u77E5 adapter: ${specified}`);
@@ -1959,7 +1896,7 @@ function finalize(ctx, result, dbFail) {
1959
1896
 
1960
1897
  // src/cli/commands/sync.ts
1961
1898
  import { existsSync as existsSync12, readFileSync as readFileSync10, writeFileSync as writeFileSync7, mkdirSync as mkdirSync7 } from "fs";
1962
- import { resolve as resolve9, dirname as dirname6 } from "path";
1899
+ import { resolve as resolve9, dirname as dirname5 } from "path";
1963
1900
  import { createHash as createHash2 } from "crypto";
1964
1901
 
1965
1902
  // src/lib/path-normalize.ts
@@ -2204,7 +2141,7 @@ async function syncCommand(options = {}) {
2204
2141
  }
2205
2142
  function printMigrateGuidance(targetPath, changed) {
2206
2143
  const g = SYNC_PRISMA_CONFIG.POST_SYNC;
2207
- const isManaged = existsSync12(resolve9(dirname6(targetPath), "migrations"));
2144
+ const isManaged = existsSync12(resolve9(dirname5(targetPath), "migrations"));
2208
2145
  const actions = isManaged ? g.MANAGED_ACTIONS : g.UNMANAGED_ACTIONS;
2209
2146
  console.log(` \u25B6 \u5DF2\u5199\u5165 ${changed} \u5904\u53D8\u66F4\uFF0C${g.HEADER}`);
2210
2147
  for (const a of actions) {
@@ -2398,7 +2335,7 @@ async function checkPrismaDiff(projectRoot, options) {
2398
2335
  } else {
2399
2336
  console.log(`
2400
2337
  \u76EE\u6807 schema \u6587\u4EF6\u4E0D\u5B58\u5728: ${result.targetPath}`);
2401
- mkdirSync7(dirname6(targetPath), { recursive: true });
2338
+ mkdirSync7(dirname5(targetPath), { recursive: true });
2402
2339
  writeFileSync7(targetPath, "// add.prisma \u2014 ADD \u6CBB\u7406\u6A21\u578B\n\n", "utf-8");
2403
2340
  const n = injectMissingModels(targetPath, result.missing);
2404
2341
  console.log(` \u2705 \u5DF2\u521B\u5EFA\u5E76\u6CE8\u5165 ${n} \u4E2A\u6A21\u578B/\u679A\u4E3E`);
@@ -2728,7 +2665,7 @@ async function modelDownloadCommand(options) {
2728
2665
  }
2729
2666
  var program = new Command();
2730
2667
  program.name("add-coder").description("\u521D\u59CB\u5316 ADD \u8303\u5F0F\u5DE5\u4F5C\u6D41\u6A21\u677F").version(version);
2731
- program.command("init").description("\u521D\u59CB\u5316 ADD \u6A21\u677F\u5230\u5F53\u524D\u9879\u76EE").option("--adapter <type>", "\u76EE\u6807 IDE: claude | qoder | vscode | trae | codex").option("--config <path>", "\u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84").option("--force", "\u8986\u76D6\u5DF2\u6709\u6587\u4EF6\uFF0C\u4E0D\u4EA4\u4E92").option("--dry-run", "\u9884\u89C8\u6A21\u5F0F\uFF0C\u4E0D\u5B9E\u9645\u5199\u5165").option("--stack <name>", "\u6280\u672F\u6808\u7EA6\u675F profile \u540D\uFF08\u5982 machineserver\uFF0C\u53EF\u9009\uFF09").option("--skip-model", "\u8DF3\u8FC7 embedding \u6A21\u578B\u9884\u4E0B\u8F7D").option("--print-mcp-config", "Codex: stdout \u8F93\u51FA config.toml \u7247\u6BB5\uFF08\u4E0D\u5199\u76D8\uFF0C\u4E0D\u521D\u59CB\u5316\u9879\u76EE\uFF09").option("--write-user-config", "Codex: \u663E\u5F0F\u786E\u8BA4\u540E\u5199\u5165 ~/.codex/config.toml\uFF08\u5148\u5907\u4EFD\uFF09").action(initCommand);
2668
+ program.command("init").description("\u521D\u59CB\u5316 ADD \u6A21\u677F\u5230\u5F53\u524D\u9879\u76EE").option("--adapter <type>", "\u76EE\u6807 IDE: claude | qoder | vscode | trae | codex").option("--config <path>", "\u6307\u5B9A\u914D\u7F6E\u6587\u4EF6\u8DEF\u5F84").option("--force", "\u8986\u76D6\u5DF2\u6709\u6587\u4EF6\uFF0C\u4E0D\u4EA4\u4E92").option("--dry-run", "\u9884\u89C8\u6A21\u5F0F\uFF0C\u4E0D\u5B9E\u9645\u5199\u5165").option("--stack <name>", "\u6280\u672F\u6808\u7EA6\u675F profile \u540D\uFF08\u5982 machineserver\uFF0C\u53EF\u9009\uFF09").option("--skip-model", "\u8DF3\u8FC7 embedding \u6A21\u578B\u9884\u4E0B\u8F7D").action(initCommand);
2732
2669
  program.command("sync").description("\u589E\u91CF\u540C\u6B65\u7F3A\u5931\u6587\u4EF6\uFF08--patch \u8986\u76D6\u5DF2\u6709\u6A21\u677F\uFF09").option("--adapter <type>", "\u76EE\u6807 IDE: claude | qoder | vscode | trae | codex").option("--patch", "\u8986\u76D6\u5DF2\u6709\u6A21\u677F\u6587\u4EF6\uFF08\u4E0D\u78B0 plans/specs/reviews\uFF09").option("-i, --interactive", "\u4EA4\u4E92\u5F0F\u9009\u62E9\u8981\u540C\u6B65\u7684\u6587\u4EF6").option("--model", "\u68C0\u6D4B\u5230\u7F3A\u5931\u65F6\u4E0B\u8F7D embedding \u6A21\u578B").action(syncCommand);
2733
2670
  program.command("status").description("\u68C0\u67E5 ADD \u6A21\u677F\u5B8C\u6574\u6027").action(statusCommand);
2734
2671
  program.command("stack").description("\u7BA1\u7406\u6280\u672F\u6808\u7EA6\u675F profile\uFF08list / set <name> / show / --clear\uFF09").argument("[sub]", "list | set | show").argument("[name]", "set <name>: profile \u540D\uFF08\u5185\u7F6E\u6216\u81EA\u5B9A\u4E49\uFF09").option("--adapter <type>", "\u76EE\u6807 IDE: claude | qoder | vscode | trae | codex").option("--clear", "\u6E05\u9664\u6280\u672F\u6808\u8BBE\u7F6E\uFF08\u4E2D\u6027\uFF09").action(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "add-coder",
3
- "version": "0.3.25-0",
3
+ "version": "0.3.25",
4
4
  "private": false,
5
5
  "description": "[codein2027](https://github.com/xiaomingming92/codein2027) - A complete scaffolding for building the ADD programming paradigm, the implementation layer for AI code governance. Core principle: Audit as Infrastructure. Breaks the black-box programming process and cross-session amnesia, evolving programming paradigms into an auditable, traceable, and convergent new era. npx-ready.\n\n[codein2027](https://github.com/xiaomingming92/codein2027) 快速构建 ADD 编程范式的完整脚手架——AI 代码治理的落地方案。以「审计即基础设施」为核心,彻底打破编程过程黑盒与跨轮失忆,让编程范式进化为可审计、可追溯、可收敛的新时代。npx 即用,人人可体验。",
6
6
  "repository": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "_version": "0.3.25-0",
2
+ "_version": "0.3.25",
3
3
  "adapters/claude/hooks/doc-format-guard.sh": "ec59ad3f",
4
4
  "adapters/claude/hooks/lib/common.sh": "4f3e64ad",
5
5
  "adapters/claude/hooks/lib/context-inject.sh": "cfc8c65e",
@@ -26,7 +26,6 @@
26
26
  "adapters/claude/hooks/subagent-stop.sh": "0f89e28c",
27
27
  "adapters/claude/mcp.json": "4ddc5120",
28
28
  "adapters/claude/settings.json": "067ccc45",
29
- "adapters/codex/config.toml.example": "de1634aa",
30
29
  "adapters/codex/hooks/doc-format-guard.sh": "8e134e78",
31
30
  "adapters/codex/hooks/lib/common.sh": "4f3e64ad",
32
31
  "adapters/codex/hooks/lib/context-inject.sh": "cfc8c65e",
@@ -164,9 +163,6 @@
164
163
  "core/hooks/stop-check.sh": "dc4829be",
165
164
  "core/hooks/subagent-guard.sh": "47d04662",
166
165
  "core/hooks/subagent-stop.sh": "0a34648b",
167
- "core/plans/2026-07/08/add-coder-npm-package-add-route-v1.md": "b05fce99",
168
- "core/plans/2026-07/08/add-coder-npm-package-handoff-v1.md": "1bd40a4a",
169
- "core/plans/2026-07/08/add-coder-npm-package-plan-v1.md": "a678d98e",
170
166
  "core/prisma/add.prisma": "037bd7e9",
171
167
  "core/reports/REPORT-WORKFLOW.md": "03d39b21",
172
168
  "core/reports/boundary-runtime-report.md": "6fd8053f",
@@ -181,7 +177,7 @@
181
177
  "core/rules/profiles/webapp-profile.md": "e493ae7b",
182
178
  "core/rules/project_rules.md": "82b25e08",
183
179
  "core/rules/theory-practice-map.toml": "b1db99fd",
184
- "core/scripts/db-ensure.sh": "94a5ff92",
180
+ "core/scripts/db-ensure.sh": "1ef7a9f3",
185
181
  "core/scripts/gen-plan-index.sh": "bfc6ad3e",
186
182
  "core/scripts/mcp-server/elicitation/confirm.ts": "924857b8",
187
183
  "core/scripts/mcp-server/elicitation/index.ts": "44c5dc3f",
@@ -196,6 +192,7 @@
196
192
  "core/scripts/mcp-server/resources/round-task.ts": "104a0d74",
197
193
  "core/scripts/mcp-server/sampling/index.ts": "7ee26d92",
198
194
  "core/scripts/mcp-server/sampling/review.ts": "5db7a8df",
195
+ "core/scripts/mcp-server/shared/db-types.ts": "299915ee",
199
196
  "core/scripts/mcp-server/shared/dps-scoring.strategy.ts": "f1c901dc",
200
197
  "core/scripts/mcp-server/shared/env.ts": "57f4c2f2",
201
198
  "core/scripts/mcp-server/shared/fs.ts": "0e66a214",
@@ -203,33 +200,32 @@
203
200
  "core/scripts/mcp-server/shared/package.json": "e3d5a4a2",
204
201
  "core/scripts/mcp-server/shared/prisma.ts": "a9618f99",
205
202
  "core/scripts/mcp-server/shared/project-root-strategy.ts": "1a5bdc57",
206
- "core/scripts/mcp-server/shared/redact.ts": "22e008aa",
207
- "core/scripts/mcp-server/shared/response.ts": "0d1539a8",
203
+ "core/scripts/mcp-server/shared/response.ts": "f7806b67",
208
204
  "core/scripts/mcp-server/shared/run-command.ts": "42caf972",
209
205
  "core/scripts/mcp-server/tasks/index.ts": "c040eb75",
210
206
  "core/scripts/mcp-server/tasks/runner.ts": "d84bd35d",
211
207
  "core/scripts/mcp-server/tasks/store.ts": "2fce1a92",
212
- "core/scripts/mcp-server/tools/audit.ts": "71a38969",
213
- "core/scripts/mcp-server/tools/context.ts": "9ce21255",
214
- "core/scripts/mcp-server/tools/contract.ts": "c894e64a",
208
+ "core/scripts/mcp-server/tools/audit.ts": "8564e46f",
209
+ "core/scripts/mcp-server/tools/context.ts": "99a2ac03",
210
+ "core/scripts/mcp-server/tools/contract.ts": "93dea040",
215
211
  "core/scripts/mcp-server/tools/docs.ts": "034e473c",
216
212
  "core/scripts/mcp-server/tools/gateway/check_add_route_completeness.ts": "b58e76ee",
217
213
  "core/scripts/mcp-server/tools/gateway/check_add_route_status.ts": "23fbbb6b",
218
214
  "core/scripts/mcp-server/tools/gateway/check_dps.ts": "4d599b38",
219
- "core/scripts/mcp-server/tools/gateway/check_rahs.ts": "3ce99c7c",
220
- "core/scripts/mcp-server/tools/gateway/check_spec_sync.ts": "8d6efd83",
215
+ "core/scripts/mcp-server/tools/gateway/check_rahs.ts": "4078b0f1",
216
+ "core/scripts/mcp-server/tools/gateway/check_spec_sync.ts": "486df441",
221
217
  "core/scripts/mcp-server/tools/gateway/helpers.ts": "f8794a92",
222
218
  "core/scripts/mcp-server/tools/gateway/index.ts": "559acb75",
223
219
  "core/scripts/mcp-server/tools/gateway.backup": "65eae393",
224
- "core/scripts/mcp-server/tools/hitl.ts": "f447345f",
220
+ "core/scripts/mcp-server/tools/hitl.ts": "d61277f5",
225
221
  "core/scripts/mcp-server/tools/hook-event-report.ts": "3f21836e",
226
- "core/scripts/mcp-server/tools/index.ts": "3e6b6135",
227
- "core/scripts/mcp-server/tools/plan.ts": "477fd80d",
222
+ "core/scripts/mcp-server/tools/index.ts": "884172ba",
223
+ "core/scripts/mcp-server/tools/plan.ts": "8ce5a7ab",
228
224
  "core/scripts/mcp-server/tools/quality.ts": "c4634453",
229
225
  "core/scripts/mcp-server/tools/registrar.ts": "efd81b3a",
230
- "core/scripts/mcp-server/tools/review.ts": "370f84f2",
226
+ "core/scripts/mcp-server/tools/review.ts": "52d78450",
231
227
  "core/scripts/mcp-server/types.ts": "6c5e60bc",
232
- "core/scripts/mcp-server.ts": "48b1fd69",
228
+ "core/scripts/mcp-server.ts": "99cc6833",
233
229
  "core/skills/add-paradigm/SKILL.md": "5d4fa389",
234
230
  "core/skills/session-init/SKILL.md": "bb1205b0",
235
231
  "core/specs/add-coder-npm-package/checklist.md": "ed92032c",
@@ -269,12 +265,12 @@
269
265
  "core/templates/review-template.schema.json": "abc2ece6",
270
266
  "core/templates/runtime-report-template.md": "7b35208a",
271
267
  "core/templates/runtime-report-template.schema.json": "6c1143e6",
272
- "core/templates/simple-plan-template.md": "db5c247f",
273
- "core/templates/simple-plan-template.schema.json": "99d53cc1",
268
+ "core/templates/simple-plan-template.md": "5b2d8dd6",
269
+ "core/templates/simple-plan-template.schema.json": "02718806",
274
270
  "core/templates/spec-template.md": "619b01cc",
275
271
  "core/templates/spec-template.schema.json": "051b6e5d",
276
- "core/templates/standard-plan-template.md": "2129931c",
277
- "core/templates/standard-plan-template.schema.json": "2b767928",
272
+ "core/templates/standard-plan-template.md": "7beafc59",
273
+ "core/templates/standard-plan-template.schema.json": "ca2bbb11",
278
274
  "core/templates/tasks-template.md": "2b9d0d52",
279
275
  "core/templates/tasks-template.schema.json": "fff6eb47",
280
276
  "core/tools/README.md": "26a63460",
@@ -156,14 +156,6 @@ apply_atlas_diff() {
156
156
  # ⑦ Atlas 同步主流程(探测 → dev-url → 目标 → baseline → diff → apply)
157
157
  atlas_sync() {
158
158
  [ "$ENGINE" = "sqlite" ] && return 0
159
- # 迁移锁(进程层契约 v2 §6):多 IDE 并发 init 时仅一个进程执行迁移
160
- # 非阻塞拿锁(pg_try_advisory_lock),会话级锁——脚本退出连接断开自动释放
161
- LOCK_KEY="0xADD001"
162
- LOCKED="$(podman exec "${PROJECT_NAME:-add-project}-postgres" psql -U "${DATABASE_USER:-admin}" -d "${PROJECT_NAME:-add-project}" -tAc "SELECT pg_try_advisory_lock(${LOCK_KEY});" 2>/dev/null || true)"
163
- if [ "$LOCKED" != "t" ]; then
164
- echo "!!! 另一个进程正在迁移,请稍后重试"
165
- return 1
166
- fi
167
159
  if ! atlas_cmd version > /dev/null 2>&1; then
168
160
  echo "!!! Atlas 不可用。add-coder sync --patch 可自动安装 @ariga/atlas;或手动: pnpm add -D @ariga/atlas"
169
161
  echo " 降级路径: prisma-diff(免 shadow)→ db-push + 强制备份;文档: README「Atlas 数据库同步能力」"
@@ -0,0 +1,208 @@
1
+ /*
2
+ * 数据层结构化类型(MCP server)— zod 托管版(D1)
3
+ *
4
+ * 背景:shared/prisma.ts 运行时动态 require 生成的 Prisma client(模板会被复制到任意
5
+ * 消费方项目,不能静态依赖特定生成类型)——加载点的「无类型」不可避免。
6
+ *
7
+ * 本文件职责(边界从「盲信 cast」升级为「运行期验证」):
8
+ * 1. zod schema 为单一真源:行类型一律 z.infer 派生(编译期约束不丢)
9
+ * 2. validatedDelegate 包装 findFirst/findMany/create/update/delete:
10
+ * DB 返回行过 schema.parse —— 消费方迁移滞后/schema 漂移时**立即显式报错**,
11
+ * 而非让 undefined 字段静默漂移到下游
12
+ * 3. z.looseObject 前瞻兼容(zod v4 替代已弃用的 .passthrough()):add.prisma 未来加列不误伤旧模板
13
+ * 4. parse 失败出处方式报错(弱模型可执行),不裸抛 zod issue 堆栈
14
+ *
15
+ * 契约:schema 须与 prisma/add.prisma 模型对齐(字段名/可空性)。
16
+ */
17
+ import * as z from "zod/v4"
18
+
19
+ // ===== 行 schema(对齐 prisma/add.prisma;looseObject 前瞻兼容) =====
20
+
21
+ export const PlanRowSchema = z.looseObject({
22
+ id: z.string(),
23
+ planName: z.string(),
24
+ planPath: z.string(),
25
+ planKeyword: z.string().nullable(),
26
+ specPath: z.string().nullable(),
27
+ tasksPath: z.string().nullable(),
28
+ checklistPath: z.string().nullable(),
29
+ addRoutePath: z.string().nullable(),
30
+ totalTasks: z.number(),
31
+ doneTasks: z.number(),
32
+ checklistT: z.number(),
33
+ checklistTDone: z.number(),
34
+ checklistR: z.number(),
35
+ dpsStructScore: z.number().nullable(),
36
+ dpsSemScore: z.number().nullable(),
37
+ dpsEntropyScore: z.number().nullable(),
38
+ dpsCpmScore: z.number().nullable(),
39
+ dpsComposite: z.number().nullable(),
40
+ contractRole: z.string().nullable(),
41
+ contractName: z.string().nullable(),
42
+ createdAt: z.date(),
43
+ updatedAt: z.date(),
44
+ })
45
+
46
+ export const HitlRowSchema = z.looseObject({
47
+ id: z.string(),
48
+ planName: z.string(),
49
+ round: z.number(),
50
+ type: z.enum(["PLAN", "PLAN_REVIEW", "COLLAB_CONTRACT"]),
51
+ status: z.enum(["DRAFT", "SUBMITTED", "TONGYI", "BOHUI"]),
52
+ approvedAt: z.date().nullable(),
53
+ rejectedAt: z.date().nullable(),
54
+ rejectReason: z.string().nullable(),
55
+ createdAt: z.date(),
56
+ updatedAt: z.date(),
57
+ })
58
+
59
+ export const ReviewRowSchema = z.looseObject({
60
+ id: z.string(),
61
+ planName: z.string(),
62
+ type: z.enum(["PLAN_REVIEW", "IMPLEMENTATION", "RUNTIME"]),
63
+ reviewPath: z.string().nullable(),
64
+ p0Count: z.number(),
65
+ p1Count: z.number(),
66
+ backflowRate: z.number(),
67
+ createdAt: z.date(),
68
+ updatedAt: z.date(),
69
+ })
70
+
71
+ export const AuditLogRowSchema = z.looseObject({
72
+ id: z.string(),
73
+ action: z.string(),
74
+ targetType: z.string(),
75
+ targetId: z.string(),
76
+ beforeState: z.unknown().nullable(),
77
+ afterState: z.unknown().nullable(),
78
+ reason: z.string().nullable(),
79
+ planKeyword: z.string().nullable(),
80
+ createdAt: z.date(),
81
+ })
82
+
83
+ export const DevOperationRowSchema = z.looseObject({
84
+ id: z.string(),
85
+ userId: z.string(),
86
+ planKeyword: z.string(),
87
+ action: z.string(),
88
+ targetType: z.string(),
89
+ targetId: z.string(),
90
+ beforeState: z.unknown().nullable(),
91
+ afterState: z.unknown().nullable(),
92
+ reason: z.string().nullable(),
93
+ createdAt: z.date(),
94
+ })
95
+
96
+ // AddUser 仅消费 id(select { id } 场景),username/email 宽容可空
97
+ // (避免 select 裁剪导致必填字段缺失误伤——机器占位机器回刷原则)
98
+ export const AddUserRowSchema = z.looseObject({
99
+ id: z.string(),
100
+ username: z.string().optional(),
101
+ email: z.string().nullable().optional(),
102
+ })
103
+
104
+ export const CollabContractRowSchema = z.looseObject({
105
+ id: z.string(),
106
+ contractName: z.string(),
107
+ contractPath: z.string(),
108
+ masterPlanName: z.string(),
109
+ participants: z.unknown(),
110
+ abilityMatrix: z.unknown().nullable(),
111
+ stages: z.unknown(),
112
+ dependencyGraph: z.string().nullable(),
113
+ fileBoundaries: z.unknown(),
114
+ completionCriteria: z.unknown().nullable(),
115
+ status: z.string(),
116
+ version: z.number(),
117
+ createdAt: z.date(),
118
+ updatedAt: z.date(),
119
+ })
120
+
121
+ // ===== 类型派生(单一真源:schema → 类型) =====
122
+
123
+ export type PlanRow = z.infer<typeof PlanRowSchema>
124
+ export type HitlRow = z.infer<typeof HitlRowSchema>
125
+ export type ReviewRow = z.infer<typeof ReviewRowSchema>
126
+ export type AuditLogRow = z.infer<typeof AuditLogRowSchema>
127
+ export type DevOperationRow = z.infer<typeof DevOperationRowSchema>
128
+ export type AddUserRow = z.infer<typeof AddUserRowSchema>
129
+ export type CollabContractRow = z.infer<typeof CollabContractRowSchema>
130
+
131
+ // ===== 查询参数(Prisma 最常用子集,结构化约束 + 运算符支持) =====
132
+
133
+ export type OrderDirection = "asc" | "desc"
134
+
135
+ // where 放开为 Record<string, unknown>:Prisma 运算符(contains/gte/OR 等)
136
+ // 动态组合,键名约束会阻碍合法查询(如 review.ts 的 contains、audit.ts 的 OR)
137
+ export interface QueryArgs<T> {
138
+ where?: Record<string, unknown>
139
+ orderBy?: { [K in keyof T]?: OrderDirection }
140
+ take?: number
141
+ skip?: number
142
+ include?: Record<string, unknown>
143
+ }
144
+
145
+ export interface BatchResult { count: number }
146
+
147
+ // ===== 泛型委托接口:业务层唯一依赖的数据访问契约 =====
148
+
149
+ export interface TableDelegate<T> {
150
+ findFirst(args: Pick<QueryArgs<T>, "where" | "orderBy">): Promise<T | null>
151
+ findMany(args?: QueryArgs<T>): Promise<T[]>
152
+ findUnique(args: { where: Record<string, unknown>; select?: Record<string, unknown> }): Promise<T | null>
153
+ create(args: { data: Partial<T> }): Promise<T>
154
+ update(args: { where: Partial<T>; data: Partial<T> }): Promise<T>
155
+ updateMany(args: { where: Record<string, unknown>; data: Partial<T> }): Promise<BatchResult>
156
+ delete(args: { where: Partial<T> }): Promise<T>
157
+ deleteMany(args: { where: Partial<T> }): Promise<BatchResult>
158
+ }
159
+
160
+ // ===== 边界升级:validating delegate(无类型收敛单点 + 运行期行校验) =====
161
+
162
+ /**
163
+ * 把动态加载的无类型 delegate 包装为**运行期校验**的泛型委托。
164
+ * - 读路径(findFirst/findMany)与写返回值(create/update/delete)过 schema.parse
165
+ * - parse 失败 → 可读处方报错(表名 + 首个问题 + 迁移指引),不裸抛 zod 堆栈
166
+ * - deleteMany 仅返回计数,无行结构可校验,直通
167
+ */
168
+ export function validatedDelegate<T>(
169
+ rawDelegate: unknown,
170
+ rowSchema: z.ZodType<T>,
171
+ tableName: string,
172
+ ): TableDelegate<T> {
173
+ const raw = rawDelegate as TableDelegate<unknown>
174
+
175
+ const parseRow = (row: unknown): T => {
176
+ const result = rowSchema.safeParse(row)
177
+ if (!result.success) {
178
+ const issue = result.error.issues[0]
179
+ const field = issue?.path?.join(".") || "(未知字段)"
180
+ throw new Error(
181
+ `DB 行结构与预期不符(表 ${tableName}): ${field} — ${issue?.message ?? "校验失败"}\n` +
182
+ `处方: 检查项目是否已迁移至最新 prisma/add.prisma(bash scripts/db-ensure.sh),或核对 db-types.ts schema 与 add.prisma 是否同步`
183
+ )
184
+ }
185
+ return result.data
186
+ }
187
+
188
+ return {
189
+ async findFirst(args) {
190
+ const row = await raw.findFirst(args as never)
191
+ return row === null ? null : parseRow(row)
192
+ },
193
+ async findMany(args) {
194
+ const rows = await raw.findMany(args as never)
195
+ return rows.map(parseRow)
196
+ },
197
+ async findUnique(args) {
198
+ if (!raw.findUnique) throw new Error(`表 ${tableName} 不支持 findUnique`)
199
+ const row = await raw.findUnique(args as never)
200
+ return row === null ? null : parseRow(row)
201
+ },
202
+ async create(args) { return parseRow(await raw.create(args as never)) },
203
+ async update(args) { return parseRow(await raw.update(args as never)) },
204
+ async updateMany(args) { return raw.updateMany(args as never) as Promise<BatchResult> },
205
+ async delete(args) { return parseRow(await raw.delete(args as never)) },
206
+ async deleteMany(args) { return raw.deleteMany(args as never) as Promise<BatchResult> },
207
+ }
208
+ }
@@ -1,10 +1,9 @@
1
1
  import type { ToolResponse } from "../types.js"
2
- import { redact } from "./redact.js"
3
2
 
4
3
  export function textResponse(text: string): { content: ToolResponse } {
5
- return { content: [{ type: "text", text: redact(text) }] }
4
+ return { content: [{ type: "text", text }] }
6
5
  }
7
6
 
8
7
  export function errorResponse(message: string): { content: ToolResponse; isError: boolean } {
9
- return { content: [{ type: "text", text: redact(message) }], isError: true }
8
+ return { content: [{ type: "text", text: message }], isError: true }
10
9
  }