@specforge/mcp 2.6.0 → 3.0.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.md +73 -0
- package/bin/{specforge-mcp → specforge} +0 -5
- package/dist/ai-provider/circuit-breaker.d.ts +63 -0
- package/dist/ai-provider/circuit-breaker.d.ts.map +1 -0
- package/dist/ai-provider/circuit-breaker.js +160 -0
- package/dist/ai-provider/circuit-breaker.js.map +1 -0
- package/dist/ai-provider/cli-version.d.ts +50 -0
- package/dist/ai-provider/cli-version.d.ts.map +1 -0
- package/dist/ai-provider/cli-version.js +141 -0
- package/dist/ai-provider/cli-version.js.map +1 -0
- package/dist/ai-provider/config-loader.d.ts +45 -0
- package/dist/ai-provider/config-loader.d.ts.map +1 -0
- package/dist/ai-provider/config-loader.js +106 -0
- package/dist/ai-provider/config-loader.js.map +1 -0
- package/dist/ai-provider/errors.d.ts +48 -0
- package/dist/ai-provider/errors.d.ts.map +1 -0
- package/dist/ai-provider/errors.js +102 -0
- package/dist/ai-provider/errors.js.map +1 -0
- package/dist/ai-provider/events.d.ts +73 -0
- package/dist/ai-provider/events.d.ts.map +1 -0
- package/dist/ai-provider/events.js +75 -0
- package/dist/ai-provider/events.js.map +1 -0
- package/dist/ai-provider/factory.d.ts +31 -0
- package/dist/ai-provider/factory.d.ts.map +1 -0
- package/dist/ai-provider/factory.js +100 -0
- package/dist/ai-provider/factory.js.map +1 -0
- package/dist/ai-provider/index.d.ts +24 -0
- package/dist/ai-provider/index.d.ts.map +1 -0
- package/dist/ai-provider/index.js +46 -0
- package/dist/ai-provider/index.js.map +1 -0
- package/dist/ai-provider/instance-coordinator.d.ts +54 -0
- package/dist/ai-provider/instance-coordinator.d.ts.map +1 -0
- package/dist/ai-provider/instance-coordinator.js +199 -0
- package/dist/ai-provider/instance-coordinator.js.map +1 -0
- package/dist/ai-provider/jsonl-parser.d.ts +43 -0
- package/dist/ai-provider/jsonl-parser.d.ts.map +1 -0
- package/dist/ai-provider/jsonl-parser.js +107 -0
- package/dist/ai-provider/jsonl-parser.js.map +1 -0
- package/dist/ai-provider/lifecycle.d.ts +50 -0
- package/dist/ai-provider/lifecycle.d.ts.map +1 -0
- package/dist/ai-provider/lifecycle.js +145 -0
- package/dist/ai-provider/lifecycle.js.map +1 -0
- package/dist/ai-provider/logger.d.ts +69 -0
- package/dist/ai-provider/logger.d.ts.map +1 -0
- package/dist/ai-provider/logger.js +161 -0
- package/dist/ai-provider/logger.js.map +1 -0
- package/dist/ai-provider/metrics.d.ts +91 -0
- package/dist/ai-provider/metrics.d.ts.map +1 -0
- package/dist/ai-provider/metrics.js +187 -0
- package/dist/ai-provider/metrics.js.map +1 -0
- package/dist/ai-provider/process-manager.d.ts +97 -0
- package/dist/ai-provider/process-manager.d.ts.map +1 -0
- package/dist/ai-provider/process-manager.js +477 -0
- package/dist/ai-provider/process-manager.js.map +1 -0
- package/dist/ai-provider/providers/claude-code.d.ts +64 -0
- package/dist/ai-provider/providers/claude-code.d.ts.map +1 -0
- package/dist/ai-provider/providers/claude-code.js +205 -0
- package/dist/ai-provider/providers/claude-code.js.map +1 -0
- package/dist/ai-provider/retry-executor.d.ts +52 -0
- package/dist/ai-provider/retry-executor.d.ts.map +1 -0
- package/dist/ai-provider/retry-executor.js +138 -0
- package/dist/ai-provider/retry-executor.js.map +1 -0
- package/dist/ai-provider/safe-args.d.ts +58 -0
- package/dist/ai-provider/safe-args.d.ts.map +1 -0
- package/dist/ai-provider/safe-args.js +176 -0
- package/dist/ai-provider/safe-args.js.map +1 -0
- package/dist/ai-provider/semaphore.d.ts +50 -0
- package/dist/ai-provider/semaphore.d.ts.map +1 -0
- package/dist/ai-provider/semaphore.js +97 -0
- package/dist/ai-provider/semaphore.js.map +1 -0
- package/dist/ai-provider/tracer.d.ts +67 -0
- package/dist/ai-provider/tracer.d.ts.map +1 -0
- package/dist/ai-provider/tracer.js +209 -0
- package/dist/ai-provider/tracer.js.map +1 -0
- package/dist/ai-provider/types.d.ts +181 -0
- package/dist/ai-provider/types.d.ts.map +1 -0
- package/dist/ai-provider/types.js +8 -0
- package/dist/ai-provider/types.js.map +1 -0
- package/dist/autopilot/agents/agent-runner.d.ts +109 -0
- package/dist/autopilot/agents/agent-runner.d.ts.map +1 -0
- package/dist/autopilot/agents/agent-runner.js +731 -0
- package/dist/autopilot/agents/agent-runner.js.map +1 -0
- package/dist/autopilot/agents/agent-selector.d.ts +59 -0
- package/dist/autopilot/agents/agent-selector.d.ts.map +1 -0
- package/dist/autopilot/agents/agent-selector.js +234 -0
- package/dist/autopilot/agents/agent-selector.js.map +1 -0
- package/dist/autopilot/agents/model-selector.d.ts +49 -0
- package/dist/autopilot/agents/model-selector.d.ts.map +1 -0
- package/dist/autopilot/agents/model-selector.js +62 -0
- package/dist/autopilot/agents/model-selector.js.map +1 -0
- package/dist/autopilot/agents/profiles/builtin.d.ts +55 -0
- package/dist/autopilot/agents/profiles/builtin.d.ts.map +1 -0
- package/dist/autopilot/agents/profiles/builtin.js +323 -0
- package/dist/autopilot/agents/profiles/builtin.js.map +1 -0
- package/dist/autopilot/agents/profiles/types.d.ts +98 -0
- package/dist/autopilot/agents/profiles/types.d.ts.map +1 -0
- package/dist/autopilot/agents/profiles/types.js +17 -0
- package/dist/autopilot/agents/profiles/types.js.map +1 -0
- package/dist/autopilot/api/autopilot-api-client.d.ts +217 -0
- package/dist/autopilot/api/autopilot-api-client.d.ts.map +1 -0
- package/dist/autopilot/api/autopilot-api-client.js +402 -0
- package/dist/autopilot/api/autopilot-api-client.js.map +1 -0
- package/dist/autopilot/cli/abort.d.ts +20 -0
- package/dist/autopilot/cli/abort.d.ts.map +1 -0
- package/dist/autopilot/cli/abort.js +201 -0
- package/dist/autopilot/cli/abort.js.map +1 -0
- package/dist/autopilot/cli/display.d.ts +63 -0
- package/dist/autopilot/cli/display.d.ts.map +1 -0
- package/dist/autopilot/cli/display.js +260 -0
- package/dist/autopilot/cli/display.js.map +1 -0
- package/dist/autopilot/cli/index.d.ts +24 -0
- package/dist/autopilot/cli/index.d.ts.map +1 -0
- package/dist/autopilot/cli/index.js +79 -0
- package/dist/autopilot/cli/index.js.map +1 -0
- package/dist/autopilot/cli/pause.d.ts +18 -0
- package/dist/autopilot/cli/pause.d.ts.map +1 -0
- package/dist/autopilot/cli/pause.js +110 -0
- package/dist/autopilot/cli/pause.js.map +1 -0
- package/dist/autopilot/cli/resume.d.ts +22 -0
- package/dist/autopilot/cli/resume.d.ts.map +1 -0
- package/dist/autopilot/cli/resume.js +172 -0
- package/dist/autopilot/cli/resume.js.map +1 -0
- package/dist/autopilot/cli/run.d.ts +25 -0
- package/dist/autopilot/cli/run.d.ts.map +1 -0
- package/dist/autopilot/cli/run.js +220 -0
- package/dist/autopilot/cli/run.js.map +1 -0
- package/dist/autopilot/cli/status.d.ts +20 -0
- package/dist/autopilot/cli/status.d.ts.map +1 -0
- package/dist/autopilot/cli/status.js +217 -0
- package/dist/autopilot/cli/status.js.map +1 -0
- package/dist/autopilot/config.d.ts +45 -0
- package/dist/autopilot/config.d.ts.map +1 -0
- package/dist/autopilot/config.js +269 -0
- package/dist/autopilot/config.js.map +1 -0
- package/dist/autopilot/core/dependency-resolver.d.ts +108 -0
- package/dist/autopilot/core/dependency-resolver.d.ts.map +1 -0
- package/dist/autopilot/core/dependency-resolver.js +394 -0
- package/dist/autopilot/core/dependency-resolver.js.map +1 -0
- package/dist/autopilot/core/dispatcher.d.ts +215 -0
- package/dist/autopilot/core/dispatcher.d.ts.map +1 -0
- package/dist/autopilot/core/dispatcher.js +594 -0
- package/dist/autopilot/core/dispatcher.js.map +1 -0
- package/dist/autopilot/core/failure-handler.d.ts +145 -0
- package/dist/autopilot/core/failure-handler.d.ts.map +1 -0
- package/dist/autopilot/core/failure-handler.js +308 -0
- package/dist/autopilot/core/failure-handler.js.map +1 -0
- package/dist/autopilot/core/rate-limit-handler.d.ts +108 -0
- package/dist/autopilot/core/rate-limit-handler.d.ts.map +1 -0
- package/dist/autopilot/core/rate-limit-handler.js +195 -0
- package/dist/autopilot/core/rate-limit-handler.js.map +1 -0
- package/dist/autopilot/core/state-manager.d.ts +160 -0
- package/dist/autopilot/core/state-manager.d.ts.map +1 -0
- package/dist/autopilot/core/state-manager.js +393 -0
- package/dist/autopilot/core/state-manager.js.map +1 -0
- package/dist/autopilot/core/timeout-manager.d.ts +95 -0
- package/dist/autopilot/core/timeout-manager.d.ts.map +1 -0
- package/dist/autopilot/core/timeout-manager.js +188 -0
- package/dist/autopilot/core/timeout-manager.js.map +1 -0
- package/dist/autopilot/git/branch-manager.d.ts +117 -0
- package/dist/autopilot/git/branch-manager.d.ts.map +1 -0
- package/dist/autopilot/git/branch-manager.js +238 -0
- package/dist/autopilot/git/branch-manager.js.map +1 -0
- package/dist/autopilot/git/index.d.ts +9 -0
- package/dist/autopilot/git/index.d.ts.map +1 -0
- package/dist/autopilot/git/index.js +9 -0
- package/dist/autopilot/git/index.js.map +1 -0
- package/dist/autopilot/git/merge-manager.d.ts +118 -0
- package/dist/autopilot/git/merge-manager.d.ts.map +1 -0
- package/dist/autopilot/git/merge-manager.js +304 -0
- package/dist/autopilot/git/merge-manager.js.map +1 -0
- package/dist/autopilot/git/worktree-manager.d.ts +128 -0
- package/dist/autopilot/git/worktree-manager.d.ts.map +1 -0
- package/dist/autopilot/git/worktree-manager.js +298 -0
- package/dist/autopilot/git/worktree-manager.js.map +1 -0
- package/dist/autopilot/index.d.ts +30 -0
- package/dist/autopilot/index.d.ts.map +1 -0
- package/dist/autopilot/index.js +55 -0
- package/dist/autopilot/index.js.map +1 -0
- package/dist/autopilot/sync/index.d.ts +7 -0
- package/dist/autopilot/sync/index.d.ts.map +1 -0
- package/dist/autopilot/sync/index.js +7 -0
- package/dist/autopilot/sync/index.js.map +1 -0
- package/dist/autopilot/sync/sync-manager.d.ts +168 -0
- package/dist/autopilot/sync/sync-manager.d.ts.map +1 -0
- package/dist/autopilot/sync/sync-manager.js +303 -0
- package/dist/autopilot/sync/sync-manager.js.map +1 -0
- package/dist/autopilot/types.d.ts +454 -0
- package/dist/autopilot/types.d.ts.map +1 -0
- package/dist/autopilot/types.js +26 -0
- package/dist/autopilot/types.js.map +1 -0
- package/dist/autopilot/utils/audit-logger.d.ts +176 -0
- package/dist/autopilot/utils/audit-logger.d.ts.map +1 -0
- package/dist/autopilot/utils/audit-logger.js +308 -0
- package/dist/autopilot/utils/audit-logger.js.map +1 -0
- package/dist/autopilot/utils/cost-tracker.d.ts +162 -0
- package/dist/autopilot/utils/cost-tracker.d.ts.map +1 -0
- package/dist/autopilot/utils/cost-tracker.js +269 -0
- package/dist/autopilot/utils/cost-tracker.js.map +1 -0
- package/dist/autopilot/utils/index.d.ts +9 -0
- package/dist/autopilot/utils/index.d.ts.map +1 -0
- package/dist/autopilot/utils/index.js +9 -0
- package/dist/autopilot/utils/index.js.map +1 -0
- package/dist/autopilot/utils/progress-reporter.d.ts +132 -0
- package/dist/autopilot/utils/progress-reporter.d.ts.map +1 -0
- package/dist/autopilot/utils/progress-reporter.js +290 -0
- package/dist/autopilot/utils/progress-reporter.js.map +1 -0
- package/dist/autopilot/worker/worker-pool.d.ts +179 -0
- package/dist/autopilot/worker/worker-pool.d.ts.map +1 -0
- package/dist/autopilot/worker/worker-pool.js +331 -0
- package/dist/autopilot/worker/worker-pool.js.map +1 -0
- package/dist/autopilot/worker/worker-session.d.ts +171 -0
- package/dist/autopilot/worker/worker-session.d.ts.map +1 -0
- package/dist/autopilot/worker/worker-session.js +295 -0
- package/dist/autopilot/worker/worker-session.js.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/core/epic.js +1 -1
- package/dist/tools/core/epic.js.map +1 -1
- package/dist/tools/core/lookup.d.ts.map +1 -1
- package/dist/tools/core/lookup.js +3 -2
- package/dist/tools/core/lookup.js.map +1 -1
- package/dist/tools/core/specification.js +1 -1
- package/dist/tools/core/specification.js.map +1 -1
- package/dist/tools/core/ticket.d.ts.map +1 -1
- package/dist/tools/core/ticket.js +4 -6
- package/dist/tools/core/ticket.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +60 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +4 -1
- package/dist/validation/index.js.map +1 -1
- package/package.json +8 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.d.ts","sourceRoot":"","sources":["../../../src/autopilot/core/dependency-resolver.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAU,YAAY,EAAoB,MAAM,sBAAsB,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEzE;;GAEG;AACH,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,SAAS;IAH7B,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,WAAW,CAAoC;gBAEnC,SAAS,EAAE,kBAAkB;IAEjD;;OAEG;IACG,UAAU,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCxD;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAMzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAiBnB;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;IAY3B;;OAEG;IACH,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAchD;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IA4BzC;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IA+BtC;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQtC;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI;IAQ1D;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAIrD;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAIxC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAavC;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG;QAC/B,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;KACjB;IAuCD;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAYxC;;OAEG;IACH,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE;IA6C3C;;OAEG;IACH,0BAA0B,IAAI,MAAM,EAAE,EAAE;IAyCxC;;OAEG;IACH,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAkC9C;;OAEG;IACH,QAAQ,IAAI;QACV,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,MAAM,CAAC;KACnB;CAuBF;AAGD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,kBAAkB,GAAG,kBAAkB,CAE1F"}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Resolver
|
|
3
|
+
*
|
|
4
|
+
* Builds ticket DAG, finds ready tickets, and manages dependency blocking.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Dependency graph for tickets
|
|
8
|
+
*/
|
|
9
|
+
export class DependencyResolver {
|
|
10
|
+
apiClient;
|
|
11
|
+
nodes = new Map();
|
|
12
|
+
epicTickets = new Map();
|
|
13
|
+
constructor(apiClient) {
|
|
14
|
+
this.apiClient = apiClient;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Build dependency graph for all tickets in specification
|
|
18
|
+
*/
|
|
19
|
+
async buildGraph(specificationId) {
|
|
20
|
+
this.nodes.clear();
|
|
21
|
+
this.epicTickets.clear();
|
|
22
|
+
// Get all epics and tickets
|
|
23
|
+
const epics = await this.apiClient.getEpics(specificationId);
|
|
24
|
+
for (const epic of epics) {
|
|
25
|
+
const tickets = await this.apiClient.getTickets(epic.id);
|
|
26
|
+
const ticketIds = [];
|
|
27
|
+
for (const ticket of tickets) {
|
|
28
|
+
ticketIds.push(ticket.id);
|
|
29
|
+
// Get dependencies for this ticket
|
|
30
|
+
const deps = await this.apiClient.getTicketDependencies(ticket.id);
|
|
31
|
+
this.nodes.set(ticket.id, {
|
|
32
|
+
ticketId: ticket.id,
|
|
33
|
+
status: ticket.status,
|
|
34
|
+
dependsOn: deps.blockedBy.map(d => d.id),
|
|
35
|
+
blockedBy: deps.blockedBy
|
|
36
|
+
.filter(d => d.status !== 'done')
|
|
37
|
+
.map(d => d.id),
|
|
38
|
+
ready: false,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
this.epicTickets.set(epic.id, ticketIds);
|
|
42
|
+
}
|
|
43
|
+
// Calculate ready state for all nodes
|
|
44
|
+
this.updateReadyStates();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Update ready states based on current dependency status
|
|
48
|
+
*/
|
|
49
|
+
updateReadyStates() {
|
|
50
|
+
for (const node of this.nodes.values()) {
|
|
51
|
+
node.ready = this.isNodeReady(node);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Check if a node is ready (all dependencies satisfied)
|
|
56
|
+
*/
|
|
57
|
+
isNodeReady(node) {
|
|
58
|
+
// Skip if not in actionable status
|
|
59
|
+
if (node.status !== 'todo' && node.status !== 'queue') {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
// Check all dependencies are completed
|
|
63
|
+
for (const depId of node.dependsOn) {
|
|
64
|
+
const depNode = this.nodes.get(depId);
|
|
65
|
+
if (!depNode || depNode.status !== 'done') {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get all ready tickets
|
|
73
|
+
*/
|
|
74
|
+
getReadyTickets() {
|
|
75
|
+
const ready = [];
|
|
76
|
+
for (const node of this.nodes.values()) {
|
|
77
|
+
if (node.ready) {
|
|
78
|
+
ready.push(node.ticketId);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return ready;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Get ready tickets for a specific epic
|
|
85
|
+
*/
|
|
86
|
+
getReadyTicketsForEpic(epicId) {
|
|
87
|
+
const epicTicketIds = this.epicTickets.get(epicId) || [];
|
|
88
|
+
const ready = [];
|
|
89
|
+
for (const ticketId of epicTicketIds) {
|
|
90
|
+
const node = this.nodes.get(ticketId);
|
|
91
|
+
if (node?.ready) {
|
|
92
|
+
ready.push(ticketId);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return ready;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Mark ticket as completed and update dependents
|
|
99
|
+
*/
|
|
100
|
+
markCompleted(ticketId) {
|
|
101
|
+
const node = this.nodes.get(ticketId);
|
|
102
|
+
if (!node)
|
|
103
|
+
return [];
|
|
104
|
+
node.status = 'done';
|
|
105
|
+
node.ready = false;
|
|
106
|
+
// Update all nodes that depend on this ticket
|
|
107
|
+
const nowReady = [];
|
|
108
|
+
for (const otherNode of this.nodes.values()) {
|
|
109
|
+
if (otherNode.dependsOn.includes(ticketId)) {
|
|
110
|
+
// Remove from blockedBy
|
|
111
|
+
otherNode.blockedBy = otherNode.blockedBy.filter(id => id !== ticketId);
|
|
112
|
+
// Check if now ready
|
|
113
|
+
const wasReady = otherNode.ready;
|
|
114
|
+
otherNode.ready = this.isNodeReady(otherNode);
|
|
115
|
+
if (!wasReady && otherNode.ready) {
|
|
116
|
+
nowReady.push(otherNode.ticketId);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return nowReady;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Mark ticket as failed and cascade to dependents
|
|
124
|
+
*/
|
|
125
|
+
markFailed(ticketId) {
|
|
126
|
+
const node = this.nodes.get(ticketId);
|
|
127
|
+
if (!node)
|
|
128
|
+
return [];
|
|
129
|
+
node.status = 'blocked';
|
|
130
|
+
node.ready = false;
|
|
131
|
+
// Find all tickets that transitively depend on this one
|
|
132
|
+
const affected = [];
|
|
133
|
+
const toProcess = [ticketId];
|
|
134
|
+
const processed = new Set();
|
|
135
|
+
while (toProcess.length > 0) {
|
|
136
|
+
const currentId = toProcess.shift();
|
|
137
|
+
if (processed.has(currentId))
|
|
138
|
+
continue;
|
|
139
|
+
processed.add(currentId);
|
|
140
|
+
for (const otherNode of this.nodes.values()) {
|
|
141
|
+
if (otherNode.dependsOn.includes(currentId)) {
|
|
142
|
+
otherNode.ready = false;
|
|
143
|
+
if (!processed.has(otherNode.ticketId)) {
|
|
144
|
+
affected.push(otherNode.ticketId);
|
|
145
|
+
toProcess.push(otherNode.ticketId);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return affected;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Mark ticket as in progress
|
|
154
|
+
*/
|
|
155
|
+
markInProgress(ticketId) {
|
|
156
|
+
const node = this.nodes.get(ticketId);
|
|
157
|
+
if (node) {
|
|
158
|
+
node.status = 'in_progress';
|
|
159
|
+
node.ready = false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Update ticket status
|
|
164
|
+
*/
|
|
165
|
+
updateStatus(ticketId, status) {
|
|
166
|
+
const node = this.nodes.get(ticketId);
|
|
167
|
+
if (node) {
|
|
168
|
+
node.status = status;
|
|
169
|
+
this.updateReadyStates();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Get node by ticket ID
|
|
174
|
+
*/
|
|
175
|
+
getNode(ticketId) {
|
|
176
|
+
return this.nodes.get(ticketId);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get all tickets for an epic
|
|
180
|
+
*/
|
|
181
|
+
getEpicTickets(epicId) {
|
|
182
|
+
return this.epicTickets.get(epicId) || [];
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Check if epic is complete (all tickets done or skipped)
|
|
186
|
+
*/
|
|
187
|
+
isEpicComplete(epicId) {
|
|
188
|
+
const ticketIds = this.epicTickets.get(epicId) || [];
|
|
189
|
+
for (const ticketId of ticketIds) {
|
|
190
|
+
const node = this.nodes.get(ticketId);
|
|
191
|
+
if (node && node.status !== 'done') {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get epic progress
|
|
199
|
+
*/
|
|
200
|
+
getEpicProgress(epicId) {
|
|
201
|
+
const ticketIds = this.epicTickets.get(epicId) || [];
|
|
202
|
+
const stats = {
|
|
203
|
+
total: ticketIds.length,
|
|
204
|
+
completed: 0,
|
|
205
|
+
failed: 0,
|
|
206
|
+
inProgress: 0,
|
|
207
|
+
ready: 0,
|
|
208
|
+
blocked: 0,
|
|
209
|
+
};
|
|
210
|
+
for (const ticketId of ticketIds) {
|
|
211
|
+
const node = this.nodes.get(ticketId);
|
|
212
|
+
if (!node)
|
|
213
|
+
continue;
|
|
214
|
+
switch (node.status) {
|
|
215
|
+
case 'done':
|
|
216
|
+
stats.completed++;
|
|
217
|
+
break;
|
|
218
|
+
case 'blocked':
|
|
219
|
+
stats.failed++;
|
|
220
|
+
break;
|
|
221
|
+
case 'in_progress':
|
|
222
|
+
stats.inProgress++;
|
|
223
|
+
break;
|
|
224
|
+
case 'todo':
|
|
225
|
+
case 'queue':
|
|
226
|
+
if (node.ready) {
|
|
227
|
+
stats.ready++;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
stats.blocked++;
|
|
231
|
+
}
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return stats;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get tickets blocked by a specific ticket
|
|
239
|
+
*/
|
|
240
|
+
getBlockedBy(ticketId) {
|
|
241
|
+
const blocked = [];
|
|
242
|
+
for (const node of this.nodes.values()) {
|
|
243
|
+
if (node.dependsOn.includes(ticketId) && node.status !== 'done') {
|
|
244
|
+
blocked.push(node.ticketId);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return blocked;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Build priority queue of ready tickets
|
|
251
|
+
*/
|
|
252
|
+
buildQueue(epicId) {
|
|
253
|
+
const queue = [];
|
|
254
|
+
for (const [nodeTicketId, node] of this.nodes.entries()) {
|
|
255
|
+
// Filter by epic if specified
|
|
256
|
+
if (epicId) {
|
|
257
|
+
const epicTicketIds = this.epicTickets.get(epicId) || [];
|
|
258
|
+
if (!epicTicketIds.includes(nodeTicketId))
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
if (!node.ready)
|
|
262
|
+
continue;
|
|
263
|
+
// Find epic ID for this ticket
|
|
264
|
+
let ticketEpicId = epicId || '';
|
|
265
|
+
if (!ticketEpicId) {
|
|
266
|
+
for (const [eId, tIds] of this.epicTickets) {
|
|
267
|
+
if (tIds.includes(nodeTicketId)) {
|
|
268
|
+
ticketEpicId = eId;
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Calculate priority based on:
|
|
274
|
+
// 1. Number of dependents (more = higher priority)
|
|
275
|
+
// 2. Ticket complexity (smaller = higher priority)
|
|
276
|
+
const dependentCount = this.getBlockedBy(nodeTicketId).length;
|
|
277
|
+
const priority = -dependentCount; // Negative so higher counts are processed first
|
|
278
|
+
queue.push({
|
|
279
|
+
ticketId: nodeTicketId,
|
|
280
|
+
epicId: ticketEpicId,
|
|
281
|
+
dependsOn: node.dependsOn,
|
|
282
|
+
ready: true,
|
|
283
|
+
priority,
|
|
284
|
+
complexity: 'medium', // Default, should be enriched from ticket data
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
// Sort by priority (lower value = higher priority)
|
|
288
|
+
queue.sort((a, b) => a.priority - b.priority);
|
|
289
|
+
return queue;
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Detect circular dependencies
|
|
293
|
+
*/
|
|
294
|
+
detectCircularDependencies() {
|
|
295
|
+
const cycles = [];
|
|
296
|
+
const visited = new Set();
|
|
297
|
+
const stack = new Set();
|
|
298
|
+
const dfs = (ticketId, path) => {
|
|
299
|
+
if (stack.has(ticketId)) {
|
|
300
|
+
// Found cycle - extract it
|
|
301
|
+
const cycleStart = path.indexOf(ticketId);
|
|
302
|
+
cycles.push(path.slice(cycleStart));
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
if (visited.has(ticketId)) {
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
visited.add(ticketId);
|
|
309
|
+
stack.add(ticketId);
|
|
310
|
+
path.push(ticketId);
|
|
311
|
+
const node = this.nodes.get(ticketId);
|
|
312
|
+
if (node) {
|
|
313
|
+
for (const depId of node.dependsOn) {
|
|
314
|
+
dfs(depId, [...path]);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
stack.delete(ticketId);
|
|
318
|
+
return false;
|
|
319
|
+
};
|
|
320
|
+
for (const ticketId of this.nodes.keys()) {
|
|
321
|
+
if (!visited.has(ticketId)) {
|
|
322
|
+
dfs(ticketId, []);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return cycles;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Get topological order for tickets
|
|
329
|
+
*/
|
|
330
|
+
getTopologicalOrder(epicId) {
|
|
331
|
+
const order = [];
|
|
332
|
+
const visited = new Set();
|
|
333
|
+
const temp = new Set();
|
|
334
|
+
const visit = (ticketId) => {
|
|
335
|
+
if (visited.has(ticketId))
|
|
336
|
+
return;
|
|
337
|
+
if (temp.has(ticketId))
|
|
338
|
+
return; // Skip cycles
|
|
339
|
+
temp.add(ticketId);
|
|
340
|
+
const node = this.nodes.get(ticketId);
|
|
341
|
+
if (node) {
|
|
342
|
+
for (const depId of node.dependsOn) {
|
|
343
|
+
visit(depId);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
temp.delete(ticketId);
|
|
347
|
+
visited.add(ticketId);
|
|
348
|
+
order.push(ticketId);
|
|
349
|
+
};
|
|
350
|
+
const ticketIds = epicId
|
|
351
|
+
? this.epicTickets.get(epicId) || []
|
|
352
|
+
: [...this.nodes.keys()];
|
|
353
|
+
for (const ticketId of ticketIds) {
|
|
354
|
+
visit(ticketId);
|
|
355
|
+
}
|
|
356
|
+
return order;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Get statistics about the graph
|
|
360
|
+
*/
|
|
361
|
+
getStats() {
|
|
362
|
+
let ready = 0;
|
|
363
|
+
let completed = 0;
|
|
364
|
+
let blocked = 0;
|
|
365
|
+
let inProgress = 0;
|
|
366
|
+
for (const node of this.nodes.values()) {
|
|
367
|
+
if (node.status === 'done')
|
|
368
|
+
completed++;
|
|
369
|
+
else if (node.status === 'blocked')
|
|
370
|
+
blocked++;
|
|
371
|
+
else if (node.status === 'in_progress')
|
|
372
|
+
inProgress++;
|
|
373
|
+
else if (node.ready)
|
|
374
|
+
ready++;
|
|
375
|
+
else
|
|
376
|
+
blocked++;
|
|
377
|
+
}
|
|
378
|
+
return {
|
|
379
|
+
totalTickets: this.nodes.size,
|
|
380
|
+
readyTickets: ready,
|
|
381
|
+
completedTickets: completed,
|
|
382
|
+
blockedTickets: blocked,
|
|
383
|
+
inProgressTickets: inProgress,
|
|
384
|
+
epicCount: this.epicTickets.size,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Create a dependency resolver
|
|
390
|
+
*/
|
|
391
|
+
export function createDependencyResolver(apiClient) {
|
|
392
|
+
return new DependencyResolver(apiClient);
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=dependency-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../../src/autopilot/core/dependency-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Autopilot Dispatcher
|
|
3
|
+
*
|
|
4
|
+
* Main orchestrator for epics, ticket queue, and worker assignment.
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
import type { Epic, Ticket } from '../../types/index.js';
|
|
8
|
+
import type { AutopilotConfig, AutopilotState, RunSummary, ImplementationResult } from '../types.js';
|
|
9
|
+
import { StateManager } from './state-manager.js';
|
|
10
|
+
import { DependencyResolver } from './dependency-resolver.js';
|
|
11
|
+
import type { AutopilotApiClient } from '../api/autopilot-api-client.js';
|
|
12
|
+
/**
|
|
13
|
+
* Dispatcher configuration
|
|
14
|
+
*/
|
|
15
|
+
export interface DispatcherOptions {
|
|
16
|
+
config: AutopilotConfig;
|
|
17
|
+
apiClient: AutopilotApiClient;
|
|
18
|
+
specificationId: string;
|
|
19
|
+
projectId: string;
|
|
20
|
+
workingDirectory: string;
|
|
21
|
+
onImplementTicket?: (ticket: Ticket, workerId: number, worktreePath: string) => Promise<ImplementationResult>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Dispatcher Events
|
|
25
|
+
*/
|
|
26
|
+
export interface DispatcherEvents {
|
|
27
|
+
'started': void;
|
|
28
|
+
'paused': {
|
|
29
|
+
reason: string;
|
|
30
|
+
};
|
|
31
|
+
'resumed': void;
|
|
32
|
+
'completed': RunSummary;
|
|
33
|
+
'aborted': {
|
|
34
|
+
reason: string;
|
|
35
|
+
};
|
|
36
|
+
'state:changed': AutopilotState;
|
|
37
|
+
'epic:started': {
|
|
38
|
+
epic: Epic;
|
|
39
|
+
};
|
|
40
|
+
'epic:completed': {
|
|
41
|
+
epic: Epic;
|
|
42
|
+
stats: {
|
|
43
|
+
completed: number;
|
|
44
|
+
failed: number;
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
'ticket:assigned': {
|
|
48
|
+
ticketId: string;
|
|
49
|
+
workerId: number;
|
|
50
|
+
};
|
|
51
|
+
'ticket:completed': {
|
|
52
|
+
ticketId: string;
|
|
53
|
+
workerId: number;
|
|
54
|
+
};
|
|
55
|
+
'ticket:failed': {
|
|
56
|
+
ticketId: string;
|
|
57
|
+
workerId: number;
|
|
58
|
+
error: string;
|
|
59
|
+
};
|
|
60
|
+
'worker:idle': {
|
|
61
|
+
workerId: number;
|
|
62
|
+
};
|
|
63
|
+
'cost:warning': {
|
|
64
|
+
current: number;
|
|
65
|
+
max: number;
|
|
66
|
+
};
|
|
67
|
+
'cost:exceeded': {
|
|
68
|
+
current: number;
|
|
69
|
+
max: number;
|
|
70
|
+
};
|
|
71
|
+
'rate_limit:paused': void;
|
|
72
|
+
'rate_limit:resumed': void;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Autopilot Dispatcher
|
|
76
|
+
*
|
|
77
|
+
* Orchestrates the entire autopilot run.
|
|
78
|
+
*/
|
|
79
|
+
export declare class Dispatcher extends EventEmitter {
|
|
80
|
+
private config;
|
|
81
|
+
private apiClient;
|
|
82
|
+
private stateManager;
|
|
83
|
+
private dependencyResolver;
|
|
84
|
+
private timeoutManager;
|
|
85
|
+
private failureHandler;
|
|
86
|
+
private rateLimitHandler;
|
|
87
|
+
private workingDirectory;
|
|
88
|
+
private onImplementTicket?;
|
|
89
|
+
private specification?;
|
|
90
|
+
private epics;
|
|
91
|
+
private currentEpicIndex;
|
|
92
|
+
private ticketQueue;
|
|
93
|
+
private activeWorkers;
|
|
94
|
+
private isRunning;
|
|
95
|
+
private isPaused;
|
|
96
|
+
private shouldStop;
|
|
97
|
+
constructor(options: DispatcherOptions);
|
|
98
|
+
/**
|
|
99
|
+
* Set up internal event handlers
|
|
100
|
+
*/
|
|
101
|
+
private setupEventHandlers;
|
|
102
|
+
/**
|
|
103
|
+
* Start the autopilot run
|
|
104
|
+
*/
|
|
105
|
+
start(): Promise<RunSummary>;
|
|
106
|
+
/**
|
|
107
|
+
* Load specification and epics from API
|
|
108
|
+
*/
|
|
109
|
+
private loadSpecification;
|
|
110
|
+
/**
|
|
111
|
+
* Initialize worker sessions
|
|
112
|
+
*/
|
|
113
|
+
private initializeWorkers;
|
|
114
|
+
/**
|
|
115
|
+
* Process all epics
|
|
116
|
+
*/
|
|
117
|
+
private processEpics;
|
|
118
|
+
/**
|
|
119
|
+
* Process a single epic
|
|
120
|
+
*/
|
|
121
|
+
private processEpic;
|
|
122
|
+
/**
|
|
123
|
+
* Assign tickets to idle workers
|
|
124
|
+
*/
|
|
125
|
+
private assignTicketsToWorkers;
|
|
126
|
+
/**
|
|
127
|
+
* Process a single ticket
|
|
128
|
+
*/
|
|
129
|
+
private processTicket;
|
|
130
|
+
/**
|
|
131
|
+
* Handle successful ticket completion
|
|
132
|
+
*/
|
|
133
|
+
private handleTicketSuccess;
|
|
134
|
+
/**
|
|
135
|
+
* Handle ticket failure
|
|
136
|
+
*/
|
|
137
|
+
private handleTicketFailure;
|
|
138
|
+
/**
|
|
139
|
+
* Handle ticket timeout
|
|
140
|
+
*/
|
|
141
|
+
private handleTicketTimeout;
|
|
142
|
+
/**
|
|
143
|
+
* Refresh ticket queue for epic
|
|
144
|
+
*/
|
|
145
|
+
private refreshQueue;
|
|
146
|
+
/**
|
|
147
|
+
* Wait for at least one worker to complete
|
|
148
|
+
*/
|
|
149
|
+
private waitForWorkerCompletion;
|
|
150
|
+
/**
|
|
151
|
+
* Wait for all workers to complete
|
|
152
|
+
*/
|
|
153
|
+
private waitForAllWorkers;
|
|
154
|
+
/**
|
|
155
|
+
* Wait for resume from pause
|
|
156
|
+
*/
|
|
157
|
+
private waitForResume;
|
|
158
|
+
/**
|
|
159
|
+
* Wait for rate limit to clear
|
|
160
|
+
*/
|
|
161
|
+
private waitForRateLimitClear;
|
|
162
|
+
/**
|
|
163
|
+
* Check cost limits
|
|
164
|
+
*/
|
|
165
|
+
private checkCostLimits;
|
|
166
|
+
/**
|
|
167
|
+
* Estimate cost from tokens
|
|
168
|
+
*/
|
|
169
|
+
private estimateCost;
|
|
170
|
+
/**
|
|
171
|
+
* Pause the run
|
|
172
|
+
*/
|
|
173
|
+
pause(reason: string): void;
|
|
174
|
+
/**
|
|
175
|
+
* Resume the run
|
|
176
|
+
*/
|
|
177
|
+
resume(): void;
|
|
178
|
+
/**
|
|
179
|
+
* Complete the run
|
|
180
|
+
*/
|
|
181
|
+
private complete;
|
|
182
|
+
/**
|
|
183
|
+
* Abort the run
|
|
184
|
+
*/
|
|
185
|
+
abort(reason: string): RunSummary;
|
|
186
|
+
/**
|
|
187
|
+
* Cleanup resources
|
|
188
|
+
*/
|
|
189
|
+
private cleanup;
|
|
190
|
+
/**
|
|
191
|
+
* Get current state
|
|
192
|
+
*/
|
|
193
|
+
getState(): AutopilotState;
|
|
194
|
+
/**
|
|
195
|
+
* Get state manager
|
|
196
|
+
*/
|
|
197
|
+
getStateManager(): StateManager;
|
|
198
|
+
/**
|
|
199
|
+
* Get dependency resolver
|
|
200
|
+
*/
|
|
201
|
+
getDependencyResolver(): DependencyResolver;
|
|
202
|
+
/**
|
|
203
|
+
* Check if running
|
|
204
|
+
*/
|
|
205
|
+
isActive(): boolean;
|
|
206
|
+
/**
|
|
207
|
+
* Check if paused
|
|
208
|
+
*/
|
|
209
|
+
isPausedState(): boolean;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Create a dispatcher
|
|
213
|
+
*/
|
|
214
|
+
export declare function createDispatcher(options: DispatcherOptions): Dispatcher;
|
|
215
|
+
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../src/autopilot/core/dispatcher.ts"],"names":[],"mappings":"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"}
|