aigma 0.1.5 → 0.1.7

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/AGENTS.md CHANGED
@@ -28,9 +28,31 @@ Once the user has logged in, credentials live at `~/.aigma/credentials.json` and
28
28
  3. aigma describe-canvas <id> --json # frames + node count for the
29
29
  # ones you're considering
30
30
  4. Choose / create a canvas (see below)
31
- 5. aigma create-node --prompt "..." --canvas <id> --json
31
+ 5. (Optional) aigma upload-asset <file> # ONE upload-asset per file you
32
+ # want to appear in the HTML.
33
+ # Or use create-node --asset to
34
+ # do uploads inline.
35
+ 6. aigma create-node --prompt "..." --canvas <id> --json [--asset file ...]
32
36
  ```
33
37
 
38
+ ### Assets — ALWAYS upload first
39
+
40
+ The CLI's prompt is text-only (max 4000 chars). **Do NOT base64-encode images
41
+ or other binary content into the prompt** — it will be truncated and the
42
+ model can't render it anyway. Instead:
43
+
44
+ 1. Upload each file with `aigma upload-asset <file>` → returns a stable
45
+ public URL.
46
+ 2. Either pass the URL into your prompt directly, or use
47
+ `aigma create-node --asset <file>` (repeatable). With `--asset`, the CLI
48
+ uploads each file and appends a structured `AVAILABLE ASSETS` block to
49
+ your prompt; the model embeds the URLs in the generated HTML
50
+ (`<img src=…>`, `<video src=…>`, etc.) so the asset is visually part of
51
+ the page on the canvas.
52
+
53
+ Anything fits — images, PDFs, audio, video, text, JSON. The bucket is
54
+ public-read and capped at 25 MB per upload.
55
+
34
56
  ### Step 1 — list canvases
35
57
 
36
58
  ```bash
@@ -179,6 +201,57 @@ AIGMA_SUPABASE_ANON_KEY=...
179
201
  AIGMA_WEB_BASE=...
180
202
  ```
181
203
 
204
+ ## Long prompts — `--prompt-file` or stdin
205
+
206
+ For prompts beyond a couple of sentences, prefer `--prompt-file <path>` (or
207
+ piping via stdin) over `--prompt "..."` in shell. Avoids quoting bugs with
208
+ backticks/quotes in the prompt:
209
+
210
+ ```bash
211
+ aigma create-node --prompt-file ./brief.md --canvas <id> --json
212
+ cat brief.md | aigma create-node --canvas <id> --json
213
+ ```
214
+
215
+ ## Iteration: never mutate, always fork
216
+
217
+ Aigma's design contract is forking, not editing. To "improve" an existing
218
+ node, copy it (or regenerate from it) — that produces a NEW node id and
219
+ keeps the original untouched. Three flavors:
220
+
221
+ ```bash
222
+ # Pure copy — no LLM call, just duplicates the HTML to a new node
223
+ aigma copy-node <id> [--canvas <c>] --json
224
+
225
+ # Regenerate from source HTML + a new instruction (forks)
226
+ aigma re-create --node <id> --prompt "make it darker, swap CTA copy" \
227
+ --canvas <c> --json
228
+
229
+ # Same effect via create-node, useful for richer flag combos
230
+ aigma create-node --from-node <id> \
231
+ --prompt-file ./change.md --asset ./new-logo.svg \
232
+ --canvas <c> --json
233
+ ```
234
+
235
+ The result is always a new draft / new public slug / new canvas frame.
236
+
237
+ ## One-shot for agents
238
+
239
+ When you want the canvas selection handled for you:
240
+
241
+ ```bash
242
+ aigma do "Pricing section for the SaaS Landing project" --json
243
+ ```
244
+
245
+ `aigma do`:
246
+ 1. Lists your canvases.
247
+ 2. Naive keyword match between prompt tokens and canvas-name tokens.
248
+ 3. If a canvas name shares words with the prompt → uses it.
249
+ 4. Otherwise creates a new canvas (name derived from the prompt).
250
+ 5. Calls `create-node` against the chosen canvas.
251
+
252
+ Use `do` for unattended runs; use the explicit `list-canvases` / `describe-canvas`
253
+ / `create-node --canvas` flow when you need precision.
254
+
182
255
  ## Quickref
183
256
 
184
257
  ```bash
@@ -186,9 +259,28 @@ aigma login # interactive — user only
186
259
  aigma whoami --json # exit code 3 if not signed in
187
260
  aigma list-canvases --json
188
261
  aigma describe-canvas <id-or-name> --json
262
+ aigma list-nodes --canvas <id> --json
189
263
  aigma create-canvas --name "Project" --json
190
- aigma create-node --prompt "..." --canvas <id> --json
264
+
265
+ # Assets — upload first, then reference
266
+ aigma upload-asset ./photo.jpg # prints the URL
267
+ aigma list-assets --json # everything you've uploaded
268
+ aigma delete-asset <key> # cleanup
269
+
270
+ # Generation
271
+ aigma create-node --asset ./photo.jpg --prompt "..." --canvas <id> --json
272
+ aigma create-node --from-node <id> --prompt "..." --canvas <id> --json
273
+ aigma copy-node <id> --canvas <id> --json
274
+ aigma re-create --node <id> --prompt "..." --canvas <id> --json
275
+ aigma do "<request>" --json # canvas auto-resolved
276
+
277
+ # Long prompts via file or pipe
278
+ aigma create-node --prompt-file ./brief.md --canvas <id> --json
279
+ cat brief.md | aigma create-node --canvas <id> --json
280
+
281
+ # Other
191
282
  aigma create-node --prompt "..." --canvas <id> --output out.html
283
+ aigma config set default-canvas <id> # skip --canvas every call
192
284
  aigma open # open /nodes in browser
193
285
  aigma open --published <slug> # open /p/{slug}
194
286
  aigma open --draft <id> # open /nodes?draft=<id>
package/README.md CHANGED
@@ -32,6 +32,26 @@ aigma create-node --prompt "Hero section for an AI photo editor"
32
32
  # Or target a specific canvas (by UUID or exact name)
33
33
  aigma create-node --prompt "Pricing section" --canvas "My Project"
34
34
 
35
+ # Long prompts: read from a file or stdin
36
+ aigma create-node --prompt-file brief.md --canvas "My Project"
37
+ cat brief.md | aigma create-node --canvas "My Project"
38
+
39
+ # Attach assets — uploads each file, then references the URL in the prompt
40
+ aigma create-node --prompt "Personal CV with my photo" \
41
+ --asset ./me.jpg --canvas "My Project"
42
+
43
+ # Or upload separately and reference the URL yourself
44
+ URL=$(aigma upload-asset ./logo.svg)
45
+ aigma create-node --prompt "Header with our logo: $URL" --canvas "My Project"
46
+
47
+ # Iterate without losing the original — every flow forks to a NEW node
48
+ aigma copy-node <node-id> # pure duplicate
49
+ aigma re-create --node <node-id> --prompt "make it darker" # regen from HTML
50
+ aigma create-node --from-node <node-id> --prompt-file edit.md # same, advanced
51
+
52
+ # Agent one-shot — canvas is auto-resolved from the prompt
53
+ aigma do "Hero section for our SaaS Landing project"
54
+
35
55
  # Save the generated HTML to a file
36
56
  aigma create-node --prompt "Pricing section" --output pricing.html
37
57
 
@@ -0,0 +1,63 @@
1
+ import { authenticatedClient } from '../lib/session.js';
2
+ import { FUNCTIONS_BASE, SUPABASE_ANON_KEY } from '../lib/config.js';
3
+ import { getDefaultCanvas } from '../lib/user-config.js';
4
+ import { info, success, json, error, ExitCode } from '../lib/output.js';
5
+ export async function runCopyNode(opts) {
6
+ if (!opts.sourceId?.trim()) {
7
+ error('source node id is required');
8
+ process.exit(ExitCode.Validation);
9
+ }
10
+ const auth = await authenticatedClient();
11
+ if (!auth) {
12
+ error('Not authenticated. Run `aigma login` first.');
13
+ process.exit(ExitCode.AuthRequired);
14
+ }
15
+ const canvas = opts.canvas ?? (await getDefaultCanvas());
16
+ info(`Copying node ${opts.sourceId}…`);
17
+ let res;
18
+ try {
19
+ res = await fetch(`${FUNCTIONS_BASE}/cli-clone-node`, {
20
+ method: 'POST',
21
+ headers: {
22
+ 'Content-Type': 'application/json',
23
+ Authorization: `Bearer ${auth.accessToken}`,
24
+ apikey: SUPABASE_ANON_KEY,
25
+ },
26
+ body: JSON.stringify({
27
+ source_node_id: opts.sourceId.trim(),
28
+ ...(canvas ? { canvas } : {}),
29
+ }),
30
+ });
31
+ }
32
+ catch (err) {
33
+ error(`Network error: ${err.message}`);
34
+ process.exit(ExitCode.Generic);
35
+ }
36
+ let payload;
37
+ try {
38
+ payload = (await res.json());
39
+ }
40
+ catch {
41
+ error(`Server returned non-JSON (status ${res.status})`);
42
+ process.exit(ExitCode.Generic);
43
+ }
44
+ if (!res.ok || payload.error) {
45
+ const msg = payload.detail ? `${payload.error}: ${payload.detail}` : payload.error || `Request failed (status ${res.status})`;
46
+ error(msg);
47
+ if (payload.matches?.length) {
48
+ for (const m of payload.matches)
49
+ info(` ${m.id} ${m.name}`);
50
+ }
51
+ process.exit(res.status === 401 ? ExitCode.AuthRequired : ExitCode.Generic);
52
+ }
53
+ if (payload.canvas)
54
+ info(` Canvas: ${payload.canvas.name} (${payload.canvas.id})`);
55
+ if (payload.public_url)
56
+ info(` Public: ${payload.public_url}`);
57
+ if (payload.canvas_url)
58
+ info(` Open: ${payload.canvas_url}`);
59
+ success(`Cloned ${opts.sourceId} → ${payload.node_id}`);
60
+ if (opts.json)
61
+ json(payload);
62
+ }
63
+ //# sourceMappingURL=copy-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-node.js","sourceRoot":"","sources":["../../src/commands/copy-node.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,35 @@ import { promises as fs } from 'node:fs';
2
2
  import { authenticatedClient } from '../lib/session.js';
3
3
  import { FUNCTIONS_BASE, SUPABASE_ANON_KEY } from '../lib/config.js';
4
4
  import { getDefaultCanvas } from '../lib/user-config.js';
5
+ import { uploadAsset } from '../lib/upload.js';
5
6
  import { info, success, json, error, ExitCode } from '../lib/output.js';
7
+ async function resolvePrompt(opts) {
8
+ if (opts.prompt && opts.prompt.trim())
9
+ return opts.prompt.trim();
10
+ if (opts.promptFile) {
11
+ const txt = await fs.readFile(opts.promptFile, 'utf8');
12
+ return txt.trim();
13
+ }
14
+ // Fall back to stdin if it's a pipe (not a TTY).
15
+ if (!process.stdin.isTTY) {
16
+ const chunks = [];
17
+ for await (const chunk of process.stdin) {
18
+ chunks.push(chunk);
19
+ }
20
+ return Buffer.concat(chunks).toString('utf8').trim();
21
+ }
22
+ return '';
23
+ }
24
+ function injectAssets(prompt, assets) {
25
+ if (assets.length === 0)
26
+ return prompt;
27
+ const lines = assets.map((a) => `- ${a.url} (${a.content_type}, ${a.filename})`);
28
+ return `${prompt}\n\nAVAILABLE ASSETS — embed appropriate ones in the HTML (e.g. <img src=\"…\"> for images). URLs are public and stable:\n${lines.join('\n')}`;
29
+ }
6
30
  export async function runCreateNode(opts) {
7
- if (!opts.prompt || !opts.prompt.trim()) {
8
- error('--prompt is required');
31
+ const promptText = await resolvePrompt(opts);
32
+ if (!promptText) {
33
+ error('prompt is required: pass --prompt, --prompt-file, or pipe via stdin');
9
34
  process.exit(ExitCode.Validation);
10
35
  }
11
36
  const auth = await authenticatedClient();
@@ -15,6 +40,19 @@ export async function runCreateNode(opts) {
15
40
  }
16
41
  // Resolve canvas: explicit flag > stored default > server-side fallback (most-recent).
17
42
  const canvas = opts.canvas ?? (await getDefaultCanvas());
43
+ // Upload any --asset files first, then weave URLs into the prompt.
44
+ const uploaded = [];
45
+ for (const file of opts.asset ?? []) {
46
+ info(`Uploading asset ${file}…`);
47
+ try {
48
+ uploaded.push(await uploadAsset(file));
49
+ }
50
+ catch (err) {
51
+ error(`Failed to upload ${file}: ${err.message}`);
52
+ process.exit(ExitCode.Generic);
53
+ }
54
+ }
55
+ const finalPrompt = injectAssets(promptText, uploaded);
18
56
  info(canvas ? `Generating node on canvas "${canvas}"…` : 'Generating node (most-recent canvas)…');
19
57
  info(' (this can take 10–30s depending on prompt length)');
20
58
  let res;
@@ -27,8 +65,9 @@ export async function runCreateNode(opts) {
27
65
  apikey: SUPABASE_ANON_KEY,
28
66
  },
29
67
  body: JSON.stringify({
30
- prompt: opts.prompt,
68
+ prompt: finalPrompt,
31
69
  ...(canvas ? { canvas } : {}),
70
+ ...(opts.fromNode ? { from_node: opts.fromNode } : {}),
32
71
  }),
33
72
  });
34
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"create-node.js","sourceRoot":"","sources":["../../src/commands/create-node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-node.js","sourceRoot":"","sources":["../../src/commands/create-node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { authenticatedClient } from '../lib/session.js';
2
+ import { FUNCTIONS_BASE, SUPABASE_ANON_KEY } from '../lib/config.js';
3
+ import { success, json, error, ExitCode } from '../lib/output.js';
4
+ export async function runDeleteAsset(opts) {
5
+ if (!opts.key?.trim()) {
6
+ error('key is required (e.g. cli-uploads/<user-id>/<file>)');
7
+ process.exit(ExitCode.Validation);
8
+ }
9
+ const auth = await authenticatedClient();
10
+ if (!auth) {
11
+ error('Not authenticated. Run `aigma login` first.');
12
+ process.exit(ExitCode.AuthRequired);
13
+ }
14
+ let res;
15
+ try {
16
+ res = await fetch(`${FUNCTIONS_BASE}/cli-delete-asset`, {
17
+ method: 'POST',
18
+ headers: {
19
+ 'Content-Type': 'application/json',
20
+ Authorization: `Bearer ${auth.accessToken}`,
21
+ apikey: SUPABASE_ANON_KEY,
22
+ },
23
+ body: JSON.stringify({ key: opts.key.trim() }),
24
+ });
25
+ }
26
+ catch (err) {
27
+ error(`Network error: ${err.message}`);
28
+ process.exit(ExitCode.Generic);
29
+ }
30
+ let payload;
31
+ try {
32
+ payload = (await res.json());
33
+ }
34
+ catch {
35
+ error(`Server returned non-JSON (status ${res.status})`);
36
+ process.exit(ExitCode.Generic);
37
+ }
38
+ if (!res.ok || payload.error) {
39
+ const msg = payload.detail ? `${payload.error}: ${payload.detail}` : payload.error || `Request failed (status ${res.status})`;
40
+ error(msg);
41
+ process.exit(res.status === 401 ? ExitCode.AuthRequired : ExitCode.Generic);
42
+ }
43
+ success(`Deleted ${opts.key}`);
44
+ if (opts.json)
45
+ json(payload);
46
+ }
47
+ //# sourceMappingURL=delete-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-asset.js","sourceRoot":"","sources":["../../src/commands/delete-asset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AASlE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAqC;IACxE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QACtB,KAAK,CAAC,qDAAqD,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,mBAAmB,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;gBAC3C,MAAM,EAAE,iBAAiB;aAC1B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;SAC/C,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,kBAAmB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,OAAmB,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAe,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,oCAAoC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,0BAA0B,GAAG,CAAC,MAAM,GAAG,CAAC;QAC9H,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9E,CAAC;IAED,OAAO,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/B,IAAI,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { authenticatedClient } from '../lib/session.js';
2
+ import { FUNCTIONS_BASE, SUPABASE_ANON_KEY } from '../lib/config.js';
3
+ import { runCreateNode } from './create-node.js';
4
+ import { info, error, ExitCode } from '../lib/output.js';
5
+ const STOP = new Set([
6
+ 'a', 'an', 'the', 'of', 'for', 'to', 'and', 'or', 'on', 'in', 'at', 'with', 'my',
7
+ 'me', 'build', 'make', 'create', 'new', 'add', 'please', 'some', 'this', 'that',
8
+ 'is', 'are', 'it', 'its', 'as', 'from', 'by', 'about', 'using', 'use', 'i', 'our',
9
+ ]);
10
+ function tokens(s) {
11
+ return s
12
+ .toLowerCase()
13
+ .replace(/[^a-z0-9\s-]/g, ' ')
14
+ .split(/\s+/)
15
+ .filter((t) => t.length > 2 && !STOP.has(t));
16
+ }
17
+ function pickCanvas(prompt, canvases) {
18
+ const pTokens = new Set(tokens(prompt));
19
+ if (pTokens.size === 0 || canvases.length === 0)
20
+ return null;
21
+ let best = null;
22
+ for (const c of canvases) {
23
+ const cTokens = tokens(c.name);
24
+ const score = cTokens.filter((t) => pTokens.has(t)).length;
25
+ if (score > 0 && (!best || score > best.score))
26
+ best = { c, score };
27
+ }
28
+ return best?.c ?? null;
29
+ }
30
+ function deriveCanvasName(prompt) {
31
+ const t = tokens(prompt).slice(0, 4);
32
+ if (t.length === 0)
33
+ return 'CLI project';
34
+ return t.map((w) => w[0].toUpperCase() + w.slice(1)).join(' ');
35
+ }
36
+ async function listCanvases(accessToken) {
37
+ const res = await fetch(`${FUNCTIONS_BASE}/cli-list-canvases`, {
38
+ method: 'POST',
39
+ headers: {
40
+ 'Content-Type': 'application/json',
41
+ Authorization: `Bearer ${accessToken}`,
42
+ apikey: SUPABASE_ANON_KEY,
43
+ },
44
+ body: '{}',
45
+ });
46
+ const payload = (await res.json());
47
+ if (!res.ok || payload.error)
48
+ throw new Error(payload.error ?? `list-canvases failed (${res.status})`);
49
+ return payload.canvases ?? [];
50
+ }
51
+ async function createCanvas(accessToken, name) {
52
+ const res = await fetch(`${FUNCTIONS_BASE}/cli-create-canvas`, {
53
+ method: 'POST',
54
+ headers: {
55
+ 'Content-Type': 'application/json',
56
+ Authorization: `Bearer ${accessToken}`,
57
+ apikey: SUPABASE_ANON_KEY,
58
+ },
59
+ body: JSON.stringify({ name }),
60
+ });
61
+ const payload = (await res.json());
62
+ if (!res.ok || payload.error || !payload.canvas) {
63
+ throw new Error(payload.error ?? `create-canvas failed (${res.status})`);
64
+ }
65
+ return payload.canvas;
66
+ }
67
+ export async function runDo(opts) {
68
+ if (!opts.prompt?.trim()) {
69
+ error('prompt is required');
70
+ process.exit(ExitCode.Validation);
71
+ }
72
+ const auth = await authenticatedClient();
73
+ if (!auth) {
74
+ error('Not authenticated. Run `aigma login` first.');
75
+ process.exit(ExitCode.AuthRequired);
76
+ }
77
+ info('Resolving canvas…');
78
+ let canvases;
79
+ try {
80
+ canvases = await listCanvases(auth.accessToken);
81
+ }
82
+ catch (err) {
83
+ error(err.message);
84
+ process.exit(ExitCode.Generic);
85
+ }
86
+ let target = pickCanvas(opts.prompt, canvases);
87
+ if (target) {
88
+ info(` → matched existing canvas "${target.name}"`);
89
+ }
90
+ else {
91
+ const name = deriveCanvasName(opts.prompt);
92
+ info(` → no match, creating canvas "${name}"`);
93
+ try {
94
+ target = await createCanvas(auth.accessToken, name);
95
+ }
96
+ catch (err) {
97
+ error(err.message);
98
+ process.exit(ExitCode.Generic);
99
+ }
100
+ }
101
+ await runCreateNode({
102
+ prompt: opts.prompt,
103
+ canvas: target.id,
104
+ asset: opts.asset,
105
+ output: opts.output,
106
+ json: opts.json,
107
+ });
108
+ }
109
+ //# sourceMappingURL=do.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"do.js","sourceRoot":"","sources":["../../src/commands/do.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AASzD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC;IACnB,GAAG,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI;IACpE,IAAI,EAAC,OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM;IACtE,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,GAAG,EAAC,KAAK;CACvE,CAAC,CAAC;AAEH,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,CAAC;SACL,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,UAAU,CAAC,MAAc,EAAE,QAA6C;IAC/E,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,IAAI,GAA8D,IAAI,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3D,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YAAE,IAAI,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC;IACzC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,WAAmB;IAC7C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,oBAAoB,EAAE;QAC7D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,WAAW,EAAE;YACtC,MAAM,EAAE,iBAAiB;SAC1B;QACD,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuE,CAAC;IACzG,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,yBAAyB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACvG,OAAO,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,IAAY;IAC3D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,oBAAoB,EAAE;QAC7D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,WAAW,EAAE;YACtC,MAAM,EAAE,iBAAiB;SAC1B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;KAC/B,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA8D,CAAC;IAChG,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,yBAAyB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAe;IACzC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACzB,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC5B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC1B,IAAI,QAA6C,CAAC;IAClD,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,gCAAgC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,kCAAkC,IAAI,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,aAAa,CAAC;QAClB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,MAAM,EAAE,MAAM,CAAC,EAAE;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { authenticatedClient } from '../lib/session.js';
2
+ import { FUNCTIONS_BASE, SUPABASE_ANON_KEY } from '../lib/config.js';
3
+ import { info, json, error, ExitCode } from '../lib/output.js';
4
+ export async function runListAssets(opts) {
5
+ const auth = await authenticatedClient();
6
+ if (!auth) {
7
+ error('Not authenticated. Run `aigma login` first.');
8
+ process.exit(ExitCode.AuthRequired);
9
+ }
10
+ let res;
11
+ try {
12
+ res = await fetch(`${FUNCTIONS_BASE}/cli-list-assets`, {
13
+ method: 'POST',
14
+ headers: {
15
+ 'Content-Type': 'application/json',
16
+ Authorization: `Bearer ${auth.accessToken}`,
17
+ apikey: SUPABASE_ANON_KEY,
18
+ },
19
+ body: '{}',
20
+ });
21
+ }
22
+ catch (err) {
23
+ error(`Network error: ${err.message}`);
24
+ process.exit(ExitCode.Generic);
25
+ }
26
+ let payload;
27
+ try {
28
+ payload = (await res.json());
29
+ }
30
+ catch {
31
+ error(`Server returned non-JSON (status ${res.status})`);
32
+ process.exit(ExitCode.Generic);
33
+ }
34
+ if (!res.ok || payload.error) {
35
+ const msg = payload.detail ? `${payload.error}: ${payload.detail}` : payload.error || `Request failed (status ${res.status})`;
36
+ error(msg);
37
+ process.exit(res.status === 401 ? ExitCode.AuthRequired : ExitCode.Generic);
38
+ }
39
+ if (opts.json) {
40
+ json(payload);
41
+ return;
42
+ }
43
+ const rows = payload.assets ?? [];
44
+ if (rows.length === 0) {
45
+ info('(no assets uploaded via the CLI)');
46
+ return;
47
+ }
48
+ for (const a of rows) {
49
+ const size = a.size_bytes ? `${a.size_bytes}B` : '?';
50
+ info(`${a.key}\t${a.content_type ?? '?'}\t${size}\t${a.url}`);
51
+ }
52
+ }
53
+ //# sourceMappingURL=list-assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-assets.js","sourceRoot":"","sources":["../../src/commands/list-assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAmB/D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAwB;IAC1D,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,kBAAkB,EAAE;YACrD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;gBAC3C,MAAM,EAAE,iBAAiB;aAC1B;YACD,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,kBAAmB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAa,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,oCAAoC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,0BAA0B,GAAG,CAAC,MAAM,GAAG,CAAC;QAC9H,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,OAAO,CAAC,CAAC;QACd,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IAClC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,kCAAkC,CAAC,CAAC;QACzC,OAAO;IACT,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,YAAY,IAAI,GAAG,KAAK,IAAI,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { runCreateNode } from './create-node.js';
2
+ export async function runReCreate(opts) {
3
+ // Sugar over create-node with from_node set. The result is always a
4
+ // NEW node (forking, never mutation).
5
+ await runCreateNode({
6
+ prompt: opts.prompt,
7
+ promptFile: opts.promptFile,
8
+ canvas: opts.canvas,
9
+ asset: opts.asset,
10
+ output: opts.output,
11
+ json: opts.json,
12
+ fromNode: opts.node,
13
+ });
14
+ }
15
+ //# sourceMappingURL=re-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"re-create.js","sourceRoot":"","sources":["../../src/commands/re-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAYjD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAqB;IACrD,oEAAoE;IACpE,sCAAsC;IACtC,MAAM,aAAa,CAAC;QAClB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ,EAAE,IAAI,CAAC,IAAI;KACpB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { uploadAsset } from '../lib/upload.js';
2
+ import { info, success, json, error, ExitCode } from '../lib/output.js';
3
+ export async function runUploadAsset(opts) {
4
+ if (!opts.file) {
5
+ error('file path is required');
6
+ process.exit(ExitCode.Validation);
7
+ }
8
+ let asset;
9
+ try {
10
+ asset = await uploadAsset(opts.file);
11
+ }
12
+ catch (err) {
13
+ const msg = err.message;
14
+ error(msg);
15
+ process.exit(/Not authenticated/.test(msg) ? ExitCode.AuthRequired : ExitCode.Generic);
16
+ }
17
+ if (opts.json) {
18
+ json(asset);
19
+ return;
20
+ }
21
+ success(`Uploaded ${asset.filename} (${asset.size_bytes} bytes)`);
22
+ info(` URL: ${asset.url}`);
23
+ process.stdout.write(asset.url + '\n');
24
+ }
25
+ //# sourceMappingURL=upload-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-asset.js","sourceRoot":"","sources":["../../src/commands/upload-asset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAsC;IACzE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAI,GAAa,CAAC,OAAO,CAAC;QACnC,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzF,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,KAAK,CAAC,CAAC;QACZ,OAAO;IACT,CAAC;IAED,OAAO,CAAC,YAAY,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,UAAU,SAAS,CAAC,CAAC;IAClE,IAAI,CAAC,UAAU,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AACzC,CAAC"}
package/dist/index.js CHANGED
@@ -12,6 +12,12 @@ import { runListNodes } from './commands/list-nodes.js';
12
12
  import { runWhoami } from './commands/whoami.js';
13
13
  import { runOpen } from './commands/open.js';
14
14
  import { runConfigGet, runConfigSet, runConfigUnset } from './commands/config.js';
15
+ import { runUploadAsset } from './commands/upload-asset.js';
16
+ import { runListAssets } from './commands/list-assets.js';
17
+ import { runDeleteAsset } from './commands/delete-asset.js';
18
+ import { runCopyNode } from './commands/copy-node.js';
19
+ import { runReCreate } from './commands/re-create.js';
20
+ import { runDo } from './commands/do.js';
15
21
  import { runAgentHelp } from './commands/agent-help.js';
16
22
  import { exitWith } from './lib/output.js';
17
23
  function readVersion() {
@@ -159,18 +165,122 @@ program
159
165
  exitWith(1, err.message);
160
166
  }
161
167
  });
168
+ program
169
+ .command('upload-asset')
170
+ .description('Upload a file to your assets bucket; prints the public URL')
171
+ .argument('<file>', 'path to a local file')
172
+ .option('--json', 'output JSON on stdout')
173
+ .action(async (file, opts) => {
174
+ try {
175
+ await runUploadAsset({ file, json: !!opts.json });
176
+ }
177
+ catch (err) {
178
+ exitWith(1, err.message);
179
+ }
180
+ });
181
+ program
182
+ .command('list-assets')
183
+ .description('List files you uploaded via upload-asset')
184
+ .option('--json', 'output JSON on stdout')
185
+ .action(async (opts) => {
186
+ try {
187
+ await runListAssets({ json: !!opts.json });
188
+ }
189
+ catch (err) {
190
+ exitWith(1, err.message);
191
+ }
192
+ });
193
+ program
194
+ .command('delete-asset')
195
+ .description('Delete one of your uploaded assets by storage key')
196
+ .argument('<key>', 'storage key (cli-uploads/<user-id>/<file>)')
197
+ .option('--json', 'output JSON on stdout')
198
+ .action(async (key, opts) => {
199
+ try {
200
+ await runDeleteAsset({ key, json: !!opts.json });
201
+ }
202
+ catch (err) {
203
+ exitWith(1, err.message);
204
+ }
205
+ });
162
206
  program
163
207
  .command('create-node')
164
208
  .description('Generate an HTML node from a prompt')
165
- .requiredOption('-p, --prompt <text>', 'prompt describing the node')
209
+ .option('-p, --prompt <text>', 'prompt describing the node (required unless --prompt-file or stdin)')
210
+ .option('-f, --prompt-file <path>', 'read the prompt from a file (handy for long prompts)')
166
211
  .option('-c, --canvas <id-or-name>', 'target canvas (UUID or exact name)')
212
+ .option('-a, --asset <file>', 'attach a local asset (uploads first, then references it in the prompt) — repeatable', (val, prev = []) => [...prev, val], [])
213
+ .option('--from-node <id>', 'use an existing node\'s HTML as the starting point (forks; never mutates the source)')
167
214
  .option('-o, --output <file>', 'write generated HTML to a file')
168
215
  .option('--json', 'output JSON on stdout')
169
216
  .action(async (opts) => {
170
217
  try {
171
218
  await runCreateNode({
172
219
  prompt: opts.prompt,
220
+ promptFile: opts.promptFile,
221
+ canvas: opts.canvas,
222
+ asset: opts.asset,
223
+ fromNode: opts.fromNode,
224
+ output: opts.output,
225
+ json: !!opts.json,
226
+ });
227
+ }
228
+ catch (err) {
229
+ exitWith(1, err.message);
230
+ }
231
+ });
232
+ program
233
+ .command('copy-node')
234
+ .description('Duplicate a node verbatim (no LLM call); produces a NEW node id and slug')
235
+ .argument('<id>', 'source node UUID')
236
+ .option('-c, --canvas <id-or-name>', 'target canvas (UUID or exact name)')
237
+ .option('--json', 'output JSON on stdout')
238
+ .action(async (id, opts) => {
239
+ try {
240
+ await runCopyNode({ sourceId: id, canvas: opts.canvas, json: !!opts.json });
241
+ }
242
+ catch (err) {
243
+ exitWith(1, err.message);
244
+ }
245
+ });
246
+ program
247
+ .command('re-create')
248
+ .description('Regenerate from an existing node\'s HTML + a new prompt; produces a NEW node (never mutates the source)')
249
+ .requiredOption('--node <id>', 'source node UUID to start from')
250
+ .option('-p, --prompt <text>', 'instruction (what to change/keep)')
251
+ .option('-f, --prompt-file <path>', 'read the prompt from a file')
252
+ .option('-c, --canvas <id-or-name>', 'target canvas')
253
+ .option('-a, --asset <file>', 'attach an asset — repeatable', (val, prev = []) => [...prev, val], [])
254
+ .option('-o, --output <file>', 'write generated HTML to a file')
255
+ .option('--json', 'output JSON on stdout')
256
+ .action(async (opts) => {
257
+ try {
258
+ await runReCreate({
259
+ node: opts.node,
260
+ prompt: opts.prompt,
261
+ promptFile: opts.promptFile,
173
262
  canvas: opts.canvas,
263
+ asset: opts.asset,
264
+ output: opts.output,
265
+ json: !!opts.json,
266
+ });
267
+ }
268
+ catch (err) {
269
+ exitWith(1, err.message);
270
+ }
271
+ });
272
+ program
273
+ .command('do')
274
+ .description('Agent one-shot: pick or create a canvas based on the prompt, then generate the node')
275
+ .argument('<prompt>', 'what you want made')
276
+ .option('-a, --asset <file>', 'attach an asset — repeatable', (val, prev = []) => [...prev, val], [])
277
+ .option('-o, --output <file>', 'write generated HTML to a file')
278
+ .option('--json', 'output JSON on stdout')
279
+ .action(async (prompt, opts) => {
280
+ try {
281
+ await runDo({
282
+ prompt,
283
+ asset: opts.asset,
174
284
  output: opts.output,
175
285
  json: !!opts.json,
176
286
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { basename, extname } from 'node:path';
3
+ import { authenticatedClient } from './session.js';
4
+ import { FUNCTIONS_BASE, SUPABASE_ANON_KEY } from './config.js';
5
+ const MIME_BY_EXT = {
6
+ png: 'image/png',
7
+ jpg: 'image/jpeg',
8
+ jpeg: 'image/jpeg',
9
+ webp: 'image/webp',
10
+ gif: 'image/gif',
11
+ svg: 'image/svg+xml',
12
+ pdf: 'application/pdf',
13
+ txt: 'text/plain',
14
+ md: 'text/markdown',
15
+ csv: 'text/csv',
16
+ json: 'application/json',
17
+ html: 'text/html',
18
+ htm: 'text/html',
19
+ mp3: 'audio/mpeg',
20
+ wav: 'audio/wav',
21
+ mp4: 'video/mp4',
22
+ mov: 'video/quicktime',
23
+ webm: 'video/webm',
24
+ };
25
+ function detectMime(path) {
26
+ const ext = extname(path).slice(1).toLowerCase();
27
+ return MIME_BY_EXT[ext] ?? 'application/octet-stream';
28
+ }
29
+ export async function uploadAsset(filePath) {
30
+ const auth = await authenticatedClient();
31
+ if (!auth)
32
+ throw new Error('Not authenticated. Run `aigma login` first.');
33
+ const buf = await fs.readFile(filePath);
34
+ const filename = basename(filePath);
35
+ const content_type = detectMime(filePath);
36
+ const data_base64 = buf.toString('base64');
37
+ const res = await fetch(`${FUNCTIONS_BASE}/cli-upload-asset`, {
38
+ method: 'POST',
39
+ headers: {
40
+ 'Content-Type': 'application/json',
41
+ Authorization: `Bearer ${auth.accessToken}`,
42
+ apikey: SUPABASE_ANON_KEY,
43
+ },
44
+ body: JSON.stringify({ filename, content_type, data_base64 }),
45
+ });
46
+ let payload;
47
+ try {
48
+ payload = await res.json();
49
+ }
50
+ catch {
51
+ throw new Error(`Server returned non-JSON (status ${res.status})`);
52
+ }
53
+ if (!res.ok || payload.error) {
54
+ const detail = payload.detail ? `: ${payload.detail}` : '';
55
+ throw new Error(`${payload.error ?? 'Upload failed'}${detail}`);
56
+ }
57
+ return payload;
58
+ }
59
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhE,MAAM,WAAW,GAA2B;IAC1C,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,eAAe;IACnB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,kBAAkB;IACxB,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,iBAAiB;IACtB,IAAI,EAAE,YAAY;CACnB,CAAC;AAEF,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;AACxD,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAE1E,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,mBAAmB,EAAE;QAC5D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;YAC3C,MAAM,EAAE,iBAAiB;SAC1B;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;KAC9D,CAAC,CAAC;IAEH,IAAI,OAAY,CAAC;IACjB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,oCAAoC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,IAAI,eAAe,GAAG,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,OAAwB,CAAC;AAClC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aigma",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "Aigma CLI — generate canvas nodes from your terminal",
5
5
  "license": "MIT",
6
6
  "homepage": "https://aigma.co",