@dommaker/harness 0.13.0 → 0.13.2

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 (420) hide show
  1. package/CHANGELOG.md +169 -0
  2. package/bin/harness-knowledge-capture.js +99 -0
  3. package/bin/harness-knowledge-check.js +149 -0
  4. package/bin/harness-knowledge-track.js +92 -0
  5. package/bin/harness-knowledge-track.sh +47 -0
  6. package/bin/harness-sensitive-check.sh +67 -0
  7. package/dist/cli/commands/init.js +34 -2
  8. package/dist/cli/commands/init.js.map +1 -1
  9. package/package.json +6 -3
  10. package/src/CONTEXT.md +34 -0
  11. package/src/__tests__/acceptance-gate.test.ts +364 -0
  12. package/src/__tests__/annotation-checker.test.ts +183 -0
  13. package/src/__tests__/architecture-engine.test.ts +619 -0
  14. package/src/__tests__/checker-extra.test.ts +1627 -0
  15. package/src/__tests__/checker.test.ts +1268 -0
  16. package/src/__tests__/checkpoint.test.ts +697 -0
  17. package/src/__tests__/clean-state-extra.test.ts +301 -0
  18. package/src/__tests__/clean-state.test.ts +169 -0
  19. package/src/__tests__/constraint-doctor.test.ts +410 -0
  20. package/src/__tests__/constraint-evolver.test.ts +404 -0
  21. package/src/__tests__/constraint-handler.test.ts +136 -0
  22. package/src/__tests__/context/progressive-loader.test.ts +131 -0
  23. package/src/__tests__/contract-gate.test.ts +321 -0
  24. package/src/__tests__/cross-project-checker.test.ts +318 -0
  25. package/src/__tests__/cso-validator.test.ts +205 -0
  26. package/src/__tests__/detect-source-roots.test.ts +98 -0
  27. package/src/__tests__/doctor-evolver.test.ts +381 -0
  28. package/src/__tests__/error-classifier.test.ts +304 -0
  29. package/src/__tests__/exec.test.ts +83 -0
  30. package/src/__tests__/extend-exceptions.test.ts +149 -0
  31. package/src/__tests__/failure-recorder.test.ts +335 -0
  32. package/src/__tests__/hooks-pipeline.test.ts +214 -0
  33. package/src/__tests__/interceptor.test.ts +89 -0
  34. package/src/__tests__/iron-laws.test.ts +246 -0
  35. package/src/__tests__/long-running.test.ts +17 -0
  36. package/src/__tests__/passes-gate-check.test.ts +138 -0
  37. package/src/__tests__/passes-gate-extension.test.ts +151 -0
  38. package/src/__tests__/passes-gate-extra.test.ts +238 -0
  39. package/src/__tests__/passes-gate.test.ts +231 -0
  40. package/src/__tests__/performance-analyzer.test.ts +501 -0
  41. package/src/__tests__/performance-collector.test.ts +276 -0
  42. package/src/__tests__/performance-gate.test.ts +74 -0
  43. package/src/__tests__/presets.test.ts +104 -0
  44. package/src/__tests__/project-config-loader-extra.test.ts +269 -0
  45. package/src/__tests__/project-config-loader.test.ts +127 -0
  46. package/src/__tests__/review-gate.test.ts +92 -0
  47. package/src/__tests__/security-gate.test.ts +100 -0
  48. package/src/__tests__/session-startup.test.ts +334 -0
  49. package/src/__tests__/spec-validator.test.ts +57 -0
  50. package/src/__tests__/token-budget.test.ts +252 -0
  51. package/src/__tests__/trace-analyzer-extra.test.ts +307 -0
  52. package/src/__tests__/trace-analyzer.test.ts +131 -0
  53. package/src/__tests__/trace-collector.test.ts +258 -0
  54. package/src/__tests__/traces.test.ts +347 -0
  55. package/src/agents/CONTEXT.md +21 -0
  56. package/src/agents/__tests__/lifecycle.test.ts +248 -0
  57. package/src/agents/index.ts +2 -0
  58. package/src/agents/lifecycle.ts +201 -0
  59. package/src/agents/types.ts +46 -0
  60. package/src/architecture/CONTEXT.md +22 -0
  61. package/src/architecture/constraint-engine.ts +356 -0
  62. package/src/architecture/cross-project-checker.ts +563 -0
  63. package/src/cli/commands/CONTEXT.md +24 -0
  64. package/src/cli/commands/__tests__/acceptance.test.ts +180 -0
  65. package/src/cli/commands/__tests__/check.test.ts +598 -0
  66. package/src/cli/commands/__tests__/command.test.ts +149 -0
  67. package/src/cli/commands/__tests__/contract.test.ts +151 -0
  68. package/src/cli/commands/__tests__/failure.test.ts +199 -0
  69. package/src/cli/commands/__tests__/flow.test.ts +343 -0
  70. package/src/cli/commands/__tests__/init.test.ts +306 -0
  71. package/src/cli/commands/__tests__/passes-gate.test.ts +256 -0
  72. package/src/cli/commands/__tests__/performance.test.ts +116 -0
  73. package/src/cli/commands/__tests__/posteval-plan.test.ts +201 -0
  74. package/src/cli/commands/__tests__/report-extra.test.ts +98 -0
  75. package/src/cli/commands/__tests__/report.test.ts +109 -0
  76. package/src/cli/commands/__tests__/review.test.ts +153 -0
  77. package/src/cli/commands/__tests__/security.test.ts +147 -0
  78. package/src/cli/commands/__tests__/spec.test.ts +193 -0
  79. package/src/cli/commands/__tests__/status-extra.test.ts +223 -0
  80. package/src/cli/commands/__tests__/status.test.ts +306 -0
  81. package/src/cli/commands/__tests__/sync-docs.test.ts +335 -0
  82. package/src/cli/commands/__tests__/validate.test.ts +139 -0
  83. package/src/cli/commands/acceptance.ts +111 -0
  84. package/src/cli/commands/analyze-sessions.ts +488 -0
  85. package/src/cli/commands/check.ts +441 -0
  86. package/src/cli/commands/command.ts +90 -0
  87. package/src/cli/commands/constraints.ts +86 -0
  88. package/src/cli/commands/contract.ts +168 -0
  89. package/src/cli/commands/failure.ts +117 -0
  90. package/src/cli/commands/flow.ts +275 -0
  91. package/src/cli/commands/index.ts +26 -0
  92. package/src/cli/commands/init.ts +832 -0
  93. package/src/cli/commands/knowledge.ts +391 -0
  94. package/src/cli/commands/passes-gate.ts +158 -0
  95. package/src/cli/commands/performance.ts +108 -0
  96. package/src/cli/commands/posteval-plan.ts +85 -0
  97. package/src/cli/commands/release.ts +159 -0
  98. package/src/cli/commands/report.ts +198 -0
  99. package/src/cli/commands/review.ts +118 -0
  100. package/src/cli/commands/security.ts +122 -0
  101. package/src/cli/commands/spec.ts +158 -0
  102. package/src/cli/commands/status.ts +169 -0
  103. package/src/cli/commands/sync-docs.ts +743 -0
  104. package/src/cli/commands/update-user-model.ts +527 -0
  105. package/src/cli/commands/validate.ts +222 -0
  106. package/src/constraints/__tests__/lifecycle-runner.test.ts +246 -0
  107. package/src/constraints/__tests__/registry.test.ts +196 -0
  108. package/src/constraints/index.ts +3 -0
  109. package/src/constraints/lifecycle-runner.ts +184 -0
  110. package/src/constraints/registry.ts +134 -0
  111. package/src/constraints/types.ts +59 -0
  112. package/src/context/CONTEXT.md +28 -0
  113. package/src/context/__tests__/compaction.test.ts +169 -0
  114. package/src/context/__tests__/file-budget.test.ts +142 -0
  115. package/src/context/__tests__/knowledge-injector.test.ts +148 -0
  116. package/src/context/__tests__/progressive-loader.test.ts +264 -0
  117. package/src/context/__tests__/session-manager.test.ts +300 -0
  118. package/src/context/__tests__/token-budget.test.ts +338 -0
  119. package/src/context/__tests__/token-pipeline.test.ts +178 -0
  120. package/src/context/__tests__/tool-output-budget.test.ts +95 -0
  121. package/src/context/compaction.ts +202 -0
  122. package/src/context/file-budget.ts +142 -0
  123. package/src/context/index.ts +15 -0
  124. package/src/context/knowledge-injector.ts +168 -0
  125. package/src/context/progressive-loader.ts +260 -0
  126. package/src/context/session-manager.ts +343 -0
  127. package/src/context/token-budget.ts +295 -0
  128. package/src/context/token-pipeline.ts +265 -0
  129. package/src/context/tool-output-budget.ts +178 -0
  130. package/src/context/types.ts +160 -0
  131. package/src/core/CONTEXT.md +26 -0
  132. package/src/core/constraints/__tests__/default-executors.test.ts +57 -0
  133. package/src/core/constraints/__tests__/interceptor.test.ts +251 -0
  134. package/src/core/constraints/__tests__/prompt-injection.test.ts +89 -0
  135. package/src/core/constraints/check-cache.ts +96 -0
  136. package/src/core/constraints/checker.ts +1169 -0
  137. package/src/core/constraints/default-executors.ts +92 -0
  138. package/src/core/constraints/definitions.ts +1119 -0
  139. package/src/core/constraints/doc-freshness/__tests__/runner.test.ts +551 -0
  140. package/src/core/constraints/doc-freshness/auto-fix.ts +69 -0
  141. package/src/core/constraints/doc-freshness/runner.ts +486 -0
  142. package/src/core/constraints/index.ts +78 -0
  143. package/src/core/constraints/interceptor.ts +220 -0
  144. package/src/core/constraints/prompt-injection.ts +73 -0
  145. package/src/core/index.ts +23 -0
  146. package/src/core/project-config-loader.ts +252 -0
  147. package/src/core/session/__tests__/startup.test.ts +281 -0
  148. package/src/core/session/clean-state.ts +178 -0
  149. package/src/core/session/index.ts +15 -0
  150. package/src/core/session/startup.ts +253 -0
  151. package/src/core/spec/__tests__/validator.test.ts +379 -0
  152. package/src/core/spec/index.ts +7 -0
  153. package/src/core/spec/validator.ts +383 -0
  154. package/src/core/validators/__tests__/passes-gate.test.ts +131 -0
  155. package/src/core/validators/checkpoint.ts +547 -0
  156. package/src/core/validators/cso.ts +124 -0
  157. package/src/core/validators/index.ts +25 -0
  158. package/src/core/validators/passes-gate.ts +613 -0
  159. package/src/dashboard/CONTEXT.md +21 -0
  160. package/src/dashboard/__tests__/data.test.ts +115 -0
  161. package/src/dashboard/__tests__/stats.test.ts +156 -0
  162. package/src/dashboard/data.ts +113 -0
  163. package/src/dashboard/index.ts +3 -0
  164. package/src/dashboard/stats.ts +127 -0
  165. package/src/dashboard/types.ts +113 -0
  166. package/src/evolution/CONTEXT.md +22 -0
  167. package/src/evolution/__tests__/auto-evolve.test.ts +320 -0
  168. package/src/evolution/auto-evolve.ts +98 -0
  169. package/src/evolution/index.ts +1 -0
  170. package/src/failure/CONTEXT.md +24 -0
  171. package/src/failure/classifier.ts +156 -0
  172. package/src/failure/constraint-handler.ts +173 -0
  173. package/src/failure/index.ts +35 -0
  174. package/src/failure/recorder.ts +201 -0
  175. package/src/failure/types.ts +165 -0
  176. package/src/gates/CONTEXT.md +27 -0
  177. package/src/gates/__tests__/acceptance.test.ts +608 -0
  178. package/src/gates/__tests__/command.test.ts +206 -0
  179. package/src/gates/__tests__/performance.test.ts +381 -0
  180. package/src/gates/__tests__/review.test.ts +302 -0
  181. package/src/gates/__tests__/security.test.ts +332 -0
  182. package/src/gates/acceptance.ts +493 -0
  183. package/src/gates/command.ts +444 -0
  184. package/src/gates/contract.ts +260 -0
  185. package/src/gates/index.ts +67 -0
  186. package/src/gates/performance.ts +359 -0
  187. package/src/gates/review.ts +169 -0
  188. package/src/gates/security.ts +244 -0
  189. package/src/gates/types.ts +159 -0
  190. package/src/governance/CONTEXT.md +22 -0
  191. package/src/governance/__tests__/executor.test.ts +249 -0
  192. package/src/governance/executor.ts +229 -0
  193. package/src/governance/index.ts +13 -0
  194. package/src/governance/types.ts +53 -0
  195. package/src/hooks/CONTEXT.md +23 -0
  196. package/src/hooks/__tests__/bootstrap.test.ts +184 -0
  197. package/src/hooks/bootstrap.ts +144 -0
  198. package/src/hooks/index.ts +15 -0
  199. package/src/hooks/pipeline.ts +157 -0
  200. package/src/hooks/registry.ts +88 -0
  201. package/src/hooks/types.ts +80 -0
  202. package/src/index.ts +198 -0
  203. package/src/knowledge/CONTEXT.md +29 -0
  204. package/src/knowledge/__tests__/doctor.test.ts +272 -0
  205. package/src/knowledge/__tests__/import.test.ts +376 -0
  206. package/src/knowledge/__tests__/ingest.test.ts +125 -0
  207. package/src/knowledge/__tests__/lifecycle-hooks.test.ts +137 -0
  208. package/src/knowledge/__tests__/lifecycle.test.ts +248 -0
  209. package/src/knowledge/__tests__/lint.test.ts +401 -0
  210. package/src/knowledge/__tests__/query.test.ts +185 -0
  211. package/src/knowledge/__tests__/reference-tracker.test.ts +129 -0
  212. package/src/knowledge/__tests__/store.test.ts +238 -0
  213. package/src/knowledge/doctor.ts +104 -0
  214. package/src/knowledge/import.ts +505 -0
  215. package/src/knowledge/index.ts +16 -0
  216. package/src/knowledge/ingest.ts +126 -0
  217. package/src/knowledge/lifecycle-hooks.ts +199 -0
  218. package/src/knowledge/lifecycle.ts +175 -0
  219. package/src/knowledge/lint.ts +360 -0
  220. package/src/knowledge/query.ts +150 -0
  221. package/src/knowledge/reference-tracker.ts +99 -0
  222. package/src/knowledge/store.ts +264 -0
  223. package/src/knowledge/types.ts +139 -0
  224. package/src/llm/CONTEXT.md +21 -0
  225. package/src/llm/__tests__/adapter.test.ts +172 -0
  226. package/src/llm/adapter.ts +149 -0
  227. package/src/llm/index.ts +2 -0
  228. package/src/llm/types.ts +81 -0
  229. package/src/monitoring/CONTEXT.md +29 -0
  230. package/src/monitoring/__tests__/context-tracker.test.ts +172 -0
  231. package/src/monitoring/__tests__/knowledge-doctor.test.ts +276 -0
  232. package/src/monitoring/__tests__/knowledge-evolver.test.ts +365 -0
  233. package/src/monitoring/__tests__/performance-analyzer.test.ts +137 -0
  234. package/src/monitoring/__tests__/performance-collector.test.ts +332 -0
  235. package/src/monitoring/__tests__/traces.test.ts +190 -0
  236. package/src/monitoring/constraint-doctor.ts +499 -0
  237. package/src/monitoring/constraint-evolver.ts +573 -0
  238. package/src/monitoring/context-tracker.ts +148 -0
  239. package/src/monitoring/index.ts +23 -0
  240. package/src/monitoring/knowledge-doctor.ts +323 -0
  241. package/src/monitoring/knowledge-evolver.ts +289 -0
  242. package/src/monitoring/performance-analyzer.ts +450 -0
  243. package/src/monitoring/performance-collector.ts +348 -0
  244. package/src/monitoring/trace-analyzer.ts +470 -0
  245. package/src/monitoring/traces.ts +339 -0
  246. package/src/presets/__tests__/standard.test.ts +104 -0
  247. package/src/presets/index.ts +16 -0
  248. package/src/presets/standard.ts +163 -0
  249. package/src/safety/CONTEXT.md +23 -0
  250. package/src/safety/__tests__/input-guardrail.test.ts +105 -0
  251. package/src/safety/__tests__/output-guardrail.test.ts +108 -0
  252. package/src/safety/__tests__/sandbox.test.ts +158 -0
  253. package/src/safety/__tests__/tool-guardrail.test.ts +127 -0
  254. package/src/safety/index.ts +5 -0
  255. package/src/safety/input-guardrail.ts +133 -0
  256. package/src/safety/output-guardrail.ts +174 -0
  257. package/src/safety/sandbox.ts +148 -0
  258. package/src/safety/tool-guardrail.ts +176 -0
  259. package/src/safety/types.ts +124 -0
  260. package/src/spec/CONTEXT.md +19 -0
  261. package/src/spec/__tests__/annotation-checker.test.ts +289 -0
  262. package/src/spec/annotation-checker.ts +342 -0
  263. package/src/tools/CONTEXT.md +25 -0
  264. package/src/tools/__tests__/loader.test.ts +252 -0
  265. package/src/tools/__tests__/registry.test.ts +157 -0
  266. package/src/tools/core/__tests__/core.test.ts +122 -0
  267. package/src/tools/core/index.ts +201 -0
  268. package/src/tools/core/package.json +7 -0
  269. package/src/tools/core/pnpm-lock.yaml +232 -0
  270. package/src/tools/definitions/core/code/fingerprint.sh +273 -0
  271. package/src/tools/definitions/core/code/fingerprint.yml +72 -0
  272. package/src/tools/definitions/core/code/parse.yml +68 -0
  273. package/src/tools/definitions/core/code/register-language.sh +475 -0
  274. package/src/tools/definitions/core/code/register-language.yml +74 -0
  275. package/src/tools/definitions/core/docker/build.yml +73 -0
  276. package/src/tools/definitions/core/docker/run.yml +81 -0
  277. package/src/tools/definitions/core/file/copy.yml +88 -0
  278. package/src/tools/definitions/core/file/read.yml +69 -0
  279. package/src/tools/definitions/core/file/write.yml +75 -0
  280. package/src/tools/definitions/core/git/branch.yml +61 -0
  281. package/src/tools/definitions/core/git/cleanup-worktree.yml +50 -0
  282. package/src/tools/definitions/core/git/clone.yml +69 -0
  283. package/src/tools/definitions/core/git/commit.yml +65 -0
  284. package/src/tools/definitions/core/git/push.yml +79 -0
  285. package/src/tools/definitions/core/git/worktree.yml +96 -0
  286. package/src/tools/definitions/core/notification/notify.sh +152 -0
  287. package/src/tools/definitions/core/notification/notify.yml +60 -0
  288. package/src/tools/definitions/core/npm/build.yml +75 -0
  289. package/src/tools/definitions/core/npm/install.yml +58 -0
  290. package/src/tools/definitions/core/npm/test.yml +75 -0
  291. package/src/tools/definitions/core/validation/check-reuse.yml +170 -0
  292. package/src/tools/definitions/core/validation/validate-handlers.yml +118 -0
  293. package/src/tools/definitions/core/validation/validate-readme-stats.yml +155 -0
  294. package/src/tools/definitions/core/validation/validate-yaml-syntax.yml +134 -0
  295. package/src/tools/definitions/ext/browser/browser-automate.sh +255 -0
  296. package/src/tools/definitions/ext/browser/browser-automate.yml +166 -0
  297. package/src/tools/definitions/ext/browser/browser-close.sh +104 -0
  298. package/src/tools/definitions/ext/browser/browser-close.yml +55 -0
  299. package/src/tools/definitions/ext/browser/browser-mcp-debug.sh +682 -0
  300. package/src/tools/definitions/ext/browser/browser-mcp-debug.yml +167 -0
  301. package/src/tools/definitions/ext/browser/browser-start.sh +101 -0
  302. package/src/tools/definitions/ext/browser/browser-start.yml +62 -0
  303. package/src/tools/definitions/registry.json +795 -0
  304. package/src/tools/definitions/std/README.md +350 -0
  305. package/src/tools/definitions/std/analysis/analyze-codebase.yml +72 -0
  306. package/src/tools/definitions/std/analysis/analyze-diff.yml +182 -0
  307. package/src/tools/definitions/std/analysis/analyze-git-diff.yml +70 -0
  308. package/src/tools/definitions/std/analysis/analyze-impact.yml +78 -0
  309. package/src/tools/definitions/std/analysis/analyze-requirements.yml +105 -0
  310. package/src/tools/definitions/std/analysis/brainstorm-options.yml +106 -0
  311. package/src/tools/definitions/std/analysis/build-graph.yml +154 -0
  312. package/src/tools/definitions/std/analysis/clarify-requirements.yml +90 -0
  313. package/src/tools/definitions/std/analysis/detect-context.yml +109 -0
  314. package/src/tools/definitions/std/analysis/detect-layers.yml +125 -0
  315. package/src/tools/definitions/std/analysis/generate-tour.yml +102 -0
  316. package/src/tools/definitions/std/analysis/search-enhance.yml +105 -0
  317. package/src/tools/definitions/std/backlog/add.yml +51 -0
  318. package/src/tools/definitions/std/backlog/decide.yml +39 -0
  319. package/src/tools/definitions/std/backlog/github-sync.yml +161 -0
  320. package/src/tools/definitions/std/backlog/list.yml +53 -0
  321. package/src/tools/definitions/std/backlog/load.yml +46 -0
  322. package/src/tools/definitions/std/backlog/resolve.yml +37 -0
  323. package/src/tools/definitions/std/backlog/update.yml +42 -0
  324. package/src/tools/definitions/std/bugfix/diagnose.yml +68 -0
  325. package/src/tools/definitions/std/bugfix/fix.yml +66 -0
  326. package/src/tools/definitions/std/bugfix/verify.yml +69 -0
  327. package/src/tools/definitions/std/constraint/check-decomposition.yml +103 -0
  328. package/src/tools/definitions/std/constraint/check-feature-list.yml +77 -0
  329. package/src/tools/definitions/std/constraint/check-progress.yml +97 -0
  330. package/src/tools/definitions/std/constraint/generate-report.yml +147 -0
  331. package/src/tools/definitions/std/deploy/commit-push.yml +33 -0
  332. package/src/tools/definitions/std/deploy/deploy-backend.yml +37 -0
  333. package/src/tools/definitions/std/deploy/deploy-frontend.yml +37 -0
  334. package/src/tools/definitions/std/deploy/rollback.yml +148 -0
  335. package/src/tools/definitions/std/design/analyze-architecture-impact.yml +113 -0
  336. package/src/tools/definitions/std/design/design-api.yml +55 -0
  337. package/src/tools/definitions/std/design/design-architecture.yml +97 -0
  338. package/src/tools/definitions/std/design/design-db.yml +81 -0
  339. package/src/tools/definitions/std/design/generate-spec.yml +182 -0
  340. package/src/tools/definitions/std/development/develop-api.yml +85 -0
  341. package/src/tools/definitions/std/development/develop-backend.yml +88 -0
  342. package/src/tools/definitions/std/development/develop-frontend.yml +87 -0
  343. package/src/tools/definitions/std/development/develop-shared-types.yml +74 -0
  344. package/src/tools/definitions/std/development/develop-task.yml +122 -0
  345. package/src/tools/definitions/std/development/develop-tests.yml +76 -0
  346. package/src/tools/definitions/std/development/execute-batch.yml +152 -0
  347. package/src/tools/definitions/std/development/fix-issues.yml +100 -0
  348. package/src/tools/definitions/std/development/implement-task.yml +124 -0
  349. package/src/tools/definitions/std/development/review-fix-cycle.yml +232 -0
  350. package/src/tools/definitions/std/evolution/implement.yml +125 -0
  351. package/src/tools/definitions/std/evolution/prioritize.yml +112 -0
  352. package/src/tools/definitions/std/evolution/report-gap.yml +166 -0
  353. package/src/tools/definitions/std/file/read.yml +21 -0
  354. package/src/tools/definitions/std/governance/aggregate-opinions.sh +201 -0
  355. package/src/tools/definitions/std/governance/aggregate-opinions.yml +79 -0
  356. package/src/tools/definitions/std/governance/audit-task.yml +178 -0
  357. package/src/tools/definitions/std/governance/cast-vote.yml +129 -0
  358. package/src/tools/definitions/std/governance/collect-issues.yml +16 -0
  359. package/src/tools/definitions/std/governance/create-signed-document.yml +23 -0
  360. package/src/tools/definitions/std/governance/create-voting-session.yml +101 -0
  361. package/src/tools/definitions/std/governance/define-stance.sh +243 -0
  362. package/src/tools/definitions/std/governance/define-stance.yml +82 -0
  363. package/src/tools/definitions/std/governance/generate-review-report.yml +23 -0
  364. package/src/tools/definitions/std/governance/impeach.yml +179 -0
  365. package/src/tools/definitions/std/governance/multi-stance-review.yml +154 -0
  366. package/src/tools/definitions/std/governance/prepare-artifact.yml +20 -0
  367. package/src/tools/definitions/std/governance/review-spec-approval.yml +262 -0
  368. package/src/tools/definitions/std/governance/rollback.yml +186 -0
  369. package/src/tools/definitions/std/governance/stance-review.yml +149 -0
  370. package/src/tools/definitions/std/governance/track-effect.yml +199 -0
  371. package/src/tools/definitions/std/governance/vote-tally.yml +144 -0
  372. package/src/tools/definitions/std/patch/execute.yml +51 -0
  373. package/src/tools/definitions/std/planning/generate-tasks.yml +36 -0
  374. package/src/tools/definitions/std/planning/load-tasks.yml +44 -0
  375. package/src/tools/definitions/std/planning/split-batch.yml +481 -0
  376. package/src/tools/definitions/std/planning/split-tasks.yml +359 -0
  377. package/src/tools/definitions/std/planning/update-tasks.yml +51 -0
  378. package/src/tools/definitions/std/planning/validate-tasks.yml +46 -0
  379. package/src/tools/definitions/std/project/decide-next-workflow.yml +38 -0
  380. package/src/tools/definitions/std/project/load-state.yml +31 -0
  381. package/src/tools/definitions/std/project/save-state.yml +32 -0
  382. package/src/tools/definitions/std/quality/check-quality.yml +241 -0
  383. package/src/tools/definitions/std/quality/debug-systematic.yml +163 -0
  384. package/src/tools/definitions/std/quality/handle-feedback.yml +108 -0
  385. package/src/tools/definitions/std/quality/review-code.yml +128 -0
  386. package/src/tools/definitions/std/quality/review-spec.yml +140 -0
  387. package/src/tools/definitions/std/quality/review-task.yml +190 -0
  388. package/src/tools/definitions/std/quality/run-tests.yml +80 -0
  389. package/src/tools/definitions/std/quick/analyze.yml +56 -0
  390. package/src/tools/definitions/std/quick/implement.yml +67 -0
  391. package/src/tools/definitions/std/quick/verify.yml +71 -0
  392. package/src/tools/definitions/std/verification/verify_completion.yml +113 -0
  393. package/src/tools/definitions/std/verification/wait-condition.yml +107 -0
  394. package/src/tools/index.ts +5 -0
  395. package/src/tools/loader.ts +216 -0
  396. package/src/tools/paths.ts +15 -0
  397. package/src/tools/registry.ts +128 -0
  398. package/src/tools/types.ts +46 -0
  399. package/src/types/__tests__/types.test.ts +86 -0
  400. package/src/types/checkpoint.ts +174 -0
  401. package/src/types/constraint.ts +335 -0
  402. package/src/types/cso.ts +37 -0
  403. package/src/types/enforcement.ts +48 -0
  404. package/src/types/index.ts +59 -0
  405. package/src/types/iron-law.ts +50 -0
  406. package/src/types/passes-gate.ts +185 -0
  407. package/src/types/performance.ts +295 -0
  408. package/src/types/project-config.ts +251 -0
  409. package/src/types/session.ts +132 -0
  410. package/src/types/spec.ts +91 -0
  411. package/src/types/trace.ts +228 -0
  412. package/src/utils/detect-source-roots.ts +114 -0
  413. package/src/utils/exec.ts +61 -0
  414. package/src/verification/CONTEXT.md +23 -0
  415. package/src/verification/__tests__/loop.test.ts +303 -0
  416. package/src/verification/__tests__/rules-based.test.ts +240 -0
  417. package/src/verification/index.ts +3 -0
  418. package/src/verification/loop.ts +137 -0
  419. package/src/verification/rules-based.ts +153 -0
  420. package/src/verification/types.ts +81 -0
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Spec 验证器
3
+ *
4
+ * 框架提供验证机制,项目定义自己的 Spec Schema
5
+ *
6
+ * 设计原则:
7
+ * - 框架不包含具体 Schema 定义
8
+ * - 动态加载项目的 Schema
9
+ * - 支持 Zod / JSON Schema / 自定义验证器
10
+ */
11
+
12
+ import * as fs from 'fs/promises';
13
+ import * as path from 'path';
14
+ import * as glob from 'fast-glob';
15
+ import { execAsync } from '../../utils/exec';
16
+ import type {
17
+ SpecValidatorConfig,
18
+ SpecValidationResult,
19
+ BatchSpecValidationResult,
20
+ SpecSchemaDefinition,
21
+ SpecType,
22
+ } from '../../types/spec';
23
+
24
+ /**
25
+ * 默认配置
26
+ */
27
+ const DEFAULT_CONFIG: SpecValidatorConfig = {
28
+ enabled: true,
29
+ schemaPath: './specs/schemas',
30
+ files: ['ARCHITECTURE.md', 'specs/**/*.yml', 'specs/**/*.yaml'],
31
+ failureLevel: 'error',
32
+ };
33
+
34
+ /**
35
+ * Spec 验证器
36
+ */
37
+ export class SpecValidator {
38
+ private static instance: SpecValidator;
39
+ private config: SpecValidatorConfig;
40
+ private schemaCache: Map<string, SpecSchemaDefinition> = new Map();
41
+
42
+ private constructor(config?: Partial<SpecValidatorConfig>) {
43
+ this.config = { ...DEFAULT_CONFIG, ...config };
44
+ }
45
+
46
+ /**
47
+ * 获取单例实例
48
+ */
49
+ static getInstance(config?: Partial<SpecValidatorConfig>): SpecValidator {
50
+ if (!SpecValidator.instance) {
51
+ SpecValidator.instance = new SpecValidator(config);
52
+ }
53
+ return SpecValidator.instance;
54
+ }
55
+
56
+ /**
57
+ * 更新配置
58
+ */
59
+ setConfig(config: Partial<SpecValidatorConfig>): void {
60
+ this.config = { ...this.config, ...config };
61
+ this.schemaCache.clear();
62
+ }
63
+
64
+ /**
65
+ * 加载项目的 Schema
66
+ *
67
+ * 支持两种方式:
68
+ * 1. 指定 schemaPath 目录,自动加载 index.ts/js
69
+ * 2. 使用 --schema 参数指定路径
70
+ */
71
+ async loadSchema(schemaPath: string): Promise<SpecSchemaDefinition | null> {
72
+ const cached = this.schemaCache.get(schemaPath);
73
+ if (cached) return cached;
74
+
75
+ const absolutePath = path.resolve(schemaPath);
76
+
77
+ try {
78
+ // 尝试加载 TypeScript/JavaScript 模块
79
+ const indexPath = path.join(absolutePath, 'index.ts');
80
+ const indexPathJs = path.join(absolutePath, 'index.js');
81
+
82
+ let schemaModule: any;
83
+
84
+ if (await this.fileExists(indexPath)) {
85
+ // 动态导入 TypeScript 模块(需要 tsx 或编译后的 .js)
86
+ schemaModule = await this.dynamicImport(indexPath);
87
+ } else if (await this.fileExists(indexPathJs)) {
88
+ schemaModule = await this.dynamicImport(indexPathJs);
89
+ } else {
90
+ // 尝试直接加载指定文件
91
+ schemaModule = await this.dynamicImport(absolutePath);
92
+ }
93
+
94
+ if (schemaModule && schemaModule.validate) {
95
+ const schema: SpecSchemaDefinition = {
96
+ name: schemaModule.name || 'custom',
97
+ version: schemaModule.version,
98
+ validate: schemaModule.validate,
99
+ };
100
+ this.schemaCache.set(schemaPath, schema);
101
+ return schema;
102
+ }
103
+
104
+ return null;
105
+ } catch (error) {
106
+ // Schema 加载失败是正常的(项目可能没有自定义 Schema)
107
+ return null;
108
+ }
109
+ }
110
+
111
+ /**
112
+ * 检测 Spec 类型
113
+ */
114
+ detectSpecType(filePath: string): SpecType {
115
+ const basename = path.basename(filePath).toLowerCase();
116
+
117
+ if (basename === 'architecture.md') {
118
+ return 'architecture';
119
+ }
120
+
121
+ if (filePath.includes('module') || filePath.includes('modules')) {
122
+ return 'module';
123
+ }
124
+
125
+ if (filePath.includes('api') || filePath.includes('apis')) {
126
+ return 'api';
127
+ }
128
+
129
+ return 'custom';
130
+ }
131
+
132
+ /**
133
+ * 验证单个文件
134
+ */
135
+ async validateFile(
136
+ filePath: string,
137
+ schema?: SpecSchemaDefinition
138
+ ): Promise<SpecValidationResult> {
139
+ const specType = this.detectSpecType(filePath);
140
+ const absolutePath = path.resolve(filePath);
141
+
142
+ // 检查文件是否存在
143
+ if (!(await this.fileExists(absolutePath))) {
144
+ return {
145
+ valid: false,
146
+ file: filePath,
147
+ type: specType,
148
+ errors: [{ path: '', message: `文件不存在: ${filePath}`, severity: 'error' }],
149
+ warnings: [],
150
+ };
151
+ }
152
+
153
+ // 如果没有传入 Schema,尝试加载项目的 Schema
154
+ let schemaToUse = schema;
155
+ if (!schemaToUse) {
156
+ const loadedSchema = await this.loadSchema(this.config.schemaPath);
157
+ schemaToUse = loadedSchema ?? undefined;
158
+ }
159
+
160
+ // 如果没有 Schema,使用基础验证
161
+ if (!schemaToUse) {
162
+ return this.basicValidation(filePath, specType);
163
+ }
164
+
165
+ // 使用项目的 Schema 验证
166
+ try {
167
+ const content = await fs.readFile(absolutePath, 'utf-8');
168
+ const result = await schemaToUse.validate(content, filePath);
169
+ return result;
170
+ } catch (error) {
171
+ return {
172
+ valid: false,
173
+ file: filePath,
174
+ type: specType,
175
+ errors: [{
176
+ path: '',
177
+ message: `验证失败: ${error instanceof Error ? error.message : String(error)}`,
178
+ severity: 'error',
179
+ }],
180
+ warnings: [],
181
+ };
182
+ }
183
+ }
184
+
185
+ /**
186
+ * 基础验证(无 Schema 时)
187
+ */
188
+ private async basicValidation(filePath: string, specType: SpecType): Promise<SpecValidationResult> {
189
+ const absolutePath = path.resolve(filePath);
190
+ const content = await fs.readFile(absolutePath, 'utf-8');
191
+ const errors: any[] = [];
192
+ const warnings: any[] = [];
193
+
194
+ // ARCHITECTURE.md 基础检查
195
+ if (specType === 'architecture') {
196
+ if (!content.includes('# ') && !content.includes('## ')) {
197
+ errors.push({
198
+ path: '',
199
+ message: 'ARCHITECTURE.md 应包含标题和章节',
200
+ severity: 'warning' as const,
201
+ });
202
+ }
203
+ }
204
+
205
+ // YAML 文件基础检查
206
+ if (filePath.endsWith('.yml') || filePath.endsWith('.yaml')) {
207
+ try {
208
+ const yaml = await import('js-yaml');
209
+ yaml.load(content);
210
+ } catch (e) {
211
+ errors.push({
212
+ path: '',
213
+ message: `YAML 解析失败: ${e instanceof Error ? e.message : String(e)}`,
214
+ severity: 'error' as const,
215
+ });
216
+ }
217
+ }
218
+
219
+ return {
220
+ valid: errors.length === 0,
221
+ file: filePath,
222
+ type: specType,
223
+ errors,
224
+ warnings,
225
+ };
226
+ }
227
+
228
+ /**
229
+ * 批量验证
230
+ */
231
+ async validateAll(
232
+ projectPath?: string,
233
+ staged?: boolean
234
+ ): Promise<BatchSpecValidationResult> {
235
+ const cwd = projectPath || process.cwd();
236
+ const results: SpecValidationResult[] = [];
237
+
238
+ // 加载项目的 Schema
239
+ const loadedSchema = await this.loadSchema(this.config.schemaPath);
240
+ const schema = loadedSchema ?? undefined;
241
+
242
+ // 获取要验证的文件
243
+ let files: string[];
244
+
245
+ if (staged) {
246
+ files = await this.getStagedFiles();
247
+ } else {
248
+ files = await this.getSpecFiles(cwd);
249
+ }
250
+
251
+ // 过滤只保留 Spec 相关文件
252
+ const specFiles = files.filter(f => this.isSpecFile(f));
253
+
254
+ // 验证每个文件
255
+ for (const file of specFiles) {
256
+ const result = await this.validateFile(file, schema);
257
+ results.push(result);
258
+ }
259
+
260
+ // 统计结果
261
+ const passed = results.filter(r => r.valid).length;
262
+ const failed = results.filter(r => !r.valid).length;
263
+ const warnings = results.reduce((sum, r) => sum + r.warnings.length, 0);
264
+
265
+ return {
266
+ total: specFiles.length,
267
+ passed,
268
+ failed,
269
+ warnings,
270
+ results,
271
+ };
272
+ }
273
+
274
+ /**
275
+ * 获取 Spec 文件
276
+ */
277
+ private async getSpecFiles(cwd: string): Promise<string[]> {
278
+ const allFiles: string[] = [];
279
+
280
+ for (const pattern of this.config.files) {
281
+ const files = await glob.glob(pattern, {
282
+ cwd,
283
+ absolute: true,
284
+ ignore: ['node_modules/**', 'dist/**', '.git/**'],
285
+ });
286
+ allFiles.push(...files);
287
+ }
288
+
289
+ return [...new Set(allFiles)];
290
+ }
291
+
292
+ /**
293
+ * 获取暂存的 Spec 文件
294
+ */
295
+ private async getStagedFiles(): Promise<string[]> {
296
+ try {
297
+ const { stdout } = await execAsync('git diff --cached --name-only');
298
+ const allFiles = stdout.trim().split('\n').filter(Boolean);
299
+ return allFiles.filter(f => this.isSpecFile(f));
300
+ } catch {
301
+ return [];
302
+ }
303
+ }
304
+
305
+ /**
306
+ * 判断是否为 Spec 文件
307
+ */
308
+ private isSpecFile(filePath: string): boolean {
309
+ const basename = path.basename(filePath).toLowerCase();
310
+
311
+ // ARCHITECTURE.md
312
+ if (basename === 'architecture.md') return true;
313
+
314
+ // specs 目录下的文件
315
+ if (filePath.includes('specs/') || filePath.includes('spec/')) return true;
316
+
317
+ // 符合配置的文件模式
318
+ for (const pattern of this.config.files) {
319
+ if (pattern.startsWith('specs/')) {
320
+ // 检查路径是否匹配
321
+ if (filePath.includes('/specs/')) return true;
322
+ }
323
+ }
324
+
325
+ return false;
326
+ }
327
+
328
+ /**
329
+ * 检查文件是否存在
330
+ */
331
+ private async fileExists(filePath: string): Promise<boolean> {
332
+ try {
333
+ await fs.access(filePath);
334
+ return true;
335
+ } catch {
336
+ return false;
337
+ }
338
+ }
339
+
340
+ /**
341
+ * 动态导入模块
342
+ */
343
+ private async dynamicImport(modulePath: string): Promise<any> {
344
+ try {
345
+ // 尝试直接导入
346
+ return await import(modulePath);
347
+ } catch {
348
+ // 如果是 TypeScript 文件,尝试加载编译后的 JS
349
+ if (modulePath.endsWith('.ts')) {
350
+ const jsPath = modulePath.replace(/\.ts$/, '.js');
351
+ try {
352
+ return await import(jsPath);
353
+ } catch {
354
+ return null;
355
+ }
356
+ }
357
+ return null;
358
+ }
359
+ }
360
+ }
361
+
362
+ /**
363
+ * 便捷函数
364
+ */
365
+ export async function validateSpec(
366
+ filePath: string,
367
+ schemaPath?: string
368
+ ): Promise<SpecValidationResult> {
369
+ const validator = SpecValidator.getInstance();
370
+ if (schemaPath) {
371
+ const loadedSchema = await validator.loadSchema(schemaPath);
372
+ return validator.validateFile(filePath, loadedSchema ?? undefined);
373
+ }
374
+ return validator.validateFile(filePath);
375
+ }
376
+
377
+ export async function validateAllSpecs(
378
+ projectPath?: string,
379
+ staged?: boolean
380
+ ): Promise<BatchSpecValidationResult> {
381
+ const validator = SpecValidator.getInstance();
382
+ return validator.validateAll(projectPath, staged);
383
+ }
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Tests for passes-gate.ts
3
+ *
4
+ * Priority: test pure logic methods (check, extractCoverage, extractFailures, extension management)
5
+ * Skip methods that do real file I/O / exec (setPasses, runTests, runTest, detectTestCommand, etc.)
6
+ */
7
+
8
+ import { PassesGate, createPassesGate } from '../passes-gate';
9
+
10
+ describe('PassesGate', () => {
11
+ describe('createPassesGate', () => {
12
+ it('creates a PassesGate instance with default config', () => {
13
+ const gate = createPassesGate();
14
+ expect(gate).toBeInstanceOf(PassesGate);
15
+ });
16
+
17
+ it('creates a PassesGate instance with custom config', () => {
18
+ const gate = createPassesGate({ enabled: false, maxRetries: 5 });
19
+ expect(gate).toBeInstanceOf(PassesGate);
20
+ });
21
+ });
22
+
23
+ describe('check()', () => {
24
+ it('returns allowed=true when test passes and evidence is not required', () => {
25
+ const gate = createPassesGate({ requireEvidence: false });
26
+ const result = gate.check({ passed: true });
27
+ expect(result.allowed).toBe(true);
28
+ expect(result.violations).toBeUndefined();
29
+ });
30
+
31
+ it('returns violations when test does not pass', () => {
32
+ const gate = createPassesGate({ requireEvidence: false });
33
+ const result = gate.check({ passed: false });
34
+ expect(result.allowed).toBe(false);
35
+ expect(result.violations).toHaveLength(1);
36
+ expect(result.violations![0].id).toBe('no_self_approval');
37
+ });
38
+
39
+ it('returns violations when evidence is missing and requireEvidence is true', () => {
40
+ const gate = createPassesGate({ requireEvidence: true });
41
+ const result = gate.check({ passed: true, evidence: undefined });
42
+ expect(result.allowed).toBe(false);
43
+ expect(result.violations).toHaveLength(1);
44
+ expect(result.violations![0].id).toBe('no_completion_without_verification');
45
+ });
46
+
47
+ it('returns both violations when test fails and evidence is missing', () => {
48
+ const gate = createPassesGate({ requireEvidence: true });
49
+ const result = gate.check({ passed: false });
50
+ expect(result.allowed).toBe(false);
51
+ expect(result.violations).toHaveLength(2);
52
+ expect(result.violations![0].id).toBe('no_self_approval');
53
+ expect(result.violations![1].id).toBe('no_completion_without_verification');
54
+ });
55
+
56
+ it('returns allowed=true when test passes and evidence is provided', () => {
57
+ const gate = createPassesGate({ requireEvidence: true });
58
+ const result = gate.check({ passed: true, evidence: '/path/to/evidence.log' });
59
+ expect(result.allowed).toBe(true);
60
+ });
61
+
62
+ it('preserves the test result in output', () => {
63
+ const gate = createPassesGate();
64
+ const testResult = { passed: true, command: 'npm test', coverage: 85 };
65
+ const result = gate.check(testResult);
66
+ expect(result.testResult).toEqual(testResult);
67
+ });
68
+ });
69
+
70
+ describe('extension management', () => {
71
+ it('registerExtension adds an extension', () => {
72
+ const gate = createPassesGate();
73
+ const ext = { name: 'e2e', run: async () => ({ passed: true, command: 'e2e' }) };
74
+ gate.registerExtension('e2e', ext);
75
+ expect(gate.getExtensionNames()).toContain('e2e');
76
+ });
77
+
78
+ it('unregisterExtension removes an extension', () => {
79
+ const gate = createPassesGate();
80
+ const ext = { name: 'e2e', run: async () => ({ passed: true, command: 'e2e' }) };
81
+ gate.registerExtension('e2e', ext);
82
+ const removed = gate.unregisterExtension('e2e');
83
+ expect(removed).toBe(true);
84
+ expect(gate.getExtensionNames()).not.toContain('e2e');
85
+ });
86
+
87
+ it('unregisterExtension returns false for non-existent extension', () => {
88
+ const gate = createPassesGate();
89
+ const removed = gate.unregisterExtension('nonexistent');
90
+ expect(removed).toBe(false);
91
+ });
92
+
93
+ it('getExtensionNames returns empty array when no extensions', () => {
94
+ const gate = createPassesGate();
95
+ expect(gate.getExtensionNames()).toEqual([]);
96
+ });
97
+
98
+ it('getExtensionNames returns multiple extension names', () => {
99
+ const gate = createPassesGate();
100
+ gate.registerExtension('a', { name: 'a', run: async () => ({ passed: true, command: 'a' }) });
101
+ gate.registerExtension('b', { name: 'b', run: async () => ({ passed: true, command: 'b' }) });
102
+ const names = gate.getExtensionNames();
103
+ expect(names).toContain('a');
104
+ expect(names).toContain('b');
105
+ expect(names).toHaveLength(2);
106
+ });
107
+ });
108
+
109
+ describe('getTestResult', () => {
110
+ it('returns undefined for unknown task', () => {
111
+ const gate = createPassesGate();
112
+ expect(gate.getTestResult('unknown')).toBeUndefined();
113
+ });
114
+ });
115
+
116
+ describe('extractCoverage (via extractCoverage private method behavior check)', () => {
117
+ // extractCoverage is private but we can infer behavior through public API
118
+ // runTest uses it internally — but that method is not easily testable without mocking exec
119
+ it('PassesGate instance is properly constructed', () => {
120
+ const gate = createPassesGate({ testCommand: 'npm test' });
121
+ expect(gate).toBeInstanceOf(PassesGate);
122
+ });
123
+ });
124
+
125
+ describe('extractFailures (via extractFailures private method behavior check)', () => {
126
+ it('PassesGate handles config properly', () => {
127
+ const gate = createPassesGate({ allowPartialPass: true, maxRetries: 0, retryDelay: 0 });
128
+ expect(gate).toBeInstanceOf(PassesGate);
129
+ });
130
+ });
131
+ });