@synap-core/cli 1.10.0 → 1.11.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 (120) hide show
  1. package/dist/commands/capability.js +79 -8
  2. package/dist/commands/capability.js.map +1 -1
  3. package/dist/commands/centrality.js +2 -1
  4. package/dist/commands/centrality.js.map +1 -1
  5. package/dist/commands/context.js +2 -1
  6. package/dist/commands/context.js.map +1 -1
  7. package/dist/commands/data-extra.js +7 -4
  8. package/dist/commands/data-extra.js.map +1 -1
  9. package/dist/commands/data.js +14 -4
  10. package/dist/commands/data.js.map +1 -1
  11. package/dist/commands/diagnose.js +44 -1
  12. package/dist/commands/diagnose.js.map +1 -1
  13. package/dist/commands/digest.js +2 -1
  14. package/dist/commands/digest.js.map +1 -1
  15. package/dist/commands/doc.d.ts +14 -0
  16. package/dist/commands/doc.js +61 -4
  17. package/dist/commands/doc.js.map +1 -1
  18. package/dist/commands/doctor.d.ts +21 -0
  19. package/dist/commands/doctor.js +189 -0
  20. package/dist/commands/doctor.js.map +1 -0
  21. package/dist/commands/events.js +3 -1
  22. package/dist/commands/events.js.map +1 -1
  23. package/dist/commands/graph.js +5 -3
  24. package/dist/commands/graph.js.map +1 -1
  25. package/dist/commands/import.js +40 -9
  26. package/dist/commands/import.js.map +1 -1
  27. package/dist/commands/knowledge.d.ts +6 -0
  28. package/dist/commands/knowledge.js +253 -30
  29. package/dist/commands/knowledge.js.map +1 -1
  30. package/dist/commands/launch.js +2 -2
  31. package/dist/commands/launch.js.map +1 -1
  32. package/dist/commands/lens.js +1 -1
  33. package/dist/commands/lens.js.map +1 -1
  34. package/dist/commands/market-authoring.d.ts +45 -0
  35. package/dist/commands/market-authoring.js +225 -0
  36. package/dist/commands/market-authoring.js.map +1 -0
  37. package/dist/commands/market.d.ts +22 -7
  38. package/dist/commands/market.js +335 -60
  39. package/dist/commands/market.js.map +1 -1
  40. package/dist/commands/mcp.d.ts +24 -2
  41. package/dist/commands/mcp.js +84 -3
  42. package/dist/commands/mcp.js.map +1 -1
  43. package/dist/commands/pod.js +1 -1
  44. package/dist/commands/pod.js.map +1 -1
  45. package/dist/commands/pods.d.ts +14 -0
  46. package/dist/commands/pods.js +156 -2
  47. package/dist/commands/pods.js.map +1 -1
  48. package/dist/commands/proposals-actions.js +3 -0
  49. package/dist/commands/proposals-actions.js.map +1 -1
  50. package/dist/commands/sessions.js +2 -1
  51. package/dist/commands/sessions.js.map +1 -1
  52. package/dist/commands/skills.js +3 -1
  53. package/dist/commands/skills.js.map +1 -1
  54. package/dist/commands/template.d.ts +42 -0
  55. package/dist/commands/template.js +191 -0
  56. package/dist/commands/template.js.map +1 -0
  57. package/dist/commands/upload.d.ts +30 -0
  58. package/dist/commands/upload.js +155 -0
  59. package/dist/commands/upload.js.map +1 -0
  60. package/dist/index.js +118 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/lib/capture-lane.js +5 -3
  63. package/dist/lib/capture-lane.js.map +1 -1
  64. package/dist/lib/capture-structure.d.ts +123 -0
  65. package/dist/lib/capture-structure.js +57 -0
  66. package/dist/lib/capture-structure.js.map +1 -0
  67. package/dist/lib/cp-packages.d.ts +56 -0
  68. package/dist/lib/cp-packages.js +171 -0
  69. package/dist/lib/cp-packages.js.map +1 -1
  70. package/dist/lib/hub-client.d.ts +14 -1
  71. package/dist/lib/hub-client.js +110 -19
  72. package/dist/lib/hub-client.js.map +1 -1
  73. package/dist/lib/id.d.ts +23 -0
  74. package/dist/lib/id.js +35 -0
  75. package/dist/lib/id.js.map +1 -0
  76. package/dist/lib/pod.d.ts +53 -3
  77. package/dist/lib/pod.js +81 -9
  78. package/dist/lib/pod.js.map +1 -1
  79. package/dist/lib/template-file.d.ts +74 -0
  80. package/dist/lib/template-file.js +140 -0
  81. package/dist/lib/template-file.js.map +1 -0
  82. package/node_modules/@synap/hub-rest-client/dist/index.cjs +1261 -0
  83. package/node_modules/@synap/hub-rest-client/dist/index.d.cts +1647 -0
  84. package/node_modules/@synap/hub-rest-client/dist/index.d.ts +1647 -0
  85. package/node_modules/@synap/hub-rest-client/dist/index.js +1231 -0
  86. package/node_modules/@synap/hub-rest-client/package.json +45 -0
  87. package/node_modules/@synap/hub-rest-client/src/client.ts +1631 -0
  88. package/node_modules/@synap/hub-rest-client/src/errors.ts +30 -0
  89. package/node_modules/@synap/hub-rest-client/src/index.ts +153 -0
  90. package/node_modules/@synap/hub-rest-client/src/setup.ts +133 -0
  91. package/node_modules/@synap/hub-rest-client/src/types.ts +1299 -0
  92. package/package.json +3 -2
  93. package/skills/agent-os/SKILL.md +6 -0
  94. package/skills/manifest.json +1 -1
  95. package/skills/onboard/SKILL.md +7 -0
  96. package/skills/synap/SKILL.md +110 -29
  97. package/skills/synap/capture.md +50 -152
  98. package/skills/synap/common-mistakes.md +1 -0
  99. package/skills/synap/content-os.md +83 -0
  100. package/skills/synap/digesting-a-channel.md +25 -0
  101. package/skills/synap/mental-model.md +7 -7
  102. package/skills/synap/multi-entity-capture.md +6 -4
  103. package/skills/synap/worked-examples.md +21 -0
  104. package/skills/synap/writes.md +75 -18
  105. package/skills/synap-app/SKILL.md +319 -0
  106. package/skills/synap-app/_order.txt +5 -0
  107. package/skills/synap-app/_skill.yaml +20 -0
  108. package/skills/synap-app/creating-the-base-app.md +64 -0
  109. package/skills/synap-app/governance.md +42 -0
  110. package/skills/synap-app/install-commands.md +55 -0
  111. package/skills/synap-app/overview.md +50 -0
  112. package/skills/synap-app/using-the-sdk.md +73 -0
  113. package/skills/synap-market/SKILL.md +335 -0
  114. package/skills/synap-market/_order.txt +5 -0
  115. package/skills/synap-market/_skill.yaml +24 -0
  116. package/skills/synap-market/author-and-publish.md +75 -0
  117. package/skills/synap-market/discover-and-fetch.md +59 -0
  118. package/skills/synap-market/governance-and-catalog.md +56 -0
  119. package/skills/synap-market/install.md +55 -0
  120. package/skills/synap-market/overview.md +51 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/commands/template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * synap upload
3
+ *
4
+ * Store a real file (arbitrary bytes) on the pod. Closes the "an AI/CLI cannot
5
+ * store a real file" gap: the CLI reads the file from disk and POSTs it as
6
+ * multipart/form-data to the standalone file door, which mints a `file`
7
+ * entity for the bytes.
8
+ *
9
+ * Usage:
10
+ * synap upload ./report.pdf
11
+ * synap upload ./logo.png --title "Brand logo" --workspace <id>
12
+ * synap upload ./spec.pdf --attach <entityId> # also link doc → entity
13
+ *
14
+ * API:
15
+ * POST /api/hub/files (multipart) — field `file` (≤10MB) + REQUIRED
16
+ * workspaceId (membership-gated) +
17
+ * optional title → { fileEntityId, documentId }
18
+ * POST /api/hub/relations — with --attach: `references` relation
19
+ * from the target entity to the new doc.
20
+ */
21
+ export interface UploadOpts {
22
+ workspace?: string;
23
+ attach?: string;
24
+ title?: string;
25
+ open?: boolean;
26
+ json?: boolean;
27
+ podUrl?: string;
28
+ apiKey?: string;
29
+ }
30
+ export declare function uploadFile(path: string, opts: UploadOpts): Promise<void>;
@@ -0,0 +1,155 @@
1
+ /**
2
+ * synap upload
3
+ *
4
+ * Store a real file (arbitrary bytes) on the pod. Closes the "an AI/CLI cannot
5
+ * store a real file" gap: the CLI reads the file from disk and POSTs it as
6
+ * multipart/form-data to the standalone file door, which mints a `file`
7
+ * entity for the bytes.
8
+ *
9
+ * Usage:
10
+ * synap upload ./report.pdf
11
+ * synap upload ./logo.png --title "Brand logo" --workspace <id>
12
+ * synap upload ./spec.pdf --attach <entityId> # also link doc → entity
13
+ *
14
+ * API:
15
+ * POST /api/hub/files (multipart) — field `file` (≤10MB) + REQUIRED
16
+ * workspaceId (membership-gated) +
17
+ * optional title → { fileEntityId, documentId }
18
+ * POST /api/hub/relations — with --attach: `references` relation
19
+ * from the target entity to the new doc.
20
+ */
21
+ import { readFileSync } from "fs";
22
+ import { basename, extname } from "path";
23
+ import { log } from "../utils/logger.js";
24
+ import { resolveHubConfig, resolveUserId, hubPostMultipart, renderHubError, } from "../lib/hub-client.js";
25
+ import { writeGovernance } from "../lib/capture-lane.js";
26
+ import { createRelation } from "./data.js";
27
+ import { openInBrowser } from "./open.js";
28
+ /** Mirror of the pinned /api/hub/files contract: reject >10MB before the round-trip. */
29
+ const MAX_UPLOAD_BYTES = 10 * 1024 * 1024;
30
+ /** Best-effort extension → mime. Backend accepts arbitrary mime; octet-stream is the safe default. */
31
+ const MIME = {
32
+ ".md": "text/markdown",
33
+ ".markdown": "text/markdown",
34
+ ".txt": "text/plain",
35
+ ".csv": "text/csv",
36
+ ".json": "application/json",
37
+ ".html": "text/html",
38
+ ".htm": "text/html",
39
+ ".pdf": "application/pdf",
40
+ ".doc": "application/msword",
41
+ ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
42
+ ".png": "image/png",
43
+ ".jpg": "image/jpeg",
44
+ ".jpeg": "image/jpeg",
45
+ ".webp": "image/webp",
46
+ ".gif": "image/gif",
47
+ ".svg": "image/svg+xml",
48
+ ".mp3": "audio/mpeg",
49
+ ".wav": "audio/wav",
50
+ ".m4a": "audio/mp4",
51
+ ".ogg": "audio/ogg",
52
+ ".mp4": "video/mp4",
53
+ ".mov": "video/quicktime",
54
+ ".zip": "application/zip",
55
+ };
56
+ function mimeFor(path) {
57
+ return MIME[extname(path).toLowerCase()] ?? "application/octet-stream";
58
+ }
59
+ export async function uploadFile(path, opts) {
60
+ try {
61
+ const cfg = await resolveHubConfig(opts);
62
+ // Fail-fast identity check: assert the caller has a resolvable identity before
63
+ // uploading. The /files door derives the owner from the API key, not a body
64
+ // field, so the resolved id is intentionally not forwarded (unlike doc create).
65
+ await resolveUserId(cfg);
66
+ const workspaceId = opts.workspace ?? cfg.workspaceId;
67
+ // Buffer<ArrayBuffer> (not the widened Buffer<ArrayBufferLike>) — required for
68
+ // File([buf]) to typecheck, matching readFileSync's inferred NonSharedBuffer.
69
+ let buf;
70
+ try {
71
+ buf = readFileSync(path);
72
+ }
73
+ catch (e) {
74
+ log.error(`Cannot read file: ${path} — ${e.message}`);
75
+ process.exit(1);
76
+ }
77
+ if (buf.byteLength === 0) {
78
+ log.error(`File is empty: ${path}`);
79
+ process.exit(1);
80
+ }
81
+ if (buf.byteLength > MAX_UPLOAD_BYTES) {
82
+ log.error(`File too large: ${(buf.byteLength / 1024 / 1024).toFixed(1)}MB — the pod accepts up to 10MB.`);
83
+ process.exit(1);
84
+ }
85
+ const filename = basename(path);
86
+ const form = new FormData();
87
+ // Field name + optional fields per the pinned /api/hub/files contract.
88
+ form.append("file", new File([buf], filename, { type: mimeFor(path) }));
89
+ if (workspaceId)
90
+ form.append("workspaceId", workspaceId);
91
+ if (opts.title)
92
+ form.append("title", opts.title);
93
+ const res = (await hubPostMultipart("/files", form, cfg));
94
+ const governance = writeGovernance(res);
95
+ const fileEntityId = String(res.fileEntityId ?? "");
96
+ const documentId = String(res.documentId ?? "");
97
+ // Single --attach implementation for both output modes: a `references` relation
98
+ // links ENTITIES — target the new file entity (fileEntityId), never the
99
+ // documents-row id (documentId). Callers guard on opts.attach + fileEntityId first.
100
+ const doAttach = (json) => createRelation({
101
+ source: opts.attach,
102
+ target: fileEntityId,
103
+ type: "references",
104
+ workspace: workspaceId,
105
+ json,
106
+ podUrl: opts.podUrl,
107
+ apiKey: opts.apiKey,
108
+ });
109
+ if (opts.json) {
110
+ console.log(JSON.stringify({ ...res, outcome: governance === "proposed" ? "proposed" : "stored" }, null, 2));
111
+ // In JSON mode we still run the attach so its response is emitted too.
112
+ if (governance !== "proposed" && opts.attach && fileEntityId) {
113
+ await doAttach(true);
114
+ }
115
+ return;
116
+ }
117
+ if (governance === "proposed") {
118
+ // A proposal is normal — the write is queued for the user's review, not a failure.
119
+ log.info(`Upload: ${filename} — proposed (under review)`);
120
+ const proposalId = String(res.proposalId ?? "");
121
+ if (proposalId)
122
+ log.dim(` proposal: ${proposalId}`);
123
+ if (res.reviewUrl)
124
+ log.dim(` review: ${String(res.reviewUrl)}`);
125
+ if (opts.attach) {
126
+ log.dim(" --attach skipped: the file entity is created on approval; re-run attach after the proposal lands.");
127
+ }
128
+ return;
129
+ }
130
+ log.success(`Uploaded: ${filename}`);
131
+ if (fileEntityId)
132
+ log.dim(` fileEntityId: ${fileEntityId}`);
133
+ if (documentId)
134
+ log.dim(` documentId: ${documentId}`);
135
+ if (opts.attach) {
136
+ if (!fileEntityId) {
137
+ log.error("Uploaded, but the door returned no fileEntityId — cannot create the --attach relation.");
138
+ process.exit(1);
139
+ }
140
+ await doAttach(Boolean(opts.json));
141
+ }
142
+ // Open the new file ENTITY (fileEntityId), not the documents-row id.
143
+ // `kind: "document"` is a different, content-layer deep link (it opens the
144
+ // html-doc cell keyed by a `documents`-table row id) — fileEntityId lives in
145
+ // `entities`, so this must dispatch as `kind: "entity"`, not `"document"`.
146
+ if (opts.open && fileEntityId) {
147
+ await openInBrowser({ kind: "entity", id: fileEntityId });
148
+ }
149
+ }
150
+ catch (e) {
151
+ renderHubError(e);
152
+ process.exit(1);
153
+ }
154
+ }
155
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/commands/upload.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -124,6 +124,15 @@ pods
124
124
  const { podsUse } = await import("./commands/pods.js");
125
125
  await podsUse(name, { surface: opts.surface, json: opts.json });
126
126
  });
127
+ pods
128
+ .command("update <name> [url]")
129
+ .description("Change a saved pod's URL in place (verifies health + whether the key must be recreated)")
130
+ .option("--url <url>", "New pod URL (alternative to the positional arg)")
131
+ .option("--yes", "Non-interactive: skip prompts (won't recreate a rejected key)")
132
+ .action(async (name, url, opts) => {
133
+ const { podsUpdate } = await import("./commands/pods.js");
134
+ await podsUpdate(name, url, { url: opts.url, yes: opts.yes });
135
+ });
127
136
  pods
128
137
  .command("remove <name>")
129
138
  .alias("rm")
@@ -147,6 +156,14 @@ program
147
156
  const { status } = await import("./commands/status.js");
148
157
  await status({ json: opts.json });
149
158
  });
159
+ program
160
+ .command("doctor")
161
+ .description("Coherence preflight: pod host resolves, key authenticates, workspace/project exist on THIS pod — catches config drift in one call")
162
+ .option("--json", "Output as JSON")
163
+ .action(async (opts) => {
164
+ const { doctor } = await import("./commands/doctor.js");
165
+ await doctor(opts);
166
+ });
150
167
  program
151
168
  .command("versions")
152
169
  .description("Show LOCAL vs NPM vs CONTROL-PLANE vs POD version drift for workspace-templates, api-types, and capabilities")
@@ -279,6 +296,17 @@ mcp
279
296
  const { connect } = await import("./commands/connect.js");
280
297
  await connect({ target: client, name: opts.name });
281
298
  });
299
+ mcp
300
+ .command("connect-claude")
301
+ .description("Print the claude.ai (web) OAuth connection steps — paste a URL, approve in the browser, done")
302
+ .option("--cp-url <url>", "Control-plane origin override (default: derived from the pod host)")
303
+ .option("--json", "Output as JSON")
304
+ .option("--pod-url <url>", "Pod URL override")
305
+ .option("--api-key <key>", "API key override")
306
+ .action(async (opts) => {
307
+ const { mcpConnectClaudeWeb } = await import("./commands/mcp.js");
308
+ await mcpConnectClaudeWeb(opts);
309
+ });
282
310
  program
283
311
  .command("login")
284
312
  .description("Connect your Synap account (private templates) + your pods")
@@ -542,6 +570,7 @@ program
542
570
  .option("--key <ns:slug>", "Stable key for a --global runbook (derived from --type + --claim if omitted)")
543
571
  .option("--team", "Write to the first product workspace instead of the active workspace")
544
572
  .option("--workspace <id>", "Explicit workspace override")
573
+ .option("--project <id|name>", "Pin the capture to a project (id or name) — overrides SYNAP_PROJECT_ID / the session lens")
545
574
  .option("--yes", "Skip the y/N confirmation prompt (smart mode)")
546
575
  .option("--json", "Output as JSON")
547
576
  .action(async (text, opts) => {
@@ -574,6 +603,31 @@ program
574
603
  const { importData } = await import("./commands/import.js");
575
604
  await importData(inputs, opts);
576
605
  });
606
+ // ─── upload ───────────────────────────────────────────────────────────────────
607
+ // Store a real file (arbitrary bytes) on the pod — the door an AI/CLI needs to
608
+ // persist an actual file, not just text. POSTs multipart to /api/hub/files,
609
+ // which mints a `file` entity for the bytes.
610
+ program
611
+ .command("upload <path>")
612
+ .description("Upload a file (≤10MB) to the pod as a file entity")
613
+ .option("--workspace <id>", "Workspace to store the file in")
614
+ .option("--attach <entityId>", "After upload, link the document to this entity (references relation)")
615
+ .option("--title <title>", "Title for the created document")
616
+ .option("--open", "Open in the Synap desktop app after upload")
617
+ .option("--json", "Output as JSON")
618
+ .option("--pod-url <url>", "Pod URL override")
619
+ .option("--api-key <key>", "API key override")
620
+ .addHelpText("after", `
621
+ Examples:
622
+ synap upload ./report.pdf
623
+ synap upload ./logo.png --title "Brand logo" --workspace <id>
624
+ synap upload ./spec.pdf --attach <entityId>
625
+ synap upload ./report.pdf --open
626
+ `)
627
+ .action(async (path, opts) => {
628
+ const { uploadFile } = await import("./commands/upload.js");
629
+ await uploadFile(path, opts);
630
+ });
577
631
  program
578
632
  .command("subscribe")
579
633
  .description("Stream pod events as NDJSON (long-poll)")
@@ -1479,6 +1533,23 @@ Examples:
1479
1533
  const { docUpdate } = await import("./commands/doc.js");
1480
1534
  await docUpdate(documentId, opts);
1481
1535
  });
1536
+ doc
1537
+ .command("reference <url>")
1538
+ .description("Create an external reference document (points at a URL — no bytes stored)")
1539
+ .requiredOption("--title <title>", "Document title")
1540
+ .option("--workspace <id>", "Workspace to create the reference in")
1541
+ .option("--open", "Open in the Synap desktop app after creation")
1542
+ .option("--json", "JSON output")
1543
+ .option("--pod-url <url>", "Pod URL override")
1544
+ .option("--api-key <key>", "API key override")
1545
+ .addHelpText("after", `
1546
+ Examples:
1547
+ synap doc reference https://example.com/spec --title "Vendor spec"
1548
+ `)
1549
+ .action(async (url, opts) => {
1550
+ const { docReference } = await import("./commands/doc.js");
1551
+ await docReference(url, opts);
1552
+ });
1482
1553
  // ─── cell ─────────────────────────────────────────────────────────────────────
1483
1554
  const cell = program
1484
1555
  .command("cell")
@@ -1660,6 +1731,7 @@ market
1660
1731
  .description("Install a package by slug into a project — workspaces install now; other types route you to the right surface")
1661
1732
  .option("--project <id>", "Optionally tag the seeded entities to a project (installs are pod-wide by default)")
1662
1733
  .option("--onto <workspaceId>", "Reconcile this template ONTO an existing workspace (additive) instead of creating a new one")
1734
+ .option("--dry-run", "Preview the create path write-free — report would-create / reuse / conflicts, install nothing")
1663
1735
  .option("--timeout <seconds>", "How long to wait for the apply to finish (default: 120)")
1664
1736
  .option("--json", "Output as JSON")
1665
1737
  .option("--pod-url <url>", "Pod URL override")
@@ -1703,6 +1775,52 @@ market
1703
1775
  const { marketInstalled } = await import("./commands/market.js");
1704
1776
  await marketInstalled(opts);
1705
1777
  });
1778
+ // ── Authoring loop: scaffold → validate → publish → unpublish ────────────────
1779
+ market
1780
+ .command("scaffold <slug>")
1781
+ .description("Write a minimal valid <slug>.template.yaml to edit in place (refuses to overwrite)")
1782
+ .option("--json", "Output as JSON")
1783
+ .action(async (slug, _opts, cmd) => {
1784
+ // Same parent/child `--json` collision as `market install` — see its comment.
1785
+ const opts = cmd.optsWithGlobals();
1786
+ const { marketScaffold } = await import("./commands/market-authoring.js");
1787
+ await marketScaffold(slug, opts);
1788
+ });
1789
+ market
1790
+ .command("validate <file>")
1791
+ .description("Validate a local template file against the shared template validator — fast author feedback")
1792
+ .option("--json", "Output the validator result as JSON")
1793
+ .action(async (file, _opts, cmd) => {
1794
+ // Same parent/child `--json` collision as `market install` — see its comment.
1795
+ const opts = cmd.optsWithGlobals();
1796
+ const { marketValidate } = await import("./commands/market-authoring.js");
1797
+ await marketValidate(file, opts);
1798
+ });
1799
+ market
1800
+ .command("publish [file]")
1801
+ .description("Validate then publish a template to the marketplace (private by default) — pass a file, or --from-workspace <id>")
1802
+ .option("--public", "Publish as PUBLIC (default is private)")
1803
+ .option("--private", "Publish as private (the default — stated explicitly)")
1804
+ .option("--from-workspace <id>", "Serialize a live workspace into a template and publish it (instead of a file)")
1805
+ .option("--json", "Output as JSON")
1806
+ .option("--pod-url <url>", "Pod URL override (for --from-workspace)")
1807
+ .option("--api-key <key>", "API key override (for --from-workspace)")
1808
+ .action(async (file, _opts, cmd) => {
1809
+ // Same parent/child `--json` collision as `market install` — see its comment.
1810
+ const opts = cmd.optsWithGlobals();
1811
+ const { marketPublish } = await import("./commands/market-authoring.js");
1812
+ await marketPublish(file, opts);
1813
+ });
1814
+ market
1815
+ .command("unpublish <slug>")
1816
+ .description("Flip a published package back to private (owner only)")
1817
+ .option("--json", "Output as JSON")
1818
+ .action(async (slug, _opts, cmd) => {
1819
+ // Same parent/child `--json` collision as `market install` — see its comment.
1820
+ const opts = cmd.optsWithGlobals();
1821
+ const { marketUnpublish } = await import("./commands/market-authoring.js");
1822
+ await marketUnpublish(slug, opts);
1823
+ });
1706
1824
  // ─── capability ───────────────────────────────────────────────────────────────
1707
1825
  const capability = program
1708
1826
  .command("capability")