@hongmaple0820/scale-engine 0.8.0 → 0.9.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 (43) hide show
  1. package/README.en.md +220 -0
  2. package/README.md +91 -50
  3. package/dist/adapters/ClaudeCodeAdapter.d.ts +2 -0
  4. package/dist/adapters/ClaudeCodeAdapter.js +5 -0
  5. package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
  6. package/dist/adapters/CodexAdapter.d.ts +1 -0
  7. package/dist/adapters/CodexAdapter.js +5 -0
  8. package/dist/adapters/CodexAdapter.js.map +1 -1
  9. package/dist/adapters/GeminiAdapter.d.ts +1 -0
  10. package/dist/adapters/GeminiAdapter.js +4 -0
  11. package/dist/adapters/GeminiAdapter.js.map +1 -1
  12. package/dist/adapters/HermesAdapter.d.ts +1 -0
  13. package/dist/adapters/HermesAdapter.js +4 -0
  14. package/dist/adapters/HermesAdapter.js.map +1 -1
  15. package/dist/adapters/OpenClawAdapter.d.ts +1 -0
  16. package/dist/adapters/OpenClawAdapter.js +4 -0
  17. package/dist/adapters/OpenClawAdapter.js.map +1 -1
  18. package/dist/adapters/QCoderAdapter.d.ts +1 -0
  19. package/dist/adapters/QCoderAdapter.js +4 -0
  20. package/dist/adapters/QCoderAdapter.js.map +1 -1
  21. package/dist/adapters/TraeAdapter.d.ts +1 -0
  22. package/dist/adapters/TraeAdapter.js +4 -0
  23. package/dist/adapters/TraeAdapter.js.map +1 -1
  24. package/dist/adapters/VSCAdapter.d.ts +1 -0
  25. package/dist/adapters/VSCAdapter.js +4 -0
  26. package/dist/adapters/VSCAdapter.js.map +1 -1
  27. package/dist/adapters/WorkBuddyAdapter.d.ts +1 -0
  28. package/dist/adapters/WorkBuddyAdapter.js +4 -0
  29. package/dist/adapters/WorkBuddyAdapter.js.map +1 -1
  30. package/dist/api/cli.js +16 -1
  31. package/dist/api/cli.js.map +1 -1
  32. package/dist/artifact/types.d.ts +4 -0
  33. package/dist/artifact/types.js.map +1 -1
  34. package/dist/cli/liteCommands.d.ts +81 -0
  35. package/dist/cli/liteCommands.js +148 -0
  36. package/dist/cli/liteCommands.js.map +1 -0
  37. package/dist/cli/phaseCommands.d.ts +129 -0
  38. package/dist/cli/phaseCommands.js +572 -0
  39. package/dist/cli/phaseCommands.js.map +1 -0
  40. package/dist/skills/SkillDiscovery.d.ts +27 -1
  41. package/dist/skills/SkillDiscovery.js +106 -11
  42. package/dist/skills/SkillDiscovery.js.map +1 -1
  43. package/package.json +2 -2
@@ -0,0 +1,572 @@
1
+ // SCALE Engine — Phase-Aligned Commands (v0.9.0)
2
+ // 6 阶段快捷命令:DEFINE → PLAN → BUILD → VERIFY → REVIEW → SHIP
3
+ import { defineCommand } from 'citty';
4
+ // Engine singleton (reuse from cli.ts)
5
+ import { EventBus } from '../core/eventBus.js';
6
+ import { SQLiteArtifactStore } from '../artifact/sqliteStore.js';
7
+ import { FSM } from '../artifact/fsm.js';
8
+ import { registerAllFSMs } from '../artifact/fsmDefinitions.js';
9
+ import { join } from 'node:path';
10
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
11
+ const SCALE_DIR = process.env.SCALE_DIR ?? '.scale';
12
+ function getEngine() {
13
+ ensureDir(SCALE_DIR);
14
+ const eventBus = new EventBus({ eventsDir: join(SCALE_DIR, 'events') });
15
+ const store = new SQLiteArtifactStore(eventBus, {
16
+ dbPath: join(SCALE_DIR, 'scale.db'),
17
+ artifactsDir: join(SCALE_DIR, 'artifacts'),
18
+ });
19
+ const fsm = new FSM(store, eventBus);
20
+ registerAllFSMs(fsm);
21
+ return { eventBus, store, fsm };
22
+ }
23
+ function ensureDir(dir) {
24
+ if (!existsSync(dir))
25
+ mkdirSync(dir, { recursive: true });
26
+ }
27
+ // Helper: Generate spec markdown file
28
+ function generateSpecMarkdown(id, title, payload) {
29
+ return `# Spec: ${title}
30
+
31
+ **ID**: ${id}
32
+ **Status**: FROZEN
33
+ **Ambiguity Score**: ${payload.ambiguityScore ?? 0.15}
34
+
35
+ ## What
36
+ ${payload.what}
37
+
38
+ ## Success Criteria
39
+ ${payload.successCriteria.map(c => `- [ ] ${c}`).join('\n')}
40
+
41
+ ## Out of Scope
42
+ ${payload.outOfScope.map(o => `- ${o}`).join('\n') || '(none defined)'}
43
+
44
+ ## Edge Cases
45
+ ${payload.edgeCases.map(e => `- ${e}`).join('\n') || '(none defined)'}
46
+
47
+ ## North Star
48
+ ${payload.northStar || 'User value delivered'}
49
+
50
+ ---
51
+ *Generated by SCALE Engine DEFINE phase*
52
+ `;
53
+ }
54
+ // Helper: Calculate ambiguity score
55
+ function calculateAmbiguityScore(description, successCriteria) {
56
+ let score = 0.2; // Base score (maximum threshold)
57
+ // Reduce score based on completeness
58
+ if (description.length > 50)
59
+ score -= 0.05;
60
+ if (successCriteria.length >= 2)
61
+ score -= 0.03;
62
+ if (successCriteria.length >= 3)
63
+ score -= 0.02;
64
+ return Math.max(0.05, score);
65
+ }
66
+ // DEFINE Phase
67
+ export const phaseDefine = defineCommand({
68
+ meta: { name: 'define', description: 'DEFINE: Create Spec (/spec)' },
69
+ args: {
70
+ title: { type: 'positional', required: true },
71
+ description: { type: 'string', alias: 'd' },
72
+ 'success-criteria': { type: 'string', alias: 'c', description: 'Comma-separated criteria' },
73
+ json: { type: 'boolean', default: false },
74
+ },
75
+ async run({ args }) {
76
+ const { store, fsm } = getEngine();
77
+ const desc = args.description ?? args.title;
78
+ // Parse success criteria
79
+ const successCriteria = args['success-criteria']
80
+ ? args['success-criteria'].split(',').map(s => s.trim()).filter(s => s)
81
+ : ['Feature works as described', 'No regression in existing functionality'];
82
+ // Calculate ambiguity score
83
+ const ambiguityScore = calculateAmbiguityScore(desc, successCriteria);
84
+ // Create Need artifact
85
+ const need = await store.create({
86
+ type: 'Need', title: args.title,
87
+ payload: { rawText: desc },
88
+ initialStatus: 'DRAFT',
89
+ createdBy: { kind: 'human', userId: 'cli' },
90
+ });
91
+ // Create Spec artifact with proper payload
92
+ const specPayload = {
93
+ what: desc,
94
+ successCriteria,
95
+ outOfScope: [],
96
+ edgeCases: [],
97
+ northStar: 'Deliver user value',
98
+ ambiguityScore,
99
+ };
100
+ const spec = await store.create({
101
+ type: 'Spec', title: args.title,
102
+ payload: specPayload,
103
+ parents: [need.id],
104
+ initialStatus: 'DRAFT',
105
+ createdBy: { kind: 'human', userId: 'cli' },
106
+ });
107
+ // Generate spec markdown file
108
+ const specsDir = join(SCALE_DIR, 'specs');
109
+ ensureDir(specsDir);
110
+ const specPath = join(specsDir, `${spec.id}.md`);
111
+ writeFileSync(specPath, generateSpecMarkdown(spec.id, args.title, specPayload));
112
+ // FSM transitions: DRAFT -> REVIEWING -> FROZEN
113
+ try {
114
+ await fsm.transition(spec.id, 'refine', { actor: { kind: 'system', component: 'phase-define' } });
115
+ await fsm.transition(spec.id, 'approve', { actor: { kind: 'system', component: 'phase-define' } });
116
+ }
117
+ catch (e) {
118
+ // Guard may fail - report reason
119
+ const error = e;
120
+ if (!args.json)
121
+ console.log(` ⚠️ FSM transition: ${error.message}`);
122
+ }
123
+ const result = { phase: 'DEFINE', spec, specPath, ambiguityScore, successCriteria };
124
+ if (args.json)
125
+ console.log(JSON.stringify(result, null, 2));
126
+ else {
127
+ console.log(`\n✅ DEFINE: ${spec.id}`);
128
+ console.log(` Spec file: ${specPath}`);
129
+ console.log(` Ambiguity score: ${ambiguityScore.toFixed(2)}`);
130
+ console.log(` Success criteria: ${successCriteria.length}`);
131
+ console.log(`\n Next: scale plan ${spec.id}\n`);
132
+ }
133
+ },
134
+ });
135
+ // Helper: Generate plan markdown file
136
+ function generatePlanMarkdown(id, specId, payload) {
137
+ return `# Plan: ${id}
138
+
139
+ **Spec**: ${specId}
140
+ **Status**: APPROVED
141
+
142
+ ## Approach
143
+ ${payload.approach}
144
+
145
+ ## Tech Choices
146
+ ${payload.techChoices.map(t => `- **${t.decision}**: ${t.rationale}`).join('\n') || '(to be defined)'}
147
+
148
+ ## Modules
149
+ ${payload.modules.map(m => `- ${m.action} \`${m.path}\`: ${m.reason}`).join('\n') || '(to be defined)'}
150
+
151
+ ## Rollback Strategy
152
+ ${payload.rollbackStrategy}
153
+
154
+ ## Estimated Complexity
155
+ ${payload.estimatedComplexity ?? 5}/10
156
+
157
+ ---
158
+ *Generated by SCALE Engine PLAN phase*
159
+ `;
160
+ }
161
+ // PLAN Phase
162
+ export const phasePlan = defineCommand({
163
+ meta: { name: 'plan', description: 'PLAN: Create Plan (/plan)' },
164
+ args: {
165
+ 'spec-id': { type: 'positional', required: true },
166
+ approach: { type: 'string', alias: 'a', description: 'Implementation approach' },
167
+ 'rollback': { type: 'string', alias: 'r', description: 'Rollback strategy (required for FSM)' },
168
+ json: { type: 'boolean', default: false },
169
+ },
170
+ async run({ args }) {
171
+ const { store, fsm } = getEngine();
172
+ // Validate spec exists
173
+ const spec = await store.get(args['spec-id']);
174
+ if (!spec || spec.type !== 'Spec') {
175
+ console.error(`\n❌ Spec not found: ${args['spec-id']}\n`);
176
+ process.exit(1);
177
+ }
178
+ // Default rollback strategy (FSM guard requires this)
179
+ const rollbackStrategy = args.rollback ?? 'Revert git commits and restore previous version';
180
+ const approach = args.approach ?? 'Standard implementation following spec requirements';
181
+ // Create PlanPayload with rollback strategy
182
+ const planPayload = {
183
+ approach,
184
+ techChoices: [],
185
+ modules: [],
186
+ rollbackStrategy,
187
+ estimatedComplexity: 5,
188
+ };
189
+ const plan = await store.create({
190
+ type: 'Plan', title: `Plan for ${spec.title}`,
191
+ payload: planPayload,
192
+ parents: [args['spec-id']],
193
+ initialStatus: 'DRAFT',
194
+ createdBy: { kind: 'human', userId: 'cli' },
195
+ });
196
+ // Generate plan markdown file
197
+ const plansDir = join(SCALE_DIR, 'plans');
198
+ ensureDir(plansDir);
199
+ const planPath = join(plansDir, `${plan.id}.md`);
200
+ writeFileSync(planPath, generatePlanMarkdown(plan.id, args['spec-id'], planPayload));
201
+ // FSM transition: DRAFT -> APPROVED (requires rollbackStrategy)
202
+ try {
203
+ await fsm.transition(plan.id, 'review', { actor: { kind: 'system', component: 'phase-plan' } });
204
+ }
205
+ catch (e) {
206
+ const error = e;
207
+ if (!args.json)
208
+ console.log(` ⚠️ FSM transition: ${error.message}`);
209
+ }
210
+ const result = { phase: 'PLAN', plan, planPath, rollbackStrategy };
211
+ if (args.json)
212
+ console.log(JSON.stringify(result, null, 2));
213
+ else {
214
+ console.log(`\n✅ PLAN: ${plan.id}`);
215
+ console.log(` Plan file: ${planPath}`);
216
+ console.log(` Rollback: ${rollbackStrategy}`);
217
+ console.log(`\n Next: scale build ${plan.id}\n`);
218
+ }
219
+ },
220
+ });
221
+ // BUILD Phase
222
+ export const phaseBuild = defineCommand({
223
+ meta: { name: 'build', description: 'BUILD: Create Task (/build)' },
224
+ args: {
225
+ 'plan-id': { type: 'positional', required: true },
226
+ description: { type: 'string', alias: 'd', description: 'Task description' },
227
+ json: { type: 'boolean', default: false },
228
+ },
229
+ async run({ args }) {
230
+ const { store, fsm } = getEngine();
231
+ // Validate plan exists
232
+ const plan = await store.get(args['plan-id']);
233
+ if (!plan || plan.type !== 'Plan') {
234
+ console.error(`\n❌ Plan not found: ${args['plan-id']}\n`);
235
+ process.exit(1);
236
+ }
237
+ // Create TaskPayload
238
+ const taskPayload = {
239
+ description: args.description ?? `Implement ${plan.title}`,
240
+ filesInvolved: [],
241
+ dependsOn: [],
242
+ requiredRole: 'implementer',
243
+ requiredCapabilities: ['code-generation', 'file-editing'],
244
+ // Initialize quality metrics (FSM guards require these for completion)
245
+ buildStatus: 'pending',
246
+ lintStatus: 'pending',
247
+ testPassed: undefined,
248
+ testCoverage: undefined,
249
+ };
250
+ const task = await store.create({
251
+ type: 'Task', title: `Task for ${plan.title}`,
252
+ payload: taskPayload,
253
+ parents: [args['plan-id']],
254
+ initialStatus: 'PENDING',
255
+ createdBy: { kind: 'human', userId: 'cli' },
256
+ });
257
+ // FSM transitions: PENDING -> READY -> RUNNING
258
+ try {
259
+ await fsm.transition(task.id, 'schedule', { actor: { kind: 'system', component: 'phase-build' } });
260
+ await fsm.transition(task.id, 'start', { actor: { kind: 'human', userId: 'cli' } });
261
+ }
262
+ catch (e) {
263
+ const error = e;
264
+ if (!args.json)
265
+ console.log(` ⚠️ FSM transition: ${error.message}`);
266
+ }
267
+ // Update Plan status to IMPLEMENTING
268
+ try {
269
+ await fsm.transition(args['plan-id'], 'implement', { actor: { kind: 'system', component: 'phase-build' } });
270
+ }
271
+ catch { }
272
+ const result = { phase: 'BUILD', task, status: 'RUNNING' };
273
+ if (args.json)
274
+ console.log(JSON.stringify(result, null, 2));
275
+ else {
276
+ console.log(`\n✅ BUILD: ${task.id}`);
277
+ console.log(` Status: RUNNING (ready to implement)`);
278
+ console.log(` Description: ${taskPayload.description}`);
279
+ console.log(`\n Implement now, then run: scale verify ${task.id}\n`);
280
+ }
281
+ },
282
+ });
283
+ // Helper: Run command and capture result (from verify-task)
284
+ async function runVerificationCmd(cmd) {
285
+ const { spawn } = await import('node:child_process');
286
+ return new Promise((resolve) => {
287
+ const child = spawn(cmd, [], { shell: true, stdio: 'pipe' });
288
+ let output = '';
289
+ child.stdout?.on('data', (d) => (output += d.toString()));
290
+ child.stderr?.on('data', (d) => (output += d.toString()));
291
+ child.on('close', (code) => resolve({ exitCode: code ?? 1, output }));
292
+ });
293
+ }
294
+ // VERIFY Phase
295
+ export const phaseVerify = defineCommand({
296
+ meta: { name: 'verify', description: 'VERIFY: Run tests and update Task (/test)' },
297
+ args: {
298
+ 'task-id': { type: 'positional', required: true },
299
+ 'build-cmd': { type: 'string', default: 'npm run build', description: 'Build command' },
300
+ 'lint-cmd': { type: 'string', default: 'npm run lint', description: 'Lint command' },
301
+ 'test-cmd': { type: 'string', default: 'npm test', description: 'Test command' },
302
+ 'skip-build': { type: 'boolean', default: false },
303
+ 'skip-lint': { type: 'boolean', default: false },
304
+ 'skip-test': { type: 'boolean', default: false },
305
+ json: { type: 'boolean', default: false },
306
+ },
307
+ async run({ args }) {
308
+ const { store, fsm } = getEngine();
309
+ // Validate task exists
310
+ const task = await store.get(args['task-id']);
311
+ if (!task || task.type !== 'Task') {
312
+ console.error(`\n❌ Task not found: ${args['task-id']}\n`);
313
+ process.exit(1);
314
+ }
315
+ const results = {
316
+ buildStatus: 'pending',
317
+ buildExitCode: undefined,
318
+ lintStatus: 'pending',
319
+ testPassed: undefined,
320
+ testCoverage: undefined,
321
+ };
322
+ // Run build
323
+ if (!args['skip-build']) {
324
+ if (!args.json)
325
+ console.log('\n🔨 Running build...');
326
+ const build = await runVerificationCmd(args['build-cmd']);
327
+ results.buildStatus = build.exitCode === 0 ? 'success' : 'failed';
328
+ results.buildExitCode = build.exitCode;
329
+ if (!args.json) {
330
+ if (build.exitCode === 0)
331
+ console.log(' ✅ Build passed');
332
+ else
333
+ console.log(' ❌ Build failed (exit code:', build.exitCode, ')');
334
+ }
335
+ }
336
+ // Run lint
337
+ if (!args['skip-lint']) {
338
+ if (!args.json)
339
+ console.log('\n🔍 Running lint...');
340
+ const lint = await runVerificationCmd(args['lint-cmd']);
341
+ results.lintStatus = lint.exitCode === 0 ? 'success' : 'failed';
342
+ if (!args.json) {
343
+ if (lint.exitCode === 0)
344
+ console.log(' ✅ Lint passed');
345
+ else
346
+ console.log(' ❌ Lint failed (exit code:', lint.exitCode, ')');
347
+ }
348
+ }
349
+ // Run tests
350
+ if (!args['skip-test']) {
351
+ if (!args.json)
352
+ console.log('\n🧪 Running tests...');
353
+ const test = await runVerificationCmd(args['test-cmd']);
354
+ results.testPassed = test.exitCode === 0;
355
+ // Extract coverage (Jest format)
356
+ const coverageMatch = test.output.match(/All files[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|[^|]*\|\s*(\d+\.?\d*)/);
357
+ if (coverageMatch)
358
+ results.testCoverage = parseFloat(coverageMatch[1]);
359
+ if (!args.json) {
360
+ if (test.exitCode === 0) {
361
+ console.log(' ✅ Tests passed');
362
+ if (results.testCoverage)
363
+ console.log(' Coverage:', results.testCoverage, '%');
364
+ }
365
+ else
366
+ console.log(' ❌ Tests failed (exit code:', test.exitCode, ')');
367
+ }
368
+ }
369
+ // Update Task payload with verification results
370
+ const currentPayload = task.payload;
371
+ const updatedPayload = {
372
+ ...currentPayload,
373
+ buildStatus: results.buildStatus,
374
+ buildExitCode: results.buildExitCode,
375
+ lintStatus: results.lintStatus,
376
+ testPassed: results.testPassed,
377
+ testCoverage: results.testCoverage,
378
+ };
379
+ await store.update(args['task-id'], { payload: updatedPayload });
380
+ // Attempt FSM transition to COMPLETED
381
+ const allPassed = results.buildStatus === 'success' &&
382
+ results.lintStatus === 'success' &&
383
+ results.testPassed === true;
384
+ let transitionResult = null;
385
+ if (allPassed) {
386
+ try {
387
+ transitionResult = await fsm.transition(args['task-id'], 'complete', {
388
+ actor: { kind: 'human', userId: 'cli' }
389
+ });
390
+ if (!args.json)
391
+ console.log('\n✅ Task marked COMPLETED');
392
+ }
393
+ catch (e) {
394
+ const error = e;
395
+ if (!args.json)
396
+ console.log('\n⚠️ FSM transition failed:', error.message);
397
+ }
398
+ }
399
+ const passed = allPassed && (transitionResult?.success ?? false);
400
+ const result = { phase: 'VERIFY', taskId: args['task-id'], results, passed };
401
+ if (args.json)
402
+ console.log(JSON.stringify(result, null, 2));
403
+ else {
404
+ console.log(`\n📊 VERIFY: ${passed ? '✅ PASSED' : '❌ FAILED'}`);
405
+ if (passed)
406
+ console.log(`\n Next: scale review\n`);
407
+ else
408
+ console.log(`\n Fix issues and re-run: scale verify ${args['task-id']}\n`);
409
+ }
410
+ },
411
+ });
412
+ // REVIEW Phase
413
+ export const phaseReview = defineCommand({
414
+ meta: { name: 'review', description: 'REVIEW: Code review (/review)' },
415
+ args: {
416
+ 'task-id': { type: 'positional', required: false },
417
+ 'check-security': { type: 'boolean', default: true },
418
+ 'check-style': { type: 'boolean', default: true },
419
+ json: { type: 'boolean', default: false },
420
+ },
421
+ async run({ args }) {
422
+ const { store } = getEngine();
423
+ // If task-id provided, validate task exists
424
+ let task = null;
425
+ if (args['task-id']) {
426
+ task = await store.get(args['task-id']);
427
+ if (!task || task.type !== 'Task') {
428
+ console.error(`\n❌ Task not found: ${args['task-id']}\n`);
429
+ process.exit(1);
430
+ }
431
+ }
432
+ const findings = [];
433
+ // Style checklist
434
+ if (args['check-style']) {
435
+ findings.push({ category: 'style', severity: 'MEDIUM', description: 'Check function length (<50 lines)' });
436
+ findings.push({ category: 'style', severity: 'MEDIUM', description: 'Check file size (<800 lines)' });
437
+ findings.push({ category: 'style', severity: 'LOW', description: 'Check naming conventions' });
438
+ findings.push({ category: 'style', severity: 'LOW', description: 'Check no deep nesting (>4 levels)' });
439
+ }
440
+ // Security checklist
441
+ if (args['check-security']) {
442
+ findings.push({ category: 'security', severity: 'CRITICAL', description: 'No hardcoded secrets/credentials' });
443
+ findings.push({ category: 'security', severity: 'HIGH', description: 'Input validation at boundaries' });
444
+ findings.push({ category: 'security', severity: 'HIGH', description: 'No SQL injection (parameterized queries)' });
445
+ findings.push({ category: 'security', severity: 'HIGH', description: 'No XSS (sanitized output)' });
446
+ findings.push({ category: 'security', severity: 'MEDIUM', description: 'Error messages not leak sensitive data' });
447
+ }
448
+ // Logic checklist
449
+ findings.push({ category: 'logic', severity: 'HIGH', description: 'Edge cases handled' });
450
+ findings.push({ category: 'logic', severity: 'HIGH', description: 'Error handling explicit' });
451
+ findings.push({ category: 'logic', severity: 'MEDIUM', description: 'No N+1 queries' });
452
+ // Performance checklist
453
+ findings.push({ category: 'performance', severity: 'MEDIUM', description: 'No unbounded loops/queries' });
454
+ findings.push({ category: 'performance', severity: 'LOW', description: 'Caching where appropriate' });
455
+ // Count by severity
456
+ const critical = findings.filter(f => f.severity === 'CRITICAL').length;
457
+ const high = findings.filter(f => f.severity === 'HIGH').length;
458
+ const medium = findings.filter(f => f.severity === 'MEDIUM').length;
459
+ const low = findings.filter(f => f.severity === 'LOW').length;
460
+ const passed = critical === 0; // Only block on CRITICAL issues
461
+ const result = {
462
+ phase: 'REVIEW',
463
+ taskId: args['task-id'],
464
+ findings,
465
+ summary: { critical, high, medium, low },
466
+ passed,
467
+ recommendation: passed ? 'Ready to ship' : 'Fix CRITICAL issues before shipping'
468
+ };
469
+ if (args.json)
470
+ console.log(JSON.stringify(result, null, 2));
471
+ else {
472
+ console.log('\n🔍 REVIEW Phase');
473
+ console.log('\nReview Checklist:');
474
+ console.log('┌─────────────────────────────────────────────┐');
475
+ console.log(`│ CRITICAL: ${critical} issues ${critical > 0 ? '⚠️ BLOCKED' : '✅'} │`);
476
+ console.log(`│ HIGH: ${high} issues │`);
477
+ console.log(`│ MEDIUM: ${medium} issues │`);
478
+ console.log(`│ LOW: ${low} issues │`);
479
+ console.log('└─────────────────────────────────────────────┘');
480
+ if (passed) {
481
+ console.log('\n✅ Review passed (no CRITICAL issues)');
482
+ console.log('\n Next: scale ship ' + (args['task-id'] ?? '<task-id>') + '\n');
483
+ }
484
+ else {
485
+ console.log('\n❌ Review blocked by CRITICAL issues');
486
+ console.log('\n Fix critical issues, then: scale review\n');
487
+ }
488
+ }
489
+ },
490
+ });
491
+ // SHIP Phase
492
+ export const phaseShip = defineCommand({
493
+ meta: { name: 'ship', description: 'SHIP: Commit and complete (/ship)' },
494
+ args: {
495
+ 'task-id': { type: 'positional', required: true },
496
+ message: { type: 'string', alias: 'm', description: 'Commit message' },
497
+ 'no-commit': { type: 'boolean', default: false, description: 'Skip git commit' },
498
+ json: { type: 'boolean', default: false },
499
+ },
500
+ async run({ args }) {
501
+ const { store, fsm } = getEngine();
502
+ // Validate task exists
503
+ const task = await store.get(args['task-id']);
504
+ if (!task || task.type !== 'Task') {
505
+ console.error(`\n❌ Task not found: ${args['task-id']}\n`);
506
+ process.exit(1);
507
+ }
508
+ // Check if task is completed (or attempt transition)
509
+ const payload = task.payload;
510
+ const verificationPassed = payload.buildStatus === 'success' &&
511
+ payload.lintStatus === 'success' &&
512
+ payload.testPassed === true;
513
+ if (task.status !== 'COMPLETED') {
514
+ if (!verificationPassed) {
515
+ console.error('\n❌ Task not verified. Run: scale verify ' + args['task-id'] + '\n');
516
+ process.exit(1);
517
+ }
518
+ // Attempt FSM transition
519
+ try {
520
+ await fsm.transition(args['task-id'], 'complete', {
521
+ actor: { kind: 'human', userId: 'cli' }
522
+ });
523
+ }
524
+ catch (e) {
525
+ const error = e;
526
+ console.error('\n❌ FSM transition failed:', error.message);
527
+ console.log('\n Run verification first: scale verify ' + args['task-id'] + '\n');
528
+ process.exit(1);
529
+ }
530
+ }
531
+ // Git operations
532
+ let commitHash = null;
533
+ if (!args['no-commit']) {
534
+ const { execa } = await import('execa');
535
+ const commitMessage = args.message ?? `feat: ${task.title ?? args['task-id']}`;
536
+ try {
537
+ await execa('git', ['add', '.']);
538
+ const result = await execa('git', ['commit', '-m', commitMessage]);
539
+ commitHash = result.stdout.split('\n')[0]; // First line contains hash
540
+ }
541
+ catch (e) {
542
+ const error = e;
543
+ if (!args.json)
544
+ console.log(' ⚠️ Git commit skipped:', error.message);
545
+ }
546
+ }
547
+ // Update Plan to DONE if Task completed
548
+ if (task.parents.length > 0) {
549
+ const planId = task.parents[0];
550
+ try {
551
+ await fsm.transition(planId, 'complete', { actor: { kind: 'system', component: 'phase-ship' } });
552
+ }
553
+ catch { }
554
+ }
555
+ const result = {
556
+ phase: 'SHIP',
557
+ taskId: args['task-id'],
558
+ status: 'COMPLETED',
559
+ commitHash,
560
+ };
561
+ if (args.json)
562
+ console.log(JSON.stringify(result, null, 2));
563
+ else {
564
+ console.log('\n🚀 SHIP Phase');
565
+ console.log('\n✅ Task COMPLETED: ' + args['task-id']);
566
+ if (commitHash)
567
+ console.log(' Commit: ' + commitHash);
568
+ console.log('\n🎉 Done! Feature shipped.\n');
569
+ }
570
+ },
571
+ });
572
+ //# sourceMappingURL=phaseCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phaseCommands.js","sourceRoot":"","sources":["../../src/cli/phaseCommands.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,0DAA0D;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAErC,uCAAuC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG9D,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,QAAQ,CAAA;AAEnD,SAAS,SAAS;IAChB,SAAS,CAAC,SAAS,CAAC,CAAA;IACpB,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;IACvE,MAAM,KAAK,GAAG,IAAI,mBAAmB,CAAC,QAAQ,EAAE;QAC9C,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;QACnC,YAAY,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC;KAC3C,CAAC,CAAA;IACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IACpC,eAAe,CAAC,GAAG,CAAC,CAAA;IACpB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;AACjC,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3D,CAAC;AAED,sCAAsC;AACtC,SAAS,oBAAoB,CAAC,EAAU,EAAE,KAAa,EAAE,OAAoB;IAC3E,OAAO,WAAW,KAAK;;UAEf,EAAE;;uBAEW,OAAO,CAAC,cAAc,IAAI,IAAI;;;EAGnD,OAAO,CAAC,IAAI;;;EAGZ,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAGzD,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB;;;EAGpE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB;;;EAGnE,OAAO,CAAC,SAAS,IAAI,sBAAsB;;;;CAI5C,CAAA;AACD,CAAC;AAED,oCAAoC;AACpC,SAAS,uBAAuB,CAAC,WAAmB,EAAE,eAAyB;IAC7E,IAAI,KAAK,GAAG,GAAG,CAAA,CAAC,iCAAiC;IACjD,qCAAqC;IACrC,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE;QAAE,KAAK,IAAI,IAAI,CAAA;IAC1C,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC;QAAE,KAAK,IAAI,IAAI,CAAA;IAC9C,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC;QAAE,KAAK,IAAI,IAAI,CAAA;IAC9C,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AAC9B,CAAC;AAED,eAAe;AACf,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACvC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;IACpE,IAAI,EAAE;QACJ,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC7C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;QAC3C,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,0BAA0B,EAAE;QAC3F,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;KAC1C;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,CAAA;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,CAAA;QAE3C,yBAAyB;QACzB,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACvE,CAAC,CAAC,CAAC,4BAA4B,EAAE,yCAAyC,CAAC,CAAA;QAE7E,4BAA4B;QAC5B,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;QAErE,uBAAuB;QACvB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;YAC9B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK;YAC/B,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;YAC1B,aAAa,EAAE,OAAO;YACtB,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;SAC5C,CAAC,CAAA;QAEF,2CAA2C;QAC3C,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,IAAI;YACV,eAAe;YACf,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,oBAAoB;YAC/B,cAAc;SACf,CAAA;QAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;YAC9B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK;YAC/B,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,aAAa,EAAE,OAAO;YACtB,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;SAC5C,CAAC,CAAA;QAEF,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QACzC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;QAChD,aAAa,CAAC,QAAQ,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAA;QAE/E,gDAAgD;QAChD,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,CAAC,CAAA;YACjG,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,CAAC,CAAA;QACpG,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,iCAAiC;YACjC,MAAM,KAAK,GAAG,CAAU,CAAA;YACxB,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACvE,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,CAAA;QACnF,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;aACtD,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;YACrC,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAA;YACxC,OAAO,CAAC,GAAG,CAAC,uBAAuB,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YAC/D,OAAO,CAAC,GAAG,CAAC,wBAAwB,eAAe,CAAC,MAAM,EAAE,CAAC,CAAA;YAC7D,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;QACnD,CAAC;IACH,CAAC;CACF,CAAC,CAAA;AAEF,sCAAsC;AACtC,SAAS,oBAAoB,CAAC,EAAU,EAAE,MAAc,EAAE,OAAoB;IAC5E,OAAO,WAAW,EAAE;;YAEV,MAAM;;;;EAIhB,OAAO,CAAC,QAAQ;;;EAGhB,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB;;;EAGnG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,iBAAiB;;;EAGpG,OAAO,CAAC,gBAAgB;;;EAGxB,OAAO,CAAC,mBAAmB,IAAI,CAAC;;;;CAIjC,CAAA;AACD,CAAC;AAED,aAAa;AACb,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAAC;IACrC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,2BAA2B,EAAE;IAChE,IAAI,EAAE;QACJ,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;QACjD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,yBAAyB,EAAE;QAChF,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,sCAAsC,EAAE;QAC/F,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;KAC1C;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,CAAA;QAElC,uBAAuB;QACvB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,sDAAsD;QACtD,MAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,IAAI,iDAAiD,CAAA;QAC3F,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,qDAAqD,CAAA;QAEvF,4CAA4C;QAC5C,MAAM,WAAW,GAAgB;YAC/B,QAAQ;YACR,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,EAAE;YACX,gBAAgB;YAChB,mBAAmB,EAAE,CAAC;SACvB,CAAA;QAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;YAC9B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,IAAI,CAAC,KAAK,EAAE;YAC7C,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,aAAa,EAAE,OAAO;YACtB,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;SAC5C,CAAC,CAAA;QAEF,8BAA8B;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QACzC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;QAChD,aAAa,CAAC,QAAQ,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC,CAAA;QAEpF,gEAAgE;QAChE,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,CAAC,CAAA;QACjG,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,CAAU,CAAA;YACxB,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACvE,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAA;QAClE,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;aACtD,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;YACnC,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAA;YACxC,OAAO,CAAC,GAAG,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,CAAA;YAC/C,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;QACpD,CAAC;IACH,CAAC;CACF,CAAC,CAAA;AAEF,cAAc;AACd,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;IACtC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,6BAA6B,EAAE;IACnE,IAAI,EAAE;QACJ,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;QACjD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,kBAAkB,EAAE;QAC5E,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;KAC1C;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,CAAA;QAElC,uBAAuB;QACvB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,qBAAqB;QACrB,MAAM,WAAW,GAAgB;YAC/B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,aAAa,IAAI,CAAC,KAAK,EAAE;YAC1D,aAAa,EAAE,EAAE;YACjB,SAAS,EAAE,EAAE;YACb,YAAY,EAAE,aAAa;YAC3B,oBAAoB,EAAE,CAAC,iBAAiB,EAAE,cAAc,CAAC;YACzD,uEAAuE;YACvE,WAAW,EAAE,SAAS;YACtB,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE,SAAS;YACrB,YAAY,EAAE,SAAS;SACxB,CAAA;QAED,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;YAC9B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,IAAI,CAAC,KAAK,EAAE;YAC7C,OAAO,EAAE,WAAW;YACpB,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,aAAa,EAAE,SAAS;YACxB,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;SAC5C,CAAC,CAAA;QAEF,+CAA+C;QAC/C,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;YAClG,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAA;QACrF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,CAAU,CAAA;YACxB,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACvE,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,CAAC,CAAA;QAC7G,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QAEV,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAC1D,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;aACtD,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;YACpC,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;YACtD,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,WAAW,EAAE,CAAC,CAAA;YACzD,OAAO,CAAC,GAAG,CAAC,8CAA8C,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;CACF,CAAC,CAAA;AAEF,4DAA4D;AAC5D,KAAK,UAAU,kBAAkB,CAAC,GAAW;IAC3C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAA;IACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAC5D,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QACjE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;QACjE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IACvE,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,eAAe;AACf,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACvC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2CAA2C,EAAE;IAClF,IAAI,EAAE;QACJ,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;QACjD,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE;QACvF,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE;QACpF,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE;QAChF,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;QACjD,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;QAChD,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;QAChD,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;KAC1C;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,CAAA;QAElC,uBAAuB;QACvB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,MAAM,OAAO,GAAG;YACd,WAAW,EAAE,SAA6C;YAC1D,aAAa,EAAE,SAA+B;YAC9C,UAAU,EAAE,SAA6C;YACzD,UAAU,EAAE,SAAgC;YAC5C,YAAY,EAAE,SAA+B;SAC9C,CAAA;QAED,YAAY;QACZ,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;YACpD,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;YACzD,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAA;YACjE,OAAO,CAAC,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAA;YACtC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;;oBACrD,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YACxE,CAAC;QACH,CAAC;QAED,WAAW;QACX,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;YACnD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;YACvD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAA;YAC/D,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;;oBACnD,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YACtE,CAAC;QACH,CAAC;QAED,YAAY;QACZ,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;YACpD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;YACvD,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAA;YACxC,iCAAiC;YACjC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAA;YAC5G,IAAI,aAAa;gBAAE,OAAO,CAAC,YAAY,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAA;YACtE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;oBAChC,IAAI,OAAO,CAAC,YAAY;wBAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;gBAClF,CAAC;;oBAAM,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YACzE,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,MAAM,cAAc,GAAG,IAAI,CAAC,OAAsB,CAAA;QAClD,MAAM,cAAc,GAAgB;YAClC,GAAG,cAAc;YACjB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC,CAAA;QACD,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAA;QAEhE,sCAAsC;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,KAAK,SAAS;YACjC,OAAO,CAAC,UAAU,KAAK,SAAS;YAChC,OAAO,CAAC,UAAU,KAAK,IAAI,CAAA;QAE7C,IAAI,gBAAgB,GAAG,IAAI,CAAA;QAC3B,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,gBAAgB,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE;oBACnE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;iBACxC,CAAC,CAAA;gBACF,IAAI,CAAC,IAAI,CAAC,IAAI;oBAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;YAC1D,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,KAAK,GAAG,CAAU,CAAA;gBACxB,IAAI,CAAC,IAAI,CAAC,IAAI;oBAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;YAC3E,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,IAAI,CAAC,gBAAgB,EAAE,OAAO,IAAI,KAAK,CAAC,CAAA;QAChE,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;QAC5E,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;aACtD,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAA;YAC/D,IAAI,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;;gBAC/C,OAAO,CAAC,GAAG,CAAC,4CAA4C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACnF,CAAC;IACH,CAAC;CACF,CAAC,CAAA;AAUF,eAAe;AACf,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;IACvC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;IACtE,IAAI,EAAE;QACJ,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;QAClD,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;QACpD,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;QACjD,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;KAC1C;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,CAAA;QAE7B,4CAA4C;QAC5C,IAAI,IAAI,GAAG,IAAI,CAAA;QACf,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YACpB,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;YACvC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAClC,OAAO,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;gBACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAoB,EAAE,CAAA;QAEpC,kBAAkB;QAClB,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC,CAAA;YAC1G,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC,CAAA;YACrG,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC,CAAA;YAC9F,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC,CAAA;QACzG,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC,CAAA;YAC9G,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC,CAAA;YACxG,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC,CAAA;YAClH,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC,CAAA;YACnG,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,CAAA;QACpH,CAAC;QAED,kBAAkB;QAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAA;QACzF,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC,CAAA;QAC9F,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAA;QAEvF,wBAAwB;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC,CAAA;QACzG,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC,CAAA;QAErG,oBAAoB;QACpB,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAA;QACvE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAA;QAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAA;QACnE,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,CAAA;QAE7D,MAAM,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAA,CAAC,gCAAgC;QAE9D,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;YACvB,QAAQ;YACR,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;YACxC,MAAM;YACN,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,qCAAqC;SACjF,CAAA;QAED,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;aACtD,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;YAChC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;YAClC,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;YAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,WAAW,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,CAAA;YAC/F,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,gCAAgC,CAAC,CAAA;YAChE,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,+BAA+B,CAAC,CAAA;YACjE,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,kCAAkC,CAAC,CAAA;YACjE,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;YAE9D,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;gBACrD,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,GAAG,IAAI,CAAC,CAAA;YACjF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;gBACpD,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAA;YAC/D,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC,CAAA;AAEF,aAAa;AACb,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAAC;IACrC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,mCAAmC,EAAE;IACxE,IAAI,EAAE;QACJ,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE;QACjD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,gBAAgB,EAAE;QACtE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE;QAChF,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;KAC1C;IACD,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE;QAChB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,CAAA;QAElC,uBAAuB;QACvB,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;QAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,OAAO,CAAC,KAAK,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,qDAAqD;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAsB,CAAA;QAC3C,MAAM,kBAAkB,GAAG,OAAO,CAAC,WAAW,KAAK,SAAS;YAChC,OAAO,CAAC,UAAU,KAAK,SAAS;YAChC,OAAO,CAAC,UAAU,KAAK,IAAI,CAAA;QAEvD,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,2CAA2C,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;gBACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;YACD,yBAAyB;YACzB,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE;oBAChD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;iBACxC,CAAC,CAAA;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,KAAK,GAAG,CAAU,CAAA;gBACxB,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;gBAC1D,OAAO,CAAC,GAAG,CAAC,4CAA4C,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAA;gBAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,CAAC;QACH,CAAC;QAED,iBAAiB;QACjB,IAAI,UAAU,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YACvB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAA;YACvC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,IAAI,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAA;YAE9E,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;gBAChC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAA;gBAClE,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,2BAA2B;YACvE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,KAAK,GAAG,CAAU,CAAA;gBACxB,IAAI,CAAC,IAAI,CAAC,IAAI;oBAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;YACzE,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAC9B,IAAI,CAAC;gBACH,MAAM,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,CAAC,CAAA;YAClG,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;YACvB,MAAM,EAAE,WAAW;YACnB,UAAU;SACX,CAAA;QAED,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;aACtD,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;YAC9B,OAAO,CAAC,GAAG,CAAC,sBAAsB,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;YACrD,IAAI,UAAU;gBAAE,OAAO,CAAC,GAAG,CAAC,aAAa,GAAG,UAAU,CAAC,CAAA;YACvD,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -1,7 +1,13 @@
1
1
  import type { IEventBus } from '../core/eventBus.js';
2
2
  import type { SkillRegistry } from './SkillRegistry.js';
3
3
  import type { SkillInstallConfig, ISkillInstaller } from './SkillInstaller.js';
4
- import type { AgentPlatform, SkillRef, SkillScanResult } from '../artifact/types.js';
4
+ import type { AgentPlatform, SkillRef, SkillScanResult, DevelopmentPhase } from '../artifact/types.js';
5
+ /** Phase-based skill scan result */
6
+ export interface PhaseSkillScanResult {
7
+ phase: DevelopmentPhase;
8
+ skills: SkillRef[];
9
+ count: number;
10
+ }
5
11
  /** 发现上下文 - Agent 执行任务时的场景 */
6
12
  export interface DiscoveryContext {
7
13
  taskType: string;
@@ -26,6 +32,8 @@ export interface ISkillDiscovery {
26
32
  periodicScan(): Promise<DiscoveryResult[]>;
27
33
  checkDuringExecution(taskType: string, capabilities: string[]): Promise<DiscoveryResult[]>;
28
34
  scanSkills(platform: AgentPlatform): SkillScanResult;
35
+ scanPhaseSkills(projectDir?: string): Map<DevelopmentPhase, PhaseSkillScanResult>;
36
+ getSkillsForPhase(phase: DevelopmentPhase, projectDir?: string): SkillRef[];
29
37
  detectPlatform(): AgentPlatform | null;
30
38
  }
31
39
  export declare class SkillDiscovery implements ISkillDiscovery {
@@ -46,8 +54,26 @@ export declare class SkillDiscovery implements ISkillDiscovery {
46
54
  detectPlatform(): AgentPlatform | null;
47
55
  scanSkills(platform: AgentPlatform): SkillScanResult;
48
56
  generateSkillsMd(skills: SkillRef[]): string;
57
+ /**
58
+ * Scan skills organized by development phase
59
+ * @param projectDir - Project directory containing skills/ folder
60
+ * @returns Map of phase to skill scan results
61
+ */
62
+ scanPhaseSkills(projectDir?: string): Map<DevelopmentPhase, PhaseSkillScanResult>;
63
+ /**
64
+ * Get skills available for a specific development phase
65
+ * @param phase - Development phase (DEFINE, PLAN, BUILD, VERIFY, REVIEW, SHIP, ANTI-PATTERNS)
66
+ * @param projectDir - Project directory
67
+ * @returns List of skills for the phase
68
+ */
69
+ getSkillsForPhase(phase: DevelopmentPhase, projectDir?: string): SkillRef[];
70
+ /**
71
+ * Generate phase-based skills index markdown
72
+ */
73
+ generatePhaseSkillsMd(scanResult: Map<DevelopmentPhase, PhaseSkillScanResult>): string;
49
74
  private matchCategory;
50
75
  private calculateRelevance;
51
76
  private detectMissingCapabilities;
52
77
  private createInstallConfig;
78
+ private extractSkillDescription;
53
79
  }