blitzreels 0.1.3 → 0.1.5

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.
Files changed (200) hide show
  1. package/README.md +65 -7
  2. package/dist/agent-context.d.ts +43 -0
  3. package/dist/agent-context.d.ts.map +1 -0
  4. package/dist/agent-context.js +170 -0
  5. package/dist/agent-context.js.map +1 -0
  6. package/dist/cli-command-routing.d.ts +27 -0
  7. package/dist/cli-command-routing.d.ts.map +1 -0
  8. package/dist/cli-command-routing.js +236 -0
  9. package/dist/cli-command-routing.js.map +1 -0
  10. package/dist/cli-errors.d.ts +29 -0
  11. package/dist/cli-errors.d.ts.map +1 -0
  12. package/dist/cli-errors.js +25 -0
  13. package/dist/cli-errors.js.map +1 -0
  14. package/dist/cli-flag-reader.d.ts +61 -0
  15. package/dist/cli-flag-reader.d.ts.map +1 -0
  16. package/dist/cli-flag-reader.js +207 -0
  17. package/dist/cli-flag-reader.js.map +1 -0
  18. package/dist/cli-http.d.ts +6 -0
  19. package/dist/cli-http.d.ts.map +1 -0
  20. package/dist/cli-http.js +42 -0
  21. package/dist/cli-http.js.map +1 -0
  22. package/dist/cli-presenter.d.ts +23 -0
  23. package/dist/cli-presenter.d.ts.map +1 -0
  24. package/dist/cli-presenter.js +117 -0
  25. package/dist/cli-presenter.js.map +1 -0
  26. package/dist/cli-runtime.d.ts +25 -0
  27. package/dist/cli-runtime.d.ts.map +1 -0
  28. package/dist/cli-runtime.js +125 -0
  29. package/dist/cli-runtime.js.map +1 -0
  30. package/dist/cli-timing.d.ts +4 -0
  31. package/dist/cli-timing.d.ts.map +1 -0
  32. package/dist/cli-timing.js +6 -0
  33. package/dist/cli-timing.js.map +1 -0
  34. package/dist/cli-types.d.ts +71 -0
  35. package/dist/cli-types.d.ts.map +1 -0
  36. package/dist/cli-types.js +2 -0
  37. package/dist/cli-types.js.map +1 -0
  38. package/dist/cli-value-parsers.d.ts +76 -0
  39. package/dist/cli-value-parsers.d.ts.map +1 -0
  40. package/dist/cli-value-parsers.js +266 -0
  41. package/dist/cli-value-parsers.js.map +1 -0
  42. package/dist/command-metadata.d.ts +54 -0
  43. package/dist/command-metadata.d.ts.map +1 -0
  44. package/dist/command-metadata.js +483 -0
  45. package/dist/command-metadata.js.map +1 -0
  46. package/dist/command-registry.d.ts +3 -0
  47. package/dist/command-registry.d.ts.map +1 -0
  48. package/dist/command-registry.js +39 -0
  49. package/dist/command-registry.js.map +1 -0
  50. package/dist/commands/ai-edit.d.ts +45 -0
  51. package/dist/commands/ai-edit.d.ts.map +1 -0
  52. package/dist/commands/ai-edit.js +368 -0
  53. package/dist/commands/ai-edit.js.map +1 -0
  54. package/dist/commands/api.d.ts +20 -0
  55. package/dist/commands/api.d.ts.map +1 -0
  56. package/dist/commands/api.js +56 -0
  57. package/dist/commands/api.js.map +1 -0
  58. package/dist/commands/audio.d.ts +65 -0
  59. package/dist/commands/audio.d.ts.map +1 -0
  60. package/dist/commands/audio.js +261 -0
  61. package/dist/commands/audio.js.map +1 -0
  62. package/dist/commands/auth-runtime.d.ts +24 -0
  63. package/dist/commands/auth-runtime.d.ts.map +1 -0
  64. package/dist/commands/auth-runtime.js +169 -0
  65. package/dist/commands/auth-runtime.js.map +1 -0
  66. package/dist/commands/auth.d.ts +26 -0
  67. package/dist/commands/auth.d.ts.map +1 -0
  68. package/dist/commands/auth.js +59 -0
  69. package/dist/commands/auth.js.map +1 -0
  70. package/dist/commands/caption-command-types.d.ts +66 -0
  71. package/dist/commands/caption-command-types.d.ts.map +1 -0
  72. package/dist/commands/caption-command-types.js +2 -0
  73. package/dist/commands/caption-command-types.js.map +1 -0
  74. package/dist/commands/caption-dry-run.d.ts +66 -0
  75. package/dist/commands/caption-dry-run.d.ts.map +1 -0
  76. package/dist/commands/caption-dry-run.js +205 -0
  77. package/dist/commands/caption-dry-run.js.map +1 -0
  78. package/dist/commands/caption-overrides.d.ts +43 -0
  79. package/dist/commands/caption-overrides.d.ts.map +1 -0
  80. package/dist/commands/caption-overrides.js +245 -0
  81. package/dist/commands/caption-overrides.js.map +1 -0
  82. package/dist/commands/caption-selection.d.ts +71 -0
  83. package/dist/commands/caption-selection.d.ts.map +1 -0
  84. package/dist/commands/caption-selection.js +89 -0
  85. package/dist/commands/caption-selection.js.map +1 -0
  86. package/dist/commands/caption-style-commands.d.ts +3 -0
  87. package/dist/commands/caption-style-commands.d.ts.map +1 -0
  88. package/dist/commands/caption-style-commands.js +240 -0
  89. package/dist/commands/caption-style-commands.js.map +1 -0
  90. package/dist/commands/caption-style-flags.d.ts +30 -0
  91. package/dist/commands/caption-style-flags.d.ts.map +1 -0
  92. package/dist/commands/caption-style-flags.js +199 -0
  93. package/dist/commands/caption-style-flags.js.map +1 -0
  94. package/dist/commands/caption-text-updates.d.ts +21 -0
  95. package/dist/commands/caption-text-updates.d.ts.map +1 -0
  96. package/dist/commands/caption-text-updates.js +23 -0
  97. package/dist/commands/caption-text-updates.js.map +1 -0
  98. package/dist/commands/captions-specs.d.ts +3 -0
  99. package/dist/commands/captions-specs.d.ts.map +1 -0
  100. package/dist/commands/captions-specs.js +219 -0
  101. package/dist/commands/captions-specs.js.map +1 -0
  102. package/dist/commands/captions.d.ts +7 -0
  103. package/dist/commands/captions.d.ts.map +1 -0
  104. package/dist/commands/captions.js +181 -0
  105. package/dist/commands/captions.js.map +1 -0
  106. package/dist/commands/clip-runtime.d.ts +70 -0
  107. package/dist/commands/clip-runtime.d.ts.map +1 -0
  108. package/dist/commands/clip-runtime.js +269 -0
  109. package/dist/commands/clip-runtime.js.map +1 -0
  110. package/dist/commands/clips.d.ts +59 -0
  111. package/dist/commands/clips.d.ts.map +1 -0
  112. package/dist/commands/clips.js +242 -0
  113. package/dist/commands/clips.js.map +1 -0
  114. package/dist/commands/command-operation.d.ts +26 -0
  115. package/dist/commands/command-operation.d.ts.map +1 -0
  116. package/dist/commands/command-operation.js +18 -0
  117. package/dist/commands/command-operation.js.map +1 -0
  118. package/dist/commands/editing-workflow-runtime.d.ts +42 -0
  119. package/dist/commands/editing-workflow-runtime.d.ts.map +1 -0
  120. package/dist/commands/editing-workflow-runtime.js +128 -0
  121. package/dist/commands/editing-workflow-runtime.js.map +1 -0
  122. package/dist/commands/editing-workflows.d.ts +70 -0
  123. package/dist/commands/editing-workflows.d.ts.map +1 -0
  124. package/dist/commands/editing-workflows.js +252 -0
  125. package/dist/commands/editing-workflows.js.map +1 -0
  126. package/dist/commands/effects-runtime.d.ts +64 -0
  127. package/dist/commands/effects-runtime.d.ts.map +1 -0
  128. package/dist/commands/effects-runtime.js +100 -0
  129. package/dist/commands/effects-runtime.js.map +1 -0
  130. package/dist/commands/effects.d.ts +69 -0
  131. package/dist/commands/effects.d.ts.map +1 -0
  132. package/dist/commands/effects.js +275 -0
  133. package/dist/commands/effects.js.map +1 -0
  134. package/dist/commands/exports.d.ts +51 -0
  135. package/dist/commands/exports.d.ts.map +1 -0
  136. package/dist/commands/exports.js +126 -0
  137. package/dist/commands/exports.js.map +1 -0
  138. package/dist/commands/media-assets.d.ts +100 -0
  139. package/dist/commands/media-assets.d.ts.map +1 -0
  140. package/dist/commands/media-assets.js +572 -0
  141. package/dist/commands/media-assets.js.map +1 -0
  142. package/dist/commands/media-overlays.d.ts +52 -0
  143. package/dist/commands/media-overlays.d.ts.map +1 -0
  144. package/dist/commands/media-overlays.js +270 -0
  145. package/dist/commands/media-overlays.js.map +1 -0
  146. package/dist/commands/media-runtime.d.ts +61 -0
  147. package/dist/commands/media-runtime.d.ts.map +1 -0
  148. package/dist/commands/media-runtime.js +221 -0
  149. package/dist/commands/media-runtime.js.map +1 -0
  150. package/dist/commands/project-read.d.ts +40 -0
  151. package/dist/commands/project-read.d.ts.map +1 -0
  152. package/dist/commands/project-read.js +155 -0
  153. package/dist/commands/project-read.js.map +1 -0
  154. package/dist/commands/projects.d.ts +68 -0
  155. package/dist/commands/projects.d.ts.map +1 -0
  156. package/dist/commands/projects.js +274 -0
  157. package/dist/commands/projects.js.map +1 -0
  158. package/dist/commands/stock-library.d.ts +72 -0
  159. package/dist/commands/stock-library.d.ts.map +1 -0
  160. package/dist/commands/stock-library.js +175 -0
  161. package/dist/commands/stock-library.js.map +1 -0
  162. package/dist/commands/system.d.ts +16 -0
  163. package/dist/commands/system.d.ts.map +1 -0
  164. package/dist/commands/system.js +110 -0
  165. package/dist/commands/system.js.map +1 -0
  166. package/dist/commands/text-overlay-spec.d.ts +18 -0
  167. package/dist/commands/text-overlay-spec.d.ts.map +1 -0
  168. package/dist/commands/text-overlay-spec.js +169 -0
  169. package/dist/commands/text-overlay-spec.js.map +1 -0
  170. package/dist/commands/text-overlays.d.ts +61 -0
  171. package/dist/commands/text-overlays.d.ts.map +1 -0
  172. package/dist/commands/text-overlays.js +199 -0
  173. package/dist/commands/text-overlays.js.map +1 -0
  174. package/dist/commands/timeline-runtime.d.ts +102 -0
  175. package/dist/commands/timeline-runtime.d.ts.map +1 -0
  176. package/dist/commands/timeline-runtime.js +415 -0
  177. package/dist/commands/timeline-runtime.js.map +1 -0
  178. package/dist/commands/timeline.d.ts +116 -0
  179. package/dist/commands/timeline.d.ts.map +1 -0
  180. package/dist/commands/timeline.js +549 -0
  181. package/dist/commands/timeline.js.map +1 -0
  182. package/dist/commands/workspace-defaults.d.ts +12 -0
  183. package/dist/commands/workspace-defaults.d.ts.map +1 -0
  184. package/dist/commands/workspace-defaults.js +115 -0
  185. package/dist/commands/workspace-defaults.js.map +1 -0
  186. package/dist/commands/workspace.d.ts +50 -0
  187. package/dist/commands/workspace.d.ts.map +1 -0
  188. package/dist/commands/workspace.js +116 -0
  189. package/dist/commands/workspace.js.map +1 -0
  190. package/dist/index.js +478 -2913
  191. package/dist/index.js.map +1 -1
  192. package/dist/preview-first-edit.d.ts +43 -0
  193. package/dist/preview-first-edit.d.ts.map +1 -0
  194. package/dist/preview-first-edit.js +37 -0
  195. package/dist/preview-first-edit.js.map +1 -0
  196. package/dist/update-notifier.d.ts +42 -0
  197. package/dist/update-notifier.d.ts.map +1 -0
  198. package/dist/update-notifier.js +265 -0
  199. package/dist/update-notifier.js.map +1 -0
  200. package/package.json +2 -2
package/README.md CHANGED
@@ -14,6 +14,9 @@ package for users who prefer scoped installs.
14
14
  After the first real publish:
15
15
 
16
16
  ```bash
17
+ npx blitzreels version
18
+ npx blitzreels doctor
19
+ npx blitzreels agent-context --json
17
20
  npx blitzreels auth login
18
21
  ```
19
22
 
@@ -31,8 +34,9 @@ blitzreels auth set-key --api-key br_live_...
31
34
  blitzreels auth whoami
32
35
  ```
33
36
 
34
- `auth login` opens BlitzReels in your browser, asks you to approve a one-time
35
- CLI code, then stores the generated API key in macOS Keychain when available or
37
+ `auth login` opens BlitzReels in your browser, shows the one-time CLI code, and
38
+ waits for you to click `Connect CLI`. After confirmation, it stores the
39
+ generated API key in macOS Keychain when available or
36
40
  `~/.blitzreels/config.json` as a fallback. Use `--no-browser` on remote shells
37
41
  and open the printed URL manually.
38
42
 
@@ -70,6 +74,14 @@ blitzreels media folders rename --folder-id FOLDER_ID --name "New folder name"
70
74
  blitzreels media folders update --folder-id FOLDER_ID --parent-folder-id root
71
75
  blitzreels media folders delete --folder-id FOLDER_ID --confirm-delete
72
76
 
77
+ blitzreels clips create --source-type youtube --youtube-url "https://www.youtube.com/watch?v=..." --name "MKBHD hero loop" --min-duration 8 --max-duration 12 --qa-mode permissive
78
+ blitzreels clips create --source-type asset --asset-id ASSET_ID --selection-mode time_range --start-seconds 52 --end-seconds 64 --max-duration 12
79
+ blitzreels clips get --clip-id CLIP_ID --json
80
+ blitzreels clips wait --clip-id CLIP_ID --json
81
+ blitzreels clips reselect --clip-id CLIP_ID --selection-mode time_range --start-seconds 52 --end-seconds 64 --min-duration 8 --max-duration 12
82
+ blitzreels clips repair --clip-id CLIP_ID --repair-mode auto
83
+ blitzreels clips export --clip-id CLIP_ID --resolution 1080p --format mp4 --allow-blocking-qa-bypass false
84
+
73
85
  blitzreels project inspect --project-id PROJECT_ID --json
74
86
  blitzreels project timeline --project-id PROJECT_ID --json
75
87
  blitzreels project snapshot --project-id PROJECT_ID --at 00:03
@@ -79,18 +91,27 @@ blitzreels timeline transform --project-id PROJECT_ID --timeline-item-id TIMELIN
79
91
  blitzreels timeline move --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --at 00:06 --layer-index 2
80
92
  blitzreels timeline delete --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --auto-pack false
81
93
 
94
+ blitzreels effects zoom add --project-id PROJECT_ID --at 9.8 --duration 1.8 --scale-start 1 --scale-end 1.1 --easing easeInOut
95
+ blitzreels effects zoom update --project-id PROJECT_ID --timeline-item-id EFFECT_TIMELINE_ITEM_ID --scale-end 1.1 --easing easeInOut --duration 1.8
96
+ blitzreels effects mask add --project-id PROJECT_ID --settings-json '{"shape":"rounded","size":{"width":0.8,"height":0.8}}'
97
+ blitzreels effects colorgrade update --project-id PROJECT_ID --timeline-item-id EFFECT_TIMELINE_ITEM_ID --settings-json '{"brightness":1.1,"vignetteEnabled":true}'
98
+
82
99
  blitzreels text add --project-id PROJECT_ID --text "Hook" --at 0 --duration 4
83
100
  blitzreels text add --project-id PROJECT_ID --text "SERVEURS MCP" --at 24.33 --duration 2.8 --font-family Pacifico --font-size 82 --color "#17FFA6" --background-color "rgba(3,7,18,0.82)" --top "24%"
84
101
  blitzreels text list --project-id PROJECT_ID --json
85
102
  blitzreels text update --project-id PROJECT_ID --content-item-id CONTENT_ITEM_ID --text "New hook" --font-family Inter --font-size 64 --color "#FFFFFF"
86
103
  blitzreels text remove --project-id PROJECT_ID --content-item-id CONTENT_ITEM_ID
87
104
 
88
- blitzreels audio add --project-id PROJECT_ID --asset-id ASSET_ID --at 0 --volume 0.6
105
+ blitzreels audio search --query "ambient riser" --license cc0 --json
106
+ blitzreels audio import --provider openverse --external-id AUDIO_ID --project-id PROJECT_ID --at 0 --duration 12 --volume 0.03
107
+ blitzreels audio add --project-id PROJECT_ID --asset-id ASSET_ID --at 0 --volume 0.03
89
108
 
90
109
  blitzreels captions words list --project-id PROJECT_ID --match-text "Supabase" --json
91
110
  blitzreels captions words text --project-id PROJECT_ID --word-id WORD_ID --text "Supabase"
92
111
  blitzreels captions words batch-text --project-id PROJECT_ID --updates-json '[{"word_id":"WORD_ID","new_text":"Supabase"}]'
112
+ blitzreels captions words batch-text --project-id PROJECT_ID --updates-file caption-updates.json
93
113
  blitzreels captions words style --project-id PROJECT_ID --word-id WORD_ID --font-family Pacifico --color "#17FFA6" --scale 1.45
114
+ blitzreels captions words style --project-id PROJECT_ID --all --style-file caption-word-style.json
94
115
  blitzreels captions words emphasis --project-id PROJECT_ID --match-text "MCP" --emphasis true
95
116
  blitzreels captions words delete --project-id PROJECT_ID --word-id WORD_ID
96
117
  blitzreels captions words merge --project-id PROJECT_ID --word-ids WORD_ID_1,WORD_ID_2 --text "serveurs MCP"
@@ -102,11 +123,11 @@ blitzreels silence apply --project-id PROJECT_ID --timeline-item-id TIMELINE_ITE
102
123
  blitzreels mistakes plan --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --json
103
124
  blitzreels mistakes apply --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --confirm-preview
104
125
 
105
- blitzreels captions themes list --json
106
- blitzreels captions theme set --project-id PROJECT_ID --theme-id THEME_ID
107
- blitzreels captions theme set-default --theme-id THEME_ID
126
+ blitzreels captions looks list --json
127
+ blitzreels captions look set --project-id PROJECT_ID --look-id editor-premium-lime
128
+ blitzreels captions style update --project-id PROJECT_ID --look-id paper-karaoke --text-stroke-enabled false
108
129
 
109
- blitzreels exports start --project-id PROJECT_ID
130
+ blitzreels exports start --project-id PROJECT_ID --cover-frame-seconds 1
110
131
  blitzreels exports wait --export-id EXPORT_ID
111
132
  blitzreels exports download --export-id EXPORT_ID --output ./short.mp4
112
133
 
@@ -115,6 +136,43 @@ blitzreels api spec
115
136
  ```
116
137
 
117
138
  Use `--json` for script and AI-agent workflows.
139
+ Use `--fields id,name` with `--json` to trim large responses.
140
+ Export status responses include `thumbnail_url`, `thumbnail.frame_seconds`, `thumbnail.rationale`, and first-pass `platform_metadata` suggestions for YouTube, TikTok, and Instagram.
141
+
142
+ ## Machine-Readable Contract
143
+
144
+ ```bash
145
+ blitzreels agent-context --json
146
+ blitzreels agent-context --command "media attach" --json
147
+ blitzreels schema --command "captions words style" --json
148
+ blitzreels media attach --project-id PROJECT_ID --asset-id ASSET_ID --at 6 --dry-run
149
+ ```
150
+
151
+ `agent-context` is the machine-readable command contract for agents. It includes
152
+ command metadata, typed flags, examples, read/write markers, destructive markers,
153
+ and known error categories.
154
+
155
+ Agent workflow strategy lives in BlitzReels skills and docs, not in CLI command
156
+ metadata or normal command output.
157
+
158
+ `--dry-run` is available on mutating commands and prints the API request that
159
+ would be made without making the write request. Destructive dry-runs still require
160
+ the same explicit confirmation flags as real destructive commands.
161
+
162
+ ## Updates
163
+
164
+ The CLI checks `https://www.blitzreels.com/api/cli/releases` at most once per
165
+ day and prints a short update notice to stderr when a newer version is
166
+ available. The notice is skipped for `--json`, CI, non-interactive shells, and
167
+ commands where it would be noisy.
168
+
169
+ ```bash
170
+ blitzreels version
171
+ blitzreels doctor
172
+ npm i -g blitzreels@latest
173
+ ```
174
+
175
+ Set `BLITZREELS_NO_UPDATE_NOTIFIER=1` to disable passive update notices.
118
176
 
119
177
  ## Faulty Commands
120
178
 
@@ -0,0 +1,43 @@
1
+ import { type CliExitCode } from "./cli-errors.js";
2
+ import type { CommandSpec, FlagSpec } from "./command-metadata.js";
3
+ export type AgentContext = {
4
+ schema_version: "1";
5
+ cli: {
6
+ name: "blitzreels";
7
+ version: string;
8
+ default_base_url: string;
9
+ exit_codes: Array<{
10
+ code: CliExitCode;
11
+ meaning: string;
12
+ retryable: boolean;
13
+ }>;
14
+ };
15
+ commands: Array<{
16
+ operation_id: string;
17
+ command: string;
18
+ category: string;
19
+ description: string;
20
+ usage: string;
21
+ mutates: boolean;
22
+ destructive: boolean;
23
+ requires_auth: boolean;
24
+ dry_run_supported: boolean;
25
+ flags: readonly FlagSpec[];
26
+ examples: readonly string[];
27
+ errors: Array<{
28
+ code: string;
29
+ description: string;
30
+ exit_code: CliExitCode;
31
+ retryable: boolean;
32
+ }>;
33
+ }>;
34
+ };
35
+ export declare function buildAgentContext({ commandFilter, commandSpecs, surfaceName, }: {
36
+ commandFilter: string | undefined;
37
+ commandSpecs: CommandSpec[];
38
+ surfaceName?: string;
39
+ }): AgentContext;
40
+ export declare function buildAgentContextLines({ value, }: {
41
+ value: AgentContext;
42
+ }): string[];
43
+ //# sourceMappingURL=agent-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-context.d.ts","sourceRoot":"","sources":["../src/agent-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAiB,MAAM,iBAAiB,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAQnE,MAAM,MAAM,YAAY,GAAG;IACzB,cAAc,EAAE,GAAG,CAAC;IACpB,GAAG,EAAE;QACH,IAAI,EAAE,YAAY,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,gBAAgB,EAAE,MAAM,CAAC;QACzB,UAAU,EAAE,KAAK,CAAC;YAChB,IAAI,EAAE,WAAW,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,OAAO,CAAC;SACpB,CAAC,CAAC;KACJ,CAAC;IACF,QAAQ,EAAE,KAAK,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,OAAO,CAAC;QACrB,aAAa,EAAE,OAAO,CAAC;QACvB,iBAAiB,EAAE,OAAO,CAAC;QAC3B,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;QAC3B,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;QAC5B,MAAM,EAAE,KAAK,CAAC;YACZ,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,SAAS,EAAE,WAAW,CAAC;YACvB,SAAS,EAAE,OAAO,CAAC;SACpB,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAChC,aAAa,EACb,YAAY,EACZ,WAA6B,GAC9B,EAAE;IACD,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,YAAY,CA0Cf;AAED,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,GACN,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;CACrB,GAAG,MAAM,EAAE,CAKX"}
@@ -0,0 +1,170 @@
1
+ import { CliUsageError } from "./cli-errors.js";
2
+ import { CLI_VERSION, DEFAULT_BASE_URL } from "./cli-runtime.js";
3
+ import { commandLabel, commandsEqual, flagsForCommand, suggestCommandSpecs, } from "./command-metadata.js";
4
+ export function buildAgentContext({ commandFilter, commandSpecs, surfaceName = "agent-context", }) {
5
+ const commands = commandFilter
6
+ ? commandSpecs.filter((spec) => commandsEqual(spec.command, splitCommandFilter({ value: commandFilter })))
7
+ : commandSpecs;
8
+ if (commandFilter && commands.length === 0) {
9
+ throw new CliUsageError({
10
+ code: "unknown_command",
11
+ message: `Unknown command for ${surfaceName}: ${commandFilter}`,
12
+ suggestions: suggestCommandSpecs({
13
+ command: splitCommandFilter({ value: commandFilter }),
14
+ specs: commandSpecs,
15
+ }).map((spec) => commandLabel({ command: spec.command })),
16
+ });
17
+ }
18
+ return {
19
+ schema_version: "1",
20
+ cli: {
21
+ name: "blitzreels",
22
+ version: CLI_VERSION,
23
+ default_base_url: DEFAULT_BASE_URL,
24
+ exit_codes: buildCliExitCodeContract(),
25
+ },
26
+ commands: commands.map((spec) => ({
27
+ operation_id: operationIdForCommand({ command: spec.command }),
28
+ command: commandLabel({ command: spec.command }),
29
+ category: spec.command[0] ?? "unknown",
30
+ description: spec.description,
31
+ usage: spec.usage,
32
+ mutates: spec.mutates,
33
+ destructive: spec.destructive,
34
+ requires_auth: spec.requiresAuth,
35
+ dry_run_supported: spec.dryRunSupported,
36
+ flags: flagsForCommand({ spec }),
37
+ examples: spec.examples,
38
+ errors: buildCommandErrors({ spec }),
39
+ })),
40
+ };
41
+ }
42
+ export function buildAgentContextLines({ value, }) {
43
+ return value.commands.map((command) => `${command.command} ${command.mutates ? "write" : "read"}${command.destructive ? " destructive" : ""}${command.dry_run_supported ? " dry-run" : ""} - ${command.description}`);
44
+ }
45
+ function splitCommandFilter({ value }) {
46
+ return value
47
+ .trim()
48
+ .split(/\s+/)
49
+ .filter((part) => part.length > 0);
50
+ }
51
+ function buildCommandErrors({ spec }) {
52
+ const errors = [
53
+ {
54
+ code: "unknown_command",
55
+ description: "Command is not registered.",
56
+ exit_code: 2,
57
+ retryable: false,
58
+ },
59
+ {
60
+ code: "unknown_flag",
61
+ description: "Flag is not accepted by command.",
62
+ exit_code: 2,
63
+ retryable: false,
64
+ },
65
+ {
66
+ code: "missing_required_flag",
67
+ description: "A required flag was not provided.",
68
+ exit_code: 2,
69
+ retryable: false,
70
+ },
71
+ {
72
+ code: "invalid_flag_value",
73
+ description: "A flag value could not be parsed.",
74
+ exit_code: 2,
75
+ retryable: false,
76
+ },
77
+ {
78
+ code: "cli_error",
79
+ description: "Input or local execution failed.",
80
+ exit_code: 1,
81
+ retryable: false,
82
+ },
83
+ ];
84
+ if (spec.requiresAuth) {
85
+ errors.push({
86
+ code: "api_error",
87
+ description: "BlitzReels API returned a non-2xx response.",
88
+ exit_code: 1,
89
+ retryable: false,
90
+ });
91
+ errors.push({
92
+ code: "auth_error",
93
+ description: "Authentication or permission failed.",
94
+ exit_code: 3,
95
+ retryable: false,
96
+ });
97
+ errors.push({
98
+ code: "not_found",
99
+ description: "Requested BlitzReels resource was not found.",
100
+ exit_code: 4,
101
+ retryable: false,
102
+ });
103
+ errors.push({
104
+ code: "conflict",
105
+ description: "Requested operation conflicted with current project state.",
106
+ exit_code: 5,
107
+ retryable: false,
108
+ });
109
+ errors.push({
110
+ code: "rate_limited",
111
+ description: "Request was rate limited.",
112
+ exit_code: 6,
113
+ retryable: true,
114
+ });
115
+ errors.push({
116
+ code: "server_error",
117
+ description: "BlitzReels API returned a transient server error.",
118
+ exit_code: 7,
119
+ retryable: true,
120
+ });
121
+ }
122
+ if (spec.mutates && !spec.dryRunSupported) {
123
+ errors.push({
124
+ code: "unsupported_dry_run",
125
+ description: "--dry-run was used on a command that cannot preview.",
126
+ exit_code: 2,
127
+ retryable: false,
128
+ });
129
+ }
130
+ if (spec.destructive) {
131
+ errors.push({
132
+ code: "missing_confirmation",
133
+ description: "Required destructive confirmation flag was not provided.",
134
+ exit_code: 2,
135
+ retryable: false,
136
+ });
137
+ }
138
+ return errors;
139
+ }
140
+ function operationIdForCommand({ command }) {
141
+ const [first = "unknown", ...rest] = command;
142
+ return [
143
+ first,
144
+ ...rest.map((part) => part.replace(/-([a-z0-9])/g, (_match, value) => value.toUpperCase())),
145
+ ].join(".");
146
+ }
147
+ function buildCliExitCodeContract() {
148
+ return [
149
+ { code: 1, meaning: "Local or generic API failure.", retryable: false },
150
+ {
151
+ code: 2,
152
+ meaning: "Usage error: command, flag, or input is invalid.",
153
+ retryable: false,
154
+ },
155
+ {
156
+ code: 3,
157
+ meaning: "Authentication or permission failure.",
158
+ retryable: false,
159
+ },
160
+ { code: 4, meaning: "Requested resource was not found.", retryable: false },
161
+ {
162
+ code: 5,
163
+ meaning: "Conflict with current server state.",
164
+ retryable: false,
165
+ },
166
+ { code: 6, meaning: "Rate limited; retry after backoff.", retryable: true },
167
+ { code: 7, meaning: "Transient server/provider failure.", retryable: true },
168
+ ];
169
+ }
170
+ //# sourceMappingURL=agent-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-context.js","sourceRoot":"","sources":["../src/agent-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { CliUsageError } from "./cli-errors.js";
2
+ import type { ParsedArgs } from "./cli-types.js";
3
+ import { type CommandSpec } from "./command-metadata.js";
4
+ export declare function parseArgs({ argv }: {
5
+ argv: string[];
6
+ }): ParsedArgs;
7
+ export declare function validateParsedArgs({ parsed }: {
8
+ parsed: ParsedArgs;
9
+ }): void;
10
+ export declare function validateSafeInputs({ parsed }: {
11
+ parsed: ParsedArgs;
12
+ }): void;
13
+ export declare function findCommandSpec({ command, }: {
14
+ command: string[];
15
+ }): CommandSpec | undefined;
16
+ export declare function findGroupCommandSpecs({ command, }: {
17
+ command: string[];
18
+ }): CommandSpec[];
19
+ export declare function printCommandOrGroupHelpOrThrow({ command, }: {
20
+ command: string[];
21
+ }): void;
22
+ export declare function printHelp(): void;
23
+ export declare function buildUnknownCommandError({ command, }: {
24
+ command: string[];
25
+ }): CliUsageError;
26
+ export declare function usageForCurrentCommand(): string | undefined;
27
+ //# sourceMappingURL=cli-command-routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-command-routing.d.ts","sourceRoot":"","sources":["../src/cli-command-routing.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EACL,KAAK,WAAW,EAOjB,MAAM,uBAAuB,CAAC;AAG/B,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,UAAU,CAiClE;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAwB3E;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAgB3E;AAED,wBAAgB,eAAe,CAAC,EAC9B,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,GAAG,WAAW,GAAG,SAAS,CAE1B;AAED,wBAAgB,qBAAqB,CAAC,EACpC,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,GAAG,WAAW,EAAE,CAOhB;AAED,wBAAgB,8BAA8B,CAAC,EAC7C,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,GAAG,IAAI,CAYP;AAED,wBAAgB,SAAS,IAAI,IAAI,CAWhC;AAED,wBAAgB,wBAAwB,CAAC,EACvC,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,GAAG,aAAa,CAQhB;AAED,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAG3D"}
@@ -0,0 +1,236 @@
1
+ import { homedir } from "node:os";
2
+ import { join, resolve } from "node:path";
3
+ import { CliUsageError } from "./cli-errors.js";
4
+ import { commandLabel, commandsEqual, flagsForCommand, GLOBAL_FLAGS, suggestCommandSpecs, suggestValues, } from "./command-metadata.js";
5
+ import { COMMAND_SPECS } from "./command-registry.js";
6
+ export function parseArgs({ argv }) {
7
+ const command = [];
8
+ const flags = {};
9
+ for (let index = 0; index < argv.length; index++) {
10
+ const value = argv[index];
11
+ if (value === undefined) {
12
+ continue;
13
+ }
14
+ if (!value.startsWith("--")) {
15
+ command.push(value);
16
+ continue;
17
+ }
18
+ const [rawKey, inlineValue] = value.slice(2).split("=", 2);
19
+ const key = rawKey ?? "";
20
+ if (inlineValue !== undefined) {
21
+ flags[key] = inlineValue;
22
+ continue;
23
+ }
24
+ const next = argv[index + 1];
25
+ if (next !== undefined && !next.startsWith("--")) {
26
+ flags[key] = next;
27
+ index++;
28
+ continue;
29
+ }
30
+ flags[key] = true;
31
+ }
32
+ return { command, flags };
33
+ }
34
+ export function validateParsedArgs({ parsed }) {
35
+ const spec = findCommandSpec({ command: parsed.command });
36
+ if (!spec) {
37
+ throw buildUnknownCommandError({ command: parsed.command });
38
+ }
39
+ const allowedFlags = new Set([
40
+ ...GLOBAL_FLAGS,
41
+ ...spec.flags.map((flag) => flag.name),
42
+ ]);
43
+ for (const flag of Object.keys(parsed.flags)) {
44
+ if (!allowedFlags.has(flag)) {
45
+ throw buildUnknownFlagError({ spec, flag });
46
+ }
47
+ }
48
+ if (getBooleanFlag({ flags: parsed.flags, name: "dry-run" })) {
49
+ if (!spec.dryRunSupported) {
50
+ throw new CliUsageError({
51
+ code: "unsupported_dry_run",
52
+ message: "--dry-run is not supported for this command.",
53
+ usage: spec.usage,
54
+ });
55
+ }
56
+ }
57
+ }
58
+ export function validateSafeInputs({ parsed }) {
59
+ for (const [name, value] of Object.entries(parsed.flags)) {
60
+ if (typeof value !== "string") {
61
+ continue;
62
+ }
63
+ rejectControlChars({ name, value });
64
+ if (isIdLikeFlag({ name })) {
65
+ rejectUnsafeId({ name, value });
66
+ }
67
+ if (name === "url") {
68
+ rejectUnsafeUrl({ name, value });
69
+ }
70
+ if (name === "output") {
71
+ rejectUnsafeOutputPath({ value });
72
+ }
73
+ }
74
+ }
75
+ export function findCommandSpec({ command, }) {
76
+ return COMMAND_SPECS.find((spec) => commandsEqual(spec.command, command));
77
+ }
78
+ export function findGroupCommandSpecs({ command, }) {
79
+ if (command.length === 0) {
80
+ return [];
81
+ }
82
+ return COMMAND_SPECS.filter((spec) => commandsEqual(spec.command.slice(0, command.length), command));
83
+ }
84
+ export function printCommandOrGroupHelpOrThrow({ command, }) {
85
+ const spec = findCommandSpec({ command });
86
+ if (spec) {
87
+ printCommandHelp({ spec });
88
+ return;
89
+ }
90
+ const groupSpecs = findGroupCommandSpecs({ command });
91
+ if (groupSpecs.length > 0) {
92
+ printGroupHelp({ command, specs: groupSpecs });
93
+ return;
94
+ }
95
+ throw buildUnknownCommandError({ command });
96
+ }
97
+ export function printHelp() {
98
+ console.log(`blitzreels
99
+
100
+ Usage:
101
+ ${COMMAND_SPECS.map((spec) => ` ${spec.usage}`).join("\n")}
102
+
103
+ Global flags:
104
+ --api-key KEY
105
+ --base-url URL
106
+ --json
107
+ `);
108
+ }
109
+ export function buildUnknownCommandError({ command, }) {
110
+ const suggestions = suggestCommands({ command }).map((spec) => spec.usage);
111
+ return new CliUsageError({
112
+ code: "unknown_command",
113
+ message: `Unknown command: ${commandLabel({ command })}`,
114
+ suggestions,
115
+ usage: suggestions[0],
116
+ });
117
+ }
118
+ export function usageForCurrentCommand() {
119
+ const parsed = parseArgs({ argv: process.argv.slice(2) });
120
+ return findCommandSpec({ command: parsed.command })?.usage;
121
+ }
122
+ function printCommandHelp({ spec }) {
123
+ const flags = flagsForCommand({ spec });
124
+ console.log(`Usage:
125
+ ${spec.usage}
126
+
127
+ Description:
128
+ ${spec.description}
129
+
130
+ Flags:
131
+ ${flags
132
+ .map((flag) => {
133
+ const required = flag.required ? " required" : "";
134
+ const values = flag.enum ? ` (${flag.enum.join("|")})` : "";
135
+ const defaultValue = flag.default === undefined ? "" : ` default=${String(flag.default)}`;
136
+ return ` --${flag.name} ${flag.type}${required}${values}${defaultValue} ${flag.description}`;
137
+ })
138
+ .join("\n")}
139
+
140
+ Examples:
141
+ ${spec.examples.map((example) => ` ${example}`).join("\n")}
142
+ `);
143
+ }
144
+ function printGroupHelp({ command, specs, }) {
145
+ const label = commandLabel({ command });
146
+ console.log(`blitzreels ${label}
147
+
148
+ Available commands:
149
+ ${specs.map((spec) => ` ${spec.usage}`).join("\n")}
150
+
151
+ Examples:
152
+ ${specs
153
+ .slice(0, 4)
154
+ .flatMap((spec) => spec.examples.slice(0, 1))
155
+ .map((example) => ` ${example}`)
156
+ .join("\n")}
157
+ `);
158
+ }
159
+ function buildUnknownFlagError({ spec, flag, }) {
160
+ const flags = [
161
+ ...new Set([
162
+ ...spec.flags.map((candidate) => candidate.name),
163
+ ...GLOBAL_FLAGS,
164
+ ]),
165
+ ];
166
+ const suggestions = suggestValues({ value: flag, candidates: flags }).map((candidate) => `--${candidate}`);
167
+ return new CliUsageError({
168
+ code: "unknown_flag",
169
+ message: `Unknown flag --${flag} for \`${commandLabel({ command: spec.command })}\`.`,
170
+ suggestions,
171
+ usage: spec.usage,
172
+ });
173
+ }
174
+ function suggestCommands({ command }) {
175
+ return suggestCommandSpecs({ command, specs: COMMAND_SPECS });
176
+ }
177
+ function getBooleanFlag({ flags, name, }) {
178
+ return flags[name] === true || flags[name] === "true";
179
+ }
180
+ function rejectControlChars({ name, value, }) {
181
+ if (Array.from(value).some((character) => {
182
+ const code = character.charCodeAt(0);
183
+ return code < 32 || code === 127;
184
+ })) {
185
+ throw new CliUsageError({
186
+ code: "unsafe_input",
187
+ message: `--${name} contains control characters.`,
188
+ });
189
+ }
190
+ }
191
+ function isIdLikeFlag({ name }) {
192
+ return name === "id" || name.endsWith("-id") || name.endsWith("-ids");
193
+ }
194
+ function rejectUnsafeId({ name, value, }) {
195
+ if (/[?#%]/.test(value)) {
196
+ throw new CliUsageError({
197
+ code: "unsafe_input",
198
+ message: `--${name} must be an ID, not a URL or encoded path.`,
199
+ });
200
+ }
201
+ }
202
+ function rejectUnsafeUrl({ name, value, }) {
203
+ let url;
204
+ try {
205
+ url = new URL(value);
206
+ }
207
+ catch {
208
+ throw new CliUsageError({
209
+ code: "unsafe_input",
210
+ message: `--${name} must be a valid URL.`,
211
+ });
212
+ }
213
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
214
+ throw new CliUsageError({
215
+ code: "unsafe_input",
216
+ message: `--${name} must use http or https.`,
217
+ });
218
+ }
219
+ if (url.username || url.password) {
220
+ throw new CliUsageError({
221
+ code: "unsafe_input",
222
+ message: `--${name} must not include embedded credentials.`,
223
+ });
224
+ }
225
+ }
226
+ function rejectUnsafeOutputPath({ value }) {
227
+ const outputPath = resolve(value);
228
+ const sensitiveDirs = [join(homedir(), ".ssh"), join(homedir(), ".gnupg")];
229
+ if (sensitiveDirs.some((dir) => outputPath.startsWith(`${dir}/`) || outputPath === dir)) {
230
+ throw new CliUsageError({
231
+ code: "unsafe_input",
232
+ message: "--output cannot write into sensitive home directories.",
233
+ });
234
+ }
235
+ }
236
+ //# sourceMappingURL=cli-command-routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-command-routing.js","sourceRoot":"","sources":["../src/cli-command-routing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export type CliExitCode = 1 | 2 | 3 | 4 | 5 | 6 | 7;
2
+ export type CliErrorContract = {
3
+ code: string;
4
+ exitCode: CliExitCode;
5
+ retryable: boolean;
6
+ };
7
+ export declare class CliUsageError extends Error {
8
+ code: string;
9
+ suggestions: string[];
10
+ usage: string | undefined;
11
+ constructor({ code, message, suggestions, usage, }: {
12
+ code: string;
13
+ message: string;
14
+ suggestions?: string[];
15
+ usage?: string;
16
+ });
17
+ }
18
+ export declare class CliOperationError extends Error {
19
+ code: string;
20
+ exitCode: CliExitCode;
21
+ retryable: boolean;
22
+ constructor({ code, exitCode, message, retryable, }: {
23
+ code: string;
24
+ exitCode: CliExitCode;
25
+ message: string;
26
+ retryable: boolean;
27
+ });
28
+ }
29
+ //# sourceMappingURL=cli-errors.d.ts.map