@dommaker/harness 1.11.0 → 1.12.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 (137) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cli/commands/constraints-pack-proposal.d.ts +48 -0
  3. package/dist/cli/commands/constraints-pack-proposal.d.ts.map +1 -0
  4. package/dist/cli/commands/constraints-pack-proposal.js +169 -0
  5. package/dist/cli/commands/constraints-pack-proposal.js.map +1 -0
  6. package/dist/cli/commands/constraints-reactivate.d.ts +55 -0
  7. package/dist/cli/commands/constraints-reactivate.d.ts.map +1 -0
  8. package/dist/cli/commands/constraints-reactivate.js +175 -0
  9. package/dist/cli/commands/constraints-reactivate.js.map +1 -0
  10. package/dist/cli/commands/constraints-report.d.ts +12 -1
  11. package/dist/cli/commands/constraints-report.d.ts.map +1 -1
  12. package/dist/cli/commands/constraints-report.js +35 -2
  13. package/dist/cli/commands/constraints-report.js.map +1 -1
  14. package/dist/cli/commands/constraints-retire.d.ts +49 -4
  15. package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
  16. package/dist/cli/commands/constraints-retire.js +116 -34
  17. package/dist/cli/commands/constraints-retire.js.map +1 -1
  18. package/dist/cli/commands/definitions.d.ts.map +1 -1
  19. package/dist/cli/commands/definitions.js +31 -1
  20. package/dist/cli/commands/definitions.js.map +1 -1
  21. package/dist/cli/commands/knowledge-view.d.ts +6 -3
  22. package/dist/cli/commands/knowledge-view.d.ts.map +1 -1
  23. package/dist/cli/commands/knowledge-view.js +8 -26
  24. package/dist/cli/commands/knowledge-view.js.map +1 -1
  25. package/dist/cli/commands/report.d.ts.map +1 -1
  26. package/dist/cli/commands/report.js +9 -5
  27. package/dist/cli/commands/report.js.map +1 -1
  28. package/dist/cli/state-io.d.ts +8 -1
  29. package/dist/cli/state-io.d.ts.map +1 -1
  30. package/dist/cli/state-io.js +2 -1
  31. package/dist/cli/state-io.js.map +1 -1
  32. package/dist/core/app-constraints-loader.d.ts +28 -0
  33. package/dist/core/app-constraints-loader.d.ts.map +1 -0
  34. package/dist/core/app-constraints-loader.js +187 -0
  35. package/dist/core/app-constraints-loader.js.map +1 -0
  36. package/dist/core/constraints/checker.js +1 -1
  37. package/dist/core/constraints/checker.js.map +1 -1
  38. package/dist/core/constraints/checkers/index.d.ts +20 -9
  39. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  40. package/dist/core/constraints/checkers/index.js +40 -11
  41. package/dist/core/constraints/checkers/index.js.map +1 -1
  42. package/dist/core/constraints/checkers/templated/file-exists.d.ts +16 -0
  43. package/dist/core/constraints/checkers/templated/file-exists.d.ts.map +1 -0
  44. package/dist/core/constraints/checkers/templated/file-exists.js +108 -0
  45. package/dist/core/constraints/checkers/templated/file-exists.js.map +1 -0
  46. package/dist/core/constraints/checkers/templated/glob.d.ts +10 -0
  47. package/dist/core/constraints/checkers/templated/glob.d.ts.map +1 -0
  48. package/dist/core/constraints/checkers/templated/glob.js +51 -0
  49. package/dist/core/constraints/checkers/templated/glob.js.map +1 -0
  50. package/dist/core/constraints/checkers/templated/index.d.ts +12 -0
  51. package/dist/core/constraints/checkers/templated/index.d.ts.map +1 -0
  52. package/dist/core/constraints/checkers/templated/index.js +17 -0
  53. package/dist/core/constraints/checkers/templated/index.js.map +1 -0
  54. package/dist/core/constraints/checkers/templated/regex-scan.d.ts +15 -0
  55. package/dist/core/constraints/checkers/templated/regex-scan.d.ts.map +1 -0
  56. package/dist/core/constraints/checkers/templated/regex-scan.js +129 -0
  57. package/dist/core/constraints/checkers/templated/regex-scan.js.map +1 -0
  58. package/dist/core/constraints/checkers/templates-registry.d.ts +17 -0
  59. package/dist/core/constraints/checkers/templates-registry.d.ts.map +1 -0
  60. package/dist/core/constraints/checkers/templates-registry.js +23 -0
  61. package/dist/core/constraints/checkers/templates-registry.js.map +1 -0
  62. package/dist/core/constraints/checkers/types.d.ts +14 -0
  63. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  64. package/dist/core/constraints/checkers/types.js.map +1 -1
  65. package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
  66. package/dist/core/constraints/definitions/guidelines.js +0 -14
  67. package/dist/core/constraints/definitions/guidelines.js.map +1 -1
  68. package/dist/core/constraints/definitions/iron-laws.d.ts.map +1 -1
  69. package/dist/core/constraints/definitions/iron-laws.js +15 -0
  70. package/dist/core/constraints/definitions/iron-laws.js.map +1 -1
  71. package/dist/core/constraints/usage-report.d.ts +58 -6
  72. package/dist/core/constraints/usage-report.d.ts.map +1 -1
  73. package/dist/core/constraints/usage-report.js +61 -12
  74. package/dist/core/constraints/usage-report.js.map +1 -1
  75. package/dist/core/project-config-loader.d.ts +9 -6
  76. package/dist/core/project-config-loader.d.ts.map +1 -1
  77. package/dist/core/project-config-loader.js +18 -8
  78. package/dist/core/project-config-loader.js.map +1 -1
  79. package/dist/gates/command.d.ts.map +1 -1
  80. package/dist/gates/command.js +50 -0
  81. package/dist/gates/command.js.map +1 -1
  82. package/dist/knowledge/lifecycle.d.ts +14 -0
  83. package/dist/knowledge/lifecycle.d.ts.map +1 -1
  84. package/dist/knowledge/lifecycle.js +50 -0
  85. package/dist/knowledge/lifecycle.js.map +1 -1
  86. package/dist/presets/standard.d.ts +1 -1
  87. package/dist/presets/standard.d.ts.map +1 -1
  88. package/dist/presets/standard.js +2 -3
  89. package/dist/presets/standard.js.map +1 -1
  90. package/dist/types/constraint.d.ts +24 -0
  91. package/dist/types/constraint.d.ts.map +1 -1
  92. package/dist/types/constraint.js.map +1 -1
  93. package/package.json +1 -1
  94. package/src/__tests__/app-constraints-loader.test.ts +220 -0
  95. package/src/__tests__/iron-laws.test.ts +5 -5
  96. package/src/cli/commands/CONTEXT.md +3 -2
  97. package/src/cli/commands/__tests__/check.test.ts +22 -4
  98. package/src/cli/commands/__tests__/constraints-pack-proposal.test.ts +142 -0
  99. package/src/cli/commands/__tests__/constraints-reactivate.test.ts +210 -0
  100. package/src/cli/commands/__tests__/constraints-report.test.ts +175 -6
  101. package/src/cli/commands/__tests__/constraints-retire.test.ts +135 -10
  102. package/src/cli/commands/__tests__/knowledge.test.ts +6 -16
  103. package/src/cli/commands/__tests__/report-app-constraints.test.ts +67 -0
  104. package/src/cli/commands/constraints-pack-proposal.ts +172 -0
  105. package/src/cli/commands/constraints-reactivate.ts +197 -0
  106. package/src/cli/commands/constraints-report.ts +44 -2
  107. package/src/cli/commands/constraints-retire.ts +129 -36
  108. package/src/cli/commands/definitions.ts +31 -1
  109. package/src/cli/commands/knowledge-view.ts +9 -28
  110. package/src/cli/commands/report.ts +9 -5
  111. package/src/cli/state-io.ts +8 -1
  112. package/src/core/CONTEXT.md +5 -4
  113. package/src/core/app-constraints-loader.ts +165 -0
  114. package/src/core/constraints/__tests__/collect-constraints.test.ts +3 -1
  115. package/src/core/constraints/__tests__/usage-report.test.ts +63 -0
  116. package/src/core/constraints/checker.ts +1 -1
  117. package/src/core/constraints/checkers/__tests__/templated-checkers.test.ts +180 -0
  118. package/src/core/constraints/checkers/__tests__/templates-registry.test.ts +81 -0
  119. package/src/core/constraints/checkers/index.ts +44 -10
  120. package/src/core/constraints/checkers/templated/file-exists.ts +75 -0
  121. package/src/core/constraints/checkers/templated/glob.ts +46 -0
  122. package/src/core/constraints/checkers/templated/index.ts +12 -0
  123. package/src/core/constraints/checkers/templated/regex-scan.ts +132 -0
  124. package/src/core/constraints/checkers/templates-registry.ts +22 -0
  125. package/src/core/constraints/checkers/types.ts +15 -0
  126. package/src/core/constraints/definitions/guidelines.ts +0 -15
  127. package/src/core/constraints/definitions/iron-laws.ts +16 -0
  128. package/src/core/constraints/usage-report.ts +128 -13
  129. package/src/core/project-config-loader.ts +19 -8
  130. package/src/gates/__tests__/command.test.ts +54 -0
  131. package/src/gates/command.ts +51 -0
  132. package/src/knowledge/CONTEXT.md +3 -1
  133. package/src/knowledge/__tests__/lifecycle.test.ts +81 -0
  134. package/src/knowledge/lifecycle.ts +49 -0
  135. package/src/presets/__tests__/standard.test.ts +5 -4
  136. package/src/presets/standard.ts +2 -3
  137. package/src/types/constraint.ts +28 -0
@@ -1,15 +1,20 @@
1
1
  "use strict";
2
2
  /**
3
- * 约束检查器注册表(工单 21
3
+ * 约束检查器注册表(工单 21;ADR-0033 拆两层)
4
4
  *
5
- * checker.ts 编排层通过 getConstraintCheck(id) 查找实现。
5
+ * checker.ts 编排层通过 getConstraintCheck() 查找实现。
6
6
  *
7
- * 注册表闭环(ADR-0001):模块加载时校验全部 kind='check' 的内置约束
8
- * 都有已注册 checker,且注册表中没有无对应 check 定义的孤儿实现;
9
- * 任一不满足即抛错(加载期失败,不许静默 pass)。
7
+ * 两层注册表:
8
+ * - 内置 checker(registry,按约束 id):模块加载时校验全部 kind='check' 的内置约束
9
+ * 都有已注册 checker,且注册表中没有无对应 check 定义的孤儿实现;
10
+ * 任一不满足即抛错(加载期失败,不许静默 pass,ADR-0001)。
11
+ * - 模板 checker(TEMPLATES,按模板 id):填空式参数化模板,供应用层约束
12
+ * (source='app',`.harness/constraints.yml`)按 checker + params 实例化。
13
+ * 闭环语义扩展而非开口:应用层约束在加载期(app-constraints-loader)校验
14
+ * 模板 id 存在 + validateParams 通过;getConstraintCheck 对未注册模板 id 抛错。
10
15
  */
11
16
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.normalizeCheckOutcome = exports.buildCheckEnv = void 0;
17
+ exports.normalizeCheckOutcome = exports.buildCheckEnv = exports.TEMPLATES = void 0;
13
18
  exports.getConstraintCheck = getConstraintCheck;
14
19
  exports.registeredCheckCount = registeredCheckCount;
15
20
  const definitions_1 = require("../definitions");
@@ -20,19 +25,27 @@ const context_doc_sync_1 = require("./context-doc-sync");
20
25
  const docs_freshness_1 = require("./docs-freshness");
21
26
  const no_hardcoded_credentials_1 = require("./no-hardcoded-credentials");
22
27
  const governance_presence_1 = require("./governance-presence");
28
+ const templates_registry_1 = require("./templates-registry");
23
29
  const CHECKS = [
24
30
  // severity='error'
25
31
  iron_flags_1.noCompletionWithoutVerification,
26
32
  no_test_simplification_1.noTestSimplification,
27
33
  docs_freshness_1.docsFreshness,
28
- // severity='warning'
29
34
  no_hardcoded_credentials_1.noHardcodedCredentials,
35
+ // severity='warning'
30
36
  capability_sync_1.capabilitySync,
31
37
  context_doc_sync_1.contextDocSync,
32
38
  governance_presence_1.governancePresence,
33
39
  ];
34
40
  const registry = new Map(CHECKS.map(c => [c.id, c]));
35
41
  // ========================================
42
+ // 模板注册表(ADR-0033,应用层约束用)
43
+ // ========================================
44
+ // TEMPLATES 住在 ./templates-registry(独立模块防值级循环,见该文件头注释);
45
+ // 此处 re-export 供编排层与测试单口取数
46
+ var templates_registry_2 = require("./templates-registry");
47
+ Object.defineProperty(exports, "TEMPLATES", { enumerable: true, get: function () { return templates_registry_2.TEMPLATES; } });
48
+ // ========================================
36
49
  // 注册表闭环校验(加载期)
37
50
  // ========================================
38
51
  const checkConstraints = (0, definitions_1.getAllConstraints)().filter(c => c.kind === 'check');
@@ -49,11 +62,27 @@ for (const id of registry.keys()) {
49
62
  }
50
63
  }
51
64
  /**
52
- * 按约束 ID 查找检查实现;未注册返回 undefined
53
- * (编排层对 kind='check' 未注册的情况抛错)
65
+ * 查找检查实现
66
+ *
67
+ * - 传字符串 id 或内置约束:按 id 查内置注册表,未注册返回 undefined
68
+ * (编排层对 kind='check' 未注册的情况抛错)
69
+ * - 传 source='app' 的约束:按 checker 模板 id + params 实例化;
70
+ * 模板 id 未注册 → 抛错(闭环保留,不许静默 pass)
54
71
  */
55
- function getConstraintCheck(id) {
56
- return registry.get(id);
72
+ function getConstraintCheck(idOrConstraint) {
73
+ if (typeof idOrConstraint === 'string') {
74
+ return registry.get(idOrConstraint);
75
+ }
76
+ if (idOrConstraint.source === 'app') {
77
+ const templateId = idOrConstraint.checker;
78
+ const factory = templateId ? templates_registry_1.TEMPLATES.get(templateId) : undefined;
79
+ if (!factory) {
80
+ throw new Error(`[harness] 约束注册表闭环校验失败:应用层约束 "${idOrConstraint.id}" 引用的 checker 模板 ` +
81
+ `"${templateId ?? '(未填写)'}" 未注册。请在 checkers/templated/ 中实现并注册。`);
82
+ }
83
+ return factory.create(idOrConstraint.id, idOrConstraint.params ?? {});
84
+ }
85
+ return registry.get(idOrConstraint.id);
57
86
  }
58
87
  /**
59
88
  * 已注册的检查实现数量(诊断/测试用)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAyDH,gDAEC;AAKD,oDAEC;AA/DD,gDAAmD;AAEnD,6CAEsB;AACtB,qEAAgE;AAChE,uDAAmD;AACnD,yDAAoD;AACpD,qDAAiD;AACjD,yEAAoE;AACpE,+DAA2D;AAE3D,MAAM,MAAM,GAAsB;IAChC,mBAAmB;IACnB,4CAA+B;IAC/B,6CAAoB;IACpB,8BAAa;IACb,qBAAqB;IACrB,iDAAsB;IACtB,gCAAc;IACd,iCAAc;IACd,wCAAkB;CACnB,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAA0B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9E,2CAA2C;AAC3C,eAAe;AACf,2CAA2C;AAE3C,MAAM,gBAAgB,GAAG,IAAA,+BAAiB,GAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AAE7E,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;IACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,2CAA2C,CAAC,CAAC,EAAE,gBAAgB;YAC/D,4CAA4C,CAC7C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,kCAAkC,EAAE,4BAA4B;YAChE,gCAAgC,CACjC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,EAAU;IAC3C,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB;IAClC,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,iCAA+D;AAAtD,sGAAA,aAAa,OAAA;AAAE,8GAAA,qBAAqB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;;;AAuEH,gDAgBC;AAKD,oDAEC;AA1FD,gDAAmD;AAEnD,6CAEsB;AACtB,qEAAgE;AAChE,uDAAmD;AACnD,yDAAoD;AACpD,qDAAiD;AACjD,yEAAoE;AACpE,+DAA2D;AAC3D,6DAAiD;AAEjD,MAAM,MAAM,GAAsB;IAChC,mBAAmB;IACnB,4CAA+B;IAC/B,6CAAoB;IACpB,8BAAa;IACb,iDAAsB;IACtB,qBAAqB;IACrB,gCAAc;IACd,iCAAc;IACd,wCAAkB;CACnB,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAA0B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9E,2CAA2C;AAC3C,yBAAyB;AACzB,2CAA2C;AAE3C,wDAAwD;AACxD,2BAA2B;AAC3B,2DAAiD;AAAxC,+GAAA,SAAS,OAAA;AAElB,2CAA2C;AAC3C,eAAe;AACf,2CAA2C;AAE3C,MAAM,gBAAgB,GAAG,IAAA,+BAAiB,GAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AAE7E,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;IACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,2CAA2C,CAAC,CAAC,EAAE,gBAAgB;YAC/D,4CAA4C,CAC7C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,kCAAkC,EAAE,4BAA4B;YAChE,gCAAgC,CACjC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,cAAmC;IACpE,IAAI,OAAO,cAAc,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,CAAC;QAC1C,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,8BAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACnE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,gCAAgC,cAAc,CAAC,EAAE,mBAAmB;gBACpE,IAAI,UAAU,IAAI,OAAO,sCAAsC,CAChE,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,cAAc,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAgB,oBAAoB;IAClC,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED,iCAA+D;AAAtD,sGAAA,aAAa,OAAA;AAAE,8GAAA,qBAAqB,OAAA"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * file-exists 模板:文件存在性约束(ADR-0033,块 3 子项 2)
3
+ *
4
+ * 形态参照 context-doc-sync:存在性判定 + 证据行(fail 必须可归因,harness#119)。
5
+ * 与 context-doc-sync 的差别:目标由参数显式给出(加载期已校验),
6
+ * 无「约定未采用」三态,故永不 skip。
7
+ *
8
+ * 参数:
9
+ * - path(可选):相对项目根的单文件路径
10
+ * - glob(可选):文件集 glob(fast-glob 口径,dot: true 以覆盖 .harness 等点目录)
11
+ * - mustExist(可选,缺省 true):true = 必须存在;false = 必须不存在
12
+ * path 与 glob 至少填一个;都填 = 两者都要满足。
13
+ */
14
+ import { type TemplatedCheckerFactory } from '../types';
15
+ export declare const fileExists: TemplatedCheckerFactory;
16
+ //# sourceMappingURL=file-exists.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-exists.d.ts","sourceRoot":"","sources":["../../../../../src/core/constraints/checkers/templated/file-exists.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAwC,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAE9F,eAAO,MAAM,UAAU,EAAE,uBAuDxB,CAAC"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ /**
3
+ * file-exists 模板:文件存在性约束(ADR-0033,块 3 子项 2)
4
+ *
5
+ * 形态参照 context-doc-sync:存在性判定 + 证据行(fail 必须可归因,harness#119)。
6
+ * 与 context-doc-sync 的差别:目标由参数显式给出(加载期已校验),
7
+ * 无「约定未采用」三态,故永不 skip。
8
+ *
9
+ * 参数:
10
+ * - path(可选):相对项目根的单文件路径
11
+ * - glob(可选):文件集 glob(fast-glob 口径,dot: true 以覆盖 .harness 等点目录)
12
+ * - mustExist(可选,缺省 true):true = 必须存在;false = 必须不存在
13
+ * path 与 glob 至少填一个;都填 = 两者都要满足。
14
+ */
15
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ var desc = Object.getOwnPropertyDescriptor(m, k);
18
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19
+ desc = { enumerable: true, get: function() { return m[k]; } };
20
+ }
21
+ Object.defineProperty(o, k2, desc);
22
+ }) : (function(o, m, k, k2) {
23
+ if (k2 === undefined) k2 = k;
24
+ o[k2] = m[k];
25
+ }));
26
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
27
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
28
+ }) : function(o, v) {
29
+ o["default"] = v;
30
+ });
31
+ var __importStar = (this && this.__importStar) || (function () {
32
+ var ownKeys = function(o) {
33
+ ownKeys = Object.getOwnPropertyNames || function (o) {
34
+ var ar = [];
35
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
36
+ return ar;
37
+ };
38
+ return ownKeys(o);
39
+ };
40
+ return function (mod) {
41
+ if (mod && mod.__esModule) return mod;
42
+ var result = {};
43
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
44
+ __setModuleDefault(result, mod);
45
+ return result;
46
+ };
47
+ })();
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.fileExists = void 0;
50
+ const fs_1 = require("fs");
51
+ const path_1 = require("path");
52
+ const glob = __importStar(require("fast-glob"));
53
+ const types_1 = require("../types");
54
+ exports.fileExists = {
55
+ validateParams(params) {
56
+ const errors = [];
57
+ if (params.path !== undefined && typeof params.path !== 'string') {
58
+ errors.push('path 必须是字符串');
59
+ }
60
+ if (params.glob !== undefined && typeof params.glob !== 'string') {
61
+ errors.push('glob 必须是字符串');
62
+ }
63
+ const hasPath = typeof params.path === 'string' && params.path.length > 0;
64
+ const hasGlob = typeof params.glob === 'string' && params.glob.length > 0;
65
+ if (!hasPath && !hasGlob) {
66
+ errors.push('path 或 glob 至少填一个');
67
+ }
68
+ if (params.mustExist !== undefined && typeof params.mustExist !== 'boolean') {
69
+ errors.push('mustExist 必须是布尔值');
70
+ }
71
+ return errors;
72
+ },
73
+ create(id, params) {
74
+ const rel = params.path;
75
+ const globPattern = params.glob;
76
+ const mustExist = params.mustExist !== false;
77
+ return {
78
+ id,
79
+ evaluate(env) {
80
+ const pathHit = rel !== undefined && (0, fs_1.existsSync)((0, path_1.join)(env.projectPath, rel));
81
+ const globHits = globPattern !== undefined
82
+ ? glob.sync(globPattern, { cwd: env.projectPath, dot: true, onlyFiles: false })
83
+ : [];
84
+ if (mustExist) {
85
+ const missing = [];
86
+ if (rel !== undefined && !pathHit)
87
+ missing.push(rel);
88
+ if (globPattern !== undefined && globHits.length === 0)
89
+ missing.push(`${globPattern}(无匹配文件)`);
90
+ if (missing.length > 0) {
91
+ return { pass: false, evidence: (0, types_1.formatEvidence)('必需文件不存在', missing) };
92
+ }
93
+ return true;
94
+ }
95
+ // mustExist=false:任何目标存在即违规
96
+ const present = [
97
+ ...(pathHit ? [rel] : []),
98
+ ...globHits,
99
+ ];
100
+ if (present.length > 0) {
101
+ return { pass: false, evidence: (0, types_1.formatEvidence)('禁存文件存在', present) };
102
+ }
103
+ return true;
104
+ },
105
+ };
106
+ },
107
+ };
108
+ //# sourceMappingURL=file-exists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-exists.js","sourceRoot":"","sources":["../../../../../src/core/constraints/checkers/templated/file-exists.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 模板侧轻量 glob 匹配(支持 `**`、`*`、`?`,纯字符串判定,不碰文件系统)
3
+ *
4
+ * 与 completion-checkers/glob-match 同一匹配语义;此处另写一份是因为分层
5
+ * (harness#88 参数化守卫)不许 core 值导入同层领域模块——约束域的模板
6
+ * 参数匹配不住 completion-checkers 的 commits 分类模块。
7
+ */
8
+ /** 单 glob 匹配(相对路径正斜杠口径) */
9
+ export declare function matchGlob(file: string, glob: string): boolean;
10
+ //# sourceMappingURL=glob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.d.ts","sourceRoot":"","sources":["../../../../../src/core/constraints/checkers/templated/glob.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoCH,2BAA2B;AAC3B,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ /**
3
+ * 模板侧轻量 glob 匹配(支持 `**`、`*`、`?`,纯字符串判定,不碰文件系统)
4
+ *
5
+ * 与 completion-checkers/glob-match 同一匹配语义;此处另写一份是因为分层
6
+ * (harness#88 参数化守卫)不许 core 值导入同层领域模块——约束域的模板
7
+ * 参数匹配不住 completion-checkers 的 commits 分类模块。
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.matchGlob = matchGlob;
11
+ function escapeRegExp(s) {
12
+ return s.replace(/[.+^${}()|[\]\\]/g, '\\$&');
13
+ }
14
+ /** glob → 锚定正则。前缀 `**` + `/` 匹配零或多段路径;`*` 不跨 `/`;`?` 匹配单个非 `/` 字符 */
15
+ function globToRegExp(glob) {
16
+ let re = '';
17
+ let i = 0;
18
+ while (i < glob.length) {
19
+ const c = glob[i];
20
+ if (c === '*') {
21
+ if (glob[i + 1] === '*') {
22
+ if (glob[i + 2] === '/') {
23
+ re += '(?:[^/]+/)*';
24
+ i += 3;
25
+ }
26
+ else {
27
+ re += '.*';
28
+ i += 2;
29
+ }
30
+ }
31
+ else {
32
+ re += '[^/]*';
33
+ i += 1;
34
+ }
35
+ }
36
+ else if (c === '?') {
37
+ re += '[^/]';
38
+ i += 1;
39
+ }
40
+ else {
41
+ re += escapeRegExp(c);
42
+ i += 1;
43
+ }
44
+ }
45
+ return new RegExp('^' + re + '$');
46
+ }
47
+ /** 单 glob 匹配(相对路径正斜杠口径) */
48
+ function matchGlob(file, glob) {
49
+ return globToRegExp(glob).test(file);
50
+ }
51
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../../../../src/core/constraints/checkers/templated/glob.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAqCH,8BAEC;AArCD,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,2BAA2B;AAC3B,SAAgB,SAAS,CAAC,IAAY,EAAE,IAAY;IAClD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 填空式 checker 模板(ADR-0033 两层约束模型,块 3 子项 2)
3
+ *
4
+ * 每个模板 = TemplatedCheckerFactory(validateParams + create),注册进
5
+ * checkers/index.ts 的 TEMPLATES 供应用层约束(`.harness/constraints.yml`)
6
+ * 按 checker + params 实例化。
7
+ *
8
+ * 模板只认参数不认应用语义(harness 零业务逻辑):约束条文、文案归应用仓。
9
+ */
10
+ export { regexScan } from './regex-scan';
11
+ export { fileExists } from './file-exists';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/constraints/checkers/templated/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ /**
3
+ * 填空式 checker 模板(ADR-0033 两层约束模型,块 3 子项 2)
4
+ *
5
+ * 每个模板 = TemplatedCheckerFactory(validateParams + create),注册进
6
+ * checkers/index.ts 的 TEMPLATES 供应用层约束(`.harness/constraints.yml`)
7
+ * 按 checker + params 实例化。
8
+ *
9
+ * 模板只认参数不认应用语义(harness 零业务逻辑):约束条文、文案归应用仓。
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.fileExists = exports.regexScan = void 0;
13
+ var regex_scan_1 = require("./regex-scan");
14
+ Object.defineProperty(exports, "regexScan", { enumerable: true, get: function () { return regex_scan_1.regexScan; } });
15
+ var file_exists_1 = require("./file-exists");
16
+ Object.defineProperty(exports, "fileExists", { enumerable: true, get: function () { return file_exists_1.fileExists; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/constraints/checkers/templated/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAClB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * regex-scan 模板:正则扫描约束(ADR-0033,块 3 子项 2)
3
+ *
4
+ * 形态参照 no-hardcoded-credentials:scope='diff'(缺省)扫 staged diff 新增行,
5
+ * diff 为空/不可用时退化为变更文件内容扫描;scope='content' 直接扫变更文件内容。
6
+ * 命中即违规,证据行点名文件与命中行(harness#119:fail 必须可归因)。
7
+ *
8
+ * 参数:
9
+ * - pattern(必填):正则字符串
10
+ * - glob(可选):限定文件集(相对路径,支持 `**`/`*`/`?`)
11
+ * - scope(可选):'diff' | 'content',缺省 'diff'
12
+ */
13
+ import { type TemplatedCheckerFactory } from '../types';
14
+ export declare const regexScan: TemplatedCheckerFactory;
15
+ //# sourceMappingURL=regex-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex-scan.d.ts","sourceRoot":"","sources":["../../../../../src/core/constraints/checkers/templated/regex-scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAyE,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AA2C/H,eAAO,MAAM,SAAS,EAAE,uBAyEvB,CAAC"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ /**
3
+ * regex-scan 模板:正则扫描约束(ADR-0033,块 3 子项 2)
4
+ *
5
+ * 形态参照 no-hardcoded-credentials:scope='diff'(缺省)扫 staged diff 新增行,
6
+ * diff 为空/不可用时退化为变更文件内容扫描;scope='content' 直接扫变更文件内容。
7
+ * 命中即违规,证据行点名文件与命中行(harness#119:fail 必须可归因)。
8
+ *
9
+ * 参数:
10
+ * - pattern(必填):正则字符串
11
+ * - glob(可选):限定文件集(相对路径,支持 `**`/`*`/`?`)
12
+ * - scope(可选):'diff' | 'content',缺省 'diff'
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.regexScan = void 0;
16
+ const fs_1 = require("fs");
17
+ const path_1 = require("path");
18
+ const types_1 = require("../types");
19
+ const glob_1 = require("./glob");
20
+ /** 证据行单行长度上限(命中行可能是整行配置/长文本) */
21
+ const MAX_LINE = 120;
22
+ /** 从 unified diff 中取新增行(按 +++ b/<path> 归属文件,glob 过滤文件集) */
23
+ function collectAddedLines(diff, inScope) {
24
+ const out = [];
25
+ let file = '';
26
+ for (const raw of diff.split('\n')) {
27
+ if (raw.startsWith('+++ b/')) {
28
+ file = raw.slice('+++ b/'.length);
29
+ continue;
30
+ }
31
+ if (raw.startsWith('+++') || raw.startsWith('diff --git')) {
32
+ if (raw.startsWith('diff --git'))
33
+ file = '';
34
+ continue;
35
+ }
36
+ if (raw.startsWith('+') && file && inScope(file)) {
37
+ out.push({ file, line: raw.slice(1) });
38
+ }
39
+ }
40
+ return out;
41
+ }
42
+ function hitEvidence(pattern, hits) {
43
+ return {
44
+ pass: false,
45
+ evidence: (0, types_1.formatEvidence)(`命中禁用模式 /${pattern.source}/`, hits),
46
+ };
47
+ }
48
+ function clip(line) {
49
+ const t = line.trim();
50
+ return t.length > MAX_LINE ? `${t.slice(0, MAX_LINE)}…` : t;
51
+ }
52
+ exports.regexScan = {
53
+ validateParams(params) {
54
+ const errors = [];
55
+ const pattern = params.pattern;
56
+ if (typeof pattern !== 'string' || pattern.length === 0) {
57
+ errors.push('pattern 必填(正则字符串)');
58
+ }
59
+ else {
60
+ try {
61
+ new RegExp(pattern);
62
+ }
63
+ catch (err) {
64
+ errors.push(`pattern 不是合法正则:${err instanceof Error ? err.message : String(err)}`);
65
+ }
66
+ }
67
+ if (params.glob !== undefined && typeof params.glob !== 'string') {
68
+ errors.push('glob 必须是字符串');
69
+ }
70
+ if (params.scope !== undefined && params.scope !== 'diff' && params.scope !== 'content') {
71
+ errors.push("scope 必须是 'diff' 或 'content'");
72
+ }
73
+ return errors;
74
+ },
75
+ create(id, params) {
76
+ const pattern = new RegExp(params.pattern);
77
+ const glob = params.glob;
78
+ const scope = params.scope ?? 'diff';
79
+ const inScope = (file) => !glob || (0, glob_1.matchGlob)(file, glob);
80
+ const scanChangedFiles = (env) => {
81
+ const hits = [];
82
+ for (const file of (env.context.changedFiles ?? []).filter(inScope)) {
83
+ let content;
84
+ try {
85
+ content = (0, fs_1.readFileSync)((0, path_1.join)(env.projectPath, file), 'utf-8');
86
+ }
87
+ catch {
88
+ continue; // 文件不可读(已删除/二进制)→ 跳过
89
+ }
90
+ for (const line of content.split('\n')) {
91
+ if (pattern.test(line))
92
+ hits.push(`${file}: ${clip(line)}`);
93
+ }
94
+ }
95
+ return hits;
96
+ };
97
+ return {
98
+ id,
99
+ async evaluate(env) {
100
+ if (scope === 'content') {
101
+ const hits = scanChangedFiles(env);
102
+ return hits.length > 0 ? hitEvidence(pattern, hits) : true;
103
+ }
104
+ // scope='diff':staged diff 新增行;diff 为空/不可用 → 退化变更文件内容扫描
105
+ let scanned = false;
106
+ try {
107
+ const diff = await env.stagedDiff();
108
+ const added = collectAddedLines(diff, inScope);
109
+ if (added.length > 0) {
110
+ scanned = true;
111
+ const hits = added.filter(a => pattern.test(a.line)).map(a => `${a.file}: ${clip(a.line)}`);
112
+ if (hits.length > 0)
113
+ return hitEvidence(pattern, hits);
114
+ }
115
+ }
116
+ catch {
117
+ // diff 不可用 → 退化为文件内容扫描
118
+ }
119
+ if (!scanned) {
120
+ const hits = scanChangedFiles(env);
121
+ if (hits.length > 0)
122
+ return hitEvidence(pattern, hits);
123
+ }
124
+ return true;
125
+ },
126
+ };
127
+ },
128
+ };
129
+ //# sourceMappingURL=regex-scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regex-scan.js","sourceRoot":"","sources":["../../../../../src/core/constraints/checkers/templated/regex-scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 填空式 checker 模板注册表(ADR-0033 两层约束模型)
3
+ *
4
+ * 独立成模块而非住在 checkers/index.ts:应用层加载器(core/app-constraints-loader)
5
+ * 要做加载期模板校验,若直接引 checkers/index.ts 会经 project-config-loader →
6
+ * 本注册表 → 内置 checker → project-config-loader 形成值级循环(checker 初始化时
7
+ * 拿到 undefined)。本模块不引内置 checker,无环。
8
+ *
9
+ * 闭环语义:模板 id 未注册即不可用——加载期由 app-constraints-loader 校验,
10
+ * 运行期由 checkers/index.ts 的 getConstraintCheck 抛错兜底。
11
+ *
12
+ * 首批模板:regex-scan(正则扫描)/ file-exists(文件存在性),块 3 子项 2。
13
+ */
14
+ import type { TemplatedCheckerFactory } from './types';
15
+ /** 模板注册表(模板 id → 工厂);测试可注册替身模板,用后须注销 */
16
+ export declare const TEMPLATES: Map<string, TemplatedCheckerFactory>;
17
+ //# sourceMappingURL=templates-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates-registry.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/templates-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAGvD,wCAAwC;AACxC,eAAO,MAAM,SAAS,sCAGpB,CAAC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /**
3
+ * 填空式 checker 模板注册表(ADR-0033 两层约束模型)
4
+ *
5
+ * 独立成模块而非住在 checkers/index.ts:应用层加载器(core/app-constraints-loader)
6
+ * 要做加载期模板校验,若直接引 checkers/index.ts 会经 project-config-loader →
7
+ * 本注册表 → 内置 checker → project-config-loader 形成值级循环(checker 初始化时
8
+ * 拿到 undefined)。本模块不引内置 checker,无环。
9
+ *
10
+ * 闭环语义:模板 id 未注册即不可用——加载期由 app-constraints-loader 校验,
11
+ * 运行期由 checkers/index.ts 的 getConstraintCheck 抛错兜底。
12
+ *
13
+ * 首批模板:regex-scan(正则扫描)/ file-exists(文件存在性),块 3 子项 2。
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.TEMPLATES = void 0;
17
+ const templated_1 = require("./templated");
18
+ /** 模板注册表(模板 id → 工厂);测试可注册替身模板,用后须注销 */
19
+ exports.TEMPLATES = new Map([
20
+ ['regex-scan', templated_1.regexScan],
21
+ ['file-exists', templated_1.fileExists],
22
+ ]);
23
+ //# sourceMappingURL=templates-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates-registry.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/templates-registry.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;AAGH,2CAAoD;AAEpD,wCAAwC;AAC3B,QAAA,SAAS,GAAG,IAAI,GAAG,CAAkC;IAChE,CAAC,YAAY,EAAE,qBAAS,CAAC;IACzB,CAAC,aAAa,EAAE,sBAAU,CAAC;CAC5B,CAAC,CAAC"}
@@ -107,6 +107,20 @@ export interface ConstraintCheck {
107
107
  /** 检查主体:true = 满足;false = 违反;'skip' = 未评估;CheckDetail = 判定 + 证据行 */
108
108
  evaluate(env: CheckEnv): Promise<CheckOutcome> | CheckOutcome;
109
109
  }
110
+ /**
111
+ * 填空式 checker 模板工厂(ADR-0033 两层约束模型)
112
+ *
113
+ * 每个模板 = validateParams + create:参数坏在加载期早报(validateParams),
114
+ * create 只在参数已校验后调用。注册点 = checkers/index.ts 的 TEMPLATES。
115
+ * 类型住在 types.ts(而非 index.ts)是为了模板实现文件只依赖本模块,
116
+ * 不与注册表形成值级循环导入。
117
+ */
118
+ export interface TemplatedCheckerFactory {
119
+ /** 参数校验:返回错误清单,空数组 = 通过(加载期跑,参数坏早报) */
120
+ validateParams(params: Record<string, unknown>): string[];
121
+ /** 按约束 id + 已校验参数实例化 checker */
122
+ create(id: string, params: Record<string, unknown>): ConstraintCheck;
123
+ }
110
124
  /**
111
125
  * 构造纯上下文标志检查(无 I/O 的轻量约束)
112
126
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAS,SAAQ,MAAM;IACtC,2CAA2C;IAC3C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,qCAAqC;IACrC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,qCAAqC;IACrC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,gCAAgC;IAChC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,qBAAqB;IACrB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,qBAAqB;IACrB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,kBAAkB;IAClB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACjC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,iBAAiB,GAAG,MAAM,EACpC,MAAM,CAAC,EAAE,MAAM,GACd,QAAQ,CAaV;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAE1D;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wCAAwC;AACxC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAIzE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,iBAAiB,CAQ9E;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,oEAAoE;IACpE,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;CAC/D;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,GACjD,eAAe,CAEjB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,GAAG,SAAS,GACxD,eAAe,CASjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,WAAW,QAAS,SAAQ,MAAM;IACtC,2CAA2C;IAC3C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,qCAAqC;IACrC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,qCAAqC;IACrC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,gCAAgC;IAChC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,qBAAqB;IACrB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,qBAAqB;IACrB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,kBAAkB;IAClB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACjC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,iBAAiB,GAAG,MAAM,EACpC,MAAM,CAAC,EAAE,MAAM,GACd,QAAQ,CAaV;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,CAAC;AAE1D;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,IAAI,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wCAAwC;AACxC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAIzE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,iBAAiB,CAQ9E;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,oEAAoE;IACpE,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,CAAC;CAC/D;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACtC,uCAAuC;IACvC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAAC;IAC1D,gCAAgC;IAChC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,CAAC;CACtE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,GACjD,eAAe,CAEjB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,GAAG,SAAS,GACxD,eAAe,CASjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAoDH,sCAiBC;AA6CD,wCAIC;AAOD,sDAQC;AAeD,kCAKC;AASD,kDAYC;AA3KD,wCAAuD;AAqCvD;;;;;;;;;;;GAWG;AACH,SAAgB,aAAa,CAC3B,OAA0B,EAC1B,QAAoC,EACpC,MAAe;IAEf,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,IAAI,IAAA,sBAAY,EAAC,WAAW,CAAC,CAAC;IAChD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO;YACL,GAAG,GAAG;YACN,OAAO;YACP,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;YAC1B,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;YAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;SAClB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAmCD,wCAAwC;AAC3B,QAAA,kBAAkB,GAAG,EAAE,CAAC;AAErC;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,OAAe,EAAE,KAAe;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,0BAAkB,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,OAAqB;IACzD,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAChF,IAAI,OAAO,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC9F,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,IAAI;QACvB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;KACjC,CAAC;AACJ,CAAC;AAYD;;GAEG;AACH,SAAgB,WAAW,CACzB,EAAU,EACV,SAAkD;IAElD,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,mBAAmB,CACjC,EAAU,EACV,IAAyD;IAEzD,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAoDH,sCAiBC;AA6CD,wCAIC;AAOD,sDAQC;AA8BD,kCAKC;AASD,kDAYC;AA1LD,wCAAuD;AAqCvD;;;;;;;;;;;GAWG;AACH,SAAgB,aAAa,CAC3B,OAA0B,EAC1B,QAAoC,EACpC,MAAe;IAEf,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzD,MAAM,GAAG,GAAG,MAAM,IAAI,IAAA,sBAAY,EAAC,WAAW,CAAC,CAAC;IAChD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO;YACL,GAAG,GAAG;YACN,OAAO;YACP,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;YAC1B,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;YAC/B,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE;SAClB,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAmCD,wCAAwC;AAC3B,QAAA,kBAAkB,GAAG,EAAE,CAAC;AAErC;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,OAAe,EAAE,KAAe;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,0BAAkB,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,OAAqB;IACzD,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAChF,IAAI,OAAO,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC9F,OAAO;QACL,SAAS,EAAE,OAAO,CAAC,IAAI;QACvB,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,EAAE;KACjC,CAAC;AACJ,CAAC;AA2BD;;GAEG;AACH,SAAgB,WAAW,CACzB,EAAU,EACV,SAAkD;IAElD,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,mBAAmB,CACjC,EAAU,EACV,IAAyD;IAEzD,OAAO;QACL,EAAE;QACF,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"guidelines.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/definitions/guidelines.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA6F1D,CAAC"}
1
+ {"version":3,"file":"guidelines.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/definitions/guidelines.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CA8E1D,CAAC"}
@@ -10,20 +10,6 @@
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
11
  exports.WARNING_CONSTRAINTS = void 0;
12
12
  exports.WARNING_CONSTRAINTS = {
13
- /**
14
- * 禁止硬编码凭证
15
- * 原因:密码/token/密钥泄露是最严重的安全漏洞,一旦提交到版本控制即不可逆
16
- */
17
- no_hardcoded_credentials: {
18
- id: 'no_hardcoded_credentials',
19
- kind: 'check',
20
- rule: 'NO HARDCODED PASSWORDS, TOKENS, SECRETS, OR CREDENTIALS IN ANY SOURCE FILE',
21
- message: '禁止在代码/文档/配置文件中硬编码密码、token、密钥、API key',
22
- severity: 'warning',
23
- trigger: ['code_implementation', 'doc_update', 'config_change', 'commit'],
24
- enforcement: 'credential-scan',
25
- description: `凭证(密码/token/密钥/API key)必须从环境变量或加密配置读取,严禁以明文形式出现在任何源代码文件中。包括但不限于:源码、Markdown 文档、YAML/JSON 配置、脚本文件。模板文件(.example/.sample/.template)允许占位符但不得包含真实值。建议配合 pre-commit hook 做自动扫描。`,
26
- },
27
13
  /**
28
14
  * 功能清单同步
29
15
  * 例外:内部重构、bug fix