@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.
Files changed (116) hide show
  1. package/README.md +30 -2
  2. package/dist/adapters/ClaudeCodeAdapter.d.ts +1 -0
  3. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
  4. package/dist/adapters/KiroAdapter.d.ts +14 -0
  5. package/dist/adapters/KiroAdapter.js +180 -0
  6. package/dist/adapters/KiroAdapter.js.map +1 -0
  7. package/dist/adapters/index.d.ts +1 -0
  8. package/dist/adapters/index.js +3 -0
  9. package/dist/adapters/index.js.map +1 -1
  10. package/dist/api/cli.js +396 -5
  11. package/dist/api/cli.js.map +1 -1
  12. package/dist/api/doctor.d.ts +12 -0
  13. package/dist/api/doctor.js +232 -5
  14. package/dist/api/doctor.js.map +1 -1
  15. package/dist/api/quickstart.d.ts +19 -1
  16. package/dist/api/quickstart.js +103 -2
  17. package/dist/api/quickstart.js.map +1 -1
  18. package/dist/artifact/types.d.ts +16 -2
  19. package/dist/artifact/types.js.map +1 -1
  20. package/dist/cli/phaseCommands.d.ts +61 -0
  21. package/dist/cli/phaseCommands.js +559 -39
  22. package/dist/cli/phaseCommands.js.map +1 -1
  23. package/dist/cli/vibeCommands.d.ts +44 -0
  24. package/dist/cli/vibeCommands.js +244 -0
  25. package/dist/cli/vibeCommands.js.map +1 -0
  26. package/dist/guardrails/detectors.d.ts +9 -0
  27. package/dist/guardrails/detectors.js +102 -0
  28. package/dist/guardrails/detectors.js.map +1 -1
  29. package/dist/hooks/HookGeneratorEnhanced.js +29 -0
  30. package/dist/hooks/HookGeneratorEnhanced.js.map +1 -1
  31. package/dist/hooks/WorkflowHooksManager.js +20 -1
  32. package/dist/hooks/WorkflowHooksManager.js.map +1 -1
  33. package/dist/index.d.ts +6 -0
  34. package/dist/index.js +4 -0
  35. package/dist/index.js.map +1 -1
  36. package/dist/output/BrandThemeLoader.d.ts +54 -0
  37. package/dist/output/BrandThemeLoader.js +340 -0
  38. package/dist/output/BrandThemeLoader.js.map +1 -0
  39. package/dist/output/HTMLDocumentRenderer.d.ts +83 -0
  40. package/dist/output/HTMLDocumentRenderer.js +717 -0
  41. package/dist/output/HTMLDocumentRenderer.js.map +1 -0
  42. package/dist/output/UIPrototypeRenderer.d.ts +61 -0
  43. package/dist/output/UIPrototypeRenderer.js +500 -0
  44. package/dist/output/UIPrototypeRenderer.js.map +1 -0
  45. package/dist/output/index.d.ts +6 -0
  46. package/dist/output/index.js +6 -0
  47. package/dist/output/index.js.map +1 -0
  48. package/dist/prompts/PhasePromptRegistry.d.ts +53 -0
  49. package/dist/prompts/PhasePromptRegistry.js +517 -0
  50. package/dist/prompts/PhasePromptRegistry.js.map +1 -0
  51. package/dist/skills/SkillDiscovery.js +2 -1
  52. package/dist/skills/SkillDiscovery.js.map +1 -1
  53. package/dist/skills/index.d.ts +1 -0
  54. package/dist/skills/index.js +1 -0
  55. package/dist/skills/index.js.map +1 -1
  56. package/dist/skills/routing/SkillGate.d.ts +11 -0
  57. package/dist/skills/routing/SkillGate.js +76 -0
  58. package/dist/skills/routing/SkillGate.js.map +1 -0
  59. package/dist/skills/routing/SkillPlanner.d.ts +8 -0
  60. package/dist/skills/routing/SkillPlanner.js +91 -0
  61. package/dist/skills/routing/SkillPlanner.js.map +1 -0
  62. package/dist/skills/routing/SkillPolicy.d.ts +6 -0
  63. package/dist/skills/routing/SkillPolicy.js +146 -0
  64. package/dist/skills/routing/SkillPolicy.js.map +1 -0
  65. package/dist/skills/routing/SkillRoutingTypes.d.ts +72 -0
  66. package/dist/skills/routing/SkillRoutingTypes.js +2 -0
  67. package/dist/skills/routing/SkillRoutingTypes.js.map +1 -0
  68. package/dist/skills/routing/TaskIntentClassifier.d.ts +6 -0
  69. package/dist/skills/routing/TaskIntentClassifier.js +79 -0
  70. package/dist/skills/routing/TaskIntentClassifier.js.map +1 -0
  71. package/dist/skills/routing/index.d.ts +5 -0
  72. package/dist/skills/routing/index.js +6 -0
  73. package/dist/skills/routing/index.js.map +1 -0
  74. package/dist/workflow/GovernanceTemplates.d.ts +12 -0
  75. package/dist/workflow/GovernanceTemplates.js +515 -0
  76. package/dist/workflow/GovernanceTemplates.js.map +1 -0
  77. package/dist/workflow/PhaseMarkerTracker.d.ts +63 -0
  78. package/dist/workflow/PhaseMarkerTracker.js +291 -0
  79. package/dist/workflow/PhaseMarkerTracker.js.map +1 -0
  80. package/dist/workflow/SessionStateTracker.d.ts +74 -0
  81. package/dist/workflow/SessionStateTracker.js +270 -0
  82. package/dist/workflow/SessionStateTracker.js.map +1 -0
  83. package/dist/workflow/TaskArtifactScaffolder.d.ts +47 -0
  84. package/dist/workflow/TaskArtifactScaffolder.js +237 -0
  85. package/dist/workflow/TaskArtifactScaffolder.js.map +1 -0
  86. package/dist/workflow/TaskMetricsStore.d.ts +49 -0
  87. package/dist/workflow/TaskMetricsStore.js +149 -0
  88. package/dist/workflow/TaskMetricsStore.js.map +1 -0
  89. package/dist/workflow/VerificationCommands.d.ts +2 -0
  90. package/dist/workflow/VerificationCommands.js +7 -4
  91. package/dist/workflow/VerificationCommands.js.map +1 -1
  92. package/dist/workflow/VerificationProfile.d.ts +55 -0
  93. package/dist/workflow/VerificationProfile.js +133 -0
  94. package/dist/workflow/VerificationProfile.js.map +1 -0
  95. package/dist/workflow/WorkflowArtifactWriter.d.ts +113 -0
  96. package/dist/workflow/WorkflowArtifactWriter.js +241 -0
  97. package/dist/workflow/WorkflowArtifactWriter.js.map +1 -0
  98. package/dist/workflow/WorkflowEngine.d.ts +20 -2
  99. package/dist/workflow/WorkflowEngine.js +37 -8
  100. package/dist/workflow/WorkflowEngine.js.map +1 -1
  101. package/dist/workflow/autonomous/AutonomousDevLoop.d.ts +88 -0
  102. package/dist/workflow/autonomous/AutonomousDevLoop.js +381 -0
  103. package/dist/workflow/autonomous/AutonomousDevLoop.js.map +1 -0
  104. package/dist/workflow/autonomous/WorklogManager.d.ts +50 -0
  105. package/dist/workflow/autonomous/WorklogManager.js +264 -0
  106. package/dist/workflow/autonomous/WorklogManager.js.map +1 -0
  107. package/dist/workflow/autonomous/index.d.ts +2 -0
  108. package/dist/workflow/autonomous/index.js +4 -0
  109. package/dist/workflow/autonomous/index.js.map +1 -0
  110. package/dist/workflow/gates/GateSystem.d.ts +12 -3
  111. package/dist/workflow/gates/GateSystem.js +185 -41
  112. package/dist/workflow/gates/GateSystem.js.map +1 -1
  113. package/dist/workflow/index.d.ts +7 -0
  114. package/dist/workflow/index.js +7 -0
  115. package/dist/workflow/index.js.map +1 -1
  116. 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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"}