@dommaker/harness 1.10.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/cli/commands/constraints-pack-proposal.d.ts +48 -0
  3. package/dist/cli/commands/constraints-pack-proposal.d.ts.map +1 -0
  4. package/dist/cli/commands/constraints-pack-proposal.js +169 -0
  5. package/dist/cli/commands/constraints-pack-proposal.js.map +1 -0
  6. package/dist/cli/commands/constraints-reactivate.d.ts +55 -0
  7. package/dist/cli/commands/constraints-reactivate.d.ts.map +1 -0
  8. package/dist/cli/commands/constraints-reactivate.js +175 -0
  9. package/dist/cli/commands/constraints-reactivate.js.map +1 -0
  10. package/dist/cli/commands/constraints-report.d.ts +12 -1
  11. package/dist/cli/commands/constraints-report.d.ts.map +1 -1
  12. package/dist/cli/commands/constraints-report.js +35 -2
  13. package/dist/cli/commands/constraints-report.js.map +1 -1
  14. package/dist/cli/commands/constraints-retire.d.ts +49 -4
  15. package/dist/cli/commands/constraints-retire.d.ts.map +1 -1
  16. package/dist/cli/commands/constraints-retire.js +116 -34
  17. package/dist/cli/commands/constraints-retire.js.map +1 -1
  18. package/dist/cli/commands/definitions.d.ts.map +1 -1
  19. package/dist/cli/commands/definitions.js +36 -11
  20. package/dist/cli/commands/definitions.js.map +1 -1
  21. package/dist/cli/commands/knowledge-view.d.ts +6 -3
  22. package/dist/cli/commands/knowledge-view.d.ts.map +1 -1
  23. package/dist/cli/commands/knowledge-view.js +8 -26
  24. package/dist/cli/commands/knowledge-view.js.map +1 -1
  25. package/dist/cli/commands/report.d.ts.map +1 -1
  26. package/dist/cli/commands/report.js +9 -5
  27. package/dist/cli/commands/report.js.map +1 -1
  28. package/dist/cli/commands/scaffold-templates.d.ts +1 -1
  29. package/dist/cli/commands/scaffold-templates.d.ts.map +1 -1
  30. package/dist/cli/commands/scaffold-templates.js +0 -16
  31. package/dist/cli/commands/scaffold-templates.js.map +1 -1
  32. package/dist/cli/state-io.d.ts +8 -1
  33. package/dist/cli/state-io.d.ts.map +1 -1
  34. package/dist/cli/state-io.js +2 -1
  35. package/dist/cli/state-io.js.map +1 -1
  36. package/dist/core/app-constraints-loader.d.ts +28 -0
  37. package/dist/core/app-constraints-loader.d.ts.map +1 -0
  38. package/dist/core/app-constraints-loader.js +187 -0
  39. package/dist/core/app-constraints-loader.js.map +1 -0
  40. package/dist/core/constraints/checker.js +1 -1
  41. package/dist/core/constraints/checker.js.map +1 -1
  42. package/dist/core/constraints/checkers/index.d.ts +20 -9
  43. package/dist/core/constraints/checkers/index.d.ts.map +1 -1
  44. package/dist/core/constraints/checkers/index.js +40 -11
  45. package/dist/core/constraints/checkers/index.js.map +1 -1
  46. package/dist/core/constraints/checkers/templated/file-exists.d.ts +16 -0
  47. package/dist/core/constraints/checkers/templated/file-exists.d.ts.map +1 -0
  48. package/dist/core/constraints/checkers/templated/file-exists.js +108 -0
  49. package/dist/core/constraints/checkers/templated/file-exists.js.map +1 -0
  50. package/dist/core/constraints/checkers/templated/glob.d.ts +10 -0
  51. package/dist/core/constraints/checkers/templated/glob.d.ts.map +1 -0
  52. package/dist/core/constraints/checkers/templated/glob.js +51 -0
  53. package/dist/core/constraints/checkers/templated/glob.js.map +1 -0
  54. package/dist/core/constraints/checkers/templated/index.d.ts +12 -0
  55. package/dist/core/constraints/checkers/templated/index.d.ts.map +1 -0
  56. package/dist/core/constraints/checkers/templated/index.js +17 -0
  57. package/dist/core/constraints/checkers/templated/index.js.map +1 -0
  58. package/dist/core/constraints/checkers/templated/regex-scan.d.ts +15 -0
  59. package/dist/core/constraints/checkers/templated/regex-scan.d.ts.map +1 -0
  60. package/dist/core/constraints/checkers/templated/regex-scan.js +129 -0
  61. package/dist/core/constraints/checkers/templated/regex-scan.js.map +1 -0
  62. package/dist/core/constraints/checkers/templates-registry.d.ts +17 -0
  63. package/dist/core/constraints/checkers/templates-registry.d.ts.map +1 -0
  64. package/dist/core/constraints/checkers/templates-registry.js +23 -0
  65. package/dist/core/constraints/checkers/templates-registry.js.map +1 -0
  66. package/dist/core/constraints/checkers/types.d.ts +14 -0
  67. package/dist/core/constraints/checkers/types.d.ts.map +1 -1
  68. package/dist/core/constraints/checkers/types.js.map +1 -1
  69. package/dist/core/constraints/definitions/guidelines.d.ts.map +1 -1
  70. package/dist/core/constraints/definitions/guidelines.js +0 -14
  71. package/dist/core/constraints/definitions/guidelines.js.map +1 -1
  72. package/dist/core/constraints/definitions/iron-laws.d.ts.map +1 -1
  73. package/dist/core/constraints/definitions/iron-laws.js +15 -0
  74. package/dist/core/constraints/definitions/iron-laws.js.map +1 -1
  75. package/dist/core/constraints/usage-report.d.ts +59 -7
  76. package/dist/core/constraints/usage-report.d.ts.map +1 -1
  77. package/dist/core/constraints/usage-report.js +62 -13
  78. package/dist/core/constraints/usage-report.js.map +1 -1
  79. package/dist/core/project-config-loader.d.ts +9 -6
  80. package/dist/core/project-config-loader.d.ts.map +1 -1
  81. package/dist/core/project-config-loader.js +18 -8
  82. package/dist/core/project-config-loader.js.map +1 -1
  83. package/dist/gates/command.d.ts.map +1 -1
  84. package/dist/gates/command.js +50 -0
  85. package/dist/gates/command.js.map +1 -1
  86. package/dist/index.d.ts +2 -0
  87. package/dist/index.d.ts.map +1 -1
  88. package/dist/index.js +14 -2
  89. package/dist/index.js.map +1 -1
  90. package/dist/knowledge/lifecycle.d.ts +14 -0
  91. package/dist/knowledge/lifecycle.d.ts.map +1 -1
  92. package/dist/knowledge/lifecycle.js +50 -0
  93. package/dist/knowledge/lifecycle.js.map +1 -1
  94. package/dist/knowledge/lint.d.ts +17 -0
  95. package/dist/knowledge/lint.d.ts.map +1 -1
  96. package/dist/knowledge/lint.js +52 -0
  97. package/dist/knowledge/lint.js.map +1 -1
  98. package/dist/knowledge/store.d.ts +7 -0
  99. package/dist/knowledge/store.d.ts.map +1 -1
  100. package/dist/knowledge/store.js +48 -13
  101. package/dist/knowledge/store.js.map +1 -1
  102. package/dist/knowledge/types.d.ts +5 -1
  103. package/dist/knowledge/types.d.ts.map +1 -1
  104. package/dist/knowledge/types.js +5 -1
  105. package/dist/knowledge/types.js.map +1 -1
  106. package/dist/presets/standard.d.ts +1 -1
  107. package/dist/presets/standard.d.ts.map +1 -1
  108. package/dist/presets/standard.js +2 -3
  109. package/dist/presets/standard.js.map +1 -1
  110. package/dist/types/constraint.d.ts +24 -0
  111. package/dist/types/constraint.d.ts.map +1 -1
  112. package/dist/types/constraint.js.map +1 -1
  113. package/package.json +1 -1
  114. package/src/__tests__/app-constraints-loader.test.ts +220 -0
  115. package/src/__tests__/iron-laws.test.ts +5 -5
  116. package/src/__tests__/public-exports.test.ts +7 -0
  117. package/src/__tests__/public-type-surface.test.ts +5 -0
  118. package/src/__tests__/usage-report-public-export.test.ts +21 -0
  119. package/src/cli/commands/CONTEXT.md +5 -4
  120. package/src/cli/commands/__tests__/check.test.ts +22 -4
  121. package/src/cli/commands/__tests__/constraints-pack-proposal.test.ts +142 -0
  122. package/src/cli/commands/__tests__/constraints-reactivate.test.ts +210 -0
  123. package/src/cli/commands/__tests__/constraints-report-json-flag.test.ts +101 -0
  124. package/src/cli/commands/__tests__/constraints-report.test.ts +175 -6
  125. package/src/cli/commands/__tests__/constraints-retire.test.ts +135 -10
  126. package/src/cli/commands/__tests__/init-ondisk.test.ts +1 -1
  127. package/src/cli/commands/__tests__/init.test.ts +1 -5
  128. package/src/cli/commands/__tests__/knowledge.test.ts +6 -16
  129. package/src/cli/commands/__tests__/numeric-flag-assembly.test.ts +1 -1
  130. package/src/cli/commands/__tests__/passes-gate-dead-options.test.ts +1 -1
  131. package/src/cli/commands/__tests__/registry.test.ts +1 -1
  132. package/src/cli/commands/__tests__/report-app-constraints.test.ts +67 -0
  133. package/src/cli/commands/constraints-pack-proposal.ts +172 -0
  134. package/src/cli/commands/constraints-reactivate.ts +197 -0
  135. package/src/cli/commands/constraints-report.ts +44 -2
  136. package/src/cli/commands/constraints-retire.ts +129 -36
  137. package/src/cli/commands/definitions.ts +36 -11
  138. package/src/cli/commands/knowledge-view.ts +9 -28
  139. package/src/cli/commands/report.ts +9 -5
  140. package/src/cli/commands/scaffold-templates.ts +0 -16
  141. package/src/cli/state-io.ts +8 -1
  142. package/src/core/CONTEXT.md +5 -4
  143. package/src/core/app-constraints-loader.ts +165 -0
  144. package/src/core/constraints/__tests__/collect-constraints.test.ts +3 -1
  145. package/src/core/constraints/__tests__/usage-report.test.ts +63 -0
  146. package/src/core/constraints/checker.ts +1 -1
  147. package/src/core/constraints/checkers/__tests__/templated-checkers.test.ts +180 -0
  148. package/src/core/constraints/checkers/__tests__/templates-registry.test.ts +81 -0
  149. package/src/core/constraints/checkers/index.ts +44 -10
  150. package/src/core/constraints/checkers/templated/file-exists.ts +75 -0
  151. package/src/core/constraints/checkers/templated/glob.ts +46 -0
  152. package/src/core/constraints/checkers/templated/index.ts +12 -0
  153. package/src/core/constraints/checkers/templated/regex-scan.ts +132 -0
  154. package/src/core/constraints/checkers/templates-registry.ts +22 -0
  155. package/src/core/constraints/checkers/types.ts +15 -0
  156. package/src/core/constraints/definitions/guidelines.ts +0 -15
  157. package/src/core/constraints/definitions/iron-laws.ts +16 -0
  158. package/src/core/constraints/usage-report.ts +129 -14
  159. package/src/core/project-config-loader.ts +19 -8
  160. package/src/gates/__tests__/command.test.ts +54 -0
  161. package/src/gates/command.ts +51 -0
  162. package/src/index.ts +20 -0
  163. package/src/knowledge/CONTEXT.md +7 -4
  164. package/src/knowledge/__tests__/lifecycle.test.ts +81 -0
  165. package/src/knowledge/__tests__/lint.test.ts +84 -0
  166. package/src/knowledge/__tests__/store.test.ts +70 -0
  167. package/src/knowledge/lifecycle.ts +49 -0
  168. package/src/knowledge/lint.ts +60 -1
  169. package/src/knowledge/store.ts +48 -11
  170. package/src/knowledge/types.ts +7 -1
  171. package/src/monitoring/CONTEXT.md +1 -1
  172. package/src/presets/__tests__/standard.test.ts +5 -4
  173. package/src/presets/standard.ts +2 -3
  174. package/src/types/constraint.ts +28 -0
  175. package/dist/cli/commands/posteval-plan.d.ts +0 -15
  176. package/dist/cli/commands/posteval-plan.d.ts.map +0 -1
  177. package/dist/cli/commands/posteval-plan.js +0 -86
  178. package/dist/cli/commands/posteval-plan.js.map +0 -1
  179. package/src/cli/commands/__tests__/posteval-plan.test.ts +0 -204
  180. package/src/cli/commands/posteval-plan.ts +0 -98
@@ -1,98 +0,0 @@
1
- /**
2
- * harness posteval-plan 命令
3
- *
4
- * 调用 Studio PostEval API,验证 plan 文件的 checklist items 是否都有对应的 staged diff。
5
- * pre-commit hook 使用此命令防止"假装完成"。
6
- *
7
- * 判定经返回值外溢(架构评审候选7):API 不可用/5xx 属"未判定"→ skip(退出码面 0 不变);
8
- * 覆盖率不足与 4xx → fail,reason 指明是哪一项否决。
9
- */
10
-
11
- import chalk from 'chalk';
12
- import { log, logError, processIO, type CommandIO, type CommandResult } from '../command-contract';
13
-
14
- export interface PostEvalPlanOptions {
15
- planPath: string;
16
- }
17
-
18
- const MAX_RETRIES = 3;
19
- const RETRY_DELAY_MS = 2000;
20
-
21
- async function fetchWithRetry(url: string, body: string, retries: number): Promise<Response> {
22
- let lastError: any;
23
- for (let i = 0; i < retries; i++) {
24
- try {
25
- const controller = new AbortController();
26
- const timeout = setTimeout(() => controller.abort(), 5000);
27
- const res = await fetch(url, {
28
- method: 'POST',
29
- headers: { 'Content-Type': 'application/json' },
30
- body,
31
- signal: controller.signal,
32
- });
33
- clearTimeout(timeout);
34
- return res;
35
- } catch (error: any) {
36
- lastError = error;
37
- if (i < retries - 1) {
38
- await new Promise(resolve => setTimeout(resolve, RETRY_DELAY_MS * (i + 1))); // exponential backoff
39
- }
40
- }
41
- }
42
- throw lastError;
43
- }
44
-
45
- export async function postevalPlan(
46
- options: PostEvalPlanOptions,
47
- io: CommandIO = processIO,
48
- ): Promise<CommandResult> {
49
- const apiPort = process.env.API_PORT || '3001';
50
- const url = `http://localhost:${apiPort}/api/v1/agents/post-eval/plan-coverage`;
51
-
52
- try {
53
- const res = await fetchWithRetry(url, JSON.stringify({ planPath: options.planPath }), MAX_RETRIES);
54
-
55
- if (!res.ok) {
56
- if (res.status >= 500) {
57
- // Server error — allow commit with warning (don't block on infrastructure failure)
58
- logError(io, chalk.yellow(`⚠️ PostEval API unavailable (${res.status}), allowing commit with warning`));
59
- logError(io, chalk.yellow(` Plan: ${options.planPath}`));
60
- return { kind: 'skip', reason: `PostEval API 服务端错误 ${res.status},未判定` };
61
- }
62
- logError(io, chalk.red(`❌ PostEval API error: ${res.status} ${res.statusText}`));
63
- return { kind: 'fail', reason: `PostEval API error: ${res.status} ${res.statusText}` };
64
- }
65
-
66
- const report = await res.json() as {
67
- completeness: number;
68
- matchedAcs: string[];
69
- missedAcs: string[];
70
- };
71
-
72
- const pct = Math.round(report.completeness * 100);
73
-
74
- if (report.completeness < 1) {
75
- logError(io, chalk.red(`❌ Plan coverage: ${pct}% (${report.matchedAcs.length}/${report.matchedAcs.length + report.missedAcs.length})`));
76
- if (report.missedAcs.length > 0) {
77
- logError(io, chalk.red('Missed items:'));
78
- report.missedAcs.forEach((item: string) => logError(io, chalk.red(` - ${item}`)));
79
- }
80
- return {
81
- kind: 'fail',
82
- reason: `plan coverage ${pct}% < 100%,缺 ${report.missedAcs.length} 项: ${report.missedAcs.join('; ')}`,
83
- };
84
- }
85
-
86
- log(io, chalk.green(`✅ Plan coverage: ${pct}%`));
87
- return { kind: 'ok' };
88
- } catch (error: any) {
89
- // API unreachable after all retries — allow with warning (don't block commits on infra)
90
- logError(io, chalk.yellow(`⚠️ Studio API unreachable after ${MAX_RETRIES} retries, allowing commit with warning`));
91
- logError(io, chalk.yellow(` Plan: ${options.planPath}`));
92
- logError(io, chalk.yellow(` Error: ${error?.code || error?.message || String(error)}`));
93
- return {
94
- kind: 'skip',
95
- reason: `Studio API 不可达(${error?.code || error?.message || String(error)}),未判定`,
96
- };
97
- }
98
- }