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,227 @@
1
+ import { KNOWN_RUNNERS, resolveOnPath } from './path-resolve.js';
2
+ import { probeMcpServer } from './mcp-probe.js';
3
+ import { upsertCapabilities, capabilityKey } from './capability-cache.js';
4
+ function deriveStatus(checks) {
5
+ if (checks.some((c) => !c.ok && c.level === 'error'))
6
+ return 'error';
7
+ if (checks.some((c) => !c.ok && c.level === 'warn'))
8
+ return 'warn';
9
+ return 'ok';
10
+ }
11
+ function checkCommandResolvable(instances, opts) {
12
+ // Only applies to local transports
13
+ const localInstances = instances.filter((s) => s.transport === 'local');
14
+ if (localInstances.length === 0)
15
+ return null;
16
+ const pathEnv = opts?.env;
17
+ for (const inst of localInstances) {
18
+ const argv = inst.command ?? [];
19
+ if (argv.length === 0) {
20
+ return {
21
+ name: 'command-resolvable',
22
+ ok: false,
23
+ level: 'error',
24
+ detail: `${inst.tool}: command is empty`
25
+ };
26
+ }
27
+ const token = argv[0];
28
+ const resolved = resolveOnPath(token, pathEnv);
29
+ if (!resolved) {
30
+ return {
31
+ name: 'command-resolvable',
32
+ ok: false,
33
+ level: 'error',
34
+ detail: `${inst.tool}: '${token}' not found on PATH`
35
+ };
36
+ }
37
+ // If the token is a known runner, require a non-flag package/script arg
38
+ if (KNOWN_RUNNERS.has(token)) {
39
+ const hasNonFlagArg = argv.slice(1).some((a) => !a.startsWith('-'));
40
+ if (!hasNonFlagArg) {
41
+ return {
42
+ name: 'command-resolvable',
43
+ ok: false,
44
+ level: 'error',
45
+ detail: `${inst.tool}: runner '${token}' has no package/script argument`
46
+ };
47
+ }
48
+ }
49
+ }
50
+ return { name: 'command-resolvable', ok: true, level: 'error' };
51
+ }
52
+ function checkRemoteUrl(instances) {
53
+ const remoteInstances = instances.filter((s) => s.transport === 'remote');
54
+ if (remoteInstances.length === 0)
55
+ return null;
56
+ for (const inst of remoteInstances) {
57
+ if (!inst.url) {
58
+ return {
59
+ name: 'remote-url',
60
+ ok: false,
61
+ level: 'warn',
62
+ detail: `${inst.tool}: remote entry has no url`
63
+ };
64
+ }
65
+ try {
66
+ const parsed = new URL(inst.url);
67
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
68
+ return {
69
+ name: 'remote-url',
70
+ ok: false,
71
+ level: 'warn',
72
+ detail: `${inst.tool}: url '${inst.url}' is not http(s)`
73
+ };
74
+ }
75
+ }
76
+ catch {
77
+ return {
78
+ name: 'remote-url',
79
+ ok: false,
80
+ level: 'warn',
81
+ detail: `${inst.tool}: url '${inst.url}' is not a valid URL`
82
+ };
83
+ }
84
+ }
85
+ return { name: 'remote-url', ok: true, level: 'warn' };
86
+ }
87
+ function checkDisabled(instances) {
88
+ if (instances.every((s) => s.enabled === false)) {
89
+ return {
90
+ name: 'disabled',
91
+ ok: false,
92
+ level: 'warn',
93
+ detail: 'all instances are disabled'
94
+ };
95
+ }
96
+ return null;
97
+ }
98
+ function checkConflictingDefinition(instances) {
99
+ if (instances.length < 2)
100
+ return null;
101
+ // Collect unique signatures (command joined or url)
102
+ const signatures = new Set();
103
+ for (const inst of instances) {
104
+ if (inst.transport === 'local') {
105
+ signatures.add(`local:${(inst.command ?? []).join(' ')}`);
106
+ }
107
+ else {
108
+ signatures.add(`remote:${inst.url ?? ''}`);
109
+ }
110
+ }
111
+ if (signatures.size > 1) {
112
+ return {
113
+ name: 'conflicting-definition',
114
+ ok: false,
115
+ level: 'warn',
116
+ detail: `${instances.length} instances differ in command/url across tools/scopes`
117
+ };
118
+ }
119
+ return null;
120
+ }
121
+ async function probeServer(inst, opts, timeoutMs) {
122
+ if (inst.transport !== 'local' || !inst.command || inst.command.length === 0) {
123
+ const check = {
124
+ name: 'probe',
125
+ ok: true,
126
+ level: 'error',
127
+ detail: 'skipped (not local)'
128
+ };
129
+ return { check, result: { ok: true } };
130
+ }
131
+ const result = await probeMcpServer(inst.command, {
132
+ env: opts.env,
133
+ cwd: opts.cwd,
134
+ timeoutMs
135
+ });
136
+ let detail;
137
+ if (result.ok) {
138
+ const toolCount = result.tools?.length ?? 0;
139
+ const parts = [`started · ${toolCount} tool(s)`];
140
+ if (result.serverInfo?.name || result.serverInfo?.version) {
141
+ const info = [result.serverInfo.name, result.serverInfo.version].filter(Boolean).join(' ');
142
+ parts.push(info);
143
+ }
144
+ detail = parts.join(' · ');
145
+ }
146
+ else {
147
+ detail =
148
+ result.error ??
149
+ (result.exitCode !== undefined && result.exitCode !== null
150
+ ? `exited with code ${result.exitCode}`
151
+ : 'probe failed');
152
+ }
153
+ const check = { name: 'probe', ok: result.ok, level: 'error', detail };
154
+ return { check, result };
155
+ }
156
+ export function checkServer(name, instances, opts) {
157
+ const checks = [];
158
+ const resolvableCheck = checkCommandResolvable(instances, opts);
159
+ if (resolvableCheck)
160
+ checks.push(resolvableCheck);
161
+ const remoteCheck = checkRemoteUrl(instances);
162
+ if (remoteCheck)
163
+ checks.push(remoteCheck);
164
+ const disabledCheck = checkDisabled(instances);
165
+ if (disabledCheck)
166
+ checks.push(disabledCheck);
167
+ const conflictCheck = checkConflictingDefinition(instances);
168
+ if (conflictCheck)
169
+ checks.push(conflictCheck);
170
+ return {
171
+ name,
172
+ instances,
173
+ status: deriveStatus(checks),
174
+ checks
175
+ };
176
+ }
177
+ export async function checkStack(servers, opts) {
178
+ const probeTimeoutMs = opts?.probeTimeoutMs ?? 8000;
179
+ // Group by name
180
+ const grouped = new Map();
181
+ for (const s of servers) {
182
+ const existing = grouped.get(s.name);
183
+ if (existing) {
184
+ existing.push(s);
185
+ }
186
+ else {
187
+ grouped.set(s.name, [s]);
188
+ }
189
+ }
190
+ const serverHealthList = [];
191
+ for (const [name, instances] of grouped) {
192
+ const health = checkServer(name, instances, opts);
193
+ // Optional probe: only local servers, only when probe=true
194
+ if (opts?.probe) {
195
+ const localEnabled = instances.filter((s) => s.transport === 'local' && s.enabled !== false);
196
+ for (const inst of localEnabled) {
197
+ const { check, result } = await probeServer(inst, opts ?? {}, probeTimeoutMs);
198
+ health.checks.push(check);
199
+ if (opts?.dataDir && inst.command && inst.command.length > 0) {
200
+ try {
201
+ upsertCapabilities(opts.dataDir, {
202
+ key: capabilityKey(name, inst.command),
203
+ name,
204
+ command: inst.command,
205
+ serverInfo: result.serverInfo,
206
+ tools: result.tools ?? [],
207
+ ok: result.ok,
208
+ probedAt: new Date().toISOString()
209
+ });
210
+ }
211
+ catch {
212
+ // best-effort
213
+ }
214
+ }
215
+ }
216
+ // Recompute status with probe results
217
+ health.status = deriveStatus(health.checks);
218
+ }
219
+ serverHealthList.push(health);
220
+ }
221
+ const summary = { ok: 0, warn: 0, error: 0 };
222
+ for (const h of serverHealthList) {
223
+ summary[h.status]++;
224
+ }
225
+ return { servers: serverHealthList, summary };
226
+ }
227
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/stack/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { FetchLike } from '../live.js';
2
+ import type { ConfiguredServer, StackEnv } from './types.js';
3
+ export interface ManifestEntry {
4
+ command?: string[];
5
+ url?: string;
6
+ env?: Record<string, string>;
7
+ enabled?: boolean;
8
+ }
9
+ export interface StackManifest {
10
+ mcp: Record<string, ManifestEntry>;
11
+ skills?: Record<string, ManifestEntry>;
12
+ workflows?: Record<string, ManifestEntry>;
13
+ }
14
+ export declare function manifestPath(env: StackEnv): string;
15
+ export type OpencodeMcpEntry = {
16
+ type: 'local';
17
+ command: string[];
18
+ environment?: Record<string, string>;
19
+ enabled?: boolean;
20
+ } | {
21
+ type: 'remote';
22
+ url: string;
23
+ enabled?: boolean;
24
+ };
25
+ export declare function opencodeEntryToManifest(entry: OpencodeMcpEntry): ManifestEntry;
26
+ export declare function serverToEntry(server: ConfiguredServer): ManifestEntry;
27
+ export declare function serializeManifest(m: StackManifest): string;
28
+ export declare function parseManifest(text: string): StackManifest;
29
+ export declare function readManifest(path: string): StackManifest | null;
30
+ export declare function writeManifest(path: string, m: StackManifest): void;
31
+ /**
32
+ * Load a StackManifest from a URL or file path.
33
+ * Throws a descriptive Error on fetch failure, missing file, or parse error.
34
+ * The caller is responsible for mapping thrown errors to usageError output.
35
+ */
36
+ export declare function loadManifestFromSource(source: string, opts: {
37
+ cwd?: string;
38
+ fetcher?: FetchLike;
39
+ }): Promise<StackManifest>;
40
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/stack/manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI7D,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC3C;AAID,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,CAKlD;AAID,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7F;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,gBAAgB,GAAG,aAAa,CAc9E;AAID,wBAAgB,aAAa,CAAC,MAAM,EAAE,gBAAgB,GAAG,aAAa,CAcrE;AAoDD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAkB1D;AAgHD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAmFzD;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAI/D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,GAAG,IAAI,CAElE;AAID;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAE,GAC1C,OAAO,CAAC,aAAa,CAAC,CAoCxB"}
@@ -0,0 +1,342 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { atomicWriteFile } from '../atomic-write.js';
4
+ // ── Path helper ───────────────────────────────────────────────────────────────
5
+ export function manifestPath(env) {
6
+ const override = env.env?.AGORA_STACK_FILE;
7
+ if (override)
8
+ return override;
9
+ const cwd = env.cwd ?? process.cwd();
10
+ return join(cwd, 'agora.toml');
11
+ }
12
+ export function opencodeEntryToManifest(entry) {
13
+ const result = {};
14
+ if (entry.type === 'local') {
15
+ result.command = entry.command;
16
+ if (entry.environment && Object.keys(entry.environment).length > 0) {
17
+ result.env = entry.environment;
18
+ }
19
+ }
20
+ else {
21
+ result.url = entry.url;
22
+ }
23
+ if (entry.enabled === false) {
24
+ result.enabled = false;
25
+ }
26
+ return result;
27
+ }
28
+ // ── serverToEntry ─────────────────────────────────────────────────────────────
29
+ export function serverToEntry(server) {
30
+ const entry = {};
31
+ if (server.transport === 'local' && server.command) {
32
+ entry.command = server.command;
33
+ }
34
+ else if (server.transport === 'remote' && server.url) {
35
+ entry.url = server.url;
36
+ }
37
+ if (server.env && Object.keys(server.env).length > 0) {
38
+ entry.env = server.env;
39
+ }
40
+ if (server.enabled === false) {
41
+ entry.enabled = false;
42
+ }
43
+ return entry;
44
+ }
45
+ // ── TOML serializer ───────────────────────────────────────────────────────────
46
+ function needsQuoting(seg) {
47
+ return !/^[A-Za-z0-9_-]+$/.test(seg);
48
+ }
49
+ function tomlSegment(seg) {
50
+ if (needsQuoting(seg)) {
51
+ return `"${escapeString(seg)}"`;
52
+ }
53
+ return seg;
54
+ }
55
+ function escapeString(s) {
56
+ return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
57
+ }
58
+ function serializeStringArray(arr) {
59
+ return '[' + arr.map((s) => `"${escapeString(s)}"`).join(', ') + ']';
60
+ }
61
+ function serializeSection(section, entries, lines) {
62
+ const names = Object.keys(entries).sort();
63
+ for (const name of names) {
64
+ const entry = entries[name];
65
+ const seg = tomlSegment(name);
66
+ lines.push(`[${section}.${seg}]`);
67
+ if (entry.command !== undefined) {
68
+ lines.push(`command = ${serializeStringArray(entry.command)}`);
69
+ }
70
+ if (entry.url !== undefined) {
71
+ lines.push(`url = "${escapeString(entry.url)}"`);
72
+ }
73
+ if (entry.enabled === false) {
74
+ lines.push(`enabled = false`);
75
+ }
76
+ if (entry.env && Object.keys(entry.env).length > 0) {
77
+ lines.push(`[${section}.${seg}.env]`);
78
+ for (const key of Object.keys(entry.env).sort()) {
79
+ lines.push(`${key} = "${escapeString(entry.env[key])}"`);
80
+ }
81
+ }
82
+ lines.push('');
83
+ }
84
+ }
85
+ export function serializeManifest(m) {
86
+ const lines = ['# agora stack manifest', ''];
87
+ if (m.mcp && Object.keys(m.mcp).length > 0) {
88
+ serializeSection('mcp', m.mcp, lines);
89
+ }
90
+ if (m.skills && Object.keys(m.skills).length > 0) {
91
+ serializeSection('skills', m.skills, lines);
92
+ }
93
+ if (m.workflows && Object.keys(m.workflows).length > 0) {
94
+ serializeSection('workflows', m.workflows, lines);
95
+ }
96
+ // Remove trailing blank line to get a clean file
97
+ while (lines.length > 0 && lines[lines.length - 1] === '') {
98
+ lines.pop();
99
+ }
100
+ return lines.join('\n') + '\n';
101
+ }
102
+ // ── TOML parser ───────────────────────────────────────────────────────────────
103
+ const KNOWN_SECTIONS = new Set(['mcp', 'skills', 'workflows']);
104
+ const KNOWN_ENTRY_KEYS = new Set(['command', 'url', 'enabled']);
105
+ function parseTomlString(raw, lineNum) {
106
+ if (!raw.startsWith('"') || !raw.endsWith('"') || raw.length < 2) {
107
+ throw new Error(`Line ${lineNum}: expected a double-quoted string, got: ${raw}`);
108
+ }
109
+ const inner = raw.slice(1, -1);
110
+ // Unescape \" and \\ (minimal)
111
+ let result = '';
112
+ for (let i = 0; i < inner.length; i++) {
113
+ if (inner[i] === '\\') {
114
+ i++;
115
+ if (inner[i] === '"')
116
+ result += '"';
117
+ else if (inner[i] === '\\')
118
+ result += '\\';
119
+ else
120
+ throw new Error(`Line ${lineNum}: unknown escape \\${inner[i]}`);
121
+ }
122
+ else {
123
+ result += inner[i];
124
+ }
125
+ }
126
+ return result;
127
+ }
128
+ function parseStringArray(raw, lineNum) {
129
+ const trimmed = raw.trim();
130
+ if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {
131
+ throw new Error(`Line ${lineNum}: expected a string array [...], got: ${raw}`);
132
+ }
133
+ const inner = trimmed.slice(1, -1).trim();
134
+ if (inner === '')
135
+ return [];
136
+ const items = [];
137
+ let i = 0;
138
+ while (i < inner.length) {
139
+ // skip whitespace and commas
140
+ while (i < inner.length && (inner[i] === ',' || inner[i] === ' ' || inner[i] === '\t'))
141
+ i++;
142
+ if (i >= inner.length)
143
+ break;
144
+ if (inner[i] !== '"') {
145
+ throw new Error(`Line ${lineNum}: expected quoted string in array, got: ${inner[i]}`);
146
+ }
147
+ // find closing quote, respecting escapes
148
+ let j = i + 1;
149
+ while (j < inner.length && !(inner[j] === '"' && inner[j - 1] !== '\\'))
150
+ j++;
151
+ if (j >= inner.length) {
152
+ throw new Error(`Line ${lineNum}: unterminated string in array`);
153
+ }
154
+ items.push(parseTomlString(inner.slice(i, j + 1), lineNum));
155
+ i = j + 1;
156
+ }
157
+ return items;
158
+ }
159
+ function parseTableHeader(line, lineNum) {
160
+ // Strip [ and ]
161
+ const inner = line.slice(1, -1).trim();
162
+ // Parse segments: bare or double-quoted
163
+ const segments = [];
164
+ let i = 0;
165
+ while (i < inner.length) {
166
+ if (inner[i] === '.') {
167
+ i++;
168
+ continue;
169
+ }
170
+ if (inner[i] === '"') {
171
+ // quoted segment
172
+ let j = i + 1;
173
+ while (j < inner.length && !(inner[j] === '"' && inner[j - 1] !== '\\'))
174
+ j++;
175
+ if (j >= inner.length) {
176
+ throw new Error(`Line ${lineNum}: unterminated quoted segment in table header`);
177
+ }
178
+ segments.push(parseTomlString(inner.slice(i, j + 1), lineNum));
179
+ i = j + 1;
180
+ }
181
+ else {
182
+ // bare segment
183
+ let j = i;
184
+ while (j < inner.length && inner[j] !== '.')
185
+ j++;
186
+ const seg = inner.slice(i, j);
187
+ if (!/^[A-Za-z0-9_-]+$/.test(seg)) {
188
+ throw new Error(`Line ${lineNum}: invalid bare key segment: ${seg}`);
189
+ }
190
+ segments.push(seg);
191
+ i = j;
192
+ }
193
+ }
194
+ if (segments.length < 2) {
195
+ throw new Error(`Line ${lineNum}: table header must have at least 2 segments: ${line}`);
196
+ }
197
+ const section = segments[0];
198
+ if (!KNOWN_SECTIONS.has(section)) {
199
+ throw new Error(`Line ${lineNum}: unknown section "${section}" in: ${line}`);
200
+ }
201
+ if (segments.length === 3 && segments[2] === 'env') {
202
+ return { section, name: segments[1], isEnv: true };
203
+ }
204
+ if (segments.length === 2) {
205
+ return { section, name: segments[1], isEnv: false };
206
+ }
207
+ throw new Error(`Line ${lineNum}: unexpected table header depth: ${line}`);
208
+ }
209
+ export function parseManifest(text) {
210
+ const manifest = { mcp: {} };
211
+ let currentSection = null;
212
+ let currentName = null;
213
+ let inEnv = false;
214
+ const lines = text.split('\n');
215
+ for (let idx = 0; idx < lines.length; idx++) {
216
+ const lineNum = idx + 1;
217
+ const line = lines[idx].trim();
218
+ // Skip blank and comment lines
219
+ if (line === '' || line.startsWith('#'))
220
+ continue;
221
+ // Table header
222
+ if (line.startsWith('[')) {
223
+ if (!line.endsWith(']')) {
224
+ throw new Error(`Line ${lineNum}: malformed table header: ${line}`);
225
+ }
226
+ const { section, name, isEnv } = parseTableHeader(line, lineNum);
227
+ currentSection = section;
228
+ currentName = name;
229
+ inEnv = isEnv;
230
+ // Ensure the section map exists
231
+ if (section === 'mcp') {
232
+ manifest.mcp = manifest.mcp ?? {};
233
+ if (!manifest.mcp[name])
234
+ manifest.mcp[name] = {};
235
+ }
236
+ else if (section === 'skills') {
237
+ manifest.skills = manifest.skills ?? {};
238
+ if (!manifest.skills[name])
239
+ manifest.skills[name] = {};
240
+ }
241
+ else if (section === 'workflows') {
242
+ manifest.workflows = manifest.workflows ?? {};
243
+ if (!manifest.workflows[name])
244
+ manifest.workflows[name] = {};
245
+ }
246
+ continue;
247
+ }
248
+ // Key = value
249
+ const eqIdx = line.indexOf('=');
250
+ if (eqIdx === -1) {
251
+ throw new Error(`Line ${lineNum}: expected key = value, got: ${line}`);
252
+ }
253
+ const key = line.slice(0, eqIdx).trim();
254
+ const rawVal = line.slice(eqIdx + 1).trim();
255
+ if (currentSection === null || currentName === null) {
256
+ throw new Error(`Line ${lineNum}: key/value before any table header: ${line}`);
257
+ }
258
+ // Get current entry
259
+ const sectionMap = currentSection === 'mcp'
260
+ ? manifest.mcp
261
+ : currentSection === 'skills'
262
+ ? (manifest.skills ??= {})
263
+ : (manifest.workflows ??= {});
264
+ const entry = (sectionMap[currentName] ??= {});
265
+ if (inEnv) {
266
+ // Any key, string value
267
+ const strVal = parseTomlString(rawVal, lineNum);
268
+ entry.env = entry.env ?? {};
269
+ entry.env[key] = strVal;
270
+ }
271
+ else {
272
+ // Known entry keys only
273
+ if (!KNOWN_ENTRY_KEYS.has(key)) {
274
+ throw new Error(`Line ${lineNum}: unknown key "${key}" in entry table`);
275
+ }
276
+ if (key === 'command') {
277
+ entry.command = parseStringArray(rawVal, lineNum);
278
+ }
279
+ else if (key === 'url') {
280
+ entry.url = parseTomlString(rawVal, lineNum);
281
+ }
282
+ else if (key === 'enabled') {
283
+ if (rawVal === 'true')
284
+ entry.enabled = true;
285
+ else if (rawVal === 'false')
286
+ entry.enabled = false;
287
+ else
288
+ throw new Error(`Line ${lineNum}: enabled must be true or false, got: ${rawVal}`);
289
+ }
290
+ }
291
+ }
292
+ return manifest;
293
+ }
294
+ // ── File I/O ──────────────────────────────────────────────────────────────────
295
+ export function readManifest(path) {
296
+ if (!existsSync(path))
297
+ return null;
298
+ const text = readFileSync(path, 'utf8');
299
+ return parseManifest(text);
300
+ }
301
+ export function writeManifest(path, m) {
302
+ atomicWriteFile(path, serializeManifest(m), 0o644);
303
+ }
304
+ // ── Remote/file loader ────────────────────────────────────────────────────────
305
+ /**
306
+ * Load a StackManifest from a URL or file path.
307
+ * Throws a descriptive Error on fetch failure, missing file, or parse error.
308
+ * The caller is responsible for mapping thrown errors to usageError output.
309
+ */
310
+ export async function loadManifestFromSource(source, opts) {
311
+ let text;
312
+ if (/^https?:\/\//i.test(source)) {
313
+ // URL source
314
+ const fetcher = opts.fetcher ?? globalThis.fetch;
315
+ let res;
316
+ try {
317
+ res = await fetcher(source);
318
+ }
319
+ catch (e) {
320
+ throw new Error(`Could not fetch manifest from ${source}: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
321
+ }
322
+ if (!res.ok) {
323
+ throw new Error(`Could not fetch manifest from ${source}: HTTP ${res.status}`);
324
+ }
325
+ text = await res.text();
326
+ }
327
+ else {
328
+ // File path source
329
+ const absPath = resolve(opts.cwd ?? process.cwd(), source);
330
+ if (!existsSync(absPath)) {
331
+ throw new Error(`Could not read manifest from ${source}: file not found`);
332
+ }
333
+ text = readFileSync(absPath, 'utf8');
334
+ }
335
+ try {
336
+ return parseManifest(text);
337
+ }
338
+ catch (e) {
339
+ throw new Error(`Invalid manifest from ${source}: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
340
+ }
341
+ }
342
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/stack/manifest.ts"],"names":[],"mappings":"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"}