aigma 0.1.1 → 0.1.3

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 ADDED
@@ -0,0 +1,193 @@
1
+ # aigma — Agent Integration Guide
2
+
3
+ This file is for AI agents using the `aigma` CLI. If you are an agent and just installed `aigma`, read this end-to-end before issuing other commands.
4
+
5
+ Run `aigma agent-help` at any time to print this document.
6
+
7
+ ## What `aigma` does
8
+
9
+ `aigma` lets you create HTML "nodes" on a user's Aigma canvas from the command line. Each call to `aigma create-node`:
10
+
11
+ 1. Generates a self-contained HTML fragment from your prompt.
12
+ 2. Publishes it to a public URL: `https://aigma.co/p/{slug}`.
13
+ 3. Drops a draft node onto the user's canvas. The user sees it within ~5s of opening that canvas in the web app.
14
+
15
+ A user can have **multiple canvases** (think of them as separate projects). You should usually target a specific canvas; otherwise the draft lands on the user's most-recently-edited canvas.
16
+
17
+ ## Authentication
18
+
19
+ `aigma login` is interactive — it opens a browser. **You cannot run `aigma login` autonomously.** If `aigma create-node` exits with code `3` ("Not authenticated"), report this back to the user and ask them to run `aigma login` themselves.
20
+
21
+ Once the user has logged in, credentials live at `~/.aigma/credentials.json` and the CLI handles refresh transparently.
22
+
23
+ ## Recommended workflow
24
+
25
+ ```
26
+ 1. aigma whoami --json # confirm auth
27
+ 2. aigma list-canvases --json # see all canvases (names only)
28
+ 3. aigma describe-canvas <id> --json # frames + node count for the
29
+ # ones you're considering
30
+ 4. Choose / create a canvas (see below)
31
+ 5. aigma create-node --prompt "..." --canvas <id> --json
32
+ ```
33
+
34
+ ### Step 1 — list canvases
35
+
36
+ ```bash
37
+ aigma list-canvases --json
38
+ ```
39
+
40
+ Returns lightweight metadata (no frame extraction — the list endpoint is intentionally cheap):
41
+
42
+ ```json
43
+ {
44
+ "ok": true,
45
+ "canvases": [
46
+ {
47
+ "id": "uuid",
48
+ "name": "SaaS Landing",
49
+ "created_at": "2026-04-01T...",
50
+ "updated_at": "2026-05-08T...",
51
+ "node_count": null,
52
+ "frames": []
53
+ }
54
+ ]
55
+ }
56
+ ```
57
+
58
+ For frames + counts on a specific canvas, call `describe-canvas`:
59
+
60
+ ```bash
61
+ aigma describe-canvas <uuid-or-exact-name> --json
62
+ ```
63
+
64
+ Returns:
65
+
66
+ ```json
67
+ {
68
+ "ok": true,
69
+ "canvas": {
70
+ "id": "uuid",
71
+ "name": "SaaS Landing",
72
+ "node_count": 12,
73
+ "frames": [
74
+ { "id": "uuid", "name": "Hero section", "type": "webframe" },
75
+ { "id": "uuid", "name": "Pricing table", "type": "webframe" }
76
+ ]
77
+ }
78
+ }
79
+ ```
80
+
81
+ Use `frames[].name` (AI-generated descriptive names) plus the canvas `name` to judge what's already there. Only call `describe-canvas` for the 1–3 candidates that look most relevant — it loads the canvas's full document, so don't loop it across all canvases.
82
+
83
+ ### Step 2 — pick or create a canvas
84
+
85
+ Decision rule:
86
+
87
+ - If the user's task clearly refers to an existing project and one canvas's `name` or `frames[].name` matches, use that canvas's `id`.
88
+ - If nothing fits, or the user is starting something new, create a canvas:
89
+
90
+ ```bash
91
+ aigma create-canvas --name "Landing v2" --json
92
+ ```
93
+
94
+ Response:
95
+
96
+ ```json
97
+ {
98
+ "ok": true,
99
+ "canvas": { "id": "uuid", "name": "Landing v2", ... }
100
+ }
101
+ ```
102
+
103
+ Use the returned `id` for the next step.
104
+
105
+ ### Step 3 — create the node
106
+
107
+ ```bash
108
+ aigma create-node \
109
+ --prompt "Hero section for an AI photo editor with two CTAs and product screenshot" \
110
+ --canvas <uuid> \
111
+ --json
112
+ ```
113
+
114
+ Response:
115
+
116
+ ```json
117
+ {
118
+ "ok": true,
119
+ "node_id": "uuid",
120
+ "draft_id": "uuid",
121
+ "html": "<section>...</section>",
122
+ "slug": "abc1234",
123
+ "public_url": "https://aigma.co/p/abc1234",
124
+ "canvas_url": "https://aigma.co/nodes?draft=uuid",
125
+ "canvas": { "id": "uuid", "name": "Landing v2" }
126
+ }
127
+ ```
128
+
129
+ The user can immediately:
130
+ - Visit `public_url` to see the rendered page.
131
+ - Open the canvas (`canvas_url` deep-links to it) and the WebFrame appears within ~5s.
132
+
133
+ ## --canvas argument
134
+
135
+ You can pass either:
136
+ - A UUID: `--canvas 0f6e2b1a-...`
137
+ - An exact (case-insensitive) name: `--canvas "SaaS Landing"`
138
+
139
+ If a name matches multiple canvases, the server returns HTTP 400 with a `matches` array — re-issue the call with one of the listed UUIDs.
140
+
141
+ If `--canvas` is omitted entirely, the server defaults to the user's most-recently-updated canvas. Prefer being explicit.
142
+
143
+ ## Output discipline
144
+
145
+ | Stream | Content |
146
+ |---|---|
147
+ | stdout | JSON only when `--json` is passed. Pipe-safe (`aigma … --json \| jq`). |
148
+ | stderr | Human-readable progress and errors. |
149
+
150
+ Always use `--json` when scripting.
151
+
152
+ ## Exit codes
153
+
154
+ | Code | Meaning | Recovery |
155
+ |---|---|---|
156
+ | 0 | Success | continue |
157
+ | 1 | Generic failure | inspect stderr / `error` field in JSON |
158
+ | 2 | Validation error (missing/bad args) | fix args |
159
+ | 3 | Auth required | tell the user to run `aigma login` |
160
+
161
+ ## Iteration
162
+
163
+ You can call `create-node` repeatedly — every call creates a new node, so variations sit side-by-side on the canvas. To replace a node you don't want, the user can delete it manually in the web app (no CLI delete command in v0.2).
164
+
165
+ ## Constraints worth knowing
166
+
167
+ - Prompt is capped at 4000 characters.
168
+ - The HTML fragment is rendered inside a 1280×800 frame on the canvas. Don't include `<html>`, `<head>`, or `<body>` wrappers — the model is instructed to avoid them but you can mention "single self-contained block" in your prompt for safety.
169
+ - No `<script>` tags will be generated.
170
+ - Token usage is metered against the user's Aigma plan. A 429 means they hit their limit.
171
+
172
+ ## Configuration
173
+
174
+ Override defaults via env (rarely needed):
175
+
176
+ ```bash
177
+ AIGMA_SUPABASE_URL=...
178
+ AIGMA_SUPABASE_ANON_KEY=...
179
+ AIGMA_WEB_BASE=...
180
+ ```
181
+
182
+ ## Quickref
183
+
184
+ ```bash
185
+ aigma login # interactive — user only
186
+ aigma whoami --json # exit code 3 if not signed in
187
+ aigma list-canvases --json
188
+ aigma describe-canvas <id-or-name> --json
189
+ aigma create-canvas --name "Project" --json
190
+ aigma create-node --prompt "..." --canvas <id> --json
191
+ aigma create-node --prompt "..." --canvas <id> --output out.html
192
+ aigma agent-help # print this guide
193
+ ```
package/README.md CHANGED
@@ -14,9 +14,24 @@ npm install -g aigma
14
14
  # Sign in via your browser (Google or Apple)
15
15
  aigma login
16
16
 
17
- # Generate a node from a prompt
17
+ # Confirm who's signed in
18
+ aigma whoami
19
+
20
+ # List canvases
21
+ aigma list-canvases
22
+
23
+ # Inspect a specific canvas (frames + node count)
24
+ aigma describe-canvas "My Project"
25
+
26
+ # Create a canvas
27
+ aigma create-canvas --name "My Project"
28
+
29
+ # Generate a node from a prompt (lands on most-recently-edited canvas)
18
30
  aigma create-node --prompt "Hero section for an AI photo editor"
19
31
 
32
+ # Or target a specific canvas (by UUID or exact name)
33
+ aigma create-node --prompt "Pricing section" --canvas "My Project"
34
+
20
35
  # Save the generated HTML to a file
21
36
  aigma create-node --prompt "Pricing section" --output pricing.html
22
37
 
@@ -24,6 +39,10 @@ aigma create-node --prompt "Pricing section" --output pricing.html
24
39
  aigma create-node --prompt "Footer with links" --json
25
40
  ```
26
41
 
42
+ ## For AI agents
43
+
44
+ If you're an AI agent integrating with `aigma`, run `aigma agent-help` to print the full integration guide (also visible at [AGENTS.md](./AGENTS.md)).
45
+
27
46
  Each `create-node` call:
28
47
 
29
48
  1. Generates a self-contained HTML fragment with Gemini.
@@ -0,0 +1,26 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { dirname, join } from 'node:path';
4
+ export async function runAgentHelp() {
5
+ const here = dirname(fileURLToPath(import.meta.url));
6
+ // dist/commands/agent-help.js → ../../AGENTS.md (npm package root)
7
+ const candidates = [
8
+ join(here, '..', '..', 'AGENTS.md'),
9
+ join(here, '..', '..', '..', 'AGENTS.md'),
10
+ ];
11
+ for (const p of candidates) {
12
+ try {
13
+ const md = await readFile(p, 'utf8');
14
+ process.stdout.write(md);
15
+ if (!md.endsWith('\n'))
16
+ process.stdout.write('\n');
17
+ return;
18
+ }
19
+ catch {
20
+ /* try next */
21
+ }
22
+ }
23
+ process.stderr.write('AGENTS.md not found in package; reinstall aigma.\n');
24
+ process.exit(1);
25
+ }
26
+ //# sourceMappingURL=agent-help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-help.js","sourceRoot":"","sources":["../../src/commands/agent-help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,mEAAmE;IACnE,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;QACnC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;KAC1C,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACzB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,51 @@
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 runCreateCanvas(opts) {
5
+ if (!opts.name?.trim()) {
6
+ error('--name is required');
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-create-canvas`, {
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({ name: opts.name.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 || !payload.canvas) {
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(`Created canvas: ${payload.canvas.name}`);
44
+ if (opts.json) {
45
+ json(payload);
46
+ }
47
+ else {
48
+ process.stderr.write(` id: ${payload.canvas.id}\n`);
49
+ }
50
+ }
51
+ //# sourceMappingURL=create-canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-canvas.js","sourceRoot":"","sources":["../../src/commands/create-canvas.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;AAgBlE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAsC;IAC1E,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QACvB,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,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,cAAc,oBAAoB,EAAE;YACvD,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,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;SACjD,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,OAA6B,CAAC;IAClC,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;IACvD,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,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAChD,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,mBAAmB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,OAAO,CAAC,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;AACH,CAAC"}
@@ -22,7 +22,10 @@ export async function runCreateNode(opts) {
22
22
  Authorization: `Bearer ${auth.accessToken}`,
23
23
  apikey: SUPABASE_ANON_KEY,
24
24
  },
25
- body: JSON.stringify({ prompt: opts.prompt }),
25
+ body: JSON.stringify({
26
+ prompt: opts.prompt,
27
+ ...(opts.canvas ? { canvas: opts.canvas } : {}),
28
+ }),
26
29
  });
27
30
  }
28
31
  catch (err) {
@@ -38,7 +41,12 @@ export async function runCreateNode(opts) {
38
41
  process.exit(ExitCode.Generic);
39
42
  }
40
43
  if (!res.ok || payload.error) {
41
- error(payload.error || `Request failed (status ${res.status})`);
44
+ const msg = payload.detail ? `${payload.error}: ${payload.detail}` : payload.error || `Request failed (status ${res.status})`;
45
+ error(msg);
46
+ if (payload.matches?.length) {
47
+ for (const m of payload.matches)
48
+ info(` ${m.id} ${m.name}`);
49
+ }
42
50
  process.exit(res.status === 401 ? ExitCode.AuthRequired : ExitCode.Generic);
43
51
  }
44
52
  if (!payload.html) {
@@ -49,11 +57,14 @@ export async function runCreateNode(opts) {
49
57
  await fs.writeFile(opts.output, payload.html, 'utf8');
50
58
  success(`HTML written to ${opts.output}`);
51
59
  }
60
+ if (payload.canvas) {
61
+ info(` Canvas: ${payload.canvas.name} (${payload.canvas.id})`);
62
+ }
52
63
  if (payload.public_url) {
53
64
  info(` Public: ${payload.public_url}`);
54
65
  }
55
66
  if (payload.canvas_url) {
56
- info(` Canvas: ${payload.canvas_url}`);
67
+ info(` Open: ${payload.canvas_url}`);
57
68
  }
58
69
  success('Node created');
59
70
  if (opts.json) {
@@ -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":"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,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAuBxE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAuB;IACzD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACxC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC9B,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,oBAAoB,CAAC,CAAC;IAE3B,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,CAAC,SAAS,CAAC;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChD,CAAC;SACH,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,OAA2B,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,6CAA6C,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QAClE,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,IAAI,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO;gBAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,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,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,CAAC,mBAAmB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,cAAc,CAAC,CAAC;IAExB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,OAAO,CAAC,CAAC;IAChB,CAAC;AACH,CAAC"}
@@ -0,0 +1,63 @@
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 runDescribeCanvas(opts) {
5
+ if (!opts.canvas?.trim()) {
6
+ error('canvas (id or name) is required');
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-describe-canvas`, {
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({ canvas: opts.canvas.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 || !payload.canvas) {
39
+ const msg = payload.detail ? `${payload.error}: ${payload.detail}` : payload.error || `Request failed (status ${res.status})`;
40
+ error(msg);
41
+ if (payload.matches?.length) {
42
+ for (const m of payload.matches)
43
+ info(` ${m.id} ${m.name}`);
44
+ }
45
+ process.exit(res.status === 401 ? ExitCode.AuthRequired : ExitCode.Generic);
46
+ }
47
+ if (opts.json) {
48
+ json(payload);
49
+ return;
50
+ }
51
+ const c = payload.canvas;
52
+ info(`${c.name} (${c.id})`);
53
+ info(` ${c.node_count} node(s), updated ${c.updated_at}`);
54
+ if (c.frames.length === 0) {
55
+ info(' (no top-level frames)');
56
+ }
57
+ else {
58
+ for (const f of c.frames) {
59
+ info(` • ${f.name} [${f.type}] ${f.id}`);
60
+ }
61
+ }
62
+ }
63
+ //# sourceMappingURL=describe-canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-canvas.js","sourceRoot":"","sources":["../../src/commands/describe-canvas.ts"],"names":[],"mappings":"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"}
@@ -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 runListCanvases(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-canvases`, {
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
+ const canvases = payload.canvases ?? [];
40
+ if (opts.json) {
41
+ json(payload);
42
+ return;
43
+ }
44
+ if (canvases.length === 0) {
45
+ info('No canvases yet. Create one with `aigma create-canvas --name "<name>"`.');
46
+ return;
47
+ }
48
+ for (const c of canvases) {
49
+ const frameNames = c.frames.map((f) => f.name).join(', ');
50
+ info(` ${c.id} ${c.name} (${c.node_count} nodes${frameNames ? `: ${frameNames}` : ''})`);
51
+ }
52
+ }
53
+ //# sourceMappingURL=list-canvases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-canvases.js","sourceRoot":"","sources":["../../src/commands/list-canvases.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;AAkB/D,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAwB;IAC5D,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,oBAAoB,EAAE;YACvD,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,OAA6B,CAAC;IAClC,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAC;IACvD,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,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IAExC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,OAAO,CAAC,CAAC;QACd,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,yEAAyE,CAAC,CAAC;QAChF,OAAO;IACT,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,UAAU,SAAS,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { authenticatedClient, readSession } from '../lib/session.js';
2
+ import { info, json, error, ExitCode } from '../lib/output.js';
3
+ export async function runWhoami(opts) {
4
+ const stored = await readSession();
5
+ if (!stored) {
6
+ if (opts.json) {
7
+ process.stdout.write(JSON.stringify({ ok: false, signed_in: false }) + '\n');
8
+ }
9
+ else {
10
+ error('Not signed in. Run `aigma login`.');
11
+ }
12
+ process.exit(ExitCode.AuthRequired);
13
+ }
14
+ // Refresh + validate the token so we don't lie about being signed in.
15
+ const auth = await authenticatedClient();
16
+ if (!auth) {
17
+ if (opts.json) {
18
+ process.stdout.write(JSON.stringify({ ok: false, signed_in: false, detail: 'session expired' }) + '\n');
19
+ }
20
+ else {
21
+ error('Session expired. Run `aigma login` again.');
22
+ }
23
+ process.exit(ExitCode.AuthRequired);
24
+ }
25
+ if (opts.json) {
26
+ json({ ok: true, signed_in: true, user: { id: auth.userId, email: stored.user.email } });
27
+ return;
28
+ }
29
+ info(`Signed in as ${stored.user.email ?? auth.userId}`);
30
+ info(` user_id: ${auth.userId}`);
31
+ }
32
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAwB;IACtD,MAAM,MAAM,GAAG,MAAM,WAAW,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,sEAAsE;IACtE,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1G,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACzF,OAAO;IACT,CAAC;IAED,IAAI,CAAC,gBAAgB,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC"}
package/dist/index.js CHANGED
@@ -1,13 +1,32 @@
1
1
  #!/usr/bin/env node
2
2
  import { Command } from 'commander';
3
+ import { readFileSync } from 'node:fs';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { dirname, join } from 'node:path';
3
6
  import { runLogin } from './commands/login.js';
4
7
  import { runCreateNode } from './commands/create-node.js';
8
+ import { runListCanvases } from './commands/list-canvases.js';
9
+ import { runCreateCanvas } from './commands/create-canvas.js';
10
+ import { runDescribeCanvas } from './commands/describe-canvas.js';
11
+ import { runWhoami } from './commands/whoami.js';
12
+ import { runAgentHelp } from './commands/agent-help.js';
5
13
  import { exitWith } from './lib/output.js';
14
+ function readVersion() {
15
+ try {
16
+ // dist/index.js → ../package.json
17
+ const here = dirname(fileURLToPath(import.meta.url));
18
+ const pkg = JSON.parse(readFileSync(join(here, '..', 'package.json'), 'utf8'));
19
+ return pkg.version ?? '0.0.0';
20
+ }
21
+ catch {
22
+ return '0.0.0';
23
+ }
24
+ }
6
25
  const program = new Command();
7
26
  program
8
27
  .name('aigma')
9
28
  .description('Aigma CLI — generate canvas nodes from your terminal')
10
- .version('0.1.0');
29
+ .version(readVersion());
11
30
  program
12
31
  .command('login')
13
32
  .description('Sign in to Aigma via your browser')
@@ -20,16 +39,68 @@ program
20
39
  exitWith(1, err.message);
21
40
  }
22
41
  });
42
+ program
43
+ .command('list-canvases')
44
+ .description('List your Aigma canvases')
45
+ .option('--json', 'output JSON on stdout')
46
+ .action(async (opts) => {
47
+ try {
48
+ await runListCanvases({ json: !!opts.json });
49
+ }
50
+ catch (err) {
51
+ exitWith(1, err.message);
52
+ }
53
+ });
54
+ program
55
+ .command('create-canvas')
56
+ .description('Create a new empty canvas')
57
+ .requiredOption('-n, --name <name>', 'canvas name')
58
+ .option('--json', 'output JSON on stdout')
59
+ .action(async (opts) => {
60
+ try {
61
+ await runCreateCanvas({ name: opts.name, json: !!opts.json });
62
+ }
63
+ catch (err) {
64
+ exitWith(1, err.message);
65
+ }
66
+ });
67
+ program
68
+ .command('describe-canvas')
69
+ .description('Show frames + node count for one canvas (UUID or name)')
70
+ .argument('<canvas>', 'canvas UUID or exact name')
71
+ .option('--json', 'output JSON on stdout')
72
+ .action(async (canvas, opts) => {
73
+ try {
74
+ await runDescribeCanvas({ canvas, json: !!opts.json });
75
+ }
76
+ catch (err) {
77
+ exitWith(1, err.message);
78
+ }
79
+ });
80
+ program
81
+ .command('whoami')
82
+ .description('Show the currently signed-in user')
83
+ .option('--json', 'output JSON on stdout')
84
+ .action(async (opts) => {
85
+ try {
86
+ await runWhoami({ json: !!opts.json });
87
+ }
88
+ catch (err) {
89
+ exitWith(1, err.message);
90
+ }
91
+ });
23
92
  program
24
93
  .command('create-node')
25
94
  .description('Generate an HTML node from a prompt')
26
95
  .requiredOption('-p, --prompt <text>', 'prompt describing the node')
96
+ .option('-c, --canvas <id-or-name>', 'target canvas (UUID or exact name)')
27
97
  .option('-o, --output <file>', 'write generated HTML to a file')
28
98
  .option('--json', 'output JSON on stdout')
29
99
  .action(async (opts) => {
30
100
  try {
31
101
  await runCreateNode({
32
102
  prompt: opts.prompt,
103
+ canvas: opts.canvas,
33
104
  output: opts.output,
34
105
  json: !!opts.json,
35
106
  });
@@ -38,5 +109,16 @@ program
38
109
  exitWith(1, err.message);
39
110
  }
40
111
  });
112
+ program
113
+ .command('agent-help')
114
+ .description('Print the AI-agent integration guide (AGENTS.md)')
115
+ .action(async () => {
116
+ try {
117
+ await runAgentHelp();
118
+ }
119
+ catch (err) {
120
+ exitWith(1, err.message);
121
+ }
122
+ });
41
123
  program.parseAsync(process.argv).catch((err) => exitWith(1, err.message));
42
124
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,sDAAsD,CAAC;KACnE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,CAAC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,aAAa,CAAC;KACtB,WAAW,CAAC,qCAAqC,CAAC;KAClD,cAAc,CAAC,qBAAqB,EAAE,4BAA4B,CAAC;KACnE,MAAM,CAAC,qBAAqB,EAAE,gCAAgC,CAAC;KAC/D,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;KACzC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,aAAa,CAAC;YAClB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;SAClB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,QAAQ,CAAC,CAAC,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aigma",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Aigma CLI — generate canvas nodes from your terminal",
5
5
  "license": "MIT",
6
6
  "homepage": "https://aigma.co",
@@ -42,6 +42,7 @@
42
42
  "node": ">=18.17.0"
43
43
  },
44
44
  "files": [
45
- "dist"
45
+ "dist",
46
+ "AGENTS.md"
46
47
  ]
47
48
  }