@dommaker/harness 0.16.9 → 0.17.1

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 (337) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +33 -32
  3. package/bin/harness.js +33 -20
  4. package/dist/cli/commands/check.d.ts +3 -2
  5. package/dist/cli/commands/check.d.ts.map +1 -1
  6. package/dist/cli/commands/check.js +69 -36
  7. package/dist/cli/commands/check.js.map +1 -1
  8. package/dist/cli/commands/constraints-report.d.ts +42 -0
  9. package/dist/cli/commands/constraints-report.d.ts.map +1 -0
  10. package/dist/cli/commands/constraints-report.js +233 -0
  11. package/dist/cli/commands/constraints-report.js.map +1 -0
  12. package/dist/cli/commands/constraints-retire.d.ts +71 -0
  13. package/dist/cli/commands/constraints-retire.d.ts.map +1 -0
  14. package/dist/cli/commands/constraints-retire.js +384 -0
  15. package/dist/cli/commands/constraints-retire.js.map +1 -0
  16. package/dist/cli/commands/constraints.d.ts +1 -1
  17. package/dist/cli/commands/constraints.d.ts.map +1 -1
  18. package/dist/cli/commands/constraints.js +4 -4
  19. package/dist/cli/commands/constraints.js.map +1 -1
  20. package/dist/cli/commands/index.d.ts +2 -1
  21. package/dist/cli/commands/index.d.ts.map +1 -1
  22. package/dist/cli/commands/index.js +10 -4
  23. package/dist/cli/commands/index.js.map +1 -1
  24. package/dist/cli/commands/init.d.ts +20 -0
  25. package/dist/cli/commands/init.d.ts.map +1 -1
  26. package/dist/cli/commands/init.js +81 -59
  27. package/dist/cli/commands/init.js.map +1 -1
  28. package/dist/cli/commands/report.js +4 -4
  29. package/dist/cli/commands/report.js.map +1 -1
  30. package/dist/cli/commands/status.d.ts.map +1 -1
  31. package/dist/cli/commands/status.js +3 -4
  32. package/dist/cli/commands/status.js.map +1 -1
  33. package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts +5 -1
  34. package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts.map +1 -1
  35. package/dist/cli/commands/sync-docs/capabilities-syncer.js +2 -10
  36. package/dist/cli/commands/sync-docs/capabilities-syncer.js.map +1 -1
  37. package/dist/cli/commands/validate.d.ts.map +1 -1
  38. package/dist/cli/commands/validate.js +1 -5
  39. package/dist/cli/commands/validate.js.map +1 -1
  40. package/dist/core/constraints/capabilities-parser.d.ts +7 -0
  41. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  42. package/dist/core/constraints/capabilities-parser.js +13 -0
  43. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  44. package/dist/core/constraints/checker.d.ts +13 -5
  45. package/dist/core/constraints/checker.d.ts.map +1 -1
  46. package/dist/core/constraints/checker.js +62 -25
  47. package/dist/core/constraints/checker.js.map +1 -1
  48. package/dist/core/constraints/checkers/capability-sync.d.ts +9 -2
  49. package/dist/core/constraints/checkers/capability-sync.d.ts.map +1 -1
  50. package/dist/core/constraints/checkers/capability-sync.js +55 -22
  51. package/dist/core/constraints/checkers/capability-sync.js.map +1 -1
  52. package/dist/core/constraints/checkers/context-doc-sync.d.ts +3 -0
  53. package/dist/core/constraints/checkers/context-doc-sync.d.ts.map +1 -1
  54. package/dist/core/constraints/checkers/context-doc-sync.js +8 -2
  55. package/dist/core/constraints/checkers/context-doc-sync.js.map +1 -1
  56. package/dist/core/constraints/checkers/docs-freshness.d.ts +1 -0
  57. package/dist/core/constraints/checkers/docs-freshness.d.ts.map +1 -1
  58. package/dist/core/constraints/checkers/docs-freshness.js +39 -0
  59. package/dist/core/constraints/checkers/docs-freshness.js.map +1 -1
  60. package/dist/core/constraints/checkers/index.d.ts +8 -4
  61. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  62. package/dist/core/constraints/checkers/index.js +29 -46
  63. package/dist/core/constraints/checkers/index.js.map +1 -1
  64. package/dist/core/constraints/checkers/iron-flags.d.ts +6 -7
  65. package/dist/core/constraints/checkers/iron-flags.d.ts.map +1 -1
  66. package/dist/core/constraints/checkers/iron-flags.js +10 -17
  67. package/dist/core/constraints/checkers/iron-flags.js.map +1 -1
  68. package/dist/core/constraints/checkers/no-hardcoded-credentials.d.ts +13 -0
  69. package/dist/core/constraints/checkers/no-hardcoded-credentials.d.ts.map +1 -0
  70. package/dist/core/constraints/checkers/no-hardcoded-credentials.js +91 -0
  71. package/dist/core/constraints/checkers/no-hardcoded-credentials.js.map +1 -0
  72. package/dist/core/constraints/checkers/types.d.ts +15 -4
  73. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  74. package/dist/core/constraints/checkers/types.js +16 -4
  75. package/dist/core/constraints/checkers/types.js.map +1 -1
  76. package/dist/core/constraints/context-builder.d.ts +6 -3
  77. package/dist/core/constraints/context-builder.d.ts.map +1 -1
  78. package/dist/core/constraints/context-builder.js +29 -20
  79. package/dist/core/constraints/context-builder.js.map +1 -1
  80. package/dist/core/constraints/definitions/guidelines.d.ts +6 -2
  81. package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
  82. package/dist/core/constraints/definitions/guidelines.js +29 -572
  83. package/dist/core/constraints/definitions/guidelines.js.map +1 -1
  84. package/dist/core/constraints/definitions/iron-laws.d.ts +6 -2
  85. package/dist/core/constraints/definitions/iron-laws.d.ts.map +1 -1
  86. package/dist/core/constraints/definitions/iron-laws.js +48 -231
  87. package/dist/core/constraints/definitions/iron-laws.js.map +1 -1
  88. package/dist/core/constraints/definitions/prompts.d.ts +12 -0
  89. package/dist/core/constraints/definitions/prompts.d.ts.map +1 -0
  90. package/dist/core/constraints/definitions/prompts.js +405 -0
  91. package/dist/core/constraints/definitions/prompts.js.map +1 -0
  92. package/dist/core/constraints/definitions.d.ts +15 -9
  93. package/dist/core/constraints/definitions.d.ts.map +1 -1
  94. package/dist/core/constraints/definitions.js +18 -12
  95. package/dist/core/constraints/definitions.js.map +1 -1
  96. package/dist/core/constraints/index.d.ts +3 -2
  97. package/dist/core/constraints/index.d.ts.map +1 -1
  98. package/dist/core/constraints/index.js +8 -2
  99. package/dist/core/constraints/index.js.map +1 -1
  100. package/dist/core/constraints/injection-drift.d.ts +48 -0
  101. package/dist/core/constraints/injection-drift.d.ts.map +1 -0
  102. package/dist/core/constraints/injection-drift.js +140 -0
  103. package/dist/core/constraints/injection-drift.js.map +1 -0
  104. package/dist/core/constraints/injection-renderer.d.ts +23 -0
  105. package/dist/core/constraints/injection-renderer.d.ts.map +1 -0
  106. package/dist/core/constraints/injection-renderer.js +44 -0
  107. package/dist/core/constraints/injection-renderer.js.map +1 -0
  108. package/dist/core/constraints/interceptor.d.ts.map +1 -1
  109. package/dist/core/constraints/interceptor.js +3 -2
  110. package/dist/core/constraints/interceptor.js.map +1 -1
  111. package/dist/core/constraints/usage-report.d.ts +95 -0
  112. package/dist/core/constraints/usage-report.d.ts.map +1 -0
  113. package/dist/core/constraints/usage-report.js +206 -0
  114. package/dist/core/constraints/usage-report.js.map +1 -0
  115. package/dist/core/effective-constraints.d.ts +47 -0
  116. package/dist/core/effective-constraints.d.ts.map +1 -0
  117. package/dist/core/effective-constraints.js +60 -0
  118. package/dist/core/effective-constraints.js.map +1 -0
  119. package/dist/core/index.d.ts +1 -0
  120. package/dist/core/index.d.ts.map +1 -1
  121. package/dist/core/index.js +2 -0
  122. package/dist/core/index.js.map +1 -1
  123. package/dist/core/project-config-loader.d.ts +17 -2
  124. package/dist/core/project-config-loader.d.ts.map +1 -1
  125. package/dist/core/project-config-loader.js +55 -8
  126. package/dist/core/project-config-loader.js.map +1 -1
  127. package/dist/dashboard/data.d.ts +1 -9
  128. package/dist/dashboard/data.d.ts.map +1 -1
  129. package/dist/dashboard/data.js +7 -15
  130. package/dist/dashboard/data.js.map +1 -1
  131. package/dist/dashboard/types.d.ts +13 -1
  132. package/dist/dashboard/types.d.ts.map +1 -1
  133. package/dist/index.d.ts +0 -4
  134. package/dist/index.d.ts.map +1 -1
  135. package/dist/index.js +1 -13
  136. package/dist/index.js.map +1 -1
  137. package/dist/monitoring/index.d.ts +0 -2
  138. package/dist/monitoring/index.d.ts.map +1 -1
  139. package/dist/monitoring/index.js +0 -2
  140. package/dist/monitoring/index.js.map +1 -1
  141. package/dist/monitoring/knowledge-evolver.d.ts +1 -1
  142. package/dist/monitoring/knowledge-evolver.js +1 -1
  143. package/dist/monitoring/trace-analyzer.d.ts +1 -1
  144. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  145. package/dist/monitoring/trace-analyzer.js +16 -10
  146. package/dist/monitoring/trace-analyzer.js.map +1 -1
  147. package/dist/monitoring/traces.d.ts +2 -1
  148. package/dist/monitoring/traces.d.ts.map +1 -1
  149. package/dist/monitoring/traces.js +5 -3
  150. package/dist/monitoring/traces.js.map +1 -1
  151. package/dist/presets/standard.d.ts +3 -1
  152. package/dist/presets/standard.d.ts.map +1 -1
  153. package/dist/presets/standard.js +18 -8
  154. package/dist/presets/standard.js.map +1 -1
  155. package/dist/types/constraint.d.ts +51 -11
  156. package/dist/types/constraint.d.ts.map +1 -1
  157. package/dist/types/constraint.js +8 -4
  158. package/dist/types/constraint.js.map +1 -1
  159. package/dist/types/index.d.ts +1 -1
  160. package/dist/types/index.d.ts.map +1 -1
  161. package/dist/types/index.js.map +1 -1
  162. package/dist/types/monitoring-types.d.ts +2 -63
  163. package/dist/types/monitoring-types.d.ts.map +1 -1
  164. package/dist/types/monitoring-types.js +2 -2
  165. package/dist/types/project-config.d.ts +26 -1
  166. package/dist/types/project-config.d.ts.map +1 -1
  167. package/dist/types/trace.d.ts +16 -7
  168. package/dist/types/trace.d.ts.map +1 -1
  169. package/dist/types/trace.js +8 -0
  170. package/dist/types/trace.js.map +1 -1
  171. package/package.json +1 -1
  172. package/src/CONTEXT.md +2 -2
  173. package/src/__tests__/checker-extra.test.ts +228 -333
  174. package/src/__tests__/checker.test.ts +87 -724
  175. package/src/__tests__/constraint-doctor.test.ts +5 -5
  176. package/src/__tests__/doctor-extra.test.ts +164 -0
  177. package/src/__tests__/effective-constraints.test.ts +147 -0
  178. package/src/__tests__/extend-exceptions.test.ts +3 -3
  179. package/src/__tests__/iron-laws.test.ts +115 -91
  180. package/src/__tests__/no-hardcoded-credentials.test.ts +90 -0
  181. package/src/__tests__/presets.test.ts +7 -7
  182. package/src/__tests__/project-config-loader-extra.test.ts +41 -4
  183. package/src/__tests__/skip-semantics.test.ts +322 -0
  184. package/src/cli/commands/CONTEXT.md +5 -3
  185. package/src/cli/commands/__tests__/check-drift.test.ts +127 -0
  186. package/src/cli/commands/__tests__/check-skip-output.test.ts +128 -0
  187. package/src/cli/commands/__tests__/check.test.ts +14 -25
  188. package/src/cli/commands/__tests__/constraints-report.test.ts +327 -0
  189. package/src/cli/commands/__tests__/constraints-retire.test.ts +283 -0
  190. package/src/cli/commands/__tests__/init-injection.test.ts +234 -0
  191. package/src/cli/commands/__tests__/status-extra.test.ts +11 -11
  192. package/src/cli/commands/__tests__/status.test.ts +1 -1
  193. package/src/cli/commands/check.ts +72 -38
  194. package/src/cli/commands/constraints-report.ts +234 -0
  195. package/src/cli/commands/constraints-retire.ts +443 -0
  196. package/src/cli/commands/constraints.ts +5 -5
  197. package/src/cli/commands/index.ts +2 -1
  198. package/src/cli/commands/init.ts +94 -66
  199. package/src/cli/commands/report.ts +6 -6
  200. package/src/cli/commands/status.ts +3 -4
  201. package/src/cli/commands/sync-docs/capabilities-syncer.ts +5 -7
  202. package/src/cli/commands/validate.ts +1 -5
  203. package/src/core/CONTEXT.md +7 -4
  204. package/src/core/constraints/__tests__/injection-drift.test.ts +164 -0
  205. package/src/core/constraints/__tests__/interceptor.test.ts +4 -0
  206. package/src/core/constraints/capabilities-parser.ts +13 -0
  207. package/src/core/constraints/checker.ts +73 -28
  208. package/src/core/constraints/checkers/capability-sync.ts +72 -29
  209. package/src/core/constraints/checkers/context-doc-sync.ts +9 -2
  210. package/src/core/constraints/checkers/docs-freshness.ts +43 -0
  211. package/src/core/constraints/checkers/index.ts +38 -71
  212. package/src/core/constraints/checkers/iron-flags.ts +13 -49
  213. package/src/core/constraints/checkers/no-hardcoded-credentials.ts +93 -0
  214. package/src/core/constraints/checkers/types.ts +27 -5
  215. package/src/core/constraints/context-builder.ts +28 -19
  216. package/src/core/constraints/definitions/guidelines.ts +29 -597
  217. package/src/core/constraints/definitions/iron-laws.ts +48 -239
  218. package/src/core/constraints/definitions/prompts.ts +419 -0
  219. package/src/core/constraints/definitions.ts +18 -11
  220. package/src/core/constraints/index.ts +10 -1
  221. package/src/core/constraints/injection-drift.ts +139 -0
  222. package/src/core/constraints/injection-renderer.ts +44 -0
  223. package/src/core/constraints/interceptor.ts +3 -2
  224. package/src/core/constraints/usage-report.ts +254 -0
  225. package/src/core/effective-constraints.ts +85 -0
  226. package/src/core/index.ts +4 -1
  227. package/src/core/project-config-loader.ts +59 -9
  228. package/src/dashboard/__tests__/data.test.ts +5 -12
  229. package/src/dashboard/data.ts +9 -19
  230. package/src/dashboard/types.ts +18 -1
  231. package/src/index.ts +0 -12
  232. package/src/knowledge/CONTEXT.md +2 -2
  233. package/src/monitoring/CONTEXT.md +3 -4
  234. package/src/monitoring/index.ts +0 -2
  235. package/src/monitoring/knowledge-evolver.ts +1 -1
  236. package/src/monitoring/trace-analyzer.ts +15 -10
  237. package/src/monitoring/traces.ts +10 -6
  238. package/src/presets/__tests__/standard.test.ts +11 -9
  239. package/src/presets/standard.ts +24 -15
  240. package/src/types/constraint.ts +59 -14
  241. package/src/types/index.ts +1 -3
  242. package/src/types/monitoring-types.ts +2 -84
  243. package/src/types/project-config.ts +30 -1
  244. package/src/types/trace.ts +18 -7
  245. package/src/verification/CONTEXT.md +1 -1
  246. package/dist/cli/commands/flow.d.ts +0 -22
  247. package/dist/cli/commands/flow.d.ts.map +0 -1
  248. package/dist/cli/commands/flow.js +0 -275
  249. package/dist/cli/commands/flow.js.map +0 -1
  250. package/dist/constraints/lifecycle-runner.d.ts +0 -52
  251. package/dist/constraints/lifecycle-runner.d.ts.map +0 -1
  252. package/dist/constraints/lifecycle-runner.js +0 -151
  253. package/dist/constraints/lifecycle-runner.js.map +0 -1
  254. package/dist/constraints/registry.d.ts +0 -27
  255. package/dist/constraints/registry.d.ts.map +0 -1
  256. package/dist/constraints/registry.js +0 -128
  257. package/dist/constraints/registry.js.map +0 -1
  258. package/dist/constraints/types.d.ts +0 -53
  259. package/dist/constraints/types.d.ts.map +0 -1
  260. package/dist/constraints/types.js +0 -8
  261. package/dist/constraints/types.js.map +0 -1
  262. package/dist/core/constraints/checkers/always-pass.d.ts +0 -17
  263. package/dist/core/constraints/checkers/always-pass.d.ts.map +0 -1
  264. package/dist/core/constraints/checkers/always-pass.js +0 -23
  265. package/dist/core/constraints/checkers/always-pass.js.map +0 -1
  266. package/dist/core/constraints/checkers/guideline-flags.d.ts +0 -9
  267. package/dist/core/constraints/checkers/guideline-flags.d.ts.map +0 -1
  268. package/dist/core/constraints/checkers/guideline-flags.js +0 -13
  269. package/dist/core/constraints/checkers/guideline-flags.js.map +0 -1
  270. package/dist/core/constraints/checkers/no-any-type.d.ts +0 -6
  271. package/dist/core/constraints/checkers/no-any-type.d.ts.map +0 -1
  272. package/dist/core/constraints/checkers/no-any-type.js +0 -42
  273. package/dist/core/constraints/checkers/no-any-type.js.map +0 -1
  274. package/dist/core/constraints/checkers/no-excuse-patterns.d.ts +0 -6
  275. package/dist/core/constraints/checkers/no-excuse-patterns.d.ts.map +0 -1
  276. package/dist/core/constraints/checkers/no-excuse-patterns.js +0 -25
  277. package/dist/core/constraints/checkers/no-excuse-patterns.js.map +0 -1
  278. package/dist/core/constraints/checkers/no-fuzzy-completion-claim.d.ts +0 -6
  279. package/dist/core/constraints/checkers/no-fuzzy-completion-claim.d.ts.map +0 -1
  280. package/dist/core/constraints/checkers/no-fuzzy-completion-claim.js +0 -34
  281. package/dist/core/constraints/checkers/no-fuzzy-completion-claim.js.map +0 -1
  282. package/dist/core/constraints/checkers/no-performative-agreement.d.ts +0 -8
  283. package/dist/core/constraints/checkers/no-performative-agreement.d.ts.map +0 -1
  284. package/dist/core/constraints/checkers/no-performative-agreement.js +0 -23
  285. package/dist/core/constraints/checkers/no-performative-agreement.js.map +0 -1
  286. package/dist/core/constraints/checkers/no-simplification-without-approval.d.ts +0 -6
  287. package/dist/core/constraints/checkers/no-simplification-without-approval.d.ts.map +0 -1
  288. package/dist/core/constraints/checkers/no-simplification-without-approval.js +0 -30
  289. package/dist/core/constraints/checkers/no-simplification-without-approval.js.map +0 -1
  290. package/dist/core/constraints/checkers/test-coverage.d.ts +0 -6
  291. package/dist/core/constraints/checkers/test-coverage.d.ts.map +0 -1
  292. package/dist/core/constraints/checkers/test-coverage.js +0 -33
  293. package/dist/core/constraints/checkers/test-coverage.js.map +0 -1
  294. package/dist/core/constraints/checkers/yagni.d.ts +0 -8
  295. package/dist/core/constraints/checkers/yagni.d.ts.map +0 -1
  296. package/dist/core/constraints/checkers/yagni.js +0 -96
  297. package/dist/core/constraints/checkers/yagni.js.map +0 -1
  298. package/dist/core/constraints/definitions/tips.d.ts +0 -7
  299. package/dist/core/constraints/definitions/tips.d.ts.map +0 -1
  300. package/dist/core/constraints/definitions/tips.js +0 -62
  301. package/dist/core/constraints/definitions/tips.js.map +0 -1
  302. package/dist/evolution/auto-evolve.d.ts +0 -35
  303. package/dist/evolution/auto-evolve.d.ts.map +0 -1
  304. package/dist/evolution/auto-evolve.js +0 -64
  305. package/dist/evolution/auto-evolve.js.map +0 -1
  306. package/dist/evolution/index.d.ts +0 -2
  307. package/dist/evolution/index.d.ts.map +0 -1
  308. package/dist/evolution/index.js +0 -18
  309. package/dist/evolution/index.js.map +0 -1
  310. package/dist/monitoring/constraint-evolver.d.ts +0 -120
  311. package/dist/monitoring/constraint-evolver.d.ts.map +0 -1
  312. package/dist/monitoring/constraint-evolver.js +0 -410
  313. package/dist/monitoring/constraint-evolver.js.map +0 -1
  314. package/src/__tests__/constraint-evolver.test.ts +0 -405
  315. package/src/__tests__/doctor-evolver.test.ts +0 -381
  316. package/src/cli/commands/__tests__/flow.test.ts +0 -343
  317. package/src/cli/commands/flow.ts +0 -277
  318. package/src/constraints/__tests__/lifecycle-runner.test.ts +0 -246
  319. package/src/constraints/__tests__/registry.test.ts +0 -196
  320. package/src/constraints/lifecycle-runner.ts +0 -184
  321. package/src/constraints/registry.ts +0 -134
  322. package/src/constraints/types.ts +0 -59
  323. package/src/core/constraints/checkers/always-pass.ts +0 -22
  324. package/src/core/constraints/checkers/guideline-flags.ts +0 -30
  325. package/src/core/constraints/checkers/no-any-type.ts +0 -42
  326. package/src/core/constraints/checkers/no-excuse-patterns.ts +0 -24
  327. package/src/core/constraints/checkers/no-fuzzy-completion-claim.ts +0 -33
  328. package/src/core/constraints/checkers/no-performative-agreement.ts +0 -22
  329. package/src/core/constraints/checkers/no-simplification-without-approval.ts +0 -29
  330. package/src/core/constraints/checkers/test-coverage.ts +0 -35
  331. package/src/core/constraints/checkers/yagni.ts +0 -65
  332. package/src/core/constraints/definitions/tips.ts +0 -63
  333. package/src/evolution/CONTEXT.md +0 -22
  334. package/src/evolution/__tests__/auto-evolve.test.ts +0 -319
  335. package/src/evolution/auto-evolve.ts +0 -98
  336. package/src/evolution/index.ts +0 -1
  337. package/src/monitoring/constraint-evolver.ts +0 -501
@@ -2,6 +2,7 @@
2
2
  /**
3
3
  * docs_freshness:CAPABILITIES.md 文件表 + 能力清单格式 + CLAUDE.md + CHANGELOG(工单 21)
4
4
  *
5
+ * 0. 存在性探测(ADR-0001):项目无任何 freshness 配置/目标时 skip,不计 pass/fail
5
6
  * 1. 文件表格式:CAPABILITIES.md 中列出的文件必须仍存在(防过期引用)
6
7
  * 2. 能力清单格式:FreshnessRunner 配置驱动检查
7
8
  * 3. 无配置时注入内置默认配置(等价旧硬编码行为)
@@ -68,10 +69,48 @@ function checkCapabilitiesFreshness(projectPath) {
68
69
  return true;
69
70
  }
70
71
  }
72
+ /**
73
+ * ADR-0001 存在性探测:项目是否存在任何 freshness 配置/检查目标。
74
+ *
75
+ * 判定信号(任一命中即视为采用了文档新鲜度约定):
76
+ * - 配置了 governance.doc_freshness.checks
77
+ * - 配置了 governance.context_files(enabled + 非空 required_dirs)
78
+ * - 项目根存在 CAPABILITIES.md
79
+ * - 项目根存在 CHANGELOG.md / CHANGELOG
80
+ *
81
+ * 全部缺失 → 项目未采用该约定,调用方应 skip 而非评估内置默认配置。
82
+ */
83
+ function hasFreshnessTargets(projectPath) {
84
+ if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, 'CAPABILITIES.md')))
85
+ return true;
86
+ if ((0, fs_1.existsSync)((0, path_1.join)(projectPath, 'CHANGELOG.md')) || (0, fs_1.existsSync)((0, path_1.join)(projectPath, 'CHANGELOG'))) {
87
+ return true;
88
+ }
89
+ try {
90
+ const raw = (0, project_config_loader_1.loadRawProjectConfig)(projectPath);
91
+ const governance = raw?.governance;
92
+ const freshnessConfig = governance?.doc_freshness;
93
+ if (freshnessConfig?.checks && freshnessConfig.checks.length > 0)
94
+ return true;
95
+ const contextFiles = governance?.context_files;
96
+ if (contextFiles?.enabled &&
97
+ Array.isArray(contextFiles.required_dirs) &&
98
+ contextFiles.required_dirs.length > 0) {
99
+ return true;
100
+ }
101
+ }
102
+ catch {
103
+ // 配置不可读视为无配置
104
+ }
105
+ return false;
106
+ }
71
107
  exports.docsFreshness = {
72
108
  id: 'docs_freshness',
73
109
  async evaluate(env) {
74
110
  const projectPath = env.projectPath;
111
+ // ADR-0001 存在性探测:项目无任何 freshness 配置/目标 → skip(不计 pass/fail)
112
+ if (!hasFreshnessTargets(projectPath))
113
+ return 'skip';
75
114
  // Step 1: 文件表格式 — 检查列出的文件是否还存在
76
115
  if (!checkCapabilitiesFreshness(projectPath))
77
116
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"docs-freshness.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/docs-freshness.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docs-freshness.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/docs-freshness.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,21 @@
1
1
  /**
2
2
  * 约束检查器注册表(工单 21)
3
3
  *
4
- * checker.ts 编排层通过 getConstraintCheck(id) 查找实现,
5
- * 未注册的约束默认通过(保持历史 default 分支语义)。
4
+ * checker.ts 编排层通过 getConstraintCheck(id) 查找实现。
5
+ *
6
+ * 注册表闭环(ADR-0001):模块加载时校验全部 kind='check' 的内置约束
7
+ * 都有已注册 checker,且注册表中没有无对应 check 定义的孤儿实现;
8
+ * 任一不满足即抛错(加载期失败,不许静默 pass)。
6
9
  */
7
10
  import type { ConstraintCheck } from './types';
8
11
  /**
9
- * 按约束 ID 查找检查实现;未注册返回 undefined(编排层默认通过)
12
+ * 按约束 ID 查找检查实现;未注册返回 undefined
13
+ * (编排层对 kind='check' 未注册的情况抛错,kind='prompt' 不查表)
10
14
  */
11
15
  export declare function getConstraintCheck(id: string): ConstraintCheck | undefined;
12
16
  /**
13
17
  * 已注册的检查实现数量(诊断/测试用)
14
18
  */
15
19
  export declare function registeredCheckCount(): number;
16
- export type { ConstraintCheck, CheckEnv } from './types';
20
+ export type { ConstraintCheck, CheckEnv, CheckOutcome } from './types';
17
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AA4F/C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAuD/C;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
@@ -2,73 +2,56 @@
2
2
  /**
3
3
  * 约束检查器注册表(工单 21)
4
4
  *
5
- * checker.ts 编排层通过 getConstraintCheck(id) 查找实现,
6
- * 未注册的约束默认通过(保持历史 default 分支语义)。
5
+ * checker.ts 编排层通过 getConstraintCheck(id) 查找实现。
6
+ *
7
+ * 注册表闭环(ADR-0001):模块加载时校验全部 kind='check' 的内置约束
8
+ * 都有已注册 checker,且注册表中没有无对应 check 定义的孤儿实现;
9
+ * 任一不满足即抛错(加载期失败,不许静默 pass)。
7
10
  */
8
11
  Object.defineProperty(exports, "__esModule", { value: true });
9
12
  exports.getConstraintCheck = getConstraintCheck;
10
13
  exports.registeredCheckCount = registeredCheckCount;
14
+ const definitions_1 = require("../definitions");
11
15
  const iron_flags_1 = require("./iron-flags");
12
- const guideline_flags_1 = require("./guideline-flags");
13
- const always_pass_1 = require("./always-pass");
14
16
  const no_bypass_checkpoint_1 = require("./no-bypass-checkpoint");
15
17
  const no_test_simplification_1 = require("./no-test-simplification");
16
- const no_fuzzy_completion_claim_1 = require("./no-fuzzy-completion-claim");
17
- const no_performative_agreement_1 = require("./no-performative-agreement");
18
- const no_excuse_patterns_1 = require("./no-excuse-patterns");
19
- const no_any_type_1 = require("./no-any-type");
20
18
  const capability_sync_1 = require("./capability-sync");
21
- const no_simplification_without_approval_1 = require("./no-simplification-without-approval");
22
- const test_coverage_1 = require("./test-coverage");
23
19
  const context_doc_sync_1 = require("./context-doc-sync");
24
20
  const docs_freshness_1 = require("./docs-freshness");
25
- const yagni_1 = require("./yagni");
21
+ const no_hardcoded_credentials_1 = require("./no-hardcoded-credentials");
26
22
  const CHECKS = [
27
23
  // Iron Laws
28
- no_bypass_checkpoint_1.noBypassCheckpoint,
29
- iron_flags_1.noSelfApproval,
30
24
  iron_flags_1.noCompletionWithoutVerification,
31
- no_test_simplification_1.noTestSimplification,
32
25
  iron_flags_1.incrementalProgress,
33
- iron_flags_1.verifyExternalCapability,
34
- iron_flags_1.noImplementationWithoutRequirementReview,
35
26
  iron_flags_1.noImplementationWithoutRequirement,
36
- iron_flags_1.preferWorktree,
37
- no_fuzzy_completion_claim_1.noFuzzyCompletionClaim,
38
- iron_flags_1.noClaimWithoutEvidence,
39
- iron_flags_1.noDeleteWithoutContext,
40
- no_performative_agreement_1.noPerformativeAgreement,
41
- iron_flags_1.twoStageReviewRequired,
27
+ no_test_simplification_1.noTestSimplification,
28
+ docs_freshness_1.docsFreshness,
42
29
  // Guidelines
43
- guideline_flags_1.noFixWithoutRootCause,
44
- guideline_flags_1.noCodeWithoutTest,
45
- no_any_type_1.noAnyType,
46
- guideline_flags_1.simplestSolutionFirst,
47
- guideline_flags_1.noCreationWithoutReuseCheck,
30
+ no_hardcoded_credentials_1.noHardcodedCredentials,
31
+ no_bypass_checkpoint_1.noBypassCheckpoint,
48
32
  capability_sync_1.capabilitySync,
49
- no_simplification_without_approval_1.noSimplificationWithoutApproval,
50
- guideline_flags_1.noSkillWithoutTest,
51
- test_coverage_1.testCoverageRequired,
52
33
  context_doc_sync_1.contextDocSync,
53
- docs_freshness_1.docsFreshness,
54
- no_excuse_patterns_1.noExcusePatterns,
55
- yagni_1.yagniCheck,
56
- // 行为类(promptInjection 驱动)恒通过
57
- always_pass_1.surgicalChangesOnly,
58
- always_pass_1.noModelForDeterministic,
59
- always_pass_1.noConflictBlending,
60
- always_pass_1.readBeforeWrite,
61
- always_pass_1.followConventions,
62
- always_pass_1.firstPrinciplesFirst,
63
- always_pass_1.fixTheProblemNotTheGate,
64
- always_pass_1.diagnosisToFixGate,
65
- // Tips
66
- always_pass_1.readmeRequired,
67
- always_pass_1.docRequiredForPublicApi,
68
34
  ];
69
35
  const registry = new Map(CHECKS.map(c => [c.id, c]));
36
+ // ========================================
37
+ // 注册表闭环校验(加载期)
38
+ // ========================================
39
+ const checkConstraints = (0, definitions_1.getAllConstraints)().filter(c => c.kind === 'check');
40
+ for (const c of checkConstraints) {
41
+ if (!registry.has(c.id)) {
42
+ throw new Error(`[harness] 约束注册表闭环校验失败:kind='check' 的约束 "${c.id}" 未注册 checker。` +
43
+ `请在 checkers/ 中实现并注册,或将该约束降级为 kind='prompt'。`);
44
+ }
45
+ }
46
+ for (const id of registry.keys()) {
47
+ if (!checkConstraints.some(c => c.id === id)) {
48
+ throw new Error(`[harness] 约束注册表闭环校验失败:checker "${id}" 没有对应的 kind='check' 约束定义。` +
49
+ `请在 definitions/ 中补齐定义,或从注册表移除。`);
50
+ }
51
+ }
70
52
  /**
71
- * 按约束 ID 查找检查实现;未注册返回 undefined(编排层默认通过)
53
+ * 按约束 ID 查找检查实现;未注册返回 undefined
54
+ * (编排层对 kind='check' 未注册的情况抛错,kind='prompt' 不查表)
72
55
  */
73
56
  function getConstraintCheck(id) {
74
57
  return registry.get(id);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAiGH,gDAEC;AAKD,oDAEC;AAtGD,6CAWsB;AACtB,uDAM2B;AAC3B,+CAWuB;AACvB,iEAA4D;AAC5D,qEAAgE;AAChE,2EAAqE;AACrE,2EAAsE;AACtE,6DAAwD;AACxD,+CAA0C;AAC1C,uDAAmD;AACnD,6FAAuF;AACvF,mDAAuD;AACvD,yDAAoD;AACpD,qDAAiD;AACjD,mCAAqC;AAErC,MAAM,MAAM,GAAsB;IAChC,YAAY;IACZ,yCAAkB;IAClB,2BAAc;IACd,4CAA+B;IAC/B,6CAAoB;IACpB,gCAAmB;IACnB,qCAAwB;IACxB,qDAAwC;IACxC,+CAAkC;IAClC,2BAAc;IACd,kDAAsB;IACtB,mCAAsB;IACtB,mCAAsB;IACtB,mDAAuB;IACvB,mCAAsB;IACtB,aAAa;IACb,uCAAqB;IACrB,mCAAiB;IACjB,uBAAS;IACT,uCAAqB;IACrB,6CAA2B;IAC3B,gCAAc;IACd,oEAA+B;IAC/B,oCAAkB;IAClB,oCAAoB;IACpB,iCAAc;IACd,8BAAa;IACb,qCAAgB;IAChB,kBAAU;IACV,6BAA6B;IAC7B,iCAAmB;IACnB,qCAAuB;IACvB,gCAAkB;IAClB,6BAAe;IACf,+BAAiB;IACjB,kCAAoB;IACpB,qCAAuB;IACvB,gCAAkB;IAClB,OAAO;IACP,4BAAc;IACd,qCAAuB;CACxB,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;;GAEG;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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AA6DH,gDAEC;AAKD,oDAEC;AAnED,gDAAmD;AAEnD,6CAIsB;AACtB,iEAA4D;AAC5D,qEAAgE;AAChE,uDAAmD;AACnD,yDAAoD;AACpD,qDAAiD;AACjD,yEAAoE;AAEpE,MAAM,MAAM,GAAsB;IAChC,YAAY;IACZ,4CAA+B;IAC/B,gCAAmB;IACnB,+CAAkC;IAClC,6CAAoB;IACpB,8BAAa;IACb,aAAa;IACb,iDAAsB;IACtB,yCAAkB;IAClB,gCAAc;IACd,iCAAc;CACf,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,6CAA6C,CAC9C,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"}
@@ -1,14 +1,13 @@
1
1
  /**
2
2
  * 铁律层轻量检查(工单 21):纯上下文证据标志判定,无 I/O
3
+ *
4
+ * ADR-0001 后仅存活的三个 flag:hasVerificationEvidence / hasSingleTask / hasRequirement
5
+ *
6
+ * 三态语义(ADR-0001 防爆措施):
7
+ * - undefined = flag 未接线 → skip(不评估,CLI pre-commit 等路径不误报违规)
8
+ * - 显式 false → fail;true → pass
3
9
  */
4
- export declare const noSelfApproval: import("./types").ConstraintCheck;
5
10
  export declare const noCompletionWithoutVerification: import("./types").ConstraintCheck;
6
11
  export declare const incrementalProgress: import("./types").ConstraintCheck;
7
- export declare const verifyExternalCapability: import("./types").ConstraintCheck;
8
- export declare const noImplementationWithoutRequirementReview: import("./types").ConstraintCheck;
9
12
  export declare const noImplementationWithoutRequirement: import("./types").ConstraintCheck;
10
- export declare const preferWorktree: import("./types").ConstraintCheck;
11
- export declare const noClaimWithoutEvidence: import("./types").ConstraintCheck;
12
- export declare const noDeleteWithoutContext: import("./types").ConstraintCheck;
13
- export declare const twoStageReviewRequired: import("./types").ConstraintCheck;
14
13
  //# sourceMappingURL=iron-flags.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"iron-flags.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/iron-flags.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,cAAc,mCAG1B,CAAC;AAEF,eAAO,MAAM,+BAA+B,mCAG3C,CAAC;AAEF,eAAO,MAAM,mBAAmB,mCAI/B,CAAC;AAEF,eAAO,MAAM,wBAAwB,mCAGpC,CAAC;AAEF,eAAO,MAAM,wCAAwC,mCAGpD,CAAC;AAEF,eAAO,MAAM,kCAAkC,mCAG9C,CAAC;AAEF,eAAO,MAAM,cAAc,mCAG1B,CAAC;AAEF,eAAO,MAAM,sBAAsB,mCAMlC,CAAC;AAEF,eAAO,MAAM,sBAAsB,mCAMlC,CAAC;AAEF,eAAO,MAAM,sBAAsB,mCAGlC,CAAC"}
1
+ {"version":3,"file":"iron-flags.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/iron-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,eAAO,MAAM,+BAA+B,mCAG3C,CAAC;AAEF,eAAO,MAAM,mBAAmB,mCAG/B,CAAC;AAEF,eAAO,MAAM,kCAAkC,mCAG9C,CAAC"}
@@ -1,24 +1,17 @@
1
1
  "use strict";
2
2
  /**
3
3
  * 铁律层轻量检查(工单 21):纯上下文证据标志判定,无 I/O
4
+ *
5
+ * ADR-0001 后仅存活的三个 flag:hasVerificationEvidence / hasSingleTask / hasRequirement
6
+ *
7
+ * 三态语义(ADR-0001 防爆措施):
8
+ * - undefined = flag 未接线 → skip(不评估,CLI pre-commit 等路径不误报违规)
9
+ * - 显式 false → fail;true → pass
4
10
  */
5
11
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.twoStageReviewRequired = exports.noDeleteWithoutContext = exports.noClaimWithoutEvidence = exports.preferWorktree = exports.noImplementationWithoutRequirement = exports.noImplementationWithoutRequirementReview = exports.verifyExternalCapability = exports.incrementalProgress = exports.noCompletionWithoutVerification = exports.noSelfApproval = void 0;
12
+ exports.noImplementationWithoutRequirement = exports.incrementalProgress = exports.noCompletionWithoutVerification = void 0;
7
13
  const types_1 = require("./types");
8
- exports.noSelfApproval = (0, types_1.contextFlag)('no_self_approval', ctx => ctx.hasTest === true);
9
- exports.noCompletionWithoutVerification = (0, types_1.contextFlag)('no_completion_without_verification', ctx => ctx.hasVerificationEvidence === true);
10
- exports.incrementalProgress = (0, types_1.contextFlag)('incremental_progress',
11
- // undefined = 未验证 → Iron Law 必须显式确认
12
- ctx => ctx.hasSingleTask === true);
13
- exports.verifyExternalCapability = (0, types_1.contextFlag)('verify_external_capability', ctx => ctx.hasExternalCapabilityVerification === true);
14
- exports.noImplementationWithoutRequirementReview = (0, types_1.contextFlag)('no_implementation_without_requirement_review', ctx => ctx.hasRequirementReview === true);
15
- exports.noImplementationWithoutRequirement = (0, types_1.contextFlag)('no_implementation_without_requirement', ctx => ctx.hasRequirement === true);
16
- exports.preferWorktree = (0, types_1.contextFlag)('prefer_worktree', ctx => ctx.hasWorktree === true);
17
- exports.noClaimWithoutEvidence = (0, types_1.contextFlag)('no_claim_without_evidence', ctx => ctx.hasVerificationEvidence === true ||
18
- (ctx.taskDescription || '').includes('test') ||
19
- ctx.hasTest === true);
20
- exports.noDeleteWithoutContext = (0, types_1.contextFlag)('no_delete_without_context', ctx => ctx.hasRequirementReview === true ||
21
- ctx.hasRequirement === true ||
22
- ctx.isExistingDesign === true);
23
- exports.twoStageReviewRequired = (0, types_1.contextFlag)('two_stage_review_required', ctx => ctx.hasTwoStageReview === true);
14
+ exports.noCompletionWithoutVerification = (0, types_1.contextEvidenceFlag)('no_completion_without_verification', ctx => ctx.hasVerificationEvidence);
15
+ exports.incrementalProgress = (0, types_1.contextEvidenceFlag)('incremental_progress', ctx => ctx.hasSingleTask);
16
+ exports.noImplementationWithoutRequirement = (0, types_1.contextEvidenceFlag)('no_implementation_without_requirement', ctx => ctx.hasRequirement);
24
17
  //# sourceMappingURL=iron-flags.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"iron-flags.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/iron-flags.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,mCAAsC;AAEzB,QAAA,cAAc,GAAG,IAAA,mBAAW,EACvC,kBAAkB,EAClB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAC5B,CAAC;AAEW,QAAA,+BAA+B,GAAG,IAAA,mBAAW,EACxD,oCAAoC,EACpC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,uBAAuB,KAAK,IAAI,CAC5C,CAAC;AAEW,QAAA,mBAAmB,GAAG,IAAA,mBAAW,EAC5C,sBAAsB;AACtB,oCAAoC;AACpC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,KAAK,IAAI,CAClC,CAAC;AAEW,QAAA,wBAAwB,GAAG,IAAA,mBAAW,EACjD,4BAA4B,EAC5B,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,iCAAiC,KAAK,IAAI,CACtD,CAAC;AAEW,QAAA,wCAAwC,GAAG,IAAA,mBAAW,EACjE,8CAA8C,EAC9C,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,oBAAoB,KAAK,IAAI,CACzC,CAAC;AAEW,QAAA,kCAAkC,GAAG,IAAA,mBAAW,EAC3D,uCAAuC,EACvC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,cAAc,KAAK,IAAI,CACnC,CAAC;AAEW,QAAA,cAAc,GAAG,IAAA,mBAAW,EACvC,iBAAiB,EACjB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,CAChC,CAAC;AAEW,QAAA,sBAAsB,GAAG,IAAA,mBAAW,EAC/C,2BAA2B,EAC3B,GAAG,CAAC,EAAE,CACJ,GAAG,CAAC,uBAAuB,KAAK,IAAI;IACpC,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC5C,GAAG,CAAC,OAAO,KAAK,IAAI,CACvB,CAAC;AAEW,QAAA,sBAAsB,GAAG,IAAA,mBAAW,EAC/C,2BAA2B,EAC3B,GAAG,CAAC,EAAE,CACJ,GAAG,CAAC,oBAAoB,KAAK,IAAI;IACjC,GAAG,CAAC,cAAc,KAAK,IAAI;IAC3B,GAAG,CAAC,gBAAgB,KAAK,IAAI,CAChC,CAAC;AAEW,QAAA,sBAAsB,GAAG,IAAA,mBAAW,EAC/C,2BAA2B,EAC3B,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,iBAAiB,KAAK,IAAI,CACtC,CAAC"}
1
+ {"version":3,"file":"iron-flags.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/iron-flags.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,mCAA8C;AAEjC,QAAA,+BAA+B,GAAG,IAAA,2BAAmB,EAChE,oCAAoC,EACpC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,uBAAuB,CACnC,CAAC;AAEW,QAAA,mBAAmB,GAAG,IAAA,2BAAmB,EACpD,sBAAsB,EACtB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,aAAa,CACzB,CAAC;AAEW,QAAA,kCAAkC,GAAG,IAAA,2BAAmB,EACnE,uCAAuC,EACvC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,cAAc,CAC1B,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * no_hardcoded_credentials:硬编码凭证扫描(ADR-0001:shell 扫描逻辑接入真 checker)
3
+ *
4
+ * 扫描 staged diff 的新增行(无 staged diff 时退化为变更文件内容),
5
+ * 命中常见私钥/密码/token 模式即 fail。
6
+ *
7
+ * 模板文件(.example/.sample/.template)与占位符值(your_xxx、process.env 引用等)豁免。
8
+ */
9
+ import type { ConstraintCheck } from './types';
10
+ /** 判定一段文本是否包含硬编码凭证 */
11
+ export declare function containsHardcodedCredential(text: string): boolean;
12
+ export declare const noHardcodedCredentials: ConstraintCheck;
13
+ //# sourceMappingURL=no-hardcoded-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-hardcoded-credentials.d.ts","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/no-hardcoded-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAgC/C,sBAAsB;AACtB,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAUjE;AAED,eAAO,MAAM,sBAAsB,EAAE,eAoCpC,CAAC"}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ /**
3
+ * no_hardcoded_credentials:硬编码凭证扫描(ADR-0001:shell 扫描逻辑接入真 checker)
4
+ *
5
+ * 扫描 staged diff 的新增行(无 staged diff 时退化为变更文件内容),
6
+ * 命中常见私钥/密码/token 模式即 fail。
7
+ *
8
+ * 模板文件(.example/.sample/.template)与占位符值(your_xxx、process.env 引用等)豁免。
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.noHardcodedCredentials = void 0;
12
+ exports.containsHardcodedCredential = containsHardcodedCredential;
13
+ const fs_1 = require("fs");
14
+ const path_1 = require("path");
15
+ /** 私钥/令牌指纹模式(命中即违规,无例外) */
16
+ const FINGERPRINT_PATTERNS = [
17
+ // PEM 私钥头
18
+ /-----BEGIN (?:RSA |EC |DSA |OPENSSH |PGP )?PRIVATE KEY(?: BLOCK)?-----/,
19
+ // AWS Access Key ID
20
+ /\b(?:AKIA|ASIA)[0-9A-Z]{16}\b/,
21
+ // GitHub token
22
+ /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}\b/,
23
+ /\bgithub_pat_[A-Za-z0-9_]{20,}\b/,
24
+ // Slack token
25
+ /\bxox[baprs]-[A-Za-z0-9-]{10,}\b/,
26
+ // Google API key
27
+ /\bAIza[0-9A-Za-z_-]{35}\b/,
28
+ ];
29
+ /** 通用赋值模式:password/secret/token/api key = "字面量"(不要求前词边界,覆盖 dbPassword 等 camelCase) */
30
+ const ASSIGNMENT_PATTERN = /(?:password|passwd|secret|api[_-]?key|access[_-]?token|auth[_-]?token)\b\s*[:=]\s*['"][^'"\n]{8,}['"]/i;
31
+ /** 占位符/环境变量引用等明显非真实值 */
32
+ const PLACEHOLDER_PATTERN = /process\.env|your[_-]|<[^>]+>|\$\{|xxx+|placeholder|example|changeme|dummy|fake|test/i;
33
+ /** 允许占位符的模板文件后缀 */
34
+ const TEMPLATE_SUFFIXES = ['.example', '.sample', '.template', '.dist'];
35
+ function isTemplateFile(file) {
36
+ return TEMPLATE_SUFFIXES.some(s => file.endsWith(s));
37
+ }
38
+ /** 判定一段文本是否包含硬编码凭证 */
39
+ function containsHardcodedCredential(text) {
40
+ for (const line of text.split('\n')) {
41
+ // 占位符/环境变量引用行整体豁免(your_xxx、process.env、示例值等)
42
+ if (PLACEHOLDER_PATTERN.test(line))
43
+ continue;
44
+ for (const pattern of FINGERPRINT_PATTERNS) {
45
+ if (pattern.test(line))
46
+ return true;
47
+ }
48
+ if (ASSIGNMENT_PATTERN.test(line))
49
+ return true;
50
+ }
51
+ return false;
52
+ }
53
+ exports.noHardcodedCredentials = {
54
+ id: 'no_hardcoded_credentials',
55
+ evaluate: async (env) => {
56
+ const files = (env.context.changedFiles || []).filter(f => !isTemplateFile(f));
57
+ // 1) staged diff 新增行
58
+ let scanned = false;
59
+ try {
60
+ const diff = await env.stagedDiff();
61
+ const added = diff
62
+ .split('\n')
63
+ .filter(l => l.startsWith('+') && !l.startsWith('+++'))
64
+ .map(l => l.slice(1))
65
+ .join('\n');
66
+ if (added.trim().length > 0) {
67
+ scanned = true;
68
+ if (containsHardcodedCredential(added))
69
+ return false;
70
+ }
71
+ }
72
+ catch {
73
+ // diff 不可用 → 退化为文件内容扫描
74
+ }
75
+ // 2) 变更文件内容(diff 为空或不可用时)
76
+ if (!scanned) {
77
+ for (const file of files) {
78
+ try {
79
+ const content = (0, fs_1.readFileSync)((0, path_1.join)(env.projectPath, file), 'utf-8');
80
+ if (containsHardcodedCredential(content))
81
+ return false;
82
+ }
83
+ catch {
84
+ // 文件不可读(已删除/二进制)→ 跳过
85
+ }
86
+ }
87
+ }
88
+ return true;
89
+ },
90
+ };
91
+ //# sourceMappingURL=no-hardcoded-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-hardcoded-credentials.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/no-hardcoded-credentials.ts"],"names":[],"mappings":"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"}
@@ -23,21 +23,32 @@ export interface CheckEnv {
23
23
  /** 源码根相对路径文件列表(run 内 cached) */
24
24
  srcScan(root: string): string[];
25
25
  }
26
+ /**
27
+ * 检查结果三态(ADR-0001 存在性探测 / flag 未接线):
28
+ * - true = 满足(pass)
29
+ * - false = 违反(fail)
30
+ * - 'skip' = 未评估(项目未采用对应约定,或证据 flag 未接线),不计 pass/fail
31
+ */
32
+ export type CheckOutcome = boolean | 'skip';
26
33
  /**
27
34
  * 单条约束检查实现
28
35
  */
29
36
  export interface ConstraintCheck {
30
37
  /** 约束 ID(与 definitions 一致) */
31
38
  id: string;
32
- /** 检查主体:true = 满足 */
33
- evaluate(env: CheckEnv): Promise<boolean> | boolean;
39
+ /** 检查主体:true = 满足;false = 违反;'skip' = 未评估 */
40
+ evaluate(env: CheckEnv): Promise<CheckOutcome> | CheckOutcome;
34
41
  }
35
42
  /**
36
43
  * 构造纯上下文标志检查(无 I/O 的轻量约束)
37
44
  */
38
45
  export declare function contextFlag(id: string, predicate: (context: ConstraintContext) => boolean): ConstraintCheck;
39
46
  /**
40
- * 构造恒通过检查(promptInjection 驱动 / 仅提示类约束)
47
+ * 构造证据标志检查(ADR-0001:flag 未接线 = skip 而非 fail)
48
+ *
49
+ * - flag === undefined:调用方未接线该证据 → 'skip'(不评估,不误报违规)
50
+ * - flag === false:显式无证据 → fail
51
+ * - flag === true:有证据 → pass
41
52
  */
42
- export declare function alwaysPass(id: string): ConstraintCheck;
53
+ export declare function contextEvidenceFlag(id: string, pick: (context: ConstraintContext) => boolean | undefined): ConstraintCheck;
43
54
  //# sourceMappingURL=types.d.ts.map
@@ -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;AAEnE;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,2CAA2C;IAC3C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,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;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACrD;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,GACjD,eAAe,CAEjB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,CAEtD"}
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;AAEnE;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB,2CAA2C;IAC3C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,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,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,6CAA6C;IAC7C,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"}
@@ -7,7 +7,7 @@
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.contextFlag = contextFlag;
10
- exports.alwaysPass = alwaysPass;
10
+ exports.contextEvidenceFlag = contextEvidenceFlag;
11
11
  /**
12
12
  * 构造纯上下文标志检查(无 I/O 的轻量约束)
13
13
  */
@@ -15,9 +15,21 @@ function contextFlag(id, predicate) {
15
15
  return { id, evaluate: (env) => predicate(env.context) };
16
16
  }
17
17
  /**
18
- * 构造恒通过检查(promptInjection 驱动 / 仅提示类约束)
18
+ * 构造证据标志检查(ADR-0001:flag 未接线 = skip 而非 fail)
19
+ *
20
+ * - flag === undefined:调用方未接线该证据 → 'skip'(不评估,不误报违规)
21
+ * - flag === false:显式无证据 → fail
22
+ * - flag === true:有证据 → pass
19
23
  */
20
- function alwaysPass(id) {
21
- return { id, evaluate: () => true };
24
+ function contextEvidenceFlag(id, pick) {
25
+ return {
26
+ id,
27
+ evaluate: (env) => {
28
+ const value = pick(env.context);
29
+ if (value === undefined)
30
+ return 'skip';
31
+ return value;
32
+ },
33
+ };
22
34
  }
23
35
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAoCH,kCAKC;AAKD,gCAEC;AAfD;;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;;GAEG;AACH,SAAgB,UAAU,CAAC,EAAU;IACnC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/core/constraints/checkers/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA4CH,kCAKC;AASD,kDAYC;AA7BD;;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"}
@@ -22,14 +22,17 @@ export declare function listHeadDirs(projectPath: string): Set<string> | null;
22
22
  export declare function isNewDirectory(headDirs: Set<string> | null, filePath: string): boolean;
23
23
  /**
24
24
  * 检测触发条件
25
+ *
26
+ * ADR-0001:变更包含代码文件时,在主推断之外附加 code_implementation
27
+ * (返回数组 [主推断, 'code_implementation'];主推断逻辑保持不变)。
25
28
  */
26
29
  export declare function detectTrigger(changedFiles: string[], options: {
27
30
  trigger?: ConstraintTrigger;
28
31
  projectPath?: string;
29
- }): ConstraintTrigger;
32
+ }): ConstraintTrigger | ConstraintTrigger[];
30
33
  /**
31
34
  * 检测是否有失败的测试记录
32
- * 扫描 .harness/traces/ 中最近的 trace 记录
35
+ * 扫描 trace 文件(DEFAULT_TRACE_FILE)中最近的记录
33
36
  */
34
37
  export declare function detectFailingTest(projectPath: string): Promise<boolean>;
35
38
  /**
@@ -39,7 +42,7 @@ export declare function detectFailingTest(projectPath: string): Promise<boolean>
39
42
  export declare function detectRootCauseInvestigation(projectPath: string): boolean;
40
43
  /**
41
44
  * 检测是否有验证证据
42
- * 检查 .harness/traces/ 中最近的成功验证记录
45
+ * 检查 trace 文件(DEFAULT_TRACE_FILE)中最近的成功验证记录
43
46
  */
44
47
  export declare function detectVerificationEvidence(projectPath: string): Promise<boolean>;
45
48
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEnF;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAU9F;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAepE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D,iBAAiB,CAyBnB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB7E;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAgBzE;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBtF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAqB9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAU3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAY7D;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiB7B"}
1
+ {"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../../src/core/constraints/context-builder.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEnF;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAU9F;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAepE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGtF;AASD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,YAAY,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D,iBAAiB,GAAG,iBAAiB,EAAE,CA2BzC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAsB7E;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAgBzE;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBtF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAqB9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAU3D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAY7D;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,iBAAiB,CAAC;CAC7B,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmB7B"}