cueframe 0.3.2 → 0.4.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.
@@ -7,14 +7,24 @@ description: Use when editing, clipping, or rendering video via the CueFrame CLI
7
7
 
8
8
  ## Overview
9
9
 
10
- The `cueframe` CLI drives the CueFrame platform from the terminal. Optimized for agents — every command supports `--json` (NDJSON event stream) and the binary self-describes via `cueframe describe --json`.
10
+ The `cueframe` CLI drives the CueFrame platform from the terminal. Optimized for agents — every command supports `--json` (NDJSON event stream) and the binary self-describes via `npx -y cueframe describe --json`.
11
+
12
+ **Run it as `npx -y cueframe …` — every command in this skill is written that way, and
13
+ that form is executable verbatim.** There is no `cueframe` on your PATH unless you put it
14
+ there: `npx -y cueframe install` wires the MCP server and drops these skills, but npx
15
+ unpacks to an ephemeral cache, so it installs no binary. `npx` re-resolves the current
16
+ version on each call (~0.5s warm, ~5s cold), which also means these commands never go
17
+ stale. If you are running many in a row and want to skip that, `npm i -g cueframe` once
18
+ and drop the `npx -y ` prefix — but it needs a user-writable npm prefix (a default Linux
19
+ install fails `EACCES` on `/usr/local/lib/node_modules`), so it is an optimization, not
20
+ the documented path.
11
21
 
12
22
  **The framework is three verbs:** `upload` (register media) → `composition put` (author the timeline) → `render` (→ MP4). The `Composition` is the contract — render takes the saved composition, nothing else. Everything domain-specific (AI clip suggestions, FCPXML/Premiere export) is a **use-case on-ramp** layered on top, not part of the core.
13
23
 
14
24
  **Core principle — discover, don't guess.** Never author a composition from the
15
- examples below alone. The live contract is `cueframe schema composition` (prints
25
+ examples below alone. The live contract is `npx -y cueframe schema composition` (prints
16
26
  the real wire schema the server enforces); confirm any draft with
17
- `cueframe composition validate -b @file.json` BEFORE you render. Validation is
27
+ `npx -y cueframe composition validate -b @file.json` BEFORE you render. Validation is
18
28
  free and instant; a render is neither. The examples here are orientation — the
19
29
  schema is the source of truth.
20
30
 
@@ -30,20 +40,20 @@ clip suggestion required.
30
40
  # Commands run against production; auth is stored in ~/.cueframe/auth.json.
31
41
 
32
42
  # 1. Register media (one or many — mixed video / image / audio).
33
- cueframe upload "/path/to/source.mp4" --json # → mediaItemId (process_complete)
43
+ npx -y cueframe upload "/path/to/source.mp4" --json # → mediaItemId (process_complete)
34
44
 
35
45
  # 2. Create a project (sets aspect/format).
36
- cueframe project create -n "promo" -a 9:16 --json # → projectId
46
+ npx -y cueframe project create -n "promo" -a 9:16 --json # → projectId
37
47
 
38
48
  # 3. Author the composition: tracks of clips (per-clip reframe/trim), optional
39
49
  # captions (captions.segments), brandKitId. The composition is the SSOT.
40
50
  # Discover the live schema, then validate the draft BEFORE saving/rendering:
41
- cueframe schema composition # → live wire schema
42
- cueframe composition validate -b @composition.json # → ✓ valid | per-field errors (no render)
43
- cueframe composition put <projectId> -b @composition.json # ETag auto
51
+ npx -y cueframe schema composition # → live wire schema
52
+ npx -y cueframe composition validate -b @composition.json # → ✓ valid | per-field errors (no render)
53
+ npx -y cueframe composition put <projectId> -b @composition.json # ETag auto
44
54
 
45
55
  # 4. Render the saved composition to MP4. SSE-watches + downloads when done.
46
- cueframe render <projectId> -o ./out.mp4 --json
56
+ npx -y cueframe render <projectId> -o ./out.mp4 --json
47
57
  # → render_queued → render_progress* → render_complete
48
58
  #
49
59
  # `render` takes ONLY a projectId and renders the SAVED composition (tracks +
@@ -52,14 +62,14 @@ cueframe render <projectId> -o ./out.mp4 --json
52
62
  # a hand-authored composition; if absent, the clip is rendered without captions.
53
63
 
54
64
  # Reattach to an in-flight render later (e.g. after disconnect):
55
- cueframe render watch <renderId> -p <projectId> -o ./out.mp4 --json
65
+ npx -y cueframe render watch <renderId> -p <projectId> -o ./out.mp4 --json
56
66
  ```
57
67
 
58
68
  ## Anatomy of a composition.json
59
69
 
60
70
  This section orients you to the shape; the authoritative contract is
61
- `cueframe schema composition` (the live wire schema) — run it when a field is
62
- unclear, and `cueframe composition validate -b @file.json` to check a draft.
71
+ `npx -y cueframe schema composition` (the live wire schema) — run it when a field is
72
+ unclear, and `npx -y cueframe composition validate -b @file.json` to check a draft.
63
73
 
64
74
  `composition put` takes the **bare** `Composition` object (no wrapper; the CLI POSTs
65
75
  the `@file` verbatim and handles the ETag). Minimal valid shape:
@@ -126,18 +136,18 @@ the composition yourself (above).
126
136
 
127
137
  ```bash
128
138
  # 1. Upload + chain the AI clip pass.
129
- cueframe upload "/path/to/source.mp4" --analyze --json # mediaItemId + suggestions
130
- # (or run it explicitly: cueframe analyze <mediaItemId> --wait --json)
139
+ npx -y cueframe upload "/path/to/source.mp4" --analyze --json # mediaItemId + suggestions
140
+ # (or run it explicitly: npx -y cueframe analyze <mediaItemId> --wait --json)
131
141
 
132
142
  # 2. List clip suggestions (publicId sug_…, title, startMs/endMs, score).
133
- cueframe clips <mediaItemId> --json
143
+ npx -y cueframe clips <mediaItemId> --json
134
144
 
135
145
  # 3. Create a project AND author its composition from the chosen suggestion.
136
- cueframe project create -n "paul-klein-shorts" -a 9:16 --from-suggestion <sug_…> --json
137
- # (or, on an existing project: cueframe composition from-suggestion <projectId> -s <sug_…>)
146
+ npx -y cueframe project create -n "paul-klein-shorts" -a 9:16 --from-suggestion <sug_…> --json
147
+ # (or, on an existing project: npx -y cueframe composition from-suggestion <projectId> -s <sug_…>)
138
148
 
139
149
  # 4. Render — same framework verb as above.
140
- cueframe render <projectId> -o ./out.mp4 --json
150
+ npx -y cueframe render <projectId> -o ./out.mp4 --json
141
151
  ```
142
152
 
143
153
  Both flows converge on `composition put` → `render`; the on-ramp just authors the
@@ -154,50 +164,50 @@ video and composites it (the shared renderer never runs your code).
154
164
 
155
165
  ```bash
156
166
  # 1. Scaffold a workspace (writes cueframe.json + cueframe/components/). Idempotent.
157
- cueframe init --json
167
+ npx -y cueframe init --json
158
168
 
159
- # 2a. FORK a built-in primitive into cueframe/components/<id>/ as owned, editable source.
160
- # Discover ids from the catalog: cueframe api GET /v1/components (the live primitive catalog).
161
- cueframe eject cinematic-title --json
169
+ # 2a. Scaffold a component in cueframe/components/<id>/ as owned, editable source.
170
+ npx -y cueframe new component my-badge --json
162
171
 
163
- # 2b. …or scaffold a blank custom component.
164
- cueframe new component my-badge --json
172
+ # 2b. …or FORK a built-in: discover ids from the catalog (npx -y cueframe api GET /v1/components),
173
+ # fetch that primitive's source with the `get_component_source` tool, and paste it into
174
+ # cueframe/components/my-badge/index.tsx as your starting point.
165
175
 
166
176
  # 3. Edit cueframe/components/<id>/ — it's standard Remotion. The component is mounted
167
177
  # ({ durationInFrames, params }) at render; params are your composition's clip params.
168
178
 
169
179
  # 4. Publish to CueFrame so it can render (uploads index.tsx as the component's tsxSource).
170
- cueframe push cinematic-title --json # one component
171
- cueframe sync --json # every component in the workspace
180
+ npx -y cueframe push my-badge --json # one component
181
+ npx -y cueframe sync --json # every component in the workspace
172
182
 
173
183
  # 5. Reference the component id in your composition (as an alpha-layer clip), then render
174
184
  # with the same verb. Preview a single component first via the MCP preview_component loop.
175
- cueframe render <projectId> -o ./out.mp4 --json
185
+ npx -y cueframe render <projectId> -o ./out.mp4 --json
176
186
  ```
177
187
 
178
188
  ## Quick reference
179
189
 
180
190
  | Need to… | Command |
181
191
  |---|---|
182
- | See every command + flags | `cueframe describe --json` |
183
- | (Re)install/update this skill | `cueframe install` (→ `~/.claude/skills/cueframe-cli`) |
184
- | List projects | `cueframe list -n 50` |
185
- | List your media | `cueframe clips` (no mediaId arg) |
186
- | Discover the live composition schema | `cueframe schema composition` |
187
- | Validate a draft (no save, no render) | `cueframe composition validate -b @plan.json` |
188
- | Read composition + ETag | `cueframe composition get <projectId> --json` |
189
- | Write composition | `cueframe composition put <projectId> -b @plan.json` (ETag auto) |
190
- | Export to Final Cut | `cueframe export fcpxml <projectId> -s <sug> --wait -o cut.zip` |
191
- | Export to Premiere | `cueframe export premiere <projectId> -s <sug> --wait -o cut.zip` |
192
- | Anything not wrapped | `cueframe api GET /v1/... -i` (escape hatch, like `gh api`) |
193
- | Validate a composition without mutating | `cueframe composition validate -b @plan.json` |
192
+ | See every command + flags | `npx -y cueframe describe --json` |
193
+ | (Re)install/update this skill | `npx -y cueframe install` (→ `~/.claude/skills/cueframe-cli`) |
194
+ | List projects | `npx -y cueframe list -n 50` |
195
+ | List your media | `npx -y cueframe clips` (no mediaId arg) |
196
+ | Discover the live composition schema | `npx -y cueframe schema composition` |
197
+ | Validate a draft (no save, no render) | `npx -y cueframe composition validate -b @plan.json` |
198
+ | Read composition + ETag | `npx -y cueframe composition get <projectId> --json` |
199
+ | Write composition | `npx -y cueframe composition put <projectId> -b @plan.json` (ETag auto) |
200
+ | Export to Final Cut | `npx -y cueframe export fcpxml <projectId> -s <sug> --wait -o cut.zip` |
201
+ | Export to Premiere | `npx -y cueframe export premiere <projectId> -s <sug> --wait -o cut.zip` |
202
+ | Anything not wrapped | `npx -y cueframe api GET /v1/... -i` (escape hatch, like `gh api`) |
203
+ | Validate a composition without mutating | `npx -y cueframe composition validate -b @plan.json` |
194
204
 
195
205
  ## Auth
196
206
 
197
207
  Commands run against production. Authenticate once:
198
208
 
199
- - `cueframe login` — OAuth device flow (laptops).
200
- - `cueframe auth <cf_live_… key>` — save a static API key (CI / headless).
209
+ - `npx -y cueframe login` — OAuth device flow (laptops).
210
+ - `npx -y cueframe auth <cf_live_… key>` — save a static API key (CI / headless).
201
211
 
202
212
  Creds are stored in `~/.cueframe/auth.json`; the key can also come from the `CUEFRAME_API_KEY` env var.
203
213
 
@@ -215,11 +225,11 @@ Errors come as `{"event":"error", "phase":"<step>", "message":"...", "code":"...
215
225
 
216
226
  | Mistake | Reality |
217
227
  |---|---|
218
- | Reaching for `curl …/v1/...` because the CLI didn't have a command | Use `cueframe api METHOD /v1/...` — same auth, same JSON pipeline. |
219
- | Polling for render completion with a sleep loop | `cueframe render` already SSE-watches and exits when done. Use `render watch <id>` to reattach. |
228
+ | Reaching for `curl …/v1/...` because the CLI didn't have a command | Use `npx -y cueframe api METHOD /v1/...` — same auth, same JSON pipeline. |
229
+ | Polling for render completion with a sleep loop | `npx -y cueframe render` already SSE-watches and exits when done. Use `render watch <id>` to reattach. |
220
230
  | Skipping `--json` and trying to parse human output | Human output is for humans. Agents always use `--json`. |
221
231
  | Hand-editing the composition without an ETag | `composition put` GETs the ETag for you; `from-suggestion` rebuilds from a clip. Don't hand-craft unless you have to. |
222
- | Calling `cueframe render <projectId> <suggestionId>` (old two-positional shape) | `render` takes ONLY a projectId; commander rejects the extra arg. It renders the SAVED composition — author it first via `composition put` (hand-author) or `project create --from-suggestion <sug>` (clip-finder on-ramp). |
232
+ | Calling `npx -y cueframe render <projectId> <suggestionId>` (old two-positional shape) | `render` takes ONLY a projectId; commander rejects the extra arg. It renders the SAVED composition — author it first via `composition put` (hand-author) or `project create --from-suggestion <sug>` (clip-finder on-ramp). |
223
233
  | Assuming `render` needs a clip suggestion / that captions only come from a suggestion | No — `render` renders the saved composition directly; a suggestion is optional. Captions come from `composition.captions` (author them in the `put` JSON). The clip-suggestion on-ramp just fills those captions for you by slicing the transcript at author time. |
224
234
 
225
235
  ## When this skill applies (routing)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: cueframe-component-authoring
3
- description: Use when authoring, forking, or customizing a CueFrame motion-graphics component/primitive/graphic — e.g. "customize the cinematic-title primitive", "make my own animated lower-third", "fork a CueFrame template and edit it", "author a custom graphic and render it". Covers both the MCP agent path (get_component_source → create_component) and the CLI repo path (cueframe eject/new → push). Use BEFORE hand-writing a component from scratch — forking a built-in is usually the faster start.
3
+ description: Use when authoring, forking, or customizing a CueFrame motion-graphics component/primitive/graphic — e.g. "customize the cinematic-title primitive", "make my own animated lower-third", "fork a CueFrame template and edit it", "author a custom graphic and render it". Covers both the MCP agent path (get_component_source → create_component) and the CLI repo path (get_component_source → npx -y cueframe new component → push). Use BEFORE hand-writing a component from scratch — forking a built-in is usually the faster start.
4
4
  ---
5
5
 
6
6
  # CueFrame component authoring (fork / customize / own)
@@ -39,14 +39,15 @@ Source lives in `cueframe/components/<id>/` (the `cueframe.json` workspace); edi
39
39
  standard Remotion, push to render.
40
40
 
41
41
  ```bash
42
- cueframe init --json # scaffold cueframe.json + cueframe/components/
43
- cueframe eject cinematic-title --json # fork a built-in primitive as owned source
44
- # or: cueframe new component my-badge --json # scaffold a blank one
42
+ npx -y cueframe init --json # scaffold cueframe.json + cueframe/components/
43
+ npx -y cueframe new component my-badge --json # scaffold a component in the workspace
44
+ # to start from a built-in instead of a blank file: fetch its source with the
45
+ # `get_component_source` tool and paste it into cueframe/components/my-badge/index.tsx
45
46
  # …edit cueframe/components/<id>/ in your editor (standard Remotion)…
46
- cueframe push cinematic-title --json # upload index.tsx as the component tsxSource
47
- # or: cueframe sync --json # push every component in the workspace
47
+ npx -y cueframe push my-badge --json # upload index.tsx as the component tsxSource
48
+ # or: npx -y cueframe sync --json # push every component in the workspace
48
49
  # reference the component id in your composition, then render:
49
- cueframe render <projectId> -o ./out.mp4 --json
50
+ npx -y cueframe render <projectId> -o ./out.mp4 --json
50
51
  ```
51
52
 
52
53
  The CLI writes a 3-file layout (`index.tsx` = renderable module + adapter; `_config.ts` + `config.ts`
@@ -62,6 +63,6 @@ follow-up — today you choose from prose + params + source, or compose+`preview
62
63
  ## Don't
63
64
  - Don't expect a forked primitive to use rich named props — it's adapted to `({durationInFrames,
64
65
  params})`; read `params` inside.
65
- - Don't hand-roll a graphic from zero when a built-in is close — fork it (`get_component_source` /
66
- `cueframe eject`) and edit.
66
+ - Don't hand-roll a graphic from zero when a built-in is close — fork it (fetch the source with
67
+ `get_component_source`, paste it into a `npx -y cueframe new component` scaffold) and edit.
67
68
  - Don't `create_component` a fresh id each fix iteration — `update_component` (same id) is the loop.
@@ -50,7 +50,7 @@ style's) over each window. Result → `source.reframe.segments` on the clip.
50
50
  ## 3. Compose
51
51
 
52
52
  One video track, the screen recording as a media clip carrying the reframe.
53
- `cueframe composition put <projectId> -b @composition.json` (see `cueframe-cli`).
53
+ `npx -y cueframe composition put <projectId> -b @composition.json` (see `cueframe-cli`).
54
54
  Choose `-a 16:9` for landscape product video, `9:16` for social.
55
55
 
56
56
  ## 4. Polish — layer overlay primitives (this is what makes it look "produced")
@@ -77,21 +77,21 @@ Simultaneous overlays go on **separate tracks** — clips on one track can't ove
77
77
 
78
78
  ## 5. Render
79
79
 
80
- `cueframe render <projectId> -o out.mp4 --json`. Verify the output (ffprobe +
80
+ `npx -y cueframe render <projectId> -o out.mp4 --json`. Verify the output (ffprobe +
81
81
  sample frames) before declaring done.
82
82
 
83
83
  ## Worked examples — composition JSON
84
84
 
85
85
  These are **orientation, not the contract.** The live wire schema is
86
- `cueframe schema composition`, and the way to know a draft is correct is
87
- `cueframe composition validate -b @composition.json` — it runs the same
86
+ `npx -y cueframe schema composition`, and the way to know a draft is correct is
87
+ `npx -y cueframe composition validate -b @composition.json` — it runs the same
88
88
  validator the server enforces, with no save and no render. Discover + validate
89
89
  before you render; never spend a render to find a schema mistake.
90
90
 
91
91
  Each block below is a complete `@composition.json` (the bare object `composition put`
92
92
  accepts: top-level `v`, `format`, `tracks`, optional `captions`). All five validate
93
93
  against the real wire schema + save invariants (swap the `<…MediaId>` placeholders for
94
- real `cueframe upload` ids). Conventions that keep them valid:
94
+ real `npx -y cueframe upload` ids). Conventions that keep them valid:
95
95
 
96
96
  - Tracks hold **`contents`** (not `clips`); each clip wraps a `source`.
97
97
  - A clip's `source.kind` must match the track `kind`: `media` → `video`/`image`/`audio`
@@ -267,9 +267,10 @@ Talking-head with an `active-speaker` reframe and a `heroText` title at `zPlane:
267
267
  - **Picture-in-picture / inset cards render** — per-clip output-space placement
268
268
  (`region:{x,y,w,h}` in `[0,1]` + `fit`) is wired for PiP / inset / split-screen,
269
269
  for video, image, and overlay clips. Set `region`/`fit` on the **clip** (siblings
270
- of `source`, not inside it — or author via the `set_clip_region` agent tool); two
270
+ of `source`, not inside it — as an agent, patch them with an `apply_composition`
271
+ `clip.update` op: `{ type: 'clip.update', clipId, patch: { region, fit } }`); two
271
272
  clips with different placement composite by track order instead of occluding the
272
273
  background. See EX3 / EX4 below.
273
274
  - This recipe lives in a skill on purpose: the engine stays use-case-free; the
274
275
  product opinions (style, which primitives, layout) live here and ship via
275
- `cueframe install`. Add sibling recipes (`cueframe-podcast-clip`, …) the same way.
276
+ `npx -y cueframe install`. Add sibling recipes (`cueframe-podcast-clip`, …) the same way.
@@ -25,6 +25,9 @@ approaches and CueFrame isn't connected:
25
25
  run `npx -y cueframe install` — it detects what is on the machine and wires each one.
26
26
  - **ChatGPT:** the CLI cannot wire it (there is no local config to write) — add
27
27
  `https://api.cueframe.ai/v1/mcp` as a custom connector instead.
28
+ - **No account at all (pay-per-call):** connect
29
+ `https://api.cueframe.ai/v1/mcp/x402` — no sign-up, no API key; priced calls
30
+ settle per-call in USDC over x402 from the agent's wallet.
28
31
  <!-- /cueframe:connect -->
29
32
 
30
33
  Then straight to deriving — this whole job is minutes when the master is good.
@@ -22,7 +22,7 @@ they go straight to storage via presigned PUTs.
22
22
 
23
23
  ## 0. Prereqs
24
24
 
25
- - An API key with `projects:write` (create_brand_kit gates on the `brand_kits` plan feature — check `get_account` first; 402 names the feature).
25
+ - An API key with `projects:write`. `create_brand_kit` gates on the `brand_kits` entitlement, which EVERY plan grants including free, and it costs no credits — so brand kits are not a paywall to route around. (`get_account` confirms it; a 402 names the feature.)
26
26
  - `ffmpeg` locally, and the reference video file (download it first if it's a URL).
27
27
  - Know the org's IDENTITY kit if one exists (`get_profile` → brandKits). Inspiration NEVER overwrites identity: logo, brand fonts, and identity color slots come from the existing kit (or stay for the user to fill) — extraction contributes the LANGUAGE only.
28
28
 
@@ -24,6 +24,9 @@ approaches and CueFrame isn't connected:
24
24
  run `npx -y cueframe install` — it detects what is on the machine and wires each one.
25
25
  - **ChatGPT:** the CLI cannot wire it (there is no local config to write) — add
26
26
  `https://api.cueframe.ai/v1/mcp` as a custom connector instead.
27
+ - **No account at all (pay-per-call):** connect
28
+ `https://api.cueframe.ai/v1/mcp/x402` — no sign-up, no API key; priced calls
29
+ settle per-call in USDC over x402 from the agent's wallet.
27
30
  <!-- /cueframe:connect -->
28
31
 
29
32
  Keep the momentum — the video plan is the hard part, the connection is not.
@@ -24,6 +24,9 @@ When the first real tool call is imminent and CueFrame isn't connected:
24
24
  run `npx -y cueframe install` — it detects what is on the machine and wires each one.
25
25
  - **ChatGPT:** the CLI cannot wire it (there is no local config to write) — add
26
26
  `https://api.cueframe.ai/v1/mcp` as a custom connector instead.
27
+ - **No account at all (pay-per-call):** connect
28
+ `https://api.cueframe.ai/v1/mcp/x402` — no sign-up, no API key; priced calls
29
+ settle per-call in USDC over x402 from the agent's wallet.
27
30
  <!-- /cueframe:connect -->
28
31
 
29
32
  Thirty seconds, then straight back to the reel — treat it as a detour, never a gate.
@@ -25,6 +25,9 @@ approaches and CueFrame isn't connected:
25
25
  run `npx -y cueframe install` — it detects what is on the machine and wires each one.
26
26
  - **ChatGPT:** the CLI cannot wire it (there is no local config to write) — add
27
27
  `https://api.cueframe.ai/v1/mcp` as a custom connector instead.
28
+ - **No account at all (pay-per-call):** connect
29
+ `https://api.cueframe.ai/v1/mcp/x402` — no sign-up, no API key; priced calls
30
+ settle per-call in USDC over x402 from the agent's wallet.
28
31
  <!-- /cueframe:connect -->
29
32
 
30
33
  Then back to the brand — most of this job is a kit definition and an audit.
@@ -103,9 +103,10 @@ Everything in §1, plus:
103
103
  - **MUST** Active-speaker reframe (`focus: active-speaker` / `face`) — a
104
104
  moving camera, not a static center crop.
105
105
  - **MUST** Captions timed to the real transcript (`captions.fromTranscript`).
106
- The behind-the-speaker LOOK is an overlay text layer at
107
- `zPlane:"behind-subject"` where the footage allows — the caption layer
108
- itself always renders in front.
106
+ The focused behind-the-speaker LOOK is an overlay text layer at
107
+ `zPlane:"behind-subject"` where the footage allows. Use caption-layer
108
+ `zPlane:"behind-subject"` only when the user explicitly wants every running
109
+ caption behind the speaker and the legibility gate accepts it.
109
110
  - **MUST** Dead air and false starts cut (`addExcludedRange` /
110
111
  `cutAndRipple`).
111
112
 
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import{D as a}from"./chunk-4FMFWW74.js";import"./chunk-3QSA3EBY.js";export{a as analyzeCommand};