@dommaker/harness 1.5.0 → 1.6.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 (208) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +0 -2
  3. package/dist/cli/commands/definitions.d.ts.map +1 -1
  4. package/dist/cli/commands/definitions.js +1 -32
  5. package/dist/cli/commands/definitions.js.map +1 -1
  6. package/dist/cli/commands/passes-gate.d.ts +0 -2
  7. package/dist/cli/commands/passes-gate.d.ts.map +1 -1
  8. package/dist/cli/commands/passes-gate.js +0 -1
  9. package/dist/cli/commands/passes-gate.js.map +1 -1
  10. package/dist/cli/commands/performance.d.ts +0 -4
  11. package/dist/cli/commands/performance.d.ts.map +1 -1
  12. package/dist/cli/commands/performance.js +10 -20
  13. package/dist/cli/commands/performance.js.map +1 -1
  14. package/dist/cli/commands/report.d.ts +1 -1
  15. package/dist/cli/commands/report.d.ts.map +1 -1
  16. package/dist/cli/commands/report.js +2 -55
  17. package/dist/cli/commands/report.js.map +1 -1
  18. package/dist/cli/commands/status.d.ts.map +1 -1
  19. package/dist/cli/commands/status.js +4 -8
  20. package/dist/cli/commands/status.js.map +1 -1
  21. package/dist/context/index.d.ts +2 -5
  22. package/dist/context/index.d.ts.map +1 -1
  23. package/dist/context/index.js +2 -8
  24. package/dist/context/index.js.map +1 -1
  25. package/dist/context/token-budget.d.ts +0 -29
  26. package/dist/context/token-budget.d.ts.map +1 -1
  27. package/dist/context/token-budget.js +1 -65
  28. package/dist/context/token-budget.js.map +1 -1
  29. package/dist/context/types.d.ts +0 -1
  30. package/dist/context/types.d.ts.map +1 -1
  31. package/dist/context/types.js +0 -9
  32. package/dist/context/types.js.map +1 -1
  33. package/dist/core/constraints/checker.d.ts +14 -0
  34. package/dist/core/constraints/checker.d.ts.map +1 -1
  35. package/dist/core/constraints/checker.js +22 -2
  36. package/dist/core/constraints/checker.js.map +1 -1
  37. package/dist/core/constraints/git-evidence.d.ts +6 -3
  38. package/dist/core/constraints/git-evidence.d.ts.map +1 -1
  39. package/dist/core/constraints/git-evidence.js +6 -3
  40. package/dist/core/constraints/git-evidence.js.map +1 -1
  41. package/dist/core/index.d.ts +1 -2
  42. package/dist/core/index.d.ts.map +1 -1
  43. package/dist/core/index.js +1 -9
  44. package/dist/core/index.js.map +1 -1
  45. package/dist/core/spec/validator.d.ts +2 -0
  46. package/dist/core/spec/validator.d.ts.map +1 -1
  47. package/dist/core/spec/validator.js +9 -11
  48. package/dist/core/spec/validator.js.map +1 -1
  49. package/dist/core/validators/index.d.ts +1 -1
  50. package/dist/core/validators/index.d.ts.map +1 -1
  51. package/dist/core/validators/passes-gate.d.ts +1 -15
  52. package/dist/core/validators/passes-gate.d.ts.map +1 -1
  53. package/dist/core/validators/passes-gate.js +0 -125
  54. package/dist/core/validators/passes-gate.js.map +1 -1
  55. package/dist/failure/index.d.ts +0 -1
  56. package/dist/failure/index.d.ts.map +1 -1
  57. package/dist/failure/index.js +1 -7
  58. package/dist/failure/index.js.map +1 -1
  59. package/dist/gates/definitions.d.ts.map +1 -1
  60. package/dist/gates/definitions.js +0 -4
  61. package/dist/gates/definitions.js.map +1 -1
  62. package/dist/gates/performance.d.ts +7 -22
  63. package/dist/gates/performance.d.ts.map +1 -1
  64. package/dist/gates/performance.js +7 -89
  65. package/dist/gates/performance.js.map +1 -1
  66. package/dist/gates/types.d.ts +2 -8
  67. package/dist/gates/types.d.ts.map +1 -1
  68. package/dist/index.d.ts +6 -8
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +4 -22
  71. package/dist/index.js.map +1 -1
  72. package/dist/knowledge/index.d.ts +0 -1
  73. package/dist/knowledge/index.d.ts.map +1 -1
  74. package/dist/knowledge/index.js +1 -3
  75. package/dist/knowledge/index.js.map +1 -1
  76. package/dist/monitoring/trace-analyzer.d.ts +25 -10
  77. package/dist/monitoring/trace-analyzer.d.ts.map +1 -1
  78. package/dist/monitoring/trace-analyzer.js +147 -116
  79. package/dist/monitoring/trace-analyzer.js.map +1 -1
  80. package/dist/types/passes-gate.d.ts +0 -19
  81. package/dist/types/passes-gate.d.ts.map +1 -1
  82. package/package.json +1 -1
  83. package/src/__tests__/passes-gate-check.test.ts +20 -4
  84. package/src/__tests__/passes-gate.test.ts +5 -99
  85. package/src/__tests__/performance-gate.test.ts +3 -11
  86. package/src/__tests__/public-exports.test.ts +46 -16
  87. package/src/__tests__/trace-analyzer.test.ts +52 -2
  88. package/src/cli/commands/CONTEXT.md +3 -2
  89. package/src/cli/commands/__tests__/passes-gate-dead-options.test.ts +70 -0
  90. package/src/cli/commands/__tests__/passes-gate.test.ts +7 -3
  91. package/src/cli/commands/__tests__/performance.test.ts +5 -16
  92. package/src/cli/commands/__tests__/registry.test.ts +46 -3
  93. package/src/cli/commands/__tests__/report-extra.test.ts +0 -19
  94. package/src/cli/commands/__tests__/report-false-green.test.ts +46 -0
  95. package/src/cli/commands/__tests__/report.test.ts +0 -20
  96. package/src/cli/commands/__tests__/status-analysis-wiring.test.ts +68 -0
  97. package/src/cli/commands/__tests__/status-extra.test.ts +63 -116
  98. package/src/cli/commands/__tests__/status.test.ts +66 -148
  99. package/src/cli/commands/definitions.ts +1 -32
  100. package/src/cli/commands/passes-gate.ts +0 -3
  101. package/src/cli/commands/performance.ts +13 -27
  102. package/src/cli/commands/report.ts +3 -61
  103. package/src/cli/commands/status.ts +5 -10
  104. package/src/context/CONTEXT.md +2 -3
  105. package/src/context/__tests__/token-budget.test.ts +1 -81
  106. package/src/context/index.ts +2 -7
  107. package/src/context/token-budget.ts +0 -73
  108. package/src/context/types.ts +0 -9
  109. package/src/core/CONTEXT.md +5 -6
  110. package/src/core/constraints/__tests__/collect-constraints.test.ts +66 -0
  111. package/src/core/constraints/checker.ts +33 -2
  112. package/src/core/constraints/git-evidence.ts +6 -3
  113. package/src/core/index.ts +0 -11
  114. package/src/core/spec/__tests__/validator.test.ts +24 -0
  115. package/src/core/spec/validator.ts +9 -10
  116. package/src/core/validators/__tests__/passes-gate.test.ts +2 -9
  117. package/src/core/validators/index.ts +0 -1
  118. package/src/core/validators/passes-gate.ts +1 -149
  119. package/src/failure/CONTEXT.md +8 -6
  120. package/src/failure/index.ts +0 -10
  121. package/src/gates/CONTEXT.md +3 -2
  122. package/src/gates/__tests__/performance.test.ts +6 -74
  123. package/src/gates/definitions.ts +0 -4
  124. package/src/gates/performance.ts +9 -111
  125. package/src/gates/types.ts +2 -8
  126. package/src/index.ts +1 -36
  127. package/src/knowledge/CONTEXT.md +1 -2
  128. package/src/knowledge/index.ts +0 -1
  129. package/src/monitoring/CONTEXT.md +2 -2
  130. package/src/monitoring/trace-analyzer.ts +160 -126
  131. package/src/types/passes-gate.ts +0 -26
  132. package/src/utils/__tests__/jsonl-skip-disposition.test.ts +0 -1
  133. package/dist/cli/commands/analyze-sessions.d.ts +0 -20
  134. package/dist/cli/commands/analyze-sessions.d.ts.map +0 -1
  135. package/dist/cli/commands/analyze-sessions.js +0 -290
  136. package/dist/cli/commands/analyze-sessions.js.map +0 -1
  137. package/dist/cli/commands/update-user-model.d.ts +0 -30
  138. package/dist/cli/commands/update-user-model.d.ts.map +0 -1
  139. package/dist/cli/commands/update-user-model.js +0 -406
  140. package/dist/cli/commands/update-user-model.js.map +0 -1
  141. package/dist/cli/session-mining/corrections.d.ts +0 -17
  142. package/dist/cli/session-mining/corrections.d.ts.map +0 -1
  143. package/dist/cli/session-mining/corrections.js +0 -58
  144. package/dist/cli/session-mining/corrections.js.map +0 -1
  145. package/dist/cli/session-mining/index.d.ts +0 -13
  146. package/dist/cli/session-mining/index.d.ts.map +0 -1
  147. package/dist/cli/session-mining/index.js +0 -29
  148. package/dist/cli/session-mining/index.js.map +0 -1
  149. package/dist/cli/session-mining/text.d.ts +0 -31
  150. package/dist/cli/session-mining/text.d.ts.map +0 -1
  151. package/dist/cli/session-mining/text.js +0 -126
  152. package/dist/cli/session-mining/text.js.map +0 -1
  153. package/dist/cli/session-mining/transcript.d.ts +0 -34
  154. package/dist/cli/session-mining/transcript.d.ts.map +0 -1
  155. package/dist/cli/session-mining/transcript.js +0 -130
  156. package/dist/cli/session-mining/transcript.js.map +0 -1
  157. package/dist/context/compaction.d.ts +0 -57
  158. package/dist/context/compaction.d.ts.map +0 -1
  159. package/dist/context/compaction.js +0 -165
  160. package/dist/context/compaction.js.map +0 -1
  161. package/dist/core/session/clean-state.d.ts +0 -17
  162. package/dist/core/session/clean-state.d.ts.map +0 -1
  163. package/dist/core/session/clean-state.js +0 -192
  164. package/dist/core/session/clean-state.js.map +0 -1
  165. package/dist/core/session/index.d.ts +0 -6
  166. package/dist/core/session/index.d.ts.map +0 -1
  167. package/dist/core/session/index.js +0 -15
  168. package/dist/core/session/index.js.map +0 -1
  169. package/dist/core/session/startup.d.ts +0 -47
  170. package/dist/core/session/startup.d.ts.map +0 -1
  171. package/dist/core/session/startup.js +0 -263
  172. package/dist/core/session/startup.js.map +0 -1
  173. package/dist/failure/constraint-handler.d.ts +0 -83
  174. package/dist/failure/constraint-handler.d.ts.map +0 -1
  175. package/dist/failure/constraint-handler.js +0 -138
  176. package/dist/failure/constraint-handler.js.map +0 -1
  177. package/dist/knowledge/lifecycle-hooks.d.ts +0 -62
  178. package/dist/knowledge/lifecycle-hooks.d.ts.map +0 -1
  179. package/dist/knowledge/lifecycle-hooks.js +0 -143
  180. package/dist/knowledge/lifecycle-hooks.js.map +0 -1
  181. package/dist/types/session.d.ts +0 -113
  182. package/dist/types/session.d.ts.map +0 -1
  183. package/dist/types/session.js +0 -6
  184. package/dist/types/session.js.map +0 -1
  185. package/src/__tests__/clean-state-extra.test.ts +0 -301
  186. package/src/__tests__/clean-state.test.ts +0 -169
  187. package/src/__tests__/constraint-handler.test.ts +0 -132
  188. package/src/__tests__/passes-gate-extra.test.ts +0 -93
  189. package/src/__tests__/session-startup.test.ts +0 -334
  190. package/src/cli/commands/__tests__/analyze-sessions.test.ts +0 -184
  191. package/src/cli/commands/__tests__/update-user-model.test.ts +0 -268
  192. package/src/cli/commands/analyze-sessions.ts +0 -335
  193. package/src/cli/commands/update-user-model.ts +0 -476
  194. package/src/cli/session-mining/__tests__/transcript.test.ts +0 -118
  195. package/src/cli/session-mining/corrections.ts +0 -56
  196. package/src/cli/session-mining/index.ts +0 -13
  197. package/src/cli/session-mining/text.ts +0 -117
  198. package/src/cli/session-mining/transcript.ts +0 -125
  199. package/src/context/__tests__/compaction.test.ts +0 -169
  200. package/src/context/compaction.ts +0 -201
  201. package/src/core/session/__tests__/startup.test.ts +0 -281
  202. package/src/core/session/clean-state.ts +0 -178
  203. package/src/core/session/index.ts +0 -15
  204. package/src/core/session/startup.ts +0 -253
  205. package/src/failure/constraint-handler.ts +0 -171
  206. package/src/knowledge/__tests__/lifecycle-hooks.test.ts +0 -140
  207. package/src/knowledge/lifecycle-hooks.ts +0 -202
  208. package/src/types/session.ts +0 -132
@@ -1,202 +0,0 @@
1
- /**
2
- * 知识生命周期钩子
3
- *
4
- * 与 Agent 生命周期集成:
5
- * - 启动时注入相关知识上下文
6
- * - 完成时提取新知识
7
- */
8
-
9
- import type { KnowledgeEntry, KnowledgeSubsystem } from './types';
10
- import type { KnowledgeStore } from './store';
11
- import { KnowledgeQuery } from './query';
12
- import type { ContextSource } from '../context/types';
13
-
14
- // ── 钩子配置 ─────────────────────────────────────────────
15
-
16
- export interface LifecycleHookConfig {
17
- store: KnowledgeStore;
18
- query: KnowledgeQuery;
19
- /** 启动时注入的最大 token 数 */
20
- injectionBudget?: number;
21
- /** 完成时提取的最大条目数 */
22
- maxExtractionEntries?: number;
23
- /** 当前阶段 */
24
- phase?: string;
25
- }
26
-
27
- // ── 提取结果 ─────────────────────────────────────────────
28
-
29
- export interface ExtractionResult {
30
- entries: KnowledgeEntry[];
31
- source: 'archive' | 'error' | 'decision';
32
- }
33
-
34
- // ── 生命周期钩子 ─────────────────────────────────────────
35
-
36
- export class KnowledgeLifecycleHooks {
37
- private config: LifecycleHookConfig;
38
-
39
- constructor(config: LifecycleHookConfig) {
40
- this.config = config;
41
- }
42
-
43
- /**
44
- * 启动钩子:注入相关知识到上下文
45
- *
46
- * 在 Agent session 启动时调用
47
- */
48
- onSessionStart(options?: {
49
- phase?: string;
50
- budget?: number;
51
- focusTypes?: KnowledgeSubsystem[];
52
- exclude?: string[];
53
- }): ContextSource[] {
54
- const budget = options?.budget ?? this.config.injectionBudget ?? 800;
55
- const phase = options?.phase ?? this.config.phase ?? 'default';
56
-
57
- const queryResult = this.config.query.query({
58
- phase,
59
- maxTokens: budget,
60
- maxEntries: 10,
61
- focusTypes: options?.focusTypes ?? [],
62
- });
63
-
64
- const sources: ContextSource[] = [];
65
- const excludeSet = new Set(options?.exclude ?? []);
66
-
67
- for (const entry of queryResult.entries) {
68
- if (excludeSet.has(entry.id)) continue;
69
-
70
- sources.push({
71
- type: 'knowledge',
72
- id: `knowledge-${entry.id}`,
73
- content: this.formatForContext(entry),
74
- priority: 3,
75
- metadata: { entryId: entry.id, maturity: entry.maturity },
76
- });
77
- }
78
-
79
- return sources;
80
- }
81
-
82
- /**
83
- * 完成钩子:从产物中提取新知识
84
- *
85
- * 在 Agent task 完成时调用(ARCHIVE 阶段)
86
- */
87
- onTaskComplete(context: {
88
- taskDescription: string;
89
- changedFiles?: string[];
90
- testResults?: string;
91
- errors?: string[];
92
- decisions?: string[];
93
- }): ExtractionResult {
94
- const entries: KnowledgeEntry[] = [];
95
-
96
- // 从错误中提取 pitfall
97
- if (context.errors && context.errors.length > 0) {
98
- for (const error of context.errors.slice(0, 3)) {
99
- entries.push(this.createExtractionEntry({
100
- title: `踩坑: ${error.slice(0, 100)}`,
101
- content: error,
102
- type: 'pitfall',
103
- tags: ['auto-extract', 'error'],
104
- }));
105
- }
106
- }
107
-
108
- // 从决策中提取 decision
109
- if (context.decisions && context.decisions.length > 0) {
110
- for (const decision of context.decisions.slice(0, 3)) {
111
- entries.push(this.createExtractionEntry({
112
- title: `决策: ${decision.slice(0, 100)}`,
113
- content: decision,
114
- type: 'decision',
115
- tags: ['auto-extract', 'decision'],
116
- }));
117
- }
118
- }
119
-
120
- // 保存到知识库
121
- for (const entry of entries) {
122
- this.config.store.save(entry);
123
- }
124
-
125
- return {
126
- entries,
127
- source: 'archive',
128
- };
129
- }
130
-
131
- /**
132
- * 错误钩子:从错误中提取知识
133
- */
134
- onError(error: Error, context?: {
135
- taskDescription?: string;
136
- stackTrace?: string;
137
- }): ExtractionResult {
138
- const content = [
139
- `错误: ${error.message}`,
140
- context?.stackTrace ? `\n堆栈:\n${context.stackTrace}` : '',
141
- context?.taskDescription ? `\n任务: ${context.taskDescription}` : '',
142
- ].filter(Boolean).join('\n');
143
-
144
- const entry = this.createExtractionEntry({
145
- title: `踩坑: ${error.message.slice(0, 100)}`,
146
- content,
147
- type: 'pitfall',
148
- tags: ['auto-extract', 'error', 'runtime'],
149
- });
150
-
151
- this.config.store.save(entry);
152
-
153
- return {
154
- entries: [entry],
155
- source: 'error',
156
- };
157
- }
158
-
159
- // ── 辅助方法 ───────────────────────────────────────────
160
-
161
- private formatForContext(entry: KnowledgeEntry): string {
162
- const parts: string[] = [];
163
- parts.push(`## [${entry.type.toUpperCase()}] ${entry.title}`);
164
- parts.push(`成熟度: ${entry.maturity}`);
165
- if (entry.tags.length > 0) {
166
- parts.push(`标签: ${entry.tags.join(', ')}`);
167
- }
168
- parts.push('');
169
- parts.push(entry.content);
170
- return parts.join('\n');
171
- }
172
-
173
- private createExtractionEntry(params: {
174
- title: string;
175
- content: string;
176
- type: KnowledgeSubsystem;
177
- tags: string[];
178
- }): KnowledgeEntry {
179
- return {
180
- id: `extract-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
181
- type: params.type,
182
- title: params.title,
183
- content: params.content,
184
- maturity: 'draft',
185
- layer: 'project',
186
- created: new Date().toISOString(),
187
- lastReferenced: '',
188
- contributors: [],
189
- projects: [],
190
- tags: params.tags,
191
- applicablePhases: [],
192
- sourceReferences: [{
193
- workflow: 'lifecycle-hook',
194
- timestamp: new Date().toISOString(),
195
- }],
196
- referencedBy: [],
197
- executionResults: [],
198
- consumptionMode: 'reference',
199
- origin: 'agent',
200
- };
201
- }
202
- }
@@ -1,132 +0,0 @@
1
- /**
2
- * Session 相关类型定义
3
- */
4
-
5
- /**
6
- * Session Startup 检查点配置
7
- */
8
- export interface StartupCheckpoints {
9
- required: StartupCheckpointType[];
10
- optional?: StartupCheckpointType[];
11
- timeout?: number; // 检查点超时(毫秒)
12
- contextFiles?: string[]; // 启动时加载的上下文文件
13
- }
14
-
15
- export type StartupCheckpointType =
16
- | 'pwd'
17
- | 'git_log'
18
- | 'git_status'
19
- | 'read_progress'
20
- | 'read_task_list'
21
- | 'init_sh'
22
- | 'basic_verification'
23
- | 'load_context';
24
-
25
- /**
26
- * Startup 检查点结果
27
- */
28
- export interface StartupCheckpointResult {
29
- type: StartupCheckpointType;
30
- success: boolean;
31
- data?: any;
32
- error?: string;
33
- duration: number; // 执行时长(毫秒)
34
- }
35
-
36
- /**
37
- * Clean State 配置
38
- */
39
- export interface CleanStateConfig {
40
- enabled: boolean;
41
- autoCommit?: boolean; // 是否自动提交未提交的变更
42
- detectBugs?: boolean; // 是否检测 bug
43
- updateProgress?: boolean; // 是否更新 progress 文件
44
- commitMessageTemplate?: string; // 提交消息模板
45
- }
46
-
47
- /**
48
- * Clean State 结果
49
- */
50
- export interface CleanStateResult {
51
- isClean: boolean;
52
- hasUncommittedChanges: boolean;
53
- committedFiles?: string[];
54
- bugs?: DetectedBug[];
55
- progressUpdated: boolean;
56
- errors?: string[];
57
- }
58
-
59
- /**
60
- * 检测到的 Bug
61
- */
62
- export interface DetectedBug {
63
- file: string;
64
- line?: number;
65
- message: string;
66
- severity: 'low' | 'medium' | 'high' | 'critical';
67
- type: 'syntax' | 'runtime' | 'logic' | 'security' | 'performance';
68
- }
69
-
70
- /**
71
- * Task List JSON 格式(扩展自 tasks.yml)
72
- */
73
- export interface TaskListJson {
74
- tasks: DynamicTask[];
75
- metadata?: {
76
- created_at?: string;
77
- updated_at?: string;
78
- workflow_id?: string;
79
- project_name?: string;
80
- };
81
- }
82
-
83
- /**
84
- * 动态任务定义(模块内类型:包根同名导出是 types/passes-gate 版,此处仅
85
- * TaskListJson/SessionInfo 结构引用;原 Extended* 别名导出已随 #85 删除)
86
- */
87
- interface DynamicTask {
88
- id: string;
89
- name?: string;
90
- category?: string;
91
- description?: string;
92
- type?: string;
93
- priority?: number;
94
- steps?: string[];
95
-
96
- // 约束机制字段
97
- passes?: boolean; // 任务是否通过(只能由测试结果修改)
98
- test_result?: TaskTestResult; // 测试证据
99
- step_status?: Record<string, TaskStepStatus>; // 步骤状态跟踪
100
- current_step?: string; // 当前执行的步骤
101
- current_step_index?: number; // 当前步骤索引
102
- }
103
-
104
- /**
105
- * 测试结果(模块内类型,理由同 DynamicTask)
106
- */
107
- interface TaskTestResult {
108
- passed: boolean;
109
- command: string;
110
- output?: string;
111
- failures?: string[];
112
- timestamp: Date;
113
- evidence?: string;
114
- }
115
-
116
- /**
117
- * 步骤状态
118
- */
119
- export interface TaskStepStatus {
120
- completed: boolean;
121
- result?: string;
122
- timestamp?: string;
123
- }
124
-
125
- /**
126
- * Session 信息
127
- */
128
- export interface SessionInfo {
129
- sessionId: string;
130
- workflowId: string;
131
- task?: DynamicTask;
132
- }