@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.
- package/dist/commands/capability.js +79 -8
- package/dist/commands/capability.js.map +1 -1
- package/dist/commands/centrality.js +2 -1
- package/dist/commands/centrality.js.map +1 -1
- package/dist/commands/context.js +2 -1
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.js +7 -4
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/data.js +14 -4
- package/dist/commands/data.js.map +1 -1
- package/dist/commands/diagnose.js +44 -1
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/digest.js +2 -1
- package/dist/commands/digest.js.map +1 -1
- package/dist/commands/doc.d.ts +14 -0
- package/dist/commands/doc.js +61 -4
- package/dist/commands/doc.js.map +1 -1
- package/dist/commands/doctor.d.ts +21 -0
- package/dist/commands/doctor.js +189 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/events.js +3 -1
- package/dist/commands/events.js.map +1 -1
- package/dist/commands/graph.js +5 -3
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/import.js +40 -9
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/knowledge.d.ts +6 -0
- package/dist/commands/knowledge.js +253 -30
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/launch.js +2 -2
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/lens.js +1 -1
- package/dist/commands/lens.js.map +1 -1
- package/dist/commands/market-authoring.d.ts +45 -0
- package/dist/commands/market-authoring.js +225 -0
- package/dist/commands/market-authoring.js.map +1 -0
- package/dist/commands/market.d.ts +22 -7
- package/dist/commands/market.js +335 -60
- package/dist/commands/market.js.map +1 -1
- package/dist/commands/mcp.d.ts +24 -2
- package/dist/commands/mcp.js +84 -3
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/pod.js +1 -1
- package/dist/commands/pod.js.map +1 -1
- package/dist/commands/pods.d.ts +14 -0
- package/dist/commands/pods.js +156 -2
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.js +3 -0
- package/dist/commands/proposals-actions.js.map +1 -1
- package/dist/commands/sessions.js +2 -1
- package/dist/commands/sessions.js.map +1 -1
- package/dist/commands/skills.js +3 -1
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/template.d.ts +42 -0
- package/dist/commands/template.js +191 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/commands/upload.d.ts +30 -0
- package/dist/commands/upload.js +155 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/index.js +118 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/capture-lane.js +5 -3
- package/dist/lib/capture-lane.js.map +1 -1
- package/dist/lib/capture-structure.d.ts +123 -0
- package/dist/lib/capture-structure.js +57 -0
- package/dist/lib/capture-structure.js.map +1 -0
- package/dist/lib/cp-packages.d.ts +56 -0
- package/dist/lib/cp-packages.js +171 -0
- package/dist/lib/cp-packages.js.map +1 -1
- package/dist/lib/hub-client.d.ts +14 -1
- package/dist/lib/hub-client.js +110 -19
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/id.d.ts +23 -0
- package/dist/lib/id.js +35 -0
- package/dist/lib/id.js.map +1 -0
- package/dist/lib/pod.d.ts +53 -3
- package/dist/lib/pod.js +81 -9
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/template-file.d.ts +74 -0
- package/dist/lib/template-file.js +140 -0
- package/dist/lib/template-file.js.map +1 -0
- package/node_modules/@synap/hub-rest-client/dist/index.cjs +1261 -0
- package/node_modules/@synap/hub-rest-client/dist/index.d.cts +1647 -0
- package/node_modules/@synap/hub-rest-client/dist/index.d.ts +1647 -0
- package/node_modules/@synap/hub-rest-client/dist/index.js +1231 -0
- package/node_modules/@synap/hub-rest-client/package.json +45 -0
- package/node_modules/@synap/hub-rest-client/src/client.ts +1631 -0
- package/node_modules/@synap/hub-rest-client/src/errors.ts +30 -0
- package/node_modules/@synap/hub-rest-client/src/index.ts +153 -0
- package/node_modules/@synap/hub-rest-client/src/setup.ts +133 -0
- package/node_modules/@synap/hub-rest-client/src/types.ts +1299 -0
- package/package.json +3 -2
- package/skills/agent-os/SKILL.md +6 -0
- package/skills/manifest.json +1 -1
- package/skills/onboard/SKILL.md +7 -0
- package/skills/synap/SKILL.md +110 -29
- package/skills/synap/capture.md +50 -152
- package/skills/synap/common-mistakes.md +1 -0
- package/skills/synap/content-os.md +83 -0
- package/skills/synap/digesting-a-channel.md +25 -0
- package/skills/synap/mental-model.md +7 -7
- package/skills/synap/multi-entity-capture.md +6 -4
- package/skills/synap/worked-examples.md +21 -0
- package/skills/synap/writes.md +75 -18
- package/skills/synap-app/SKILL.md +319 -0
- package/skills/synap-app/_order.txt +5 -0
- package/skills/synap-app/_skill.yaml +20 -0
- package/skills/synap-app/creating-the-base-app.md +64 -0
- package/skills/synap-app/governance.md +42 -0
- package/skills/synap-app/install-commands.md +55 -0
- package/skills/synap-app/overview.md +50 -0
- package/skills/synap-app/using-the-sdk.md +73 -0
- package/skills/synap-market/SKILL.md +335 -0
- package/skills/synap-market/_order.txt +5 -0
- package/skills/synap-market/_skill.yaml +24 -0
- package/skills/synap-market/author-and-publish.md +75 -0
- package/skills/synap-market/discover-and-fetch.md +59 -0
- package/skills/synap-market/governance-and-catalog.md +56 -0
- package/skills/synap-market/install.md +55 -0
- 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")
|