@kb-labs/marketplace-entry 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +1 -0
  2. package/dist/commands/install.d.ts +22 -0
  3. package/dist/commands/install.js +78 -0
  4. package/dist/commands/install.js.map +1 -0
  5. package/dist/commands/plugins/disable.d.ts +10 -0
  6. package/dist/commands/plugins/disable.js +62 -0
  7. package/dist/commands/plugins/disable.js.map +1 -0
  8. package/dist/commands/plugins/doctor.d.ts +22 -0
  9. package/dist/commands/plugins/doctor.js +65 -0
  10. package/dist/commands/plugins/doctor.js.map +1 -0
  11. package/dist/commands/plugins/enable.d.ts +10 -0
  12. package/dist/commands/plugins/enable.js +62 -0
  13. package/dist/commands/plugins/enable.js.map +1 -0
  14. package/dist/commands/plugins/link.d.ts +10 -0
  15. package/dist/commands/plugins/link.js +62 -0
  16. package/dist/commands/plugins/link.js.map +1 -0
  17. package/dist/commands/plugins/list.d.ts +24 -0
  18. package/dist/commands/plugins/list.js +72 -0
  19. package/dist/commands/plugins/list.js.map +1 -0
  20. package/dist/commands/plugins/unlink.d.ts +10 -0
  21. package/dist/commands/plugins/unlink.js +62 -0
  22. package/dist/commands/plugins/unlink.js.map +1 -0
  23. package/dist/commands/sync.d.ts +26 -0
  24. package/dist/commands/sync.js +91 -0
  25. package/dist/commands/sync.js.map +1 -0
  26. package/dist/commands/uninstall.d.ts +10 -0
  27. package/dist/commands/uninstall.js +62 -0
  28. package/dist/commands/uninstall.js.map +1 -0
  29. package/dist/commands/update.d.ts +19 -0
  30. package/dist/commands/update.js +69 -0
  31. package/dist/commands/update.js.map +1 -0
  32. package/dist/index.d.ts +1 -0
  33. package/dist/index.js +35 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/manifest.d.ts +36 -0
  36. package/dist/manifest.js +36 -0
  37. package/dist/manifest.js.map +1 -0
  38. package/package.json +47 -0
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # TODO
@@ -0,0 +1,22 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ interface InstallFlags {
4
+ dev?: boolean;
5
+ json?: boolean;
6
+ }
7
+ interface InstallInput {
8
+ argv?: string[];
9
+ flags?: InstallFlags;
10
+ }
11
+ interface InstalledEntry {
12
+ id: string;
13
+ version: string;
14
+ primaryKind: string;
15
+ }
16
+ interface InstallResultData {
17
+ installed: InstalledEntry[];
18
+ warnings: string[];
19
+ }
20
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, InstallInput, InstallResultData>;
21
+
22
+ export { _default as default };
@@ -0,0 +1,78 @@
1
+ import { defineCommand } from '@kb-labs/sdk';
2
+
3
+ // src/commands/install.ts
4
+
5
+ // src/http.ts
6
+ var DEFAULT_GATEWAY_URL = "http://127.0.0.1:4000";
7
+ var MARKETPLACE_PREFIX = "/api/v1/marketplace";
8
+ var FETCH_TIMEOUT_MS = 3e4;
9
+ function getBaseUrl() {
10
+ if (process.env.KB_MARKETPLACE_URL) {
11
+ return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;
12
+ }
13
+ const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;
14
+ return `${gateway}${MARKETPLACE_PREFIX}`;
15
+ }
16
+ async function post(path, body) {
17
+ const url = `${getBaseUrl()}${path}`;
18
+ const controller = new AbortController();
19
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
20
+ try {
21
+ const res = await fetch(url, {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify(body),
25
+ signal: controller.signal
26
+ });
27
+ if (!res.ok) {
28
+ const text = await res.text();
29
+ throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);
30
+ }
31
+ return await res.json();
32
+ } catch (err) {
33
+ if (err.name === "AbortError") {
34
+ throw new Error(`Marketplace ${path} timed out \u2014 is the marketplace service running? (kb-dev start marketplace)`);
35
+ }
36
+ throw err;
37
+ } finally {
38
+ clearTimeout(timer);
39
+ }
40
+ }
41
+
42
+ // src/commands/install.ts
43
+ var install_default = defineCommand({
44
+ id: "marketplace:install",
45
+ description: "Install package(s) from marketplace",
46
+ handler: {
47
+ async execute(ctx, input) {
48
+ const argv = input.argv ?? [];
49
+ const flags = input.flags ?? input;
50
+ if (argv.length === 0) {
51
+ ctx.ui?.error?.("Please specify at least one package to install");
52
+ return { exitCode: 1, result: { installed: [], warnings: [] } };
53
+ }
54
+ const result = await post("/install", {
55
+ specs: argv,
56
+ dev: Boolean(flags.dev)
57
+ });
58
+ if (flags.json) {
59
+ ctx.ui?.json?.(result);
60
+ } else {
61
+ ctx.ui?.success?.("Marketplace install completed", {
62
+ sections: [
63
+ {
64
+ header: "Installed",
65
+ items: result.installed.map((p) => `${p.id}@${p.version} (${p.primaryKind})`)
66
+ },
67
+ ...result.warnings.length > 0 ? [{ header: "Warnings", items: result.warnings }] : []
68
+ ]
69
+ });
70
+ }
71
+ return { exitCode: 0, result };
72
+ }
73
+ }
74
+ });
75
+
76
+ export { install_default as default };
77
+ //# sourceMappingURL=install.js.map
78
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/http.ts","../../src/commands/install.ts"],"names":[],"mappings":"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","file":"install.js","sourcesContent":["/**\n * HTTP client for marketplace service via Gateway.\n */\n\nconst DEFAULT_GATEWAY_URL = 'http://127.0.0.1:4000';\nconst MARKETPLACE_PREFIX = '/api/v1/marketplace';\nconst FETCH_TIMEOUT_MS = 30_000;\n\nfunction getBaseUrl(): string {\n if (process.env.KB_MARKETPLACE_URL) {\n return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;\n }\n const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;\n return `${gateway}${MARKETPLACE_PREFIX}`;\n}\n\nexport async function post<T = unknown>(path: string, body: Record<string, unknown>): Promise<T> {\n const url = `${getBaseUrl()}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function get<T = unknown>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${getBaseUrl()}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {url.searchParams.set(k, v);}\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url.toString(), { signal: controller.signal });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { post } from '../http.js';\n\ninterface InstallFlags {\n dev?: boolean;\n json?: boolean;\n}\n\ninterface InstallInput {\n argv?: string[];\n flags?: InstallFlags;\n}\n\ninterface InstalledEntry {\n id: string;\n version: string;\n primaryKind: string;\n}\n\ninterface InstallResultData {\n installed: InstalledEntry[];\n warnings: string[];\n}\n\nexport default defineCommand<unknown, InstallInput, InstallResultData>({\n id: 'marketplace:install',\n description: 'Install package(s) from marketplace',\n\n handler: {\n async execute(ctx: PluginContextV3, input: InstallInput): Promise<CommandResult<InstallResultData>> {\n const argv = input.argv ?? [];\n const flags = (input.flags ?? input) as InstallFlags;\n\n if (argv.length === 0) {\n ctx.ui?.error?.('Please specify at least one package to install');\n return { exitCode: 1, result: { installed: [], warnings: [] } };\n }\n\n const result = await post<InstallResultData>('/install', {\n specs: argv,\n dev: Boolean(flags.dev),\n });\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n ctx.ui?.success?.('Marketplace install completed', {\n sections: [\n {\n header: 'Installed',\n items: result.installed.map(p => `${p.id}@${p.version} (${p.primaryKind})`),\n },\n ...(result.warnings.length > 0\n ? [{ header: 'Warnings', items: result.warnings }]\n : []),\n ],\n });\n }\n\n return { exitCode: 0, result };\n },\n },\n});\n"]}
@@ -0,0 +1,10 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ interface DisableInput {
4
+ argv?: string[];
5
+ }
6
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, DisableInput, {
7
+ packageId: string;
8
+ }>;
9
+
10
+ export { _default as default };
@@ -0,0 +1,62 @@
1
+ import { defineCommand } from '@kb-labs/sdk';
2
+
3
+ // src/commands/plugins/disable.ts
4
+
5
+ // src/http.ts
6
+ var DEFAULT_GATEWAY_URL = "http://127.0.0.1:4000";
7
+ var MARKETPLACE_PREFIX = "/api/v1/marketplace";
8
+ var FETCH_TIMEOUT_MS = 3e4;
9
+ function getBaseUrl() {
10
+ if (process.env.KB_MARKETPLACE_URL) {
11
+ return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;
12
+ }
13
+ const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;
14
+ return `${gateway}${MARKETPLACE_PREFIX}`;
15
+ }
16
+ async function post(path, body) {
17
+ const url = `${getBaseUrl()}${path}`;
18
+ const controller = new AbortController();
19
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
20
+ try {
21
+ const res = await fetch(url, {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify(body),
25
+ signal: controller.signal
26
+ });
27
+ if (!res.ok) {
28
+ const text = await res.text();
29
+ throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);
30
+ }
31
+ return await res.json();
32
+ } catch (err) {
33
+ if (err.name === "AbortError") {
34
+ throw new Error(`Marketplace ${path} timed out \u2014 is the marketplace service running? (kb-dev start marketplace)`);
35
+ }
36
+ throw err;
37
+ } finally {
38
+ clearTimeout(timer);
39
+ }
40
+ }
41
+
42
+ // src/commands/plugins/disable.ts
43
+ var disable_default = defineCommand({
44
+ id: "marketplace:plugins:disable",
45
+ description: "Disable a plugin",
46
+ handler: {
47
+ async execute(ctx, input) {
48
+ const packageId = input.argv?.[0];
49
+ if (!packageId) {
50
+ ctx.ui?.error?.("Specify a plugin to disable");
51
+ return { exitCode: 1, result: { packageId: "" } };
52
+ }
53
+ await post("/disable", { packageId });
54
+ ctx.ui?.success?.(`Disabled ${packageId}`);
55
+ return { exitCode: 0, result: { packageId } };
56
+ }
57
+ }
58
+ });
59
+
60
+ export { disable_default as default };
61
+ //# sourceMappingURL=disable.js.map
62
+ //# sourceMappingURL=disable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/http.ts","../../../src/commands/plugins/disable.ts"],"names":[],"mappings":";;;;;AAIA,IAAM,mBAAA,GAAsB,uBAAA;AAC5B,IAAM,kBAAA,GAAqB,qBAAA;AAC3B,IAAM,gBAAA,GAAmB,GAAA;AAEzB,SAAS,UAAA,GAAqB;AAC5B,EAAA,IAAI,OAAA,CAAQ,IAAI,kBAAA,EAAoB;AAClC,IAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,kBAAkB,GAAG,kBAAkB,CAAA,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,cAAA,IAAkB,mBAAA;AAC9C,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,kBAAkB,CAAA,CAAA;AACxC;AAEA,eAAsB,IAAA,CAAkB,MAAc,IAAA,EAA2C;AAC/F,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,UAAA,EAAY,GAAG,IAAI,CAAA,CAAA;AAClC,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,gBAAgB,CAAA;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,IAAI,MAAM,CAAA,YAAA,EAAe,IAAI,YAAY,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,EACxB,SAAS,GAAA,EAAK;AACZ,IAAA,IAAK,GAAA,CAAc,SAAS,YAAA,EAAc;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,IAAI,CAAA,gFAAA,CAA6E,CAAA;AAAA,IAClH;AACA,IAAA,MAAM,GAAA;AAAA,EACR,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AACF;;;ACnCA,IAAO,kBAAQ,aAAA,CAA4D;AAAA,EACzE,EAAA,EAAI,6BAAA;AAAA,EACJ,WAAA,EAAa,kBAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAoE;AACtG,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AAChC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,6BAA6B,CAAA;AAC7C,QAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,QAAQ,EAAE,SAAA,EAAW,IAAG,EAAE;AAAA,MAClD;AACA,MAAA,MAAM,IAAA,CAAK,UAAA,EAAY,EAAE,SAAA,EAAW,CAAA;AACpC,MAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,SAAA,EAAY,SAAS,CAAA,CAAE,CAAA;AACzC,MAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,MAAA,EAAQ,EAAE,WAAU,EAAE;AAAA,IAC9C;AAAA;AAEJ,CAAC","file":"disable.js","sourcesContent":["/**\n * HTTP client for marketplace service via Gateway.\n */\n\nconst DEFAULT_GATEWAY_URL = 'http://127.0.0.1:4000';\nconst MARKETPLACE_PREFIX = '/api/v1/marketplace';\nconst FETCH_TIMEOUT_MS = 30_000;\n\nfunction getBaseUrl(): string {\n if (process.env.KB_MARKETPLACE_URL) {\n return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;\n }\n const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;\n return `${gateway}${MARKETPLACE_PREFIX}`;\n}\n\nexport async function post<T = unknown>(path: string, body: Record<string, unknown>): Promise<T> {\n const url = `${getBaseUrl()}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function get<T = unknown>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${getBaseUrl()}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {url.searchParams.set(k, v);}\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url.toString(), { signal: controller.signal });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { post } from '../../http.js';\n\ninterface DisableInput { argv?: string[] }\n\nexport default defineCommand<unknown, DisableInput, { packageId: string }>({\n id: 'marketplace:plugins:disable',\n description: 'Disable a plugin',\n\n handler: {\n async execute(ctx: PluginContextV3, input: DisableInput): Promise<CommandResult<{ packageId: string }>> {\n const packageId = input.argv?.[0];\n if (!packageId) {\n ctx.ui?.error?.('Specify a plugin to disable');\n return { exitCode: 1, result: { packageId: '' } };\n }\n await post('/disable', { packageId });\n ctx.ui?.success?.(`Disabled ${packageId}`);\n return { exitCode: 0, result: { packageId } };\n },\n },\n});\n"]}
@@ -0,0 +1,22 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ interface DoctorFlags {
4
+ json?: boolean;
5
+ }
6
+ interface DoctorInput {
7
+ flags?: DoctorFlags;
8
+ }
9
+ interface DoctorIssue {
10
+ severity: string;
11
+ packageId: string;
12
+ message: string;
13
+ remediation?: string;
14
+ }
15
+ interface DoctorResultData {
16
+ ok: boolean;
17
+ total: number;
18
+ issues: DoctorIssue[];
19
+ }
20
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, DoctorInput, DoctorResultData>;
21
+
22
+ export { _default as default };
@@ -0,0 +1,65 @@
1
+ import { defineCommand } from '@kb-labs/sdk';
2
+
3
+ // src/commands/plugins/doctor.ts
4
+
5
+ // src/http.ts
6
+ var DEFAULT_GATEWAY_URL = "http://127.0.0.1:4000";
7
+ var MARKETPLACE_PREFIX = "/api/v1/marketplace";
8
+ var FETCH_TIMEOUT_MS = 3e4;
9
+ function getBaseUrl() {
10
+ if (process.env.KB_MARKETPLACE_URL) {
11
+ return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;
12
+ }
13
+ const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;
14
+ return `${gateway}${MARKETPLACE_PREFIX}`;
15
+ }
16
+ async function get(path, params) {
17
+ const url = new URL(`${getBaseUrl()}${path}`);
18
+ const controller = new AbortController();
19
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
20
+ try {
21
+ const res = await fetch(url.toString(), { signal: controller.signal });
22
+ if (!res.ok) {
23
+ const text = await res.text();
24
+ throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);
25
+ }
26
+ return await res.json();
27
+ } catch (err) {
28
+ if (err.name === "AbortError") {
29
+ throw new Error(`Marketplace ${path} timed out \u2014 is the marketplace service running? (kb-dev start marketplace)`);
30
+ }
31
+ throw err;
32
+ } finally {
33
+ clearTimeout(timer);
34
+ }
35
+ }
36
+
37
+ // src/commands/plugins/doctor.ts
38
+ var doctor_default = defineCommand({
39
+ id: "marketplace:plugins:doctor",
40
+ description: "Diagnose marketplace health",
41
+ handler: {
42
+ async execute(ctx, input) {
43
+ const flags = input.flags ?? input;
44
+ const report = await get("/doctor");
45
+ if (flags.json) {
46
+ ctx.ui?.json?.(report);
47
+ } else if (report.issues.length === 0) {
48
+ ctx.ui?.success?.(`All ${report.total} packages healthy`);
49
+ } else {
50
+ const errors = report.issues.filter((i) => i.severity === "error");
51
+ ctx.ui?.warn?.("Marketplace Doctor", {
52
+ sections: [
53
+ { header: "Summary", items: [`Total: ${report.total}`, `Issues: ${report.issues.length}`, `Errors: ${errors.length}`] },
54
+ { header: "Issues", items: report.issues.map((i) => `${i.severity === "error" ? "\u274C" : "\u26A0"} ${i.packageId}: ${i.message}`) }
55
+ ]
56
+ });
57
+ }
58
+ return { exitCode: report.ok ? 0 : 1, result: report };
59
+ }
60
+ }
61
+ });
62
+
63
+ export { doctor_default as default };
64
+ //# sourceMappingURL=doctor.js.map
65
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/http.ts","../../../src/commands/plugins/doctor.ts"],"names":[],"mappings":"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","file":"doctor.js","sourcesContent":["/**\n * HTTP client for marketplace service via Gateway.\n */\n\nconst DEFAULT_GATEWAY_URL = 'http://127.0.0.1:4000';\nconst MARKETPLACE_PREFIX = '/api/v1/marketplace';\nconst FETCH_TIMEOUT_MS = 30_000;\n\nfunction getBaseUrl(): string {\n if (process.env.KB_MARKETPLACE_URL) {\n return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;\n }\n const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;\n return `${gateway}${MARKETPLACE_PREFIX}`;\n}\n\nexport async function post<T = unknown>(path: string, body: Record<string, unknown>): Promise<T> {\n const url = `${getBaseUrl()}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function get<T = unknown>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${getBaseUrl()}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {url.searchParams.set(k, v);}\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url.toString(), { signal: controller.signal });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { get } from '../../http.js';\n\ninterface DoctorFlags { json?: boolean }\ninterface DoctorInput { flags?: DoctorFlags }\n\ninterface DoctorIssue {\n severity: string;\n packageId: string;\n message: string;\n remediation?: string;\n}\n\ninterface DoctorResultData {\n ok: boolean;\n total: number;\n issues: DoctorIssue[];\n}\n\nexport default defineCommand<unknown, DoctorInput, DoctorResultData>({\n id: 'marketplace:plugins:doctor',\n description: 'Diagnose marketplace health',\n\n handler: {\n async execute(ctx: PluginContextV3, input: DoctorInput): Promise<CommandResult<DoctorResultData>> {\n const flags = (input.flags ?? input) as DoctorFlags;\n const report = await get<DoctorResultData>('/doctor');\n\n if (flags.json) {\n ctx.ui?.json?.(report);\n } else if (report.issues.length === 0) {\n ctx.ui?.success?.(`All ${report.total} packages healthy`);\n } else {\n const errors = report.issues.filter(i => i.severity === 'error');\n ctx.ui?.warn?.('Marketplace Doctor', {\n sections: [\n { header: 'Summary', items: [`Total: ${report.total}`, `Issues: ${report.issues.length}`, `Errors: ${errors.length}`] },\n { header: 'Issues', items: report.issues.map(i => `${i.severity === 'error' ? '❌' : '⚠'} ${i.packageId}: ${i.message}`) },\n ],\n });\n }\n\n return { exitCode: report.ok ? 0 : 1, result: report };\n },\n },\n});\n"]}
@@ -0,0 +1,10 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ interface EnableInput {
4
+ argv?: string[];
5
+ }
6
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, EnableInput, {
7
+ packageId: string;
8
+ }>;
9
+
10
+ export { _default as default };
@@ -0,0 +1,62 @@
1
+ import { defineCommand } from '@kb-labs/sdk';
2
+
3
+ // src/commands/plugins/enable.ts
4
+
5
+ // src/http.ts
6
+ var DEFAULT_GATEWAY_URL = "http://127.0.0.1:4000";
7
+ var MARKETPLACE_PREFIX = "/api/v1/marketplace";
8
+ var FETCH_TIMEOUT_MS = 3e4;
9
+ function getBaseUrl() {
10
+ if (process.env.KB_MARKETPLACE_URL) {
11
+ return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;
12
+ }
13
+ const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;
14
+ return `${gateway}${MARKETPLACE_PREFIX}`;
15
+ }
16
+ async function post(path, body) {
17
+ const url = `${getBaseUrl()}${path}`;
18
+ const controller = new AbortController();
19
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
20
+ try {
21
+ const res = await fetch(url, {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify(body),
25
+ signal: controller.signal
26
+ });
27
+ if (!res.ok) {
28
+ const text = await res.text();
29
+ throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);
30
+ }
31
+ return await res.json();
32
+ } catch (err) {
33
+ if (err.name === "AbortError") {
34
+ throw new Error(`Marketplace ${path} timed out \u2014 is the marketplace service running? (kb-dev start marketplace)`);
35
+ }
36
+ throw err;
37
+ } finally {
38
+ clearTimeout(timer);
39
+ }
40
+ }
41
+
42
+ // src/commands/plugins/enable.ts
43
+ var enable_default = defineCommand({
44
+ id: "marketplace:plugins:enable",
45
+ description: "Enable a plugin",
46
+ handler: {
47
+ async execute(ctx, input) {
48
+ const packageId = input.argv?.[0];
49
+ if (!packageId) {
50
+ ctx.ui?.error?.("Specify a plugin to enable");
51
+ return { exitCode: 1, result: { packageId: "" } };
52
+ }
53
+ await post("/enable", { packageId });
54
+ ctx.ui?.success?.(`Enabled ${packageId}`);
55
+ return { exitCode: 0, result: { packageId } };
56
+ }
57
+ }
58
+ });
59
+
60
+ export { enable_default as default };
61
+ //# sourceMappingURL=enable.js.map
62
+ //# sourceMappingURL=enable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/http.ts","../../../src/commands/plugins/enable.ts"],"names":[],"mappings":";;;;;AAIA,IAAM,mBAAA,GAAsB,uBAAA;AAC5B,IAAM,kBAAA,GAAqB,qBAAA;AAC3B,IAAM,gBAAA,GAAmB,GAAA;AAEzB,SAAS,UAAA,GAAqB;AAC5B,EAAA,IAAI,OAAA,CAAQ,IAAI,kBAAA,EAAoB;AAClC,IAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,kBAAkB,GAAG,kBAAkB,CAAA,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,cAAA,IAAkB,mBAAA;AAC9C,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,kBAAkB,CAAA,CAAA;AACxC;AAEA,eAAsB,IAAA,CAAkB,MAAc,IAAA,EAA2C;AAC/F,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,UAAA,EAAY,GAAG,IAAI,CAAA,CAAA;AAClC,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,gBAAgB,CAAA;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,IAAI,MAAM,CAAA,YAAA,EAAe,IAAI,YAAY,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,EACxB,SAAS,GAAA,EAAK;AACZ,IAAA,IAAK,GAAA,CAAc,SAAS,YAAA,EAAc;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,IAAI,CAAA,gFAAA,CAA6E,CAAA;AAAA,IAClH;AACA,IAAA,MAAM,GAAA;AAAA,EACR,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AACF;;;ACnCA,IAAO,iBAAQ,aAAA,CAA2D;AAAA,EACxE,EAAA,EAAI,4BAAA;AAAA,EACJ,WAAA,EAAa,iBAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAmE;AACrG,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AAChC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,4BAA4B,CAAA;AAC5C,QAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,QAAQ,EAAE,SAAA,EAAW,IAAG,EAAE;AAAA,MAClD;AACA,MAAA,MAAM,IAAA,CAAK,SAAA,EAAW,EAAE,SAAA,EAAW,CAAA;AACnC,MAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,QAAA,EAAW,SAAS,CAAA,CAAE,CAAA;AACxC,MAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,MAAA,EAAQ,EAAE,WAAU,EAAE;AAAA,IAC9C;AAAA;AAEJ,CAAC","file":"enable.js","sourcesContent":["/**\n * HTTP client for marketplace service via Gateway.\n */\n\nconst DEFAULT_GATEWAY_URL = 'http://127.0.0.1:4000';\nconst MARKETPLACE_PREFIX = '/api/v1/marketplace';\nconst FETCH_TIMEOUT_MS = 30_000;\n\nfunction getBaseUrl(): string {\n if (process.env.KB_MARKETPLACE_URL) {\n return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;\n }\n const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;\n return `${gateway}${MARKETPLACE_PREFIX}`;\n}\n\nexport async function post<T = unknown>(path: string, body: Record<string, unknown>): Promise<T> {\n const url = `${getBaseUrl()}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function get<T = unknown>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${getBaseUrl()}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {url.searchParams.set(k, v);}\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url.toString(), { signal: controller.signal });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { post } from '../../http.js';\n\ninterface EnableInput { argv?: string[] }\n\nexport default defineCommand<unknown, EnableInput, { packageId: string }>({\n id: 'marketplace:plugins:enable',\n description: 'Enable a plugin',\n\n handler: {\n async execute(ctx: PluginContextV3, input: EnableInput): Promise<CommandResult<{ packageId: string }>> {\n const packageId = input.argv?.[0];\n if (!packageId) {\n ctx.ui?.error?.('Specify a plugin to enable');\n return { exitCode: 1, result: { packageId: '' } };\n }\n await post('/enable', { packageId });\n ctx.ui?.success?.(`Enabled ${packageId}`);\n return { exitCode: 0, result: { packageId } };\n },\n },\n});\n"]}
@@ -0,0 +1,10 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ interface LinkInput {
4
+ argv?: string[];
5
+ }
6
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, LinkInput, {
7
+ id: string;
8
+ }>;
9
+
10
+ export { _default as default };
@@ -0,0 +1,62 @@
1
+ import { defineCommand } from '@kb-labs/sdk';
2
+
3
+ // src/commands/plugins/link.ts
4
+
5
+ // src/http.ts
6
+ var DEFAULT_GATEWAY_URL = "http://127.0.0.1:4000";
7
+ var MARKETPLACE_PREFIX = "/api/v1/marketplace";
8
+ var FETCH_TIMEOUT_MS = 3e4;
9
+ function getBaseUrl() {
10
+ if (process.env.KB_MARKETPLACE_URL) {
11
+ return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;
12
+ }
13
+ const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;
14
+ return `${gateway}${MARKETPLACE_PREFIX}`;
15
+ }
16
+ async function post(path, body) {
17
+ const url = `${getBaseUrl()}${path}`;
18
+ const controller = new AbortController();
19
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
20
+ try {
21
+ const res = await fetch(url, {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify(body),
25
+ signal: controller.signal
26
+ });
27
+ if (!res.ok) {
28
+ const text = await res.text();
29
+ throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);
30
+ }
31
+ return await res.json();
32
+ } catch (err) {
33
+ if (err.name === "AbortError") {
34
+ throw new Error(`Marketplace ${path} timed out \u2014 is the marketplace service running? (kb-dev start marketplace)`);
35
+ }
36
+ throw err;
37
+ } finally {
38
+ clearTimeout(timer);
39
+ }
40
+ }
41
+
42
+ // src/commands/plugins/link.ts
43
+ var link_default = defineCommand({
44
+ id: "marketplace:plugins:link",
45
+ description: "Link a local plugin for development",
46
+ handler: {
47
+ async execute(ctx, input) {
48
+ const pluginPath = input.argv?.[0];
49
+ if (!pluginPath) {
50
+ ctx.ui?.error?.("Specify a plugin path to link");
51
+ return { exitCode: 1, result: { id: "" } };
52
+ }
53
+ const result = await post("/link", { path: pluginPath });
54
+ ctx.ui?.success?.(`Linked ${result.id}`);
55
+ return { exitCode: 0, result: { id: result.id } };
56
+ }
57
+ }
58
+ });
59
+
60
+ export { link_default as default };
61
+ //# sourceMappingURL=link.js.map
62
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/http.ts","../../../src/commands/plugins/link.ts"],"names":[],"mappings":";;;;;AAIA,IAAM,mBAAA,GAAsB,uBAAA;AAC5B,IAAM,kBAAA,GAAqB,qBAAA;AAC3B,IAAM,gBAAA,GAAmB,GAAA;AAEzB,SAAS,UAAA,GAAqB;AAC5B,EAAA,IAAI,OAAA,CAAQ,IAAI,kBAAA,EAAoB;AAClC,IAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,kBAAkB,GAAG,kBAAkB,CAAA,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,cAAA,IAAkB,mBAAA;AAC9C,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,kBAAkB,CAAA,CAAA;AACxC;AAEA,eAAsB,IAAA,CAAkB,MAAc,IAAA,EAA2C;AAC/F,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,UAAA,EAAY,GAAG,IAAI,CAAA,CAAA;AAClC,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,gBAAgB,CAAA;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,IAAI,MAAM,CAAA,YAAA,EAAe,IAAI,YAAY,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,EACxB,SAAS,GAAA,EAAK;AACZ,IAAA,IAAK,GAAA,CAAc,SAAS,YAAA,EAAc;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,IAAI,CAAA,gFAAA,CAA6E,CAAA;AAAA,IAClH;AACA,IAAA,MAAM,GAAA;AAAA,EACR,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AACF;;;ACnCA,IAAO,eAAQ,aAAA,CAAkD;AAAA,EAC/D,EAAA,EAAI,0BAAA;AAAA,EACJ,WAAA,EAAa,qCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA0D;AAC5F,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AACjC,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,+BAA+B,CAAA;AAC/C,QAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,QAAQ,EAAE,EAAA,EAAI,IAAG,EAAE;AAAA,MAC3C;AACA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAkC,SAAS,EAAE,IAAA,EAAM,YAAY,CAAA;AACpF,MAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,OAAA,EAAU,MAAA,CAAO,EAAE,CAAA,CAAE,CAAA;AACvC,MAAA,OAAO,EAAE,UAAU,CAAA,EAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,MAAA,CAAO,IAAG,EAAE;AAAA,IAClD;AAAA;AAEJ,CAAC","file":"link.js","sourcesContent":["/**\n * HTTP client for marketplace service via Gateway.\n */\n\nconst DEFAULT_GATEWAY_URL = 'http://127.0.0.1:4000';\nconst MARKETPLACE_PREFIX = '/api/v1/marketplace';\nconst FETCH_TIMEOUT_MS = 30_000;\n\nfunction getBaseUrl(): string {\n if (process.env.KB_MARKETPLACE_URL) {\n return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;\n }\n const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;\n return `${gateway}${MARKETPLACE_PREFIX}`;\n}\n\nexport async function post<T = unknown>(path: string, body: Record<string, unknown>): Promise<T> {\n const url = `${getBaseUrl()}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function get<T = unknown>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${getBaseUrl()}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {url.searchParams.set(k, v);}\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url.toString(), { signal: controller.signal });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { post } from '../../http.js';\n\ninterface LinkInput { argv?: string[] }\n\nexport default defineCommand<unknown, LinkInput, { id: string }>({\n id: 'marketplace:plugins:link',\n description: 'Link a local plugin for development',\n\n handler: {\n async execute(ctx: PluginContextV3, input: LinkInput): Promise<CommandResult<{ id: string }>> {\n const pluginPath = input.argv?.[0];\n if (!pluginPath) {\n ctx.ui?.error?.('Specify a plugin path to link');\n return { exitCode: 1, result: { id: '' } };\n }\n const result = await post<{ ok: boolean; id: string }>('/link', { path: pluginPath });\n ctx.ui?.success?.(`Linked ${result.id}`);\n return { exitCode: 0, result: { id: result.id } };\n },\n },\n});\n"]}
@@ -0,0 +1,24 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ interface ListFlags {
4
+ json?: boolean;
5
+ }
6
+ interface ListInput {
7
+ argv?: string[];
8
+ flags?: ListFlags;
9
+ }
10
+ interface EntryRow {
11
+ id: string;
12
+ version: string;
13
+ source: string;
14
+ primaryKind: string;
15
+ provides: string[];
16
+ enabled: boolean;
17
+ }
18
+ interface ListResultData {
19
+ entries: EntryRow[];
20
+ total: number;
21
+ }
22
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, ListInput, ListResultData>;
23
+
24
+ export { _default as default };
@@ -0,0 +1,72 @@
1
+ import { defineCommand } from '@kb-labs/sdk';
2
+
3
+ // src/commands/plugins/list.ts
4
+
5
+ // src/http.ts
6
+ var DEFAULT_GATEWAY_URL = "http://127.0.0.1:4000";
7
+ var MARKETPLACE_PREFIX = "/api/v1/marketplace";
8
+ var FETCH_TIMEOUT_MS = 3e4;
9
+ function getBaseUrl() {
10
+ if (process.env.KB_MARKETPLACE_URL) {
11
+ return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;
12
+ }
13
+ const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;
14
+ return `${gateway}${MARKETPLACE_PREFIX}`;
15
+ }
16
+ async function get(path, params) {
17
+ const url = new URL(`${getBaseUrl()}${path}`);
18
+ if (params) {
19
+ for (const [k, v] of Object.entries(params)) {
20
+ url.searchParams.set(k, v);
21
+ }
22
+ }
23
+ const controller = new AbortController();
24
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
25
+ try {
26
+ const res = await fetch(url.toString(), { signal: controller.signal });
27
+ if (!res.ok) {
28
+ const text = await res.text();
29
+ throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);
30
+ }
31
+ return await res.json();
32
+ } catch (err) {
33
+ if (err.name === "AbortError") {
34
+ throw new Error(`Marketplace ${path} timed out \u2014 is the marketplace service running? (kb-dev start marketplace)`);
35
+ }
36
+ throw err;
37
+ } finally {
38
+ clearTimeout(timer);
39
+ }
40
+ }
41
+
42
+ // src/commands/plugins/list.ts
43
+ var list_default = defineCommand({
44
+ id: "marketplace:plugins:list",
45
+ description: "List installed plugins",
46
+ handler: {
47
+ async execute(ctx, input) {
48
+ const flags = input.flags ?? input;
49
+ const data = await get("/list", { kind: "plugin" });
50
+ if (flags.json) {
51
+ ctx.ui?.json?.(data);
52
+ } else {
53
+ const enabled = data.entries.filter((e) => e.enabled !== false).length;
54
+ const disabled = data.total - enabled;
55
+ ctx.ui?.success?.(`${data.total} plugins (${enabled} enabled, ${disabled} disabled)`, {
56
+ sections: [{
57
+ header: "Plugins",
58
+ items: data.entries.map((e) => {
59
+ const icon = e.enabled !== false ? "\u2705" : "\u23F8";
60
+ return `${icon} ${e.id} ${e.version} (${e.source})`;
61
+ })
62
+ }]
63
+ });
64
+ }
65
+ return { exitCode: 0, result: data };
66
+ }
67
+ }
68
+ });
69
+
70
+ export { list_default as default };
71
+ //# sourceMappingURL=list.js.map
72
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/http.ts","../../../src/commands/plugins/list.ts"],"names":[],"mappings":"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","file":"list.js","sourcesContent":["/**\n * HTTP client for marketplace service via Gateway.\n */\n\nconst DEFAULT_GATEWAY_URL = 'http://127.0.0.1:4000';\nconst MARKETPLACE_PREFIX = '/api/v1/marketplace';\nconst FETCH_TIMEOUT_MS = 30_000;\n\nfunction getBaseUrl(): string {\n if (process.env.KB_MARKETPLACE_URL) {\n return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;\n }\n const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;\n return `${gateway}${MARKETPLACE_PREFIX}`;\n}\n\nexport async function post<T = unknown>(path: string, body: Record<string, unknown>): Promise<T> {\n const url = `${getBaseUrl()}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function get<T = unknown>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${getBaseUrl()}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {url.searchParams.set(k, v);}\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url.toString(), { signal: controller.signal });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { get } from '../../http.js';\n\ninterface ListFlags { json?: boolean }\ninterface ListInput { argv?: string[]; flags?: ListFlags }\n\ninterface EntryRow {\n id: string;\n version: string;\n source: string;\n primaryKind: string;\n provides: string[];\n enabled: boolean;\n}\n\ninterface ListResultData {\n entries: EntryRow[];\n total: number;\n}\n\nexport default defineCommand<unknown, ListInput, ListResultData>({\n id: 'marketplace:plugins:list',\n description: 'List installed plugins',\n\n handler: {\n async execute(ctx: PluginContextV3, input: ListInput): Promise<CommandResult<ListResultData>> {\n const flags = (input.flags ?? input) as ListFlags;\n const data = await get<ListResultData>('/list', { kind: 'plugin' });\n\n if (flags.json) {\n ctx.ui?.json?.(data);\n } else {\n const enabled = data.entries.filter(e => e.enabled !== false).length;\n const disabled = data.total - enabled;\n ctx.ui?.success?.(`${data.total} plugins (${enabled} enabled, ${disabled} disabled)`, {\n sections: [{\n header: 'Plugins',\n items: data.entries.map(e => {\n const icon = e.enabled !== false ? '✅' : '⏸';\n return `${icon} ${e.id} ${e.version} (${e.source})`;\n }),\n }],\n });\n }\n\n return { exitCode: 0, result: data };\n },\n },\n});\n"]}
@@ -0,0 +1,10 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ interface UnlinkInput {
4
+ argv?: string[];
5
+ }
6
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, UnlinkInput, {
7
+ packageId: string;
8
+ }>;
9
+
10
+ export { _default as default };
@@ -0,0 +1,62 @@
1
+ import { defineCommand } from '@kb-labs/sdk';
2
+
3
+ // src/commands/plugins/unlink.ts
4
+
5
+ // src/http.ts
6
+ var DEFAULT_GATEWAY_URL = "http://127.0.0.1:4000";
7
+ var MARKETPLACE_PREFIX = "/api/v1/marketplace";
8
+ var FETCH_TIMEOUT_MS = 3e4;
9
+ function getBaseUrl() {
10
+ if (process.env.KB_MARKETPLACE_URL) {
11
+ return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;
12
+ }
13
+ const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;
14
+ return `${gateway}${MARKETPLACE_PREFIX}`;
15
+ }
16
+ async function post(path, body) {
17
+ const url = `${getBaseUrl()}${path}`;
18
+ const controller = new AbortController();
19
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
20
+ try {
21
+ const res = await fetch(url, {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify(body),
25
+ signal: controller.signal
26
+ });
27
+ if (!res.ok) {
28
+ const text = await res.text();
29
+ throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);
30
+ }
31
+ return await res.json();
32
+ } catch (err) {
33
+ if (err.name === "AbortError") {
34
+ throw new Error(`Marketplace ${path} timed out \u2014 is the marketplace service running? (kb-dev start marketplace)`);
35
+ }
36
+ throw err;
37
+ } finally {
38
+ clearTimeout(timer);
39
+ }
40
+ }
41
+
42
+ // src/commands/plugins/unlink.ts
43
+ var unlink_default = defineCommand({
44
+ id: "marketplace:plugins:unlink",
45
+ description: "Unlink a plugin",
46
+ handler: {
47
+ async execute(ctx, input) {
48
+ const packageId = input.argv?.[0];
49
+ if (!packageId) {
50
+ ctx.ui?.error?.("Specify a package ID to unlink");
51
+ return { exitCode: 1, result: { packageId: "" } };
52
+ }
53
+ await post("/unlink", { packageId });
54
+ ctx.ui?.success?.(`Unlinked ${packageId}`);
55
+ return { exitCode: 0, result: { packageId } };
56
+ }
57
+ }
58
+ });
59
+
60
+ export { unlink_default as default };
61
+ //# sourceMappingURL=unlink.js.map
62
+ //# sourceMappingURL=unlink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/http.ts","../../../src/commands/plugins/unlink.ts"],"names":[],"mappings":";;;;;AAIA,IAAM,mBAAA,GAAsB,uBAAA;AAC5B,IAAM,kBAAA,GAAqB,qBAAA;AAC3B,IAAM,gBAAA,GAAmB,GAAA;AAEzB,SAAS,UAAA,GAAqB;AAC5B,EAAA,IAAI,OAAA,CAAQ,IAAI,kBAAA,EAAoB;AAClC,IAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,kBAAkB,GAAG,kBAAkB,CAAA,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,cAAA,IAAkB,mBAAA;AAC9C,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,kBAAkB,CAAA,CAAA;AACxC;AAEA,eAAsB,IAAA,CAAkB,MAAc,IAAA,EAA2C;AAC/F,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,UAAA,EAAY,GAAG,IAAI,CAAA,CAAA;AAClC,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,gBAAgB,CAAA;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,IAAI,MAAM,CAAA,YAAA,EAAe,IAAI,YAAY,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,EACxB,SAAS,GAAA,EAAK;AACZ,IAAA,IAAK,GAAA,CAAc,SAAS,YAAA,EAAc;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,IAAI,CAAA,gFAAA,CAA6E,CAAA;AAAA,IAClH;AACA,IAAA,MAAM,GAAA;AAAA,EACR,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AACF;;;ACnCA,IAAO,iBAAQ,aAAA,CAA2D;AAAA,EACxE,EAAA,EAAI,4BAAA;AAAA,EACJ,WAAA,EAAa,iBAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAmE;AACrG,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA;AAChC,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,gCAAgC,CAAA;AAChD,QAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,QAAQ,EAAE,SAAA,EAAW,IAAG,EAAE;AAAA,MAClD;AACA,MAAA,MAAM,IAAA,CAAK,SAAA,EAAW,EAAE,SAAA,EAAW,CAAA;AACnC,MAAA,GAAA,CAAI,EAAA,EAAI,OAAA,GAAU,CAAA,SAAA,EAAY,SAAS,CAAA,CAAE,CAAA;AACzC,MAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,MAAA,EAAQ,EAAE,WAAU,EAAE;AAAA,IAC9C;AAAA;AAEJ,CAAC","file":"unlink.js","sourcesContent":["/**\n * HTTP client for marketplace service via Gateway.\n */\n\nconst DEFAULT_GATEWAY_URL = 'http://127.0.0.1:4000';\nconst MARKETPLACE_PREFIX = '/api/v1/marketplace';\nconst FETCH_TIMEOUT_MS = 30_000;\n\nfunction getBaseUrl(): string {\n if (process.env.KB_MARKETPLACE_URL) {\n return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;\n }\n const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;\n return `${gateway}${MARKETPLACE_PREFIX}`;\n}\n\nexport async function post<T = unknown>(path: string, body: Record<string, unknown>): Promise<T> {\n const url = `${getBaseUrl()}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function get<T = unknown>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${getBaseUrl()}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {url.searchParams.set(k, v);}\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url.toString(), { signal: controller.signal });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { post } from '../../http.js';\n\ninterface UnlinkInput { argv?: string[] }\n\nexport default defineCommand<unknown, UnlinkInput, { packageId: string }>({\n id: 'marketplace:plugins:unlink',\n description: 'Unlink a plugin',\n\n handler: {\n async execute(ctx: PluginContextV3, input: UnlinkInput): Promise<CommandResult<{ packageId: string }>> {\n const packageId = input.argv?.[0];\n if (!packageId) {\n ctx.ui?.error?.('Specify a package ID to unlink');\n return { exitCode: 1, result: { packageId: '' } };\n }\n await post('/unlink', { packageId });\n ctx.ui?.success?.(`Unlinked ${packageId}`);\n return { exitCode: 0, result: { packageId } };\n },\n },\n});\n"]}
@@ -0,0 +1,26 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ interface SyncFlags {
4
+ 'auto-enable'?: boolean;
5
+ json?: boolean;
6
+ }
7
+ interface SyncInput {
8
+ argv?: string[];
9
+ flags?: SyncFlags;
10
+ }
11
+ interface SyncEntry {
12
+ id: string;
13
+ primaryKind: string;
14
+ version: string;
15
+ }
16
+ interface SyncResultData {
17
+ added: SyncEntry[];
18
+ skipped: Array<{
19
+ id: string;
20
+ reason: string;
21
+ }>;
22
+ total: number;
23
+ }
24
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, SyncInput, SyncResultData>;
25
+
26
+ export { _default as default };
@@ -0,0 +1,91 @@
1
+ import { defineCommand } from '@kb-labs/sdk';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+
5
+ // src/commands/sync.ts
6
+
7
+ // src/http.ts
8
+ var DEFAULT_GATEWAY_URL = "http://127.0.0.1:4000";
9
+ var MARKETPLACE_PREFIX = "/api/v1/marketplace";
10
+ var FETCH_TIMEOUT_MS = 3e4;
11
+ function getBaseUrl() {
12
+ if (process.env.KB_MARKETPLACE_URL) {
13
+ return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;
14
+ }
15
+ const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;
16
+ return `${gateway}${MARKETPLACE_PREFIX}`;
17
+ }
18
+ async function post(path2, body) {
19
+ const url = `${getBaseUrl()}${path2}`;
20
+ const controller = new AbortController();
21
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
22
+ try {
23
+ const res = await fetch(url, {
24
+ method: "POST",
25
+ headers: { "Content-Type": "application/json" },
26
+ body: JSON.stringify(body),
27
+ signal: controller.signal
28
+ });
29
+ if (!res.ok) {
30
+ const text = await res.text();
31
+ throw new Error(`Marketplace ${path2} failed (${res.status}): ${text}`);
32
+ }
33
+ return await res.json();
34
+ } catch (err) {
35
+ if (err.name === "AbortError") {
36
+ throw new Error(`Marketplace ${path2} timed out \u2014 is the marketplace service running? (kb-dev start marketplace)`);
37
+ }
38
+ throw err;
39
+ } finally {
40
+ clearTimeout(timer);
41
+ }
42
+ }
43
+ var sync_default = defineCommand({
44
+ id: "marketplace:sync",
45
+ description: "Sync workspace \u2014 scan for entities and populate lock",
46
+ handler: {
47
+ async execute(ctx, input) {
48
+ const flags = input.flags ?? input;
49
+ const cwd = ctx.cwd ?? process.cwd();
50
+ const syncConfig = await loadSyncConfig(cwd);
51
+ if (!syncConfig.include?.length) {
52
+ ctx.ui?.error?.("No marketplace.sync.include in kb.config.json");
53
+ return { exitCode: 1, result: { added: [], skipped: [], total: 0 } };
54
+ }
55
+ const isDev = (process.env.NODE_ENV ?? "development") === "development";
56
+ const result = await post("/sync", {
57
+ include: syncConfig.include,
58
+ exclude: syncConfig.exclude,
59
+ autoEnable: flags["auto-enable"] !== void 0 ? Boolean(flags["auto-enable"]) : isDev
60
+ });
61
+ if (flags.json) {
62
+ ctx.ui?.json?.(result);
63
+ } else if (result.added.length === 0) {
64
+ ctx.ui?.info?.(`Lock is up to date (${result.total} entries)`);
65
+ } else {
66
+ ctx.ui?.success?.(`Synced ${result.added.length} new entries (${result.total} total)`, {
67
+ sections: [{
68
+ header: "Added",
69
+ items: result.added.map((e) => `+ ${e.id} (${e.primaryKind}) v${e.version}`)
70
+ }]
71
+ });
72
+ }
73
+ return { exitCode: 0, result };
74
+ }
75
+ }
76
+ });
77
+ async function loadSyncConfig(cwd) {
78
+ for (const p of [path.join(cwd, ".kb", "kb.config.json"), path.join(cwd, "kb.config.json")]) {
79
+ try {
80
+ const raw = await fs.readFile(p, "utf-8");
81
+ return JSON.parse(raw)?.marketplace?.sync ?? {};
82
+ } catch {
83
+ continue;
84
+ }
85
+ }
86
+ return {};
87
+ }
88
+
89
+ export { sync_default as default };
90
+ //# sourceMappingURL=sync.js.map
91
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/http.ts","../../src/commands/sync.ts"],"names":["path"],"mappings":"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","file":"sync.js","sourcesContent":["/**\n * HTTP client for marketplace service via Gateway.\n */\n\nconst DEFAULT_GATEWAY_URL = 'http://127.0.0.1:4000';\nconst MARKETPLACE_PREFIX = '/api/v1/marketplace';\nconst FETCH_TIMEOUT_MS = 30_000;\n\nfunction getBaseUrl(): string {\n if (process.env.KB_MARKETPLACE_URL) {\n return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;\n }\n const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;\n return `${gateway}${MARKETPLACE_PREFIX}`;\n}\n\nexport async function post<T = unknown>(path: string, body: Record<string, unknown>): Promise<T> {\n const url = `${getBaseUrl()}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function get<T = unknown>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${getBaseUrl()}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {url.searchParams.set(k, v);}\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url.toString(), { signal: controller.signal });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { post } from '../http.js';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\ninterface SyncFlags {\n 'auto-enable'?: boolean;\n json?: boolean;\n}\n\ninterface SyncInput {\n argv?: string[];\n flags?: SyncFlags;\n}\n\ninterface SyncEntry {\n id: string;\n primaryKind: string;\n version: string;\n}\n\ninterface SyncResultData {\n added: SyncEntry[];\n skipped: Array<{ id: string; reason: string }>;\n total: number;\n}\n\nexport default defineCommand<unknown, SyncInput, SyncResultData>({\n id: 'marketplace:sync',\n description: 'Sync workspace — scan for entities and populate lock',\n\n handler: {\n async execute(ctx: PluginContextV3, input: SyncInput): Promise<CommandResult<SyncResultData>> {\n const flags = (input.flags ?? input) as SyncFlags;\n const cwd = ctx.cwd ?? process.cwd();\n const syncConfig = await loadSyncConfig(cwd);\n\n if (!syncConfig.include?.length) {\n ctx.ui?.error?.('No marketplace.sync.include in kb.config.json');\n return { exitCode: 1, result: { added: [], skipped: [], total: 0 } };\n }\n\n const isDev = (process.env.NODE_ENV ?? 'development') === 'development';\n const result = await post<SyncResultData>('/sync', {\n include: syncConfig.include,\n exclude: syncConfig.exclude,\n autoEnable: flags['auto-enable'] !== undefined ? Boolean(flags['auto-enable']) : isDev,\n });\n\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else if (result.added.length === 0) {\n ctx.ui?.info?.(`Lock is up to date (${result.total} entries)`);\n } else {\n ctx.ui?.success?.(`Synced ${result.added.length} new entries (${result.total} total)`, {\n sections: [{\n header: 'Added',\n items: result.added.map(e => `+ ${e.id} (${e.primaryKind}) v${e.version}`),\n }],\n });\n }\n\n return { exitCode: 0, result };\n },\n },\n});\n\nasync function loadSyncConfig(cwd: string): Promise<{ include?: string[]; exclude?: string[] }> {\n for (const p of [path.join(cwd, '.kb', 'kb.config.json'), path.join(cwd, 'kb.config.json')]) {\n try {\n const raw = await fs.readFile(p, 'utf-8');\n return JSON.parse(raw)?.marketplace?.sync ?? {};\n } catch { continue; }\n }\n return {};\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ interface UninstallInput {
4
+ argv?: string[];
5
+ }
6
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, UninstallInput, {
7
+ removed: string[];
8
+ }>;
9
+
10
+ export { _default as default };
@@ -0,0 +1,62 @@
1
+ import { defineCommand } from '@kb-labs/sdk';
2
+
3
+ // src/commands/uninstall.ts
4
+
5
+ // src/http.ts
6
+ var DEFAULT_GATEWAY_URL = "http://127.0.0.1:4000";
7
+ var MARKETPLACE_PREFIX = "/api/v1/marketplace";
8
+ var FETCH_TIMEOUT_MS = 3e4;
9
+ function getBaseUrl() {
10
+ if (process.env.KB_MARKETPLACE_URL) {
11
+ return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;
12
+ }
13
+ const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;
14
+ return `${gateway}${MARKETPLACE_PREFIX}`;
15
+ }
16
+ async function post(path, body) {
17
+ const url = `${getBaseUrl()}${path}`;
18
+ const controller = new AbortController();
19
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
20
+ try {
21
+ const res = await fetch(url, {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify(body),
25
+ signal: controller.signal
26
+ });
27
+ if (!res.ok) {
28
+ const text = await res.text();
29
+ throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);
30
+ }
31
+ return await res.json();
32
+ } catch (err) {
33
+ if (err.name === "AbortError") {
34
+ throw new Error(`Marketplace ${path} timed out \u2014 is the marketplace service running? (kb-dev start marketplace)`);
35
+ }
36
+ throw err;
37
+ } finally {
38
+ clearTimeout(timer);
39
+ }
40
+ }
41
+
42
+ // src/commands/uninstall.ts
43
+ var uninstall_default = defineCommand({
44
+ id: "marketplace:uninstall",
45
+ description: "Uninstall package(s) from marketplace",
46
+ handler: {
47
+ async execute(ctx, input) {
48
+ const argv = input.argv ?? [];
49
+ if (argv.length === 0) {
50
+ ctx.ui?.error?.("Please specify at least one package to uninstall");
51
+ return { exitCode: 1, result: { removed: [] } };
52
+ }
53
+ const result = await post("/uninstall", { packageIds: argv });
54
+ ctx.ui?.success?.(`Removed: ${result.removed.join(", ")}`);
55
+ return { exitCode: 0, result: { removed: result.removed } };
56
+ }
57
+ }
58
+ });
59
+
60
+ export { uninstall_default as default };
61
+ //# sourceMappingURL=uninstall.js.map
62
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/http.ts","../../src/commands/uninstall.ts"],"names":[],"mappings":";;;;;AAIA,IAAM,mBAAA,GAAsB,uBAAA;AAC5B,IAAM,kBAAA,GAAqB,qBAAA;AAC3B,IAAM,gBAAA,GAAmB,GAAA;AAEzB,SAAS,UAAA,GAAqB;AAC5B,EAAA,IAAI,OAAA,CAAQ,IAAI,kBAAA,EAAoB;AAClC,IAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,kBAAkB,GAAG,kBAAkB,CAAA,CAAA;AAAA,EAC/D;AACA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,cAAA,IAAkB,mBAAA;AAC9C,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,kBAAkB,CAAA,CAAA;AACxC;AAEA,eAAsB,IAAA,CAAkB,MAAc,IAAA,EAA2C;AAC/F,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,UAAA,EAAY,GAAG,IAAI,CAAA,CAAA;AAClC,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,gBAAgB,CAAA;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAC3B,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACzB,QAAQ,UAAA,CAAW;AAAA,KACpB,CAAA;AACD,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,MAAM,IAAI,MAAM,CAAA,YAAA,EAAe,IAAI,YAAY,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,EACxB,SAAS,GAAA,EAAK;AACZ,IAAA,IAAK,GAAA,CAAc,SAAS,YAAA,EAAc;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,IAAI,CAAA,gFAAA,CAA6E,CAAA;AAAA,IAClH;AACA,IAAA,MAAM,GAAA;AAAA,EACR,CAAA,SAAE;AACA,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AACF;;;ACjCA,IAAO,oBAAQ,aAAA,CAA8D;AAAA,EAC3E,EAAA,EAAI,uBAAA;AAAA,EACJ,WAAA,EAAa,uCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAsE;AACxG,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,EAAC;AAC5B,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,QAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,kDAAkD,CAAA;AAClE,QAAA,OAAO,EAAE,UAAU,CAAA,EAAG,MAAA,EAAQ,EAAE,OAAA,EAAS,IAAG,EAAE;AAAA,MAChD;AAEA,MAAA,MAAM,SAAS,MAAM,IAAA,CAAyC,cAAc,EAAE,UAAA,EAAY,MAAM,CAAA;AAEhG,MAAA,GAAA,CAAI,EAAA,EAAI,UAAU,CAAA,SAAA,EAAY,MAAA,CAAO,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACzD,MAAA,OAAO,EAAE,UAAU,CAAA,EAAG,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAA,CAAO,SAAQ,EAAE;AAAA,IAC5D;AAAA;AAEJ,CAAC","file":"uninstall.js","sourcesContent":["/**\n * HTTP client for marketplace service via Gateway.\n */\n\nconst DEFAULT_GATEWAY_URL = 'http://127.0.0.1:4000';\nconst MARKETPLACE_PREFIX = '/api/v1/marketplace';\nconst FETCH_TIMEOUT_MS = 30_000;\n\nfunction getBaseUrl(): string {\n if (process.env.KB_MARKETPLACE_URL) {\n return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;\n }\n const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;\n return `${gateway}${MARKETPLACE_PREFIX}`;\n}\n\nexport async function post<T = unknown>(path: string, body: Record<string, unknown>): Promise<T> {\n const url = `${getBaseUrl()}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function get<T = unknown>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${getBaseUrl()}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {url.searchParams.set(k, v);}\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url.toString(), { signal: controller.signal });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { post } from '../http.js';\n\ninterface UninstallInput {\n argv?: string[];\n}\n\nexport default defineCommand<unknown, UninstallInput, { removed: string[] }>({\n id: 'marketplace:uninstall',\n description: 'Uninstall package(s) from marketplace',\n\n handler: {\n async execute(ctx: PluginContextV3, input: UninstallInput): Promise<CommandResult<{ removed: string[] }>> {\n const argv = input.argv ?? [];\n if (argv.length === 0) {\n ctx.ui?.error?.('Please specify at least one package to uninstall');\n return { exitCode: 1, result: { removed: [] } };\n }\n\n const result = await post<{ ok: boolean; removed: string[] }>('/uninstall', { packageIds: argv });\n\n ctx.ui?.success?.(`Removed: ${result.removed.join(', ')}`);\n return { exitCode: 0, result: { removed: result.removed } };\n },\n },\n});\n"]}
@@ -0,0 +1,19 @@
1
+ import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
2
+
3
+ interface UpdateInput {
4
+ argv?: string[];
5
+ flags?: {
6
+ json?: boolean;
7
+ };
8
+ }
9
+ interface UpdateResultData {
10
+ installed: Array<{
11
+ id: string;
12
+ version: string;
13
+ primaryKind: string;
14
+ }>;
15
+ warnings: string[];
16
+ }
17
+ declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, UpdateInput, UpdateResultData>;
18
+
19
+ export { _default as default };
@@ -0,0 +1,69 @@
1
+ import { defineCommand } from '@kb-labs/sdk';
2
+
3
+ // src/commands/update.ts
4
+
5
+ // src/http.ts
6
+ var DEFAULT_GATEWAY_URL = "http://127.0.0.1:4000";
7
+ var MARKETPLACE_PREFIX = "/api/v1/marketplace";
8
+ var FETCH_TIMEOUT_MS = 3e4;
9
+ function getBaseUrl() {
10
+ if (process.env.KB_MARKETPLACE_URL) {
11
+ return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;
12
+ }
13
+ const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;
14
+ return `${gateway}${MARKETPLACE_PREFIX}`;
15
+ }
16
+ async function post(path, body) {
17
+ const url = `${getBaseUrl()}${path}`;
18
+ const controller = new AbortController();
19
+ const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
20
+ try {
21
+ const res = await fetch(url, {
22
+ method: "POST",
23
+ headers: { "Content-Type": "application/json" },
24
+ body: JSON.stringify(body),
25
+ signal: controller.signal
26
+ });
27
+ if (!res.ok) {
28
+ const text = await res.text();
29
+ throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);
30
+ }
31
+ return await res.json();
32
+ } catch (err) {
33
+ if (err.name === "AbortError") {
34
+ throw new Error(`Marketplace ${path} timed out \u2014 is the marketplace service running? (kb-dev start marketplace)`);
35
+ }
36
+ throw err;
37
+ } finally {
38
+ clearTimeout(timer);
39
+ }
40
+ }
41
+
42
+ // src/commands/update.ts
43
+ var update_default = defineCommand({
44
+ id: "marketplace:update",
45
+ description: "Update marketplace package(s)",
46
+ handler: {
47
+ async execute(ctx, input) {
48
+ const argv = input.argv ?? [];
49
+ const result = await post("/update", {
50
+ packageIds: argv.length > 0 ? argv : void 0
51
+ });
52
+ if (result.installed.length === 0) {
53
+ ctx.ui?.info?.("Nothing to update");
54
+ } else {
55
+ ctx.ui?.success?.("Update completed", {
56
+ sections: [{
57
+ header: "Updated",
58
+ items: result.installed.map((p) => `${p.id}@${p.version} (${p.primaryKind})`)
59
+ }]
60
+ });
61
+ }
62
+ return { exitCode: 0, result };
63
+ }
64
+ }
65
+ });
66
+
67
+ export { update_default as default };
68
+ //# sourceMappingURL=update.js.map
69
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/http.ts","../../src/commands/update.ts"],"names":[],"mappings":"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","file":"update.js","sourcesContent":["/**\n * HTTP client for marketplace service via Gateway.\n */\n\nconst DEFAULT_GATEWAY_URL = 'http://127.0.0.1:4000';\nconst MARKETPLACE_PREFIX = '/api/v1/marketplace';\nconst FETCH_TIMEOUT_MS = 30_000;\n\nfunction getBaseUrl(): string {\n if (process.env.KB_MARKETPLACE_URL) {\n return `${process.env.KB_MARKETPLACE_URL}${MARKETPLACE_PREFIX}`;\n }\n const gateway = process.env.KB_GATEWAY_URL ?? DEFAULT_GATEWAY_URL;\n return `${gateway}${MARKETPLACE_PREFIX}`;\n}\n\nexport async function post<T = unknown>(path: string, body: Record<string, unknown>): Promise<T> {\n const url = `${getBaseUrl()}${path}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function get<T = unknown>(path: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${getBaseUrl()}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {url.searchParams.set(k, v);}\n }\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);\n try {\n const res = await fetch(url.toString(), { signal: controller.signal });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`Marketplace ${path} failed (${res.status}): ${text}`);\n }\n return await res.json() as T;\n } catch (err) {\n if ((err as Error).name === 'AbortError') {\n throw new Error(`Marketplace ${path} timed out — is the marketplace service running? (kb-dev start marketplace)`);\n }\n throw err;\n } finally {\n clearTimeout(timer);\n }\n}\n","import { defineCommand, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { post } from '../http.js';\n\ninterface UpdateInput {\n argv?: string[];\n flags?: { json?: boolean };\n}\n\ninterface UpdateResultData {\n installed: Array<{ id: string; version: string; primaryKind: string }>;\n warnings: string[];\n}\n\nexport default defineCommand<unknown, UpdateInput, UpdateResultData>({\n id: 'marketplace:update',\n description: 'Update marketplace package(s)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: UpdateInput): Promise<CommandResult<UpdateResultData>> {\n const argv = input.argv ?? [];\n const result = await post<UpdateResultData>('/update', {\n packageIds: argv.length > 0 ? argv : undefined,\n });\n\n if (result.installed.length === 0) {\n ctx.ui?.info?.('Nothing to update');\n } else {\n ctx.ui?.success?.('Update completed', {\n sections: [{\n header: 'Updated',\n items: result.installed.map(p => `${p.id}@${p.version} (${p.primaryKind})`),\n }],\n });\n }\n\n return { exitCode: 0, result };\n },\n },\n});\n"]}
@@ -0,0 +1 @@
1
+ export { default as manifest } from './manifest.js';
package/dist/index.js ADDED
@@ -0,0 +1,35 @@
1
+ // src/manifest.ts
2
+ var manifest = {
3
+ schema: "kb.plugin/3",
4
+ id: "@kb-labs/marketplace",
5
+ version: "0.1.0",
6
+ display: {
7
+ name: "Marketplace",
8
+ description: "Unified marketplace for plugins, adapters, workflows, and more",
9
+ tags: ["marketplace", "plugins", "adapters"]
10
+ },
11
+ cli: {
12
+ groupMeta: [
13
+ { name: "marketplace", describe: "Marketplace management commands" },
14
+ { name: "marketplace/plugins", describe: "Plugin management" }
15
+ ],
16
+ commands: [
17
+ // Top-level: kb marketplace install
18
+ { id: "install", group: "marketplace", describe: "Install package(s)", handler: "./commands/install.js#default" },
19
+ { id: "uninstall", group: "marketplace", describe: "Uninstall package(s)", handler: "./commands/uninstall.js#default" },
20
+ { id: "update", group: "marketplace", describe: "Update package(s)", handler: "./commands/update.js#default" },
21
+ { id: "sync", group: "marketplace", describe: "Sync workspace to lock", handler: "./commands/sync.js#default" },
22
+ // Subgroup: kb marketplace plugins list
23
+ { id: "list", group: "marketplace", subgroup: "plugins", describe: "List installed plugins", handler: "./commands/plugins/list.js#default" },
24
+ { id: "enable", group: "marketplace", subgroup: "plugins", describe: "Enable a plugin", handler: "./commands/plugins/enable.js#default" },
25
+ { id: "disable", group: "marketplace", subgroup: "plugins", describe: "Disable a plugin", handler: "./commands/plugins/disable.js#default" },
26
+ { id: "link", group: "marketplace", subgroup: "plugins", describe: "Link a local plugin", handler: "./commands/plugins/link.js#default" },
27
+ { id: "unlink", group: "marketplace", subgroup: "plugins", describe: "Unlink a plugin", handler: "./commands/plugins/unlink.js#default" },
28
+ { id: "doctor", group: "marketplace", subgroup: "plugins", describe: "Diagnose issues", handler: "./commands/plugins/doctor.js#default" }
29
+ ]
30
+ }
31
+ };
32
+
33
+ export { manifest };
34
+ //# sourceMappingURL=index.js.map
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/manifest.ts"],"names":[],"mappings":";AAMO,IAAM,QAAA,GAAW;AAAA,EACtB,MAAA,EAAQ,aAAA;AAAA,EACR,EAAA,EAAI,sBAAA;AAAA,EACJ,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,gEAAA;AAAA,IACb,IAAA,EAAM,CAAC,aAAA,EAAe,SAAA,EAAW,UAAU;AAAA,GAC7C;AAAA,EACA,GAAA,EAAK;AAAA,IACH,SAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAM,aAAA,EAAe,QAAA,EAAU,iCAAA,EAAkC;AAAA,MACnE,EAAE,IAAA,EAAM,qBAAA,EAAuB,QAAA,EAAU,mBAAA;AAAoB,KAC/D;AAAA,IACA,QAAA,EAAU;AAAA;AAAA,MAER,EAAE,IAAI,SAAA,EAAW,KAAA,EAAO,eAAe,QAAA,EAAU,oBAAA,EAAsB,SAAS,+BAAA,EAAgC;AAAA,MAChH,EAAE,IAAI,WAAA,EAAa,KAAA,EAAO,eAAe,QAAA,EAAU,sBAAA,EAAwB,SAAS,iCAAA,EAAkC;AAAA,MACtH,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,eAAe,QAAA,EAAU,mBAAA,EAAqB,SAAS,8BAAA,EAA+B;AAAA,MAC7G,EAAE,IAAI,MAAA,EAAQ,KAAA,EAAO,eAAe,QAAA,EAAU,wBAAA,EAA0B,SAAS,4BAAA,EAA6B;AAAA;AAAA,MAE9G,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,wBAAA,EAA0B,OAAA,EAAS,oCAAA,EAAqC;AAAA,MAC3I,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,iBAAA,EAAmB,OAAA,EAAS,sCAAA,EAAuC;AAAA,MACxI,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,kBAAA,EAAoB,OAAA,EAAS,uCAAA,EAAwC;AAAA,MAC3I,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,qBAAA,EAAuB,OAAA,EAAS,oCAAA,EAAqC;AAAA,MACxI,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,iBAAA,EAAmB,OAAA,EAAS,sCAAA,EAAuC;AAAA,MACxI,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,iBAAA,EAAmB,OAAA,EAAS,sCAAA;AAAuC;AAC1I;AAEJ","file":"index.js","sourcesContent":["/**\n * @module @kb-labs/marketplace-cli/manifest\n * ManifestV3 for marketplace CLI plugin.\n * Declares commands with subgroups for nested routing.\n */\n\nexport const manifest = {\n schema: 'kb.plugin/3' as const,\n id: '@kb-labs/marketplace',\n version: '0.1.0',\n display: {\n name: 'Marketplace',\n description: 'Unified marketplace for plugins, adapters, workflows, and more',\n tags: ['marketplace', 'plugins', 'adapters'],\n },\n cli: {\n groupMeta: [\n { name: 'marketplace', describe: 'Marketplace management commands' },\n { name: 'marketplace/plugins', describe: 'Plugin management' },\n ],\n commands: [\n // Top-level: kb marketplace install\n { id: 'install', group: 'marketplace', describe: 'Install package(s)', handler: './commands/install.js#default' },\n { id: 'uninstall', group: 'marketplace', describe: 'Uninstall package(s)', handler: './commands/uninstall.js#default' },\n { id: 'update', group: 'marketplace', describe: 'Update package(s)', handler: './commands/update.js#default' },\n { id: 'sync', group: 'marketplace', describe: 'Sync workspace to lock', handler: './commands/sync.js#default' },\n // Subgroup: kb marketplace plugins list\n { id: 'list', group: 'marketplace', subgroup: 'plugins', describe: 'List installed plugins', handler: './commands/plugins/list.js#default' },\n { id: 'enable', group: 'marketplace', subgroup: 'plugins', describe: 'Enable a plugin', handler: './commands/plugins/enable.js#default' },\n { id: 'disable', group: 'marketplace', subgroup: 'plugins', describe: 'Disable a plugin', handler: './commands/plugins/disable.js#default' },\n { id: 'link', group: 'marketplace', subgroup: 'plugins', describe: 'Link a local plugin', handler: './commands/plugins/link.js#default' },\n { id: 'unlink', group: 'marketplace', subgroup: 'plugins', describe: 'Unlink a plugin', handler: './commands/plugins/unlink.js#default' },\n { id: 'doctor', group: 'marketplace', subgroup: 'plugins', describe: 'Diagnose issues', handler: './commands/plugins/doctor.js#default' },\n ],\n },\n};\n\nexport default manifest;\n"]}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @module @kb-labs/marketplace-cli/manifest
3
+ * ManifestV3 for marketplace CLI plugin.
4
+ * Declares commands with subgroups for nested routing.
5
+ */
6
+ declare const manifest: {
7
+ schema: "kb.plugin/3";
8
+ id: string;
9
+ version: string;
10
+ display: {
11
+ name: string;
12
+ description: string;
13
+ tags: string[];
14
+ };
15
+ cli: {
16
+ groupMeta: {
17
+ name: string;
18
+ describe: string;
19
+ }[];
20
+ commands: ({
21
+ id: string;
22
+ group: string;
23
+ describe: string;
24
+ handler: string;
25
+ subgroup?: undefined;
26
+ } | {
27
+ id: string;
28
+ group: string;
29
+ subgroup: string;
30
+ describe: string;
31
+ handler: string;
32
+ })[];
33
+ };
34
+ };
35
+
36
+ export { manifest as default, manifest };
@@ -0,0 +1,36 @@
1
+ // src/manifest.ts
2
+ var manifest = {
3
+ schema: "kb.plugin/3",
4
+ id: "@kb-labs/marketplace",
5
+ version: "0.1.0",
6
+ display: {
7
+ name: "Marketplace",
8
+ description: "Unified marketplace for plugins, adapters, workflows, and more",
9
+ tags: ["marketplace", "plugins", "adapters"]
10
+ },
11
+ cli: {
12
+ groupMeta: [
13
+ { name: "marketplace", describe: "Marketplace management commands" },
14
+ { name: "marketplace/plugins", describe: "Plugin management" }
15
+ ],
16
+ commands: [
17
+ // Top-level: kb marketplace install
18
+ { id: "install", group: "marketplace", describe: "Install package(s)", handler: "./commands/install.js#default" },
19
+ { id: "uninstall", group: "marketplace", describe: "Uninstall package(s)", handler: "./commands/uninstall.js#default" },
20
+ { id: "update", group: "marketplace", describe: "Update package(s)", handler: "./commands/update.js#default" },
21
+ { id: "sync", group: "marketplace", describe: "Sync workspace to lock", handler: "./commands/sync.js#default" },
22
+ // Subgroup: kb marketplace plugins list
23
+ { id: "list", group: "marketplace", subgroup: "plugins", describe: "List installed plugins", handler: "./commands/plugins/list.js#default" },
24
+ { id: "enable", group: "marketplace", subgroup: "plugins", describe: "Enable a plugin", handler: "./commands/plugins/enable.js#default" },
25
+ { id: "disable", group: "marketplace", subgroup: "plugins", describe: "Disable a plugin", handler: "./commands/plugins/disable.js#default" },
26
+ { id: "link", group: "marketplace", subgroup: "plugins", describe: "Link a local plugin", handler: "./commands/plugins/link.js#default" },
27
+ { id: "unlink", group: "marketplace", subgroup: "plugins", describe: "Unlink a plugin", handler: "./commands/plugins/unlink.js#default" },
28
+ { id: "doctor", group: "marketplace", subgroup: "plugins", describe: "Diagnose issues", handler: "./commands/plugins/doctor.js#default" }
29
+ ]
30
+ }
31
+ };
32
+ var manifest_default = manifest;
33
+
34
+ export { manifest_default as default, manifest };
35
+ //# sourceMappingURL=manifest.js.map
36
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/manifest.ts"],"names":[],"mappings":";AAMO,IAAM,QAAA,GAAW;AAAA,EACtB,MAAA,EAAQ,aAAA;AAAA,EACR,EAAA,EAAI,sBAAA;AAAA,EACJ,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,gEAAA;AAAA,IACb,IAAA,EAAM,CAAC,aAAA,EAAe,SAAA,EAAW,UAAU;AAAA,GAC7C;AAAA,EACA,GAAA,EAAK;AAAA,IACH,SAAA,EAAW;AAAA,MACT,EAAE,IAAA,EAAM,aAAA,EAAe,QAAA,EAAU,iCAAA,EAAkC;AAAA,MACnE,EAAE,IAAA,EAAM,qBAAA,EAAuB,QAAA,EAAU,mBAAA;AAAoB,KAC/D;AAAA,IACA,QAAA,EAAU;AAAA;AAAA,MAER,EAAE,IAAI,SAAA,EAAW,KAAA,EAAO,eAAe,QAAA,EAAU,oBAAA,EAAsB,SAAS,+BAAA,EAAgC;AAAA,MAChH,EAAE,IAAI,WAAA,EAAa,KAAA,EAAO,eAAe,QAAA,EAAU,sBAAA,EAAwB,SAAS,iCAAA,EAAkC;AAAA,MACtH,EAAE,IAAI,QAAA,EAAU,KAAA,EAAO,eAAe,QAAA,EAAU,mBAAA,EAAqB,SAAS,8BAAA,EAA+B;AAAA,MAC7G,EAAE,IAAI,MAAA,EAAQ,KAAA,EAAO,eAAe,QAAA,EAAU,wBAAA,EAA0B,SAAS,4BAAA,EAA6B;AAAA;AAAA,MAE9G,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,wBAAA,EAA0B,OAAA,EAAS,oCAAA,EAAqC;AAAA,MAC3I,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,iBAAA,EAAmB,OAAA,EAAS,sCAAA,EAAuC;AAAA,MACxI,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,kBAAA,EAAoB,OAAA,EAAS,uCAAA,EAAwC;AAAA,MAC3I,EAAE,EAAA,EAAI,MAAA,EAAQ,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,qBAAA,EAAuB,OAAA,EAAS,oCAAA,EAAqC;AAAA,MACxI,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,iBAAA,EAAmB,OAAA,EAAS,sCAAA,EAAuC;AAAA,MACxI,EAAE,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,aAAA,EAAe,UAAU,SAAA,EAAW,QAAA,EAAU,iBAAA,EAAmB,OAAA,EAAS,sCAAA;AAAuC;AAC1I;AAEJ;AAEA,IAAO,gBAAA,GAAQ","file":"manifest.js","sourcesContent":["/**\n * @module @kb-labs/marketplace-cli/manifest\n * ManifestV3 for marketplace CLI plugin.\n * Declares commands with subgroups for nested routing.\n */\n\nexport const manifest = {\n schema: 'kb.plugin/3' as const,\n id: '@kb-labs/marketplace',\n version: '0.1.0',\n display: {\n name: 'Marketplace',\n description: 'Unified marketplace for plugins, adapters, workflows, and more',\n tags: ['marketplace', 'plugins', 'adapters'],\n },\n cli: {\n groupMeta: [\n { name: 'marketplace', describe: 'Marketplace management commands' },\n { name: 'marketplace/plugins', describe: 'Plugin management' },\n ],\n commands: [\n // Top-level: kb marketplace install\n { id: 'install', group: 'marketplace', describe: 'Install package(s)', handler: './commands/install.js#default' },\n { id: 'uninstall', group: 'marketplace', describe: 'Uninstall package(s)', handler: './commands/uninstall.js#default' },\n { id: 'update', group: 'marketplace', describe: 'Update package(s)', handler: './commands/update.js#default' },\n { id: 'sync', group: 'marketplace', describe: 'Sync workspace to lock', handler: './commands/sync.js#default' },\n // Subgroup: kb marketplace plugins list\n { id: 'list', group: 'marketplace', subgroup: 'plugins', describe: 'List installed plugins', handler: './commands/plugins/list.js#default' },\n { id: 'enable', group: 'marketplace', subgroup: 'plugins', describe: 'Enable a plugin', handler: './commands/plugins/enable.js#default' },\n { id: 'disable', group: 'marketplace', subgroup: 'plugins', describe: 'Disable a plugin', handler: './commands/plugins/disable.js#default' },\n { id: 'link', group: 'marketplace', subgroup: 'plugins', describe: 'Link a local plugin', handler: './commands/plugins/link.js#default' },\n { id: 'unlink', group: 'marketplace', subgroup: 'plugins', describe: 'Unlink a plugin', handler: './commands/plugins/unlink.js#default' },\n { id: 'doctor', group: 'marketplace', subgroup: 'plugins', describe: 'Diagnose issues', handler: './commands/plugins/doctor.js#default' },\n ],\n },\n};\n\nexport default manifest;\n"]}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "dependencies": {
3
+ "@kb-labs/sdk": "1.6.6"
4
+ },
5
+ "description": "Marketplace CLI plugin — commands for managing plugins, adapters, and other marketplace entities",
6
+ "devDependencies": {
7
+ "@types/node": "^24.3.3",
8
+ "tsup": "^8.5.0",
9
+ "typescript": "^5",
10
+ "vitest": "^3.2.4",
11
+ "@kb-labs/devkit": "2.14.0"
12
+ },
13
+ "engines": {
14
+ "node": ">=20.0.0",
15
+ "pnpm": ">=9.0.0"
16
+ },
17
+ "exports": {
18
+ ".": {
19
+ "import": "./dist/index.js",
20
+ "types": "./dist/index.d.ts"
21
+ },
22
+ "./plugin-manifest": {
23
+ "import": "./dist/manifest.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "kb": {
30
+ "manifest": "./dist/manifest.js"
31
+ },
32
+ "main": "./dist/index.js",
33
+ "name": "@kb-labs/marketplace-entry",
34
+ "sideEffects": false,
35
+ "type": "module",
36
+ "types": "./dist/index.d.ts",
37
+ "version": "2.14.0",
38
+ "scripts": {
39
+ "build": "tsup",
40
+ "clean": "rimraf dist",
41
+ "dev": "tsup --watch",
42
+ "lint": "eslint .",
43
+ "lint:fix": "eslint . --fix",
44
+ "test": "vitest run --passWithNoTests -c ../../vitest.config.ts",
45
+ "type-check": "tsc --noEmit"
46
+ }
47
+ }