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 +94 -2
- package/README.md +20 -0
- package/dist/commands/copy-node.js +63 -0
- package/dist/commands/copy-node.js.map +1 -0
- package/dist/commands/create-node.js +42 -3
- package/dist/commands/create-node.js.map +1 -1
- package/dist/commands/delete-asset.js +47 -0
- package/dist/commands/delete-asset.js.map +1 -0
- package/dist/commands/do.js +109 -0
- package/dist/commands/do.js.map +1 -0
- package/dist/commands/list-assets.js +53 -0
- package/dist/commands/list-assets.js.map +1 -0
- package/dist/commands/re-create.js +15 -0
- package/dist/commands/re-create.js.map +1 -0
- package/dist/commands/upload-asset.js +25 -0
- package/dist/commands/upload-asset.js.map +1 -0
- package/dist/index.js +111 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/upload.js +59 -0
- package/dist/lib/upload.js.map +1 -0
- package/package.json +1 -1
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
|
|
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
|
-
|
|
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
|
-
|
|
8
|
-
|
|
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:
|
|
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":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
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
|
-
.
|
|
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"}
|