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,357 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { resolve, basename, dirname } from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import YAML from 'yaml';
|
|
5
|
+
import { normalizeLegacyRunMode } from '../runModes.js';
|
|
6
|
+
import { globalConfigPath, worktreesDirPath, reposDirPath, findSymphonyHome } from '../paths.js';
|
|
7
|
+
import { parseSwarmSettings } from '../swarm/config.js';
|
|
8
|
+
const HOME = process.env.HOME || '';
|
|
9
|
+
function expandPath(p) {
|
|
10
|
+
if (p.startsWith('~/'))
|
|
11
|
+
return resolve(HOME, p.slice(2));
|
|
12
|
+
return resolve(p);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Deep-merge two plain objects. `override` values take precedence.
|
|
16
|
+
* Arrays are replaced (not concatenated). Nested objects are merged recursively.
|
|
17
|
+
*/
|
|
18
|
+
function deepMerge(base, override) {
|
|
19
|
+
const result = { ...base };
|
|
20
|
+
for (const key of Object.keys(override)) {
|
|
21
|
+
const overVal = override[key];
|
|
22
|
+
const baseVal = result[key];
|
|
23
|
+
if (overVal && typeof overVal === 'object' && !Array.isArray(overVal) &&
|
|
24
|
+
baseVal && typeof baseVal === 'object' && !Array.isArray(baseVal)) {
|
|
25
|
+
result[key] = deepMerge(baseVal, overVal);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
result[key] = overVal;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Load and parse a YAML file, returning null if it doesn't exist.
|
|
35
|
+
*/
|
|
36
|
+
function loadYamlFile(filePath) {
|
|
37
|
+
if (!existsSync(filePath))
|
|
38
|
+
return null;
|
|
39
|
+
try {
|
|
40
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
41
|
+
const parsed = YAML.parse(content);
|
|
42
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
43
|
+
return parsed;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Ignore malformed global config
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Generate a stable session name from the project root, matching dmux convention:
|
|
53
|
+
* symphony-{projectName}-{hash8}
|
|
54
|
+
*/
|
|
55
|
+
export function generateSessionName(projectRoot) {
|
|
56
|
+
const name = basename(projectRoot).replace(/\./g, '-');
|
|
57
|
+
const hash = createHash('md5').update(projectRoot).digest('hex').slice(0, 8);
|
|
58
|
+
return `symphony-${name}-${hash}`;
|
|
59
|
+
}
|
|
60
|
+
const DEFAULT_TRIGGER = {
|
|
61
|
+
mode: 'mention_or_label',
|
|
62
|
+
labels: ['agent'],
|
|
63
|
+
mentions: ['@agent'],
|
|
64
|
+
ignore_labels: ['wontfix'],
|
|
65
|
+
allowed_author_associations: ['OWNER', 'COLLABORATOR', 'CONTRIBUTOR'],
|
|
66
|
+
require_assignee: false,
|
|
67
|
+
skip_if_handled: true,
|
|
68
|
+
skip_if_open_pr: true,
|
|
69
|
+
skip_if_claimed: true,
|
|
70
|
+
claim_label: 'agent:running',
|
|
71
|
+
done_label: 'agent:done',
|
|
72
|
+
failed_label: 'agent:failed',
|
|
73
|
+
include_existing_open_issues: false,
|
|
74
|
+
};
|
|
75
|
+
const DEFAULT_GITHUB_COMMENTS = {
|
|
76
|
+
verbosity: 'key_updates',
|
|
77
|
+
};
|
|
78
|
+
const VALID_TRIGGER_MODES = [
|
|
79
|
+
'yolo', 'mention_only', 'label_only',
|
|
80
|
+
'mention_or_label', 'mention_and_label', 'disabled',
|
|
81
|
+
];
|
|
82
|
+
const VALID_GITHUB_COMMENT_VERBOSITIES = [
|
|
83
|
+
'full',
|
|
84
|
+
'without_thinking',
|
|
85
|
+
'key_updates',
|
|
86
|
+
'silent',
|
|
87
|
+
];
|
|
88
|
+
const VALID_PROVIDERS = ['claude', 'codex', 'custom'];
|
|
89
|
+
function normalizeRunMode(mode) {
|
|
90
|
+
return normalizeLegacyRunMode(mode);
|
|
91
|
+
}
|
|
92
|
+
function parseTrigger(raw) {
|
|
93
|
+
if (!raw)
|
|
94
|
+
return { ...DEFAULT_TRIGGER };
|
|
95
|
+
const t = { ...DEFAULT_TRIGGER };
|
|
96
|
+
if (raw.mode) {
|
|
97
|
+
if (!VALID_TRIGGER_MODES.includes(raw.mode)) {
|
|
98
|
+
throw new Error(`Invalid trigger mode: ${raw.mode}`);
|
|
99
|
+
}
|
|
100
|
+
t.mode = raw.mode;
|
|
101
|
+
}
|
|
102
|
+
if (Array.isArray(raw.labels))
|
|
103
|
+
t.labels = raw.labels;
|
|
104
|
+
if (Array.isArray(raw.mentions))
|
|
105
|
+
t.mentions = raw.mentions;
|
|
106
|
+
if (Array.isArray(raw.ignore_labels))
|
|
107
|
+
t.ignore_labels = raw.ignore_labels;
|
|
108
|
+
if (Array.isArray(raw.allowed_author_associations)) {
|
|
109
|
+
t.allowed_author_associations = raw.allowed_author_associations;
|
|
110
|
+
}
|
|
111
|
+
if (typeof raw.require_assignee === 'boolean')
|
|
112
|
+
t.require_assignee = raw.require_assignee;
|
|
113
|
+
if (typeof raw.skip_if_handled === 'boolean')
|
|
114
|
+
t.skip_if_handled = raw.skip_if_handled;
|
|
115
|
+
if (typeof raw.skip_if_open_pr === 'boolean')
|
|
116
|
+
t.skip_if_open_pr = raw.skip_if_open_pr;
|
|
117
|
+
if (typeof raw.skip_if_claimed === 'boolean')
|
|
118
|
+
t.skip_if_claimed = raw.skip_if_claimed;
|
|
119
|
+
if (typeof raw.claim_label === 'string')
|
|
120
|
+
t.claim_label = raw.claim_label;
|
|
121
|
+
if (typeof raw.done_label === 'string')
|
|
122
|
+
t.done_label = raw.done_label;
|
|
123
|
+
if (typeof raw.failed_label === 'string')
|
|
124
|
+
t.failed_label = raw.failed_label;
|
|
125
|
+
if (typeof raw.include_existing_open_issues === 'boolean') {
|
|
126
|
+
t.include_existing_open_issues = raw.include_existing_open_issues;
|
|
127
|
+
}
|
|
128
|
+
return t;
|
|
129
|
+
}
|
|
130
|
+
function parseGitHubComments(raw) {
|
|
131
|
+
if (!raw)
|
|
132
|
+
return { ...DEFAULT_GITHUB_COMMENTS };
|
|
133
|
+
const settings = { ...DEFAULT_GITHUB_COMMENTS };
|
|
134
|
+
if (raw.verbosity !== undefined) {
|
|
135
|
+
if (!VALID_GITHUB_COMMENT_VERBOSITIES.includes(raw.verbosity)) {
|
|
136
|
+
throw new Error(`Invalid GitHub comment verbosity: ${raw.verbosity}`);
|
|
137
|
+
}
|
|
138
|
+
settings.verbosity = raw.verbosity;
|
|
139
|
+
}
|
|
140
|
+
return settings;
|
|
141
|
+
}
|
|
142
|
+
function parseAgent(name, raw) {
|
|
143
|
+
if (!raw || typeof raw !== 'object') {
|
|
144
|
+
throw new Error(`Agent "${name}" must be an object`);
|
|
145
|
+
}
|
|
146
|
+
const provider = raw.provider || name;
|
|
147
|
+
if (!VALID_PROVIDERS.includes(provider) && provider !== name) {
|
|
148
|
+
// Allow agent names that match provider names
|
|
149
|
+
}
|
|
150
|
+
return {
|
|
151
|
+
provider,
|
|
152
|
+
model: raw.model,
|
|
153
|
+
thinking: raw.thinking,
|
|
154
|
+
permission_mode: raw.permission_mode,
|
|
155
|
+
create_pr: raw.create_pr || 'ready',
|
|
156
|
+
push: raw.push !== false,
|
|
157
|
+
timeout_min: raw.timeout_min || 45,
|
|
158
|
+
env: raw.env || {},
|
|
159
|
+
command: raw.command,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function parseRepo(raw) {
|
|
163
|
+
if (typeof raw === 'string') {
|
|
164
|
+
return { repo: raw };
|
|
165
|
+
}
|
|
166
|
+
if (typeof raw === 'object' && raw.repo) {
|
|
167
|
+
const rs = { repo: raw.repo };
|
|
168
|
+
if (raw.default_agent)
|
|
169
|
+
rs.default_agent = raw.default_agent;
|
|
170
|
+
const normalizedMode = normalizeRunMode(raw.mode);
|
|
171
|
+
if (normalizedMode)
|
|
172
|
+
rs.mode = normalizedMode;
|
|
173
|
+
if (raw.agent_overrides)
|
|
174
|
+
rs.agent_overrides = raw.agent_overrides;
|
|
175
|
+
if (raw.trigger)
|
|
176
|
+
rs.trigger = raw.trigger;
|
|
177
|
+
return rs;
|
|
178
|
+
}
|
|
179
|
+
throw new Error(`Invalid repo entry: ${JSON.stringify(raw)}`);
|
|
180
|
+
}
|
|
181
|
+
export function loadSettings(configPath) {
|
|
182
|
+
const fullPath = expandPath(configPath);
|
|
183
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
184
|
+
const projectConfig = YAML.parse(content);
|
|
185
|
+
if (!projectConfig || typeof projectConfig !== 'object') {
|
|
186
|
+
throw new Error('Config file must contain a YAML object');
|
|
187
|
+
}
|
|
188
|
+
// Merge: global (~/.symphony/config.yaml) < project (config.yaml)
|
|
189
|
+
const globalConfig = loadYamlFile(globalConfigPath());
|
|
190
|
+
const raw = globalConfig ? deepMerge(globalConfig, projectConfig) : projectConfig;
|
|
191
|
+
// Parse agents
|
|
192
|
+
const agents = {};
|
|
193
|
+
if (raw.agents && typeof raw.agents === 'object') {
|
|
194
|
+
for (const [name, agentRaw] of Object.entries(raw.agents)) {
|
|
195
|
+
agents[name] = parseAgent(name, agentRaw);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Parse repos
|
|
199
|
+
const repos = [];
|
|
200
|
+
if (Array.isArray(raw.repos)) {
|
|
201
|
+
for (const r of raw.repos) {
|
|
202
|
+
repos.push(parseRepo(r));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Parse routing
|
|
206
|
+
const routing = {
|
|
207
|
+
mention_map: raw.routing?.mention_map || {},
|
|
208
|
+
};
|
|
209
|
+
// Parse trigger
|
|
210
|
+
const trigger = parseTrigger(raw.trigger || raw.advanced?.trigger);
|
|
211
|
+
const github_comments = parseGitHubComments(raw.github_comments);
|
|
212
|
+
const mode = normalizeRunMode(raw.mode || 'auto_manual_merge');
|
|
213
|
+
if (!mode) {
|
|
214
|
+
throw new Error(`Invalid mode: ${raw.mode}`);
|
|
215
|
+
}
|
|
216
|
+
const swarm = parseSwarmSettings(raw.swarm);
|
|
217
|
+
return {
|
|
218
|
+
version: raw.version || 1,
|
|
219
|
+
default_agent: raw.default_agent || 'claude',
|
|
220
|
+
mode,
|
|
221
|
+
poll_interval_sec: typeof raw.poll_interval_sec === 'number' ? raw.poll_interval_sec : 2,
|
|
222
|
+
max_concurrent_runs: raw.max_concurrent_runs || 10,
|
|
223
|
+
clone_root: raw.clone_root ? expandPath(raw.clone_root) : reposDirPath(),
|
|
224
|
+
worktree_root: raw.worktree_root ? expandPath(raw.worktree_root) : worktreesDirPath(),
|
|
225
|
+
state_file: raw.state_file ? expandPath(raw.state_file) : resolve(findSymphonyHome(), 'state.json'),
|
|
226
|
+
runtime_root: raw.runtime_root ? expandPath(raw.runtime_root) : findSymphonyHome(),
|
|
227
|
+
agents,
|
|
228
|
+
routing,
|
|
229
|
+
github_comments,
|
|
230
|
+
repos,
|
|
231
|
+
trigger,
|
|
232
|
+
swarm,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
export function loadConfigDocument(configPath) {
|
|
236
|
+
const fullPath = expandPath(configPath);
|
|
237
|
+
const content = readFileSync(fullPath, 'utf-8');
|
|
238
|
+
const raw = YAML.parse(content);
|
|
239
|
+
if (!raw)
|
|
240
|
+
return {};
|
|
241
|
+
if (typeof raw !== 'object' || Array.isArray(raw)) {
|
|
242
|
+
throw new Error('Config file must contain a YAML object');
|
|
243
|
+
}
|
|
244
|
+
return raw;
|
|
245
|
+
}
|
|
246
|
+
export function getTriggerForRepo(settings, repo) {
|
|
247
|
+
const repoSettings = settings.repos.find(r => r.repo === repo);
|
|
248
|
+
if (repoSettings?.trigger) {
|
|
249
|
+
return { ...settings.trigger, ...repoSettings.trigger };
|
|
250
|
+
}
|
|
251
|
+
return settings.trigger;
|
|
252
|
+
}
|
|
253
|
+
export function getModeForRepo(settings, repo) {
|
|
254
|
+
const repoSettings = settings.repos.find(r => r.repo === repo);
|
|
255
|
+
return repoSettings?.mode || settings.mode;
|
|
256
|
+
}
|
|
257
|
+
// ── Onboarding ──
|
|
258
|
+
function unique(values) {
|
|
259
|
+
return Array.from(new Set(values));
|
|
260
|
+
}
|
|
261
|
+
function normalizeMention(mention) {
|
|
262
|
+
const trimmed = mention.trim();
|
|
263
|
+
if (!trimmed)
|
|
264
|
+
return '';
|
|
265
|
+
return trimmed.startsWith('@') ? trimmed : `@${trimmed}`;
|
|
266
|
+
}
|
|
267
|
+
export function buildOnboardingConfigYaml(baseConfig, draft) {
|
|
268
|
+
const config = baseConfig ? structuredClone(baseConfig) : {};
|
|
269
|
+
config.version ??= 1;
|
|
270
|
+
config.poll_interval_sec ??= 2;
|
|
271
|
+
config.max_concurrent_runs ??= 10;
|
|
272
|
+
config.default_agent = draft.defaultAgent;
|
|
273
|
+
config.mode = draft.runMode;
|
|
274
|
+
const existingAgents = config.agents && typeof config.agents === 'object' && !Array.isArray(config.agents)
|
|
275
|
+
? config.agents
|
|
276
|
+
: {};
|
|
277
|
+
const agentNames = unique([
|
|
278
|
+
...draft.configuredAgents,
|
|
279
|
+
draft.defaultAgent,
|
|
280
|
+
...draft.mentionItems.map(item => item.agent),
|
|
281
|
+
]).filter(Boolean);
|
|
282
|
+
config.agents = Object.fromEntries(agentNames.map(agent => {
|
|
283
|
+
const existing = existingAgents[agent];
|
|
284
|
+
const nextAgent = existing && typeof existing === 'object' && !Array.isArray(existing)
|
|
285
|
+
? structuredClone(existing)
|
|
286
|
+
: {};
|
|
287
|
+
nextAgent.provider ??= agent;
|
|
288
|
+
nextAgent.timeout_min ??= 45;
|
|
289
|
+
nextAgent.create_pr ??= 'ready';
|
|
290
|
+
nextAgent.push ??= true;
|
|
291
|
+
if (draft.automationMode) {
|
|
292
|
+
nextAgent.permission_mode = draft.automationMode;
|
|
293
|
+
}
|
|
294
|
+
return [agent, nextAgent];
|
|
295
|
+
}));
|
|
296
|
+
const mentionItems = draft.mentionItems
|
|
297
|
+
.map(item => ({ mention: normalizeMention(item.mention), agent: item.agent }))
|
|
298
|
+
.filter(item => item.mention && item.agent);
|
|
299
|
+
config.routing = config.routing && typeof config.routing === 'object' && !Array.isArray(config.routing)
|
|
300
|
+
? structuredClone(config.routing)
|
|
301
|
+
: {};
|
|
302
|
+
config.routing.mention_map = Object.fromEntries(mentionItems.map(item => [item.mention, item.agent]));
|
|
303
|
+
const githubComments = config.github_comments && typeof config.github_comments === 'object' && !Array.isArray(config.github_comments)
|
|
304
|
+
? structuredClone(config.github_comments)
|
|
305
|
+
: {};
|
|
306
|
+
githubComments.verbosity = draft.githubCommentVerbosity;
|
|
307
|
+
config.github_comments = githubComments;
|
|
308
|
+
const existingRepos = Array.isArray(config.repos) ? config.repos : [];
|
|
309
|
+
const repoEntries = new Map();
|
|
310
|
+
for (const entry of existingRepos) {
|
|
311
|
+
if (typeof entry === 'string') {
|
|
312
|
+
repoEntries.set(entry, entry);
|
|
313
|
+
}
|
|
314
|
+
else if (entry && typeof entry === 'object' && typeof entry.repo === 'string') {
|
|
315
|
+
repoEntries.set(entry.repo, structuredClone(entry));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
config.repos = draft.repos.map(repo => repoEntries.get(repo) ?? repo);
|
|
319
|
+
const trigger = config.trigger && typeof config.trigger === 'object' && !Array.isArray(config.trigger)
|
|
320
|
+
? structuredClone(config.trigger)
|
|
321
|
+
: {};
|
|
322
|
+
trigger.mode = draft.triggerMode;
|
|
323
|
+
trigger.labels = Array.isArray(trigger.labels) && trigger.labels.length > 0 ? trigger.labels : ['agent'];
|
|
324
|
+
trigger.mentions = mentionItems.map(item => item.mention);
|
|
325
|
+
trigger.ignore_labels = Array.isArray(trigger.ignore_labels) && trigger.ignore_labels.length > 0
|
|
326
|
+
? trigger.ignore_labels
|
|
327
|
+
: ['wontfix'];
|
|
328
|
+
trigger.claim_label ??= 'agent:running';
|
|
329
|
+
trigger.done_label ??= 'agent:done';
|
|
330
|
+
trigger.failed_label ??= 'agent:failed';
|
|
331
|
+
trigger.include_existing_open_issues = draft.includeExistingOpenIssues;
|
|
332
|
+
config.trigger = trigger;
|
|
333
|
+
if (config.advanced && typeof config.advanced === 'object' && !Array.isArray(config.advanced)) {
|
|
334
|
+
delete config.advanced.trigger;
|
|
335
|
+
if (Object.keys(config.advanced).length === 0) {
|
|
336
|
+
delete config.advanced;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return YAML.stringify(config);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Write config YAML to disk and return loaded settings.
|
|
343
|
+
* Called by the Ink-based Onboarding component when the user confirms.
|
|
344
|
+
*/
|
|
345
|
+
export function writeConfigAndLoad(configPath, yamlContent) {
|
|
346
|
+
const fullPath = resolve(configPath);
|
|
347
|
+
const dir = dirname(fullPath);
|
|
348
|
+
if (!existsSync(dir))
|
|
349
|
+
mkdirSync(dir, { recursive: true });
|
|
350
|
+
writeFileSync(fullPath, yamlContent);
|
|
351
|
+
return loadSettings(fullPath);
|
|
352
|
+
}
|
|
353
|
+
export function writeOnboardingConfigAndLoad(configPath, baseConfig, draft) {
|
|
354
|
+
const yamlContent = buildOnboardingConfigYaml(baseConfig, draft);
|
|
355
|
+
return writeConfigAndLoad(configPath, yamlContent);
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { MergeValidationResult } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Validate whether a merge can proceed.
|
|
4
|
+
*/
|
|
5
|
+
export declare function validateMerge(worktreePath: string): Promise<MergeValidationResult>;
|
|
6
|
+
/**
|
|
7
|
+
* Execute a two-phase merge (dmux-style):
|
|
8
|
+
* Phase 1: Merge main → worktree (get latest, detect conflicts)
|
|
9
|
+
* Phase 2: Merge worktree → main (bring changes back)
|
|
10
|
+
*/
|
|
11
|
+
export declare function executeTwoPhaseMerge(worktreePath: string, clonePath: string): Promise<{
|
|
12
|
+
success: boolean;
|
|
13
|
+
error?: string;
|
|
14
|
+
}>;
|
|
15
|
+
/**
|
|
16
|
+
* Simple merge of worktree branch back to main within the worktree itself.
|
|
17
|
+
* Used when we don't need the two-phase approach.
|
|
18
|
+
*/
|
|
19
|
+
export declare function mergeWorktreeToMain(worktreePath: string): Promise<{
|
|
20
|
+
success: boolean;
|
|
21
|
+
error?: string;
|
|
22
|
+
}>;
|
|
23
|
+
//# sourceMappingURL=merge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/git/merge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAc,MAAM,aAAa,CAAC;AAErE;;GAEG;AACH,wBAAsB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAqCxF;AAqBD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA0C/C;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiC/C"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { run, runSafe } from '../utils/shell.js';
|
|
2
|
+
import { getMainBranch, getCurrentBranch, hasUncommittedChanges, getCommitCount } from './utils.js';
|
|
3
|
+
/**
|
|
4
|
+
* Validate whether a merge can proceed.
|
|
5
|
+
*/
|
|
6
|
+
export async function validateMerge(worktreePath) {
|
|
7
|
+
const issues = [];
|
|
8
|
+
const mainBranch = await getMainBranch(worktreePath);
|
|
9
|
+
const worktreeBranch = await getCurrentBranch(worktreePath);
|
|
10
|
+
// Check worktree for uncommitted changes
|
|
11
|
+
if (await hasUncommittedChanges(worktreePath)) {
|
|
12
|
+
issues.push({
|
|
13
|
+
type: 'worktree_uncommitted',
|
|
14
|
+
message: 'Worktree has uncommitted changes',
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
// Check if there are commits to merge
|
|
18
|
+
const commitCount = await getCommitCount(mainBranch, worktreeBranch, worktreePath);
|
|
19
|
+
if (commitCount === 0) {
|
|
20
|
+
issues.push({
|
|
21
|
+
type: 'nothing_to_merge',
|
|
22
|
+
message: 'No commits to merge',
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
// Simulate merge to detect conflicts
|
|
26
|
+
const conflictResult = await detectMergeConflicts(worktreePath, mainBranch, worktreeBranch);
|
|
27
|
+
if (conflictResult) {
|
|
28
|
+
issues.push({
|
|
29
|
+
type: 'merge_conflict',
|
|
30
|
+
message: `Merge conflicts detected: ${conflictResult}`,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
canMerge: issues.length === 0,
|
|
35
|
+
issues,
|
|
36
|
+
mainBranch,
|
|
37
|
+
worktreeBranch,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Detect merge conflicts without touching the filesystem.
|
|
42
|
+
* Returns conflict description or null if clean.
|
|
43
|
+
*/
|
|
44
|
+
async function detectMergeConflicts(cwd, mainBranch, worktreeBranch) {
|
|
45
|
+
const result = await runSafe('git', [
|
|
46
|
+
'merge-tree', '--write-tree', mainBranch, worktreeBranch,
|
|
47
|
+
], { cwd });
|
|
48
|
+
if (result.exitCode !== 0 && result.stderr.includes('CONFLICT')) {
|
|
49
|
+
return result.stderr;
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Execute a two-phase merge (dmux-style):
|
|
55
|
+
* Phase 1: Merge main → worktree (get latest, detect conflicts)
|
|
56
|
+
* Phase 2: Merge worktree → main (bring changes back)
|
|
57
|
+
*/
|
|
58
|
+
export async function executeTwoPhaseMerge(worktreePath, clonePath) {
|
|
59
|
+
const mainBranch = await getMainBranch(worktreePath);
|
|
60
|
+
const worktreeBranch = await getCurrentBranch(worktreePath);
|
|
61
|
+
// Phase 1: Merge main into worktree
|
|
62
|
+
const phase1 = await runSafe('git', ['merge', mainBranch, '--no-edit'], { cwd: worktreePath });
|
|
63
|
+
if (phase1.exitCode !== 0) {
|
|
64
|
+
// Check if it's a conflict
|
|
65
|
+
if (phase1.stderr.includes('CONFLICT') || phase1.stdout.includes('CONFLICT')) {
|
|
66
|
+
// Abort the merge
|
|
67
|
+
await runSafe('git', ['merge', '--abort'], { cwd: worktreePath });
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
error: `Merge conflicts when merging ${mainBranch} into ${worktreeBranch}. Manual resolution needed.`,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return { success: false, error: `Phase 1 merge failed: ${phase1.stderr}` };
|
|
74
|
+
}
|
|
75
|
+
// Phase 2: Merge worktree back into main (from the clone/main repo)
|
|
76
|
+
// First, checkout main in the clone
|
|
77
|
+
const phase2Checkout = await runSafe('git', ['checkout', mainBranch], { cwd: clonePath });
|
|
78
|
+
if (phase2Checkout.exitCode !== 0) {
|
|
79
|
+
// Try with bare repo approach
|
|
80
|
+
const mergeResult = await runSafe('git', [
|
|
81
|
+
'merge', '--ff-only', worktreeBranch,
|
|
82
|
+
], { cwd: clonePath });
|
|
83
|
+
if (mergeResult.exitCode !== 0) {
|
|
84
|
+
return { success: false, error: `Phase 2 merge failed: ${mergeResult.stderr}` };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
const mergeResult = await runSafe('git', [
|
|
89
|
+
'merge', '--ff-only', worktreeBranch,
|
|
90
|
+
], { cwd: clonePath });
|
|
91
|
+
if (mergeResult.exitCode !== 0) {
|
|
92
|
+
return { success: false, error: `Phase 2 fast-forward failed: ${mergeResult.stderr}` };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return { success: true };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Simple merge of worktree branch back to main within the worktree itself.
|
|
99
|
+
* Used when we don't need the two-phase approach.
|
|
100
|
+
*/
|
|
101
|
+
export async function mergeWorktreeToMain(worktreePath) {
|
|
102
|
+
const mainBranch = await getMainBranch(worktreePath);
|
|
103
|
+
const worktreeBranch = await getCurrentBranch(worktreePath);
|
|
104
|
+
// Stash any uncommitted changes
|
|
105
|
+
const hasChanges = await hasUncommittedChanges(worktreePath);
|
|
106
|
+
if (hasChanges) {
|
|
107
|
+
await run('git', ['stash'], { cwd: worktreePath });
|
|
108
|
+
}
|
|
109
|
+
// Checkout main
|
|
110
|
+
const checkout = await runSafe('git', ['checkout', mainBranch], { cwd: worktreePath });
|
|
111
|
+
if (checkout.exitCode !== 0) {
|
|
112
|
+
return { success: false, error: `Cannot checkout ${mainBranch}: ${checkout.stderr}` };
|
|
113
|
+
}
|
|
114
|
+
// Merge
|
|
115
|
+
const merge = await runSafe('git', ['merge', worktreeBranch, '--no-edit'], { cwd: worktreePath });
|
|
116
|
+
if (merge.exitCode !== 0) {
|
|
117
|
+
// Abort and go back
|
|
118
|
+
await runSafe('git', ['merge', '--abort'], { cwd: worktreePath });
|
|
119
|
+
await runSafe('git', ['checkout', worktreeBranch], { cwd: worktreePath });
|
|
120
|
+
if (hasChanges)
|
|
121
|
+
await runSafe('git', ['stash', 'pop'], { cwd: worktreePath });
|
|
122
|
+
return { success: false, error: `Merge failed: ${merge.stderr}` };
|
|
123
|
+
}
|
|
124
|
+
// Go back to worktree branch
|
|
125
|
+
await runSafe('git', ['checkout', worktreeBranch], { cwd: worktreePath });
|
|
126
|
+
if (hasChanges) {
|
|
127
|
+
await runSafe('git', ['stash', 'pop'], { cwd: worktreePath });
|
|
128
|
+
}
|
|
129
|
+
return { success: true };
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=merge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/git/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare function getMainBranch(cwd: string): Promise<string>;
|
|
2
|
+
export declare function getCurrentBranch(cwd: string): Promise<string>;
|
|
3
|
+
export declare function branchExists(branch: string, cwd: string): Promise<boolean>;
|
|
4
|
+
export declare function hasUncommittedChanges(cwd: string): Promise<boolean>;
|
|
5
|
+
export declare function getConflictedFiles(cwd: string): Promise<string[]>;
|
|
6
|
+
export declare function getHeadSha(cwd: string): Promise<string>;
|
|
7
|
+
export declare function getCommitCount(from: string, to: string, cwd: string): Promise<number>;
|
|
8
|
+
export declare function hasDiffBetweenRefs(from: string, to: string, cwd: string): Promise<boolean>;
|
|
9
|
+
export declare function getChangedFiles(from: string, to: string, cwd: string): Promise<string[]>;
|
|
10
|
+
export declare function hasCommittedChanges(from: string, to: string, cwd: string): Promise<boolean>;
|
|
11
|
+
export declare function getGitRoot(cwd: string): Promise<string>;
|
|
12
|
+
export declare function isGitWorktree(path: string): Promise<boolean>;
|
|
13
|
+
export declare function fetchOrigin(cwd: string): Promise<{
|
|
14
|
+
ok: boolean;
|
|
15
|
+
detail?: string;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function resolveBranchRef(cwd: string, branch: string): Promise<string | undefined>;
|
|
18
|
+
export declare function fetchBranchRef(cwd: string, remote: string, branch: string): Promise<{
|
|
19
|
+
ref?: string;
|
|
20
|
+
detail?: string;
|
|
21
|
+
}>;
|
|
22
|
+
export declare function findUnresolvedMergeMarkers(cwd: string): Promise<string[]>;
|
|
23
|
+
export declare function pushBranch(branch: string, cwd: string): Promise<{
|
|
24
|
+
ok: boolean;
|
|
25
|
+
detail?: string;
|
|
26
|
+
}>;
|
|
27
|
+
export declare function stageAll(cwd: string): Promise<void>;
|
|
28
|
+
export declare function commit(message: string, cwd: string): Promise<void>;
|
|
29
|
+
export declare function getDiffStats(baseSha: string, cwd: string): Promise<{
|
|
30
|
+
added: number;
|
|
31
|
+
removed: number;
|
|
32
|
+
}>;
|
|
33
|
+
export declare function isValidBranchName(name: string): boolean;
|
|
34
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/git/utils.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAchE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGhF;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOzE;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIvE;AAiBD,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK3F;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhG;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW9F;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGjG;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE7D;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASlE;AAED,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAaxF;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB/F;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqC5C;AAED,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkB/E;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa3C;AAED,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzD;AAED,wBAAsB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExE;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAmB7C;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD"}
|