opencode-agora 0.4.1 → 0.4.3

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 (200) hide show
  1. package/README.md +54 -6
  2. package/dist/cli/app.d.ts.map +1 -1
  3. package/dist/cli/app.js +18 -0
  4. package/dist/cli/app.js.map +1 -1
  5. package/dist/cli/commands/browse.d.ts.map +1 -1
  6. package/dist/cli/commands/browse.js +1 -5
  7. package/dist/cli/commands/browse.js.map +1 -1
  8. package/dist/cli/commands/capabilities.d.ts +3 -0
  9. package/dist/cli/commands/capabilities.d.ts.map +1 -0
  10. package/dist/cli/commands/capabilities.js +146 -0
  11. package/dist/cli/commands/capabilities.js.map +1 -0
  12. package/dist/cli/commands/community.d.ts.map +1 -1
  13. package/dist/cli/commands/community.js.map +1 -1
  14. package/dist/cli/commands/curate.d.ts +9 -0
  15. package/dist/cli/commands/curate.d.ts.map +1 -0
  16. package/dist/cli/commands/curate.js +62 -0
  17. package/dist/cli/commands/curate.js.map +1 -0
  18. package/dist/cli/commands/doctor.d.ts +3 -0
  19. package/dist/cli/commands/doctor.d.ts.map +1 -0
  20. package/dist/cli/commands/doctor.js +77 -0
  21. package/dist/cli/commands/doctor.js.map +1 -0
  22. package/dist/cli/commands/export.d.ts.map +1 -1
  23. package/dist/cli/commands/export.js +5 -3
  24. package/dist/cli/commands/export.js.map +1 -1
  25. package/dist/cli/commands/freeze.d.ts +3 -0
  26. package/dist/cli/commands/freeze.d.ts.map +1 -0
  27. package/dist/cli/commands/freeze.js +62 -0
  28. package/dist/cli/commands/freeze.js.map +1 -0
  29. package/dist/cli/commands/init.d.ts.map +1 -1
  30. package/dist/cli/commands/init.js +5 -1
  31. package/dist/cli/commands/init.js.map +1 -1
  32. package/dist/cli/commands/installed.d.ts +3 -0
  33. package/dist/cli/commands/installed.d.ts.map +1 -0
  34. package/dist/cli/commands/installed.js +82 -0
  35. package/dist/cli/commands/installed.js.map +1 -0
  36. package/dist/cli/commands/marketplace.d.ts.map +1 -1
  37. package/dist/cli/commands/marketplace.js.map +1 -1
  38. package/dist/cli/commands/notify.d.ts.map +1 -1
  39. package/dist/cli/commands/notify.js.map +1 -1
  40. package/dist/cli/commands/operations.d.ts.map +1 -1
  41. package/dist/cli/commands/operations.js +103 -5
  42. package/dist/cli/commands/operations.js.map +1 -1
  43. package/dist/cli/commands/outdated.d.ts +3 -0
  44. package/dist/cli/commands/outdated.d.ts.map +1 -0
  45. package/dist/cli/commands/outdated.js +48 -0
  46. package/dist/cli/commands/outdated.js.map +1 -0
  47. package/dist/cli/commands/ping.js +2 -1
  48. package/dist/cli/commands/ping.js.map +1 -1
  49. package/dist/cli/commands/scan.d.ts +3 -0
  50. package/dist/cli/commands/scan.d.ts.map +1 -0
  51. package/dist/cli/commands/scan.js +35 -0
  52. package/dist/cli/commands/scan.js.map +1 -0
  53. package/dist/cli/commands/sync.d.ts +3 -0
  54. package/dist/cli/commands/sync.d.ts.map +1 -0
  55. package/dist/cli/commands/sync.js +172 -0
  56. package/dist/cli/commands/sync.js.map +1 -0
  57. package/dist/cli/commands/today.d.ts.map +1 -1
  58. package/dist/cli/commands/today.js +11 -3
  59. package/dist/cli/commands/today.js.map +1 -1
  60. package/dist/cli/commands/try.d.ts +3 -0
  61. package/dist/cli/commands/try.d.ts.map +1 -0
  62. package/dist/cli/commands/try.js +157 -0
  63. package/dist/cli/commands/try.js.map +1 -0
  64. package/dist/cli/commands/watch.d.ts.map +1 -1
  65. package/dist/cli/commands/watch.js.map +1 -1
  66. package/dist/cli/commands/welcome.d.ts.map +1 -1
  67. package/dist/cli/commands/welcome.js +6 -27
  68. package/dist/cli/commands/welcome.js.map +1 -1
  69. package/dist/cli/commands-meta.d.ts +1 -1
  70. package/dist/cli/commands-meta.d.ts.map +1 -1
  71. package/dist/cli/commands-meta.js +242 -12
  72. package/dist/cli/commands-meta.js.map +1 -1
  73. package/dist/cli/completions-gen.d.ts.map +1 -1
  74. package/dist/cli/completions-gen.js +130 -52
  75. package/dist/cli/completions-gen.js.map +1 -1
  76. package/dist/cli/flags.d.ts.map +1 -1
  77. package/dist/cli/flags.js +7 -0
  78. package/dist/cli/flags.js.map +1 -1
  79. package/dist/cli/format.js +1 -1
  80. package/dist/cli/format.js.map +1 -1
  81. package/dist/cli/helpers.d.ts.map +1 -1
  82. package/dist/cli/helpers.js.map +1 -1
  83. package/dist/cli/mcp-server.d.ts +12 -1
  84. package/dist/cli/mcp-server.d.ts.map +1 -1
  85. package/dist/cli/mcp-server.js +292 -2
  86. package/dist/cli/mcp-server.js.map +1 -1
  87. package/dist/cli/pages/community.d.ts.map +1 -1
  88. package/dist/cli/pages/community.js +5 -8
  89. package/dist/cli/pages/community.js.map +1 -1
  90. package/dist/cli/pages/home.d.ts.map +1 -1
  91. package/dist/cli/pages/home.js +22 -8
  92. package/dist/cli/pages/home.js.map +1 -1
  93. package/dist/cli/pages/marketplace.d.ts.map +1 -1
  94. package/dist/cli/pages/marketplace.js +68 -7
  95. package/dist/cli/pages/marketplace.js.map +1 -1
  96. package/dist/cli/pages/news.d.ts.map +1 -1
  97. package/dist/cli/pages/news.js +2 -2
  98. package/dist/cli/pages/news.js.map +1 -1
  99. package/dist/cli/pages/stack.d.ts +3 -0
  100. package/dist/cli/pages/stack.d.ts.map +1 -0
  101. package/dist/cli/pages/stack.js +373 -0
  102. package/dist/cli/pages/stack.js.map +1 -0
  103. package/dist/cli/pages/types.d.ts +1 -1
  104. package/dist/cli/pages/types.d.ts.map +1 -1
  105. package/dist/cli/shell.d.ts +1 -1
  106. package/dist/cli/shell.d.ts.map +1 -1
  107. package/dist/cli/shell.js +70 -4
  108. package/dist/cli/shell.js.map +1 -1
  109. package/dist/cli/tui.d.ts.map +1 -1
  110. package/dist/cli/tui.js +14 -4
  111. package/dist/cli/tui.js.map +1 -1
  112. package/dist/community/client.d.ts.map +1 -1
  113. package/dist/community/client.js +3 -1
  114. package/dist/community/client.js.map +1 -1
  115. package/dist/curator/index.d.ts +95 -0
  116. package/dist/curator/index.d.ts.map +1 -0
  117. package/dist/curator/index.js +446 -0
  118. package/dist/curator/index.js.map +1 -0
  119. package/dist/format.d.ts +0 -2
  120. package/dist/format.d.ts.map +1 -1
  121. package/dist/format.js +0 -2
  122. package/dist/format.js.map +1 -1
  123. package/dist/hubs/enrichment.d.ts.map +1 -1
  124. package/dist/hubs/enrichment.js.map +1 -1
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +3 -1
  127. package/dist/index.js.map +1 -1
  128. package/dist/live.js +7 -1
  129. package/dist/live.js.map +1 -1
  130. package/dist/marketplace.d.ts +2 -1
  131. package/dist/marketplace.d.ts.map +1 -1
  132. package/dist/marketplace.js +86 -17
  133. package/dist/marketplace.js.map +1 -1
  134. package/dist/outdated.d.ts +24 -0
  135. package/dist/outdated.d.ts.map +1 -0
  136. package/dist/outdated.js +74 -0
  137. package/dist/outdated.js.map +1 -0
  138. package/dist/scan.d.ts +26 -0
  139. package/dist/scan.d.ts.map +1 -0
  140. package/dist/scan.js +247 -0
  141. package/dist/scan.js.map +1 -0
  142. package/dist/search/catalog-index.d.ts +107 -0
  143. package/dist/search/catalog-index.d.ts.map +1 -0
  144. package/dist/search/catalog-index.js +276 -0
  145. package/dist/search/catalog-index.js.map +1 -0
  146. package/dist/stack/adapters/claude-code.d.ts +3 -0
  147. package/dist/stack/adapters/claude-code.d.ts.map +1 -0
  148. package/dist/stack/adapters/claude-code.js +282 -0
  149. package/dist/stack/adapters/claude-code.js.map +1 -0
  150. package/dist/stack/adapters/cursor.d.ts +3 -0
  151. package/dist/stack/adapters/cursor.d.ts.map +1 -0
  152. package/dist/stack/adapters/cursor.js +232 -0
  153. package/dist/stack/adapters/cursor.js.map +1 -0
  154. package/dist/stack/adapters/opencode.d.ts +3 -0
  155. package/dist/stack/adapters/opencode.d.ts.map +1 -0
  156. package/dist/stack/adapters/opencode.js +177 -0
  157. package/dist/stack/adapters/opencode.js.map +1 -0
  158. package/dist/stack/adapters/windsurf.d.ts +3 -0
  159. package/dist/stack/adapters/windsurf.d.ts.map +1 -0
  160. package/dist/stack/adapters/windsurf.js +218 -0
  161. package/dist/stack/adapters/windsurf.js.map +1 -0
  162. package/dist/stack/capability-cache.d.ts +19 -0
  163. package/dist/stack/capability-cache.d.ts.map +1 -0
  164. package/dist/stack/capability-cache.js +41 -0
  165. package/dist/stack/capability-cache.js.map +1 -0
  166. package/dist/stack/doctor.d.ts +30 -0
  167. package/dist/stack/doctor.d.ts.map +1 -0
  168. package/dist/stack/doctor.js +227 -0
  169. package/dist/stack/doctor.js.map +1 -0
  170. package/dist/stack/manifest.d.ts +40 -0
  171. package/dist/stack/manifest.d.ts.map +1 -0
  172. package/dist/stack/manifest.js +342 -0
  173. package/dist/stack/manifest.js.map +1 -0
  174. package/dist/stack/mcp-probe.d.ts +23 -0
  175. package/dist/stack/mcp-probe.d.ts.map +1 -0
  176. package/dist/stack/mcp-probe.js +230 -0
  177. package/dist/stack/mcp-probe.js.map +1 -0
  178. package/dist/stack/path-resolve.d.ts +7 -0
  179. package/dist/stack/path-resolve.d.ts.map +1 -0
  180. package/dist/stack/path-resolve.js +37 -0
  181. package/dist/stack/path-resolve.js.map +1 -0
  182. package/dist/stack/registry.d.ts +11 -0
  183. package/dist/stack/registry.d.ts.map +1 -0
  184. package/dist/stack/registry.js +42 -0
  185. package/dist/stack/registry.js.map +1 -0
  186. package/dist/stack/sync.d.ts +20 -0
  187. package/dist/stack/sync.d.ts.map +1 -0
  188. package/dist/stack/sync.js +226 -0
  189. package/dist/stack/sync.js.map +1 -0
  190. package/dist/stack/types.d.ts +53 -0
  191. package/dist/stack/types.d.ts.map +1 -0
  192. package/dist/stack/types.js +2 -0
  193. package/dist/stack/types.js.map +1 -0
  194. package/dist/transcript.d.ts +14 -0
  195. package/dist/transcript.d.ts.map +1 -1
  196. package/dist/transcript.js +98 -1
  197. package/dist/transcript.js.map +1 -1
  198. package/dist/types.d.ts +4 -0
  199. package/dist/types.d.ts.map +1 -1
  200. package/package.json +5 -2
@@ -0,0 +1,23 @@
1
+ export interface McpTool {
2
+ name: string;
3
+ description?: string;
4
+ }
5
+ export interface McpProbeResult {
6
+ ok: boolean;
7
+ serverInfo?: {
8
+ name?: string;
9
+ version?: string;
10
+ };
11
+ capabilities?: unknown;
12
+ tools?: McpTool[];
13
+ error?: string;
14
+ stderr?: string;
15
+ exitCode?: number | null;
16
+ durationMs?: number;
17
+ }
18
+ export declare function probeMcpServer(command: string[], opts?: {
19
+ env?: Record<string, string | undefined>;
20
+ cwd?: string;
21
+ timeoutMs?: number;
22
+ }): Promise<McpProbeResult>;
23
+ //# sourceMappingURL=mcp-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-probe.d.ts","sourceRoot":"","sources":["../../src/stack/mcp-probe.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAmBD,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,CAAC,EAAE;IACL,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,cAAc,CAAC,CAyNzB"}
@@ -0,0 +1,230 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ let _pkgVersion;
4
+ function getPkgVersion() {
5
+ if (_pkgVersion !== undefined)
6
+ return _pkgVersion;
7
+ try {
8
+ const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
9
+ _pkgVersion = pkg.version ?? '0';
10
+ }
11
+ catch {
12
+ _pkgVersion = '0';
13
+ }
14
+ return _pkgVersion;
15
+ }
16
+ const STDERR_CAP = 4000;
17
+ function appendStderr(buf, chunk) {
18
+ const combined = buf + chunk;
19
+ if (combined.length <= STDERR_CAP)
20
+ return combined;
21
+ // Keep the tail
22
+ return combined.slice(combined.length - STDERR_CAP);
23
+ }
24
+ function stderrSnippet(buf) {
25
+ const trimmed = buf.trimEnd();
26
+ if (!trimmed)
27
+ return '';
28
+ // Last ~200 chars, collapsed to a single line
29
+ const tail = trimmed.length > 200 ? trimmed.slice(trimmed.length - 200) : trimmed;
30
+ return tail.replace(/\r?\n/g, ' ').trim();
31
+ }
32
+ export async function probeMcpServer(command, opts) {
33
+ const timeoutMs = opts?.timeoutMs ?? 15000;
34
+ const startMs = Date.now();
35
+ const mergedEnv = {};
36
+ for (const [k, v] of Object.entries(process.env)) {
37
+ if (v !== undefined)
38
+ mergedEnv[k] = v;
39
+ }
40
+ if (opts?.env) {
41
+ for (const [k, v] of Object.entries(opts.env)) {
42
+ if (v !== undefined)
43
+ mergedEnv[k] = v;
44
+ }
45
+ }
46
+ return new Promise((resolveOuter) => {
47
+ let settled = false;
48
+ let timer = null;
49
+ let currentStage = 'initialize';
50
+ const child = spawn(command[0], command.slice(1), {
51
+ stdio: ['pipe', 'pipe', 'pipe'],
52
+ shell: false,
53
+ env: mergedEnv,
54
+ cwd: opts?.cwd
55
+ });
56
+ // Pending RPC handlers keyed by message id
57
+ const pending = new Map();
58
+ // Partial line buffer for stdout
59
+ let lineBuffer = '';
60
+ // Bounded stderr capture (tail up to STDERR_CAP chars)
61
+ let stderrBuf = '';
62
+ function durationMs() {
63
+ return Date.now() - startMs;
64
+ }
65
+ function cleanup() {
66
+ if (timer !== null) {
67
+ clearTimeout(timer);
68
+ timer = null;
69
+ }
70
+ try {
71
+ child.kill('SIGTERM');
72
+ // Give it a short grace period then SIGKILL
73
+ setTimeout(() => {
74
+ try {
75
+ child.kill('SIGKILL');
76
+ }
77
+ catch {
78
+ // already dead
79
+ }
80
+ }, 300);
81
+ }
82
+ catch {
83
+ // already dead
84
+ }
85
+ }
86
+ function resolve(result) {
87
+ if (settled)
88
+ return;
89
+ settled = true;
90
+ cleanup();
91
+ const capturedStderr = stderrBuf.trimEnd();
92
+ const withStderr = {
93
+ ...result,
94
+ durationMs: durationMs(),
95
+ ...(capturedStderr ? { stderr: capturedStderr } : {})
96
+ };
97
+ resolveOuter(withStderr);
98
+ }
99
+ // Capture stderr (bounded)
100
+ child.stderr.on('data', (chunk) => {
101
+ stderrBuf = appendStderr(stderrBuf, chunk.toString('utf8'));
102
+ });
103
+ // Set overall timeout
104
+ timer = setTimeout(() => {
105
+ const snippet = stderrSnippet(stderrBuf);
106
+ const base = `timed out waiting for ${currentStage}`;
107
+ resolve({ ok: false, error: snippet ? `${base} — stderr: ${snippet}` : base });
108
+ }, timeoutMs);
109
+ child.on('error', (err) => {
110
+ const snippet = stderrSnippet(stderrBuf);
111
+ resolve({ ok: false, error: snippet ? `${err.message} — stderr: ${snippet}` : err.message });
112
+ });
113
+ child.on('close', (code) => {
114
+ if (!settled) {
115
+ const snippet = stderrSnippet(stderrBuf);
116
+ const base = 'server exited';
117
+ resolve({
118
+ ok: false,
119
+ error: snippet ? `${base} — stderr: ${snippet}` : base,
120
+ exitCode: code
121
+ });
122
+ }
123
+ });
124
+ // Parse stdout as newline-delimited JSON
125
+ child.stdout.on('data', (chunk) => {
126
+ lineBuffer += chunk.toString('utf8');
127
+ const lines = lineBuffer.split('\n');
128
+ // Keep the last (potentially incomplete) segment
129
+ lineBuffer = lines.pop() ?? '';
130
+ for (const line of lines) {
131
+ const trimmed = line.trim();
132
+ if (!trimmed)
133
+ continue;
134
+ let msg;
135
+ try {
136
+ msg = JSON.parse(trimmed);
137
+ }
138
+ catch {
139
+ // Not JSON (e.g. server debug output) — ignore
140
+ continue;
141
+ }
142
+ if (typeof msg !== 'object' || msg === null)
143
+ continue;
144
+ const record = msg;
145
+ const id = record.id;
146
+ if (typeof id === 'number' && pending.has(id)) {
147
+ const handler = pending.get(id);
148
+ pending.delete(id);
149
+ handler(msg);
150
+ }
151
+ }
152
+ });
153
+ function writeMsg(msg) {
154
+ const line = JSON.stringify(msg) + '\n';
155
+ child.stdin.write(line);
156
+ }
157
+ // ── Handshake ────────────────────────────────────────────────────────────
158
+ function awaitResponse(id) {
159
+ return new Promise((res) => {
160
+ pending.set(id, (msg) => res(msg));
161
+ });
162
+ }
163
+ async function handshake() {
164
+ // 1. Send initialize
165
+ currentStage = 'initialize';
166
+ writeMsg({
167
+ jsonrpc: '2.0',
168
+ id: 1,
169
+ method: 'initialize',
170
+ params: {
171
+ protocolVersion: '2024-11-05',
172
+ capabilities: {},
173
+ clientInfo: { name: 'agora', version: getPkgVersion() }
174
+ }
175
+ });
176
+ const initResp = await awaitResponse(1);
177
+ if (settled)
178
+ return;
179
+ if (initResp.error) {
180
+ const rpcErr = initResp.error;
181
+ const errMsg = typeof rpcErr === 'object' && rpcErr !== null
182
+ ? (rpcErr.message ?? JSON.stringify(rpcErr))
183
+ : String(rpcErr);
184
+ resolve({ ok: false, error: errMsg });
185
+ return;
186
+ }
187
+ const result = (initResp.result ?? {});
188
+ const serverInfo = result.serverInfo;
189
+ const capabilities = result.capabilities;
190
+ // 2. Send initialized notification (no id)
191
+ currentStage = 'initialized notification';
192
+ writeMsg({ jsonrpc: '2.0', method: 'notifications/initialized' });
193
+ // 3. Request tools/list
194
+ currentStage = 'tools/list';
195
+ writeMsg({ jsonrpc: '2.0', id: 2, method: 'tools/list', params: {} });
196
+ const toolsResp = await awaitResponse(2);
197
+ if (settled)
198
+ return;
199
+ if (toolsResp.error) {
200
+ // Initialize succeeded; tools/list failed — server is still usable
201
+ const rpcErr = toolsResp.error;
202
+ const errMsg = typeof rpcErr === 'object' && rpcErr !== null
203
+ ? (rpcErr.message ?? JSON.stringify(rpcErr))
204
+ : String(rpcErr);
205
+ resolve({ ok: true, serverInfo, capabilities, tools: [], error: errMsg });
206
+ return;
207
+ }
208
+ const toolsResult = (toolsResp.result ?? {});
209
+ const rawTools = Array.isArray(toolsResult.tools) ? toolsResult.tools : [];
210
+ const tools = rawTools.map((t) => {
211
+ const tool = t;
212
+ return {
213
+ name: typeof tool.name === 'string' ? tool.name : '(unknown)',
214
+ ...(typeof tool.description === 'string' ? { description: tool.description } : {})
215
+ };
216
+ });
217
+ resolve({ ok: true, serverInfo, capabilities, tools });
218
+ }
219
+ // Start handshake; any thrown error becomes a failure
220
+ handshake().catch((err) => {
221
+ if (!settled) {
222
+ resolve({
223
+ ok: false,
224
+ error: err instanceof Error ? err.message : String(err)
225
+ });
226
+ }
227
+ });
228
+ });
229
+ }
230
+ //# sourceMappingURL=mcp-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-probe.js","sourceRoot":"","sources":["../../src/stack/mcp-probe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const KNOWN_RUNNERS: Set<string>;
2
+ /**
3
+ * Returns the absolute path of `command` if found by scanning PATH dirs,
4
+ * else null. Respects PATHEXT on win32. Reads env.PATH or process.env.PATH.
5
+ */
6
+ export declare function resolveOnPath(command: string, env?: Record<string, string | undefined>): string | null;
7
+ //# sourceMappingURL=path-resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-resolve.d.ts","sourceRoot":"","sources":["../../src/stack/path-resolve.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,aASxB,CAAC;AAEH;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACvC,MAAM,GAAG,IAAI,CAwBf"}
@@ -0,0 +1,37 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export const KNOWN_RUNNERS = new Set([
4
+ 'npx',
5
+ 'bunx',
6
+ 'uvx',
7
+ 'node',
8
+ 'python',
9
+ 'python3',
10
+ 'deno',
11
+ 'uv'
12
+ ]);
13
+ /**
14
+ * Returns the absolute path of `command` if found by scanning PATH dirs,
15
+ * else null. Respects PATHEXT on win32. Reads env.PATH or process.env.PATH.
16
+ */
17
+ export function resolveOnPath(command, env) {
18
+ // If already an absolute path, just check existence
19
+ if (command.startsWith('/') || command.startsWith('\\')) {
20
+ return existsSync(command) ? command : null;
21
+ }
22
+ const pathEnv = (env?.PATH ?? process.env.PATH) || '';
23
+ const dirs = pathEnv.split(process.platform === 'win32' ? ';' : ':').filter(Boolean);
24
+ const extensions = process.platform === 'win32'
25
+ ? (process.env.PATHEXT || '.EXE;.CMD;.BAT').split(';').map((e) => e.toLowerCase())
26
+ : [''];
27
+ for (const dir of dirs) {
28
+ for (const ext of extensions) {
29
+ const candidate = join(dir, command + ext);
30
+ if (existsSync(candidate)) {
31
+ return candidate;
32
+ }
33
+ }
34
+ }
35
+ return null;
36
+ }
37
+ //# sourceMappingURL=path-resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-resolve.js","sourceRoot":"","sources":["../../src/stack/path-resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IACnC,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,IAAI;CACL,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,GAAwC;IAExC,oDAAoD;IACpD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9C,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAErF,MAAM,UAAU,GACd,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC1B,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAClF,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEX,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,CAAC,CAAC;YAC3C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { AgentToolId, ConfiguredServer, StackEnv, ToolAdapter, ToolConfigLocation } from './types.js';
2
+ export declare const ALL_ADAPTERS: ToolAdapter[];
3
+ export declare function getAdapter(id: AgentToolId): ToolAdapter | undefined;
4
+ export declare function detectTools(opts: StackEnv): {
5
+ adapter: ToolAdapter;
6
+ locations: ToolConfigLocation[];
7
+ present: boolean;
8
+ }[];
9
+ export declare function readAllServers(opts: StackEnv): ConfiguredServer[];
10
+ export declare function groupServersByName(servers: ConfiguredServer[]): Map<string, ConfiguredServer[]>;
11
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/stack/registry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,YAAY,EAAE,WAAW,EAKrC,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,CAEnE;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,GACb;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,EAAE,CAM/E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,EAAE,CAMjE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAW/F"}
@@ -0,0 +1,42 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { opencodeAdapter } from './adapters/opencode.js';
3
+ import { claudeCodeAdapter } from './adapters/claude-code.js';
4
+ import { cursorAdapter } from './adapters/cursor.js';
5
+ import { windsurfAdapter } from './adapters/windsurf.js';
6
+ export const ALL_ADAPTERS = [
7
+ opencodeAdapter,
8
+ claudeCodeAdapter,
9
+ cursorAdapter,
10
+ windsurfAdapter
11
+ ];
12
+ export function getAdapter(id) {
13
+ return ALL_ADAPTERS.find((a) => a.id === id);
14
+ }
15
+ export function detectTools(opts) {
16
+ return ALL_ADAPTERS.map((adapter) => {
17
+ const locations = adapter.locations(opts);
18
+ const present = locations.some((loc) => existsSync(loc.path));
19
+ return { adapter, locations, present };
20
+ });
21
+ }
22
+ export function readAllServers(opts) {
23
+ const results = [];
24
+ for (const adapter of ALL_ADAPTERS) {
25
+ results.push(...adapter.readServers(opts));
26
+ }
27
+ return results;
28
+ }
29
+ export function groupServersByName(servers) {
30
+ const map = new Map();
31
+ for (const server of servers) {
32
+ const existing = map.get(server.name);
33
+ if (existing) {
34
+ existing.push(server);
35
+ }
36
+ else {
37
+ map.set(server.name, [server]);
38
+ }
39
+ }
40
+ return map;
41
+ }
42
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/stack/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AASzD,MAAM,CAAC,MAAM,YAAY,GAAkB;IACzC,eAAe;IACf,iBAAiB;IACjB,aAAa;IACb,eAAe;CAChB,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,EAAe;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,IAAc;IAEd,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAc;IAC3C,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA2B;IAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,EAA8B,CAAC;IAClD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { AgentToolId, StackEnv, SyncChange, ToolConfigLocation } from './types.js';
2
+ import type { StackManifest } from './manifest.js';
3
+ export interface ToolSyncPlan {
4
+ tool: AgentToolId;
5
+ location: ToolConfigLocation | null;
6
+ change: SyncChange;
7
+ skipped: {
8
+ name: string;
9
+ reason: string;
10
+ }[];
11
+ }
12
+ /**
13
+ * PURE / read-only: compute what would change for each target tool without writing.
14
+ */
15
+ export declare function planSync(manifest: StackManifest, opts: StackEnv, targets: AgentToolId[], scope: 'project' | 'user', prune: boolean): ToolSyncPlan[];
16
+ /**
17
+ * Apply the sync — calls each adapter's writeServers and returns actually-applied changes.
18
+ */
19
+ export declare function applySync(manifest: StackManifest, opts: StackEnv, targets: AgentToolId[], scope: 'project' | 'user', prune: boolean): ToolSyncPlan[];
20
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/stack/sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EAEX,QAAQ,EACR,UAAU,EACV,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,eAAe,CAAC;AAIlE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7C;AAuKD;;GAEG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,WAAW,EAAE,EACtB,KAAK,EAAE,SAAS,GAAG,MAAM,EACzB,KAAK,EAAE,OAAO,GACb,YAAY,EAAE,CAwBhB;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,WAAW,EAAE,EACtB,KAAK,EAAE,SAAS,GAAG,MAAM,EACzB,KAAK,EAAE,OAAO,GACb,YAAY,EAAE,CAwChB"}
@@ -0,0 +1,226 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { getAdapter } from './registry.js';
3
+ // ── Helpers ───────────────────────────────────────────────────────────────────
4
+ function manifestEntryToDesired(name, entry) {
5
+ const ds = { name };
6
+ if (entry.command)
7
+ ds.command = entry.command;
8
+ if (entry.url)
9
+ ds.url = entry.url;
10
+ if (entry.env && Object.keys(entry.env).length > 0)
11
+ ds.env = entry.env;
12
+ if (entry.enabled === false)
13
+ ds.enabled = false;
14
+ return ds;
15
+ }
16
+ function manifestToDesired(manifest) {
17
+ return Object.entries(manifest.mcp).map(([name, entry]) => manifestEntryToDesired(name, entry));
18
+ }
19
+ /**
20
+ * Compute a diff between the current on-disk MCP config and the desired
21
+ * servers WITHOUT writing anything.
22
+ */
23
+ function computeDiff(filePath, tool, desired, prune) {
24
+ const skipped = [];
25
+ // Determine which desired entries are "writable" for this tool
26
+ const needsEnabled = tool === 'opencode';
27
+ const writableDesired = [];
28
+ for (const ds of desired) {
29
+ if (ds.enabled === false && !needsEnabled) {
30
+ skipped.push({
31
+ name: ds.name,
32
+ reason: `${tool} does not support disabled servers; skipped`
33
+ });
34
+ }
35
+ else {
36
+ writableDesired.push(ds);
37
+ }
38
+ }
39
+ // Read existing MCP container
40
+ let existingMcp = {};
41
+ if (existsSync(filePath)) {
42
+ const raw = readFileSync(filePath, 'utf8');
43
+ let parsed;
44
+ try {
45
+ parsed = JSON.parse(raw);
46
+ }
47
+ catch {
48
+ // Can't diff an unparseable file — report as empty
49
+ parsed = {};
50
+ }
51
+ if (typeof parsed === 'object' && parsed !== null) {
52
+ const doc = parsed;
53
+ const mcpKey = tool === 'opencode' ? 'mcp' : 'mcpServers';
54
+ const mcpVal = doc[mcpKey];
55
+ if (typeof mcpVal === 'object' && mcpVal !== null) {
56
+ existingMcp = mcpVal;
57
+ }
58
+ }
59
+ }
60
+ const added = [];
61
+ const updated = [];
62
+ const removed = [];
63
+ const desiredMap = new Map(writableDesired.map((d) => [d.name, d]));
64
+ for (const ds of writableDesired) {
65
+ const existing = existingMcp[ds.name];
66
+ if (existing === undefined) {
67
+ added.push(ds.name);
68
+ }
69
+ else {
70
+ // Check if it differs — build the would-be new entry and compare
71
+ const newEntry = buildEntry(tool, ds, existing);
72
+ if (JSON.stringify(existing) !== JSON.stringify(newEntry)) {
73
+ updated.push(ds.name);
74
+ }
75
+ }
76
+ }
77
+ if (prune) {
78
+ for (const name of Object.keys(existingMcp)) {
79
+ if (!desiredMap.has(name)) {
80
+ removed.push(name);
81
+ }
82
+ }
83
+ }
84
+ return { change: { added, updated, removed }, skipped };
85
+ }
86
+ const REMOTE_TYPES = new Set(['sse', 'http', 'streamable-http']);
87
+ const LOCAL_TYPES = new Set(['stdio']);
88
+ /**
89
+ * Build what the new entry would look like for comparison purposes.
90
+ * Mirrors the merge logic in each adapter: starts from existingRaw, applies
91
+ * managed fields, removes keys that no longer apply.
92
+ */
93
+ function buildEntry(tool, ds, existingRaw) {
94
+ if (tool === 'opencode') {
95
+ const base = { ...existingRaw };
96
+ if (ds.url) {
97
+ base['type'] = 'remote';
98
+ base['url'] = ds.url;
99
+ delete base['command'];
100
+ delete base['environment'];
101
+ }
102
+ else {
103
+ base['type'] = 'local';
104
+ base['command'] = ds.command ?? [];
105
+ if (ds.env && Object.keys(ds.env).length > 0) {
106
+ base['environment'] = ds.env;
107
+ }
108
+ else {
109
+ delete base['environment'];
110
+ }
111
+ delete base['url'];
112
+ }
113
+ if (ds.enabled === false) {
114
+ base['enabled'] = false;
115
+ }
116
+ else {
117
+ delete base['enabled'];
118
+ }
119
+ return base;
120
+ }
121
+ // claude-code, cursor, windsurf — same merge format
122
+ const base = { ...existingRaw };
123
+ if (ds.url) {
124
+ base['url'] = ds.url;
125
+ delete base['command'];
126
+ delete base['args'];
127
+ delete base['env'];
128
+ const t = typeof base['type'] === 'string' ? base['type'] : undefined;
129
+ if (t && LOCAL_TYPES.has(t))
130
+ delete base['type'];
131
+ const tr = typeof base['transport'] === 'string' ? base['transport'] : undefined;
132
+ if (tr && LOCAL_TYPES.has(tr))
133
+ delete base['transport'];
134
+ }
135
+ else {
136
+ const [cmd, ...args] = ds.command ?? [];
137
+ base['command'] = cmd ?? '';
138
+ if (args.length > 0) {
139
+ base['args'] = args;
140
+ }
141
+ else {
142
+ delete base['args'];
143
+ }
144
+ if (ds.env && Object.keys(ds.env).length > 0) {
145
+ base['env'] = ds.env;
146
+ }
147
+ else {
148
+ delete base['env'];
149
+ }
150
+ delete base['url'];
151
+ const t = typeof base['type'] === 'string' ? base['type'] : undefined;
152
+ if (t && REMOTE_TYPES.has(t))
153
+ delete base['type'];
154
+ const tr = typeof base['transport'] === 'string' ? base['transport'] : undefined;
155
+ if (tr && REMOTE_TYPES.has(tr))
156
+ delete base['transport'];
157
+ }
158
+ return base;
159
+ }
160
+ // ── Public API ────────────────────────────────────────────────────────────────
161
+ /**
162
+ * PURE / read-only: compute what would change for each target tool without writing.
163
+ */
164
+ export function planSync(manifest, opts, targets, scope, prune) {
165
+ const desired = manifestToDesired(manifest);
166
+ const plans = [];
167
+ for (const toolId of targets) {
168
+ const adapter = getAdapter(toolId);
169
+ if (!adapter)
170
+ continue;
171
+ const location = adapter.writeLocation(opts, scope);
172
+ if (location === null) {
173
+ plans.push({
174
+ tool: toolId,
175
+ location: null,
176
+ change: { added: [], updated: [], removed: [] },
177
+ skipped: [{ name: '*', reason: `${toolId} has no ${scope} config location` }]
178
+ });
179
+ continue;
180
+ }
181
+ const { change, skipped } = computeDiff(location.path, toolId, desired, prune);
182
+ plans.push({ tool: toolId, location, change, skipped });
183
+ }
184
+ return plans;
185
+ }
186
+ /**
187
+ * Apply the sync — calls each adapter's writeServers and returns actually-applied changes.
188
+ */
189
+ export function applySync(manifest, opts, targets, scope, prune) {
190
+ const desired = manifestToDesired(manifest);
191
+ const results = [];
192
+ for (const toolId of targets) {
193
+ const adapter = getAdapter(toolId);
194
+ if (!adapter)
195
+ continue;
196
+ const location = adapter.writeLocation(opts, scope);
197
+ if (location === null) {
198
+ results.push({
199
+ tool: toolId,
200
+ location: null,
201
+ change: { added: [], updated: [], removed: [] },
202
+ skipped: [{ name: '*', reason: `${toolId} has no ${scope} config location` }]
203
+ });
204
+ continue;
205
+ }
206
+ // Separate skipped (disabled on tools that can't represent them) from writable
207
+ const needsEnabled = toolId === 'opencode';
208
+ const skipped = [];
209
+ const writableDesired = [];
210
+ for (const ds of desired) {
211
+ if (ds.enabled === false && !needsEnabled) {
212
+ skipped.push({
213
+ name: ds.name,
214
+ reason: `${toolId} does not support disabled servers; skipped`
215
+ });
216
+ }
217
+ else {
218
+ writableDesired.push(ds);
219
+ }
220
+ }
221
+ const change = adapter.writeServers(location, writableDesired, { prune });
222
+ results.push({ tool: toolId, location, change, skipped });
223
+ }
224
+ return results;
225
+ }
226
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/stack/sync.ts"],"names":[],"mappings":"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"}