@hongmaple0820/scale-engine 0.12.3 → 0.14.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/dist/adapters/AiderAdapter.js +1 -1
- package/dist/adapters/AiderAdapter.js.map +1 -1
- package/dist/adapters/ClaudeCodeAdapter.d.ts +1 -0
- package/dist/adapters/ClaudeCodeAdapter.js +5 -3
- package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
- package/dist/adapters/CodexAdapter.js +1 -1
- package/dist/adapters/CodexAdapter.js.map +1 -1
- package/dist/adapters/CursorAdapter.js +1 -1
- package/dist/adapters/CursorAdapter.js.map +1 -1
- package/dist/adapters/DeepSeekTuiAdapter.js +5 -3
- package/dist/adapters/DeepSeekTuiAdapter.js.map +1 -1
- package/dist/adapters/DoubaoAdapter.js +1 -1
- package/dist/adapters/DoubaoAdapter.js.map +1 -1
- package/dist/adapters/GeminiAdapter.js +1 -1
- package/dist/adapters/GeminiAdapter.js.map +1 -1
- package/dist/adapters/HermesAdapter.js +1 -1
- package/dist/adapters/HermesAdapter.js.map +1 -1
- package/dist/adapters/KimiAdapter.js +1 -1
- package/dist/adapters/KimiAdapter.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/OpenClawAdapter.js +1 -1
- package/dist/adapters/OpenClawAdapter.js.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +1 -1
- package/dist/adapters/OpenCodeAdapter.js.map +1 -1
- package/dist/adapters/QCoderAdapter.js +1 -1
- package/dist/adapters/QCoderAdapter.js.map +1 -1
- package/dist/adapters/TraeAdapter.js +1 -1
- package/dist/adapters/TraeAdapter.js.map +1 -1
- package/dist/adapters/VSCAdapter.js +1 -1
- package/dist/adapters/VSCAdapter.js.map +1 -1
- package/dist/adapters/WindsurfAdapter.js +1 -1
- package/dist/adapters/WindsurfAdapter.js.map +1 -1
- package/dist/adapters/WorkBuddyAdapter.js +1 -1
- package/dist/adapters/WorkBuddyAdapter.js.map +1 -1
- 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 +690 -9
- package/dist/api/cli.js.map +1 -1
- package/dist/api/doctor.d.ts +13 -0
- package/dist/api/doctor.js +261 -5
- package/dist/api/doctor.js.map +1 -1
- package/dist/api/quickstart.d.ts +20 -1
- package/dist/api/quickstart.js +104 -3
- 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 +66 -0
- package/dist/cli/phaseCommands.js +695 -51
- package/dist/cli/phaseCommands.js.map +1 -1
- 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/skills/ExternalSkills.js +2 -0
- package/dist/skills/ExternalSkills.js.map +1 -1
- package/dist/skills/SkillCatalog.d.ts +13 -0
- package/dist/skills/SkillCatalog.js +184 -0
- package/dist/skills/SkillCatalog.js.map +1 -0
- package/dist/skills/SkillDiscovery.js +2 -1
- package/dist/skills/SkillDiscovery.js.map +1 -1
- package/dist/skills/SkillDoctor.d.ts +37 -0
- package/dist/skills/SkillDoctor.js +90 -0
- package/dist/skills/SkillDoctor.js.map +1 -0
- package/dist/skills/index.d.ts +2 -0
- package/dist/skills/index.js +2 -0
- package/dist/skills/index.js.map +1 -1
- package/dist/skills/routing/SkillGate.d.ts +12 -0
- package/dist/skills/routing/SkillGate.js +93 -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 +173 -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/GovernanceLock.d.ts +35 -0
- package/dist/workflow/GovernanceLock.js +58 -0
- package/dist/workflow/GovernanceLock.js.map +1 -0
- package/dist/workflow/GovernanceTemplatePacks.d.ts +24 -0
- package/dist/workflow/GovernanceTemplatePacks.js +83 -0
- package/dist/workflow/GovernanceTemplatePacks.js.map +1 -0
- package/dist/workflow/GovernanceTemplates.d.ts +17 -0
- package/dist/workflow/GovernanceTemplates.js +686 -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 +8 -12
- package/dist/workflow/VerificationCommands.js.map +1 -1
- package/dist/workflow/VerificationProfile.d.ts +56 -0
- package/dist/workflow/VerificationProfile.js +170 -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 +26 -5
- package/dist/workflow/WorkflowEngine.js +38 -9
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- package/dist/workflow/WorkspaceLifecycle.d.ts +51 -0
- package/dist/workflow/WorkspaceLifecycle.js +259 -0
- package/dist/workflow/WorkspaceLifecycle.js.map +1 -0
- 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 +10 -0
- package/dist/workflow/index.js +10 -0
- package/dist/workflow/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -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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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { GateResult } from './types.js';
|
|
2
|
+
import { type SkillPlan } from '../skills/routing/index.js';
|
|
3
|
+
export type TaskArtifactLevel = 'S' | 'M' | 'L' | 'CRITICAL';
|
|
4
|
+
export interface TaskArtifactScaffoldOptions {
|
|
5
|
+
projectDir?: string;
|
|
6
|
+
taskId: string;
|
|
7
|
+
taskName: string;
|
|
8
|
+
description: string;
|
|
9
|
+
level: TaskArtifactLevel;
|
|
10
|
+
services?: string[];
|
|
11
|
+
skillPlan?: SkillPlan;
|
|
12
|
+
}
|
|
13
|
+
export interface TaskArtifactScaffoldResult {
|
|
14
|
+
relativeDir?: string;
|
|
15
|
+
dir?: string;
|
|
16
|
+
created: string[];
|
|
17
|
+
skipped: string[];
|
|
18
|
+
}
|
|
19
|
+
export interface VerificationArtifactAppendOptions {
|
|
20
|
+
projectDir?: string;
|
|
21
|
+
artifactsDir?: string;
|
|
22
|
+
taskId: string;
|
|
23
|
+
profile: string;
|
|
24
|
+
services: string[];
|
|
25
|
+
gateResults: GateResult[];
|
|
26
|
+
passed: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface TaskArtifactCheckOptions {
|
|
29
|
+
projectDir?: string;
|
|
30
|
+
artifactsDir?: string;
|
|
31
|
+
level: TaskArtifactLevel;
|
|
32
|
+
skillRequiredArtifacts?: string[];
|
|
33
|
+
}
|
|
34
|
+
export interface TaskArtifactIncompleteItem {
|
|
35
|
+
file: string;
|
|
36
|
+
reason: string;
|
|
37
|
+
}
|
|
38
|
+
export interface TaskArtifactCheckResult {
|
|
39
|
+
complete: boolean;
|
|
40
|
+
artifactsDir?: string;
|
|
41
|
+
required: string[];
|
|
42
|
+
missing: string[];
|
|
43
|
+
incomplete: TaskArtifactIncompleteItem[];
|
|
44
|
+
}
|
|
45
|
+
export declare function scaffoldTaskArtifacts(options: TaskArtifactScaffoldOptions): TaskArtifactScaffoldResult;
|
|
46
|
+
export declare function appendVerificationArtifact(options: VerificationArtifactAppendOptions): string | null;
|
|
47
|
+
export declare function checkTaskArtifactCompleteness(options: TaskArtifactCheckOptions): TaskArtifactCheckResult;
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { isAbsolute, join, resolve } from 'node:path';
|
|
3
|
+
import { governanceTemplateContent } from './GovernanceTemplates.js';
|
|
4
|
+
import { skillPlanMarkdown } from '../skills/routing/index.js';
|
|
5
|
+
const TASK_ARTIFACTS = [
|
|
6
|
+
'explore.md',
|
|
7
|
+
'mini-prd.md',
|
|
8
|
+
'skill-plan.md',
|
|
9
|
+
'plan.md',
|
|
10
|
+
'verification.md',
|
|
11
|
+
'review.md',
|
|
12
|
+
'summary.md',
|
|
13
|
+
];
|
|
14
|
+
export function scaffoldTaskArtifacts(options) {
|
|
15
|
+
if (options.level === 'S')
|
|
16
|
+
return { created: [], skipped: [] };
|
|
17
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
18
|
+
const relativeDir = join('docs', 'worklog', 'tasks', `${currentDate()}-${slugify(options.taskName || options.description || options.taskId)}`);
|
|
19
|
+
const dir = uniqueDirectory(projectDir, relativeDir, options.taskId);
|
|
20
|
+
const result = {
|
|
21
|
+
relativeDir: relativePath(projectDir, dir),
|
|
22
|
+
dir,
|
|
23
|
+
created: [],
|
|
24
|
+
skipped: [],
|
|
25
|
+
};
|
|
26
|
+
if (!existsSync(dir))
|
|
27
|
+
mkdirSync(dir, { recursive: true });
|
|
28
|
+
const artifacts = unique([
|
|
29
|
+
...TASK_ARTIFACTS,
|
|
30
|
+
...(options.skillPlan?.requiredArtifacts ?? []),
|
|
31
|
+
]);
|
|
32
|
+
for (const name of artifacts) {
|
|
33
|
+
const target = join(dir, name);
|
|
34
|
+
if (existsSync(target)) {
|
|
35
|
+
result.skipped.push(target);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const template = name === 'skill-plan.md' && options.skillPlan
|
|
39
|
+
? skillPlanMarkdown(options.skillPlan)
|
|
40
|
+
: readTemplate(projectDir, name);
|
|
41
|
+
const content = name === 'skill-plan.md' && options.skillPlan
|
|
42
|
+
? template
|
|
43
|
+
: injectTaskMetadata(template, options);
|
|
44
|
+
writeFileSync(target, content, 'utf-8');
|
|
45
|
+
result.created.push(target);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
export function appendVerificationArtifact(options) {
|
|
50
|
+
if (!options.artifactsDir)
|
|
51
|
+
return null;
|
|
52
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
53
|
+
const dir = isAbsolute(options.artifactsDir) ? options.artifactsDir : resolve(projectDir, options.artifactsDir);
|
|
54
|
+
if (!existsSync(dir))
|
|
55
|
+
return null;
|
|
56
|
+
const target = join(dir, 'verification.md');
|
|
57
|
+
if (!existsSync(target)) {
|
|
58
|
+
writeFileSync(target, injectTaskMetadata(readTemplate(projectDir, 'verification.md'), {
|
|
59
|
+
projectDir,
|
|
60
|
+
taskId: options.taskId,
|
|
61
|
+
taskName: options.taskId,
|
|
62
|
+
description: '',
|
|
63
|
+
level: 'M',
|
|
64
|
+
services: options.services,
|
|
65
|
+
}), 'utf-8');
|
|
66
|
+
}
|
|
67
|
+
appendFileSync(target, verificationRunMarkdown(options), 'utf-8');
|
|
68
|
+
return target;
|
|
69
|
+
}
|
|
70
|
+
export function checkTaskArtifactCompleteness(options) {
|
|
71
|
+
if (options.level === 'S') {
|
|
72
|
+
return { complete: true, artifactsDir: options.artifactsDir, required: [], missing: [], incomplete: [] };
|
|
73
|
+
}
|
|
74
|
+
if (!options.artifactsDir) {
|
|
75
|
+
const required = requiredArtifactsForLevel(options.level, options.skillRequiredArtifacts);
|
|
76
|
+
return {
|
|
77
|
+
complete: false,
|
|
78
|
+
required,
|
|
79
|
+
missing: required,
|
|
80
|
+
incomplete: [],
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const projectDir = resolve(options.projectDir ?? process.cwd());
|
|
84
|
+
const dir = isAbsolute(options.artifactsDir) ? options.artifactsDir : resolve(projectDir, options.artifactsDir);
|
|
85
|
+
const required = requiredArtifactsForLevel(options.level, options.skillRequiredArtifacts);
|
|
86
|
+
const missing = [];
|
|
87
|
+
const incomplete = [];
|
|
88
|
+
for (const file of required) {
|
|
89
|
+
const path = join(dir, file);
|
|
90
|
+
if (!existsSync(path)) {
|
|
91
|
+
missing.push(file);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const reason = incompleteReason(file, readFileSync(path, 'utf-8'));
|
|
95
|
+
if (reason)
|
|
96
|
+
incomplete.push({ file, reason });
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
complete: missing.length === 0 && incomplete.length === 0,
|
|
100
|
+
artifactsDir: dir,
|
|
101
|
+
required,
|
|
102
|
+
missing,
|
|
103
|
+
incomplete,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function verificationRunMarkdown(options) {
|
|
107
|
+
const rows = options.gateResults.flatMap(result => (result.evidenceItems ?? []).map(item => {
|
|
108
|
+
const command = item.command ?? item.label;
|
|
109
|
+
const resultText = item.passed ? 'PASS' : 'FAIL';
|
|
110
|
+
const notes = [
|
|
111
|
+
`gate=${result.gate}`,
|
|
112
|
+
item.cwd ? `cwd=${item.cwd}` : '',
|
|
113
|
+
typeof item.exitCode === 'number' ? `exit=${item.exitCode}` : '',
|
|
114
|
+
item.outputHash ? `hash=${item.outputHash}` : '',
|
|
115
|
+
].filter(Boolean).join('; ');
|
|
116
|
+
return `| ${escapeCell(command)} | ${resultText} | ${escapeCell(notes || item.detail)} |`;
|
|
117
|
+
}));
|
|
118
|
+
return `
|
|
119
|
+
## SCALE Verification Run - ${new Date().toISOString()}
|
|
120
|
+
|
|
121
|
+
Profile: ${options.profile}
|
|
122
|
+
Services: ${options.services.length ? options.services.join(', ') : 'root'}
|
|
123
|
+
Final Status: ${options.passed ? 'passed' : 'failed'}
|
|
124
|
+
|
|
125
|
+
| Command | Result | Notes |
|
|
126
|
+
| --- | --- | --- |
|
|
127
|
+
${rows.length ? rows.join('\n') : '| no command evidence | FAIL | no evidence items recorded |'}
|
|
128
|
+
`;
|
|
129
|
+
}
|
|
130
|
+
function readTemplate(projectDir, name) {
|
|
131
|
+
const templatePath = join(projectDir, 'docs', 'workflow', 'templates', name);
|
|
132
|
+
if (existsSync(templatePath))
|
|
133
|
+
return readFileSync(templatePath, 'utf-8');
|
|
134
|
+
return isGovernanceTemplateName(name)
|
|
135
|
+
? governanceTemplateContent(name)
|
|
136
|
+
: `# ${name}\n\n## Evidence\n\n\n`;
|
|
137
|
+
}
|
|
138
|
+
function requiredArtifactsForLevel(level, skillRequiredArtifacts = []) {
|
|
139
|
+
if (level === 'S')
|
|
140
|
+
return [];
|
|
141
|
+
const required = ['explore.md', 'skill-plan.md', 'plan.md', 'verification.md', 'review.md', 'summary.md'];
|
|
142
|
+
if (level === 'L' || level === 'CRITICAL')
|
|
143
|
+
required.splice(1, 0, 'mini-prd.md');
|
|
144
|
+
return unique([...required, ...skillRequiredArtifacts]);
|
|
145
|
+
}
|
|
146
|
+
function incompleteReason(file, content) {
|
|
147
|
+
if (file === 'verification.md' && /SCALE Verification Run|Final Status:\s*(passed|failed)|\|\s*[^|\s][^|]*\|\s*(PASS|FAIL)/i.test(content)) {
|
|
148
|
+
return null;
|
|
149
|
+
}
|
|
150
|
+
const substantive = substantiveLines(content);
|
|
151
|
+
const minimumLines = file === 'mini-prd.md' ? 3 : file === 'skill-plan.md' ? 1 : 2;
|
|
152
|
+
if (substantive.length < minimumLines) {
|
|
153
|
+
return `contains only template placeholders (${substantive.length}/${minimumLines} substantive lines)`;
|
|
154
|
+
}
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
function substantiveLines(content) {
|
|
158
|
+
return content
|
|
159
|
+
.split(/\r?\n/)
|
|
160
|
+
.map(line => line.trim())
|
|
161
|
+
.filter(line => line.length > 0)
|
|
162
|
+
.filter(line => !line.startsWith('#'))
|
|
163
|
+
.filter(line => !line.startsWith('**Task ID**:'))
|
|
164
|
+
.filter(line => !line.startsWith('**Task**:'))
|
|
165
|
+
.filter(line => !line.startsWith('**Level**:'))
|
|
166
|
+
.filter(line => !line.startsWith('**Services**:'))
|
|
167
|
+
.filter(line => !line.startsWith('**Created**:'))
|
|
168
|
+
.filter(line => !/^tbd$/i.test(line))
|
|
169
|
+
.filter(line => !/^\|/.test(line))
|
|
170
|
+
.filter(line => !/^\|?[\s:-]+\|[\s|:-]*$/.test(line))
|
|
171
|
+
.filter(line => !/^[-*]\s*(\[ \])?\s*(tbd)?$/i.test(line))
|
|
172
|
+
.filter(line => !/^\d+\.\s*(tbd)?$/i.test(line))
|
|
173
|
+
.filter(line => !/^\*Generated by SCALE Engine/i.test(line));
|
|
174
|
+
}
|
|
175
|
+
function injectTaskMetadata(template, options) {
|
|
176
|
+
const metadata = [
|
|
177
|
+
`**Task ID**: ${options.taskId}`,
|
|
178
|
+
`**Task**: ${options.taskName}`,
|
|
179
|
+
`**Level**: ${options.level}`,
|
|
180
|
+
`**Services**: ${options.services?.length ? options.services.join(', ') : 'unspecified'}`,
|
|
181
|
+
`**Created**: ${new Date().toISOString()}`,
|
|
182
|
+
'',
|
|
183
|
+
].join('\n');
|
|
184
|
+
return template.replace(/^(# .+\n)/, `$1\n${metadata}`);
|
|
185
|
+
}
|
|
186
|
+
function uniqueDirectory(projectDir, relativeDir, taskId) {
|
|
187
|
+
const preferred = resolve(projectDir, relativeDir);
|
|
188
|
+
if (!existsSync(preferred))
|
|
189
|
+
return preferred;
|
|
190
|
+
const summary = join(preferred, 'summary.md');
|
|
191
|
+
if (existsSync(summary) && readFileSync(summary, 'utf-8').includes(`**Task ID**: ${taskId}`)) {
|
|
192
|
+
return preferred;
|
|
193
|
+
}
|
|
194
|
+
return resolve(projectDir, `${relativeDir}-${slugify(taskId).slice(0, 16)}`);
|
|
195
|
+
}
|
|
196
|
+
function relativePath(projectDir, path) {
|
|
197
|
+
return path.startsWith(projectDir)
|
|
198
|
+
? path.slice(projectDir.length + 1).replace(/\\/g, '/')
|
|
199
|
+
: path.replace(/\\/g, '/');
|
|
200
|
+
}
|
|
201
|
+
function currentDate() {
|
|
202
|
+
return new Date().toISOString().slice(0, 10);
|
|
203
|
+
}
|
|
204
|
+
function slugify(value) {
|
|
205
|
+
const slug = value
|
|
206
|
+
.toLowerCase()
|
|
207
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
208
|
+
.replace(/^-+|-+$/g, '')
|
|
209
|
+
.slice(0, 48);
|
|
210
|
+
return slug || 'task';
|
|
211
|
+
}
|
|
212
|
+
function escapeCell(value) {
|
|
213
|
+
return value.replace(/\|/g, '\\|').replace(/\r?\n/g, ' ');
|
|
214
|
+
}
|
|
215
|
+
function isGovernanceTemplateName(name) {
|
|
216
|
+
return [
|
|
217
|
+
'explore.md',
|
|
218
|
+
'mini-prd.md',
|
|
219
|
+
'skill-plan.md',
|
|
220
|
+
'skill-evidence.md',
|
|
221
|
+
'ui-spec.md',
|
|
222
|
+
'visual-review.md',
|
|
223
|
+
'api-contract.md',
|
|
224
|
+
'docs-impact.md',
|
|
225
|
+
'security-review.md',
|
|
226
|
+
'db-change-plan.md',
|
|
227
|
+
'e2e-plan.md',
|
|
228
|
+
'plan.md',
|
|
229
|
+
'verification.md',
|
|
230
|
+
'review.md',
|
|
231
|
+
'summary.md',
|
|
232
|
+
].includes(name);
|
|
233
|
+
}
|
|
234
|
+
function unique(items) {
|
|
235
|
+
return [...new Set(items)];
|
|
236
|
+
}
|
|
237
|
+
//# sourceMappingURL=TaskArtifactScaffolder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskArtifactScaffolder.js","sourceRoot":"","sources":["../../src/workflow/TaskArtifactScaffolder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type MetricTaskLevel = 'M' | 'L' | 'CRITICAL';
|
|
2
|
+
export interface TaskMetricRecord {
|
|
3
|
+
date: string;
|
|
4
|
+
taskId: string;
|
|
5
|
+
taskName: string;
|
|
6
|
+
level: MetricTaskLevel;
|
|
7
|
+
services: string[];
|
|
8
|
+
filesChanged: number;
|
|
9
|
+
firstVerificationPass: boolean;
|
|
10
|
+
fixIterations: number;
|
|
11
|
+
reworkNeeded: boolean;
|
|
12
|
+
artifactComplete: boolean;
|
|
13
|
+
residualRisk: string;
|
|
14
|
+
finalGateStatus: 'passed' | 'failed' | 'blocked';
|
|
15
|
+
}
|
|
16
|
+
export interface TaskMetricSummary {
|
|
17
|
+
total: number;
|
|
18
|
+
firstPassRate: number;
|
|
19
|
+
averageFixIterations: number;
|
|
20
|
+
artifactCompletenessRate: number;
|
|
21
|
+
residualRiskClarityRate: number;
|
|
22
|
+
}
|
|
23
|
+
export interface VerificationMetricInput {
|
|
24
|
+
taskId: string;
|
|
25
|
+
taskName: string;
|
|
26
|
+
level: MetricTaskLevel;
|
|
27
|
+
services?: string[];
|
|
28
|
+
filesChanged?: number;
|
|
29
|
+
passed: boolean;
|
|
30
|
+
artifactComplete?: boolean;
|
|
31
|
+
residualRisk?: string;
|
|
32
|
+
finalGateStatus?: TaskMetricRecord['finalGateStatus'];
|
|
33
|
+
date?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare class TaskMetricsStore {
|
|
36
|
+
private metricsDir;
|
|
37
|
+
private recordsPath;
|
|
38
|
+
constructor(scaleDir?: string);
|
|
39
|
+
append(record: TaskMetricRecord): void;
|
|
40
|
+
upsert(record: TaskMetricRecord): void;
|
|
41
|
+
recordVerification(input: VerificationMetricInput): TaskMetricRecord;
|
|
42
|
+
list(): TaskMetricRecord[];
|
|
43
|
+
findByTaskId(taskId: string): TaskMetricRecord | undefined;
|
|
44
|
+
summarize(): TaskMetricSummary;
|
|
45
|
+
toMarkdownRow(record: TaskMetricRecord): string;
|
|
46
|
+
writeMarkdownReport(projectDir?: string): string;
|
|
47
|
+
private renderGeneratedMarkdownSection;
|
|
48
|
+
private writeAll;
|
|
49
|
+
}
|