symphony-github 0.1.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/LICENSE +201 -0
- package/README.md +341 -0
- package/config.example.yaml +101 -0
- package/dist/agents/launcher.d.ts +24 -0
- package/dist/agents/launcher.d.ts.map +1 -0
- package/dist/agents/launcher.js +152 -0
- package/dist/agents/launcher.js.map +1 -0
- package/dist/agents/registry.d.ts +10 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +324 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/runner.d.ts +58 -0
- package/dist/agents/runner.d.ts.map +1 -0
- package/dist/agents/runner.js +1190 -0
- package/dist/agents/runner.js.map +1 -0
- package/dist/app.d.ts +11 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +829 -0
- package/dist/app.js.map +1 -0
- package/dist/components/ActivityView.d.ts +9 -0
- package/dist/components/ActivityView.d.ts.map +1 -0
- package/dist/components/ActivityView.js +73 -0
- package/dist/components/ActivityView.js.map +1 -0
- package/dist/components/Header.d.ts +12 -0
- package/dist/components/Header.d.ts.map +1 -0
- package/dist/components/Header.js +44 -0
- package/dist/components/Header.js.map +1 -0
- package/dist/components/IssueList.d.ts +10 -0
- package/dist/components/IssueList.d.ts.map +1 -0
- package/dist/components/IssueList.js +119 -0
- package/dist/components/IssueList.js.map +1 -0
- package/dist/components/Onboarding.d.ts +26 -0
- package/dist/components/Onboarding.d.ts.map +1 -0
- package/dist/components/Onboarding.js +948 -0
- package/dist/components/Onboarding.js.map +1 -0
- package/dist/components/PaneView.d.ts +9 -0
- package/dist/components/PaneView.d.ts.map +1 -0
- package/dist/components/PaneView.js +74 -0
- package/dist/components/PaneView.js.map +1 -0
- package/dist/components/StartupRecoveryView.d.ts +13 -0
- package/dist/components/StartupRecoveryView.d.ts.map +1 -0
- package/dist/components/StartupRecoveryView.js +85 -0
- package/dist/components/StartupRecoveryView.js.map +1 -0
- package/dist/components/StatusBar.d.ts +9 -0
- package/dist/components/StatusBar.d.ts.map +1 -0
- package/dist/components/StatusBar.js +70 -0
- package/dist/components/StatusBar.js.map +1 -0
- package/dist/components/TableView.d.ts +8 -0
- package/dist/components/TableView.d.ts.map +1 -0
- package/dist/components/TableView.js +87 -0
- package/dist/components/TableView.js.map +1 -0
- package/dist/config/index.d.ts +18 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +357 -0
- package/dist/config/index.js.map +1 -0
- package/dist/git/merge.d.ts +23 -0
- package/dist/git/merge.d.ts.map +1 -0
- package/dist/git/merge.js +131 -0
- package/dist/git/merge.js.map +1 -0
- package/dist/git/utils.d.ts +34 -0
- package/dist/git/utils.d.ts.map +1 -0
- package/dist/git/utils.js +214 -0
- package/dist/git/utils.js.map +1 -0
- package/dist/git/worktree.d.ts +23 -0
- package/dist/git/worktree.d.ts.map +1 -0
- package/dist/git/worktree.js +116 -0
- package/dist/git/worktree.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +225 -0
- package/dist/index.js.map +1 -0
- package/dist/paths.d.ts +21 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +59 -0
- package/dist/paths.js.map +1 -0
- package/dist/runModes.d.ts +7 -0
- package/dist/runModes.d.ts.map +1 -0
- package/dist/runModes.js +36 -0
- package/dist/runModes.js.map +1 -0
- package/dist/services/daemon.d.ts +85 -0
- package/dist/services/daemon.d.ts.map +1 -0
- package/dist/services/daemon.js +836 -0
- package/dist/services/daemon.js.map +1 -0
- package/dist/services/github.d.ts +101 -0
- package/dist/services/github.d.ts.map +1 -0
- package/dist/services/github.js +367 -0
- package/dist/services/github.js.map +1 -0
- package/dist/services/githubProgressReporter.d.ts +33 -0
- package/dist/services/githubProgressReporter.d.ts.map +1 -0
- package/dist/services/githubProgressReporter.js +272 -0
- package/dist/services/githubProgressReporter.js.map +1 -0
- package/dist/services/runtime.d.ts +43 -0
- package/dist/services/runtime.d.ts.map +1 -0
- package/dist/services/runtime.js +126 -0
- package/dist/services/runtime.js.map +1 -0
- package/dist/services/state.d.ts +43 -0
- package/dist/services/state.d.ts.map +1 -0
- package/dist/services/state.js +176 -0
- package/dist/services/state.js.map +1 -0
- package/dist/services/tmux.d.ts +50 -0
- package/dist/services/tmux.d.ts.map +1 -0
- package/dist/services/tmux.js +157 -0
- package/dist/services/tmux.js.map +1 -0
- package/dist/swarm/backlog.d.ts +25 -0
- package/dist/swarm/backlog.d.ts.map +1 -0
- package/dist/swarm/backlog.js +83 -0
- package/dist/swarm/backlog.js.map +1 -0
- package/dist/swarm/config.d.ts +14 -0
- package/dist/swarm/config.d.ts.map +1 -0
- package/dist/swarm/config.js +112 -0
- package/dist/swarm/config.js.map +1 -0
- package/dist/swarm/dependencies.d.ts +36 -0
- package/dist/swarm/dependencies.d.ts.map +1 -0
- package/dist/swarm/dependencies.js +141 -0
- package/dist/swarm/dependencies.js.map +1 -0
- package/dist/swarm/director.d.ts +67 -0
- package/dist/swarm/director.d.ts.map +1 -0
- package/dist/swarm/director.js +358 -0
- package/dist/swarm/director.js.map +1 -0
- package/dist/swarm/directorPrompt.d.ts +15 -0
- package/dist/swarm/directorPrompt.d.ts.map +1 -0
- package/dist/swarm/directorPrompt.js +60 -0
- package/dist/swarm/directorPrompt.js.map +1 -0
- package/dist/swarm/index.d.ts +7 -0
- package/dist/swarm/index.d.ts.map +1 -0
- package/dist/swarm/index.js +6 -0
- package/dist/swarm/index.js.map +1 -0
- package/dist/swarm/proposals.d.ts +29 -0
- package/dist/swarm/proposals.d.ts.map +1 -0
- package/dist/swarm/proposals.js +141 -0
- package/dist/swarm/proposals.js.map +1 -0
- package/dist/swarm/types.d.ts +65 -0
- package/dist/swarm/types.d.ts.map +1 -0
- package/dist/swarm/types.js +3 -0
- package/dist/swarm/types.js.map +1 -0
- package/dist/theme.d.ts +64 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +161 -0
- package/dist/theme.js.map +1 -0
- package/dist/triggers/index.d.ts +17 -0
- package/dist/triggers/index.d.ts.map +1 -0
- package/dist/triggers/index.js +124 -0
- package/dist/triggers/index.js.map +1 -0
- package/dist/types.d.ts +327 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/duplicateDetection.d.ts +14 -0
- package/dist/utils/duplicateDetection.d.ts.map +1 -0
- package/dist/utils/duplicateDetection.js +45 -0
- package/dist/utils/duplicateDetection.js.map +1 -0
- package/dist/utils/shell.d.ts +46 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +79 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/slug.d.ts +13 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +32 -0
- package/dist/utils/slug.js.map +1 -0
- package/dist/version.d.ts +28 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +105 -0
- package/dist/version.js.map +1 -0
- package/examples/run-claude.example.sh +11 -0
- package/examples/run-codex.example.sh +11 -0
- package/package.json +68 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
const MAX_PROCESSED_COMMENTS = 500;
|
|
4
|
+
/**
|
|
5
|
+
* Thread-safe persistent state store.
|
|
6
|
+
* Ported from symphony Python's state.py.
|
|
7
|
+
*/
|
|
8
|
+
export class StateStore {
|
|
9
|
+
state;
|
|
10
|
+
filePath;
|
|
11
|
+
dirty = false;
|
|
12
|
+
constructor(filePath) {
|
|
13
|
+
this.filePath = filePath;
|
|
14
|
+
this.state = this.load();
|
|
15
|
+
}
|
|
16
|
+
load() {
|
|
17
|
+
if (!existsSync(this.filePath)) {
|
|
18
|
+
return { repos: {} };
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
const raw = readFileSync(this.filePath, 'utf-8');
|
|
22
|
+
return JSON.parse(raw);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return { repos: {} };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
save() {
|
|
29
|
+
if (!this.dirty)
|
|
30
|
+
return;
|
|
31
|
+
const dir = dirname(this.filePath);
|
|
32
|
+
if (!existsSync(dir))
|
|
33
|
+
mkdirSync(dir, { recursive: true });
|
|
34
|
+
writeFileSync(this.filePath, JSON.stringify(this.state, null, 2));
|
|
35
|
+
this.dirty = false;
|
|
36
|
+
}
|
|
37
|
+
ensureRepo(repo) {
|
|
38
|
+
if (!this.state.repos[repo]) {
|
|
39
|
+
this.state.repos[repo] = {
|
|
40
|
+
handled_issues: {},
|
|
41
|
+
active_runs: {},
|
|
42
|
+
processed_comment_ids: [],
|
|
43
|
+
deferred_issue_numbers: [],
|
|
44
|
+
suppressed_issue_numbers: [],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (!Array.isArray(this.state.repos[repo].deferred_issue_numbers)) {
|
|
48
|
+
this.state.repos[repo].deferred_issue_numbers = [];
|
|
49
|
+
}
|
|
50
|
+
if (!Array.isArray(this.state.repos[repo].suppressed_issue_numbers)) {
|
|
51
|
+
this.state.repos[repo].suppressed_issue_numbers = [];
|
|
52
|
+
}
|
|
53
|
+
return this.state.repos[repo];
|
|
54
|
+
}
|
|
55
|
+
// ── Cursors ──
|
|
56
|
+
getIssueCursor(repo) {
|
|
57
|
+
return this.ensureRepo(repo).issue_cursor;
|
|
58
|
+
}
|
|
59
|
+
setIssueCursor(repo, cursor) {
|
|
60
|
+
this.ensureRepo(repo).issue_cursor = cursor;
|
|
61
|
+
this.dirty = true;
|
|
62
|
+
}
|
|
63
|
+
getCommentCursor(repo) {
|
|
64
|
+
return this.ensureRepo(repo).comment_cursor;
|
|
65
|
+
}
|
|
66
|
+
setCommentCursor(repo, cursor) {
|
|
67
|
+
this.ensureRepo(repo).comment_cursor = cursor;
|
|
68
|
+
this.dirty = true;
|
|
69
|
+
}
|
|
70
|
+
getStartupIssueCursor(repo) {
|
|
71
|
+
return this.ensureRepo(repo).startup_issue_cursor;
|
|
72
|
+
}
|
|
73
|
+
setStartupIssueCursor(repo, cursor) {
|
|
74
|
+
this.ensureRepo(repo).startup_issue_cursor = cursor;
|
|
75
|
+
this.dirty = true;
|
|
76
|
+
}
|
|
77
|
+
getStartupCommentCursor(repo) {
|
|
78
|
+
return this.ensureRepo(repo).startup_comment_cursor;
|
|
79
|
+
}
|
|
80
|
+
setStartupCommentCursor(repo, cursor) {
|
|
81
|
+
this.ensureRepo(repo).startup_comment_cursor = cursor;
|
|
82
|
+
this.dirty = true;
|
|
83
|
+
}
|
|
84
|
+
// ── Handled issues ──
|
|
85
|
+
isHandled(repo, issueNumber) {
|
|
86
|
+
return !!this.ensureRepo(repo).handled_issues[issueNumber];
|
|
87
|
+
}
|
|
88
|
+
markHandled(repo, issueNumber, runId) {
|
|
89
|
+
this.ensureRepo(repo).handled_issues[issueNumber] = {
|
|
90
|
+
issue_number: issueNumber,
|
|
91
|
+
handled_at: new Date().toISOString(),
|
|
92
|
+
run_id: runId,
|
|
93
|
+
};
|
|
94
|
+
this.dirty = true;
|
|
95
|
+
}
|
|
96
|
+
unmarkHandled(repo, issueNumber) {
|
|
97
|
+
delete this.ensureRepo(repo).handled_issues[issueNumber];
|
|
98
|
+
this.dirty = true;
|
|
99
|
+
}
|
|
100
|
+
// ── Active runs ──
|
|
101
|
+
getActiveRuns(repo) {
|
|
102
|
+
return this.ensureRepo(repo).active_runs;
|
|
103
|
+
}
|
|
104
|
+
getAllActiveRuns() {
|
|
105
|
+
return Object.entries(this.state.repos).flatMap(([repo, repoState]) => Object.values(repoState.active_runs).map(record => ({ repo, record })));
|
|
106
|
+
}
|
|
107
|
+
hasActiveRun(repo, issueNumber) {
|
|
108
|
+
const runs = this.ensureRepo(repo).active_runs;
|
|
109
|
+
return Object.values(runs).some(r => r.issue_number === issueNumber);
|
|
110
|
+
}
|
|
111
|
+
addActiveRun(repo, record) {
|
|
112
|
+
this.ensureRepo(repo).active_runs[record.run_id] = record;
|
|
113
|
+
this.dirty = true;
|
|
114
|
+
}
|
|
115
|
+
removeActiveRun(repo, runId) {
|
|
116
|
+
delete this.ensureRepo(repo).active_runs[runId];
|
|
117
|
+
this.dirty = true;
|
|
118
|
+
}
|
|
119
|
+
// ── Processed comments ──
|
|
120
|
+
isCommentProcessed(repo, commentId) {
|
|
121
|
+
return this.ensureRepo(repo).processed_comment_ids.includes(commentId);
|
|
122
|
+
}
|
|
123
|
+
getProcessedCommentIds(repo) {
|
|
124
|
+
return [...this.ensureRepo(repo).processed_comment_ids];
|
|
125
|
+
}
|
|
126
|
+
markCommentProcessed(repo, commentId) {
|
|
127
|
+
const rs = this.ensureRepo(repo);
|
|
128
|
+
rs.processed_comment_ids.push(commentId);
|
|
129
|
+
// Keep only the last N
|
|
130
|
+
if (rs.processed_comment_ids.length > MAX_PROCESSED_COMMENTS) {
|
|
131
|
+
rs.processed_comment_ids = rs.processed_comment_ids.slice(-MAX_PROCESSED_COMMENTS);
|
|
132
|
+
}
|
|
133
|
+
this.dirty = true;
|
|
134
|
+
}
|
|
135
|
+
// ── Deferred issues ──
|
|
136
|
+
getDeferredIssueNumbers(repo) {
|
|
137
|
+
return [...(this.ensureRepo(repo).deferred_issue_numbers || [])];
|
|
138
|
+
}
|
|
139
|
+
deferIssue(repo, issueNumber) {
|
|
140
|
+
const rs = this.ensureRepo(repo);
|
|
141
|
+
if (!rs.deferred_issue_numbers?.includes(issueNumber)) {
|
|
142
|
+
rs.deferred_issue_numbers = [...(rs.deferred_issue_numbers || []), issueNumber];
|
|
143
|
+
this.dirty = true;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
clearDeferredIssue(repo, issueNumber) {
|
|
147
|
+
const rs = this.ensureRepo(repo);
|
|
148
|
+
const deferred = rs.deferred_issue_numbers || [];
|
|
149
|
+
const next = deferred.filter(number => number !== issueNumber);
|
|
150
|
+
if (next.length !== deferred.length) {
|
|
151
|
+
rs.deferred_issue_numbers = next;
|
|
152
|
+
this.dirty = true;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// ── Suppressed issues ──
|
|
156
|
+
getSuppressedIssueNumbers(repo) {
|
|
157
|
+
return [...(this.ensureRepo(repo).suppressed_issue_numbers || [])];
|
|
158
|
+
}
|
|
159
|
+
suppressIssue(repo, issueNumber) {
|
|
160
|
+
const rs = this.ensureRepo(repo);
|
|
161
|
+
if (!rs.suppressed_issue_numbers?.includes(issueNumber)) {
|
|
162
|
+
rs.suppressed_issue_numbers = [...(rs.suppressed_issue_numbers || []), issueNumber];
|
|
163
|
+
this.dirty = true;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
clearSuppressedIssue(repo, issueNumber) {
|
|
167
|
+
const rs = this.ensureRepo(repo);
|
|
168
|
+
const suppressed = rs.suppressed_issue_numbers || [];
|
|
169
|
+
const next = suppressed.filter(number => number !== issueNumber);
|
|
170
|
+
if (next.length !== suppressed.length) {
|
|
171
|
+
rs.suppressed_issue_numbers = next;
|
|
172
|
+
this.dirty = true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/services/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simplified tmux service for Symphony.
|
|
3
|
+
* Manages a single tmux session with a control sidebar + swappable content pane.
|
|
4
|
+
*/
|
|
5
|
+
export declare class TmuxService {
|
|
6
|
+
private static instance;
|
|
7
|
+
static getInstance(): TmuxService;
|
|
8
|
+
sessionExists(name: string): Promise<boolean>;
|
|
9
|
+
createSession(name: string, cwd: string): Promise<string>;
|
|
10
|
+
attachSession(name: string): Promise<void>;
|
|
11
|
+
killSession(name: string): Promise<void>;
|
|
12
|
+
getCurrentPaneId(session: string): Promise<string>;
|
|
13
|
+
splitPane(targetPaneId: string, direction: 'h' | 'v', options?: {
|
|
14
|
+
size?: number | string;
|
|
15
|
+
cwd?: string;
|
|
16
|
+
}): Promise<string>;
|
|
17
|
+
killPane(paneId: string): Promise<void>;
|
|
18
|
+
paneExists(paneId: string): Promise<boolean>;
|
|
19
|
+
sendShellCommand(paneId: string, command: string): Promise<void>;
|
|
20
|
+
sendKeys(paneId: string, ...keys: string[]): Promise<void>;
|
|
21
|
+
pasteText(paneId: string, text: string): Promise<void>;
|
|
22
|
+
getPaneContent(paneId: string, lines?: number): Promise<string>;
|
|
23
|
+
resizePane(paneId: string, width?: number, height?: number): Promise<void>;
|
|
24
|
+
selectPane(paneId: string): Promise<void>;
|
|
25
|
+
setPaneTitle(paneId: string, title: string): Promise<void>;
|
|
26
|
+
createWindow(session: string, name: string, cwd?: string): Promise<string>;
|
|
27
|
+
selectWindow(session: string, windowIndex: number): Promise<void>;
|
|
28
|
+
swapPane(srcPaneId: string, dstPaneId: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Move a pane from a background window into the main window next to the sidebar.
|
|
31
|
+
*/
|
|
32
|
+
joinPane(srcPaneId: string, targetPaneId: string, direction?: 'h' | 'v'): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Break a pane out into its own background window.
|
|
35
|
+
*/
|
|
36
|
+
breakPane(paneId: string): Promise<string>;
|
|
37
|
+
getWindowDimensions(paneId: string): Promise<{
|
|
38
|
+
width: number;
|
|
39
|
+
height: number;
|
|
40
|
+
}>;
|
|
41
|
+
setGlobalOption(option: string, value: string): Promise<void>;
|
|
42
|
+
setWindowOption(option: string, value: string): Promise<void>;
|
|
43
|
+
selectWindowByPane(paneId: string): Promise<void>;
|
|
44
|
+
listPanes(session: string): Promise<Array<{
|
|
45
|
+
paneId: string;
|
|
46
|
+
windowIndex: number;
|
|
47
|
+
active: boolean;
|
|
48
|
+
}>>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=tmux.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmux.d.ts","sourceRoot":"","sources":["../../src/services/tmux.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { run, runSafe, runShell } from '../utils/shell.js';
|
|
2
|
+
/**
|
|
3
|
+
* Simplified tmux service for Symphony.
|
|
4
|
+
* Manages a single tmux session with a control sidebar + swappable content pane.
|
|
5
|
+
*/
|
|
6
|
+
export class TmuxService {
|
|
7
|
+
static instance = null;
|
|
8
|
+
static getInstance() {
|
|
9
|
+
if (!TmuxService.instance) {
|
|
10
|
+
TmuxService.instance = new TmuxService();
|
|
11
|
+
}
|
|
12
|
+
return TmuxService.instance;
|
|
13
|
+
}
|
|
14
|
+
// ── Session lifecycle ──
|
|
15
|
+
async sessionExists(name) {
|
|
16
|
+
const result = await runSafe('tmux', ['has-session', '-t', name]);
|
|
17
|
+
return result.exitCode === 0;
|
|
18
|
+
}
|
|
19
|
+
async createSession(name, cwd) {
|
|
20
|
+
await run('tmux', [
|
|
21
|
+
'new-session', '-d', '-s', name, '-x', '200', '-y', '50', '-c', cwd,
|
|
22
|
+
]);
|
|
23
|
+
const paneId = await this.getCurrentPaneId(name);
|
|
24
|
+
return paneId;
|
|
25
|
+
}
|
|
26
|
+
async attachSession(name) {
|
|
27
|
+
await runShell(`tmux attach-session -t ${name}`);
|
|
28
|
+
}
|
|
29
|
+
async killSession(name) {
|
|
30
|
+
await runSafe('tmux', ['kill-session', '-t', name]);
|
|
31
|
+
}
|
|
32
|
+
// ── Pane operations ──
|
|
33
|
+
async getCurrentPaneId(session) {
|
|
34
|
+
return run('tmux', [
|
|
35
|
+
'display-message', '-t', session, '-p', '#{pane_id}',
|
|
36
|
+
]);
|
|
37
|
+
}
|
|
38
|
+
async splitPane(targetPaneId, direction, options) {
|
|
39
|
+
const args = ['split-window', `-${direction}`, '-t', targetPaneId, '-P', '-F', '#{pane_id}'];
|
|
40
|
+
if (options?.size) {
|
|
41
|
+
args.push('-l', String(options.size));
|
|
42
|
+
}
|
|
43
|
+
if (options?.cwd) {
|
|
44
|
+
args.push('-c', options.cwd);
|
|
45
|
+
}
|
|
46
|
+
return run('tmux', args);
|
|
47
|
+
}
|
|
48
|
+
async killPane(paneId) {
|
|
49
|
+
await runSafe('tmux', ['kill-pane', '-t', paneId]);
|
|
50
|
+
}
|
|
51
|
+
async paneExists(paneId) {
|
|
52
|
+
const result = await runSafe('tmux', [
|
|
53
|
+
'display-message', '-t', paneId, '-p', '#{pane_id}',
|
|
54
|
+
]);
|
|
55
|
+
return result.exitCode === 0 && result.stdout.trim() === paneId;
|
|
56
|
+
}
|
|
57
|
+
async sendShellCommand(paneId, command) {
|
|
58
|
+
await run('tmux', ['send-keys', '-t', paneId, command, 'Enter']);
|
|
59
|
+
}
|
|
60
|
+
async sendKeys(paneId, ...keys) {
|
|
61
|
+
for (const key of keys) {
|
|
62
|
+
await run('tmux', ['send-keys', '-t', paneId, key]);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async pasteText(paneId, text) {
|
|
66
|
+
const bufferName = `symphony-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
67
|
+
await run('tmux', ['set-buffer', '-b', bufferName, text]);
|
|
68
|
+
try {
|
|
69
|
+
await run('tmux', ['paste-buffer', '-d', '-b', bufferName, '-t', paneId]);
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await runSafe('tmux', ['delete-buffer', '-b', bufferName]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async getPaneContent(paneId, lines = 100) {
|
|
76
|
+
const result = await runSafe('tmux', [
|
|
77
|
+
'capture-pane', '-t', paneId, '-p', '-S', `-${lines}`,
|
|
78
|
+
]);
|
|
79
|
+
return result.stdout;
|
|
80
|
+
}
|
|
81
|
+
async resizePane(paneId, width, height) {
|
|
82
|
+
const args = ['resize-pane', '-t', paneId];
|
|
83
|
+
if (width !== undefined)
|
|
84
|
+
args.push('-x', String(width));
|
|
85
|
+
if (height !== undefined)
|
|
86
|
+
args.push('-y', String(height));
|
|
87
|
+
await runSafe('tmux', args);
|
|
88
|
+
}
|
|
89
|
+
async selectPane(paneId) {
|
|
90
|
+
await run('tmux', ['select-pane', '-t', paneId]);
|
|
91
|
+
}
|
|
92
|
+
async setPaneTitle(paneId, title) {
|
|
93
|
+
await runSafe('tmux', [
|
|
94
|
+
'select-pane', '-t', paneId, '-T', title,
|
|
95
|
+
]);
|
|
96
|
+
}
|
|
97
|
+
// ── Window operations ──
|
|
98
|
+
async createWindow(session, name, cwd) {
|
|
99
|
+
const args = ['new-window', '-t', session, '-n', name, '-d', '-P', '-F', '#{pane_id}'];
|
|
100
|
+
if (cwd)
|
|
101
|
+
args.push('-c', cwd);
|
|
102
|
+
return run('tmux', args);
|
|
103
|
+
}
|
|
104
|
+
async selectWindow(session, windowIndex) {
|
|
105
|
+
await runSafe('tmux', ['select-window', '-t', `${session}:${windowIndex}`]);
|
|
106
|
+
}
|
|
107
|
+
// ── Swap pane (key for our single-content-pane UX) ──
|
|
108
|
+
async swapPane(srcPaneId, dstPaneId) {
|
|
109
|
+
await run('tmux', ['swap-pane', '-s', srcPaneId, '-t', dstPaneId]);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Move a pane from a background window into the main window next to the sidebar.
|
|
113
|
+
*/
|
|
114
|
+
async joinPane(srcPaneId, targetPaneId, direction = 'h') {
|
|
115
|
+
await run('tmux', [
|
|
116
|
+
'join-pane', `-${direction}`, '-s', srcPaneId, '-t', targetPaneId,
|
|
117
|
+
]);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Break a pane out into its own background window.
|
|
121
|
+
*/
|
|
122
|
+
async breakPane(paneId) {
|
|
123
|
+
return run('tmux', [
|
|
124
|
+
'break-pane', '-d', '-s', paneId, '-P', '-F', '#{pane_id}',
|
|
125
|
+
]);
|
|
126
|
+
}
|
|
127
|
+
// ── Layout ──
|
|
128
|
+
async getWindowDimensions(paneId) {
|
|
129
|
+
const out = await run('tmux', [
|
|
130
|
+
'display-message', '-t', paneId, '-p', '#{window_width} #{window_height}',
|
|
131
|
+
]);
|
|
132
|
+
const [w, h] = out.split(' ').map(Number);
|
|
133
|
+
return { width: w || 200, height: h || 50 };
|
|
134
|
+
}
|
|
135
|
+
async setGlobalOption(option, value) {
|
|
136
|
+
await runSafe('tmux', ['set-option', '-g', option, value]);
|
|
137
|
+
}
|
|
138
|
+
async setWindowOption(option, value) {
|
|
139
|
+
await runSafe('tmux', ['set-window-option', '-g', option, value]);
|
|
140
|
+
}
|
|
141
|
+
async selectWindowByPane(paneId) {
|
|
142
|
+
await runSafe('tmux', ['select-window', '-t', paneId]);
|
|
143
|
+
}
|
|
144
|
+
// ── List panes ──
|
|
145
|
+
async listPanes(session) {
|
|
146
|
+
const result = await runSafe('tmux', [
|
|
147
|
+
'list-panes', '-s', '-t', session, '-F', '#{pane_id} #{window_index} #{pane_active}',
|
|
148
|
+
]);
|
|
149
|
+
if (result.exitCode !== 0)
|
|
150
|
+
return [];
|
|
151
|
+
return result.stdout.split('\n').filter(Boolean).map(line => {
|
|
152
|
+
const [paneId, windowIndex, active] = line.split(' ');
|
|
153
|
+
return { paneId, windowIndex: parseInt(windowIndex, 10), active: active === '1' };
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=tmux.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tmux.js","sourceRoot":"","sources":["../../src/services/tmux.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE3D;;;GAGG;AACH,MAAM,OAAO,WAAW;IACd,MAAM,CAAC,QAAQ,GAAuB,IAAI,CAAC;IAEnD,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1B,WAAW,CAAC,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO,WAAW,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED,0BAA0B;IAE1B,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,GAAW;QAC3C,MAAM,GAAG,CAAC,MAAM,EAAE;YAChB,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG;SACpE,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACjD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,QAAQ,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,wBAAwB;IAExB,KAAK,CAAC,gBAAgB,CAAC,OAAe;QACpC,OAAO,GAAG,CAAC,MAAM,EAAE;YACjB,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY;SACrD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,YAAoB,EAAE,SAAoB,EAAE,OAG3D;QACC,MAAM,IAAI,GAAG,CAAC,cAAc,EAAE,IAAI,SAAS,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAC7F,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;YACnC,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY;SACpD,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,OAAe;QACpD,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,GAAG,IAAc;QAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,IAAY;QAC1C,MAAM,UAAU,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAC5E,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,KAAK,GAAG,GAAG;QAC9C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;YACnC,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE;SACtD,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,KAAc,EAAE,MAAe;QAC9D,MAAM,IAAI,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,KAAa;QAC9C,MAAM,OAAO,CAAC,MAAM,EAAE;YACpB,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK;SACzC,CAAC,CAAC;IACL,CAAC;IAED,0BAA0B;IAE1B,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,IAAY,EAAE,GAAY;QAC5D,MAAM,IAAI,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QACvF,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9B,OAAO,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,WAAmB;QACrD,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,IAAI,EAAE,GAAG,OAAO,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED,uDAAuD;IAEvD,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,SAAiB;QACjD,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,YAAoB,EAAE,YAAuB,GAAG;QAChF,MAAM,GAAG,CAAC,MAAM,EAAE;YAChB,WAAW,EAAE,IAAI,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY;SAClE,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,OAAO,GAAG,CAAC,MAAM,EAAE;YACjB,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,eAAe;IAEf,KAAK,CAAC,mBAAmB,CAAC,MAAc;QACtC,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE;YAC5B,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kCAAkC;SAC1E,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;IAC9C,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,KAAa;QACjD,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAc,EAAE,KAAa;QACjD,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,MAAc;QACrC,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC,eAAe,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,mBAAmB;IAEnB,KAAK,CAAC,SAAS,CAAC,OAAe;QAC7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;YACnC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,2CAA2C;SACrF,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC1D,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACtD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;QACpF,CAAC,CAAC,CAAC;IACL,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { SymphonyPane } from '../types.js';
|
|
2
|
+
import type { IssueDependency, IssueProposal, BacklogSettings } from './types.js';
|
|
3
|
+
interface BacklogState {
|
|
4
|
+
activeRuns: SymphonyPane[];
|
|
5
|
+
blockedIssues: IssueDependency[];
|
|
6
|
+
pendingProposals: IssueProposal[];
|
|
7
|
+
recentCompletions: SymphonyPane[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Manages the swarm backlog markdown file.
|
|
11
|
+
* Provides a human-readable summary of the swarm's state.
|
|
12
|
+
*/
|
|
13
|
+
export declare class BacklogManager {
|
|
14
|
+
private settings;
|
|
15
|
+
constructor(settings: BacklogSettings);
|
|
16
|
+
/** Update the backlog file with current state. */
|
|
17
|
+
update(state: BacklogState): void;
|
|
18
|
+
/** Read the current backlog content. */
|
|
19
|
+
read(): string;
|
|
20
|
+
/** Build the backlog body for a GitHub issue. */
|
|
21
|
+
buildGitHubIssueBody(state: BacklogState): string;
|
|
22
|
+
private render;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=backlog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backlog.d.ts","sourceRoot":"","sources":["../../src/swarm/backlog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElF,UAAU,YAAY;IACpB,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAClC,iBAAiB,EAAE,YAAY,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,QAAQ,EAAE,eAAe;IAIrC,kDAAkD;IAClD,MAAM,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAWjC,wCAAwC;IACxC,IAAI,IAAI,MAAM;IAKd,iDAAiD;IACjD,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM;IAIjD,OAAO,CAAC,MAAM;CAgEf"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { writeFileSync, readFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Manages the swarm backlog markdown file.
|
|
5
|
+
* Provides a human-readable summary of the swarm's state.
|
|
6
|
+
*/
|
|
7
|
+
export class BacklogManager {
|
|
8
|
+
settings;
|
|
9
|
+
constructor(settings) {
|
|
10
|
+
this.settings = settings;
|
|
11
|
+
}
|
|
12
|
+
/** Update the backlog file with current state. */
|
|
13
|
+
update(state) {
|
|
14
|
+
if (!this.settings.enabled)
|
|
15
|
+
return;
|
|
16
|
+
const content = this.render(state);
|
|
17
|
+
const dir = dirname(this.settings.file);
|
|
18
|
+
if (!existsSync(dir)) {
|
|
19
|
+
mkdirSync(dir, { recursive: true });
|
|
20
|
+
}
|
|
21
|
+
writeFileSync(this.settings.file, content);
|
|
22
|
+
}
|
|
23
|
+
/** Read the current backlog content. */
|
|
24
|
+
read() {
|
|
25
|
+
if (!existsSync(this.settings.file))
|
|
26
|
+
return '';
|
|
27
|
+
return readFileSync(this.settings.file, 'utf-8');
|
|
28
|
+
}
|
|
29
|
+
/** Build the backlog body for a GitHub issue. */
|
|
30
|
+
buildGitHubIssueBody(state) {
|
|
31
|
+
return this.render(state);
|
|
32
|
+
}
|
|
33
|
+
render(state) {
|
|
34
|
+
const now = new Date().toISOString();
|
|
35
|
+
const parts = [];
|
|
36
|
+
parts.push('# Symphony Swarm Backlog', '', `_Last updated: ${now}_`, '');
|
|
37
|
+
// Current Sprint
|
|
38
|
+
parts.push('## Active Work', '');
|
|
39
|
+
if (state.activeRuns.length > 0) {
|
|
40
|
+
for (const run of state.activeRuns) {
|
|
41
|
+
if (run.swarm_status?.is_paused)
|
|
42
|
+
continue;
|
|
43
|
+
const status = run.status === 'running' ? 'in progress' : run.status;
|
|
44
|
+
parts.push(`- [ ] **${run.repo}#${run.issue_number}** — ${run.issue_title || 'untitled'}`, ` Agent: ${run.agent_name || 'unknown'} | Status: ${status}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
parts.push('No active work.');
|
|
49
|
+
}
|
|
50
|
+
parts.push('');
|
|
51
|
+
// Blocked
|
|
52
|
+
const pausedRuns = state.activeRuns.filter(r => r.swarm_status?.is_paused);
|
|
53
|
+
if (pausedRuns.length > 0 || state.blockedIssues.length > 0) {
|
|
54
|
+
parts.push('## Blocked', '');
|
|
55
|
+
for (const dep of state.blockedIssues) {
|
|
56
|
+
const blockers = dep.blocked_by
|
|
57
|
+
.map(b => `${b.repo}#${b.number}`)
|
|
58
|
+
.join(', ');
|
|
59
|
+
parts.push(`- **${dep.issue.repo}#${dep.issue.number}** — blocked by: ${blockers}`);
|
|
60
|
+
}
|
|
61
|
+
parts.push('');
|
|
62
|
+
}
|
|
63
|
+
// Proposed
|
|
64
|
+
if (state.pendingProposals.length > 0) {
|
|
65
|
+
parts.push('## Pending Proposals', '');
|
|
66
|
+
for (const proposal of state.pendingProposals) {
|
|
67
|
+
parts.push(`- **${proposal.title}** (${proposal.type}, ${proposal.urgency})`, ` From: ${proposal.parent_issue.repo}#${proposal.parent_issue.number}`);
|
|
68
|
+
}
|
|
69
|
+
parts.push('');
|
|
70
|
+
}
|
|
71
|
+
// Recently Completed
|
|
72
|
+
if (state.recentCompletions.length > 0) {
|
|
73
|
+
parts.push('## Recently Completed', '');
|
|
74
|
+
for (const run of state.recentCompletions.slice(0, 20)) {
|
|
75
|
+
const icon = run.status === 'success' ? 'x' : ' ';
|
|
76
|
+
parts.push(`- [${icon}] **${run.repo}#${run.issue_number}** — ${run.issue_title || 'untitled'} (${run.status})`);
|
|
77
|
+
}
|
|
78
|
+
parts.push('');
|
|
79
|
+
}
|
|
80
|
+
return parts.join('\n');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=backlog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backlog.js","sourceRoot":"","sources":["../../src/swarm/backlog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SwarmSettings } from './types.js';
|
|
2
|
+
export declare const DEFAULT_SWARM: SwarmSettings;
|
|
3
|
+
/**
|
|
4
|
+
* Parse the `swarm` section from raw YAML config.
|
|
5
|
+
* Returns a fully-resolved SwarmSettings with defaults applied.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseSwarmSettings(raw: any): SwarmSettings;
|
|
8
|
+
/** Path to the swarm data directory (~/.symphony/swarm/) */
|
|
9
|
+
export declare function swarmDirPath(): string;
|
|
10
|
+
/** Path to the proposals directory (~/.symphony/swarm/proposals/) */
|
|
11
|
+
export declare function proposalsDirPath(): string;
|
|
12
|
+
/** Path to the dependencies file (~/.symphony/swarm/dependencies.json) */
|
|
13
|
+
export declare function dependenciesFilePath(): string;
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/swarm/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EAGd,MAAM,YAAY,CAAC;AAYpB,eAAO,MAAM,aAAa,EAAE,aAqB3B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa,CA4D1D;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C"}
|