@slope-dev/slope 1.35.0 → 1.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/guard.d.ts.map +1 -1
- package/dist/cli/commands/guard.js +32 -0
- package/dist/cli/commands/guard.js.map +1 -1
- package/dist/cli/commands/loop.d.ts.map +1 -1
- package/dist/cli/commands/loop.js +159 -10
- package/dist/cli/commands/loop.js.map +1 -1
- package/dist/cli/commands/org.d.ts +10 -0
- package/dist/cli/commands/org.d.ts.map +1 -0
- package/dist/cli/commands/org.js +102 -0
- package/dist/cli/commands/org.js.map +1 -0
- package/dist/cli/commands/review-state.js +2 -2
- package/dist/cli/commands/review-state.js.map +1 -1
- package/dist/cli/commands/session.d.ts.map +1 -1
- package/dist/cli/commands/session.js +251 -0
- package/dist/cli/commands/session.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +205 -3
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/commands/transcript.d.ts.map +1 -1
- package/dist/cli/commands/transcript.js +110 -12
- package/dist/cli/commands/transcript.js.map +1 -1
- package/dist/cli/commands/workflow.d.ts +2 -0
- package/dist/cli/commands/workflow.d.ts.map +1 -0
- package/dist/cli/commands/workflow.js +165 -0
- package/dist/cli/commands/workflow.js.map +1 -0
- package/dist/cli/guards/claim-required.d.ts +1 -0
- package/dist/cli/guards/claim-required.d.ts.map +1 -1
- package/dist/cli/guards/claim-required.js +41 -2
- package/dist/cli/guards/claim-required.js.map +1 -1
- package/dist/cli/guards/hazard.d.ts +1 -0
- package/dist/cli/guards/hazard.d.ts.map +1 -1
- package/dist/cli/guards/hazard.js +61 -6
- package/dist/cli/guards/hazard.js.map +1 -1
- package/dist/cli/guards/review-tier.d.ts.map +1 -1
- package/dist/cli/guards/review-tier.js +3 -1
- package/dist/cli/guards/review-tier.js.map +1 -1
- package/dist/cli/guards/scope-drift.d.ts +1 -0
- package/dist/cli/guards/scope-drift.d.ts.map +1 -1
- package/dist/cli/guards/scope-drift.js +62 -7
- package/dist/cli/guards/scope-drift.js.map +1 -1
- package/dist/cli/guards/workflow-step-gate.d.ts +8 -0
- package/dist/cli/guards/workflow-step-gate.d.ts.map +1 -0
- package/dist/cli/guards/workflow-step-gate.js +59 -0
- package/dist/cli/guards/workflow-step-gate.js.map +1 -0
- package/dist/cli/index.js +15 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/loop/backlog.d.ts +6 -0
- package/dist/cli/loop/backlog.d.ts.map +1 -1
- package/dist/cli/loop/backlog.js +44 -1
- package/dist/cli/loop/backlog.js.map +1 -1
- package/dist/cli/loop/continuous.d.ts.map +1 -1
- package/dist/cli/loop/continuous.js +44 -8
- package/dist/cli/loop/continuous.js.map +1 -1
- package/dist/cli/loop/executor.d.ts.map +1 -1
- package/dist/cli/loop/executor.js +5 -3
- package/dist/cli/loop/executor.js.map +1 -1
- package/dist/cli/loop/model-selector.d.ts +5 -2
- package/dist/cli/loop/model-selector.d.ts.map +1 -1
- package/dist/cli/loop/model-selector.js +35 -2
- package/dist/cli/loop/model-selector.js.map +1 -1
- package/dist/cli/loop/parallel.d.ts +2 -2
- package/dist/cli/loop/parallel.d.ts.map +1 -1
- package/dist/cli/loop/parallel.js +72 -68
- package/dist/cli/loop/parallel.js.map +1 -1
- package/dist/cli/loop/types.d.ts +44 -1
- package/dist/cli/loop/types.d.ts.map +1 -1
- package/dist/cli/loop/types.js +2 -0
- package/dist/cli/loop/types.js.map +1 -1
- package/dist/cli/loop/workflow-adapter.d.ts +53 -0
- package/dist/cli/loop/workflow-adapter.d.ts.map +1 -0
- package/dist/cli/loop/workflow-adapter.js +123 -0
- package/dist/cli/loop/workflow-adapter.js.map +1 -0
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +20 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/core/analytics.d.ts +17 -0
- package/dist/core/analytics.d.ts.map +1 -1
- package/dist/core/analytics.js +59 -0
- package/dist/core/analytics.js.map +1 -1
- package/dist/core/guard.d.ts +5 -1
- package/dist/core/guard.d.ts.map +1 -1
- package/dist/core/guard.js +37 -0
- package/dist/core/guard.js.map +1 -1
- package/dist/core/index.d.ts +12 -4
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +10 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/loader.d.ts +5 -0
- package/dist/core/loader.d.ts.map +1 -1
- package/dist/core/loader.js +22 -4
- package/dist/core/loader.js.map +1 -1
- package/dist/core/org.d.ts +38 -0
- package/dist/core/org.d.ts.map +1 -0
- package/dist/core/org.js +112 -0
- package/dist/core/org.js.map +1 -0
- package/dist/core/store.d.ts +25 -1
- package/dist/core/store.d.ts.map +1 -1
- package/dist/core/types.d.ts +34 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/workflow-engine.d.ts +89 -0
- package/dist/core/workflow-engine.d.ts.map +1 -0
- package/dist/core/workflow-engine.js +223 -0
- package/dist/core/workflow-engine.js.map +1 -0
- package/dist/core/workflow-loader.d.ts +21 -0
- package/dist/core/workflow-loader.d.ts.map +1 -0
- package/dist/core/workflow-loader.js +110 -0
- package/dist/core/workflow-loader.js.map +1 -0
- package/dist/core/workflow-validator.d.ts +19 -0
- package/dist/core/workflow-validator.d.ts.map +1 -0
- package/dist/core/workflow-validator.js +166 -0
- package/dist/core/workflow-validator.js.map +1 -0
- package/dist/core/workflow.d.ts +51 -0
- package/dist/core/workflow.d.ts.map +1 -0
- package/dist/core/workflow.js +190 -0
- package/dist/core/workflow.js.map +1 -0
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +138 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/index.test.js +10 -2
- package/dist/mcp/index.test.js.map +1 -1
- package/dist/mcp/registry.d.ts +1 -1
- package/dist/mcp/registry.d.ts.map +1 -1
- package/dist/mcp/registry.js +71 -0
- package/dist/mcp/registry.js.map +1 -1
- package/dist/store/index.d.ts +25 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +144 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store-pg/index.d.ts +25 -1
- package/dist/store-pg/index.d.ts.map +1 -1
- package/dist/store-pg/index.js +180 -0
- package/dist/store-pg/index.js.map +1 -1
- package/package.json +4 -2
- package/src/core/workflows/sprint-autonomous.yaml +59 -0
- package/src/core/workflows/sprint-lightweight.yaml +39 -0
- package/src/core/workflows/sprint-standard.yaml +77 -0
|
@@ -1,99 +1,103 @@
|
|
|
1
1
|
import { mkdirSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { resolveLoopConfig } from './config.js';
|
|
4
|
-
import { loadBacklog,
|
|
4
|
+
import { loadBacklog, getReadySprints } from './backlog.js';
|
|
5
5
|
import { runSprint, isShuttingDown } from './executor.js';
|
|
6
6
|
import { createLogger } from './logger.js';
|
|
7
|
+
/** Default max concurrent sprints */
|
|
8
|
+
const DEFAULT_MAX_PARALLEL = 3;
|
|
7
9
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
+
* N-sprint parallel execution with dependency-aware scheduling
|
|
11
|
+
* and module overlap detection.
|
|
10
12
|
*/
|
|
11
13
|
export async function runParallel(flags, cwd) {
|
|
12
14
|
const config = resolveLoopConfig(cwd);
|
|
13
15
|
const dryRun = flags['dry-run'] === 'true';
|
|
16
|
+
const maxParallel = parseInt(flags['max-parallel'] ?? String(DEFAULT_MAX_PARALLEL), 10);
|
|
14
17
|
mkdirSync(join(cwd, config.resultsDir), { recursive: true });
|
|
15
18
|
mkdirSync(join(cwd, config.logDir), { recursive: true });
|
|
16
19
|
const log = createLogger('loop:parallel', join(cwd, config.logDir, 'parallel.log'));
|
|
17
20
|
log.info('=== Parallel Runner Starting ===');
|
|
18
21
|
if (dryRun)
|
|
19
22
|
log.info('DRY RUN mode');
|
|
23
|
+
log.info(`Max parallel: ${maxParallel}`);
|
|
20
24
|
const backlog = loadBacklog(cwd, config);
|
|
21
|
-
|
|
22
|
-
if (
|
|
25
|
+
let ready = getReadySprints(backlog, cwd, config);
|
|
26
|
+
if (ready.length === 0) {
|
|
23
27
|
log.info('No sprints available in backlog.');
|
|
24
28
|
return;
|
|
25
29
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
log.info(`Candidate pair: ${sprintA} + ${sprintB}`);
|
|
37
|
-
// Check module overlap
|
|
38
|
-
const overlap = hasModuleOverlap(backlog, sprintA, sprintB);
|
|
39
|
-
if (overlap) {
|
|
40
|
-
log.info('Module overlap detected — falling back to sequential execution');
|
|
41
|
-
log.info(`Running ${sprintA} first...`);
|
|
42
|
-
const flagsA = { sprint: sprintA };
|
|
43
|
-
if (dryRun)
|
|
44
|
-
flagsA['dry-run'] = 'true';
|
|
45
|
-
await runSprint(flagsA, cwd);
|
|
46
|
-
if (!isShuttingDown()) {
|
|
47
|
-
log.info(`Running ${sprintB} second...`);
|
|
48
|
-
const flagsB = { sprint: sprintB };
|
|
30
|
+
// Run groups until no more ready sprints
|
|
31
|
+
let round = 0;
|
|
32
|
+
while (ready.length > 0 && !isShuttingDown()) {
|
|
33
|
+
round++;
|
|
34
|
+
// Build a non-overlapping group from ready sprints (greedy)
|
|
35
|
+
const group = buildNonOverlappingGroup(ready, maxParallel);
|
|
36
|
+
log.info(`── Round ${round}: ${group.map(s => s.id).join(' + ')} (${group.length} sprint${group.length > 1 ? 's' : ''}) ──`);
|
|
37
|
+
if (group.length === 1) {
|
|
38
|
+
// Single sprint — run directly (no parallel overhead)
|
|
39
|
+
const runFlags = { sprint: group[0].id };
|
|
49
40
|
if (dryRun)
|
|
50
|
-
|
|
51
|
-
await runSprint(
|
|
41
|
+
runFlags['dry-run'] = 'true';
|
|
42
|
+
const result = await runSprint(runFlags, cwd).catch(err => {
|
|
43
|
+
log.error(`Sprint ${group[0].id} failed: ${err}`);
|
|
44
|
+
return null;
|
|
45
|
+
});
|
|
46
|
+
log.info(`Sprint ${group[0].id}: ${result ? 'PASS' : 'FAIL'}`);
|
|
52
47
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (resultB.status === 'rejected') {
|
|
73
|
-
log.error(`Sprint B (${sprintB}) failed: ${resultB.reason}`);
|
|
48
|
+
else {
|
|
49
|
+
// Multi-sprint — run concurrently
|
|
50
|
+
const results = await Promise.allSettled(group.map(sprint => {
|
|
51
|
+
const runFlags = { sprint: sprint.id };
|
|
52
|
+
if (dryRun)
|
|
53
|
+
runFlags['dry-run'] = 'true';
|
|
54
|
+
return runSprint(runFlags, cwd);
|
|
55
|
+
}));
|
|
56
|
+
for (let i = 0; i < group.length; i++) {
|
|
57
|
+
const r = results[i];
|
|
58
|
+
const status = r.status === 'fulfilled' ? 'PASS' : 'FAIL';
|
|
59
|
+
if (r.status === 'rejected') {
|
|
60
|
+
log.error(`Sprint ${group[i].id} failed: ${r.reason}`);
|
|
61
|
+
}
|
|
62
|
+
log.info(`Sprint ${group[i].id}: ${status}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// Recompute ready sprints (completed deps may unblock more)
|
|
66
|
+
ready = getReadySprints(backlog, cwd, config);
|
|
74
67
|
}
|
|
75
68
|
log.info('=== Parallel Runner Complete ===');
|
|
76
|
-
log.info(`Sprint A (${sprintA}): ${statusA}`);
|
|
77
|
-
log.info(`Sprint B (${sprintB}): ${statusB}`);
|
|
78
69
|
}
|
|
79
70
|
/**
|
|
80
|
-
*
|
|
81
|
-
*
|
|
71
|
+
* Build a group of non-overlapping sprints from the ready list.
|
|
72
|
+
* Greedy: take sprints in order, skip any that overlap with already-selected.
|
|
82
73
|
*/
|
|
83
|
-
function
|
|
84
|
-
const
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
74
|
+
function buildNonOverlappingGroup(ready, maxSize) {
|
|
75
|
+
const group = [];
|
|
76
|
+
const usedModules = new Set();
|
|
77
|
+
for (const sprint of ready) {
|
|
78
|
+
if (group.length >= maxSize)
|
|
79
|
+
break;
|
|
80
|
+
const modules = getSprintModules(sprint);
|
|
81
|
+
// Check overlap with already-selected sprints
|
|
82
|
+
let overlaps = false;
|
|
83
|
+
for (const mod of modules) {
|
|
84
|
+
if (usedModules.has(mod)) {
|
|
85
|
+
overlaps = true;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (!overlaps) {
|
|
90
|
+
group.push(sprint);
|
|
91
|
+
for (const mod of modules) {
|
|
92
|
+
usedModules.add(mod);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// If greedy yielded nothing (all overlap with first), take just the first
|
|
97
|
+
if (group.length === 0 && ready.length > 0) {
|
|
98
|
+
group.push(ready[0]);
|
|
95
99
|
}
|
|
96
|
-
return
|
|
100
|
+
return group;
|
|
97
101
|
}
|
|
98
102
|
function getSprintModules(sprint) {
|
|
99
103
|
const modules = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../../src/cli/loop/parallel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"parallel.js","sourceRoot":"","sources":["../../../src/cli/loop/parallel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,qCAAqC;AACrC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAA6B,EAAE,GAAW;IAC1E,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC;IAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,oBAAoB,CAAC,EAAE,EAAE,CAAC,CAAC;IAExF,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzD,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAEpF,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC7C,IAAI,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACrC,GAAG,CAAC,IAAI,CAAC,iBAAiB,WAAW,EAAE,CAAC,CAAC;IAEzC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,KAAK,GAAG,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAElD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,yCAAyC;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC7C,KAAK,EAAE,CAAC;QACR,4DAA4D;QAC5D,MAAM,KAAK,GAAG,wBAAwB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC3D,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAE7H,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,sDAAsD;YACtD,MAAM,QAAQ,GAA2B,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACjE,IAAI,MAAM;gBAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACxD,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC;gBAClD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,kCAAkC;YAClC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;gBACjB,MAAM,QAAQ,GAA2B,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;gBAC/D,IAAI,MAAM;oBAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;gBACzC,OAAO,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC,CACH,CAAC;YAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBACrB,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC1D,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBAC5B,GAAG,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;gBACzD,CAAC;gBACD,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,KAAK,GAAG,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAS,wBAAwB,CAAC,KAAsB,EAAE,OAAe;IACvE,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO;YAAE,MAAM;QAEnC,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAEzC,8CAA8C;QAC9C,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;gBAC1B,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAqB;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/cli/loop/types.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { Logger } from './logger.js';
|
|
2
2
|
export interface LoopConfig {
|
|
3
|
+
/** Workflow name to use for step ordering (opt-in). When set, the loop delegates to the workflow engine. */
|
|
4
|
+
workflowName?: string;
|
|
5
|
+
/** Variables to pass to the workflow (e.g., model, sprint_id) */
|
|
6
|
+
workflowVariables?: Record<string, string>;
|
|
3
7
|
modelLocal: string;
|
|
4
8
|
modelApi: string;
|
|
5
9
|
ollamaApiBase: string;
|
|
@@ -17,6 +21,10 @@ export interface LoopConfig {
|
|
|
17
21
|
agentGuide: string;
|
|
18
22
|
sprintHistory: string;
|
|
19
23
|
forcePlannerExecutor: boolean;
|
|
24
|
+
/** Max sprint-level retries on full failure (default 0 — no retry) */
|
|
25
|
+
maxRetries: number;
|
|
26
|
+
/** Retry strategy: 'model' escalates all tickets to API, 'replan' regenerates plans */
|
|
27
|
+
retryStrategy: 'none' | 'model' | 'replan';
|
|
20
28
|
}
|
|
21
29
|
export declare const DEFAULT_LOOP_CONFIG: LoopConfig;
|
|
22
30
|
export declare const ENV_VAR_MAP: Record<string, keyof LoopConfig>;
|
|
@@ -41,6 +49,8 @@ export interface BacklogSprint {
|
|
|
41
49
|
slope: number;
|
|
42
50
|
type: 'feature' | 'bugfix' | 'chore';
|
|
43
51
|
tickets: BacklogTicket[];
|
|
52
|
+
/** Sprint IDs that must complete before this sprint can run */
|
|
53
|
+
depends_on?: string[];
|
|
44
54
|
}
|
|
45
55
|
export interface BacklogTicket {
|
|
46
56
|
key: string;
|
|
@@ -54,6 +64,8 @@ export interface BacklogTicket {
|
|
|
54
64
|
files?: {
|
|
55
65
|
primary: string[];
|
|
56
66
|
};
|
|
67
|
+
/** Execution likelihood score 0-1 (higher = more likely to succeed). Computed by analyze-scorecards. */
|
|
68
|
+
quality_score?: number;
|
|
57
69
|
}
|
|
58
70
|
export type Club = 'putter' | 'wedge' | 'short_iron' | 'long_iron' | 'driver';
|
|
59
71
|
export interface TicketResult {
|
|
@@ -66,6 +78,8 @@ export interface TicketResult {
|
|
|
66
78
|
escalated: boolean;
|
|
67
79
|
tests_passing: boolean;
|
|
68
80
|
noop: boolean;
|
|
81
|
+
strategy?: BacklogSprint['strategy'];
|
|
82
|
+
sprint_type?: BacklogSprint['type'];
|
|
69
83
|
tokens_in?: number;
|
|
70
84
|
tokens_out?: number;
|
|
71
85
|
cost_usd?: number;
|
|
@@ -125,6 +139,8 @@ export interface SprintResult {
|
|
|
125
139
|
merge_status?: 'merged' | 'blocked' | 'skipped';
|
|
126
140
|
merge_block_reason?: string;
|
|
127
141
|
handicap_delta?: number;
|
|
142
|
+
/** Number of sprint-level retries attempted */
|
|
143
|
+
retries?: number;
|
|
128
144
|
}
|
|
129
145
|
export interface ExecutionPlan {
|
|
130
146
|
ticket: string;
|
|
@@ -165,11 +181,38 @@ export interface ModelConfig {
|
|
|
165
181
|
passing: number;
|
|
166
182
|
rate: number;
|
|
167
183
|
}>;
|
|
184
|
+
/** Cross-dimensional rates: "club:strategy" → stats */
|
|
185
|
+
success_rates_by_strategy?: Record<string, {
|
|
186
|
+
total: number;
|
|
187
|
+
passing: number;
|
|
188
|
+
rate: number;
|
|
189
|
+
}>;
|
|
190
|
+
/** Cross-dimensional rates: "club:sprint_type" → stats */
|
|
191
|
+
success_rates_by_type?: Record<string, {
|
|
192
|
+
total: number;
|
|
193
|
+
passing: number;
|
|
194
|
+
rate: number;
|
|
195
|
+
}>;
|
|
168
196
|
cost_per_success: Record<string, number>;
|
|
197
|
+
/** Cost-adjusted scores: higher is better (success_rate / cost) */
|
|
198
|
+
cost_adjusted_scores?: Record<string, number>;
|
|
169
199
|
recommendations: Record<string, {
|
|
170
|
-
model:
|
|
200
|
+
model: string;
|
|
201
|
+
reason: string;
|
|
202
|
+
}>;
|
|
203
|
+
/** Cross-dimensional recommendations: "club:sprint_type" or "club:strategy" → model */
|
|
204
|
+
recommendations_by_type?: Record<string, {
|
|
205
|
+
model: string;
|
|
206
|
+
reason: string;
|
|
207
|
+
samples: number;
|
|
208
|
+
}>;
|
|
209
|
+
recommendations_by_strategy?: Record<string, {
|
|
210
|
+
model: string;
|
|
171
211
|
reason: string;
|
|
212
|
+
samples: number;
|
|
172
213
|
}>;
|
|
214
|
+
/** Minimum sample count used for cross-dimensional recommendations */
|
|
215
|
+
min_samples?: number;
|
|
173
216
|
notes: string[];
|
|
174
217
|
}
|
|
175
218
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/loop/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/loop/types.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/loop/types.js
CHANGED
|
@@ -17,6 +17,8 @@ export const DEFAULT_LOOP_CONFIG = {
|
|
|
17
17
|
agentGuide: 'slope-loop/slope-loop-guide/SKILL.md',
|
|
18
18
|
sprintHistory: 'slope-loop/slope-loop-guide/references/sprint-history.md',
|
|
19
19
|
forcePlannerExecutor: false,
|
|
20
|
+
maxRetries: 0,
|
|
21
|
+
retryStrategy: 'none',
|
|
20
22
|
};
|
|
21
23
|
// Mapping from LoopConfig keys to environment variable names
|
|
22
24
|
export const ENV_VAR_MAP = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/loop/types.ts"],"names":[],"mappings":"AAAA,qGAAqG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/loop/types.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAkCrG,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,UAAU,EAAE,8BAA8B;IAC1C,QAAQ,EAAE,uCAAuC;IACjD,aAAa,EAAE,wBAAwB;IACvC,oBAAoB,EAAE,IAAI;IAC1B,iBAAiB,EAAE,MAAM;IACzB,eAAe,EAAE,IAAI;IACrB,iBAAiB,EAAE,IAAI;IACvB,cAAc,EAAE,IAAI;IACpB,kBAAkB,EAAE,IAAI;IACxB,mBAAmB,EAAE,EAAE;IACvB,WAAW,EAAE,+CAA+C;IAC5D,WAAW,EAAE,yBAAyB;IACtC,UAAU,EAAE,oBAAoB;IAChC,MAAM,EAAE,iBAAiB;IACzB,UAAU,EAAE,sCAAsC;IAClD,aAAa,EAAE,0DAA0D;IACzE,oBAAoB,EAAE,KAAK;IAC3B,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,MAAM;CACtB,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,WAAW,GAAqC;IAC3D,WAAW,EAAE,YAAY;IACzB,SAAS,EAAE,UAAU;IACrB,eAAe,EAAE,eAAe;IAChC,sBAAsB,EAAE,sBAAsB;IAC9C,oBAAoB,EAAE,mBAAmB;IACzC,iBAAiB,EAAE,iBAAiB;IACpC,mBAAmB,EAAE,mBAAmB;IACxC,gBAAgB,EAAE,gBAAgB;IAClC,qBAAqB,EAAE,oBAAoB;IAC3C,qBAAqB,EAAE,qBAAqB;IAC5C,aAAa,EAAE,aAAa;IAC5B,iBAAiB,EAAE,aAAa;IAChC,gBAAgB,EAAE,YAAY;IAC9B,YAAY,EAAE,QAAQ;IACtB,2BAA2B,EAAE,sBAAsB;CACpD,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { SlopeStore } from '../../core/store.js';
|
|
2
|
+
import type { WorkflowExecution } from '../../core/types.js';
|
|
3
|
+
import type { LoopConfig, BacklogSprint } from './types.js';
|
|
4
|
+
import type { Logger } from './logger.js';
|
|
5
|
+
/** Manages a workflow execution lifecycle within a loop sprint run */
|
|
6
|
+
export declare class WorkflowAdapter {
|
|
7
|
+
private readonly config;
|
|
8
|
+
private readonly store;
|
|
9
|
+
private readonly log;
|
|
10
|
+
private engine;
|
|
11
|
+
private execution;
|
|
12
|
+
private def;
|
|
13
|
+
constructor(config: LoopConfig, store: SlopeStore, log: Logger);
|
|
14
|
+
/** Check if workflow mode is enabled */
|
|
15
|
+
get enabled(): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Start a workflow execution for a sprint.
|
|
18
|
+
* Returns the execution or null if workflow mode is disabled.
|
|
19
|
+
*/
|
|
20
|
+
start(sprint: BacklogSprint, cwd: string): Promise<WorkflowExecution | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Get the next step to execute.
|
|
23
|
+
* Returns null if workflow is complete or not active.
|
|
24
|
+
*/
|
|
25
|
+
next(): Promise<{
|
|
26
|
+
phase: string;
|
|
27
|
+
step_id: string;
|
|
28
|
+
step_type: string;
|
|
29
|
+
prompt?: string;
|
|
30
|
+
command?: string;
|
|
31
|
+
is_complete: boolean;
|
|
32
|
+
current_item?: string;
|
|
33
|
+
} | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Mark the current step as completed.
|
|
36
|
+
*/
|
|
37
|
+
completeStep(stepId: string, output?: Record<string, unknown>, exitCode?: number): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Skip the current step (e.g., on timeout or blocker).
|
|
40
|
+
*/
|
|
41
|
+
skipStep(stepId: string, reason: string): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Mark the workflow as failed (e.g., on unrecoverable error).
|
|
44
|
+
*/
|
|
45
|
+
fail(): Promise<void>;
|
|
46
|
+
/** Get the current execution ID */
|
|
47
|
+
get executionId(): string | null;
|
|
48
|
+
/** Get the current execution status (re-reads from store for accuracy) */
|
|
49
|
+
getStatus(): Promise<string | null>;
|
|
50
|
+
/** Get the cached execution status (may be stale — prefer getStatus()) */
|
|
51
|
+
get status(): string | null;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=workflow-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-adapter.d.ts","sourceRoot":"","sources":["../../../src/cli/loop/workflow-adapter.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,sEAAsE;AACtE,qBAAa,eAAe;IAMxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAPtB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,GAAG,CAAmC;gBAG3B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,UAAU,EACjB,GAAG,EAAE,MAAM;IAG9B,wCAAwC;IACxC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED;;;OAGG;IACG,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IA0BlF;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,IAAI,CAAC;IAqBT;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBtG;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7D;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,mCAAmC;IACnC,IAAI,WAAW,IAAI,MAAM,GAAG,IAAI,CAE/B;IAED,0EAA0E;IACpE,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOzC,0EAA0E;IAC1E,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,CAE1B;CACF"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// Loop → Workflow Engine Bridge
|
|
2
|
+
// Translates the loop executor's step sequence into workflow engine calls.
|
|
3
|
+
// When LoopConfig.workflowName is set, the loop delegates step ordering to the engine.
|
|
4
|
+
import { WorkflowEngine } from '../../core/workflow-engine.js';
|
|
5
|
+
import { loadWorkflow } from '../../core/workflow-loader.js';
|
|
6
|
+
import { resolveVariables } from '../../core/workflow.js';
|
|
7
|
+
/** Manages a workflow execution lifecycle within a loop sprint run */
|
|
8
|
+
export class WorkflowAdapter {
|
|
9
|
+
config;
|
|
10
|
+
store;
|
|
11
|
+
log;
|
|
12
|
+
engine = new WorkflowEngine();
|
|
13
|
+
execution = null;
|
|
14
|
+
def = null;
|
|
15
|
+
constructor(config, store, log) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
this.store = store;
|
|
18
|
+
this.log = log;
|
|
19
|
+
}
|
|
20
|
+
/** Check if workflow mode is enabled */
|
|
21
|
+
get enabled() {
|
|
22
|
+
return !!this.config.workflowName;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Start a workflow execution for a sprint.
|
|
26
|
+
* Returns the execution or null if workflow mode is disabled.
|
|
27
|
+
*/
|
|
28
|
+
async start(sprint, cwd) {
|
|
29
|
+
if (!this.config.workflowName)
|
|
30
|
+
return null;
|
|
31
|
+
// Build variables from config + sprint
|
|
32
|
+
const vars = {
|
|
33
|
+
sprint_id: sprint.id,
|
|
34
|
+
tickets: sprint.tickets.map(t => t.key).join(','),
|
|
35
|
+
model: this.config.modelLocal,
|
|
36
|
+
...this.config.workflowVariables,
|
|
37
|
+
};
|
|
38
|
+
// Load and resolve workflow
|
|
39
|
+
this.def = loadWorkflow(this.config.workflowName, cwd);
|
|
40
|
+
const resolved = resolveVariables(this.def, vars);
|
|
41
|
+
this.def = resolved;
|
|
42
|
+
// Start execution
|
|
43
|
+
this.execution = await this.engine.start(resolved, this.store, {
|
|
44
|
+
sprint_id: sprint.id,
|
|
45
|
+
variables: vars,
|
|
46
|
+
});
|
|
47
|
+
this.log.info(`Workflow "${this.config.workflowName}" started (${this.execution.id})`);
|
|
48
|
+
return this.execution;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get the next step to execute.
|
|
52
|
+
* Returns null if workflow is complete or not active.
|
|
53
|
+
*/
|
|
54
|
+
async next() {
|
|
55
|
+
if (!this.execution || !this.def)
|
|
56
|
+
return null;
|
|
57
|
+
const info = await this.engine.next(this.execution.id, this.def, this.store);
|
|
58
|
+
if (info.is_complete) {
|
|
59
|
+
this.log.info('Workflow complete');
|
|
60
|
+
return { phase: '', step_id: '', step_type: '', is_complete: true };
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
phase: info.phase,
|
|
64
|
+
step_id: info.step.id,
|
|
65
|
+
step_type: info.step.type,
|
|
66
|
+
prompt: info.step.prompt,
|
|
67
|
+
command: info.step.command,
|
|
68
|
+
is_complete: false,
|
|
69
|
+
current_item: info.current_item,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Mark the current step as completed.
|
|
74
|
+
*/
|
|
75
|
+
async completeStep(stepId, output, exitCode) {
|
|
76
|
+
if (!this.execution || !this.def)
|
|
77
|
+
return;
|
|
78
|
+
const result = await this.engine.complete(this.execution.id, stepId, { output, exit_code: exitCode }, this.def, this.store);
|
|
79
|
+
if (result.is_complete) {
|
|
80
|
+
this.log.info('Workflow execution completed');
|
|
81
|
+
}
|
|
82
|
+
else if (result.advanced_to) {
|
|
83
|
+
this.log.info(`Advanced to ${result.advanced_to.phase}/${result.advanced_to.step}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Skip the current step (e.g., on timeout or blocker).
|
|
88
|
+
*/
|
|
89
|
+
async skipStep(stepId, reason) {
|
|
90
|
+
if (!this.execution || !this.def)
|
|
91
|
+
return;
|
|
92
|
+
await this.engine.skip(this.execution.id, stepId, reason, this.def, this.store);
|
|
93
|
+
this.log.info(`Skipped step "${stepId}": ${reason}`);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Mark the workflow as failed (e.g., on unrecoverable error).
|
|
97
|
+
*/
|
|
98
|
+
async fail() {
|
|
99
|
+
if (!this.execution)
|
|
100
|
+
return;
|
|
101
|
+
await this.engine.fail(this.execution.id, this.store);
|
|
102
|
+
this.execution = { ...this.execution, status: 'failed' };
|
|
103
|
+
this.log.info('Workflow execution failed');
|
|
104
|
+
}
|
|
105
|
+
/** Get the current execution ID */
|
|
106
|
+
get executionId() {
|
|
107
|
+
return this.execution?.id ?? null;
|
|
108
|
+
}
|
|
109
|
+
/** Get the current execution status (re-reads from store for accuracy) */
|
|
110
|
+
async getStatus() {
|
|
111
|
+
if (!this.execution)
|
|
112
|
+
return null;
|
|
113
|
+
const fresh = await this.store.getExecution(this.execution.id);
|
|
114
|
+
if (fresh)
|
|
115
|
+
this.execution = fresh;
|
|
116
|
+
return fresh?.status ?? null;
|
|
117
|
+
}
|
|
118
|
+
/** Get the cached execution status (may be stale — prefer getStatus()) */
|
|
119
|
+
get status() {
|
|
120
|
+
return this.execution?.status ?? null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=workflow-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-adapter.js","sourceRoot":"","sources":["../../../src/cli/loop/workflow-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,QAAQ,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACxE,0BAA0B;IAC1B,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,qGAAqG;AACrG,eAAO,MAAM,oBAAoB,oCAAqC,CAAC;AAEvE,eAAO,MAAM,oBAAoB,EAAE,SAAS,cAAc,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/cli/registry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,QAAQ,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACxE,0BAA0B;IAC1B,WAAW,CAAC,EAAE,aAAa,EAAE,CAAC;IAC9B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,qGAAqG;AACrG,eAAO,MAAM,oBAAoB,oCAAqC,CAAC;AAEvE,eAAO,MAAM,oBAAoB,EAAE,SAAS,cAAc,EAgjBzD,CAAC"}
|
package/dist/cli/registry.js
CHANGED
|
@@ -271,6 +271,14 @@ export const CLI_COMMAND_REGISTRY = [
|
|
|
271
271
|
{ flag: '--output=<path>', desc: 'Custom output path (default: CODEBASE.md)' },
|
|
272
272
|
],
|
|
273
273
|
},
|
|
274
|
+
{
|
|
275
|
+
cmd: 'workflow', desc: 'Manage workflow definitions', category: 'tooling',
|
|
276
|
+
subcommands: [
|
|
277
|
+
{ name: 'validate', desc: 'Parse and validate a workflow definition' },
|
|
278
|
+
{ name: 'list', desc: 'List all available workflows (project + built-in)' },
|
|
279
|
+
{ name: 'show', desc: 'Pretty-print a workflow with phase/step tree' },
|
|
280
|
+
],
|
|
281
|
+
},
|
|
274
282
|
{
|
|
275
283
|
cmd: 'flows', desc: 'Manage user flow definitions', category: 'tooling',
|
|
276
284
|
subcommands: [
|
|
@@ -534,5 +542,17 @@ export const CLI_COMMAND_REGISTRY = [
|
|
|
534
542
|
] },
|
|
535
543
|
],
|
|
536
544
|
},
|
|
545
|
+
{
|
|
546
|
+
cmd: 'org', desc: 'Multi-repo aggregation and org-level metrics', category: 'analysis',
|
|
547
|
+
subcommands: [
|
|
548
|
+
{ name: 'init', desc: 'Create .slope/org.json template' },
|
|
549
|
+
{ name: 'status', desc: 'Show all repos with handicaps and sprint counts', flags: [
|
|
550
|
+
{ flag: '--json', desc: 'Output as JSON' },
|
|
551
|
+
] },
|
|
552
|
+
{ name: 'issues', desc: 'Show recurring patterns shared across repos', flags: [
|
|
553
|
+
{ flag: '--json', desc: 'Output as JSON' },
|
|
554
|
+
] },
|
|
555
|
+
],
|
|
556
|
+
},
|
|
537
557
|
];
|
|
538
558
|
//# sourceMappingURL=registry.js.map
|