@dommaker/harness 1.0.0 → 1.1.0

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 (58) hide show
  1. package/CHANGELOG.md +12 -13
  2. package/dist/cli/commands/sync-docs/agents-syncer.d.ts.map +1 -1
  3. package/dist/cli/commands/sync-docs/agents-syncer.js +25 -4
  4. package/dist/cli/commands/sync-docs/agents-syncer.js.map +1 -1
  5. package/dist/completion-checkers/classify.d.ts +23 -0
  6. package/dist/completion-checkers/classify.d.ts.map +1 -0
  7. package/dist/completion-checkers/classify.js +37 -0
  8. package/dist/completion-checkers/classify.js.map +1 -0
  9. package/dist/completion-checkers/contract-presence.d.ts +12 -0
  10. package/dist/completion-checkers/contract-presence.d.ts.map +1 -0
  11. package/dist/completion-checkers/contract-presence.js +36 -0
  12. package/dist/completion-checkers/contract-presence.js.map +1 -0
  13. package/dist/completion-checkers/glob-match.d.ts +13 -0
  14. package/dist/completion-checkers/glob-match.d.ts.map +1 -0
  15. package/dist/completion-checkers/glob-match.js +58 -0
  16. package/dist/completion-checkers/glob-match.js.map +1 -0
  17. package/dist/completion-checkers/index.d.ts +19 -0
  18. package/dist/completion-checkers/index.d.ts.map +1 -0
  19. package/dist/completion-checkers/index.js +47 -0
  20. package/dist/completion-checkers/index.js.map +1 -0
  21. package/dist/completion-checkers/phase-format.d.ts +15 -0
  22. package/dist/completion-checkers/phase-format.d.ts.map +1 -0
  23. package/dist/completion-checkers/phase-format.js +42 -0
  24. package/dist/completion-checkers/phase-format.js.map +1 -0
  25. package/dist/completion-checkers/tdd-chain.d.ts +16 -0
  26. package/dist/completion-checkers/tdd-chain.d.ts.map +1 -0
  27. package/dist/completion-checkers/tdd-chain.js +57 -0
  28. package/dist/completion-checkers/tdd-chain.js.map +1 -0
  29. package/dist/completion-checkers/types.d.ts +77 -0
  30. package/dist/completion-checkers/types.d.ts.map +1 -0
  31. package/dist/completion-checkers/types.js +10 -0
  32. package/dist/completion-checkers/types.js.map +1 -0
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +6 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/pretool-use-hook.d.ts +16 -0
  38. package/dist/pretool-use-hook.d.ts.map +1 -0
  39. package/dist/pretool-use-hook.js +68 -0
  40. package/dist/pretool-use-hook.js.map +1 -0
  41. package/package.json +1 -1
  42. package/src/CONTEXT.md +1 -0
  43. package/src/__tests__/pretool-use-hook.test.ts +82 -0
  44. package/src/cli/commands/__tests__/sync-docs-agents.test.ts +55 -0
  45. package/src/cli/commands/sync-docs/agents-syncer.ts +26 -6
  46. package/src/completion-checkers/CONTEXT.md +25 -0
  47. package/src/completion-checkers/__tests__/contract-presence.test.ts +44 -0
  48. package/src/completion-checkers/__tests__/phase-format.test.ts +60 -0
  49. package/src/completion-checkers/__tests__/tdd-chain.test.ts +99 -0
  50. package/src/completion-checkers/classify.ts +47 -0
  51. package/src/completion-checkers/contract-presence.ts +40 -0
  52. package/src/completion-checkers/glob-match.ts +54 -0
  53. package/src/completion-checkers/index.ts +19 -0
  54. package/src/completion-checkers/phase-format.ts +48 -0
  55. package/src/completion-checkers/tdd-chain.ts +63 -0
  56. package/src/completion-checkers/types.ts +84 -0
  57. package/src/index.ts +7 -0
  58. package/src/pretool-use-hook.ts +68 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
6
6
 
7
+ ## [1.1.0] - 2026-08-16
8
+
9
+ ### Changes
10
+ - docs(changelog): 清空 [Unreleased] 条目段,待 release 脚本生成 [1.1.0](避免自动生成后残留重复条目)
11
+ - feat(sync-docs): AGENTS.md 知识入口行识别 .studio/CONTEXT.md 正本模型 (studio #188)
12
+ - docs(research): 恢复 wayfinder #27/#28 研究正本——harness 现状盘点 + studio→harness 边界盘点(原仅存于游离提交 e3ab6ac/d2874fc,未随 O11 纳入版本控制)
13
+ - feat(gates): command-gate PreToolUse hook 固化进包(studio #153)
14
+ - feat(completion-checkers): T7-E1 三纯判定函数 tdd-chain/phase-format/contract-presence + CompletionCheckersConfig(#160)
15
+ - docs: CLAUDE.md Key Subsystems 清除已删子系统行 + 修正 context/tools 描述(#40 收尾)
16
+
17
+ ## [Unreleased]
18
+
7
19
  ## [1.0.0] - 2026-08-16
8
20
 
9
21
  ### Changes
@@ -36,19 +48,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
36
48
  - feat: custom 约束退役落点迁至 custom-constraints.yml(#82 D6 一处真相)
37
49
  - fix: mergeConstraints 生效 config.yml 对 custom 约束的禁用
38
50
 
39
- ## [Unreleased]
40
-
41
- ### Changes
42
- - feat(pkg): exports 增加 `./gates` 子路径公开 CommandGate 等门禁导出(H3,#42)——studio `provider-hooks.ts` 可改正规 import `@dommaker/harness/gates` 而非 require.resolve dist 深路径(studio 侧随动 #150 B3);O7 files 去 src 因 studio `rule-scanner.ts:223` 仍硬编码 `@dommaker/harness/src/` 源路径而保留(待 studio #150 B2 先行)
43
- - feat(hooks): hook 注册表闭环 + 配置归一(G2/G7,#44)——`assertHookRegistryClosed` 声明(HookConfig)↔ 实现(HookDefinition)双向校验(引用未注册/注册无定义/重复 → 抛错,复制 checker 闭环模式,断言限构建/测试期);`HookConfig{name,enabled,errorStrategy}` 为 per-hook 配置唯一真相,`toErrorStrategy` 承载 studio `blocking`→errorStrategy(block/warn) 无损映射(studio #150 A4 随动);pipeline block/warn 语义补测试固化
44
- - feat(cli): 命令注册表驱动 + per-command 懒加载(O2/R6,#44)——`COMMAND_DEFINITIONS`(definitions.ts,纯数据模块)为命令形状单一来源,bin/harness.js 由注册表遍历生成、不再手写 commander 命令块,删 commands/index.ts barrel(消灭两处手工同步);实现引用 module+export,action 执行时才 require 对应命令模块,任一命令执行不再加载全部命令实现;门禁 CLI 元数据 action/subcommands 同步改为实现引用;`--help`/`--version` 零命令实现加载(模块数 10→11,仅多一个纯数据模块),单命令只加载自身模块(registry.test.ts 端到端断言)
45
- - feat(gates): H4 门禁统一——Gate 三态(deny | abstain | ask)+ gateRegistry 构建期闭环 + 声明式 order/enabled + runGates 单调语义 + bin 注册表驱动生成(#43)。统一 `Gate{id, order, evaluate(ctx)}` → `GateDecision`(GateResult 保留为报告结构);注册表「定义即注册 + 双向闭环」复制 checker 模式(定义无实现/实现无定义/重复 id → 加载期抛错,getGate 引用未注册抛错);`getEffectiveGates` 对齐 getEffectiveConstraints 裁剪(config.yml `gates.order` 重排 + `gates.<id>.enabled:false` 移除,引用未注册抛错);`runGates` deny 单调(下游不得改回 allow,决策浅冻结)+ ask 枚举预留 fail-closed = deny;6 门禁 CLI 命令由 `GATE_DEFINITIONS` 元数据驱动生成(命令名/别名/选项兼容,bin 不再手写 6 块);checker-as-guard 接线点 `createCheckerGate`(studio #129 随动)
46
- - fix(lint): `npm run lint` 恒失败——仓库自初始提交起无任何 ESLint 配置,命令不可用却一直挂在文档里(#35)。新增 `eslint.config.mjs` flat config(eslint 8.57 自动识别,无需升级/环境变量):eslint:recommended + @typescript-eslint/recommended 收敛版;`no-explicit-any`/`no-non-null-assertion`/`no-var-requires`/`require-yield` 显式关闭(存量 335/252/39/1 处,any/non-null 属风格化改型、var-requires 为刻意 CJS 懒加载、require-yield 为故意抛错 stub,专项治理另开票),`no-empty` 保留 `catch {}` 吞异常既有约定(allowEmptyCatch),unused-vars 支持 `_` 前缀参数约定;一次性清理 74 处机械违规(unused-vars/prefer-const/useless-escape/case-declarations,均不改运行时行为;唯一例外 init.ts:模板字面量 `\.` 运行期退化,生成 `grep -E 'plans/.*.md$'` 点通配,与同文件落盘版 preCommitContent 副本 drift,改 `\\.` 使两副本一致)。lint script 去掉 `--ext .ts`(flat config 按文件模式选型)。coverage-gate.yml 新增 lint job——CI 从未跑 lint 正是问题长期未暴露的根因,从此防再退化
47
- - fix(cli): 模板/提示裸名 `npx harness` 全部改为 `npx @dommaker/harness`(#36)——裸名经 npx 必然走 npm 注册表,命中同名陌生包(rsdoiel/harness@0.0.6,2013 年与本项目无关);init 三段模板(pre-commit/harness-check.yml/harness-governance.yml)、validate resolutions、constraints-report、injection-drift 修复提示、README 示例全部 scoped 化。harness 仓自身 dogfood 改用 `node bin/harness.js`(`.github/workflows/harness-governance.yml` 直改;pre-commit 钩子生成源落盘为 `bin/install-precommit-hook.sh`,`npm run hooks:install` 一条命令装回,本地确定、离线可用、dogfood 当前 HEAD)。消费项目已有落盘钩子需重跑 `npx @dommaker/harness init` 刷新
48
- - fix(sync-docs): CAPABILITIES.md 中真实存在的 .tsx 模块行不再被误判为「已删除」并误删(#33)——源码扫描扩入 .tsx(findTsSourceFiles 新增 includeTsx 选项,sync-docs 链路开启,scanSourceModules 顶层分支同步),removed 判定前对含路径登记条目做全路径存在性过滤,兜住 .js/.jsx 等其它扫描盲区
49
- - fix(constraints): 内置 `no_completion_without_verification` 文案弱化(#25)——去掉「完整」字样与写死的命令示例(npm test/npm run build),验证口径改为项目声明的测试 + type check,全量验证归 CI;强制力保留在「新鲜输出为证、禁止凭记忆声称完成」。大仓项目需自定义口径时仍可用 custom-constraints.yml shadow override
50
- - fix(constraints): `retire <id>` 直达路径补人确认闸门(#24)——无 `--yes` 报错 + 非零退出码且不落盘,提示改用 `--yes` 或交互模式;`--yes` 直达保留原行为,iron 仍打印警示。ADR-0001 决策 2「执行层保留一次人确认」对所有入口成立。
51
-
52
51
  ## [0.17.1] - 2026-08-09
53
52
 
54
53
  ### Changes
@@ -1 +1 @@
1
- {"version":3,"file":"agents-syncer.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/sync-docs/agents-syncer.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2CH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6E3F"}
1
+ {"version":3,"file":"agents-syncer.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/sync-docs/agents-syncer.ts"],"names":[],"mappings":"AAAA;;GAEG;AA2CH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAoF3F"}
@@ -78,10 +78,11 @@ const AGENTS_MD_COMMANDS = [
78
78
  */
79
79
  async function buildAgentsMd(projectPath, srcDirs) {
80
80
  const pkg = await (0, project_reader_1.readPackageJsonLite)(projectPath);
81
- const [dirs, governance, hasKnowledge, contextDocCount] = await Promise.all([
81
+ const [dirs, governance, hasKnowledge, hasStudioContext, contextDocCount] = await Promise.all([
82
82
  getTopLevelDirEntries(projectPath, srcDirs),
83
83
  getGovernanceInfo(projectPath),
84
84
  hasKnowledgeDir(projectPath),
85
+ hasStudioContextDoc(projectPath),
85
86
  countContextDocs(projectPath, srcDirs),
86
87
  ]);
87
88
  const name = pkg?.name || path.basename(projectPath);
@@ -141,9 +142,16 @@ async function buildAgentsMd(projectPath, srcDirs) {
141
142
  // 写进受 --check 漂移比对的文档会制造「必然过期」竞态(任何知识写入都使已提交文档过期)
142
143
  lines.push('- `.harness/knowledge/`:项目知识库,用 `harness knowledge` 查询');
143
144
  }
144
- lines.push(contextDocCount > 0
145
- ? `- 各源码目录的 \`CONTEXT.md\` 是权威模块文档(现有 ${contextDocCount} 个),改动代码时同步更新`
146
- : '- 各源码目录的 `CONTEXT.md` 是权威模块文档,缺失目录可由 `harness sync-docs` 生成模板');
145
+ if (hasStudioContext) {
146
+ // 正本模型(studio #152/T12):模块上下文沉淀归并到业务仓 .studio/CONTEXT.md
147
+ // 散置 CONTEXT.md 指引与该裁决矛盾,正本在场时整行替代
148
+ lines.push('- 模块上下文正本:`.studio/CONTEXT.md`(模块锚点组织),改动代码时同步更新');
149
+ }
150
+ else {
151
+ lines.push(contextDocCount > 0
152
+ ? `- 各源码目录的 \`CONTEXT.md\` 是权威模块文档(现有 ${contextDocCount} 个),改动代码时同步更新`
153
+ : '- 各源码目录的 `CONTEXT.md` 是权威模块文档,缺失目录可由 `harness sync-docs` 生成模板');
154
+ }
147
155
  lines.push('');
148
156
  return lines.join('\n');
149
157
  }
@@ -253,6 +261,19 @@ async function hasKnowledgeDir(projectPath) {
253
261
  return false;
254
262
  }
255
263
  }
264
+ /**
265
+ * 判断 .studio/CONTEXT.md 是否存在(正本模型标记,studio #152/T12):
266
+ * 模块上下文沉淀归并到业务仓单一正本(模块锚点组织)时,知识入口行改指正本,
267
+ * 不再输出散置 CONTEXT.md 指引。只判存在性,不解析内容。
268
+ */
269
+ async function hasStudioContextDoc(projectPath) {
270
+ try {
271
+ return (await fs.stat(path.join(projectPath, '.studio', 'CONTEXT.md'))).isFile();
272
+ }
273
+ catch {
274
+ return false;
275
+ }
276
+ }
256
277
  /** 统计源码根内的 CONTEXT.md 数量(含源码根本身,跨根去重) */
257
278
  async function countContextDocs(projectPath, srcDirs) {
258
279
  const found = new Set();
@@ -1 +1 @@
1
- {"version":3,"file":"agents-syncer.js","sourceRoot":"","sources":["../../../../src/cli/commands/sync-docs/agents-syncer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents-syncer.js","sourceRoot":"","sources":["../../../../src/cli/commands/sync-docs/agents-syncer.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0DH,sCAoFC;AA5ID,gDAAkC;AAClC,2BAAgC;AAChC,2CAA6B;AAC7B,+EAA2E;AAC3E,qDAK0B;AAE1B,4CAA4C;AAC5C,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU;IAClD,mBAAmB,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ;CAC/D,CAAC,CAAC;AAEH,mBAAmB;AACnB,MAAM,mBAAmB,GAA2B;IAClD,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,GAAG,EAAE,UAAU;IACf,SAAS,EAAE,MAAM;IACjB,SAAS,EAAE,UAAU;IACrB,UAAU,EAAE,kBAAkB;CAC/B,CAAC;AAEF,8CAA8C;AAC9C,MAAM,kBAAkB,GAA4B;IAClD,CAAC,KAAK,EAAE,QAAQ,CAAC;IACjB,CAAC,OAAO,EAAE,IAAI,CAAC;IACf,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,UAAU,EAAE,OAAO,CAAC;IACrB,CAAC,WAAW,EAAE,MAAM,CAAC;IACrB,CAAC,WAAW,EAAE,MAAM,CAAC;IACrB,CAAC,MAAM,EAAE,MAAM,CAAC;IAChB,CAAC,OAAO,EAAE,QAAQ,CAAC;CACpB,CAAC;AAUF;;;;;;GAMG;AACI,KAAK,UAAU,aAAa,CAAC,WAAmB,EAAE,OAAiB;IACxE,MAAM,GAAG,GAAG,MAAM,IAAA,oCAAmB,EAAC,WAAW,CAAC,CAAC;IACnD,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5F,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC;QAC3C,iBAAiB,CAAC,WAAW,CAAC;QAC9B,eAAe,CAAC,WAAW,CAAC;QAC5B,mBAAmB,CAAC,WAAW,CAAC;QAChC,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC;KACvC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,GAAG,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,GAAG,EAAE,WAAW,IAAI,MAAM,IAAA,qCAAoB,EAAC,WAAW,CAAC,CAAC;IAEhF,MAAM,KAAK,GAAa;QACtB,aAAa;QACb,EAAE;QACF,gIAAgI;QAChI,EAAE;QACF,SAAS;QACT,EAAE;QACF,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,QAAQ,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI;QAC5D,EAAE;QACF,SAAS;QACT,EAAE;KACH,CAAC;IAEF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,IAAA,qCAAoB,EAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,GAAG,EAAE,OAAO,IAAI,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAA,oCAAmB,EAAC,EAAE,EAAE,CAAC,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC/B,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,iCAAiC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,UAAU,CAAC,mBAAmB,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG;YACb,UAAU,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,UAAU,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI;YAC/E,UAAU,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,UAAU,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,IAAI;SACrF,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,0CAA0C,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,SAAS,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC9B,IAAI,YAAY,EAAE,CAAC;QACjB,6CAA6C;QAC7C,kDAAkD;QAClD,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,gBAAgB,EAAE,CAAC;QACrB,0DAA0D;QAC1D,mCAAmC;QACnC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CACR,eAAe,GAAG,CAAC;YACjB,CAAC,CAAC,sCAAsC,eAAe,eAAe;YACtE,CAAC,CAAC,+DAA+D,CACpE,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,6BAA6B;AAC7B,KAAK,UAAU,qBAAqB,CAClC,WAAmB,EACnB,OAAiB;IAEjB,IAAI,OAA8B,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAyC,EAAE,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YAAE,SAAS;QAC/B,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9C,6BAA6B;QAC7B,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS;QACtF,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,gEAAgE;AAChE,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,GAAW,EAAE,OAAiB;IACpF,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IAExB,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;QACxE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,YAAY,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1E,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAmB,EAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,MAAM,EAAE,WAAW;QAAE,OAAO,MAAM,CAAC,WAAW,CAAC;IAEnD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iDAAiD;AACjD,KAAK,UAAU,oBAAoB,CAAC,GAAW;IAC7C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACzD,IAAI,IAAA,eAAU,EAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,2DAA2D;AAC3D,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IAClD,MAAM,IAAI,GAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC;IAE9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,4CAAoB,EAAC,WAAW,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,MAAM,KAAK,SAAS,CAAC;QACtC,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC9B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,QAAQ;IACV,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QAC/E,IAAI,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CAAC;YAC3F,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAChC,IAAI,CAAC,QAAQ,GAAG,sBAAsB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC5D,IAAI,CAAC,UAAU,GAAG,sBAAsB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kEAAkE;AAClE,SAAS,sBAAsB,CAAC,OAAe,EAAE,OAAe;IAC9D,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,WAAW,OAAO,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5E,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,yEAAyE;AACzE,KAAK,UAAU,eAAe,CAAC,WAAmB;IAChD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,mBAAmB,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,yCAAyC;AACzC,KAAK,UAAU,gBAAgB,CAAC,WAAmB,EAAE,OAAiB;IACpE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEhC,KAAK,UAAU,IAAI,CAAC,GAAW;QAC7B,IAAI,OAA8B,CAAC;QACnC,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;gBAAE,SAAS;YACnC,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YACnG,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,IAAA,eAAU,EAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;gBACnD,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvB,CAAC;YACD,MAAM,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,IAAA,eAAU,EAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC;YAClD,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * commit 文件分类(tdd-chain 与 phase-format 共享同一份分类结果,Q4 定稿)
3
+ *
4
+ * - 纯非代码(全部命中 noncode_globs)与纯测试(全部命中 test_globs)commit 天然免检
5
+ * - 混合 commit 只要触到代码文件即需走引用链
6
+ * - 空文件清单按免检处理
7
+ */
8
+ import type { CommitInput, CompletionCheckersConfig } from './types';
9
+ /** 单 commit 文件分类结果 */
10
+ export interface CommitFileClassification {
11
+ /** 无代码文件(纯测试 / 纯非代码 / 空清单)→ 天然免检 */
12
+ exempt: boolean;
13
+ /** 文件清单命中 test_globs(被引 commit 须满足) */
14
+ hasTests: boolean;
15
+ }
16
+ /** 从配置取 glob(缺省落默认) */
17
+ export declare function resolveGlobs(config: CompletionCheckersConfig): {
18
+ testGlobs: string[];
19
+ noncodeGlobs: string[];
20
+ };
21
+ /** 分类单 commit 的文件清单 */
22
+ export declare function classifyCommitFiles(commit: CommitInput, testGlobs: string[], noncodeGlobs: string[]): CommitFileClassification;
23
+ //# sourceMappingURL=classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/completion-checkers/classify.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAGrE,sBAAsB;AACtB,MAAM,WAAW,wBAAwB;IACvC,oCAAoC;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,uCAAuC;IACvC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,uBAAuB;AACvB,wBAAgB,YAAY,CAAC,MAAM,EAAE,wBAAwB,GAAG;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAK9G;AAED,uBAAuB;AACvB,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EAAE,EACnB,YAAY,EAAE,MAAM,EAAE,GACrB,wBAAwB,CAc1B"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ /**
3
+ * commit 文件分类(tdd-chain 与 phase-format 共享同一份分类结果,Q4 定稿)
4
+ *
5
+ * - 纯非代码(全部命中 noncode_globs)与纯测试(全部命中 test_globs)commit 天然免检
6
+ * - 混合 commit 只要触到代码文件即需走引用链
7
+ * - 空文件清单按免检处理
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.resolveGlobs = resolveGlobs;
11
+ exports.classifyCommitFiles = classifyCommitFiles;
12
+ const glob_match_1 = require("./glob-match");
13
+ /** 从配置取 glob(缺省落默认) */
14
+ function resolveGlobs(config) {
15
+ return {
16
+ testGlobs: config.testGlobs ?? glob_match_1.DEFAULT_TEST_GLOBS,
17
+ noncodeGlobs: config.noncodeGlobs ?? glob_match_1.DEFAULT_NONCODE_GLOBS,
18
+ };
19
+ }
20
+ /** 分类单 commit 的文件清单 */
21
+ function classifyCommitFiles(commit, testGlobs, noncodeGlobs) {
22
+ if (commit.files.length === 0) {
23
+ return { exempt: true, hasTests: false };
24
+ }
25
+ let hasTests = false;
26
+ let hasCode = false;
27
+ for (const file of commit.files) {
28
+ if ((0, glob_match_1.matchAnyGlob)(file, testGlobs)) {
29
+ hasTests = true;
30
+ }
31
+ else if (!(0, glob_match_1.matchAnyGlob)(file, noncodeGlobs)) {
32
+ hasCode = true;
33
+ }
34
+ }
35
+ return { exempt: !hasCode, hasTests };
36
+ }
37
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/completion-checkers/classify.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAcH,oCAKC;AAGD,kDAkBC;AArCD,6CAAuF;AAUvF,uBAAuB;AACvB,SAAgB,YAAY,CAAC,MAAgC;IAC3D,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,+BAAkB;QACjD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,kCAAqB;KAC3D,CAAC;AACJ,CAAC;AAED,uBAAuB;AACvB,SAAgB,mBAAmB,CACjC,MAAmB,EACnB,SAAmB,EACnB,YAAsB;IAEtB,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3C,CAAC;IACD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAA,yBAAY,EAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;YAClC,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;aAAM,IAAI,CAAC,IAAA,yBAAY,EAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;YAC7C,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * contract-presence:通用契约在场引擎(Q5 定稿)
3
+ *
4
+ * - 按 yml contracts 类型清单查表:类型不在清单内 = skip(不算违规)
5
+ * - 类型 → 判定方法的映射是代码不是配置(CONTRACT_JUDGMENTS);
6
+ * 首个活跃条目 review → context.reviewReport 在场(studio agent-loop 已解析字段,不重复解析)
7
+ * - 类型在清单内但无判定方法注册 = violation(暴露配置与代码失配)
8
+ */
9
+ import type { CompletionCheckersConfig, ContractPresenceContext, ContractPresenceResult } from './types';
10
+ /** 契约在场判定 */
11
+ export declare function verifyContractPresence(type: string, context: ContractPresenceContext, config?: CompletionCheckersConfig): ContractPresenceResult;
12
+ //# sourceMappingURL=contract-presence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-presence.d.ts","sourceRoot":"","sources":["../../src/completion-checkers/contract-presence.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAOzG,aAAa;AACb,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,uBAAuB,EAChC,MAAM,GAAE,wBAA6B,GACpC,sBAAsB,CAkBxB"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * contract-presence:通用契约在场引擎(Q5 定稿)
4
+ *
5
+ * - 按 yml contracts 类型清单查表:类型不在清单内 = skip(不算违规)
6
+ * - 类型 → 判定方法的映射是代码不是配置(CONTRACT_JUDGMENTS);
7
+ * 首个活跃条目 review → context.reviewReport 在场(studio agent-loop 已解析字段,不重复解析)
8
+ * - 类型在清单内但无判定方法注册 = violation(暴露配置与代码失配)
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.verifyContractPresence = verifyContractPresence;
12
+ /** 类型 → 判定方法映射(代码,不是配置)。新增契约类型 = 在此加一条 + 测试 */
13
+ const CONTRACT_JUDGMENTS = {
14
+ review: (context) => context.reviewReport != null,
15
+ };
16
+ /** 契约在场判定 */
17
+ function verifyContractPresence(type, context, config = {}) {
18
+ if (config.enabled === false || config.checkers?.contractPresence === false) {
19
+ return { checker: 'contract-presence', verdict: 'skip', detail: 'checker 已禁用' };
20
+ }
21
+ if (!(config.contracts ?? []).includes(type)) {
22
+ return { checker: 'contract-presence', verdict: 'skip', detail: `类型 ${type} 无 contracts 表项` };
23
+ }
24
+ const judge = CONTRACT_JUDGMENTS[type];
25
+ if (!judge) {
26
+ return {
27
+ checker: 'contract-presence',
28
+ verdict: 'violation',
29
+ detail: `类型 ${type} 已在 contracts 声明但无判定方法注册(配置与代码失配)`,
30
+ };
31
+ }
32
+ return judge(context)
33
+ ? { checker: 'contract-presence', verdict: 'pass' }
34
+ : { checker: 'contract-presence', verdict: 'violation', detail: `类型 ${type} 契约标记缺失` };
35
+ }
36
+ //# sourceMappingURL=contract-presence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract-presence.js","sourceRoot":"","sources":["../../src/completion-checkers/contract-presence.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAUH,wDAsBC;AA5BD,+CAA+C;AAC/C,MAAM,kBAAkB,GAAkE;IACxF,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI;CAClD,CAAC;AAEF,aAAa;AACb,SAAgB,sBAAsB,CACpC,IAAY,EACZ,OAAgC,EAChC,SAAmC,EAAE;IAErC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,gBAAgB,KAAK,KAAK,EAAE,CAAC;QAC5E,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,iBAAiB,EAAE,CAAC;IAChG,CAAC;IACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;YACL,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE,WAAW;YACpB,MAAM,EAAE,MAAM,IAAI,mCAAmC;SACtD,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,EAAE;QACnD,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC;AAC1F,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 轻量 glob 匹配(支持 `**`、`*`、`?`),用于 commits 文件清单分类。
3
+ * 不匹配文件系统,纯字符串判定。
4
+ */
5
+ /** 默认测试文件 glob(Q2 定稿) */
6
+ export declare const DEFAULT_TEST_GLOBS: string[];
7
+ /** 默认非代码文件 glob(兜底;权威清单由 yml noncode_globs 供给) */
8
+ export declare const DEFAULT_NONCODE_GLOBS: string[];
9
+ /** 单 glob 匹配 */
10
+ export declare function matchGlob(file: string, glob: string): boolean;
11
+ /** 命中任一 glob */
12
+ export declare function matchAnyGlob(file: string, globs: string[]): boolean;
13
+ //# sourceMappingURL=glob-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob-match.d.ts","sourceRoot":"","sources":["../../src/completion-checkers/glob-match.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,yBAAyB;AACzB,eAAO,MAAM,kBAAkB,UAAsD,CAAC;AAEtF,kDAAkD;AAClD,eAAO,MAAM,qBAAqB,UAAiD,CAAC;AAoCpF,gBAAgB;AAChB,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,gBAAgB;AAChB,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAEnE"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ /**
3
+ * 轻量 glob 匹配(支持 `**`、`*`、`?`),用于 commits 文件清单分类。
4
+ * 不匹配文件系统,纯字符串判定。
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.DEFAULT_NONCODE_GLOBS = exports.DEFAULT_TEST_GLOBS = void 0;
8
+ exports.matchGlob = matchGlob;
9
+ exports.matchAnyGlob = matchAnyGlob;
10
+ /** 默认测试文件 glob(Q2 定稿) */
11
+ exports.DEFAULT_TEST_GLOBS = ['**/*.test.ts', '**/*.spec.ts', '**/__tests__/**'];
12
+ /** 默认非代码文件 glob(兜底;权威清单由 yml noncode_globs 供给) */
13
+ exports.DEFAULT_NONCODE_GLOBS = ['**/*.md', '**/*.mdx', '**/*.txt', 'docs/**'];
14
+ function escapeRegExp(s) {
15
+ return s.replace(/[.+^${}()|[\]\\]/g, '\\$&');
16
+ }
17
+ /** glob → 锚定正则。前缀 `**` + `/` 匹配零或多段路径;`*` 不跨 `/`;`?` 匹配单个非 `/` 字符 */
18
+ function globToRegExp(glob) {
19
+ let re = '';
20
+ let i = 0;
21
+ while (i < glob.length) {
22
+ const c = glob[i];
23
+ if (c === '*') {
24
+ if (glob[i + 1] === '*') {
25
+ if (glob[i + 2] === '/') {
26
+ re += '(?:[^/]+/)*';
27
+ i += 3;
28
+ }
29
+ else {
30
+ re += '.*';
31
+ i += 2;
32
+ }
33
+ }
34
+ else {
35
+ re += '[^/]*';
36
+ i += 1;
37
+ }
38
+ }
39
+ else if (c === '?') {
40
+ re += '[^/]';
41
+ i += 1;
42
+ }
43
+ else {
44
+ re += escapeRegExp(c);
45
+ i += 1;
46
+ }
47
+ }
48
+ return new RegExp('^' + re + '$');
49
+ }
50
+ /** 单 glob 匹配 */
51
+ function matchGlob(file, glob) {
52
+ return globToRegExp(glob).test(file);
53
+ }
54
+ /** 命中任一 glob */
55
+ function matchAnyGlob(file, globs) {
56
+ return globs.some((g) => matchGlob(file, g));
57
+ }
58
+ //# sourceMappingURL=glob-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob-match.js","sourceRoot":"","sources":["../../src/completion-checkers/glob-match.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AA2CH,8BAEC;AAGD,oCAEC;AAhDD,yBAAyB;AACZ,QAAA,kBAAkB,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;AAEtF,kDAAkD;AACrC,QAAA,qBAAqB,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAEpF,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC;AAED,qEAAqE;AACrE,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACd,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACxB,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACxB,EAAE,IAAI,aAAa,CAAC;oBACpB,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;qBAAM,CAAC;oBACN,EAAE,IAAI,IAAI,CAAC;oBACX,CAAC,IAAI,CAAC,CAAC;gBACT,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,EAAE,IAAI,OAAO,CAAC;gBACd,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;YACrB,EAAE,IAAI,MAAM,CAAC;YACb,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,CAAC;YACN,EAAE,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;IACH,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,gBAAgB;AAChB,SAAgB,SAAS,CAAC,IAAY,EAAE,IAAY;IAClD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,gBAAgB;AAChB,SAAgB,YAAY,CAAC,IAAY,EAAE,KAAe;IACxD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Completion Checkers(T7-E1,studio#160)
3
+ *
4
+ * WU 收尾软观测三件套——纯判定函数库:
5
+ * - verifyTddChain:实现 commit 的 Tested-By 引用链验证
6
+ * - verifyPhaseFormat:phase(...) subject 结构验证
7
+ * - verifyContractPresence:通用契约在场引擎
8
+ *
9
+ * 与 ConstraintCheck 闭环注册表无关:直接 export,不注册、不碰 checkers/index.ts。
10
+ * 函数不碰文件系统与 git;commits 由调用方(studio 第四段守卫,T7-E2)供给。
11
+ */
12
+ export * from './types';
13
+ export { DEFAULT_TEST_GLOBS, DEFAULT_NONCODE_GLOBS, matchGlob, matchAnyGlob } from './glob-match';
14
+ export { classifyCommitFiles, resolveGlobs } from './classify';
15
+ export type { CommitFileClassification } from './classify';
16
+ export { verifyTddChain, TESTED_BY_RE, TESTS_NONE_RE } from './tdd-chain';
17
+ export { verifyPhaseFormat, PHASE_SUBJECT_RE } from './phase-format';
18
+ export { verifyContractPresence } from './contract-presence';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/completion-checkers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAClG,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /**
3
+ * Completion Checkers(T7-E1,studio#160)
4
+ *
5
+ * WU 收尾软观测三件套——纯判定函数库:
6
+ * - verifyTddChain:实现 commit 的 Tested-By 引用链验证
7
+ * - verifyPhaseFormat:phase(...) subject 结构验证
8
+ * - verifyContractPresence:通用契约在场引擎
9
+ *
10
+ * 与 ConstraintCheck 闭环注册表无关:直接 export,不注册、不碰 checkers/index.ts。
11
+ * 函数不碰文件系统与 git;commits 由调用方(studio 第四段守卫,T7-E2)供给。
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
25
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
26
+ };
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.verifyContractPresence = exports.PHASE_SUBJECT_RE = exports.verifyPhaseFormat = exports.TESTS_NONE_RE = exports.TESTED_BY_RE = exports.verifyTddChain = exports.resolveGlobs = exports.classifyCommitFiles = exports.matchAnyGlob = exports.matchGlob = exports.DEFAULT_NONCODE_GLOBS = exports.DEFAULT_TEST_GLOBS = void 0;
29
+ __exportStar(require("./types"), exports);
30
+ var glob_match_1 = require("./glob-match");
31
+ Object.defineProperty(exports, "DEFAULT_TEST_GLOBS", { enumerable: true, get: function () { return glob_match_1.DEFAULT_TEST_GLOBS; } });
32
+ Object.defineProperty(exports, "DEFAULT_NONCODE_GLOBS", { enumerable: true, get: function () { return glob_match_1.DEFAULT_NONCODE_GLOBS; } });
33
+ Object.defineProperty(exports, "matchGlob", { enumerable: true, get: function () { return glob_match_1.matchGlob; } });
34
+ Object.defineProperty(exports, "matchAnyGlob", { enumerable: true, get: function () { return glob_match_1.matchAnyGlob; } });
35
+ var classify_1 = require("./classify");
36
+ Object.defineProperty(exports, "classifyCommitFiles", { enumerable: true, get: function () { return classify_1.classifyCommitFiles; } });
37
+ Object.defineProperty(exports, "resolveGlobs", { enumerable: true, get: function () { return classify_1.resolveGlobs; } });
38
+ var tdd_chain_1 = require("./tdd-chain");
39
+ Object.defineProperty(exports, "verifyTddChain", { enumerable: true, get: function () { return tdd_chain_1.verifyTddChain; } });
40
+ Object.defineProperty(exports, "TESTED_BY_RE", { enumerable: true, get: function () { return tdd_chain_1.TESTED_BY_RE; } });
41
+ Object.defineProperty(exports, "TESTS_NONE_RE", { enumerable: true, get: function () { return tdd_chain_1.TESTS_NONE_RE; } });
42
+ var phase_format_1 = require("./phase-format");
43
+ Object.defineProperty(exports, "verifyPhaseFormat", { enumerable: true, get: function () { return phase_format_1.verifyPhaseFormat; } });
44
+ Object.defineProperty(exports, "PHASE_SUBJECT_RE", { enumerable: true, get: function () { return phase_format_1.PHASE_SUBJECT_RE; } });
45
+ var contract_presence_1 = require("./contract-presence");
46
+ Object.defineProperty(exports, "verifyContractPresence", { enumerable: true, get: function () { return contract_presence_1.verifyContractPresence; } });
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/completion-checkers/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,2CAAkG;AAAzF,gHAAA,kBAAkB,OAAA;AAAE,mHAAA,qBAAqB,OAAA;AAAE,uGAAA,SAAS,OAAA;AAAE,0GAAA,YAAY,OAAA;AAC3E,uCAA+D;AAAtD,+GAAA,mBAAmB,OAAA;AAAE,wGAAA,YAAY,OAAA;AAE1C,yCAA0E;AAAjE,2GAAA,cAAc,OAAA;AAAE,yGAAA,YAAY,OAAA;AAAE,0GAAA,aAAa,OAAA;AACpD,+CAAqE;AAA5D,iHAAA,iBAAiB,OAAA;AAAE,gHAAA,gBAAgB,OAAA;AAC5C,yDAA6D;AAApD,2HAAA,sBAAsB,OAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * phase-format:WU 提交 subject 的 phase 结构验证(Q4 定稿)
3
+ *
4
+ * 协议(正则写死在函数里,不进配置):
5
+ * - 全部非 merge commit 的 subject 命中 `^phase\([a-z0-9-]+\):\s+\S`
6
+ * - merge commit 出现即记违规
7
+ * - 阶段名不维护词表不查
8
+ * - 文件分类口径与 tdd-chain 共享(classify.ts),本 checker 不做免检——subject 结构要求覆盖全部非 merge commit
9
+ */
10
+ import type { CommitInput, CompletionCheckersConfig, PhaseFormatResult } from './types';
11
+ /** phase subject 结构(写死) */
12
+ export declare const PHASE_SUBJECT_RE: RegExp;
13
+ /** phase 格式验证 */
14
+ export declare function verifyPhaseFormat(commits: CommitInput[], config?: CompletionCheckersConfig): PhaseFormatResult;
15
+ //# sourceMappingURL=phase-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-format.d.ts","sourceRoot":"","sources":["../../src/completion-checkers/phase-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAiB,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEvG,2BAA2B;AAC3B,eAAO,MAAM,gBAAgB,QAA+B,CAAC;AAU7D,iBAAiB;AACjB,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,GAAE,wBAA6B,GACpC,iBAAiB,CAoBnB"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * phase-format:WU 提交 subject 的 phase 结构验证(Q4 定稿)
4
+ *
5
+ * 协议(正则写死在函数里,不进配置):
6
+ * - 全部非 merge commit 的 subject 命中 `^phase\([a-z0-9-]+\):\s+\S`
7
+ * - merge commit 出现即记违规
8
+ * - 阶段名不维护词表不查
9
+ * - 文件分类口径与 tdd-chain 共享(classify.ts),本 checker 不做免检——subject 结构要求覆盖全部非 merge commit
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PHASE_SUBJECT_RE = void 0;
13
+ exports.verifyPhaseFormat = verifyPhaseFormat;
14
+ /** phase subject 结构(写死) */
15
+ exports.PHASE_SUBJECT_RE = /^phase\([a-z0-9-]+\):\s+\S/;
16
+ /** merge commit 的 subject 启发式(调用方未显式给 isMerge 时兜底) */
17
+ const MERGE_SUBJECT_RE = /^Merge\s/;
18
+ /** 判定 merge commit:优先 isMerge 显式字段,缺省按 subject 启发式 */
19
+ function isMergeCommit(commit) {
20
+ return commit.isMerge ?? MERGE_SUBJECT_RE.test(commit.subject);
21
+ }
22
+ /** phase 格式验证 */
23
+ function verifyPhaseFormat(commits, config = {}) {
24
+ if (config.enabled === false || config.checkers?.phaseFormat === false) {
25
+ return { checker: 'phase-format', verdict: 'skip', commits: [] };
26
+ }
27
+ const verdicts = commits.map((commit) => {
28
+ if (isMergeCommit(commit)) {
29
+ return { sha: commit.sha, verdict: 'violation', reason: 'WU 提交集内出现 merge commit' };
30
+ }
31
+ if (!exports.PHASE_SUBJECT_RE.test(commit.subject)) {
32
+ return { sha: commit.sha, verdict: 'violation', reason: `subject 不合规:${commit.subject}` };
33
+ }
34
+ return { sha: commit.sha, verdict: 'pass' };
35
+ });
36
+ return {
37
+ checker: 'phase-format',
38
+ verdict: verdicts.some((v) => v.verdict === 'violation') ? 'violation' : 'pass',
39
+ commits: verdicts,
40
+ };
41
+ }
42
+ //# sourceMappingURL=phase-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-format.js","sourceRoot":"","sources":["../../src/completion-checkers/phase-format.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAgBH,8CAuBC;AAnCD,2BAA2B;AACd,QAAA,gBAAgB,GAAG,4BAA4B,CAAC;AAE7D,sDAAsD;AACtD,MAAM,gBAAgB,GAAG,UAAU,CAAC;AAEpC,sDAAsD;AACtD,SAAS,aAAa,CAAC,MAAmB;IACxC,OAAO,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,iBAAiB;AACjB,SAAgB,iBAAiB,CAC/B,OAAsB,EACtB,SAAmC,EAAE;IAErC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE,WAAW,KAAK,KAAK,EAAE,CAAC;QACvE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,QAAQ,GAAoB,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACvD,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;QACrF,CAAC;QACD,IAAI,CAAC,wBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,eAAe,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5F,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;QAC/E,OAAO,EAAE,QAAQ;KAClB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * tdd-chain:实现 commit 的测试引用链验证(Q2/Q3 定稿)
3
+ *
4
+ * 协议(写死为机制本体,不进配置):
5
+ * - 实现 commit 必须带 trailer `Tested-By: <sha>`
6
+ * - 被引 sha 须 a) 在本 WU 提交集内 b) 序列位置在本 commit 之前(比位置不比时间戳)c) 其文件清单命中 test_globs
7
+ * - 豁免:trailer `Tests: none` → waiver(放行记台账);纯非代码/纯测试 commit 天然免检
8
+ */
9
+ import type { CommitInput, CompletionCheckersConfig, TddChainResult } from './types';
10
+ /** Tested-By 引用协议(写死) */
11
+ export declare const TESTED_BY_RE: RegExp;
12
+ /** Tests: none 豁免协议(写死) */
13
+ export declare const TESTS_NONE_RE: RegExp;
14
+ /** 引用链验证:伪造引用(不存在 / 位置在后 / 不含测试文件)一律记 violation */
15
+ export declare function verifyTddChain(commits: CommitInput[], config?: CompletionCheckersConfig): TddChainResult;
16
+ //# sourceMappingURL=tdd-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tdd-chain.d.ts","sourceRoot":"","sources":["../../src/completion-checkers/tdd-chain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAiB,wBAAwB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGpG,yBAAyB;AACzB,eAAO,MAAM,YAAY,QAA0C,CAAC;AAEpE,2BAA2B;AAC3B,eAAO,MAAM,aAAa,QAAyB,CAAC;AAEpD,mDAAmD;AACnD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EAAE,EACtB,MAAM,GAAE,wBAA6B,GACpC,cAAc,CAwChB"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * tdd-chain:实现 commit 的测试引用链验证(Q2/Q3 定稿)
4
+ *
5
+ * 协议(写死为机制本体,不进配置):
6
+ * - 实现 commit 必须带 trailer `Tested-By: <sha>`
7
+ * - 被引 sha 须 a) 在本 WU 提交集内 b) 序列位置在本 commit 之前(比位置不比时间戳)c) 其文件清单命中 test_globs
8
+ * - 豁免:trailer `Tests: none` → waiver(放行记台账);纯非代码/纯测试 commit 天然免检
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.TESTS_NONE_RE = exports.TESTED_BY_RE = void 0;
12
+ exports.verifyTddChain = verifyTddChain;
13
+ const classify_1 = require("./classify");
14
+ /** Tested-By 引用协议(写死) */
15
+ exports.TESTED_BY_RE = /^Tested-By:\s*([0-9a-f]{7,40})\s*$/gim;
16
+ /** Tests: none 豁免协议(写死) */
17
+ exports.TESTS_NONE_RE = /^Tests:\s*none\s*$/im;
18
+ /** 引用链验证:伪造引用(不存在 / 位置在后 / 不含测试文件)一律记 violation */
19
+ function verifyTddChain(commits, config = {}) {
20
+ if (config.enabled === false || config.checkers?.tddChain === false) {
21
+ return { checker: 'tdd-chain', verdict: 'skip', commits: [] };
22
+ }
23
+ const { testGlobs, noncodeGlobs } = (0, classify_1.resolveGlobs)(config);
24
+ // 文件分类一次性算好,与同批 commit 的其他 checker 共享口径
25
+ const classifications = commits.map((c) => (0, classify_1.classifyCommitFiles)(c, testGlobs, noncodeGlobs));
26
+ const verdicts = commits.map((commit, i) => {
27
+ if (classifications[i].exempt) {
28
+ return { sha: commit.sha, verdict: 'skip', reason: '纯测试/纯非代码 commit,天然免检' };
29
+ }
30
+ if (exports.TESTS_NONE_RE.test(commit.body)) {
31
+ return { sha: commit.sha, verdict: 'waiver', reason: 'Tests: none 显式豁免' };
32
+ }
33
+ exports.TESTED_BY_RE.lastIndex = 0;
34
+ const m = exports.TESTED_BY_RE.exec(commit.body);
35
+ if (!m) {
36
+ return { sha: commit.sha, verdict: 'violation', reason: '缺 Tested-By trailer 且未声明 Tests: none' };
37
+ }
38
+ const ref = m[1].toLowerCase();
39
+ const j = commits.findIndex((c) => c.sha.toLowerCase().startsWith(ref));
40
+ if (j === -1) {
41
+ return { sha: commit.sha, verdict: 'violation', reason: `Tested-By 引用 ${ref} 不在本 WU 提交集内` };
42
+ }
43
+ if (j >= i) {
44
+ return { sha: commit.sha, verdict: 'violation', reason: `Tested-By 引用 ${ref} 位置不在本 commit 之前` };
45
+ }
46
+ if (!classifications[j].hasTests) {
47
+ return { sha: commit.sha, verdict: 'violation', reason: `被引 commit ${ref} 文件清单未命中 test_globs` };
48
+ }
49
+ return { sha: commit.sha, verdict: 'pass' };
50
+ });
51
+ return {
52
+ checker: 'tdd-chain',
53
+ verdict: verdicts.some((v) => v.verdict === 'violation') ? 'violation' : 'pass',
54
+ commits: verdicts,
55
+ };
56
+ }
57
+ //# sourceMappingURL=tdd-chain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tdd-chain.js","sourceRoot":"","sources":["../../src/completion-checkers/tdd-chain.ts"],"names":[],"mappings":"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"}