@cluesmith/codev 2.0.3 → 2.0.7
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/dashboard/dist/assets/index-BblS3DWL.js +135 -0
- package/dashboard/dist/assets/index-BblS3DWL.js.map +1 -0
- package/dashboard/dist/assets/index-Cr9PyjqX.css +32 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +54 -61
- package/dist/agent-farm/cli.js.map +1 -1
- package/dist/agent-farm/commands/architect.d.ts +5 -5
- package/dist/agent-farm/commands/architect.d.ts.map +1 -1
- package/dist/agent-farm/commands/architect.js +37 -20
- package/dist/agent-farm/commands/architect.js.map +1 -1
- package/dist/agent-farm/commands/attach.d.ts +19 -0
- package/dist/agent-farm/commands/attach.d.ts.map +1 -1
- package/dist/agent-farm/commands/attach.js +169 -29
- package/dist/agent-farm/commands/attach.js.map +1 -1
- package/dist/agent-farm/commands/cleanup.d.ts +12 -0
- package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
- package/dist/agent-farm/commands/cleanup.js +108 -7
- package/dist/agent-farm/commands/cleanup.js.map +1 -1
- package/dist/agent-farm/commands/send.d.ts +22 -2
- package/dist/agent-farm/commands/send.d.ts.map +1 -1
- package/dist/agent-farm/commands/send.js +97 -178
- package/dist/agent-farm/commands/send.js.map +1 -1
- package/dist/agent-farm/commands/spawn-roles.d.ts +3 -9
- package/dist/agent-farm/commands/spawn-roles.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn-roles.js +14 -53
- package/dist/agent-farm/commands/spawn-roles.js.map +1 -1
- package/dist/agent-farm/commands/spawn-worktree.d.ts +11 -18
- package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn-worktree.js +35 -22
- package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
- package/dist/agent-farm/commands/spawn.d.ts +8 -6
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +207 -89
- package/dist/agent-farm/commands/spawn.js.map +1 -1
- package/dist/agent-farm/commands/start.d.ts.map +1 -1
- package/dist/agent-farm/commands/start.js +2 -6
- package/dist/agent-farm/commands/start.js.map +1 -1
- package/dist/agent-farm/commands/status.d.ts.map +1 -1
- package/dist/agent-farm/commands/status.js +5 -35
- package/dist/agent-farm/commands/status.js.map +1 -1
- package/dist/agent-farm/commands/stop.d.ts.map +1 -1
- package/dist/agent-farm/commands/stop.js +2 -6
- package/dist/agent-farm/commands/stop.js.map +1 -1
- package/dist/agent-farm/commands/tower-cloud.d.ts +2 -9
- package/dist/agent-farm/commands/tower-cloud.d.ts.map +1 -1
- package/dist/agent-farm/commands/tower-cloud.js +12 -47
- package/dist/agent-farm/commands/tower-cloud.js.map +1 -1
- package/dist/agent-farm/commands/tower.d.ts.map +1 -1
- package/dist/agent-farm/commands/tower.js +6 -23
- package/dist/agent-farm/commands/tower.js.map +1 -1
- package/dist/agent-farm/db/index.d.ts.map +1 -1
- package/dist/agent-farm/db/index.js +52 -2
- package/dist/agent-farm/db/index.js.map +1 -1
- package/dist/agent-farm/db/schema.d.ts +1 -1
- package/dist/agent-farm/db/schema.d.ts.map +1 -1
- package/dist/agent-farm/db/schema.js +1 -1
- package/dist/agent-farm/lib/cloud-config.d.ts +1 -0
- package/dist/agent-farm/lib/cloud-config.d.ts.map +1 -1
- package/dist/agent-farm/lib/cloud-config.js +2 -2
- package/dist/agent-farm/lib/cloud-config.js.map +1 -1
- package/dist/agent-farm/lib/tower-client.d.ts +65 -6
- package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
- package/dist/agent-farm/lib/tower-client.js +57 -2
- package/dist/agent-farm/lib/tower-client.js.map +1 -1
- package/dist/agent-farm/servers/overview.d.ts +157 -0
- package/dist/agent-farm/servers/overview.d.ts.map +1 -0
- package/dist/agent-farm/servers/overview.js +625 -0
- package/dist/agent-farm/servers/overview.js.map +1 -0
- package/dist/agent-farm/servers/tower-instances.d.ts +1 -3
- package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-instances.js +12 -14
- package/dist/agent-farm/servers/tower-instances.js.map +1 -1
- package/dist/agent-farm/servers/tower-messages.d.ts +87 -0
- package/dist/agent-farm/servers/tower-messages.d.ts.map +1 -0
- package/dist/agent-farm/servers/tower-messages.js +202 -0
- package/dist/agent-farm/servers/tower-messages.js.map +1 -0
- package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-routes.js +182 -34
- package/dist/agent-farm/servers/tower-routes.js.map +1 -1
- package/dist/agent-farm/servers/tower-server.js +30 -6
- package/dist/agent-farm/servers/tower-server.js.map +1 -1
- package/dist/agent-farm/servers/tower-terminals.d.ts +9 -3
- package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-terminals.js +129 -84
- package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
- package/dist/agent-farm/servers/tower-tunnel.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-tunnel.js +3 -19
- package/dist/agent-farm/servers/tower-tunnel.js.map +1 -1
- package/dist/agent-farm/servers/tower-types.d.ts +0 -2
- package/dist/agent-farm/servers/tower-types.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-websocket.d.ts.map +1 -1
- package/dist/agent-farm/servers/tower-websocket.js +27 -5
- package/dist/agent-farm/servers/tower-websocket.js.map +1 -1
- package/dist/agent-farm/types.d.ts +4 -5
- package/dist/agent-farm/types.d.ts.map +1 -1
- package/dist/agent-farm/utils/agent-names.d.ts +85 -0
- package/dist/agent-farm/utils/agent-names.d.ts.map +1 -0
- package/dist/agent-farm/utils/agent-names.js +140 -0
- package/dist/agent-farm/utils/agent-names.js.map +1 -0
- package/dist/agent-farm/utils/display.d.ts +8 -0
- package/dist/agent-farm/utils/display.d.ts.map +1 -0
- package/dist/agent-farm/utils/display.js +26 -0
- package/dist/agent-farm/utils/display.js.map +1 -0
- package/dist/agent-farm/utils/message-format.d.ts +17 -0
- package/dist/agent-farm/utils/message-format.d.ts.map +1 -0
- package/dist/agent-farm/utils/message-format.js +41 -0
- package/dist/agent-farm/utils/message-format.js.map +1 -0
- package/dist/agent-farm/utils/notifications.d.ts.map +1 -1
- package/dist/agent-farm/utils/notifications.js +7 -16
- package/dist/agent-farm/utils/notifications.js.map +1 -1
- package/dist/agent-farm/utils/server-utils.d.ts +4 -0
- package/dist/agent-farm/utils/server-utils.d.ts.map +1 -1
- package/dist/agent-farm/utils/server-utils.js +20 -0
- package/dist/agent-farm/utils/server-utils.js.map +1 -1
- package/dist/agent-farm/utils/shell.d.ts +5 -0
- package/dist/agent-farm/utils/shell.d.ts.map +1 -1
- package/dist/agent-farm/utils/shell.js +15 -11
- package/dist/agent-farm/utils/shell.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +46 -15
- package/dist/cli.js.map +1 -1
- package/dist/commands/adopt.d.ts.map +1 -1
- package/dist/commands/adopt.js +1 -13
- package/dist/commands/adopt.js.map +1 -1
- package/dist/commands/consult/index.d.ts +34 -9
- package/dist/commands/consult/index.d.ts.map +1 -1
- package/dist/commands/consult/index.js +617 -263
- package/dist/commands/consult/index.js.map +1 -1
- package/dist/commands/consult/metrics.d.ts +90 -0
- package/dist/commands/consult/metrics.d.ts.map +1 -0
- package/dist/commands/consult/metrics.js +203 -0
- package/dist/commands/consult/metrics.js.map +1 -0
- package/dist/commands/consult/stats.d.ts +18 -0
- package/dist/commands/consult/stats.d.ts.map +1 -0
- package/dist/commands/consult/stats.js +150 -0
- package/dist/commands/consult/stats.js.map +1 -0
- package/dist/commands/consult/usage-extractor.d.ts +41 -0
- package/dist/commands/consult/usage-extractor.d.ts.map +1 -0
- package/dist/commands/consult/usage-extractor.js +122 -0
- package/dist/commands/consult/usage-extractor.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +5 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -13
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/porch/index.d.ts.map +1 -1
- package/dist/commands/porch/index.js +13 -12
- package/dist/commands/porch/index.js.map +1 -1
- package/dist/commands/porch/next.d.ts.map +1 -1
- package/dist/commands/porch/next.js +57 -77
- package/dist/commands/porch/next.js.map +1 -1
- package/dist/commands/porch/plan.d.ts.map +1 -1
- package/dist/commands/porch/plan.js +17 -2
- package/dist/commands/porch/plan.js.map +1 -1
- package/dist/commands/porch/prompts.d.ts +10 -1
- package/dist/commands/porch/prompts.d.ts.map +1 -1
- package/dist/commands/porch/prompts.js +56 -29
- package/dist/commands/porch/prompts.js.map +1 -1
- package/dist/commands/porch/protocol.js +2 -2
- package/dist/commands/porch/state.d.ts +13 -0
- package/dist/commands/porch/state.d.ts.map +1 -1
- package/dist/commands/porch/state.js +49 -2
- package/dist/commands/porch/state.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +0 -10
- package/dist/commands/update.js.map +1 -1
- package/dist/lib/github.d.ts +82 -0
- package/dist/lib/github.d.ts.map +1 -0
- package/dist/lib/github.js +181 -0
- package/dist/lib/github.js.map +1 -0
- package/dist/lib/scaffold.d.ts +0 -21
- package/dist/lib/scaffold.d.ts.map +1 -1
- package/dist/lib/scaffold.js +0 -57
- package/dist/lib/scaffold.js.map +1 -1
- package/dist/terminal/index.d.ts +16 -0
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +14 -0
- package/dist/terminal/index.js.map +1 -1
- package/dist/terminal/pty-manager.d.ts.map +1 -1
- package/dist/terminal/pty-manager.js +8 -5
- package/dist/terminal/pty-manager.js.map +1 -1
- package/dist/terminal/pty-session.js +4 -4
- package/dist/terminal/pty-session.js.map +1 -1
- package/dist/terminal/session-manager.d.ts +64 -0
- package/dist/terminal/session-manager.d.ts.map +1 -1
- package/dist/terminal/session-manager.js +299 -10
- package/dist/terminal/session-manager.js.map +1 -1
- package/dist/terminal/shellper-client.d.ts +2 -1
- package/dist/terminal/shellper-client.d.ts.map +1 -1
- package/dist/terminal/shellper-client.js +4 -2
- package/dist/terminal/shellper-client.js.map +1 -1
- package/dist/terminal/shellper-main.js +33 -4
- package/dist/terminal/shellper-main.js.map +1 -1
- package/dist/terminal/shellper-process.d.ts +24 -7
- package/dist/terminal/shellper-process.d.ts.map +1 -1
- package/dist/terminal/shellper-process.js +139 -36
- package/dist/terminal/shellper-process.js.map +1 -1
- package/dist/terminal/shellper-protocol.d.ts +1 -0
- package/dist/terminal/shellper-protocol.d.ts.map +1 -1
- package/dist/terminal/shellper-protocol.js.map +1 -1
- package/package.json +4 -1
- package/skeleton/.claude/skills/af/SKILL.md +10 -10
- package/skeleton/.claude/skills/consult/SKILL.md +55 -38
- package/skeleton/.claude/skills/porch/SKILL.md +53 -0
- package/skeleton/DEPENDENCIES.md +2 -2
- package/skeleton/builders.md +8 -19
- package/skeleton/maintain/.gitkeep +1 -1
- package/skeleton/porch/prompts/specify.md +1 -1
- package/skeleton/protocol-schema.json +1 -1
- package/skeleton/protocols/bugfix/prompts/pr.md +18 -7
- package/skeleton/protocols/bugfix/protocol.json +1 -1
- package/skeleton/protocols/experiment/protocol.md +17 -17
- package/skeleton/protocols/maintain/consult-types/impl-review.md +72 -0
- package/skeleton/protocols/maintain/consult-types/pr-review.md +72 -0
- package/skeleton/protocols/maintain/prompts/audit.md +2 -2
- package/skeleton/protocols/maintain/prompts/sync.md +1 -1
- package/skeleton/protocols/maintain/prompts/verify.md +1 -1
- package/skeleton/protocols/maintain/protocol.json +4 -4
- package/skeleton/protocols/maintain/protocol.md +11 -12
- package/skeleton/protocols/maintain/templates/maintenance-run.md +2 -2
- package/skeleton/protocols/protocol-schema.json +1 -1
- package/skeleton/protocols/spir/consult-types/impl-review.md +72 -0
- package/skeleton/protocols/spir/consult-types/phase-review.md +72 -0
- package/skeleton/protocols/spir/consult-types/pr-review.md +72 -0
- package/skeleton/protocols/spir/prompts/plan.md +4 -4
- package/skeleton/protocols/spir/prompts/review.md +8 -8
- package/skeleton/protocols/spir/prompts/specify.md +6 -6
- package/skeleton/protocols/spir/protocol.json +16 -16
- package/skeleton/protocols/spir/protocol.md +8 -8
- package/skeleton/protocols/spir/templates/review.md +2 -2
- package/skeleton/protocols/tick/consult-types/impl-review.md +72 -0
- package/skeleton/protocols/tick/consult-types/plan-review.md +59 -0
- package/skeleton/protocols/tick/consult-types/pr-review.md +72 -0
- package/skeleton/protocols/tick/consult-types/spec-review.md +55 -0
- package/skeleton/protocols/tick/protocol.json +2 -7
- package/skeleton/protocols/tick/protocol.md +31 -31
- package/skeleton/resources/commands/agent-farm.md +21 -19
- package/skeleton/resources/commands/codev.md +0 -36
- package/skeleton/resources/commands/consult.md +88 -234
- package/skeleton/resources/commands/overview.md +6 -7
- package/skeleton/resources/spikes.md +3 -3
- package/skeleton/resources/workflow-reference.md +28 -28
- package/skeleton/roles/architect.md +34 -38
- package/skeleton/roles/builder.md +14 -14
- package/skeleton/roles/consultant.md +6 -0
- package/skeleton/templates/AGENTS.md +6 -6
- package/skeleton/templates/CLAUDE.md +6 -6
- package/skeleton/templates/cheatsheet.md +22 -18
- package/skeleton/templates/lifecycle.md +9 -9
- package/skeleton/templates/pr-overview.md +5 -5
- package/templates/open.html +6 -3
- package/templates/tower.html +1 -41
- package/dashboard/dist/assets/index-4n9zpWLY.css +0 -32
- package/dashboard/dist/assets/index-UsH9ixz1.js +0 -136
- package/dashboard/dist/assets/index-UsH9ixz1.js.map +0 -1
- package/dist/agent-farm/commands/consult.d.ts +0 -15
- package/dist/agent-farm/commands/consult.d.ts.map +0 -1
- package/dist/agent-farm/commands/consult.js +0 -39
- package/dist/agent-farm/commands/consult.js.map +0 -1
- package/dist/agent-farm/utils/gate-status.d.ts +0 -16
- package/dist/agent-farm/utils/gate-status.d.ts.map +0 -1
- package/dist/agent-farm/utils/gate-status.js +0 -79
- package/dist/agent-farm/utils/gate-status.js.map +0 -1
- package/skeleton/templates/projectlist-archive.md +0 -21
- package/skeleton/templates/projectlist.md +0 -147
- /package/skeleton/{consult-types → protocols/bugfix/consult-types}/impl-review.md +0 -0
- /package/skeleton/{consult-types/pr-ready.md → protocols/bugfix/consult-types/pr-review.md} +0 -0
- /package/skeleton/{consult-types → protocols/spir/consult-types}/plan-review.md +0 -0
- /package/skeleton/{consult-types → protocols/spir/consult-types}/spec-review.md +0 -0
|
@@ -0,0 +1,625 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Overview endpoint for Tower dashboard Work view.
|
|
3
|
+
* Spec 0126: Project Management Rework — Phase 4
|
|
4
|
+
*
|
|
5
|
+
* Aggregates builder state, cached PR list, and cached issue backlog
|
|
6
|
+
* into a single JSON response for the dashboard. Supports degraded
|
|
7
|
+
* mode when the `gh` CLI is unavailable.
|
|
8
|
+
*/
|
|
9
|
+
import fs from 'node:fs';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
import { fetchPRList, fetchIssueList, fetchRecentlyClosed, parseLinkedIssue, parseLabelDefaults, } from '../../lib/github.js';
|
|
12
|
+
import { loadProtocol } from '../../commands/porch/protocol.js';
|
|
13
|
+
/**
|
|
14
|
+
* Parse a porch status.yaml file into structured data.
|
|
15
|
+
* Uses line-based parsing (same pattern as gate-status.ts).
|
|
16
|
+
*/
|
|
17
|
+
export function parseStatusYaml(content) {
|
|
18
|
+
const result = {
|
|
19
|
+
id: '',
|
|
20
|
+
title: '',
|
|
21
|
+
protocol: '',
|
|
22
|
+
phase: '',
|
|
23
|
+
currentPlanPhase: '',
|
|
24
|
+
gates: {},
|
|
25
|
+
gateRequestedAt: {},
|
|
26
|
+
planPhases: [],
|
|
27
|
+
startedAt: '',
|
|
28
|
+
};
|
|
29
|
+
const lines = content.split('\n');
|
|
30
|
+
let section = 'none';
|
|
31
|
+
let currentGate = '';
|
|
32
|
+
let currentPlanPhase = null;
|
|
33
|
+
for (const line of lines) {
|
|
34
|
+
// Top-level scalar fields
|
|
35
|
+
const idMatch = line.match(/^id:\s*'?(\S+?)'?\s*$/);
|
|
36
|
+
if (idMatch) {
|
|
37
|
+
result.id = idMatch[1];
|
|
38
|
+
section = 'none';
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const titleMatch = line.match(/^title:\s*(\S.*?)\s*$/);
|
|
42
|
+
if (titleMatch) {
|
|
43
|
+
result.title = titleMatch[1];
|
|
44
|
+
section = 'none';
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
const protocolMatch = line.match(/^protocol:\s*(\S+)/);
|
|
48
|
+
if (protocolMatch) {
|
|
49
|
+
result.protocol = protocolMatch[1];
|
|
50
|
+
section = 'none';
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const phaseMatch = line.match(/^phase:\s*(\S+)/);
|
|
54
|
+
if (phaseMatch) {
|
|
55
|
+
result.phase = phaseMatch[1];
|
|
56
|
+
section = 'none';
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const planPhaseMatch = line.match(/^current_plan_phase:\s*(\S+)/);
|
|
60
|
+
if (planPhaseMatch) {
|
|
61
|
+
result.currentPlanPhase = planPhaseMatch[1];
|
|
62
|
+
section = 'none';
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const startedMatch = line.match(/^started_at:\s*'?(.+?)'?\s*$/);
|
|
66
|
+
if (startedMatch) {
|
|
67
|
+
result.startedAt = startedMatch[1];
|
|
68
|
+
section = 'none';
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
// Section headers
|
|
72
|
+
if (/^gates:\s*$/.test(line)) {
|
|
73
|
+
if (currentPlanPhase) {
|
|
74
|
+
pushPlanPhase(result, currentPlanPhase);
|
|
75
|
+
currentPlanPhase = null;
|
|
76
|
+
}
|
|
77
|
+
section = 'gates';
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (/^plan_phases:\s*$/.test(line)) {
|
|
81
|
+
section = 'plan_phases';
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
// Stop section at next top-level key
|
|
85
|
+
if (/^\S/.test(line) && line.trim() !== '') {
|
|
86
|
+
if (currentPlanPhase) {
|
|
87
|
+
pushPlanPhase(result, currentPlanPhase);
|
|
88
|
+
currentPlanPhase = null;
|
|
89
|
+
}
|
|
90
|
+
section = 'none';
|
|
91
|
+
}
|
|
92
|
+
// Gates section
|
|
93
|
+
if (section === 'gates') {
|
|
94
|
+
const gateNameMatch = line.match(/^\s{2}(\S+):\s*$/);
|
|
95
|
+
if (gateNameMatch) {
|
|
96
|
+
currentGate = gateNameMatch[1];
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
const statusMatch = line.match(/^\s{4}status:\s*(\S+)/);
|
|
100
|
+
if (statusMatch && currentGate) {
|
|
101
|
+
result.gates[currentGate] = statusMatch[1];
|
|
102
|
+
}
|
|
103
|
+
const requestedMatch = line.match(/^\s{4}requested_at:\s*'?(.+?)'?\s*$/);
|
|
104
|
+
if (requestedMatch && currentGate) {
|
|
105
|
+
const val = requestedMatch[1];
|
|
106
|
+
if (val !== 'null' && val !== '~') {
|
|
107
|
+
result.gateRequestedAt[currentGate] = val;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Plan phases section
|
|
112
|
+
if (section === 'plan_phases') {
|
|
113
|
+
const itemIdMatch = line.match(/^\s{2}-\s+id:\s*(\S+)/);
|
|
114
|
+
if (itemIdMatch) {
|
|
115
|
+
if (currentPlanPhase) {
|
|
116
|
+
pushPlanPhase(result, currentPlanPhase);
|
|
117
|
+
}
|
|
118
|
+
currentPlanPhase = { id: itemIdMatch[1] };
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const itemTitleMatch = line.match(/^\s{4}title:\s*(.+?)\s*$/);
|
|
122
|
+
if (itemTitleMatch && currentPlanPhase) {
|
|
123
|
+
currentPlanPhase.title = itemTitleMatch[1];
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
const itemStatusMatch = line.match(/^\s{4}status:\s*(\S+)/);
|
|
127
|
+
if (itemStatusMatch && currentPlanPhase) {
|
|
128
|
+
currentPlanPhase.status = itemStatusMatch[1];
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Flush last plan phase if we were in that section
|
|
134
|
+
if (currentPlanPhase) {
|
|
135
|
+
pushPlanPhase(result, currentPlanPhase);
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
}
|
|
139
|
+
function pushPlanPhase(result, partial) {
|
|
140
|
+
if (partial.id) {
|
|
141
|
+
result.planPhases.push({
|
|
142
|
+
id: partial.id,
|
|
143
|
+
title: partial.title || '',
|
|
144
|
+
status: partial.status || 'pending',
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// =============================================================================
|
|
149
|
+
// Progress and blocked detection
|
|
150
|
+
// =============================================================================
|
|
151
|
+
/**
|
|
152
|
+
* Calculate progress percentage (0-100) based on protocol phase.
|
|
153
|
+
*
|
|
154
|
+
* SPIR/spider: nuanced sub-progress with gate awareness and plan phase tracking.
|
|
155
|
+
* Other protocols: even split derived from protocol.json phases array.
|
|
156
|
+
*/
|
|
157
|
+
export function calculateProgress(parsed, workspaceRoot) {
|
|
158
|
+
const protocol = parsed.protocol;
|
|
159
|
+
if (protocol === 'spir' || protocol === 'spider') {
|
|
160
|
+
return calculateSpirProgress(parsed);
|
|
161
|
+
}
|
|
162
|
+
if (!protocol || !workspaceRoot)
|
|
163
|
+
return 0;
|
|
164
|
+
// Load phase list dynamically from protocol.json
|
|
165
|
+
const phases = loadProtocolPhases(workspaceRoot, protocol);
|
|
166
|
+
if (!phases)
|
|
167
|
+
return 0;
|
|
168
|
+
return calculateEvenProgress(parsed.phase, phases);
|
|
169
|
+
}
|
|
170
|
+
function calculateSpirProgress(parsed) {
|
|
171
|
+
const gateRequested = (gate) => parsed.gates[gate] === 'pending' && !!parsed.gateRequestedAt[gate];
|
|
172
|
+
switch (parsed.phase) {
|
|
173
|
+
case 'specify':
|
|
174
|
+
return gateRequested('spec-approval') ? 20 : 10;
|
|
175
|
+
case 'plan':
|
|
176
|
+
return gateRequested('plan-approval') ? 45 : 35;
|
|
177
|
+
case 'implement': {
|
|
178
|
+
const total = parsed.planPhases.length;
|
|
179
|
+
if (total === 0)
|
|
180
|
+
return 70;
|
|
181
|
+
const completed = parsed.planPhases.filter(p => p.status === 'complete').length;
|
|
182
|
+
return 50 + Math.round((completed / total) * 40);
|
|
183
|
+
}
|
|
184
|
+
case 'review':
|
|
185
|
+
return gateRequested('pr') ? 95 : 92;
|
|
186
|
+
case 'complete':
|
|
187
|
+
return 100;
|
|
188
|
+
default:
|
|
189
|
+
return 0;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Even-split progress for protocols with fixed phase lists.
|
|
194
|
+
* Each phase gets an equal share of 100%, with 'complete' always = 100.
|
|
195
|
+
*/
|
|
196
|
+
export function calculateEvenProgress(phase, phases) {
|
|
197
|
+
if (phase === 'complete')
|
|
198
|
+
return 100;
|
|
199
|
+
const idx = phases.indexOf(phase);
|
|
200
|
+
if (idx === -1)
|
|
201
|
+
return 0;
|
|
202
|
+
return Math.round(((idx + 1) / (phases.length + 1)) * 100);
|
|
203
|
+
}
|
|
204
|
+
/** Cache of protocol phase IDs keyed by protocol name */
|
|
205
|
+
const protocolPhaseCache = new Map();
|
|
206
|
+
/**
|
|
207
|
+
* Load phase IDs from a protocol's protocol.json file.
|
|
208
|
+
* Cached per protocol name for the lifetime of the process.
|
|
209
|
+
*/
|
|
210
|
+
function loadProtocolPhases(workspaceRoot, protocolName) {
|
|
211
|
+
const cached = protocolPhaseCache.get(protocolName);
|
|
212
|
+
if (cached)
|
|
213
|
+
return cached;
|
|
214
|
+
try {
|
|
215
|
+
const protocol = loadProtocol(workspaceRoot, protocolName);
|
|
216
|
+
const phases = protocol.phases.map(p => p.id);
|
|
217
|
+
protocolPhaseCache.set(protocolName, phases);
|
|
218
|
+
return phases;
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Detect if a builder is blocked on a gate (requested but not approved).
|
|
226
|
+
* Returns a human-readable label or null.
|
|
227
|
+
*/
|
|
228
|
+
export function detectBlocked(parsed) {
|
|
229
|
+
const gateLabels = {
|
|
230
|
+
'spec-approval': 'spec review',
|
|
231
|
+
'plan-approval': 'plan review',
|
|
232
|
+
'pr': 'PR review',
|
|
233
|
+
};
|
|
234
|
+
for (const [gate, label] of Object.entries(gateLabels)) {
|
|
235
|
+
if (parsed.gates[gate] === 'pending' && parsed.gateRequestedAt[gate]) {
|
|
236
|
+
return label;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
// =============================================================================
|
|
242
|
+
// Builder discovery
|
|
243
|
+
// =============================================================================
|
|
244
|
+
/**
|
|
245
|
+
* Map a worktree directory name to its expected terminal role_id.
|
|
246
|
+
* Must match what buildAgentName() produces during spawn so we can
|
|
247
|
+
* cross-reference worktrees against active terminal sessions.
|
|
248
|
+
*
|
|
249
|
+
* All values are lowercased to match buildAgentName() convention.
|
|
250
|
+
*
|
|
251
|
+
* Examples:
|
|
252
|
+
* spir-126-slug → "builder-spir-126"
|
|
253
|
+
* tick-130-slug → "builder-tick-130"
|
|
254
|
+
* bugfix-296-slug → "builder-bugfix-296"
|
|
255
|
+
* task-NAvW → "builder-task-navw"
|
|
256
|
+
* worktree-foIg → "worktree-foig"
|
|
257
|
+
* 0110-legacy → "builder-spir-110"
|
|
258
|
+
* experiment-AbCd → "builder-experiment-abcd"
|
|
259
|
+
*/
|
|
260
|
+
export function worktreeNameToRoleId(dirName) {
|
|
261
|
+
const lower = dirName.toLowerCase();
|
|
262
|
+
// SPIR: spir-126-slug → builder-spir-126
|
|
263
|
+
const spirMatch = lower.match(/^spir-(\d+)/);
|
|
264
|
+
if (spirMatch)
|
|
265
|
+
return `builder-spir-${Number(spirMatch[1])}`;
|
|
266
|
+
// TICK: tick-130-slug → builder-tick-130
|
|
267
|
+
const tickMatch = lower.match(/^tick-(\d+)/);
|
|
268
|
+
if (tickMatch)
|
|
269
|
+
return `builder-tick-${Number(tickMatch[1])}`;
|
|
270
|
+
// Bugfix: bugfix-296-slug → builder-bugfix-296
|
|
271
|
+
const bugfixMatch = lower.match(/^bugfix-(\d+)/);
|
|
272
|
+
if (bugfixMatch)
|
|
273
|
+
return `builder-bugfix-${Number(bugfixMatch[1])}`;
|
|
274
|
+
// Task: task-NAvW → builder-task-navw
|
|
275
|
+
const taskMatch = lower.match(/^task-([a-z0-9]+)/);
|
|
276
|
+
if (taskMatch)
|
|
277
|
+
return `builder-task-${taskMatch[1]}`;
|
|
278
|
+
// Worktree: worktree-foIg → worktree-foig (no builder- prefix)
|
|
279
|
+
const worktreeMatch = lower.match(/^worktree-([a-z0-9]+)/);
|
|
280
|
+
if (worktreeMatch)
|
|
281
|
+
return `worktree-${worktreeMatch[1]}`;
|
|
282
|
+
// Legacy numeric: 0110-slug → builder-spir-110 (assume spir)
|
|
283
|
+
const numericMatch = lower.match(/^(\d+)(?:-|$)/);
|
|
284
|
+
if (numericMatch)
|
|
285
|
+
return `builder-spir-${Number(numericMatch[1])}`;
|
|
286
|
+
// Generic protocol: experiment-AbCd → builder-experiment-abcd
|
|
287
|
+
const genericMatch = lower.match(/^([a-z]+)-([a-z0-9]+)/);
|
|
288
|
+
if (genericMatch)
|
|
289
|
+
return `builder-${genericMatch[1]}-${genericMatch[2]}`;
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Extract project ID from a worktree directory name.
|
|
294
|
+
* Used to match worktrees to their correct codev/projects/{ID}-* directory.
|
|
295
|
+
*
|
|
296
|
+
* Returns the project dir prefix (to match `{ID}-*`) or null for soft-mode builders.
|
|
297
|
+
*/
|
|
298
|
+
export function extractProjectIdFromWorktreeName(dirName) {
|
|
299
|
+
// SPIR: spir-386-slug → try both "386" and "0386" (porch may or may not zero-pad)
|
|
300
|
+
const spirMatch = dirName.match(/^spir-(\d+)/);
|
|
301
|
+
if (spirMatch)
|
|
302
|
+
return spirMatch[1];
|
|
303
|
+
// TICK: tick-130-slug → try both "130" and "0130"
|
|
304
|
+
const tickMatch = dirName.match(/^tick-(\d+)/);
|
|
305
|
+
if (tickMatch)
|
|
306
|
+
return tickMatch[1];
|
|
307
|
+
// Bugfix: bugfix-382-slug → "bugfix-382" (porch uses this, not "builder-bugfix-382")
|
|
308
|
+
const bugfixMatch = dirName.match(/^bugfix-(\d+)/);
|
|
309
|
+
if (bugfixMatch)
|
|
310
|
+
return `bugfix-${bugfixMatch[1]}`;
|
|
311
|
+
// Legacy numeric: 0110 or 0110-slug → "0110"
|
|
312
|
+
const numericMatch = dirName.match(/^(\d+)(?:-|$)/);
|
|
313
|
+
if (numericMatch)
|
|
314
|
+
return numericMatch[1];
|
|
315
|
+
// task-NAvW, worktree-foIg → null (soft mode)
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Discover builders by scanning .builders/ directory and reading status.yaml.
|
|
320
|
+
*/
|
|
321
|
+
export function discoverBuilders(workspaceRoot) {
|
|
322
|
+
const buildersDir = path.join(workspaceRoot, '.builders');
|
|
323
|
+
if (!fs.existsSync(buildersDir))
|
|
324
|
+
return [];
|
|
325
|
+
const builders = [];
|
|
326
|
+
let entries;
|
|
327
|
+
try {
|
|
328
|
+
entries = fs.readdirSync(buildersDir, { withFileTypes: true });
|
|
329
|
+
}
|
|
330
|
+
catch {
|
|
331
|
+
return [];
|
|
332
|
+
}
|
|
333
|
+
for (const entry of entries) {
|
|
334
|
+
if (!entry.isDirectory())
|
|
335
|
+
continue;
|
|
336
|
+
const worktreePath = path.join(buildersDir, entry.name);
|
|
337
|
+
const projectId = extractProjectIdFromWorktreeName(entry.name);
|
|
338
|
+
if (!projectId) {
|
|
339
|
+
// No ID extracted (task-*, worktree-*) → soft mode
|
|
340
|
+
builders.push({
|
|
341
|
+
id: entry.name,
|
|
342
|
+
issueNumber: null,
|
|
343
|
+
issueTitle: null,
|
|
344
|
+
phase: '',
|
|
345
|
+
mode: 'soft',
|
|
346
|
+
gates: {},
|
|
347
|
+
worktreePath,
|
|
348
|
+
protocol: '',
|
|
349
|
+
planPhases: [],
|
|
350
|
+
progress: 0,
|
|
351
|
+
blocked: null,
|
|
352
|
+
startedAt: null,
|
|
353
|
+
});
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
const projectsDir = path.join(worktreePath, 'codev', 'projects');
|
|
357
|
+
// Try to find matching status.yaml by project ID prefix.
|
|
358
|
+
// Porch may create dirs with or without zero-padding (e.g. "386-slug" or "0386-slug"),
|
|
359
|
+
// and bugfix dirs may be "bugfix-382-slug" or "builder-bugfix-382-slug".
|
|
360
|
+
const paddedId = /^\d+$/.test(projectId) ? projectId.padStart(4, '0') : null;
|
|
361
|
+
let found = false;
|
|
362
|
+
if (fs.existsSync(projectsDir)) {
|
|
363
|
+
try {
|
|
364
|
+
const projectEntries = fs.readdirSync(projectsDir, { withFileTypes: true });
|
|
365
|
+
for (const projEntry of projectEntries) {
|
|
366
|
+
if (!projEntry.isDirectory())
|
|
367
|
+
continue;
|
|
368
|
+
const name = projEntry.name;
|
|
369
|
+
const matches = name.startsWith(`${projectId}-`)
|
|
370
|
+
|| (paddedId && name.startsWith(`${paddedId}-`));
|
|
371
|
+
if (!matches)
|
|
372
|
+
continue;
|
|
373
|
+
const statusFile = path.join(projectsDir, projEntry.name, 'status.yaml');
|
|
374
|
+
if (!fs.existsSync(statusFile))
|
|
375
|
+
continue;
|
|
376
|
+
const content = fs.readFileSync(statusFile, 'utf-8');
|
|
377
|
+
const parsed = parseStatusYaml(content);
|
|
378
|
+
let issueNumber = parsed.id ? parseInt(parsed.id, 10) : null;
|
|
379
|
+
if (issueNumber !== null && Number.isNaN(issueNumber)) {
|
|
380
|
+
// Bugfix-style IDs like "builder-bugfix-315" — extract trailing number
|
|
381
|
+
const trailingNum = parsed.id.match(/(\d+)$/);
|
|
382
|
+
issueNumber = trailingNum ? parseInt(trailingNum[1], 10) : null;
|
|
383
|
+
}
|
|
384
|
+
builders.push({
|
|
385
|
+
id: parsed.id || entry.name,
|
|
386
|
+
issueNumber: Number.isNaN(issueNumber) ? null : issueNumber,
|
|
387
|
+
issueTitle: parsed.title || null,
|
|
388
|
+
phase: (parsed.currentPlanPhase && parsed.currentPlanPhase !== 'null')
|
|
389
|
+
? parsed.currentPlanPhase
|
|
390
|
+
: parsed.phase,
|
|
391
|
+
mode: 'strict',
|
|
392
|
+
gates: parsed.gates,
|
|
393
|
+
worktreePath,
|
|
394
|
+
protocol: parsed.protocol,
|
|
395
|
+
planPhases: parsed.planPhases,
|
|
396
|
+
progress: calculateProgress(parsed, workspaceRoot),
|
|
397
|
+
blocked: detectBlocked(parsed),
|
|
398
|
+
startedAt: parsed.startedAt || null,
|
|
399
|
+
});
|
|
400
|
+
found = true;
|
|
401
|
+
break;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
catch {
|
|
405
|
+
// Skip unreadable project dirs
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
if (!found) {
|
|
409
|
+
// No matching project dir → soft mode, but extract issue number from dir name
|
|
410
|
+
const numMatch = projectId.match(/(\d+)$/);
|
|
411
|
+
const issueNumber = numMatch ? parseInt(numMatch[1], 10) : null;
|
|
412
|
+
builders.push({
|
|
413
|
+
id: entry.name,
|
|
414
|
+
issueNumber: Number.isNaN(issueNumber) ? null : issueNumber,
|
|
415
|
+
issueTitle: null,
|
|
416
|
+
phase: '',
|
|
417
|
+
mode: 'soft',
|
|
418
|
+
gates: {},
|
|
419
|
+
worktreePath,
|
|
420
|
+
protocol: '',
|
|
421
|
+
planPhases: [],
|
|
422
|
+
progress: 0,
|
|
423
|
+
blocked: null,
|
|
424
|
+
startedAt: null,
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return builders;
|
|
429
|
+
}
|
|
430
|
+
// =============================================================================
|
|
431
|
+
// Backlog derivation
|
|
432
|
+
// =============================================================================
|
|
433
|
+
/**
|
|
434
|
+
* Scan a codev artifact directory and return a map of issue number → filename.
|
|
435
|
+
*/
|
|
436
|
+
function scanArtifactDir(dirPath) {
|
|
437
|
+
const result = new Map();
|
|
438
|
+
if (!fs.existsSync(dirPath))
|
|
439
|
+
return result;
|
|
440
|
+
try {
|
|
441
|
+
const files = fs.readdirSync(dirPath);
|
|
442
|
+
for (const file of files) {
|
|
443
|
+
if (!file.endsWith('.md'))
|
|
444
|
+
continue;
|
|
445
|
+
const numStr = file.split('-')[0];
|
|
446
|
+
const num = parseInt(numStr, 10);
|
|
447
|
+
if (!Number.isNaN(num))
|
|
448
|
+
result.set(num, file);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
catch {
|
|
452
|
+
// Silently continue
|
|
453
|
+
}
|
|
454
|
+
return result;
|
|
455
|
+
}
|
|
456
|
+
/**
|
|
457
|
+
* Derive backlog from open GitHub issues cross-referenced with specs and builders.
|
|
458
|
+
*/
|
|
459
|
+
export function deriveBacklog(issues, workspaceRoot, activeBuilderIssues, prLinkedIssues) {
|
|
460
|
+
const specFiles = scanArtifactDir(path.join(workspaceRoot, 'codev', 'specs'));
|
|
461
|
+
const planFiles = scanArtifactDir(path.join(workspaceRoot, 'codev', 'plans'));
|
|
462
|
+
const reviewFiles = scanArtifactDir(path.join(workspaceRoot, 'codev', 'reviews'));
|
|
463
|
+
return issues
|
|
464
|
+
.filter(issue => !prLinkedIssues.has(issue.number))
|
|
465
|
+
.map(issue => {
|
|
466
|
+
const { type, priority } = parseLabelDefaults(issue.labels, issue.title);
|
|
467
|
+
const specFile = specFiles.get(issue.number);
|
|
468
|
+
const planFile = planFiles.get(issue.number);
|
|
469
|
+
const reviewFile = reviewFiles.get(issue.number);
|
|
470
|
+
const item = {
|
|
471
|
+
number: issue.number,
|
|
472
|
+
title: issue.title,
|
|
473
|
+
url: issue.url,
|
|
474
|
+
type,
|
|
475
|
+
priority,
|
|
476
|
+
hasSpec: !!specFile,
|
|
477
|
+
hasPlan: !!planFile,
|
|
478
|
+
hasReview: !!reviewFile,
|
|
479
|
+
hasBuilder: activeBuilderIssues.has(issue.number),
|
|
480
|
+
createdAt: issue.createdAt,
|
|
481
|
+
};
|
|
482
|
+
if (specFile)
|
|
483
|
+
item.specPath = `codev/specs/${specFile}`;
|
|
484
|
+
if (planFile)
|
|
485
|
+
item.planPath = `codev/plans/${planFile}`;
|
|
486
|
+
if (reviewFile)
|
|
487
|
+
item.reviewPath = `codev/reviews/${reviewFile}`;
|
|
488
|
+
return item;
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
// =============================================================================
|
|
492
|
+
// OverviewCache
|
|
493
|
+
// =============================================================================
|
|
494
|
+
export class OverviewCache {
|
|
495
|
+
prCache = new Map();
|
|
496
|
+
issueCache = new Map();
|
|
497
|
+
closedCache = new Map();
|
|
498
|
+
TTL = 30_000;
|
|
499
|
+
/**
|
|
500
|
+
* Build the overview response. Aggregates builder state, PRs, and backlog.
|
|
501
|
+
*
|
|
502
|
+
* @param activeBuilderRoleIds - Set of lowercased role_ids for builders with
|
|
503
|
+
* live terminal sessions. When provided, only worktrees matching an active
|
|
504
|
+
* session are included. When omitted, all discovered worktrees are returned
|
|
505
|
+
* (backward-compatible / unit-test friendly).
|
|
506
|
+
*/
|
|
507
|
+
async getOverview(workspaceRoot, activeBuilderRoleIds) {
|
|
508
|
+
const errors = {};
|
|
509
|
+
// 1. Discover builders from .builders/ directory, then filter to live sessions
|
|
510
|
+
let builders = discoverBuilders(workspaceRoot);
|
|
511
|
+
if (activeBuilderRoleIds) {
|
|
512
|
+
builders = builders.filter(b => {
|
|
513
|
+
const roleId = worktreeNameToRoleId(path.basename(b.worktreePath));
|
|
514
|
+
return roleId !== null && activeBuilderRoleIds.has(roleId);
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
const activeBuilderIssues = new Set(builders
|
|
518
|
+
.map(b => b.issueNumber)
|
|
519
|
+
.filter((n) => n !== null));
|
|
520
|
+
// 2. Fetch PRs (cached, scoped to workspace)
|
|
521
|
+
let pendingPRs = [];
|
|
522
|
+
const prs = await this.fetchPRsCached(workspaceRoot);
|
|
523
|
+
if (prs === null) {
|
|
524
|
+
errors.prs = 'GitHub CLI unavailable — could not fetch PRs';
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
pendingPRs = prs.map(pr => ({
|
|
528
|
+
number: pr.number,
|
|
529
|
+
title: pr.title,
|
|
530
|
+
url: pr.url,
|
|
531
|
+
reviewStatus: pr.reviewDecision || 'REVIEW_REQUIRED',
|
|
532
|
+
linkedIssue: parseLinkedIssue(pr.body || '', pr.title),
|
|
533
|
+
createdAt: pr.createdAt,
|
|
534
|
+
}));
|
|
535
|
+
}
|
|
536
|
+
const prLinkedIssues = new Set(pendingPRs
|
|
537
|
+
.map(pr => pr.linkedIssue)
|
|
538
|
+
.filter((n) => n !== null));
|
|
539
|
+
// 3. Fetch issues and derive backlog (cached, scoped to workspace)
|
|
540
|
+
let backlog = [];
|
|
541
|
+
const issues = await this.fetchIssuesCached(workspaceRoot);
|
|
542
|
+
if (issues === null) {
|
|
543
|
+
errors.issues = 'GitHub CLI unavailable — could not fetch issues';
|
|
544
|
+
}
|
|
545
|
+
else {
|
|
546
|
+
backlog = deriveBacklog(issues, workspaceRoot, activeBuilderIssues, prLinkedIssues);
|
|
547
|
+
// Enrich builder titles from GitHub issue titles
|
|
548
|
+
// (status.yaml stores a slug, not the human-readable title)
|
|
549
|
+
const issueTitleMap = new Map(issues.map(i => [i.number, i.title]));
|
|
550
|
+
for (const b of builders) {
|
|
551
|
+
if (b.issueNumber !== null && issueTitleMap.has(b.issueNumber)) {
|
|
552
|
+
b.issueTitle = issueTitleMap.get(b.issueNumber);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
// 4. Fetch recently closed issues (cached, scoped to workspace)
|
|
557
|
+
let recentlyClosed = [];
|
|
558
|
+
const closed = await this.fetchRecentlyClosedCached(workspaceRoot);
|
|
559
|
+
if (closed !== null) {
|
|
560
|
+
recentlyClosed = closed.map(issue => {
|
|
561
|
+
const { type } = parseLabelDefaults(issue.labels);
|
|
562
|
+
return {
|
|
563
|
+
number: issue.number,
|
|
564
|
+
title: issue.title,
|
|
565
|
+
url: issue.url,
|
|
566
|
+
type,
|
|
567
|
+
closedAt: issue.closedAt,
|
|
568
|
+
};
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
const result = { builders, pendingPRs, backlog, recentlyClosed };
|
|
572
|
+
if (Object.keys(errors).length > 0) {
|
|
573
|
+
result.errors = errors;
|
|
574
|
+
}
|
|
575
|
+
return result;
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Invalidate all cached data.
|
|
579
|
+
*/
|
|
580
|
+
invalidate() {
|
|
581
|
+
this.prCache.clear();
|
|
582
|
+
this.issueCache.clear();
|
|
583
|
+
this.closedCache.clear();
|
|
584
|
+
}
|
|
585
|
+
// ===========================================================================
|
|
586
|
+
// Private cache helpers
|
|
587
|
+
// ===========================================================================
|
|
588
|
+
async fetchPRsCached(cwd) {
|
|
589
|
+
const now = Date.now();
|
|
590
|
+
const cached = this.prCache.get(cwd);
|
|
591
|
+
if (cached && (now - cached.fetchedAt) < this.TTL) {
|
|
592
|
+
return cached.data;
|
|
593
|
+
}
|
|
594
|
+
const data = await fetchPRList(cwd);
|
|
595
|
+
if (data !== null) {
|
|
596
|
+
this.prCache.set(cwd, { data, fetchedAt: now });
|
|
597
|
+
}
|
|
598
|
+
return data;
|
|
599
|
+
}
|
|
600
|
+
async fetchIssuesCached(cwd) {
|
|
601
|
+
const now = Date.now();
|
|
602
|
+
const cached = this.issueCache.get(cwd);
|
|
603
|
+
if (cached && (now - cached.fetchedAt) < this.TTL) {
|
|
604
|
+
return cached.data;
|
|
605
|
+
}
|
|
606
|
+
const data = await fetchIssueList(cwd);
|
|
607
|
+
if (data !== null) {
|
|
608
|
+
this.issueCache.set(cwd, { data, fetchedAt: now });
|
|
609
|
+
}
|
|
610
|
+
return data;
|
|
611
|
+
}
|
|
612
|
+
async fetchRecentlyClosedCached(cwd) {
|
|
613
|
+
const now = Date.now();
|
|
614
|
+
const cached = this.closedCache.get(cwd);
|
|
615
|
+
if (cached && (now - cached.fetchedAt) < this.TTL) {
|
|
616
|
+
return cached.data;
|
|
617
|
+
}
|
|
618
|
+
const data = await fetchRecentlyClosed(cwd);
|
|
619
|
+
if (data !== null) {
|
|
620
|
+
this.closedCache.set(cwd, { data, fetchedAt: now });
|
|
621
|
+
}
|
|
622
|
+
return data;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
//# sourceMappingURL=overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overview.js","sourceRoot":"","sources":["../../../src/agent-farm/servers/overview.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
* Contains: instance discovery (getInstances), launch/stop lifecycle,
|
|
6
6
|
* known workspace registration, and directory suggestion autocomplete.
|
|
7
7
|
*/
|
|
8
|
-
import type { GateStatus } from '../utils/gate-status.js';
|
|
9
8
|
import type { TerminalManager } from '../../terminal/pty-manager.js';
|
|
10
9
|
import type { SessionManager } from '../../terminal/session-manager.js';
|
|
11
10
|
import type { WorkspaceTerminals, TerminalEntry, InstanceStatus } from './tower-types.js';
|
|
@@ -23,10 +22,9 @@ export interface InstanceDeps {
|
|
|
23
22
|
deleteTerminalSession: (id: string) => void;
|
|
24
23
|
/** Delete all terminal session rows for a workspace */
|
|
25
24
|
deleteWorkspaceTerminalSessions: (workspacePath: string) => void;
|
|
26
|
-
/** Get terminal list
|
|
25
|
+
/** Get terminal list for a workspace */
|
|
27
26
|
getTerminalsForWorkspace: (workspacePath: string, proxyUrl: string) => Promise<{
|
|
28
27
|
terminals: TerminalEntry[];
|
|
29
|
-
gateStatus: GateStatus;
|
|
30
28
|
}>;
|
|
31
29
|
}
|
|
32
30
|
/** Initialize the instances module with dependencies. */
|