@hongmaple0820/scale-engine 0.12.2 → 0.13.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.
- package/README.md +30 -2
- package/dist/adapters/ClaudeCodeAdapter.d.ts +1 -0
- package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
- package/dist/adapters/KiroAdapter.d.ts +14 -0
- package/dist/adapters/KiroAdapter.js +180 -0
- package/dist/adapters/KiroAdapter.js.map +1 -0
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.js +3 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/api/cli.js +396 -5
- package/dist/api/cli.js.map +1 -1
- package/dist/api/doctor.d.ts +12 -0
- package/dist/api/doctor.js +232 -5
- package/dist/api/doctor.js.map +1 -1
- package/dist/api/quickstart.d.ts +19 -1
- package/dist/api/quickstart.js +103 -2
- package/dist/api/quickstart.js.map +1 -1
- package/dist/artifact/types.d.ts +16 -2
- package/dist/artifact/types.js.map +1 -1
- package/dist/cli/phaseCommands.d.ts +61 -0
- package/dist/cli/phaseCommands.js +559 -39
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/cli/vibeCommands.d.ts +44 -0
- package/dist/cli/vibeCommands.js +244 -0
- package/dist/cli/vibeCommands.js.map +1 -0
- package/dist/guardrails/detectors.d.ts +9 -0
- package/dist/guardrails/detectors.js +102 -0
- package/dist/guardrails/detectors.js.map +1 -1
- package/dist/hooks/HookGeneratorEnhanced.js +29 -0
- package/dist/hooks/HookGeneratorEnhanced.js.map +1 -1
- package/dist/hooks/WorkflowHooksManager.js +20 -1
- package/dist/hooks/WorkflowHooksManager.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/output/BrandThemeLoader.d.ts +54 -0
- package/dist/output/BrandThemeLoader.js +340 -0
- package/dist/output/BrandThemeLoader.js.map +1 -0
- package/dist/output/HTMLDocumentRenderer.d.ts +83 -0
- package/dist/output/HTMLDocumentRenderer.js +717 -0
- package/dist/output/HTMLDocumentRenderer.js.map +1 -0
- package/dist/output/UIPrototypeRenderer.d.ts +61 -0
- package/dist/output/UIPrototypeRenderer.js +500 -0
- package/dist/output/UIPrototypeRenderer.js.map +1 -0
- package/dist/output/index.d.ts +6 -0
- package/dist/output/index.js +6 -0
- package/dist/output/index.js.map +1 -0
- package/dist/prompts/PhasePromptRegistry.d.ts +53 -0
- package/dist/prompts/PhasePromptRegistry.js +517 -0
- package/dist/prompts/PhasePromptRegistry.js.map +1 -0
- package/dist/skills/SkillDiscovery.js +2 -1
- package/dist/skills/SkillDiscovery.js.map +1 -1
- package/dist/skills/index.d.ts +1 -0
- package/dist/skills/index.js +1 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/routing/SkillGate.d.ts +11 -0
- package/dist/skills/routing/SkillGate.js +76 -0
- package/dist/skills/routing/SkillGate.js.map +1 -0
- package/dist/skills/routing/SkillPlanner.d.ts +8 -0
- package/dist/skills/routing/SkillPlanner.js +91 -0
- package/dist/skills/routing/SkillPlanner.js.map +1 -0
- package/dist/skills/routing/SkillPolicy.d.ts +6 -0
- package/dist/skills/routing/SkillPolicy.js +146 -0
- package/dist/skills/routing/SkillPolicy.js.map +1 -0
- package/dist/skills/routing/SkillRoutingTypes.d.ts +72 -0
- package/dist/skills/routing/SkillRoutingTypes.js +2 -0
- package/dist/skills/routing/SkillRoutingTypes.js.map +1 -0
- package/dist/skills/routing/TaskIntentClassifier.d.ts +6 -0
- package/dist/skills/routing/TaskIntentClassifier.js +79 -0
- package/dist/skills/routing/TaskIntentClassifier.js.map +1 -0
- package/dist/skills/routing/index.d.ts +5 -0
- package/dist/skills/routing/index.js +6 -0
- package/dist/skills/routing/index.js.map +1 -0
- package/dist/workflow/GovernanceTemplates.d.ts +12 -0
- package/dist/workflow/GovernanceTemplates.js +515 -0
- package/dist/workflow/GovernanceTemplates.js.map +1 -0
- package/dist/workflow/PhaseMarkerTracker.d.ts +63 -0
- package/dist/workflow/PhaseMarkerTracker.js +291 -0
- package/dist/workflow/PhaseMarkerTracker.js.map +1 -0
- package/dist/workflow/SessionStateTracker.d.ts +74 -0
- package/dist/workflow/SessionStateTracker.js +270 -0
- package/dist/workflow/SessionStateTracker.js.map +1 -0
- package/dist/workflow/TaskArtifactScaffolder.d.ts +47 -0
- package/dist/workflow/TaskArtifactScaffolder.js +237 -0
- package/dist/workflow/TaskArtifactScaffolder.js.map +1 -0
- package/dist/workflow/TaskMetricsStore.d.ts +49 -0
- package/dist/workflow/TaskMetricsStore.js +149 -0
- package/dist/workflow/TaskMetricsStore.js.map +1 -0
- package/dist/workflow/VerificationCommands.d.ts +2 -0
- package/dist/workflow/VerificationCommands.js +7 -4
- package/dist/workflow/VerificationCommands.js.map +1 -1
- package/dist/workflow/VerificationProfile.d.ts +55 -0
- package/dist/workflow/VerificationProfile.js +133 -0
- package/dist/workflow/VerificationProfile.js.map +1 -0
- package/dist/workflow/WorkflowArtifactWriter.d.ts +113 -0
- package/dist/workflow/WorkflowArtifactWriter.js +241 -0
- package/dist/workflow/WorkflowArtifactWriter.js.map +1 -0
- package/dist/workflow/WorkflowEngine.d.ts +20 -2
- package/dist/workflow/WorkflowEngine.js +37 -8
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- package/dist/workflow/autonomous/AutonomousDevLoop.d.ts +88 -0
- package/dist/workflow/autonomous/AutonomousDevLoop.js +381 -0
- package/dist/workflow/autonomous/AutonomousDevLoop.js.map +1 -0
- package/dist/workflow/autonomous/WorklogManager.d.ts +50 -0
- package/dist/workflow/autonomous/WorklogManager.js +264 -0
- package/dist/workflow/autonomous/WorklogManager.js.map +1 -0
- package/dist/workflow/autonomous/index.d.ts +2 -0
- package/dist/workflow/autonomous/index.js +4 -0
- package/dist/workflow/autonomous/index.js.map +1 -0
- package/dist/workflow/gates/GateSystem.d.ts +12 -3
- package/dist/workflow/gates/GateSystem.js +185 -41
- package/dist/workflow/gates/GateSystem.js.map +1 -1
- package/dist/workflow/index.d.ts +7 -0
- package/dist/workflow/index.js +7 -0
- package/dist/workflow/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
// SCALE Engine — Phase Marker Tracker
|
|
2
|
+
// 解析 Output Markers 并追踪 Phase 完成状态
|
|
3
|
+
// 用于 Stop Hook 检查所有 Phase 是否完成
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { logger } from '../core/logger.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Output Marker Patterns
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// [DEFINE] ✓ ambiguity <score>% ✓ | spec <id> ✓
|
|
11
|
+
const DEFINE_PATTERN = /\[DEFINE\]\s*✓\s*ambiguity\s+([\d.]+)%\s*✓\s*\|\s*spec\s+(\S+)\s*✓/;
|
|
12
|
+
// [PLAN] ✓ impact ✓ | contract ✓ | rollback ✓ | plan <id> ✓
|
|
13
|
+
const PLAN_PATTERN = /\[PLAN\]\s*✓\s*impact\s+✓\s*\|\s*contract\s+✓\s*\|\s*rollback\s+✓\s*\|\s*plan\s+(\S+)\s*✓/;
|
|
14
|
+
// [EXECUTE] ✓ TDD RED ✓ | GREEN ✓ | REFACTOR ✓ | task <id> ✓
|
|
15
|
+
const EXECUTE_PATTERN = /\[EXECUTE\]\s*✓\s*TDD\s+RED\s+✓\s*\|\s*GREEN\s+✓\s*\|\s*REFACTOR\s+✓\s*\|\s*task\s+(\S+)\s*✓/;
|
|
16
|
+
// [VERIFY] ✓ <gate1> ✓ | <gate2> ✓ | ... (flexible)
|
|
17
|
+
const VERIFY_PATTERN = /\[VERIFY\]\s*(.*?)(?:\s*$)/;
|
|
18
|
+
// [REVIEW] ✓ files <count> ✓ | findings <total> ✓ | CRITICAL <n> ✓ | HIGH <n> ✓ | principles <n>/8 ✓
|
|
19
|
+
const REVIEW_PATTERN = /\[REVIEW\]\s*✓\s*files\s+(\d+)\s*✓\s*\|\s*findings\s+(\d+)\s*✓\s*\|\s*CRITICAL\s+(\d+)\s*✓\s*\|\s*HIGH\s+(\d+)\s*✓\s*\|\s*principles\s+(\d+)\/8\s*✓/;
|
|
20
|
+
// [SHIP] ✓ evidence ✓ | staged <count> ✓ | commit <hash> ✓ | push ✓ | report ✓
|
|
21
|
+
const SHIP_PATTERN = /\[SHIP\]\s*✓\s*evidence\s+✓\s*\|\s*staged\s+(\d+)\s*✓\s*\|\s*commit\s+(\S+)\s*✓\s*\|\s*(push|skip)\s+✓\s*\|\s*report\s+✓/;
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Phase Marker Tracker
|
|
24
|
+
// ============================================================================
|
|
25
|
+
export class PhaseMarkerTracker {
|
|
26
|
+
constructor(scaleDir = '.scale') {
|
|
27
|
+
this.stateDir = join(scaleDir, 'phases');
|
|
28
|
+
this.stateFile = join(this.stateDir, '.phase-state');
|
|
29
|
+
this.ensureDir();
|
|
30
|
+
}
|
|
31
|
+
ensureDir() {
|
|
32
|
+
if (!existsSync(this.stateDir)) {
|
|
33
|
+
mkdirSync(this.stateDir, { recursive: true });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// ─────────────────────────────────────────────────────────────
|
|
37
|
+
// Marker Parsing
|
|
38
|
+
// ─────────────────────────────────────────────────────────────
|
|
39
|
+
/**
|
|
40
|
+
* 解析文本中的所有 Output Markers 并更新状态
|
|
41
|
+
* @param text 包含 markers 的文本(对话输出)
|
|
42
|
+
* @returns 本次解析出的 markers 数量
|
|
43
|
+
*/
|
|
44
|
+
parseAndUpdate(text) {
|
|
45
|
+
const markers = this.parseMarkers(text);
|
|
46
|
+
const keys = Object.keys(markers);
|
|
47
|
+
if (keys.length === 0)
|
|
48
|
+
return 0;
|
|
49
|
+
const state = this.getState();
|
|
50
|
+
for (const [phase, status] of Object.entries(markers)) {
|
|
51
|
+
if (status.completed) {
|
|
52
|
+
state[phase] = status;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
this.writeState(state);
|
|
56
|
+
logger.info({ phases: keys, count: keys.length }, 'Phase markers parsed and updated');
|
|
57
|
+
return keys.length;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 解析文本中的所有 Output Markers
|
|
61
|
+
* @returns 解析结果 Map<Phase, PhaseStatus>
|
|
62
|
+
*/
|
|
63
|
+
parseMarkers(text) {
|
|
64
|
+
const results = {};
|
|
65
|
+
// DEFINE
|
|
66
|
+
const defineMatch = text.match(DEFINE_PATTERN);
|
|
67
|
+
if (defineMatch) {
|
|
68
|
+
results.DEFINE = {
|
|
69
|
+
completed: true,
|
|
70
|
+
marker: defineMatch[0],
|
|
71
|
+
details: {
|
|
72
|
+
ambiguity: defineMatch[1],
|
|
73
|
+
specId: defineMatch[2],
|
|
74
|
+
},
|
|
75
|
+
timestamp: Date.now(),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// PLAN
|
|
79
|
+
const planMatch = text.match(PLAN_PATTERN);
|
|
80
|
+
if (planMatch) {
|
|
81
|
+
results.PLAN = {
|
|
82
|
+
completed: true,
|
|
83
|
+
marker: planMatch[0],
|
|
84
|
+
details: {
|
|
85
|
+
planId: planMatch[1],
|
|
86
|
+
},
|
|
87
|
+
timestamp: Date.now(),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// EXECUTE
|
|
91
|
+
const executeMatch = text.match(EXECUTE_PATTERN);
|
|
92
|
+
if (executeMatch) {
|
|
93
|
+
results.EXECUTE = {
|
|
94
|
+
completed: true,
|
|
95
|
+
marker: executeMatch[0],
|
|
96
|
+
details: {
|
|
97
|
+
taskId: executeMatch[1],
|
|
98
|
+
},
|
|
99
|
+
timestamp: Date.now(),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// VERIFY
|
|
103
|
+
const verifyMatch = text.match(VERIFY_PATTERN);
|
|
104
|
+
if (verifyMatch) {
|
|
105
|
+
results.VERIFY = {
|
|
106
|
+
completed: true,
|
|
107
|
+
marker: verifyMatch[0],
|
|
108
|
+
details: {
|
|
109
|
+
gates: verifyMatch[1].trim(),
|
|
110
|
+
},
|
|
111
|
+
timestamp: Date.now(),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// REVIEW
|
|
115
|
+
const reviewMatch = text.match(REVIEW_PATTERN);
|
|
116
|
+
if (reviewMatch) {
|
|
117
|
+
results.REVIEW = {
|
|
118
|
+
completed: true,
|
|
119
|
+
marker: reviewMatch[0],
|
|
120
|
+
details: {
|
|
121
|
+
files: reviewMatch[1],
|
|
122
|
+
findings: reviewMatch[2],
|
|
123
|
+
critical: reviewMatch[3],
|
|
124
|
+
high: reviewMatch[4],
|
|
125
|
+
principles: reviewMatch[5],
|
|
126
|
+
},
|
|
127
|
+
timestamp: Date.now(),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// SHIP
|
|
131
|
+
const shipMatch = text.match(SHIP_PATTERN);
|
|
132
|
+
if (shipMatch) {
|
|
133
|
+
results.SHIP = {
|
|
134
|
+
completed: true,
|
|
135
|
+
marker: shipMatch[0],
|
|
136
|
+
details: {
|
|
137
|
+
staged: shipMatch[1],
|
|
138
|
+
commit: shipMatch[2],
|
|
139
|
+
push: shipMatch[3],
|
|
140
|
+
},
|
|
141
|
+
timestamp: Date.now(),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return results;
|
|
145
|
+
}
|
|
146
|
+
// ─────────────────────────────────────────────────────────────
|
|
147
|
+
// State Management
|
|
148
|
+
// ─────────────────────────────────────────────────────────────
|
|
149
|
+
/** 获取当前 Phase 状态 */
|
|
150
|
+
getState() {
|
|
151
|
+
if (!existsSync(this.stateFile)) {
|
|
152
|
+
return this.createDefaultState();
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
const content = readFileSync(this.stateFile, 'utf-8');
|
|
156
|
+
return JSON.parse(content);
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return this.createDefaultState();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** 手动标记 Phase 完成 */
|
|
163
|
+
markComplete(phase, details) {
|
|
164
|
+
const state = this.getState();
|
|
165
|
+
state[phase] = {
|
|
166
|
+
completed: true,
|
|
167
|
+
details,
|
|
168
|
+
timestamp: Date.now(),
|
|
169
|
+
};
|
|
170
|
+
this.writeState(state);
|
|
171
|
+
logger.info({ phase, details }, 'Phase marked complete');
|
|
172
|
+
}
|
|
173
|
+
/** 重置 Phase 状态 */
|
|
174
|
+
resetPhase(phase) {
|
|
175
|
+
const state = this.getState();
|
|
176
|
+
state[phase] = { completed: false };
|
|
177
|
+
this.writeState(state);
|
|
178
|
+
logger.info({ phase }, 'Phase state reset');
|
|
179
|
+
}
|
|
180
|
+
/** 重置所有状态 */
|
|
181
|
+
resetAll() {
|
|
182
|
+
if (existsSync(this.stateFile)) {
|
|
183
|
+
unlinkSync(this.stateFile);
|
|
184
|
+
}
|
|
185
|
+
logger.info('All phase states reset');
|
|
186
|
+
}
|
|
187
|
+
/** 检查单个 Phase 是否完成 */
|
|
188
|
+
isPhaseComplete(phase) {
|
|
189
|
+
return this.getState()[phase]?.completed === true;
|
|
190
|
+
}
|
|
191
|
+
/** 检查所有必需 Phase 是否完成 */
|
|
192
|
+
isAllComplete() {
|
|
193
|
+
const state = this.getState();
|
|
194
|
+
const required = ['DEFINE', 'PLAN', 'EXECUTE', 'VERIFY', 'REVIEW', 'SHIP'];
|
|
195
|
+
return required.every(p => state[p]?.completed === true);
|
|
196
|
+
}
|
|
197
|
+
/** 获取缺失的 Phase 列表 */
|
|
198
|
+
getMissingPhases() {
|
|
199
|
+
const state = this.getState();
|
|
200
|
+
const required = ['DEFINE', 'PLAN', 'EXECUTE', 'VERIFY', 'REVIEW', 'SHIP'];
|
|
201
|
+
return required.filter(p => state[p]?.completed !== true);
|
|
202
|
+
}
|
|
203
|
+
/** 获取已完成的 Phase 列表 */
|
|
204
|
+
getCompletedPhases() {
|
|
205
|
+
const state = this.getState();
|
|
206
|
+
const all = ['DEFINE', 'PLAN', 'EXECUTE', 'VERIFY', 'REVIEW', 'SHIP'];
|
|
207
|
+
return all.filter(p => state[p]?.completed === true);
|
|
208
|
+
}
|
|
209
|
+
// ─────────────────────────────────────────────────────────────
|
|
210
|
+
// Report Generation
|
|
211
|
+
// ─────────────────────────────────────────────────────────────
|
|
212
|
+
/** 生成状态报告 */
|
|
213
|
+
generateReport() {
|
|
214
|
+
const state = this.getState();
|
|
215
|
+
const phaseOrder = ['DEFINE', 'PLAN', 'EXECUTE', 'VERIFY', 'REVIEW', 'SHIP'];
|
|
216
|
+
const lines = [
|
|
217
|
+
'# SCALE Engine Phase Status',
|
|
218
|
+
'',
|
|
219
|
+
];
|
|
220
|
+
for (const phase of phaseOrder) {
|
|
221
|
+
const status = state[phase];
|
|
222
|
+
if (status?.completed) {
|
|
223
|
+
lines.push(`✅ ${phase}: completed`);
|
|
224
|
+
if (status.details) {
|
|
225
|
+
for (const [key, value] of Object.entries(status.details)) {
|
|
226
|
+
lines.push(` - ${key}: ${value}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
lines.push(`⬜ ${phase}: pending`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
const completed = phaseOrder.filter(p => state[p]?.completed).length;
|
|
235
|
+
lines.push('');
|
|
236
|
+
lines.push(`Progress: ${completed}/${phaseOrder.length} phases`);
|
|
237
|
+
if (this.isAllComplete()) {
|
|
238
|
+
lines.push('');
|
|
239
|
+
lines.push('🎉 All phases complete — ready to ship!');
|
|
240
|
+
}
|
|
241
|
+
return lines.join('\n');
|
|
242
|
+
}
|
|
243
|
+
/** 生成 Stop Hook 检查结果 */
|
|
244
|
+
generateStopHookResult() {
|
|
245
|
+
const missing = this.getMissingPhases();
|
|
246
|
+
const pass = missing.length === 0;
|
|
247
|
+
if (pass) {
|
|
248
|
+
return {
|
|
249
|
+
pass: true,
|
|
250
|
+
message: 'All SCALE Engine phases complete',
|
|
251
|
+
missing: [],
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
pass: false,
|
|
256
|
+
message: `Incomplete phases: ${missing.join(', ')}`,
|
|
257
|
+
missing,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
// ─────────────────────────────────────────────────────────────
|
|
261
|
+
// Private Helpers
|
|
262
|
+
// ─────────────────────────────────────────────────────────────
|
|
263
|
+
createDefaultState() {
|
|
264
|
+
return {
|
|
265
|
+
DEFINE: { completed: false },
|
|
266
|
+
PLAN: { completed: false },
|
|
267
|
+
EXECUTE: { completed: false },
|
|
268
|
+
VERIFY: { completed: false },
|
|
269
|
+
REVIEW: { completed: false },
|
|
270
|
+
SHIP: { completed: false },
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
writeState(state) {
|
|
274
|
+
this.ensureDir();
|
|
275
|
+
writeFileSync(this.stateFile, JSON.stringify(state, null, 2), 'utf-8');
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// ============================================================================
|
|
279
|
+
// Standalone CLI Helper
|
|
280
|
+
// ============================================================================
|
|
281
|
+
/** 快速解析单个 marker 行(供 CLI 和 Hook 使用) */
|
|
282
|
+
export function parsePhaseMarker(line) {
|
|
283
|
+
const tracker = new PhaseMarkerTracker();
|
|
284
|
+
const results = tracker.parseMarkers(line);
|
|
285
|
+
const entries = Object.entries(results);
|
|
286
|
+
if (entries.length === 0)
|
|
287
|
+
return null;
|
|
288
|
+
const [phase, status] = entries[0];
|
|
289
|
+
return { phase: phase, details: status.details ?? {} };
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=PhaseMarkerTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PhaseMarkerTracker.js","sourceRoot":"","sources":["../../src/workflow/PhaseMarkerTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export type PhaseStatus = '✓' | '⏳' | '' | 'pending';
|
|
2
|
+
export interface FlowState {
|
|
3
|
+
SKILL_SCAN: PhaseStatus;
|
|
4
|
+
EXPLORE: PhaseStatus;
|
|
5
|
+
PLAN: PhaseStatus;
|
|
6
|
+
EXECUTE: PhaseStatus;
|
|
7
|
+
VERIFY: PhaseStatus;
|
|
8
|
+
SETTLE: PhaseStatus;
|
|
9
|
+
POLLUTION: PhaseStatus;
|
|
10
|
+
LAZY: PhaseStatus;
|
|
11
|
+
}
|
|
12
|
+
export interface SessionMarkers {
|
|
13
|
+
skillScanned: boolean;
|
|
14
|
+
skillList: string[];
|
|
15
|
+
verified: boolean;
|
|
16
|
+
pollutionDetected: boolean;
|
|
17
|
+
pollutionCleared: boolean;
|
|
18
|
+
lazyDetected: string[];
|
|
19
|
+
failCount: number;
|
|
20
|
+
}
|
|
21
|
+
export declare class SessionStateTracker {
|
|
22
|
+
private sessionDir;
|
|
23
|
+
private sessionId;
|
|
24
|
+
constructor(sessionId: string, scaleDir?: string);
|
|
25
|
+
private ensureDir;
|
|
26
|
+
/** Get current flow state */
|
|
27
|
+
getFlowState(): FlowState;
|
|
28
|
+
/** Update phase status */
|
|
29
|
+
updatePhase(phase: keyof FlowState, status: PhaseStatus): void;
|
|
30
|
+
/** Mark phase as complete */
|
|
31
|
+
markPhaseComplete(phase: keyof FlowState): void;
|
|
32
|
+
/** Mark phase as in progress */
|
|
33
|
+
markPhaseInProgress(phase: keyof FlowState): void;
|
|
34
|
+
/** Check if all phases complete */
|
|
35
|
+
isAllComplete(): boolean;
|
|
36
|
+
/** Get missing phases */
|
|
37
|
+
getMissingPhases(): string[];
|
|
38
|
+
private createDefaultFlowState;
|
|
39
|
+
private writeFlowState;
|
|
40
|
+
/** Mark skill scan complete */
|
|
41
|
+
markSkillScanned(skills: string[]): void;
|
|
42
|
+
/** Check if skill scanned */
|
|
43
|
+
isSkillScanned(): boolean;
|
|
44
|
+
/** Get scanned skills */
|
|
45
|
+
getScannedSkills(): string[];
|
|
46
|
+
/** Mark verification complete */
|
|
47
|
+
markVerified(): void;
|
|
48
|
+
/** Check if verified */
|
|
49
|
+
isVerified(): boolean;
|
|
50
|
+
/** Mark pollution detected */
|
|
51
|
+
markPollutionDetected(): void;
|
|
52
|
+
/** Clear pollution */
|
|
53
|
+
clearPollution(): void;
|
|
54
|
+
/** Check if pollution detected */
|
|
55
|
+
isPollutionDetected(): boolean;
|
|
56
|
+
/** Mark lazy detected */
|
|
57
|
+
markLazyDetected(type: string): void;
|
|
58
|
+
/** Clear lazy marker */
|
|
59
|
+
clearLazyMarker(type: string): void;
|
|
60
|
+
/** Check if lazy detected */
|
|
61
|
+
isLazyDetected(): boolean;
|
|
62
|
+
/** Get lazy types */
|
|
63
|
+
getLazyTypes(): string[];
|
|
64
|
+
/** Increment fail count */
|
|
65
|
+
incrementFailCount(): number;
|
|
66
|
+
/** Get fail count */
|
|
67
|
+
getFailCount(): number;
|
|
68
|
+
/** Reset fail count */
|
|
69
|
+
resetFailCount(): void;
|
|
70
|
+
/** Clear all session markers */
|
|
71
|
+
clearAll(): void;
|
|
72
|
+
/** Generate summary report */
|
|
73
|
+
generateSummary(): string;
|
|
74
|
+
}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
// SCALE Engine — Session State Tracker
|
|
2
|
+
// 轻量级状态文件追踪,用于认知工作流进度标记
|
|
3
|
+
// 设计参考:工作流配置优化方案 §3.1
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { logger } from '../core/logger.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Session State Tracker
|
|
9
|
+
// ============================================================================
|
|
10
|
+
export class SessionStateTracker {
|
|
11
|
+
constructor(sessionId, scaleDir = '.scale') {
|
|
12
|
+
this.sessionId = sessionId;
|
|
13
|
+
this.sessionDir = join(scaleDir, 'session');
|
|
14
|
+
this.ensureDir();
|
|
15
|
+
}
|
|
16
|
+
ensureDir() {
|
|
17
|
+
if (!existsSync(this.sessionDir)) {
|
|
18
|
+
mkdirSync(this.sessionDir, { recursive: true });
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// ─────────────────────────────────────────────────────────────
|
|
22
|
+
// Flow State Management
|
|
23
|
+
// ─────────────────────────────────────────────────────────────
|
|
24
|
+
/** Get current flow state */
|
|
25
|
+
getFlowState() {
|
|
26
|
+
const stateFile = join(this.sessionDir, '.flow-state');
|
|
27
|
+
if (!existsSync(stateFile)) {
|
|
28
|
+
return this.createDefaultFlowState();
|
|
29
|
+
}
|
|
30
|
+
const content = readFileSync(stateFile, 'utf-8');
|
|
31
|
+
const state = {
|
|
32
|
+
SKILL_SCAN: '',
|
|
33
|
+
EXPLORE: '',
|
|
34
|
+
PLAN: '',
|
|
35
|
+
EXECUTE: '',
|
|
36
|
+
VERIFY: '',
|
|
37
|
+
SETTLE: '',
|
|
38
|
+
POLLUTION: '',
|
|
39
|
+
LAZY: '',
|
|
40
|
+
};
|
|
41
|
+
// Parse state file
|
|
42
|
+
for (const line of content.split('\n')) {
|
|
43
|
+
const match = line.match(/^(\w+)=(✓|⏳|pending)?$/);
|
|
44
|
+
if (match) {
|
|
45
|
+
const [, phase, status] = match;
|
|
46
|
+
if (phase in state) {
|
|
47
|
+
state[phase] = status || '';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return state;
|
|
52
|
+
}
|
|
53
|
+
/** Update phase status */
|
|
54
|
+
updatePhase(phase, status) {
|
|
55
|
+
const state = this.getFlowState();
|
|
56
|
+
state[phase] = status;
|
|
57
|
+
this.writeFlowState(state);
|
|
58
|
+
logger.info({ phase, status, sessionId: this.sessionId }, 'Flow state updated');
|
|
59
|
+
}
|
|
60
|
+
/** Mark phase as complete */
|
|
61
|
+
markPhaseComplete(phase) {
|
|
62
|
+
this.updatePhase(phase, '✓');
|
|
63
|
+
}
|
|
64
|
+
/** Mark phase as in progress */
|
|
65
|
+
markPhaseInProgress(phase) {
|
|
66
|
+
this.updatePhase(phase, '⏳');
|
|
67
|
+
}
|
|
68
|
+
/** Check if all phases complete */
|
|
69
|
+
isAllComplete() {
|
|
70
|
+
const state = this.getFlowState();
|
|
71
|
+
const required = ['SKILL_SCAN', 'EXPLORE', 'PLAN', 'EXECUTE', 'VERIFY', 'SETTLE'];
|
|
72
|
+
return required.every(p => state[p] === '✓');
|
|
73
|
+
}
|
|
74
|
+
/** Get missing phases */
|
|
75
|
+
getMissingPhases() {
|
|
76
|
+
const state = this.getFlowState();
|
|
77
|
+
const required = ['SKILL_SCAN', 'EXPLORE', 'PLAN', 'EXECUTE', 'VERIFY', 'SETTLE'];
|
|
78
|
+
return required.filter(p => state[p] !== '✓');
|
|
79
|
+
}
|
|
80
|
+
createDefaultFlowState() {
|
|
81
|
+
return {
|
|
82
|
+
SKILL_SCAN: '',
|
|
83
|
+
EXPLORE: '',
|
|
84
|
+
PLAN: '',
|
|
85
|
+
EXECUTE: '',
|
|
86
|
+
VERIFY: '',
|
|
87
|
+
SETTLE: '',
|
|
88
|
+
POLLUTION: '',
|
|
89
|
+
LAZY: '',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
writeFlowState(state) {
|
|
93
|
+
const stateFile = join(this.sessionDir, '.flow-state');
|
|
94
|
+
const content = Object.entries(state)
|
|
95
|
+
.map(([phase, status]) => `${phase}=${status}`)
|
|
96
|
+
.join('\n');
|
|
97
|
+
writeFileSync(stateFile, content, 'utf-8');
|
|
98
|
+
}
|
|
99
|
+
// ─────────────────────────────────────────────────────────────
|
|
100
|
+
// Markers Management
|
|
101
|
+
// ─────────────────────────────────────────────────────────────
|
|
102
|
+
/** Mark skill scan complete */
|
|
103
|
+
markSkillScanned(skills) {
|
|
104
|
+
const markerFile = join(this.sessionDir, '.skill-scanned');
|
|
105
|
+
writeFileSync(markerFile, skills.join('|'), 'utf-8');
|
|
106
|
+
this.updatePhase('SKILL_SCAN', '✓');
|
|
107
|
+
logger.info({ skills, sessionId: this.sessionId }, 'Skill scan marked');
|
|
108
|
+
}
|
|
109
|
+
/** Check if skill scanned */
|
|
110
|
+
isSkillScanned() {
|
|
111
|
+
const markerFile = join(this.sessionDir, '.skill-scanned');
|
|
112
|
+
return existsSync(markerFile);
|
|
113
|
+
}
|
|
114
|
+
/** Get scanned skills */
|
|
115
|
+
getScannedSkills() {
|
|
116
|
+
const markerFile = join(this.sessionDir, '.skill-scanned');
|
|
117
|
+
if (!existsSync(markerFile))
|
|
118
|
+
return [];
|
|
119
|
+
return readFileSync(markerFile, 'utf-8').split('|');
|
|
120
|
+
}
|
|
121
|
+
/** Mark verification complete */
|
|
122
|
+
markVerified() {
|
|
123
|
+
const markerFile = join(this.sessionDir, '.verified');
|
|
124
|
+
writeFileSync(markerFile, '✓', 'utf-8');
|
|
125
|
+
this.updatePhase('VERIFY', '✓');
|
|
126
|
+
logger.info({ sessionId: this.sessionId }, 'Verification marked');
|
|
127
|
+
}
|
|
128
|
+
/** Check if verified */
|
|
129
|
+
isVerified() {
|
|
130
|
+
const markerFile = join(this.sessionDir, '.verified');
|
|
131
|
+
return existsSync(markerFile);
|
|
132
|
+
}
|
|
133
|
+
/** Mark pollution detected */
|
|
134
|
+
markPollutionDetected() {
|
|
135
|
+
const markerFile = join(this.sessionDir, '.pollution-detected');
|
|
136
|
+
writeFileSync(markerFile, 'POLLUTION=1', 'utf-8');
|
|
137
|
+
this.updatePhase('POLLUTION', 'pending');
|
|
138
|
+
logger.warn({ sessionId: this.sessionId }, 'Pollution detected');
|
|
139
|
+
}
|
|
140
|
+
/** Clear pollution */
|
|
141
|
+
clearPollution() {
|
|
142
|
+
const markerFile = join(this.sessionDir, '.pollution-detected');
|
|
143
|
+
if (existsSync(markerFile)) {
|
|
144
|
+
unlinkSync(markerFile);
|
|
145
|
+
}
|
|
146
|
+
this.updatePhase('POLLUTION', '✓');
|
|
147
|
+
logger.info({ sessionId: this.sessionId }, 'Pollution cleared');
|
|
148
|
+
}
|
|
149
|
+
/** Check if pollution detected */
|
|
150
|
+
isPollutionDetected() {
|
|
151
|
+
const markerFile = join(this.sessionDir, '.pollution-detected');
|
|
152
|
+
return existsSync(markerFile);
|
|
153
|
+
}
|
|
154
|
+
/** Mark lazy detected */
|
|
155
|
+
markLazyDetected(type) {
|
|
156
|
+
const markerFile = join(this.sessionDir, '.lazy-detected');
|
|
157
|
+
const existing = existsSync(markerFile) ? readFileSync(markerFile, 'utf-8') : '';
|
|
158
|
+
const updated = existing ? `${existing}\n${type}=1` : `${type}=1`;
|
|
159
|
+
writeFileSync(markerFile, updated, 'utf-8');
|
|
160
|
+
this.updatePhase('LAZY', 'pending');
|
|
161
|
+
logger.warn({ type, sessionId: this.sessionId }, 'Lazy detected');
|
|
162
|
+
}
|
|
163
|
+
/** Clear lazy marker */
|
|
164
|
+
clearLazyMarker(type) {
|
|
165
|
+
const markerFile = join(this.sessionDir, '.lazy-detected');
|
|
166
|
+
if (!existsSync(markerFile))
|
|
167
|
+
return;
|
|
168
|
+
const content = readFileSync(markerFile, 'utf-8');
|
|
169
|
+
const lines = content.split('\n').filter(l => !l.startsWith(`${type}=`));
|
|
170
|
+
if (lines.length === 0) {
|
|
171
|
+
unlinkSync(markerFile);
|
|
172
|
+
this.updatePhase('LAZY', '');
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
writeFileSync(markerFile, lines.join('\n'), 'utf-8');
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** Check if lazy detected */
|
|
179
|
+
isLazyDetected() {
|
|
180
|
+
const markerFile = join(this.sessionDir, '.lazy-detected');
|
|
181
|
+
return existsSync(markerFile);
|
|
182
|
+
}
|
|
183
|
+
/** Get lazy types */
|
|
184
|
+
getLazyTypes() {
|
|
185
|
+
const markerFile = join(this.sessionDir, '.lazy-detected');
|
|
186
|
+
if (!existsSync(markerFile))
|
|
187
|
+
return [];
|
|
188
|
+
return readFileSync(markerFile, 'utf-8')
|
|
189
|
+
.split('\n')
|
|
190
|
+
.filter(l => l.includes('=1'))
|
|
191
|
+
.map(l => l.split('=')[0]);
|
|
192
|
+
}
|
|
193
|
+
// ─────────────────────────────────────────────────────────────
|
|
194
|
+
// Fail Count Management
|
|
195
|
+
// ─────────────────────────────────────────────────────────────
|
|
196
|
+
/** Increment fail count */
|
|
197
|
+
incrementFailCount() {
|
|
198
|
+
const countFile = join(this.sessionDir, '.fail-count');
|
|
199
|
+
const current = existsSync(countFile) ? parseInt(readFileSync(countFile, 'utf-8'), 10) : 0;
|
|
200
|
+
const newCount = current + 1;
|
|
201
|
+
writeFileSync(countFile, String(newCount), 'utf-8');
|
|
202
|
+
// 检测污染(>= 2次失败)
|
|
203
|
+
if (newCount >= 2) {
|
|
204
|
+
this.markPollutionDetected();
|
|
205
|
+
}
|
|
206
|
+
return newCount;
|
|
207
|
+
}
|
|
208
|
+
/** Get fail count */
|
|
209
|
+
getFailCount() {
|
|
210
|
+
const countFile = join(this.sessionDir, '.fail-count');
|
|
211
|
+
if (!existsSync(countFile))
|
|
212
|
+
return 0;
|
|
213
|
+
return parseInt(readFileSync(countFile, 'utf-8'), 10);
|
|
214
|
+
}
|
|
215
|
+
/** Reset fail count */
|
|
216
|
+
resetFailCount() {
|
|
217
|
+
const countFile = join(this.sessionDir, '.fail-count');
|
|
218
|
+
if (existsSync(countFile)) {
|
|
219
|
+
unlinkSync(countFile);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// ─────────────────────────────────────────────────────────────
|
|
223
|
+
// Cleanup
|
|
224
|
+
// ─────────────────────────────────────────────────────────────
|
|
225
|
+
/** Clear all session markers */
|
|
226
|
+
clearAll() {
|
|
227
|
+
const files = [
|
|
228
|
+
'.flow-state',
|
|
229
|
+
'.skill-scanned',
|
|
230
|
+
'.verified',
|
|
231
|
+
'.pollution-detected',
|
|
232
|
+
'.lazy-detected',
|
|
233
|
+
'.fail-count',
|
|
234
|
+
'.tool-history',
|
|
235
|
+
];
|
|
236
|
+
for (const file of files) {
|
|
237
|
+
const filePath = join(this.sessionDir, file);
|
|
238
|
+
if (existsSync(filePath)) {
|
|
239
|
+
unlinkSync(filePath);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
logger.info({ sessionId: this.sessionId }, 'Session markers cleared');
|
|
243
|
+
}
|
|
244
|
+
/** Generate summary report */
|
|
245
|
+
generateSummary() {
|
|
246
|
+
const state = this.getFlowState();
|
|
247
|
+
const skills = this.getScannedSkills();
|
|
248
|
+
const lazyTypes = this.getLazyTypes();
|
|
249
|
+
const failCount = this.getFailCount();
|
|
250
|
+
let report = '# Session State Summary\n\n';
|
|
251
|
+
report += `Session ID: ${this.sessionId}\n\n`;
|
|
252
|
+
report += '## Flow State\n';
|
|
253
|
+
for (const [phase, status] of Object.entries(state)) {
|
|
254
|
+
report += `- ${phase}: ${status || 'pending'}\n`;
|
|
255
|
+
}
|
|
256
|
+
if (skills.length > 0) {
|
|
257
|
+
report += '\n## Scanned Skills\n';
|
|
258
|
+
report += skills.map(s => `- ${s}`).join('\n');
|
|
259
|
+
}
|
|
260
|
+
if (lazyTypes.length > 0) {
|
|
261
|
+
report += '\n## Lazy Detection\n';
|
|
262
|
+
report += lazyTypes.map(t => `- ${t}`).join('\n');
|
|
263
|
+
}
|
|
264
|
+
if (failCount > 0) {
|
|
265
|
+
report += `\n## Fail Count: ${failCount}\n`;
|
|
266
|
+
}
|
|
267
|
+
return report;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=SessionStateTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionStateTracker.js","sourceRoot":"","sources":["../../src/workflow/SessionStateTracker.ts"],"names":[],"mappings":"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"}
|