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.
Files changed (166) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +341 -0
  3. package/config.example.yaml +101 -0
  4. package/dist/agents/launcher.d.ts +24 -0
  5. package/dist/agents/launcher.d.ts.map +1 -0
  6. package/dist/agents/launcher.js +152 -0
  7. package/dist/agents/launcher.js.map +1 -0
  8. package/dist/agents/registry.d.ts +10 -0
  9. package/dist/agents/registry.d.ts.map +1 -0
  10. package/dist/agents/registry.js +324 -0
  11. package/dist/agents/registry.js.map +1 -0
  12. package/dist/agents/runner.d.ts +58 -0
  13. package/dist/agents/runner.d.ts.map +1 -0
  14. package/dist/agents/runner.js +1190 -0
  15. package/dist/agents/runner.js.map +1 -0
  16. package/dist/app.d.ts +11 -0
  17. package/dist/app.d.ts.map +1 -0
  18. package/dist/app.js +829 -0
  19. package/dist/app.js.map +1 -0
  20. package/dist/components/ActivityView.d.ts +9 -0
  21. package/dist/components/ActivityView.d.ts.map +1 -0
  22. package/dist/components/ActivityView.js +73 -0
  23. package/dist/components/ActivityView.js.map +1 -0
  24. package/dist/components/Header.d.ts +12 -0
  25. package/dist/components/Header.d.ts.map +1 -0
  26. package/dist/components/Header.js +44 -0
  27. package/dist/components/Header.js.map +1 -0
  28. package/dist/components/IssueList.d.ts +10 -0
  29. package/dist/components/IssueList.d.ts.map +1 -0
  30. package/dist/components/IssueList.js +119 -0
  31. package/dist/components/IssueList.js.map +1 -0
  32. package/dist/components/Onboarding.d.ts +26 -0
  33. package/dist/components/Onboarding.d.ts.map +1 -0
  34. package/dist/components/Onboarding.js +948 -0
  35. package/dist/components/Onboarding.js.map +1 -0
  36. package/dist/components/PaneView.d.ts +9 -0
  37. package/dist/components/PaneView.d.ts.map +1 -0
  38. package/dist/components/PaneView.js +74 -0
  39. package/dist/components/PaneView.js.map +1 -0
  40. package/dist/components/StartupRecoveryView.d.ts +13 -0
  41. package/dist/components/StartupRecoveryView.d.ts.map +1 -0
  42. package/dist/components/StartupRecoveryView.js +85 -0
  43. package/dist/components/StartupRecoveryView.js.map +1 -0
  44. package/dist/components/StatusBar.d.ts +9 -0
  45. package/dist/components/StatusBar.d.ts.map +1 -0
  46. package/dist/components/StatusBar.js +70 -0
  47. package/dist/components/StatusBar.js.map +1 -0
  48. package/dist/components/TableView.d.ts +8 -0
  49. package/dist/components/TableView.d.ts.map +1 -0
  50. package/dist/components/TableView.js +87 -0
  51. package/dist/components/TableView.js.map +1 -0
  52. package/dist/config/index.d.ts +18 -0
  53. package/dist/config/index.d.ts.map +1 -0
  54. package/dist/config/index.js +357 -0
  55. package/dist/config/index.js.map +1 -0
  56. package/dist/git/merge.d.ts +23 -0
  57. package/dist/git/merge.d.ts.map +1 -0
  58. package/dist/git/merge.js +131 -0
  59. package/dist/git/merge.js.map +1 -0
  60. package/dist/git/utils.d.ts +34 -0
  61. package/dist/git/utils.d.ts.map +1 -0
  62. package/dist/git/utils.js +214 -0
  63. package/dist/git/utils.js.map +1 -0
  64. package/dist/git/worktree.d.ts +23 -0
  65. package/dist/git/worktree.d.ts.map +1 -0
  66. package/dist/git/worktree.js +116 -0
  67. package/dist/git/worktree.js.map +1 -0
  68. package/dist/index.d.ts +3 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +225 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/paths.d.ts +21 -0
  73. package/dist/paths.d.ts.map +1 -0
  74. package/dist/paths.js +59 -0
  75. package/dist/paths.js.map +1 -0
  76. package/dist/runModes.d.ts +7 -0
  77. package/dist/runModes.d.ts.map +1 -0
  78. package/dist/runModes.js +36 -0
  79. package/dist/runModes.js.map +1 -0
  80. package/dist/services/daemon.d.ts +85 -0
  81. package/dist/services/daemon.d.ts.map +1 -0
  82. package/dist/services/daemon.js +836 -0
  83. package/dist/services/daemon.js.map +1 -0
  84. package/dist/services/github.d.ts +101 -0
  85. package/dist/services/github.d.ts.map +1 -0
  86. package/dist/services/github.js +367 -0
  87. package/dist/services/github.js.map +1 -0
  88. package/dist/services/githubProgressReporter.d.ts +33 -0
  89. package/dist/services/githubProgressReporter.d.ts.map +1 -0
  90. package/dist/services/githubProgressReporter.js +272 -0
  91. package/dist/services/githubProgressReporter.js.map +1 -0
  92. package/dist/services/runtime.d.ts +43 -0
  93. package/dist/services/runtime.d.ts.map +1 -0
  94. package/dist/services/runtime.js +126 -0
  95. package/dist/services/runtime.js.map +1 -0
  96. package/dist/services/state.d.ts +43 -0
  97. package/dist/services/state.d.ts.map +1 -0
  98. package/dist/services/state.js +176 -0
  99. package/dist/services/state.js.map +1 -0
  100. package/dist/services/tmux.d.ts +50 -0
  101. package/dist/services/tmux.d.ts.map +1 -0
  102. package/dist/services/tmux.js +157 -0
  103. package/dist/services/tmux.js.map +1 -0
  104. package/dist/swarm/backlog.d.ts +25 -0
  105. package/dist/swarm/backlog.d.ts.map +1 -0
  106. package/dist/swarm/backlog.js +83 -0
  107. package/dist/swarm/backlog.js.map +1 -0
  108. package/dist/swarm/config.d.ts +14 -0
  109. package/dist/swarm/config.d.ts.map +1 -0
  110. package/dist/swarm/config.js +112 -0
  111. package/dist/swarm/config.js.map +1 -0
  112. package/dist/swarm/dependencies.d.ts +36 -0
  113. package/dist/swarm/dependencies.d.ts.map +1 -0
  114. package/dist/swarm/dependencies.js +141 -0
  115. package/dist/swarm/dependencies.js.map +1 -0
  116. package/dist/swarm/director.d.ts +67 -0
  117. package/dist/swarm/director.d.ts.map +1 -0
  118. package/dist/swarm/director.js +358 -0
  119. package/dist/swarm/director.js.map +1 -0
  120. package/dist/swarm/directorPrompt.d.ts +15 -0
  121. package/dist/swarm/directorPrompt.d.ts.map +1 -0
  122. package/dist/swarm/directorPrompt.js +60 -0
  123. package/dist/swarm/directorPrompt.js.map +1 -0
  124. package/dist/swarm/index.d.ts +7 -0
  125. package/dist/swarm/index.d.ts.map +1 -0
  126. package/dist/swarm/index.js +6 -0
  127. package/dist/swarm/index.js.map +1 -0
  128. package/dist/swarm/proposals.d.ts +29 -0
  129. package/dist/swarm/proposals.d.ts.map +1 -0
  130. package/dist/swarm/proposals.js +141 -0
  131. package/dist/swarm/proposals.js.map +1 -0
  132. package/dist/swarm/types.d.ts +65 -0
  133. package/dist/swarm/types.d.ts.map +1 -0
  134. package/dist/swarm/types.js +3 -0
  135. package/dist/swarm/types.js.map +1 -0
  136. package/dist/theme.d.ts +64 -0
  137. package/dist/theme.d.ts.map +1 -0
  138. package/dist/theme.js +161 -0
  139. package/dist/theme.js.map +1 -0
  140. package/dist/triggers/index.d.ts +17 -0
  141. package/dist/triggers/index.d.ts.map +1 -0
  142. package/dist/triggers/index.js +124 -0
  143. package/dist/triggers/index.js.map +1 -0
  144. package/dist/types.d.ts +327 -0
  145. package/dist/types.d.ts.map +1 -0
  146. package/dist/types.js +6 -0
  147. package/dist/types.js.map +1 -0
  148. package/dist/utils/duplicateDetection.d.ts +14 -0
  149. package/dist/utils/duplicateDetection.d.ts.map +1 -0
  150. package/dist/utils/duplicateDetection.js +45 -0
  151. package/dist/utils/duplicateDetection.js.map +1 -0
  152. package/dist/utils/shell.d.ts +46 -0
  153. package/dist/utils/shell.d.ts.map +1 -0
  154. package/dist/utils/shell.js +79 -0
  155. package/dist/utils/shell.js.map +1 -0
  156. package/dist/utils/slug.d.ts +13 -0
  157. package/dist/utils/slug.d.ts.map +1 -0
  158. package/dist/utils/slug.js +32 -0
  159. package/dist/utils/slug.js.map +1 -0
  160. package/dist/version.d.ts +28 -0
  161. package/dist/version.d.ts.map +1 -0
  162. package/dist/version.js +105 -0
  163. package/dist/version.js.map +1 -0
  164. package/examples/run-claude.example.sh +11 -0
  165. package/examples/run-codex.example.sh +11 -0
  166. package/package.json +68 -0
@@ -0,0 +1,327 @@
1
+ import type { SwarmSettings, IssueRef } from './swarm/types.js';
2
+ export type { SwarmSettings, IssueRef } from './swarm/types.js';
3
+ export declare const AGENT_IDS: readonly ["claude", "opencode", "codex", "cline", "gemini", "qwen", "amp", "pi", "cursor", "copilot", "crush"];
4
+ export type AgentName = typeof AGENT_IDS[number];
5
+ export type PermissionMode = '' | 'plan' | 'acceptEdits' | 'bypassPermissions';
6
+ export type PromptTransport = 'positional' | 'option' | 'stdin' | 'send-keys';
7
+ export type AgentStatus = 'idle' | 'analyzing' | 'waiting' | 'working';
8
+ export interface AgentRegistryEntry {
9
+ id: AgentName;
10
+ name: string;
11
+ shortLabel: string;
12
+ description: string;
13
+ slugSuffix: string;
14
+ installTestCommand: string;
15
+ commonPaths: string[];
16
+ promptCommand: string;
17
+ noPromptCommand?: string;
18
+ promptTransport: PromptTransport;
19
+ promptOption?: string;
20
+ sendKeysPrePrompt?: string[];
21
+ sendKeysSubmit?: string[];
22
+ sendKeysPostPasteDelayMs?: number;
23
+ sendKeysReadyDelayMs?: number;
24
+ permissionFlags: Partial<Record<Exclude<PermissionMode, ''>, string>>;
25
+ defaultEnabled: boolean;
26
+ resumeCommandTemplate?: string;
27
+ }
28
+ export interface GitHubIssue {
29
+ number: number;
30
+ title: string;
31
+ body: string;
32
+ state: string;
33
+ html_url: string;
34
+ labels: Array<{
35
+ name: string;
36
+ }>;
37
+ assignees: Array<{
38
+ login: string;
39
+ }>;
40
+ user: {
41
+ login: string;
42
+ };
43
+ author_association?: string;
44
+ created_at: string;
45
+ updated_at: string;
46
+ pull_request?: {
47
+ url: string;
48
+ };
49
+ }
50
+ export interface GitHubComment {
51
+ id: number;
52
+ body: string;
53
+ user: {
54
+ login: string;
55
+ };
56
+ author_association?: string;
57
+ created_at: string;
58
+ updated_at: string;
59
+ issue_url?: string;
60
+ }
61
+ export interface PullRequest {
62
+ number: number;
63
+ title: string;
64
+ html_url: string;
65
+ head: {
66
+ ref: string;
67
+ };
68
+ state: string;
69
+ body?: string;
70
+ is_draft?: boolean;
71
+ mergeable?: string;
72
+ merged_at?: string | null;
73
+ }
74
+ export type TriggerMode = 'yolo' | 'mention_only' | 'label_only' | 'mention_or_label' | 'mention_and_label' | 'disabled';
75
+ export type RunMode = 'auto' | 'auto_manual_conflicts' | 'auto_manual_merge';
76
+ export type GitHubCommentVerbosity = 'full' | 'without_thinking' | 'key_updates' | 'silent';
77
+ export type RunStatus = 'pending' | 'running' | 'awaiting_review' | 'needs_attention' | 'success' | 'failed' | 'timeout';
78
+ export interface TriggerSettings {
79
+ mode: TriggerMode;
80
+ labels: string[];
81
+ mentions: string[];
82
+ ignore_labels: string[];
83
+ allowed_author_associations: string[];
84
+ require_assignee: boolean;
85
+ skip_if_handled: boolean;
86
+ skip_if_open_pr: boolean;
87
+ skip_if_claimed: boolean;
88
+ claim_label: string;
89
+ done_label: string;
90
+ failed_label: string;
91
+ include_existing_open_issues: boolean;
92
+ }
93
+ export interface AgentSettings {
94
+ provider: string;
95
+ model?: string;
96
+ thinking?: string;
97
+ permission_mode?: PermissionMode;
98
+ create_pr: 'none' | 'draft' | 'ready';
99
+ push: boolean;
100
+ timeout_min: number;
101
+ env?: Record<string, string>;
102
+ command?: string;
103
+ }
104
+ export interface AgentOverrideSettings {
105
+ model?: string;
106
+ thinking?: string;
107
+ timeout_min?: number;
108
+ create_pr?: 'none' | 'draft' | 'ready';
109
+ push?: boolean;
110
+ }
111
+ export interface RepoSettings {
112
+ repo: string;
113
+ default_agent?: string;
114
+ mode?: RunMode;
115
+ agent_overrides?: Record<string, AgentOverrideSettings>;
116
+ trigger?: Partial<TriggerSettings>;
117
+ }
118
+ export interface RoutingSettings {
119
+ mention_map: Record<string, string>;
120
+ }
121
+ export interface GitHubCommentSettings {
122
+ verbosity: GitHubCommentVerbosity;
123
+ }
124
+ export interface Settings {
125
+ version: number;
126
+ default_agent: string;
127
+ mode: RunMode;
128
+ poll_interval_sec: number;
129
+ max_concurrent_runs: number;
130
+ clone_root: string;
131
+ worktree_root: string;
132
+ state_file: string;
133
+ runtime_root: string;
134
+ agents: Record<string, AgentSettings>;
135
+ routing: RoutingSettings;
136
+ github_comments: GitHubCommentSettings;
137
+ repos: RepoSettings[];
138
+ trigger: TriggerSettings;
139
+ swarm: SwarmSettings;
140
+ }
141
+ export interface OnboardingMentionItem {
142
+ mention: string;
143
+ agent: string;
144
+ }
145
+ export interface OnboardingConfigDraft {
146
+ defaultAgent: string;
147
+ configuredAgents: string[];
148
+ repos: string[];
149
+ mentionItems: OnboardingMentionItem[];
150
+ runMode: RunMode;
151
+ triggerMode: TriggerMode;
152
+ includeExistingOpenIssues: boolean;
153
+ automationMode: PermissionMode;
154
+ githubCommentVerbosity: GitHubCommentVerbosity;
155
+ }
156
+ export interface ResolvedAgent {
157
+ name: string;
158
+ provider: string;
159
+ model?: string;
160
+ thinking?: string;
161
+ create_pr: 'none' | 'draft' | 'ready';
162
+ push: boolean;
163
+ timeout_min: number;
164
+ env: Record<string, string>;
165
+ command?: string;
166
+ permission_mode: PermissionMode;
167
+ }
168
+ export interface RunRequest {
169
+ repo: string;
170
+ issue: GitHubIssue;
171
+ agent: ResolvedAgent;
172
+ mode: RunMode;
173
+ worktree_path: string;
174
+ branch: string;
175
+ run_id: string;
176
+ run_dir: string;
177
+ }
178
+ export interface RunManifest {
179
+ run_id: string;
180
+ repo: string;
181
+ issue_number: number;
182
+ issue_title: string;
183
+ issue_url: string;
184
+ agent_name: string;
185
+ agent_provider: string;
186
+ model?: string;
187
+ mode: RunMode;
188
+ branch: string;
189
+ worktree_path: string;
190
+ base_sha?: string;
191
+ started_at: string;
192
+ tmux_session?: string;
193
+ tmux_pane_id?: string;
194
+ finished_at?: string;
195
+ status: Exclude<RunStatus, 'pending'>;
196
+ status_detail?: string;
197
+ exit_code?: number;
198
+ error_summary?: string;
199
+ commits?: number;
200
+ head_sha?: string;
201
+ pr_url?: string;
202
+ pr_number?: number;
203
+ github_progress?: {
204
+ issue?: {
205
+ comment_id?: number;
206
+ last_body_hash?: string;
207
+ last_published_at?: string;
208
+ };
209
+ pr?: {
210
+ comment_id?: number;
211
+ last_body_hash?: string;
212
+ last_published_at?: string;
213
+ };
214
+ };
215
+ }
216
+ export interface RunnerResult {
217
+ success: boolean;
218
+ exit_code?: number;
219
+ error_summary?: string;
220
+ commits: number;
221
+ head_sha?: string;
222
+ has_uncommitted: boolean;
223
+ has_repo_changes: boolean;
224
+ }
225
+ export interface RunStatusCheck {
226
+ status: Exclude<RunStatus, 'pending' | 'timeout'>;
227
+ detail?: string;
228
+ result?: RunnerResult;
229
+ }
230
+ export interface HandledIssueRecord {
231
+ issue_number: number;
232
+ handled_at: string;
233
+ run_id: string;
234
+ }
235
+ export interface ActiveRunRecord {
236
+ run_id: string;
237
+ repo: string;
238
+ issue_number: number;
239
+ started_at: string;
240
+ pid?: number;
241
+ tmux_session?: string;
242
+ tmux_pane_id?: string;
243
+ }
244
+ export interface RepositoryState {
245
+ issue_cursor?: string;
246
+ comment_cursor?: string;
247
+ startup_issue_cursor?: string;
248
+ startup_comment_cursor?: string;
249
+ handled_issues: Record<number, HandledIssueRecord>;
250
+ active_runs: Record<string, ActiveRunRecord>;
251
+ processed_comment_ids: number[];
252
+ deferred_issue_numbers?: number[];
253
+ suppressed_issue_numbers?: number[];
254
+ }
255
+ export interface DaemonState {
256
+ repos: Record<string, RepositoryState>;
257
+ }
258
+ export interface TriggerDecision {
259
+ should_run: boolean;
260
+ reason: string;
261
+ matched_by?: string;
262
+ }
263
+ export interface PreparedWorktree {
264
+ path: string;
265
+ branch: string;
266
+ clone_path: string;
267
+ }
268
+ export interface SymphonyPane {
269
+ id: string;
270
+ slug: string;
271
+ type: 'issue' | 'shell' | 'director';
272
+ repo?: string;
273
+ issue_number?: number;
274
+ issue_title?: string;
275
+ issue_url?: string;
276
+ agent_name?: string;
277
+ agent_provider?: string;
278
+ run_id?: string;
279
+ mode?: RunMode;
280
+ status: RunStatus;
281
+ status_detail?: string;
282
+ tmux_pane_id?: string;
283
+ worktree_path?: string;
284
+ branch?: string;
285
+ base_sha?: string;
286
+ hidden?: boolean;
287
+ started_at?: string;
288
+ swarm_status?: {
289
+ blocked_by?: IssueRef[];
290
+ is_paused?: boolean;
291
+ };
292
+ }
293
+ export type MergeIssueType = 'main_dirty' | 'worktree_uncommitted' | 'merge_conflict' | 'nothing_to_merge';
294
+ export interface MergeIssue {
295
+ type: MergeIssueType;
296
+ message: string;
297
+ }
298
+ export interface MergeValidationResult {
299
+ canMerge: boolean;
300
+ issues: MergeIssue[];
301
+ mainBranch: string;
302
+ worktreeBranch: string;
303
+ }
304
+ export interface SymphonyConfig {
305
+ projectRoot: string;
306
+ sessionName: string;
307
+ controlPaneId?: string;
308
+ panes: SymphonyPane[];
309
+ settings: Settings;
310
+ lastUpdated: string;
311
+ }
312
+ export interface StartupRecoveryIssue {
313
+ id: string;
314
+ repo: string;
315
+ issue_number: number;
316
+ issue_title: string;
317
+ issue_url: string;
318
+ reason: string;
319
+ matched_by?: string;
320
+ is_claimed: boolean;
321
+ agent_name?: string;
322
+ }
323
+ export interface StartupRecoveryState {
324
+ recovered: SymphonyPane[];
325
+ pending: StartupRecoveryIssue[];
326
+ }
327
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ // ── Agent types (from dmux registry) ──
2
+ export const AGENT_IDS = [
3
+ 'claude', 'opencode', 'codex', 'cline', 'gemini',
4
+ 'qwen', 'amp', 'pi', 'cursor', 'copilot', 'crush',
5
+ ];
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAKA,yCAAyC;AAEzC,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ;IAChD,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO;CACzC,CAAC"}
@@ -0,0 +1,14 @@
1
+ interface DuplicateReference {
2
+ kind: 'active_run' | 'claimed_issue' | 'open_pr';
3
+ title: string;
4
+ issueNumber?: number;
5
+ prNumber?: number;
6
+ }
7
+ export interface DuplicateMatch extends DuplicateReference {
8
+ overlap: string[];
9
+ score: number;
10
+ }
11
+ export declare function findDuplicateMatch(candidateTitle: string, references: DuplicateReference[]): DuplicateMatch | null;
12
+ export declare function describeDuplicateMatch(match: DuplicateMatch): string;
13
+ export {};
14
+ //# sourceMappingURL=duplicateDetection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicateDetection.d.ts","sourceRoot":"","sources":["../../src/utils/duplicateDetection.ts"],"names":[],"mappings":"AAAA,UAAU,kBAAkB;IAC1B,IAAI,EAAE,YAAY,GAAG,eAAe,GAAG,SAAS,CAAC;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAkBD,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,kBAAkB,EAAE,GAC/B,cAAc,GAAG,IAAI,CA6BvB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAOpE"}
@@ -0,0 +1,45 @@
1
+ const STOP_WORDS = new Set([
2
+ 'a', 'an', 'and', 'app', 'button', 'change', 'create', 'feature', 'fix', 'for',
3
+ 'in', 'is', 'issue', 'it', 'new', 'of', 'on', 'please', 'repo', 'task', 'test',
4
+ 'that', 'the', 'this', 'to', 'todo', 'todos', 'update', 'with',
5
+ ]);
6
+ function tokenizeTitle(title) {
7
+ const tokens = title
8
+ .toLowerCase()
9
+ .split(/[^a-z0-9]+/)
10
+ .filter(token => token.length >= 3)
11
+ .filter(token => !STOP_WORDS.has(token));
12
+ return Array.from(new Set(tokens));
13
+ }
14
+ export function findDuplicateMatch(candidateTitle, references) {
15
+ const candidateTokens = tokenizeTitle(candidateTitle);
16
+ if (candidateTokens.length === 0)
17
+ return null;
18
+ let bestMatch = null;
19
+ for (const reference of references) {
20
+ const referenceTokens = tokenizeTitle(reference.title);
21
+ if (referenceTokens.length === 0)
22
+ continue;
23
+ const overlap = candidateTokens.filter(token => referenceTokens.includes(token));
24
+ const score = overlap.length / Math.max(candidateTokens.length, referenceTokens.length);
25
+ if (overlap.length < 2 || score < 0.5) {
26
+ continue;
27
+ }
28
+ const match = {
29
+ ...reference,
30
+ overlap,
31
+ score,
32
+ };
33
+ if (!bestMatch || match.score > bestMatch.score) {
34
+ bestMatch = match;
35
+ }
36
+ }
37
+ return bestMatch;
38
+ }
39
+ export function describeDuplicateMatch(match) {
40
+ const target = match.kind === 'open_pr'
41
+ ? `open PR #${match.prNumber}`
42
+ : `issue #${match.issueNumber}`;
43
+ return `possible duplicate of ${target} (${match.title})`;
44
+ }
45
+ //# sourceMappingURL=duplicateDetection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicateDetection.js","sourceRoot":"","sources":["../../src/utils/duplicateDetection.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK;IAC9E,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAC9E,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM;CAC/D,CAAC,CAAC;AAEH,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,MAAM,GAAG,KAAK;SACjB,WAAW,EAAE;SACb,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;SAClC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IAE3C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,cAAsB,EACtB,UAAgC;IAEhC,MAAM,eAAe,GAAG,aAAa,CAAC,cAAc,CAAC,CAAC;IACtD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,IAAI,SAAS,GAA0B,IAAI,CAAC;IAE5C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAE3C,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACjF,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;QAExF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YACtC,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAmB;YAC5B,GAAG,SAAS;YACZ,OAAO;YACP,KAAK;SACN,CAAC;QAEF,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;YAChD,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAqB;IAC1D,MAAM,MAAM,GACV,KAAK,CAAC,IAAI,KAAK,SAAS;QACtB,CAAC,CAAC,YAAY,KAAK,CAAC,QAAQ,EAAE;QAC9B,CAAC,CAAC,UAAU,KAAK,CAAC,WAAW,EAAE,CAAC;IAEpC,OAAO,yBAAyB,MAAM,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,46 @@
1
+ export interface ExecResult {
2
+ stdout: string;
3
+ stderr: string;
4
+ exitCode: number;
5
+ }
6
+ /**
7
+ * Run a command and return stdout. Throws on non-zero exit.
8
+ */
9
+ export declare function run(command: string, args: string[], options?: {
10
+ cwd?: string;
11
+ env?: Record<string, string>;
12
+ timeout?: number;
13
+ }): Promise<string>;
14
+ /**
15
+ * Run a shell command string. Returns stdout. Throws on non-zero exit.
16
+ */
17
+ export declare function runShell(command: string, options?: {
18
+ cwd?: string;
19
+ env?: Record<string, string>;
20
+ timeout?: number;
21
+ }): Promise<string>;
22
+ /**
23
+ * Run a command, returning result without throwing on non-zero exit.
24
+ */
25
+ export declare function runSafe(command: string, args: string[], options?: {
26
+ cwd?: string;
27
+ env?: Record<string, string>;
28
+ timeout?: number;
29
+ }): Promise<ExecResult>;
30
+ /**
31
+ * Spawn a detached background process (fire-and-forget).
32
+ */
33
+ export declare function spawnDetached(command: string, args: string[], options?: {
34
+ cwd?: string;
35
+ env?: Record<string, string>;
36
+ }): number | undefined;
37
+ /**
38
+ * Run a command with full I/O redirection to files (for agent sessions).
39
+ */
40
+ export declare function spawnWithLogs(command: string, args: string[], options: {
41
+ cwd: string;
42
+ env?: Record<string, string>;
43
+ stdoutPath: string;
44
+ stderrPath: string;
45
+ }): import('node:child_process').ChildProcess;
46
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IACnE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBtB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE;IACvE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,GAAG,MAAM,GAAG,SAAS,CASrB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,oBAAoB,EAAE,YAAY,CAc5C"}
@@ -0,0 +1,79 @@
1
+ import { execFile, exec, spawn } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ const execFileAsync = promisify(execFile);
4
+ const execAsync = promisify(exec);
5
+ /**
6
+ * Run a command and return stdout. Throws on non-zero exit.
7
+ */
8
+ export async function run(command, args, options) {
9
+ const { stdout } = await execFileAsync(command, args, {
10
+ cwd: options?.cwd,
11
+ env: options?.env ? { ...process.env, ...options.env } : undefined,
12
+ timeout: options?.timeout,
13
+ maxBuffer: 10 * 1024 * 1024,
14
+ });
15
+ return stdout.trim();
16
+ }
17
+ /**
18
+ * Run a shell command string. Returns stdout. Throws on non-zero exit.
19
+ */
20
+ export async function runShell(command, options) {
21
+ const { stdout } = await execAsync(command, {
22
+ cwd: options?.cwd,
23
+ env: options?.env ? { ...process.env, ...options.env } : undefined,
24
+ timeout: options?.timeout,
25
+ maxBuffer: 10 * 1024 * 1024,
26
+ });
27
+ return stdout.trim();
28
+ }
29
+ /**
30
+ * Run a command, returning result without throwing on non-zero exit.
31
+ */
32
+ export async function runSafe(command, args, options) {
33
+ try {
34
+ const { stdout, stderr } = await execFileAsync(command, args, {
35
+ cwd: options?.cwd,
36
+ env: options?.env ? { ...process.env, ...options.env } : undefined,
37
+ timeout: options?.timeout,
38
+ maxBuffer: 10 * 1024 * 1024,
39
+ });
40
+ return { stdout: stdout.trim(), stderr: stderr.trim(), exitCode: 0 };
41
+ }
42
+ catch (err) {
43
+ return {
44
+ stdout: (err.stdout || '').trim(),
45
+ stderr: (err.stderr || err.message || '').trim(),
46
+ exitCode: err.code ?? 1,
47
+ };
48
+ }
49
+ }
50
+ /**
51
+ * Spawn a detached background process (fire-and-forget).
52
+ */
53
+ export function spawnDetached(command, args, options) {
54
+ const child = spawn(command, args, {
55
+ cwd: options?.cwd,
56
+ env: options?.env ? { ...process.env, ...options.env } : undefined,
57
+ detached: true,
58
+ stdio: 'ignore',
59
+ });
60
+ child.unref();
61
+ return child.pid;
62
+ }
63
+ /**
64
+ * Run a command with full I/O redirection to files (for agent sessions).
65
+ */
66
+ export function spawnWithLogs(command, args, options) {
67
+ const fs = require('node:fs');
68
+ const stdout = fs.openSync(options.stdoutPath, 'a');
69
+ const stderr = fs.openSync(options.stderrPath, 'a');
70
+ const child = spawn(command, args, {
71
+ cwd: options.cwd,
72
+ env: options.env ? { ...process.env, ...options.env } : undefined,
73
+ stdio: ['ignore', stdout, stderr],
74
+ detached: true,
75
+ });
76
+ child.unref();
77
+ return child;
78
+ }
79
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Generate a branch-safe slug from text.
3
+ */
4
+ export declare function slugify(text: string, maxLength?: number): string;
5
+ /**
6
+ * Generate a branch name from issue info.
7
+ */
8
+ export declare function issueBranchName(issueNumber: number, issueTitle: string, prefix?: string): string;
9
+ /**
10
+ * Generate a unique run ID.
11
+ */
12
+ export declare function generateRunId(repo: string, issueNumber: number): string;
13
+ //# sourceMappingURL=slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,MAAM,CAO5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAOR;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAKvE"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Generate a branch-safe slug from text.
3
+ */
4
+ export function slugify(text, maxLength = 40) {
5
+ return text
6
+ .toLowerCase()
7
+ .replace(/[^a-z0-9]+/g, '-')
8
+ .replace(/^-+|-+$/g, '')
9
+ .slice(0, maxLength)
10
+ .replace(/-+$/, '');
11
+ }
12
+ /**
13
+ * Generate a branch name from issue info.
14
+ */
15
+ export function issueBranchName(issueNumber, issueTitle, prefix) {
16
+ const slug = slugify(issueTitle, 30);
17
+ const base = `symphony/${issueNumber}-${slug}`;
18
+ if (prefix) {
19
+ return `${prefix}${base}`;
20
+ }
21
+ return base;
22
+ }
23
+ /**
24
+ * Generate a unique run ID.
25
+ */
26
+ export function generateRunId(repo, issueNumber) {
27
+ const ts = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14);
28
+ const repoSlug = repo.replace('/', '__');
29
+ const rand = Math.random().toString(36).slice(2, 8);
30
+ return `r_${ts}-${repoSlug}-${issueNumber}-${rand}`;
31
+ }
32
+ //# sourceMappingURL=slug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,SAAS,GAAG,EAAE;IAClD,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;SACnB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,WAAmB,EACnB,UAAkB,EAClB,MAAe;IAEf,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,YAAY,WAAW,IAAI,IAAI,EAAE,CAAC;IAC/C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,WAAmB;IAC7D,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,OAAO,KAAK,EAAE,IAAI,QAAQ,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,28 @@
1
+ interface VersionInfo {
2
+ current_version: string;
3
+ latest_version?: string;
4
+ last_checked_at?: string;
5
+ dismissed_version?: string;
6
+ }
7
+ /** Read the installed package version from package.json */
8
+ export declare function getInstalledVersion(): string;
9
+ /** Read cached version info from ~/.symphony/version.json */
10
+ export declare function readVersionInfo(): VersionInfo | null;
11
+ /** Write version info to ~/.symphony/version.json */
12
+ export declare function writeVersionInfo(info: VersionInfo): void;
13
+ /**
14
+ * Record the current version on startup.
15
+ * Preserves existing latest_version / dismissed_version fields.
16
+ */
17
+ export declare function recordCurrentVersion(): void;
18
+ /**
19
+ * Check npm registry for a newer version.
20
+ * Uses a 20-hour TTL to avoid hammering the registry.
21
+ * Runs synchronously but is fast (single HTTP request via npm view).
22
+ * Returns the latest version string if an update is available, null otherwise.
23
+ */
24
+ export declare function checkForUpdate(): string | null;
25
+ /** Dismiss an update so we don't nag about it again */
26
+ export declare function dismissUpdate(version: string): void;
27
+ export {};
28
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAOA,UAAU,WAAW;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,2DAA2D;AAC3D,wBAAgB,mBAAmB,IAAI,MAAM,CAO5C;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAQpD;AAED,qDAAqD;AACrD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAExD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAO3C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAuC9C;AAaD,uDAAuD;AACvD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAKnD"}