@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.
- package/README.en.md +220 -0
- package/README.md +91 -50
- package/dist/adapters/ClaudeCodeAdapter.d.ts +2 -0
- package/dist/adapters/ClaudeCodeAdapter.js +5 -0
- package/dist/adapters/ClaudeCodeAdapter.js.map +1 -1
- package/dist/adapters/CodexAdapter.d.ts +1 -0
- package/dist/adapters/CodexAdapter.js +5 -0
- package/dist/adapters/CodexAdapter.js.map +1 -1
- package/dist/adapters/GeminiAdapter.d.ts +1 -0
- package/dist/adapters/GeminiAdapter.js +4 -0
- package/dist/adapters/GeminiAdapter.js.map +1 -1
- package/dist/adapters/HermesAdapter.d.ts +1 -0
- package/dist/adapters/HermesAdapter.js +4 -0
- package/dist/adapters/HermesAdapter.js.map +1 -1
- package/dist/adapters/OpenClawAdapter.d.ts +1 -0
- package/dist/adapters/OpenClawAdapter.js +4 -0
- package/dist/adapters/OpenClawAdapter.js.map +1 -1
- package/dist/adapters/QCoderAdapter.d.ts +1 -0
- package/dist/adapters/QCoderAdapter.js +4 -0
- package/dist/adapters/QCoderAdapter.js.map +1 -1
- package/dist/adapters/TraeAdapter.d.ts +1 -0
- package/dist/adapters/TraeAdapter.js +4 -0
- package/dist/adapters/TraeAdapter.js.map +1 -1
- package/dist/adapters/VSCAdapter.d.ts +1 -0
- package/dist/adapters/VSCAdapter.js +4 -0
- package/dist/adapters/VSCAdapter.js.map +1 -1
- package/dist/adapters/WorkBuddyAdapter.d.ts +1 -0
- package/dist/adapters/WorkBuddyAdapter.js +4 -0
- package/dist/adapters/WorkBuddyAdapter.js.map +1 -1
- package/dist/api/cli.js +16 -1
- package/dist/api/cli.js.map +1 -1
- package/dist/artifact/types.d.ts +4 -0
- package/dist/artifact/types.js.map +1 -1
- package/dist/cli/liteCommands.d.ts +81 -0
- package/dist/cli/liteCommands.js +148 -0
- package/dist/cli/liteCommands.js.map +1 -0
- package/dist/cli/phaseCommands.d.ts +129 -0
- package/dist/cli/phaseCommands.js +572 -0
- package/dist/cli/phaseCommands.js.map +1 -0
- package/dist/skills/SkillDiscovery.d.ts +27 -1
- package/dist/skills/SkillDiscovery.js +106 -11
- package/dist/skills/SkillDiscovery.js.map +1 -1
- 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
|
}
|