@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.
Files changed (157) hide show
  1. package/dist/adapters/AiderAdapter.js +1 -1
  2. package/dist/adapters/AiderAdapter.js.map +1 -1
  3. package/dist/adapters/ClaudeCodeAdapter.d.ts +1 -0
  4. package/dist/adapters/ClaudeCodeAdapter.js +5 -3
  5. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
  6. package/dist/adapters/CodexAdapter.js +1 -1
  7. package/dist/adapters/CodexAdapter.js.map +1 -1
  8. package/dist/adapters/CursorAdapter.js +1 -1
  9. package/dist/adapters/CursorAdapter.js.map +1 -1
  10. package/dist/adapters/DeepSeekTuiAdapter.js +5 -3
  11. package/dist/adapters/DeepSeekTuiAdapter.js.map +1 -1
  12. package/dist/adapters/DoubaoAdapter.js +1 -1
  13. package/dist/adapters/DoubaoAdapter.js.map +1 -1
  14. package/dist/adapters/GeminiAdapter.js +1 -1
  15. package/dist/adapters/GeminiAdapter.js.map +1 -1
  16. package/dist/adapters/HermesAdapter.js +1 -1
  17. package/dist/adapters/HermesAdapter.js.map +1 -1
  18. package/dist/adapters/KimiAdapter.js +1 -1
  19. package/dist/adapters/KimiAdapter.js.map +1 -1
  20. package/dist/adapters/KiroAdapter.d.ts +14 -0
  21. package/dist/adapters/KiroAdapter.js +180 -0
  22. package/dist/adapters/KiroAdapter.js.map +1 -0
  23. package/dist/adapters/OpenClawAdapter.js +1 -1
  24. package/dist/adapters/OpenClawAdapter.js.map +1 -1
  25. package/dist/adapters/OpenCodeAdapter.js +1 -1
  26. package/dist/adapters/OpenCodeAdapter.js.map +1 -1
  27. package/dist/adapters/QCoderAdapter.js +1 -1
  28. package/dist/adapters/QCoderAdapter.js.map +1 -1
  29. package/dist/adapters/TraeAdapter.js +1 -1
  30. package/dist/adapters/TraeAdapter.js.map +1 -1
  31. package/dist/adapters/VSCAdapter.js +1 -1
  32. package/dist/adapters/VSCAdapter.js.map +1 -1
  33. package/dist/adapters/WindsurfAdapter.js +1 -1
  34. package/dist/adapters/WindsurfAdapter.js.map +1 -1
  35. package/dist/adapters/WorkBuddyAdapter.js +1 -1
  36. package/dist/adapters/WorkBuddyAdapter.js.map +1 -1
  37. package/dist/adapters/index.d.ts +1 -0
  38. package/dist/adapters/index.js +3 -0
  39. package/dist/adapters/index.js.map +1 -1
  40. package/dist/api/cli.js +690 -9
  41. package/dist/api/cli.js.map +1 -1
  42. package/dist/api/doctor.d.ts +13 -0
  43. package/dist/api/doctor.js +261 -5
  44. package/dist/api/doctor.js.map +1 -1
  45. package/dist/api/quickstart.d.ts +20 -1
  46. package/dist/api/quickstart.js +104 -3
  47. package/dist/api/quickstart.js.map +1 -1
  48. package/dist/artifact/types.d.ts +16 -2
  49. package/dist/artifact/types.js.map +1 -1
  50. package/dist/cli/phaseCommands.d.ts +66 -0
  51. package/dist/cli/phaseCommands.js +695 -51
  52. package/dist/cli/phaseCommands.js.map +1 -1
  53. package/dist/guardrails/detectors.d.ts +9 -0
  54. package/dist/guardrails/detectors.js +102 -0
  55. package/dist/guardrails/detectors.js.map +1 -1
  56. package/dist/hooks/HookGeneratorEnhanced.js +29 -0
  57. package/dist/hooks/HookGeneratorEnhanced.js.map +1 -1
  58. package/dist/hooks/WorkflowHooksManager.js +20 -1
  59. package/dist/hooks/WorkflowHooksManager.js.map +1 -1
  60. package/dist/index.d.ts +6 -0
  61. package/dist/index.js +4 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/output/BrandThemeLoader.d.ts +54 -0
  64. package/dist/output/BrandThemeLoader.js +340 -0
  65. package/dist/output/BrandThemeLoader.js.map +1 -0
  66. package/dist/output/HTMLDocumentRenderer.d.ts +83 -0
  67. package/dist/output/HTMLDocumentRenderer.js +717 -0
  68. package/dist/output/HTMLDocumentRenderer.js.map +1 -0
  69. package/dist/output/UIPrototypeRenderer.d.ts +61 -0
  70. package/dist/output/UIPrototypeRenderer.js +500 -0
  71. package/dist/output/UIPrototypeRenderer.js.map +1 -0
  72. package/dist/output/index.d.ts +6 -0
  73. package/dist/output/index.js +6 -0
  74. package/dist/output/index.js.map +1 -0
  75. package/dist/skills/ExternalSkills.js +2 -0
  76. package/dist/skills/ExternalSkills.js.map +1 -1
  77. package/dist/skills/SkillCatalog.d.ts +13 -0
  78. package/dist/skills/SkillCatalog.js +184 -0
  79. package/dist/skills/SkillCatalog.js.map +1 -0
  80. package/dist/skills/SkillDiscovery.js +2 -1
  81. package/dist/skills/SkillDiscovery.js.map +1 -1
  82. package/dist/skills/SkillDoctor.d.ts +37 -0
  83. package/dist/skills/SkillDoctor.js +90 -0
  84. package/dist/skills/SkillDoctor.js.map +1 -0
  85. package/dist/skills/index.d.ts +2 -0
  86. package/dist/skills/index.js +2 -0
  87. package/dist/skills/index.js.map +1 -1
  88. package/dist/skills/routing/SkillGate.d.ts +12 -0
  89. package/dist/skills/routing/SkillGate.js +93 -0
  90. package/dist/skills/routing/SkillGate.js.map +1 -0
  91. package/dist/skills/routing/SkillPlanner.d.ts +8 -0
  92. package/dist/skills/routing/SkillPlanner.js +91 -0
  93. package/dist/skills/routing/SkillPlanner.js.map +1 -0
  94. package/dist/skills/routing/SkillPolicy.d.ts +6 -0
  95. package/dist/skills/routing/SkillPolicy.js +173 -0
  96. package/dist/skills/routing/SkillPolicy.js.map +1 -0
  97. package/dist/skills/routing/SkillRoutingTypes.d.ts +72 -0
  98. package/dist/skills/routing/SkillRoutingTypes.js +2 -0
  99. package/dist/skills/routing/SkillRoutingTypes.js.map +1 -0
  100. package/dist/skills/routing/TaskIntentClassifier.d.ts +6 -0
  101. package/dist/skills/routing/TaskIntentClassifier.js +79 -0
  102. package/dist/skills/routing/TaskIntentClassifier.js.map +1 -0
  103. package/dist/skills/routing/index.d.ts +5 -0
  104. package/dist/skills/routing/index.js +6 -0
  105. package/dist/skills/routing/index.js.map +1 -0
  106. package/dist/workflow/GovernanceLock.d.ts +35 -0
  107. package/dist/workflow/GovernanceLock.js +58 -0
  108. package/dist/workflow/GovernanceLock.js.map +1 -0
  109. package/dist/workflow/GovernanceTemplatePacks.d.ts +24 -0
  110. package/dist/workflow/GovernanceTemplatePacks.js +83 -0
  111. package/dist/workflow/GovernanceTemplatePacks.js.map +1 -0
  112. package/dist/workflow/GovernanceTemplates.d.ts +17 -0
  113. package/dist/workflow/GovernanceTemplates.js +686 -0
  114. package/dist/workflow/GovernanceTemplates.js.map +1 -0
  115. package/dist/workflow/PhaseMarkerTracker.d.ts +63 -0
  116. package/dist/workflow/PhaseMarkerTracker.js +291 -0
  117. package/dist/workflow/PhaseMarkerTracker.js.map +1 -0
  118. package/dist/workflow/SessionStateTracker.d.ts +74 -0
  119. package/dist/workflow/SessionStateTracker.js +270 -0
  120. package/dist/workflow/SessionStateTracker.js.map +1 -0
  121. package/dist/workflow/TaskArtifactScaffolder.d.ts +47 -0
  122. package/dist/workflow/TaskArtifactScaffolder.js +237 -0
  123. package/dist/workflow/TaskArtifactScaffolder.js.map +1 -0
  124. package/dist/workflow/TaskMetricsStore.d.ts +49 -0
  125. package/dist/workflow/TaskMetricsStore.js +149 -0
  126. package/dist/workflow/TaskMetricsStore.js.map +1 -0
  127. package/dist/workflow/VerificationCommands.d.ts +2 -0
  128. package/dist/workflow/VerificationCommands.js +8 -12
  129. package/dist/workflow/VerificationCommands.js.map +1 -1
  130. package/dist/workflow/VerificationProfile.d.ts +56 -0
  131. package/dist/workflow/VerificationProfile.js +170 -0
  132. package/dist/workflow/VerificationProfile.js.map +1 -0
  133. package/dist/workflow/WorkflowArtifactWriter.d.ts +113 -0
  134. package/dist/workflow/WorkflowArtifactWriter.js +241 -0
  135. package/dist/workflow/WorkflowArtifactWriter.js.map +1 -0
  136. package/dist/workflow/WorkflowEngine.d.ts +26 -5
  137. package/dist/workflow/WorkflowEngine.js +38 -9
  138. package/dist/workflow/WorkflowEngine.js.map +1 -1
  139. package/dist/workflow/WorkspaceLifecycle.d.ts +51 -0
  140. package/dist/workflow/WorkspaceLifecycle.js +259 -0
  141. package/dist/workflow/WorkspaceLifecycle.js.map +1 -0
  142. package/dist/workflow/autonomous/AutonomousDevLoop.d.ts +88 -0
  143. package/dist/workflow/autonomous/AutonomousDevLoop.js +381 -0
  144. package/dist/workflow/autonomous/AutonomousDevLoop.js.map +1 -0
  145. package/dist/workflow/autonomous/WorklogManager.d.ts +50 -0
  146. package/dist/workflow/autonomous/WorklogManager.js +264 -0
  147. package/dist/workflow/autonomous/WorklogManager.js.map +1 -0
  148. package/dist/workflow/autonomous/index.d.ts +2 -0
  149. package/dist/workflow/autonomous/index.js +4 -0
  150. package/dist/workflow/autonomous/index.js.map +1 -0
  151. package/dist/workflow/gates/GateSystem.d.ts +12 -3
  152. package/dist/workflow/gates/GateSystem.js +185 -41
  153. package/dist/workflow/gates/GateSystem.js.map +1 -1
  154. package/dist/workflow/index.d.ts +10 -0
  155. package/dist/workflow/index.js +10 -0
  156. package/dist/workflow/index.js.map +1 -1
  157. package/package.json +3 -3
@@ -0,0 +1,63 @@
1
+ export type ScalePhase = 'DEFINE' | 'PLAN' | 'EXECUTE' | 'VERIFY' | 'REVIEW' | 'SHIP';
2
+ export interface PhaseStatus {
3
+ completed: boolean;
4
+ marker?: string;
5
+ details?: Record<string, string>;
6
+ timestamp?: number;
7
+ }
8
+ export interface PhaseState {
9
+ DEFINE: PhaseStatus;
10
+ PLAN: PhaseStatus;
11
+ EXECUTE: PhaseStatus;
12
+ VERIFY: PhaseStatus;
13
+ REVIEW: PhaseStatus;
14
+ SHIP: PhaseStatus;
15
+ }
16
+ export declare class PhaseMarkerTracker {
17
+ private stateDir;
18
+ private stateFile;
19
+ constructor(scaleDir?: string);
20
+ private ensureDir;
21
+ /**
22
+ * 解析文本中的所有 Output Markers 并更新状态
23
+ * @param text 包含 markers 的文本(对话输出)
24
+ * @returns 本次解析出的 markers 数量
25
+ */
26
+ parseAndUpdate(text: string): number;
27
+ /**
28
+ * 解析文本中的所有 Output Markers
29
+ * @returns 解析结果 Map<Phase, PhaseStatus>
30
+ */
31
+ parseMarkers(text: string): Partial<Record<ScalePhase, PhaseStatus>>;
32
+ /** 获取当前 Phase 状态 */
33
+ getState(): PhaseState;
34
+ /** 手动标记 Phase 完成 */
35
+ markComplete(phase: ScalePhase, details?: Record<string, string>): void;
36
+ /** 重置 Phase 状态 */
37
+ resetPhase(phase: ScalePhase): void;
38
+ /** 重置所有状态 */
39
+ resetAll(): void;
40
+ /** 检查单个 Phase 是否完成 */
41
+ isPhaseComplete(phase: ScalePhase): boolean;
42
+ /** 检查所有必需 Phase 是否完成 */
43
+ isAllComplete(): boolean;
44
+ /** 获取缺失的 Phase 列表 */
45
+ getMissingPhases(): ScalePhase[];
46
+ /** 获取已完成的 Phase 列表 */
47
+ getCompletedPhases(): ScalePhase[];
48
+ /** 生成状态报告 */
49
+ generateReport(): string;
50
+ /** 生成 Stop Hook 检查结果 */
51
+ generateStopHookResult(): {
52
+ pass: boolean;
53
+ message: string;
54
+ missing: string[];
55
+ };
56
+ private createDefaultState;
57
+ private writeState;
58
+ }
59
+ /** 快速解析单个 marker 行(供 CLI 和 Hook 使用) */
60
+ export declare function parsePhaseMarker(line: string): {
61
+ phase: ScalePhase;
62
+ details: Record<string, string>;
63
+ } | null;
@@ -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
+ }