@dommaker/harness 0.19.0 → 1.0.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 (348) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/bin/harness.js +136 -557
  3. package/dist/cli/commands/check.d.ts.map +1 -1
  4. package/dist/cli/commands/check.js +2 -13
  5. package/dist/cli/commands/check.js.map +1 -1
  6. package/dist/cli/commands/definitions.d.ts +90 -0
  7. package/dist/cli/commands/definitions.d.ts.map +1 -0
  8. package/dist/cli/commands/definitions.js +519 -0
  9. package/dist/cli/commands/definitions.js.map +1 -0
  10. package/dist/cli/commands/knowledge.js.map +1 -1
  11. package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts +3 -25
  12. package/dist/cli/commands/sync-docs/capabilities-syncer.d.ts.map +1 -1
  13. package/dist/cli/commands/sync-docs/capabilities-syncer.js +3 -93
  14. package/dist/cli/commands/sync-docs/capabilities-syncer.js.map +1 -1
  15. package/dist/cli/commands/sync-docs/index.d.ts +1 -1
  16. package/dist/cli/commands/sync-docs/index.d.ts.map +1 -1
  17. package/dist/cli/commands/sync-docs/index.js +4 -4
  18. package/dist/cli/commands/sync-docs/index.js.map +1 -1
  19. package/dist/context/index.d.ts +1 -5
  20. package/dist/context/index.d.ts.map +1 -1
  21. package/dist/context/index.js +1 -5
  22. package/dist/context/index.js.map +1 -1
  23. package/dist/context/knowledge-injector.d.ts +3 -3
  24. package/dist/context/knowledge-injector.d.ts.map +1 -1
  25. package/dist/context/knowledge-injector.js +1 -1
  26. package/dist/context/session-manager.d.ts +1 -12
  27. package/dist/context/session-manager.d.ts.map +1 -1
  28. package/dist/context/session-manager.js +0 -63
  29. package/dist/context/session-manager.js.map +1 -1
  30. package/dist/context/types.d.ts +1 -39
  31. package/dist/context/types.d.ts.map +1 -1
  32. package/dist/context/types.js +2 -15
  33. package/dist/context/types.js.map +1 -1
  34. package/dist/core/constraints/agent-prompt-renderer.d.ts +1 -1
  35. package/dist/core/constraints/agent-prompt-renderer.js +1 -1
  36. package/dist/core/constraints/capabilities-parser.d.ts +17 -2
  37. package/dist/core/constraints/capabilities-parser.d.ts.map +1 -1
  38. package/dist/core/constraints/capabilities-parser.js +84 -2
  39. package/dist/core/constraints/capabilities-parser.js.map +1 -1
  40. package/dist/core/constraints/checker.d.ts +3 -17
  41. package/dist/core/constraints/checker.d.ts.map +1 -1
  42. package/dist/core/constraints/checker.js +7 -47
  43. package/dist/core/constraints/checker.js.map +1 -1
  44. package/dist/core/constraints/definitions.d.ts +0 -7
  45. package/dist/core/constraints/definitions.d.ts.map +1 -1
  46. package/dist/core/constraints/definitions.js +1 -8
  47. package/dist/core/constraints/definitions.js.map +1 -1
  48. package/dist/core/constraints/doc-freshness/runner.d.ts +0 -2
  49. package/dist/core/constraints/doc-freshness/runner.d.ts.map +1 -1
  50. package/dist/core/constraints/doc-freshness/runner.js.map +1 -1
  51. package/dist/core/constraints/index.d.ts +1 -1
  52. package/dist/core/constraints/index.d.ts.map +1 -1
  53. package/dist/core/constraints/index.js +2 -3
  54. package/dist/core/constraints/index.js.map +1 -1
  55. package/dist/core/constraints/interceptor.d.ts.map +1 -1
  56. package/dist/core/constraints/interceptor.js +1 -5
  57. package/dist/core/constraints/interceptor.js.map +1 -1
  58. package/dist/core/effective-constraints.d.ts.map +1 -1
  59. package/dist/core/effective-constraints.js +0 -1
  60. package/dist/core/effective-constraints.js.map +1 -1
  61. package/dist/core/project-config-loader.d.ts.map +1 -1
  62. package/dist/core/project-config-loader.js +1 -8
  63. package/dist/core/project-config-loader.js.map +1 -1
  64. package/dist/dashboard/stats.d.ts.map +1 -1
  65. package/dist/dashboard/stats.js.map +1 -1
  66. package/dist/dashboard/types.d.ts +2 -2
  67. package/dist/dashboard/types.d.ts.map +1 -1
  68. package/dist/failure/constraint-handler.d.ts.map +1 -1
  69. package/dist/failure/constraint-handler.js +0 -2
  70. package/dist/failure/constraint-handler.js.map +1 -1
  71. package/dist/gates/acceptance.d.ts +9 -1
  72. package/dist/gates/acceptance.d.ts.map +1 -1
  73. package/dist/gates/acceptance.js +21 -0
  74. package/dist/gates/acceptance.js.map +1 -1
  75. package/dist/gates/checker-gate.d.ts +23 -0
  76. package/dist/gates/checker-gate.d.ts.map +1 -0
  77. package/dist/gates/checker-gate.js +53 -0
  78. package/dist/gates/checker-gate.js.map +1 -0
  79. package/dist/gates/command.d.ts +9 -2
  80. package/dist/gates/command.d.ts.map +1 -1
  81. package/dist/gates/command.js +10 -0
  82. package/dist/gates/command.js.map +1 -1
  83. package/dist/gates/contract.d.ts +8 -2
  84. package/dist/gates/contract.d.ts.map +1 -1
  85. package/dist/gates/contract.js +9 -0
  86. package/dist/gates/contract.js.map +1 -1
  87. package/dist/gates/decision.d.ts +17 -0
  88. package/dist/gates/decision.d.ts.map +1 -0
  89. package/dist/gates/decision.js +25 -0
  90. package/dist/gates/decision.js.map +1 -0
  91. package/dist/gates/definitions.d.ts +63 -0
  92. package/dist/gates/definitions.d.ts.map +1 -0
  93. package/dist/gates/definitions.js +160 -0
  94. package/dist/gates/definitions.js.map +1 -0
  95. package/dist/gates/effective-gates.d.ts +30 -0
  96. package/dist/gates/effective-gates.d.ts.map +1 -0
  97. package/dist/gates/effective-gates.js +85 -0
  98. package/dist/gates/effective-gates.js.map +1 -0
  99. package/dist/gates/index.d.ts +25 -1
  100. package/dist/gates/index.d.ts.map +1 -1
  101. package/dist/gates/index.js +37 -1
  102. package/dist/gates/index.js.map +1 -1
  103. package/dist/gates/performance.d.ts +8 -2
  104. package/dist/gates/performance.d.ts.map +1 -1
  105. package/dist/gates/performance.js +9 -0
  106. package/dist/gates/performance.js.map +1 -1
  107. package/dist/gates/registry.d.ts +32 -0
  108. package/dist/gates/registry.d.ts.map +1 -0
  109. package/dist/gates/registry.js +90 -0
  110. package/dist/gates/registry.js.map +1 -0
  111. package/dist/gates/review.d.ts +8 -2
  112. package/dist/gates/review.d.ts.map +1 -1
  113. package/dist/gates/review.js +9 -0
  114. package/dist/gates/review.js.map +1 -1
  115. package/dist/gates/runner.d.ts +30 -0
  116. package/dist/gates/runner.d.ts.map +1 -0
  117. package/dist/gates/runner.js +38 -0
  118. package/dist/gates/runner.js.map +1 -0
  119. package/dist/gates/security.d.ts +8 -2
  120. package/dist/gates/security.d.ts.map +1 -1
  121. package/dist/gates/security.js +9 -0
  122. package/dist/gates/security.js.map +1 -1
  123. package/dist/gates/types.d.ts +41 -1
  124. package/dist/gates/types.d.ts.map +1 -1
  125. package/dist/hooks/bootstrap.d.ts.map +1 -1
  126. package/dist/hooks/bootstrap.js +0 -2
  127. package/dist/hooks/bootstrap.js.map +1 -1
  128. package/dist/hooks/config.d.ts +26 -0
  129. package/dist/hooks/config.d.ts.map +1 -0
  130. package/dist/hooks/config.js +30 -0
  131. package/dist/hooks/config.js.map +1 -0
  132. package/dist/hooks/index.d.ts +2 -1
  133. package/dist/hooks/index.d.ts.map +1 -1
  134. package/dist/hooks/index.js +4 -1
  135. package/dist/hooks/index.js.map +1 -1
  136. package/dist/hooks/registry.d.ts +18 -1
  137. package/dist/hooks/registry.d.ts.map +1 -1
  138. package/dist/hooks/registry.js +45 -0
  139. package/dist/hooks/registry.js.map +1 -1
  140. package/dist/hooks/types.d.ts +20 -0
  141. package/dist/hooks/types.d.ts.map +1 -1
  142. package/dist/index.d.ts +4 -8
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +5 -20
  145. package/dist/index.js.map +1 -1
  146. package/dist/knowledge/import.d.ts +2 -2
  147. package/dist/knowledge/import.d.ts.map +1 -1
  148. package/dist/knowledge/ingest.js.map +1 -1
  149. package/dist/knowledge/lifecycle-hooks.d.ts +2 -2
  150. package/dist/knowledge/lifecycle-hooks.d.ts.map +1 -1
  151. package/dist/knowledge/types.d.ts +5 -7
  152. package/dist/knowledge/types.d.ts.map +1 -1
  153. package/dist/knowledge/types.js +1 -1
  154. package/dist/knowledge/types.js.map +1 -1
  155. package/dist/monitoring/constraint-doctor.d.ts +4 -22
  156. package/dist/monitoring/constraint-doctor.d.ts.map +1 -1
  157. package/dist/monitoring/constraint-doctor.js +7 -94
  158. package/dist/monitoring/constraint-doctor.js.map +1 -1
  159. package/dist/presets/standard.d.ts +1 -1
  160. package/dist/presets/standard.d.ts.map +1 -1
  161. package/dist/presets/standard.js +1 -2
  162. package/dist/presets/standard.js.map +1 -1
  163. package/dist/spec/annotation-checker.d.ts.map +1 -1
  164. package/dist/spec/annotation-checker.js +6 -26
  165. package/dist/spec/annotation-checker.js.map +1 -1
  166. package/dist/tools/index.d.ts +0 -4
  167. package/dist/tools/index.d.ts.map +1 -1
  168. package/dist/tools/index.js +0 -4
  169. package/dist/tools/index.js.map +1 -1
  170. package/dist/types/constraint.d.ts +1 -12
  171. package/dist/types/constraint.d.ts.map +1 -1
  172. package/dist/types/constraint.js +0 -3
  173. package/dist/types/constraint.js.map +1 -1
  174. package/dist/types/project-config.d.ts +0 -2
  175. package/dist/types/project-config.d.ts.map +1 -1
  176. package/dist/utils/file-walk.d.ts +2 -2
  177. package/dist/utils/file-walk.js +2 -2
  178. package/package.json +6 -1
  179. package/src/CONTEXT.md +14 -0
  180. package/src/__tests__/checker-extra.test.ts +2 -59
  181. package/src/__tests__/constraint-doctor.test.ts +1 -140
  182. package/src/__tests__/constraint-handler.test.ts +0 -4
  183. package/src/__tests__/project-config-loader-extra.test.ts +0 -20
  184. package/src/__tests__/project-config-loader.test.ts +0 -1
  185. package/src/cli/commands/CONTEXT.md +15 -7
  186. package/src/cli/commands/__tests__/check-drift.test.ts +0 -3
  187. package/src/cli/commands/__tests__/check-skip-output.test.ts +0 -5
  188. package/src/cli/commands/__tests__/check.test.ts +7 -75
  189. package/src/cli/commands/__tests__/registry.test.ts +201 -0
  190. package/src/cli/commands/check.ts +2 -14
  191. package/src/cli/commands/definitions.ts +593 -0
  192. package/src/cli/commands/knowledge.ts +3 -3
  193. package/src/cli/commands/sync-docs/capabilities-syncer.ts +4 -110
  194. package/src/cli/commands/sync-docs/index.ts +8 -5
  195. package/src/context/CONTEXT.md +2 -7
  196. package/src/context/__tests__/session-manager.test.ts +0 -91
  197. package/src/context/index.ts +1 -5
  198. package/src/context/knowledge-injector.ts +3 -3
  199. package/src/context/session-manager.ts +0 -74
  200. package/src/context/types.ts +2 -63
  201. package/src/core/constraints/__tests__/interceptor.test.ts +0 -2
  202. package/src/core/constraints/agent-prompt-renderer.ts +1 -1
  203. package/src/core/constraints/capabilities-parser.ts +95 -2
  204. package/src/core/constraints/checker.ts +8 -53
  205. package/src/core/constraints/definitions.ts +0 -8
  206. package/src/core/constraints/doc-freshness/runner.ts +1 -2
  207. package/src/core/constraints/index.ts +1 -2
  208. package/src/core/constraints/interceptor.ts +1 -6
  209. package/src/core/effective-constraints.ts +0 -1
  210. package/src/core/project-config-loader.ts +1 -7
  211. package/src/dashboard/stats.ts +2 -2
  212. package/src/dashboard/types.ts +2 -2
  213. package/src/failure/constraint-handler.ts +0 -2
  214. package/src/gates/CONTEXT.md +16 -13
  215. package/src/gates/__tests__/checker-gate.test.ts +45 -0
  216. package/src/gates/__tests__/contract.test.ts +73 -0
  217. package/src/gates/__tests__/effective-gates.test.ts +82 -0
  218. package/src/gates/__tests__/gate-interface.test.ts +202 -0
  219. package/src/gates/__tests__/registry.test.ts +87 -0
  220. package/src/gates/__tests__/runner.test.ts +81 -0
  221. package/src/gates/acceptance.ts +24 -1
  222. package/src/gates/checker-gate.ts +54 -0
  223. package/src/gates/command.ts +13 -2
  224. package/src/gates/contract.ts +12 -2
  225. package/src/gates/decision.ts +27 -0
  226. package/src/gates/definitions.ts +207 -0
  227. package/src/gates/effective-gates.ts +106 -0
  228. package/src/gates/index.ts +38 -0
  229. package/src/gates/performance.ts +12 -2
  230. package/src/gates/registry.ts +107 -0
  231. package/src/gates/review.ts +12 -2
  232. package/src/gates/runner.ts +57 -0
  233. package/src/gates/security.ts +12 -2
  234. package/src/gates/types.ts +48 -1
  235. package/src/hooks/CONTEXT.md +12 -2
  236. package/src/hooks/__tests__/bootstrap.test.ts +0 -1
  237. package/src/hooks/__tests__/config.test.ts +19 -0
  238. package/src/hooks/__tests__/pipeline.test.ts +79 -0
  239. package/src/hooks/__tests__/registry.test.ts +67 -0
  240. package/src/hooks/bootstrap.ts +0 -2
  241. package/src/hooks/config.ts +29 -0
  242. package/src/hooks/index.ts +2 -1
  243. package/src/hooks/registry.ts +60 -1
  244. package/src/hooks/types.ts +21 -0
  245. package/src/index.ts +5 -22
  246. package/src/knowledge/import.ts +3 -3
  247. package/src/knowledge/ingest.ts +4 -4
  248. package/src/knowledge/lifecycle-hooks.ts +3 -3
  249. package/src/knowledge/types.ts +5 -8
  250. package/src/monitoring/constraint-doctor.ts +7 -106
  251. package/src/presets/__tests__/standard.test.ts +0 -2
  252. package/src/presets/standard.ts +1 -2
  253. package/src/spec/__tests__/annotation-checker.test.ts +9 -3
  254. package/src/spec/annotation-checker.ts +7 -29
  255. package/src/tools/CONTEXT.md +7 -14
  256. package/src/tools/index.ts +0 -4
  257. package/src/types/constraint.ts +1 -14
  258. package/src/types/project-config.ts +0 -3
  259. package/src/utils/file-walk.ts +2 -2
  260. package/dist/architecture/constraint-engine.d.ts +0 -67
  261. package/dist/architecture/constraint-engine.d.ts.map +0 -1
  262. package/dist/architecture/constraint-engine.js +0 -295
  263. package/dist/architecture/constraint-engine.js.map +0 -1
  264. package/dist/architecture/cross-project-checker.d.ts +0 -54
  265. package/dist/architecture/cross-project-checker.d.ts.map +0 -1
  266. package/dist/architecture/cross-project-checker.js +0 -467
  267. package/dist/architecture/cross-project-checker.js.map +0 -1
  268. package/dist/cli/commands/index.d.ts +0 -30
  269. package/dist/cli/commands/index.d.ts.map +0 -1
  270. package/dist/cli/commands/index.js +0 -91
  271. package/dist/cli/commands/index.js.map +0 -1
  272. package/dist/context/file-budget.d.ts +0 -40
  273. package/dist/context/file-budget.d.ts.map +0 -1
  274. package/dist/context/file-budget.js +0 -147
  275. package/dist/context/file-budget.js.map +0 -1
  276. package/dist/context/progressive-loader.d.ts +0 -109
  277. package/dist/context/progressive-loader.d.ts.map +0 -1
  278. package/dist/context/progressive-loader.js +0 -166
  279. package/dist/context/progressive-loader.js.map +0 -1
  280. package/dist/context/token-pipeline.d.ts +0 -55
  281. package/dist/context/token-pipeline.d.ts.map +0 -1
  282. package/dist/context/token-pipeline.js +0 -220
  283. package/dist/context/token-pipeline.js.map +0 -1
  284. package/dist/context/tool-output-budget.d.ts +0 -59
  285. package/dist/context/tool-output-budget.d.ts.map +0 -1
  286. package/dist/context/tool-output-budget.js +0 -177
  287. package/dist/context/tool-output-budget.js.map +0 -1
  288. package/dist/core/constraints/default-executors.d.ts +0 -10
  289. package/dist/core/constraints/default-executors.d.ts.map +0 -1
  290. package/dist/core/constraints/default-executors.js +0 -120
  291. package/dist/core/constraints/default-executors.js.map +0 -1
  292. package/dist/llm/adapter.d.ts +0 -36
  293. package/dist/llm/adapter.d.ts.map +0 -1
  294. package/dist/llm/adapter.js +0 -118
  295. package/dist/llm/adapter.js.map +0 -1
  296. package/dist/llm/index.d.ts +0 -3
  297. package/dist/llm/index.d.ts.map +0 -1
  298. package/dist/llm/index.js +0 -19
  299. package/dist/llm/index.js.map +0 -1
  300. package/dist/llm/types.d.ts +0 -62
  301. package/dist/llm/types.d.ts.map +0 -1
  302. package/dist/llm/types.js +0 -8
  303. package/dist/llm/types.js.map +0 -1
  304. package/dist/tools/core/index.d.ts +0 -13
  305. package/dist/tools/core/index.d.ts.map +0 -1
  306. package/dist/tools/core/index.js +0 -198
  307. package/dist/tools/core/index.js.map +0 -1
  308. package/dist/tools/loader.d.ts +0 -21
  309. package/dist/tools/loader.d.ts.map +0 -1
  310. package/dist/tools/loader.js +0 -199
  311. package/dist/tools/loader.js.map +0 -1
  312. package/dist/tools/registry.d.ts +0 -59
  313. package/dist/tools/registry.d.ts.map +0 -1
  314. package/dist/tools/registry.js +0 -115
  315. package/dist/tools/registry.js.map +0 -1
  316. package/dist/tools/types.d.ts +0 -38
  317. package/dist/tools/types.d.ts.map +0 -1
  318. package/dist/tools/types.js +0 -6
  319. package/dist/tools/types.js.map +0 -1
  320. package/src/__tests__/architecture-engine.test.ts +0 -619
  321. package/src/__tests__/context/progressive-loader.test.ts +0 -131
  322. package/src/__tests__/cross-project-checker.test.ts +0 -318
  323. package/src/architecture/CONTEXT.md +0 -22
  324. package/src/architecture/constraint-engine.ts +0 -351
  325. package/src/architecture/cross-project-checker.ts +0 -545
  326. package/src/cli/commands/index.ts +0 -30
  327. package/src/context/__tests__/file-budget.test.ts +0 -142
  328. package/src/context/__tests__/progressive-loader.test.ts +0 -264
  329. package/src/context/__tests__/token-pipeline.test.ts +0 -178
  330. package/src/context/__tests__/tool-output-budget.test.ts +0 -95
  331. package/src/context/file-budget.ts +0 -142
  332. package/src/context/progressive-loader.ts +0 -260
  333. package/src/context/token-pipeline.ts +0 -265
  334. package/src/context/tool-output-budget.ts +0 -178
  335. package/src/core/constraints/__tests__/default-executors.test.ts +0 -57
  336. package/src/core/constraints/default-executors.ts +0 -92
  337. package/src/llm/CONTEXT.md +0 -21
  338. package/src/llm/__tests__/adapter.test.ts +0 -172
  339. package/src/llm/adapter.ts +0 -149
  340. package/src/llm/index.ts +0 -2
  341. package/src/llm/types.ts +0 -81
  342. package/src/tools/__tests__/loader.test.ts +0 -252
  343. package/src/tools/__tests__/registry.test.ts +0 -157
  344. package/src/tools/core/__tests__/core.test.ts +0 -122
  345. package/src/tools/core/index.ts +0 -201
  346. package/src/tools/loader.ts +0 -216
  347. package/src/tools/registry.ts +0 -128
  348. package/src/tools/types.ts +0 -46
@@ -1,12 +1,7 @@
1
1
  /**
2
- * Agent 诊断接口
2
+ * 约束诊断器
3
3
  *
4
- * 当检测到异常时,提供 Agent 分析 traces 的能力
5
- *
6
- * 成本控制:
7
- * - 仅在有异常时触发
8
- * - 精简 prompt,不喂全部 traces
9
- * - ~2000 Token/次
4
+ * 当检测到异常时,基于预设规则分析 traces 给出诊断(零 Token,不调用 LLM)。
10
5
  */
11
6
 
12
7
  import type {
@@ -15,7 +10,6 @@ import type {
15
10
  TraceSummary,
16
11
  } from '../types/trace';
17
12
  import type { Diagnosis } from '../types/monitoring-types';
18
- import type { LLMAdapter } from '../llm/types';
19
13
  import { DIAGNOSIS_RULES } from './diagnosis-rules';
20
14
 
21
15
  // 类型定义已归位 types 层(工单 14),此处再导出保持模块公开面不变
@@ -54,9 +48,8 @@ export interface ConstraintDoctorConfig {
54
48
  export class ConstraintDoctor {
55
49
  private config: ConstraintDoctorConfig;
56
50
  private traces: ExecutionTrace[];
57
- private llm: LLMAdapter | null;
58
51
 
59
- constructor(config?: ConstraintDoctorConfig, llm?: LLMAdapter) {
52
+ constructor(config?: ConstraintDoctorConfig) {
60
53
  this.config = {
61
54
  enabled: false,
62
55
  maxTracesInPrompt: 20,
@@ -64,7 +57,6 @@ export class ConstraintDoctor {
64
57
  ...config,
65
58
  };
66
59
  this.traces = [];
67
- this.llm = llm || null;
68
60
  }
69
61
 
70
62
  /**
@@ -83,20 +75,8 @@ export class ConstraintDoctor {
83
75
  // 过滤相关 traces
84
76
  const relevantTraces = this.filterRelevantTraces(anomaly);
85
77
 
86
- // 基于规则的初步诊断(不消耗 Token)
87
- const ruleBasedDiagnosis = this.ruleBasedDiagnose(anomaly, relevantTraces);
88
-
89
- // 如果 LLM 可用,进行深度分析
90
- if (this.config.enabled && this.llm) {
91
- try {
92
- return await this.agentDiagnose(anomaly, relevantTraces, ruleBasedDiagnosis);
93
- } catch {
94
- // LLM 调用失败,降级到规则诊断
95
- return ruleBasedDiagnosis;
96
- }
97
- }
98
-
99
- return ruleBasedDiagnosis;
78
+ // 基于规则的诊断(不消耗 Token)
79
+ return this.ruleBasedDiagnose(anomaly, relevantTraces);
100
80
  }
101
81
 
102
82
  /**
@@ -147,85 +127,6 @@ export class ConstraintDoctor {
147
127
  return diagnosis;
148
128
  }
149
129
 
150
- /**
151
- * LLM 深度诊断
152
- *
153
- * 将异常和相关 traces 构造为 prompt,调用 LLM 分析根因
154
- * 成本:~2000 Token/次
155
- */
156
- private async agentDiagnose(
157
- anomaly: TraceAnomaly,
158
- traces: ExecutionTrace[],
159
- fallback: Diagnosis
160
- ): Promise<Diagnosis> {
161
- const maxTraces = this.config.maxTracesInPrompt || 20;
162
- const traceSummary = traces.slice(0, maxTraces).map(t =>
163
- `[${t.result}] ${t.constraintId} | ${t.operation || 'unknown'} | ${t.timestamp ? new Date(t.timestamp).toISOString() : 'no-ts'}`
164
- ).join('\n');
165
-
166
- const prompt = `你是约束系统诊断专家。分析以下异常并给出诊断结果。
167
-
168
- ## 异常信息
169
- - 约束 ID: ${anomaly.constraintId}
170
- - 异常类型: ${anomaly.type}
171
- - 约束层级: ${anomaly.level}
172
- - 当前数据: ${JSON.stringify(anomaly.data)}
173
-
174
- ## 相关 Traces(最近 ${Math.min(traces.length, maxTraces)} 条)
175
- ${traceSummary || '无相关 traces'}
176
-
177
- ## 要求
178
- 以 JSON 格式返回诊断结果,包含以下字段:
179
- {
180
- "rootCause": { "primary": "主要原因", "secondary": ["次要原因1", "次要原因2"] },
181
- "impact": { "severity": "low|medium|high", "scope": "single_project|multiple_projects|team", "userImpact": "用户影响描述" },
182
- "recommendations": [{ "type": "add_exception|adjust_threshold|modify_constraint|user_training", "content": "建议内容", "expectedOutcome": "预期效果", "implementationCost": "low|medium|high" }],
183
- "needsChange": true/false,
184
- "urgency": "low|medium|high"
185
- }
186
-
187
- 只返回 JSON,不要其他内容。`;
188
-
189
- const response = await this.llm!.complete(prompt, {
190
- maxTokens: 1000,
191
- temperature: 0.3,
192
- });
193
-
194
- // 解析 LLM 响应
195
- const parsed = this.parseAgentResponse(response);
196
-
197
- return {
198
- ...fallback,
199
- rootCause: {
200
- primary: parsed.rootCause?.primary || fallback.rootCause.primary,
201
- secondary: parsed.rootCause?.secondary || fallback.rootCause.secondary,
202
- evidence: fallback.rootCause.evidence,
203
- },
204
- impact: {
205
- severity: parsed.impact?.severity || fallback.impact.severity,
206
- scope: parsed.impact?.scope || fallback.impact.scope,
207
- userImpact: parsed.impact?.userImpact || fallback.impact.userImpact,
208
- },
209
- recommendations: parsed.recommendations?.length ? parsed.recommendations : fallback.recommendations,
210
- needsChange: parsed.needsChange ?? fallback.needsChange,
211
- urgency: parsed.urgency || fallback.urgency,
212
- };
213
- }
214
-
215
- /**
216
- * 解析 LLM 返回的 JSON 诊断结果
217
- */
218
- private parseAgentResponse(response: string): Partial<Diagnosis> {
219
- try {
220
- // 提取 JSON(可能被 markdown 代码块包裹)
221
- const jsonMatch = response.match(/\{[\s\S]*\}/);
222
- if (!jsonMatch) return {};
223
- return JSON.parse(jsonMatch[0]);
224
- } catch {
225
- return {};
226
- }
227
- }
228
-
229
130
  /**
230
131
  * 过滤相关 traces
231
132
  *
@@ -333,6 +234,6 @@ ${traceSummary || '无相关 traces'}
333
234
  /**
334
235
  * 创建诊断器
335
236
  */
336
- export function createDoctor(config?: ConstraintDoctorConfig, llm?: LLMAdapter): ConstraintDoctor {
337
- return new ConstraintDoctor(config, llm);
237
+ export function createDoctor(config?: ConstraintDoctorConfig): ConstraintDoctor {
238
+ return new ConstraintDoctor(config);
338
239
  }
@@ -48,7 +48,6 @@ describe('applyPreset with string preset names', () => {
48
48
  const config = applyPreset('relaxed');
49
49
  expect(config.ironLaws).toBeDefined();
50
50
  expect(config.ironLaws.no_completion_without_verification).toBeDefined();
51
- expect(Object.keys(config.tips).length).toBe(0);
52
51
  expect(Object.keys(config.prompts ?? {}).length).toBe(0);
53
52
  expect(config.disabled.length).toBeGreaterThan(0);
54
53
  });
@@ -75,7 +74,6 @@ describe('applyPreset with PresetConfig object', () => {
75
74
  prompts: [],
76
75
  });
77
76
  expect(Object.keys(config.guidelines).length).toBeGreaterThan(0);
78
- expect(Object.keys(config.tips).length).toBe(0);
79
77
  expect(Object.keys(config.prompts ?? {}).length).toBe(0);
80
78
  });
81
79
 
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * 预设定义哪些约束被启用
5
5
  *
6
- * ADR-0001:tips 维度退役,替换为 prompts(纯注入层)。
6
+ * ADR-0001:kind 二元(check + prompt 纯注入层)。
7
7
  */
8
8
 
9
9
  import type { Constraint } from '../types/constraint';
@@ -79,7 +79,6 @@ export function applyPreset(
79
79
  return {
80
80
  ironLaws: filterByIds(IRON_LAWS, cfg.ironLaws),
81
81
  guidelines: filterByIds(GUIDELINES, cfg.guidelines),
82
- tips: {},
83
82
  prompts: filterByIds(PROMPTS, cfg.prompts),
84
83
  disabled,
85
84
  custom: [],
@@ -163,12 +163,18 @@ export function noSpecFunc() {}
163
163
  });
164
164
 
165
165
  it('应该跳过 node_modules 和 dist', () => {
166
- mockFs.readdirSync.mockReturnValue(['src'] as any);
166
+ mockFs.readFileSync.mockReturnValue('');
167
+ mockFs.readdirSync.mockReturnValue([
168
+ { name: 'node_modules', isDirectory: () => true, isFile: () => false },
169
+ { name: 'dist', isDirectory: () => true, isFile: () => false },
170
+ { name: 'file.ts', isDirectory: () => false, isFile: () => true },
171
+ ] as any);
167
172
 
168
173
  const results = checkDirectory(tempDir);
169
174
 
170
- // 应该跳过 node_modules dist
171
- expect(Array.isArray(results)).toBe(true);
175
+ // 只收集 file.ts,跳过 node_modules dist 目录
176
+ expect(results).toHaveLength(1);
177
+ expect(results[0].file).toBe('/test/project/file.ts');
172
178
  });
173
179
 
174
180
  it('应该处理空目录', () => {
@@ -4,8 +4,9 @@
4
4
  * 检查代码中的 @spec 注释是否规范
5
5
  */
6
6
 
7
- import { readFileSync, readdirSync, statSync } from 'fs';
7
+ import { readFileSync } from 'fs';
8
8
  import * as path from 'path';
9
+ import { walkFiles } from '../utils/file-walk';
9
10
 
10
11
  export interface AnnotationCheckResult {
11
12
  valid: boolean;
@@ -248,36 +249,13 @@ function checkPublicExports(content: string, result: AnnotationCheckResult): voi
248
249
  }
249
250
 
250
251
  /**
251
- * 递归获取目录下所有文件
252
+ * 递归获取目录下所有文件(收敛到 utils/file-walk 的 walkFiles,工单 O3)
252
253
  */
253
254
  function getFilesRecursively(dir: string, extensions: string[]): string[] {
254
- const files: string[] = [];
255
-
256
- try {
257
- const items = readdirSync(dir);
258
-
259
- for (const item of items) {
260
- const fullPath = path.join(dir, item);
261
- const stat = statSync(fullPath);
262
-
263
- if (stat.isDirectory()) {
264
- // 跳过 node_modules 和 dist
265
- if (item === 'node_modules' || item === 'dist') {
266
- continue;
267
- }
268
- files.push(...getFilesRecursively(fullPath, extensions));
269
- } else if (stat.isFile()) {
270
- const ext = path.extname(item);
271
- if (extensions.includes(ext) && !item.endsWith('.d.ts')) {
272
- files.push(fullPath);
273
- }
274
- }
275
- }
276
- } catch {
277
- // 目录不存在或无法访问
278
- }
279
-
280
- return files;
255
+ return walkFiles(dir, {
256
+ skipDirs: ['node_modules', 'dist'],
257
+ filter: (name) => extensions.includes(path.extname(name)) && !name.endsWith('.d.ts'),
258
+ });
281
259
  }
282
260
 
283
261
  /**
@@ -1,25 +1,18 @@
1
1
  # tools/
2
2
 
3
3
  ## 职责
4
- 工具管理:工具类型定义、注册表、核心工具实现、加载器、路径管理。
4
+ 工具定义目录与路径管理:bundled 工具定义目录(`definitions/`,113 个 yml 能力目录)与路径解析。
5
5
 
6
6
  ## 核心导出
7
- - `types.ts` — 工具类型定义
8
- - `registry.ts` — 工具注册表
9
- - `core.ts` — 核心工具实现
10
- - `loader.ts` — 工具加载器
11
- - `paths.ts` — 工具路径管理
7
+ - `paths.ts` — 工具路径管理(`getToolsDir` / `getRegistryPath`)
12
8
 
13
9
  ## 依赖关系
14
- - 依赖 `src/types/` 公共类型
15
- - 被 `src/safety/tool-guardrail.ts` 消费
16
- - 被 Agent 工具调用管线消费
10
+ - 仅依赖 Node 内置 `path`
11
+ - 被 studio 消费(`getRegistryPath` / `getToolsDir`,`capabilities/routes.ts`、`capability.service.ts`)
17
12
 
18
13
  ## 约定
19
- - 工具通过注册表统一管理
20
- - 工具路径由 paths 模块解析
21
- - loader 支持动态加载外部工具
14
+ - 工具定义目录路径由 paths 模块解析
15
+ - `definitions/` 为静态能力目录,构建时复制到 dist
22
16
 
23
17
  ## 注意事项
24
- - 工具注册表与 ToolGuardrail 配合使用
25
- - 路径管理支持多项目工具目录
18
+ - 旧工具注册表/核心工具/加载器/类型定义已随 H1(#40)删除,仅保留路径管理与能力目录
@@ -1,5 +1 @@
1
- export * from './types';
2
- export * from './registry';
3
- export * from './core';
4
- export * from './loader';
5
1
  export * from './paths';
@@ -6,9 +6,6 @@
6
6
  * - iron_law:绝对禁止,无例外,违背即阻止执行
7
7
  * - guideline:优先建议,有例外,违背发警告但不阻止
8
8
  * - prompt:纯文本提示,仅参与 prompt 注入,不占检查位、不产生 trace
9
- *
10
- * 'tip' 层级已随 TIPS 退役(ADR-0001),仅保留在类型上以兼容
11
- * ConstraintCheckResult.tips 等历史结果形态,不再有新定义使用。
12
9
  */
13
10
 
14
11
  /**
@@ -25,9 +22,8 @@ export type ConstraintKind = 'check' | 'prompt';
25
22
  * 约束层级
26
23
  *
27
24
  * check 层只使用 'iron_law' | 'guideline';prompt 类统一为 'prompt'。
28
- * 'tip' 已退役,仅为历史结果结构兼容保留。
29
25
  */
30
- export type ConstraintLevel = 'iron_law' | 'guideline' | 'prompt' | 'tip';
26
+ export type ConstraintLevel = 'iron_law' | 'guideline' | 'prompt';
31
27
 
32
28
  /**
33
29
  * 约束触发条件(开放扩展)
@@ -281,9 +277,6 @@ export class ConstraintViolationError extends Error {
281
277
 
282
278
  /**
283
279
  * 约束检查结果(check 层)
284
- *
285
- * tips/tipCount 已随 TIPS 退役(ADR-0001),保留字段以兼容历史调用方,
286
- * 内置约束下恒为空数组 / 0。
287
280
  */
288
281
  export interface ConstraintCheckResult {
289
282
  /** 铁律检查结果(必须全部通过) */
@@ -292,17 +285,11 @@ export interface ConstraintCheckResult {
292
285
  /** 指导原则检查结果(警告,不阻止) */
293
286
  guidelines: ConstraintResult[];
294
287
 
295
- /** 提示检查结果(仅提示) */
296
- tips: ConstraintResult[];
297
-
298
288
  /** 是否通过(铁律全部通过) */
299
289
  passed: boolean;
300
290
 
301
291
  /** 警告数量 */
302
292
  warningCount: number;
303
-
304
- /** 提示数量 */
305
- tipCount: number;
306
293
  }
307
294
 
308
295
  /**
@@ -285,9 +285,6 @@ export interface MergedConstraintsConfig {
285
285
  /** Guidelines(合并后) */
286
286
  guidelines: Record<string, Constraint>;
287
287
 
288
- /** Tips(合并后)—— 已退役(ADR-0001),内置侧恒为空表,仅兼容历史调用方 */
289
- tips: Record<string, Constraint>;
290
-
291
288
  /** Prompts(合并后,ADR-0001 新增;可选以兼容旧调用方,缺省回落内置 PROMPTS) */
292
289
  prompts?: Record<string, Constraint>;
293
290
 
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * 文件遍历工具(工单 19)
3
3
  *
4
- * 收敛此前散落在 sync-docs / cross-project-checker / checker /
5
- * spec-baseline-check / doc-freshness-check 中的 5 处递归遍历实现。
4
+ * 收敛此前散落在 sync-docs / checker / spec-baseline-check /
5
+ * doc-freshness-check / spec/annotation-checker 中的递归遍历实现。
6
6
  */
7
7
 
8
8
  import * as fs from 'fs';
@@ -1,67 +0,0 @@
1
- /**
2
- * 架构约束引擎
3
- *
4
- * 通用能力:加载规则、执行检查、生成报告
5
- * 规则定义:由项目提供(.architect/rules.yml)
6
- */
7
- export interface ArchitectureContext {
8
- files: string[];
9
- diff: string;
10
- pr?: {
11
- number: number;
12
- changedFiles: number;
13
- additions: number;
14
- deletions: number;
15
- };
16
- }
17
- export interface ArchitectureViolation {
18
- ruleId: string;
19
- message: string;
20
- files?: string[];
21
- severity: 'error' | 'warning';
22
- }
23
- export interface ArchitectureResult {
24
- passed: boolean;
25
- violations: ArchitectureViolation[];
26
- }
27
- export interface ModuleBoundary {
28
- /** 源文件 glob 模式 */
29
- from: string;
30
- /** 禁止导入的目标 glob 模式 */
31
- denyImport: string;
32
- }
33
- export interface ArchitectureRule {
34
- id: string;
35
- type: 'forbidden-pattern' | 'file-count' | 'module-boundary' | 'custom';
36
- severity?: 'error' | 'warning';
37
- scope?: string;
38
- message?: string;
39
- patterns?: string[];
40
- threshold?: number;
41
- boundaries?: ModuleBoundary[];
42
- script?: string;
43
- }
44
- export declare class ArchitectureConstraintEngine {
45
- private rules;
46
- constructor(rules: ArchitectureRule[]);
47
- check(context: ArchitectureContext): Promise<ArchitectureResult>;
48
- private checkRule;
49
- private checkForbiddenPattern;
50
- private checkFileCount;
51
- private checkModuleBoundary;
52
- /**
53
- * 从 diff 中提取每个文件新增的 import 路径
54
- * 只解析 + 开头的行(新增内容)
55
- */
56
- private extractImportsFromDiff;
57
- /**
58
- * 解析 import 路径为相对于项目根的路径
59
- * 相对路径: ./foo, ../bar → 基于导入文件解析
60
- * 非相对路径: @scope/foo → 返回 null(外部依赖)
61
- */
62
- private resolveImport;
63
- private matchGlob;
64
- }
65
- export declare function loadArchitectureRules(configPath: string): Promise<ArchitectureRule[]>;
66
- export declare function runArchitectureCheck(configPath: string, context: ArchitectureContext): Promise<ArchitectureResult>;
67
- //# sourceMappingURL=constraint-engine.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constraint-engine.d.ts","sourceRoot":"","sources":["../../src/architecture/constraint-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE;QACH,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,qBAAqB,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,mBAAmB,GAAG,YAAY,GAAG,iBAAiB,GAAG,QAAQ,CAAC;IACxE,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAE/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAEpB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;IAE9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,4BAA4B;IAC3B,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,gBAAgB,EAAE;IAEvC,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAcxD,SAAS;IAgBvB,OAAO,CAAC,qBAAqB;IA6B7B,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,mBAAmB;IAiC3B;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAoC9B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,SAAS;CA+BlB;AAGD,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAgB3F;AA4DD,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAI7B"}