opencode-agora 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/api.d.ts CHANGED
@@ -49,7 +49,10 @@ export declare function searchPackages(query: string, category?: string): Promis
49
49
  export declare function getPackage(id: string): Promise<Package | null>;
50
50
  export declare function searchWorkflows(query: string): Promise<Workflow[]>;
51
51
  export declare function getWorkflow(id: string): Promise<Workflow | null>;
52
- export declare function getTrending(_type?: 'packages' | 'workflows' | 'all'): Promise<unknown>;
52
+ export declare function getTrending(_type?: 'packages' | 'workflows' | 'all'): Promise<{
53
+ packages: unknown[];
54
+ workflows: unknown[];
55
+ }>;
53
56
  export declare function getDiscussions(category?: string): Promise<Discussion[]>;
54
57
  export declare function createDiscussion(data: {
55
58
  title: string;
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/api.js CHANGED
@@ -8,7 +8,7 @@ export async function searchPackages(query, category) {
8
8
  const res = await fetch(`${API_BASE}/api/packages?${params}`);
9
9
  if (!res.ok)
10
10
  return [];
11
- const data = await res.json();
11
+ const data = (await res.json());
12
12
  return data.packages || [];
13
13
  }
14
14
  export async function getPackage(id) {
@@ -17,7 +17,7 @@ export async function getPackage(id) {
17
17
  const res = await fetch(`${API_BASE}/api/packages/${id}`);
18
18
  if (!res.ok)
19
19
  return null;
20
- const data = await res.json();
20
+ const data = (await res.json());
21
21
  return data.package || null;
22
22
  }
23
23
  export async function searchWorkflows(query) {
@@ -26,7 +26,7 @@ export async function searchWorkflows(query) {
26
26
  const res = await fetch(`${API_BASE}/api/workflows?q=${encodeURIComponent(query)}`);
27
27
  if (!res.ok)
28
28
  return [];
29
- const data = await res.json();
29
+ const data = (await res.json());
30
30
  return data.workflows || [];
31
31
  }
32
32
  export async function getWorkflow(id) {
@@ -35,7 +35,7 @@ export async function getWorkflow(id) {
35
35
  const res = await fetch(`${API_BASE}/api/workflows/${id}`);
36
36
  if (!res.ok)
37
37
  return null;
38
- const data = await res.json();
38
+ const data = (await res.json());
39
39
  return data.workflow || null;
40
40
  }
41
41
  export async function getTrending(_type = 'all') {
@@ -53,7 +53,7 @@ export async function getDiscussions(category) {
53
53
  const res = await fetch(`${API_BASE}/api/discussions${params}`);
54
54
  if (!res.ok)
55
55
  return [];
56
- const data = await res.json();
56
+ const data = (await res.json());
57
57
  return data.discussions || [];
58
58
  }
59
59
  export async function createDiscussion(data, token) {
@@ -70,7 +70,7 @@ export async function createDiscussion(data, token) {
70
70
  });
71
71
  if (!res.ok)
72
72
  return null;
73
- const payload = await res.json();
73
+ const payload = (await res.json());
74
74
  return payload.discussion || payload;
75
75
  }
76
76
  export async function getUser(username) {
@@ -79,7 +79,7 @@ export async function getUser(username) {
79
79
  const res = await fetch(`${API_BASE}/api/users/${username}`);
80
80
  if (!res.ok)
81
81
  return null;
82
- const data = await res.json();
82
+ const data = (await res.json());
83
83
  return data.user || null;
84
84
  }
85
85
  export async function searchNpmPackages(query) {
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC;AAqDjD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAa,EAAE,QAAiB;IACnE,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,IAAI,QAAQ;QAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE/C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,iBAAiB,MAAM,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;IACrC,OAAO,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAU;IACzC,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;IACrC,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAa;IACjD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,oBAAoB,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpF,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;IACrC,OAAO,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EAAU;IAC1C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;IACrC,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;AAC/B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAA0C,KAAK;IAC/E,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,eAAe,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAEpD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAiB;IACpD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,mBAAmB,MAAM,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IAEvB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;IACrC,OAAO,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAKtC,EAAE,KAAc;IACf,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,oJAAoJ,CACrJ,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACpE,IAAI,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;IAE3D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,kBAAkB,EAAE;QACrD,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;IACxC,OAAO,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB;IAC5C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,cAAc,QAAQ,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAS,CAAC;IACrC,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAa;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAC3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,6BAA6B,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7F,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAEzC,OAAO,GAAG,CAAC,IAAI,EAAyC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY;IAC9C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,sBAAsB,IAAI,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAEzB,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,KAAa,EAAE,IAAY;IAC7D,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,yBAAyB,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC;IAC7E,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAEzB,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"AAWA,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAeL,KAAK,SAAS,EAGf,MAAM,YAAY,CAAC;AAkBpB,KAAK,YAAY,GAAG;IAClB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CACzC;AAID,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAmEvE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CA8CpD;AAumCD,wBAAgB,cAAc,IAAI,eAAe,EAAE,CAElD"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"AAUA,OAAO,EAKL,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAeL,KAAK,SAAS,EAGf,MAAM,YAAY,CAAC;AAqBpB,KAAK,YAAY,GAAG;IAClB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;CACzC;AAaD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAmEvE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAsDpD;AAwwCD,wBAAgB,cAAc,IAAI,eAAe,EAAE,CAElD"}
package/dist/cli/app.js CHANGED
@@ -1,7 +1,6 @@
1
1
  import { execSync } from 'node:child_process';
2
- import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
- import pkg from '../../package.json';
5
4
  import { formatConfigJson } from '../config.js';
6
5
  import { detectOpenCodeConfigPath, doctorOpenCodeConfig, loadOpenCodeConfig, writeOpenCodeConfig } from '../config-files.js';
7
6
  import { createInstallPlan, getInstallKind, getMarketplaceItems, getTrendingTags } from '../marketplace.js';
@@ -9,8 +8,18 @@ import { scanProject, generateInitPlan, applyInitPlan, runCommands } from '../in
9
8
  import { sampleWorkflows, dataRefreshedAt } from '../data.js';
10
9
  import { createDiscussionSource, discussionsSource, findMarketplaceSource, createReviewSource, findTutorialSource, listReviewsSource, profileSource, publishPackageSource, publishWorkflowSource, searchMarketplaceSource, trendingMarketplaceSource, tutorialsSource } from '../live.js';
11
10
  import { clearAuthState, detectAgoraDataDir, getAuthState, getAgoraStatePath, loadAgoraState, removeItemFromState, resolveSavedItems, saveItemToState, setAuthState, writeAgoraState } from '../state.js';
11
+ const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
12
12
  const VERSION = pkg.version;
13
- const booleanFlags = new Set(['api', 'help', 'json', 'live', 'offline', 'version', 'verbose', 'write']);
13
+ const booleanFlags = new Set([
14
+ 'api',
15
+ 'help',
16
+ 'json',
17
+ 'live',
18
+ 'offline',
19
+ 'version',
20
+ 'verbose',
21
+ 'write'
22
+ ]);
14
23
  export async function runCli(argv, io) {
15
24
  const parsed = parseArgs(argv);
16
25
  if (parsed.flags.version) {
@@ -92,7 +101,9 @@ export function parseArgs(argv) {
92
101
  if (inlineValue !== undefined) {
93
102
  flags[key] = inlineValue;
94
103
  }
95
- else if (!booleanFlags.has(key) && argv[index + 1] && !argv[index + 1].startsWith('-')) {
104
+ else if (!booleanFlags.has(key) &&
105
+ argv[index + 1] &&
106
+ (!argv[index + 1].startsWith('-') || /^-\d/.test(argv[index + 1]))) {
96
107
  flags[key] = argv[index + 1];
97
108
  index += 1;
98
109
  }
@@ -103,7 +114,9 @@ export function parseArgs(argv) {
103
114
  }
104
115
  if (arg.startsWith('-') && arg.length > 1) {
105
116
  const key = shortFlag(arg);
106
- if (!booleanFlags.has(key) && argv[index + 1] && !argv[index + 1].startsWith('-')) {
117
+ if (!booleanFlags.has(key) &&
118
+ argv[index + 1] &&
119
+ (!argv[index + 1].startsWith('-') || /^-\d/.test(argv[index + 1]))) {
107
120
  flags[key] = argv[index + 1];
108
121
  index += 1;
109
122
  }
@@ -124,7 +137,12 @@ async function commandSearch(parsed, io) {
124
137
  const query = parsed.args.join(' ');
125
138
  const category = stringFlag(parsed, 'category', 'c') || 'all';
126
139
  const limit = numberFlag(parsed, 'limit', 'n') || 10;
127
- const result = await searchMarketplaceSource({ ...sourceOptions(parsed, io), query, category, limit });
140
+ const result = await searchMarketplaceSource({
141
+ ...sourceOptions(parsed, io),
142
+ query,
143
+ category,
144
+ limit
145
+ });
128
146
  const results = result.data;
129
147
  warnFallback(result, io);
130
148
  if (parsed.flags.json) {
@@ -146,7 +164,11 @@ async function commandBrowse(parsed, io) {
146
164
  const id = parsed.args[0];
147
165
  if (!id)
148
166
  return usageError(io, 'browse requires an item id');
149
- const result = await findMarketplaceSource({ ...sourceOptions(parsed, io), id, type: stringFlag(parsed, 'type', 't') });
167
+ const result = await findMarketplaceSource({
168
+ ...sourceOptions(parsed, io),
169
+ id,
170
+ type: stringFlag(parsed, 'type', 't')
171
+ });
150
172
  const item = result.data;
151
173
  warnFallback(result, io);
152
174
  if (!item)
@@ -176,7 +198,12 @@ async function commandTrending(parsed, io) {
176
198
  async function commandWorkflows(parsed, io) {
177
199
  const query = parsed.args.join(' ');
178
200
  const limit = numberFlag(parsed, 'limit', 'n') || 10;
179
- const result = await searchMarketplaceSource({ ...sourceOptions(parsed, io), query, category: 'workflow', limit });
201
+ const result = await searchMarketplaceSource({
202
+ ...sourceOptions(parsed, io),
203
+ query,
204
+ category: 'workflow',
205
+ limit
206
+ });
180
207
  const workflows = result.data.filter((item) => item.kind === 'workflow');
181
208
  warnFallback(result, io);
182
209
  if (parsed.flags.json) {
@@ -193,7 +220,12 @@ async function commandTutorials(parsed, io) {
193
220
  if (!level.ok)
194
221
  return usageError(io, level.error);
195
222
  const limit = numberFlag(parsed, 'limit', 'n') || 20;
196
- const result = await tutorialsSource({ ...sourceOptions(parsed, io), query, level: level.value, limit });
223
+ const result = await tutorialsSource({
224
+ ...sourceOptions(parsed, io),
225
+ query,
226
+ level: level.value,
227
+ limit
228
+ });
197
229
  const tutorials = result.data;
198
230
  warnFallback(result, io);
199
231
  if (parsed.flags.json) {
@@ -245,13 +277,15 @@ async function commandDiscussions(parsed, io) {
245
277
  return 0;
246
278
  }
247
279
  writeLine(io.stdout, `Agora discussions (${discussions.length}, source: ${result.source})`);
248
- writeLine(io.stdout, discussions.map((discussion, index) => {
280
+ writeLine(io.stdout, discussions
281
+ .map((discussion, index) => {
249
282
  return [
250
283
  `${index + 1}. ${discussion.title} [${discussion.category}]`,
251
284
  ` ${truncate(discussion.content, 88)}`,
252
285
  ` replies ${discussion.replies} | stars ${discussion.stars} | by ${discussion.author}`
253
286
  ].join('\n');
254
- }).join('\n\n'));
287
+ })
288
+ .join('\n\n'));
255
289
  return 0;
256
290
  }
257
291
  async function commandDiscuss(parsed, io) {
@@ -259,7 +293,7 @@ async function commandDiscuss(parsed, io) {
259
293
  if (!source.ok)
260
294
  return usageError(io, source.error);
261
295
  const title = requiredStringFlag(parsed, 'title');
262
- const content = contentInput(parsed);
296
+ const content = contentInput(parsed, io);
263
297
  if (!title || !content) {
264
298
  return usageError(io, 'discuss requires --title and --content or --content-file');
265
299
  }
@@ -283,7 +317,11 @@ async function commandInstall(parsed, io) {
283
317
  const id = parsed.args[0];
284
318
  if (!id)
285
319
  return usageError(io, 'install requires an item id');
286
- const source = await findMarketplaceSource({ ...sourceOptions(parsed, io), id, type: stringFlag(parsed, 'type', 't') });
320
+ const source = await findMarketplaceSource({
321
+ ...sourceOptions(parsed, io),
322
+ id,
323
+ type: stringFlag(parsed, 'type', 't')
324
+ });
287
325
  const item = source.data;
288
326
  warnFallback(source, io);
289
327
  if (!item)
@@ -345,8 +383,34 @@ async function commandInstall(parsed, io) {
345
383
  async function commandInit(parsed, io) {
346
384
  const cwd = io.cwd || process.cwd();
347
385
  const scan = scanProject(cwd);
386
+ const plan = generateInitPlan(scan);
387
+ const configPath = detectOpenCodeConfigPath({ cwd, env: io.env });
348
388
  if (parsed.flags.json) {
349
- writeJson(io.stdout, { projectType: scan.type, frameworks: scan.frameworks });
389
+ if (parsed.flags.dryRun) {
390
+ writeJson(io.stdout, {
391
+ projectType: scan.type,
392
+ frameworks: scan.frameworks,
393
+ config: plan.config,
394
+ servers: plan.servers,
395
+ commands: plan.commands,
396
+ dryRun: true
397
+ });
398
+ return 0;
399
+ }
400
+ applyInitPlan(plan, configPath);
401
+ const installResults = plan.commands.length ? runCommands(plan.commands) : [];
402
+ const installed = installResults.filter((r) => r.ok).length;
403
+ const failed = installResults.filter((r) => !r.ok).length;
404
+ writeJson(io.stdout, {
405
+ projectType: scan.type,
406
+ frameworks: scan.frameworks,
407
+ config: plan.config,
408
+ servers: plan.servers,
409
+ commands: plan.commands,
410
+ installResults,
411
+ installed,
412
+ failed
413
+ });
350
414
  return 0;
351
415
  }
352
416
  writeLine(io.stdout, `Scanning ${cwd}...`);
@@ -359,15 +423,15 @@ async function commandInit(parsed, io) {
359
423
  writeLine(io.stdout, ' Tests: detected');
360
424
  if (scan.hasDatabase)
361
425
  writeLine(io.stdout, ' Database: detected');
362
- const plan = generateInitPlan(scan);
363
- const configPath = detectOpenCodeConfigPath({ cwd, env: io.env });
364
426
  if (!parsed.flags.dryRun) {
365
427
  applyInitPlan(plan, configPath);
366
428
  writeLine(io.stdout, `\nWrote config to ${configPath}`);
367
429
  if (plan.commands.length) {
368
430
  writeLine(io.stdout, '\nInstalling MCP server packages...');
369
- runCommands(plan.commands);
370
- writeLine(io.stdout, ` Done (${plan.commands.length} packages)`);
431
+ const installResults = runCommands(plan.commands);
432
+ const installed = installResults.filter((r) => r.ok).length;
433
+ const failed = installResults.filter((r) => !r.ok).length;
434
+ writeLine(io.stdout, ` Installed ${installed} of ${plan.commands.length} packages${failed ? ` (${failed} failed)` : ''}`);
371
435
  }
372
436
  writeLine(io.stdout, '\n✓ Agora initialized! Restart OpenCode to pick up the changes.');
373
437
  writeLine(io.stdout, ' Plugin "opencode-agora" is now registered in your config.');
@@ -412,11 +476,13 @@ ${workflow.prompt}
412
476
  writeFileSync(skillPath, skillContent, 'utf8');
413
477
  const configPath = detectOpenCodeConfigPath({ cwd, env: io.env });
414
478
  const loaded = loadOpenCodeConfig(configPath);
415
- const plugins = new Set(loaded.config.plugins || []);
479
+ if (loaded.error)
480
+ return usageError(io, `${loaded.path}: ${loaded.error}`);
481
+ const plugins = new Set(loaded.config.plugin || []);
416
482
  plugins.add(skillId);
417
483
  const updatedConfig = {
418
484
  ...loaded.config,
419
- plugins: Array.from(plugins),
485
+ plugin: Array.from(plugins)
420
486
  };
421
487
  writeOpenCodeConfig(configPath, updatedConfig);
422
488
  if (parsed.flags.json) {
@@ -514,7 +580,11 @@ async function commandSave(parsed, io) {
514
580
  const id = parsed.args[0];
515
581
  if (!id)
516
582
  return usageError(io, 'save requires an item id');
517
- const source = await findMarketplaceSource({ ...sourceOptions(parsed, io), id, type: stringFlag(parsed, 'type', 't') });
583
+ const source = await findMarketplaceSource({
584
+ ...sourceOptions(parsed, io),
585
+ id,
586
+ type: stringFlag(parsed, 'type', 't')
587
+ });
518
588
  const item = source.data;
519
589
  warnFallback(source, io);
520
590
  if (!item)
@@ -625,8 +695,8 @@ async function commandPublish(parsed, io) {
625
695
  writeLine(io.stdout, `${result.data.name} (${result.source})`);
626
696
  return 0;
627
697
  }
628
- const prompt = promptInput(parsed);
629
- if (!prompt) {
698
+ const prompt = promptInput(parsed, io);
699
+ if (prompt === undefined) {
630
700
  return usageError(io, 'publish workflow requires --prompt or --prompt-file');
631
701
  }
632
702
  const result = await publishWorkflowSource(source.options, {
@@ -707,7 +777,8 @@ async function commandProfile(parsed, io) {
707
777
  return 0;
708
778
  }
709
779
  function formatItemList(items) {
710
- return items.map((item, index) => {
780
+ return items
781
+ .map((item, index) => {
711
782
  const installs = item.kind === 'package' ? ` | installs ${formatCount(item.installs)}` : '';
712
783
  return [
713
784
  `${index + 1}. ${item.id} [${item.category}]`,
@@ -715,7 +786,8 @@ function formatItemList(items) {
715
786
  ` ${truncate(item.description, 88)}`,
716
787
  ` stars ${formatCount(item.stars)}${installs} | by ${item.author}`
717
788
  ].join('\n');
718
- }).join('\n\n');
789
+ })
790
+ .join('\n\n');
719
791
  }
720
792
  function formatItemDetail(item) {
721
793
  const lines = [
@@ -748,7 +820,8 @@ function formatItemDetail(item) {
748
820
  return lines.join('\n');
749
821
  }
750
822
  function formatSavedList(items) {
751
- return items.map((entry, index) => {
823
+ return items
824
+ .map((entry, index) => {
752
825
  if (!entry.item) {
753
826
  return [
754
827
  `${index + 1}. ${entry.saved.id} [missing]`,
@@ -761,16 +834,19 @@ function formatSavedList(items) {
761
834
  ` ${truncate(entry.item.description, 88)}`,
762
835
  ` saved ${formatDate(entry.saved.savedAt)}`
763
836
  ].join('\n');
764
- }).join('\n\n');
837
+ })
838
+ .join('\n\n');
765
839
  }
766
840
  function formatReviewList(reviews) {
767
- return reviews.map((review, index) => {
841
+ return reviews
842
+ .map((review, index) => {
768
843
  return [
769
844
  `${index + 1}. ${review.itemId} [${review.itemType}]`,
770
845
  ` rating ${review.rating}/5 by ${review.author}`,
771
846
  ` ${truncate(review.content, 88)}`
772
847
  ].join('\n');
773
- }).join('\n\n');
848
+ })
849
+ .join('\n\n');
774
850
  }
775
851
  function formatProfileDetail(profile) {
776
852
  const lines = [
@@ -789,14 +865,16 @@ function formatProfileDetail(profile) {
789
865
  return lines.join('\n');
790
866
  }
791
867
  function formatTutorialList(tutorials) {
792
- return tutorials.map((tutorial, index) => {
868
+ return tutorials
869
+ .map((tutorial, index) => {
793
870
  return [
794
871
  `${index + 1}. ${tutorial.id} [${tutorial.level}]`,
795
872
  ` ${tutorial.title}`,
796
873
  ` ${truncate(tutorial.description, 88)}`,
797
874
  ` ${tutorial.duration} | ${tutorial.steps.length} steps`
798
875
  ].join('\n');
799
- }).join('\n\n');
876
+ })
877
+ .join('\n\n');
800
878
  }
801
879
  function formatTutorialStep(tutorial, stepNumber) {
802
880
  const payload = tutorialStepPayload(tutorial, stepNumber);
@@ -898,9 +976,9 @@ function numberFlag(parsed, longName, shortName) {
898
976
  return Number.isFinite(parsedValue) ? parsedValue : undefined;
899
977
  }
900
978
  function authTokenInput(parsed, io) {
901
- return requiredStringFlag(parsed, 'token') ||
979
+ return (requiredStringFlag(parsed, 'token') ||
902
980
  envString(io, 'AGORA_TOKEN') ||
903
- envString(io, 'AGORA_API_TOKEN');
981
+ envString(io, 'AGORA_API_TOKEN'));
904
982
  }
905
983
  function envString(io, name) {
906
984
  const value = io.env?.[name];
@@ -933,12 +1011,13 @@ function sourceOptions(parsed, io) {
933
1011
  const storedAuth = getAuthState(loadAgoraState(detectDataDir(parsed, io)));
934
1012
  const storedApiUrl = storedAuth?.apiUrl;
935
1013
  const apiUrl = explicitApiUrl || envApiUrl || storedApiUrl || '';
936
- const useApi = !parsed.flags.offline && Boolean(parsed.flags.api ||
937
- parsed.flags.live ||
938
- explicitApiUrl ||
939
- envApiUrl ||
940
- storedApiUrl ||
941
- io.env?.AGORA_USE_API === 'true');
1014
+ const useApi = !parsed.flags.offline &&
1015
+ Boolean(parsed.flags.api ||
1016
+ parsed.flags.live ||
1017
+ explicitApiUrl ||
1018
+ envApiUrl ||
1019
+ storedApiUrl ||
1020
+ io.env?.AGORA_USE_API === 'true');
942
1021
  return {
943
1022
  useApi,
944
1023
  apiUrl,
@@ -950,10 +1029,16 @@ function sourceOptions(parsed, io) {
950
1029
  function writeSourceOptions(parsed, io) {
951
1030
  const options = sourceOptions(parsed, io);
952
1031
  if (!options.apiUrl) {
953
- return { ok: false, error: 'This command requires --api-url, AGORA_API_URL, or an auth login API URL' };
1032
+ return {
1033
+ ok: false,
1034
+ error: 'This command requires --api-url, AGORA_API_URL, or an auth login API URL'
1035
+ };
954
1036
  }
955
1037
  if (!options.token) {
956
- return { ok: false, error: 'This command requires --token, AGORA_TOKEN, AGORA_API_TOKEN, or agora auth login' };
1038
+ return {
1039
+ ok: false,
1040
+ error: 'This command requires --token, AGORA_TOKEN, AGORA_API_TOKEN, or agora auth login'
1041
+ };
957
1042
  }
958
1043
  return {
959
1044
  ok: true,
@@ -966,7 +1051,10 @@ function writeSourceOptions(parsed, io) {
966
1051
  function readSourceOptions(parsed, io) {
967
1052
  const options = sourceOptions(parsed, io);
968
1053
  if (!options.apiUrl) {
969
- return { ok: false, error: 'This command requires --api-url, AGORA_API_URL, or an auth login API URL' };
1054
+ return {
1055
+ ok: false,
1056
+ error: 'This command requires --api-url, AGORA_API_URL, or an auth login API URL'
1057
+ };
970
1058
  }
971
1059
  return { ok: true, options: { ...options, useApi: true } };
972
1060
  }
@@ -974,24 +1062,35 @@ function tagsFlag(parsed) {
974
1062
  const value = stringFlag(parsed, 'tags');
975
1063
  if (!value)
976
1064
  return [];
977
- return value.split(',').map((tag) => tag.trim()).filter(Boolean);
1065
+ return value
1066
+ .split(',')
1067
+ .map((tag) => tag.trim())
1068
+ .filter(Boolean);
978
1069
  }
979
- function promptInput(parsed) {
1070
+ function promptInput(parsed, io) {
980
1071
  const prompt = stringFlag(parsed, 'prompt');
981
1072
  if (prompt)
982
1073
  return prompt;
983
1074
  const promptFile = stringFlag(parsed, 'promptFile');
984
1075
  if (!promptFile)
985
1076
  return undefined;
1077
+ if (!existsSync(promptFile)) {
1078
+ usageError(io, `prompt-file not found: ${promptFile}`);
1079
+ return undefined;
1080
+ }
986
1081
  return readFileSync(promptFile, 'utf8');
987
1082
  }
988
- function contentInput(parsed) {
1083
+ function contentInput(parsed, io) {
989
1084
  const content = requiredStringFlag(parsed, 'content');
990
1085
  if (content)
991
1086
  return content;
992
1087
  const contentFile = stringFlag(parsed, 'contentFile');
993
1088
  if (!contentFile)
994
1089
  return undefined;
1090
+ if (!existsSync(contentFile)) {
1091
+ usageError(io, `content-file not found: ${contentFile}`);
1092
+ return undefined;
1093
+ }
995
1094
  return readFileSync(contentFile, 'utf8').trim();
996
1095
  }
997
1096
  function itemTypeFlag(parsed, itemId) {
@@ -1002,10 +1101,16 @@ function itemTypeFlag(parsed, itemId) {
1002
1101
  }
1003
1102
  function discussionCategoryFlag(parsed) {
1004
1103
  const category = stringFlag(parsed, 'category', 'c') || 'discussion';
1005
- if (category === 'question' || category === 'idea' || category === 'showcase' || category === 'discussion') {
1104
+ if (category === 'question' ||
1105
+ category === 'idea' ||
1106
+ category === 'showcase' ||
1107
+ category === 'discussion') {
1006
1108
  return { ok: true, value: category };
1007
1109
  }
1008
- return { ok: false, error: 'discussion category must be question, idea, showcase, or discussion' };
1110
+ return {
1111
+ ok: false,
1112
+ error: 'discussion category must be question, idea, showcase, or discussion'
1113
+ };
1009
1114
  }
1010
1115
  function tutorialLevelFlag(parsed) {
1011
1116
  const level = stringFlag(parsed, 'level') || 'all';