fimo 0.8.0 → 0.9.0-staging.1

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 (44) hide show
  1. package/assets/content-templates/hooks-template.eta +4 -2
  2. package/assets/content-templates/types-template.eta +66 -1
  3. package/assets/skills/fimo/SKILL.md +17 -54
  4. package/assets/skills/fimo-cli/SKILL.md +21 -17
  5. package/assets/skills/fimo-cli/references/agent-setup.md +36 -53
  6. package/assets/skills/fimo-cli/references/agents.md +4 -4
  7. package/assets/skills/fimo-cli/references/content.md +62 -3
  8. package/assets/skills/fimo-cli/references/deploy.md +1 -1
  9. package/assets/skills/fimo-cli/references/forms.md +1 -1
  10. package/assets/skills/fimo-cli/references/init.md +16 -24
  11. package/assets/skills/fimo-cli/references/integrations/firecrawl.md +20 -4
  12. package/assets/skills/fimo-cli/references/integrations.md +5 -1
  13. package/assets/skills/fimo-cli/references/project-vars-and-secrets.md +14 -11
  14. package/assets/skills/fimo-cli/references/projects.md +1 -1
  15. package/assets/skills/fimo-cli/references/support.md +11 -9
  16. package/assets/skills/fimo-cli/references/webhooks.md +164 -0
  17. package/assets/skills/fimo-code/SKILL.md +67 -0
  18. package/assets/skills/{fimo → fimo-code}/references/content.md +86 -15
  19. package/assets/skills/fimo-studio/SKILL.md +5 -3
  20. package/assets/skills/fimo-studio/references/cms.md +9 -1
  21. package/assets/skills/fimo-studio/references/webhooks.md +42 -0
  22. package/dist/cli/bundle.json +1 -1
  23. package/dist/cli/index.js +306 -297
  24. package/dist/runtime/content/client/createContentClient.js +2 -1
  25. package/dist/runtime/content/client/internal.js +1 -0
  26. package/dist/runtime/content/client/types.d.ts +16 -0
  27. package/dist/scripts/validate-schemas.js +42 -1
  28. package/package.json +1 -1
  29. package/release.json +2 -2
  30. package/scripts/postinstall.mjs +11 -65
  31. package/templates/react-router/AGENTS.md +44 -0
  32. package/templates/react-router/CLAUDE.md +5 -0
  33. package/templates/react-router/package.json +1 -1
  34. package/assets/agents-starter/AGENTS.md +0 -66
  35. /package/assets/skills/{fimo → fimo-code}/assets/react-router-locales/navigation.tsx +0 -0
  36. /package/assets/skills/{fimo → fimo-code}/assets/react-router-locales/routes.ts +0 -0
  37. /package/assets/skills/{fimo → fimo-code}/references/assets.md +0 -0
  38. /package/assets/skills/{fimo → fimo-code}/references/design.md +0 -0
  39. /package/assets/skills/{fimo → fimo-code}/references/forms.md +0 -0
  40. /package/assets/skills/{fimo → fimo-code}/references/labels.md +0 -0
  41. /package/assets/skills/{fimo → fimo-code}/references/locales.md +0 -0
  42. /package/assets/skills/{fimo → fimo-code}/references/setup-plain-vite.md +0 -0
  43. /package/assets/skills/{fimo → fimo-code}/references/setup-react-router.md +0 -0
  44. /package/assets/skills/{fimo → fimo-code}/references/ui.md +0 -0
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: fimo-code
3
+ description: >-
4
+ How to write code in a Fimo project — the npm package surface. Load when
5
+ writing JSX that renders schema content, defining schemas or forms (JSON),
6
+ using `t()` for labels, plugging media into `fimo/ui` components,
7
+ or applying the project's code conventions. CLI commands and workflows
8
+ (push, deploy, sync, etc.) live in the `fimo-cli` skill.
9
+ ---
10
+
11
+ # Fimo
12
+
13
+ You are writing code in a Fimo project — a content + media + forms + analytics platform for React websites with a CMS dashboard. This skill describes the **`fimo` npm package surface** as installed in this specific project: what's exported from `fimo`, `fimo/ui`, `fimo/vite`; the JSON shapes you write; the generated React Query hooks and Zod schemas you import; and the code conventions for using them.
14
+
15
+ This skill is version-locked to this project's installed `fimo` package — the shapes here match what your code can actually use.
16
+
17
+ For CLI commands and workflows (creating a project, pushing schemas/forms, deploying, managing labels, etc.), the **`fimo-cli`** skill is the source of truth. Run every CLI command as `npx fimo@latest <command>` (always the latest, no global install). Load it on demand with `npx fimo@latest skills get fimo-cli`.
18
+
19
+ ## Critical: NEVER hardcode user-facing things
20
+
21
+ This is the load-bearing rule for every code change. **Fimo's whole point is that content editors edit content in the dashboard, not in code.** Anything hardcoded breaks that.
22
+
23
+ - **Content** (posts, products, pages, lists, anything structured) → declare a schema, render collections with generated `useList()` or `useInfiniteList()` hooks + `fimo/ui` components. Use `useGet()` only for legacy fixed array queries. **Never** write `const posts = [...]` in JSX.
24
+ - **Strings** (labels, CTAs, headings, descriptions, any visible text) → wrap in `t('key')` and create the default-locale value with `fimo labels set`. Use `--locale <locale>` only when intentionally writing a non-default locale. **Never** write `<h1>Welcome</h1>` directly — write `<Text value={t('home.title')} as="h1" />`.
25
+ - **Media** (images, videos, files) → use `<Image>` / `<Video>` from `fimo/ui` for schema media, `<StaticImage>` for hard-coded URLs. **Never** use `<img src={...}>`.
26
+ - **Forms** → use the generated Zod schema + `submitX` helper from `@/forms/<name>`. Never hand-roll fetch or validation.
27
+
28
+ If you find yourself about to hardcode anything user-facing, **stop and use the appropriate Fimo primitive instead.** For pushing the schema/form/asset to the backend, that's CLI territory — see the `fimo-cli` skill.
29
+
30
+ ## When starting code work, load these references up front
31
+
32
+ These define the package surface for the load-bearing primitives. **Read all six before generating significant code:**
33
+
34
+ - `references/content.md` — schema JSON shape, field types, Tiptap nodes, generated React Query hooks
35
+ - `references/forms.md` — form JSON spec, generated Zod + `submitX` helper
36
+ - `references/assets.md` — `FimoMedia` shape, how to render assets
37
+ - `references/labels.md` — `t()` helper, `useLabels()`, wrap rules
38
+ - `references/locales.md` — locale routing helpers, `FimoLink`, custom-framework contract
39
+ - `references/ui.md` — `fimo/ui` components + JSX code conventions + app code rules
40
+
41
+ Workflow / CLI-side concerns (pushing schemas, generating images, managing labels, deploying) live in the **`fimo-cli`** skill's matching references.
42
+
43
+ ## Decision Tree (specific tasks)
44
+
45
+ - **Setting up Fimo in a new project** — pick the framework:
46
+ - React Router framework mode (new projects use React Router 8) → `references/setup-react-router.md`
47
+ - Plain Vite + React (or upgrading a legacy v3 project) → `references/setup-plain-vite.md`
48
+ - Writing schema JSON / picking field types / Tiptap richtext → `references/content.md`
49
+ - Writing form JSON / generated form client / form code → `references/forms.md`
50
+ - Plugging media into a component / `FimoMedia` shape → `references/assets.md`
51
+ - ANY user-facing string in code → `references/labels.md`
52
+ - Locale-aware routes, links, or framework adapters → `references/locales.md`
53
+ - ANY JSX rendering schema content or `t()` output → `references/ui.md`
54
+ - Major visual / redesign / hero section / brand → `references/design.md`
55
+
56
+ ## Anti-Patterns
57
+
58
+ - **Hardcoding content in JSX** — `<h1>My Blog</h1>` + an array of posts in code. Use schemas + entries + `t()`.
59
+ - **Raw HTML for schema content** — `<img src={post.coverImage.url}>` instead of `<Image value={post.coverImage}>`. The `fimo/ui` components carry metadata for inline editing in the admin.
60
+ - **Raw `<a href>` for internal navigation** — causes full page reloads. Use `<FimoLink>` for locale-aware internal links or React Router `<Link>` when intentionally bypassing locale helpers. Reserve `<a>` for external links.
61
+ - **Pulling stock photos from external URLs** — editors can't manage them. Use a Fimo media task such as `fimo image generate`.
62
+ - **Editing generated `.ts` files** under `src/schemas/` or `src/forms/` — regenerate them through `fimo validate` or the matching push command.
63
+ - **Writing raw HTML in `richtext` fields** — must be Tiptap JSONContent.
64
+ - **Calling `t()` with a dynamic first argument** — the key must be a string literal so the extractor finds it.
65
+ - **Decorating the disposable starter** — `src/pages/Index.tsx` is throwaway scaffolding. On first real generation, replace it entirely.
66
+ - **Skipping legal pages** — `Privacy.tsx` + `Terms.tsx` are required for public sites; the template ships them.
67
+ - **Showing Fimo branding** in the generated site unless the user explicitly asks for it.
@@ -13,6 +13,7 @@ This file covers the **package surface**: the JSON shape you write, the generate
13
13
  "i18n": { "enabled": true },
14
14
  "fields": {
15
15
  "title": { "type": "string" },
16
+ "summary": { "type": "text" },
16
17
  "body": { "type": "richtext" },
17
18
  "publishDate": { "type": "string" },
18
19
  "featured": { "type": "boolean" },
@@ -45,19 +46,76 @@ something else (e.g. `handle`, `permalink`).
45
46
 
46
47
  ## Field types
47
48
 
48
- | Type | `data` JSON shape | Use for |
49
- | ----------- | ----------------------------------------------------------------------------- | --------------------------------- |
50
- | `string` | `"..."` | Titles, short text |
51
- | `richtext` | Tiptap JSONContent (see below) | Blog body, descriptions, articles |
52
- | `number` | `42` | Counts, quantities |
53
- | `boolean` | `true` / `false` | Flags |
54
- | `date` | ISO date string, e.g. `"2026-06-03"` | Publish dates, timestamps |
55
- | `media` | `{ "source": "local"\|"external", "url": "https://...", "alt": "..." }` | Images, video |
56
- | `json` | any JSON | Structured metadata |
57
- | `reference` | `{ "id": "..." }`, `null`, or an array of reference objects when `many: true` | References to another schema |
49
+ | Type | `data` JSON shape | Use for |
50
+ | ----------- | ----------------------------------------------------------------------------- | ---------------------------------------------------------- |
51
+ | `string` | `"..."` | One-line text: titles, names, slugs |
52
+ | `text` | `"First line\nSecond line"` | Multiline plain text without formatting |
53
+ | `richtext` | Tiptap JSONContent (see below) | Formatted content with headings, links, lists, or media |
54
+ | `number` | `42` | Counts, quantities |
55
+ | `boolean` | `true` / `false` | Flags |
56
+ | `date` | ISO date string, e.g. `"2026-06-03"` | Publish dates, timestamps |
57
+ | `media` | `{ "source": "local"\|"external", "url": "https://...", "alt": "..." }` | Images, video |
58
+ | `json` | any JSON | Structured metadata |
59
+ | `reference` | `{ "id": "..." }`, `null`, or an array of reference objects when `many: true` | References to another schema |
60
+ | `blocks` | ordered array of objects | Fixed groups, repeated sections, or selectable page blocks |
58
61
 
59
62
  A `date` field currently generates as `any` in the TS client, so for typed access (and the `<Date>` component) prefer a `string` field holding an ISO date — which is what the `publishDate` examples below do.
60
63
 
64
+ ## Blocks
65
+
66
+ `blocks` is the only nested structured-content type and always stores an array. Use `schema.fields` for one homogeneous block shape. Set `max: 1` when the field is a single optional group. Use `schema.oneOf` when editors choose a variant for each item.
67
+
68
+ ```json
69
+ {
70
+ "seo": {
71
+ "type": "blocks",
72
+ "max": 1,
73
+ "schema": {
74
+ "fields": {
75
+ "title": { "type": "string", "required": true },
76
+ "description": { "type": "text" }
77
+ }
78
+ }
79
+ },
80
+ "sections": {
81
+ "type": "blocks",
82
+ "min": 1,
83
+ "max": 20,
84
+ "schema": {
85
+ "oneOf": [
86
+ {
87
+ "uid": "hero",
88
+ "label": "Hero",
89
+ "fields": {
90
+ "heading": { "type": "string", "required": true },
91
+ "introduction": { "type": "text" }
92
+ }
93
+ },
94
+ {
95
+ "uid": "quote",
96
+ "label": "Quote",
97
+ "fields": {
98
+ "quote": { "type": "text", "required": true },
99
+ "author": { "type": "reference", "target": "Author" }
100
+ }
101
+ }
102
+ ]
103
+ }
104
+ }
105
+ }
106
+ ```
107
+
108
+ - `blocks.schema.fields` repeats one homogeneous shape.
109
+ - `blocks.schema.oneOf` lets the editor choose exactly one variant per item.
110
+ - Blocks always read and write arrays. A field with `max: 1` is `[]` or `[item]`, never a bare object.
111
+ - `min` and `max` constrain the total number of blocks. Use `min: 1` to require at least one block; `required: true` has the same minimum-one behavior.
112
+ - Fimo creates a stable `_key` for each item. A `oneOf` item also carries `_type`, matching the variant `uid`.
113
+ - Nested fields support the same defaults and validators as top-level fields.
114
+ - Blocks inherit the owning entry's locale.
115
+ - Nested references use one fixed `target`. Unpopulated reads return `{ id, documentId }`, like top-level references.
116
+ - Nested population and filtering are not supported yet.
117
+ - `anyOf` is not supported. One block never merges multiple variant schemas.
118
+
61
119
  ## Reference fields
62
120
 
63
121
  Use `reference` when one content entry references another content entry. Do not store entry IDs in a `json` field as a workaround.
@@ -102,16 +160,27 @@ Entry payload example:
102
160
 
103
161
  After editing schema JSON, run `fimo schemas push {Uid}` and then `fimo validate`. Push regenerates the schema client and applies the schema change to existing content automatically:
104
162
 
105
- - Adding fields and changing labels preserve entries.
106
- - Removing a field removes only that field's values.
163
+ - Adding optional fields and changing labels preserve entries.
164
+ - Adding a required field backfills its `default` only in existing objects that need it. The push fails safely if those objects exist and no valid default is provided.
165
+ - Removing a field or block variant removes only those nested values.
107
166
  - A one-to-many reference change wraps each existing reference in an array.
108
- - A many-to-one change, reference target change, scalar type change, or scalar/reference change clears only the changed field.
167
+ - Changing between `string` and `text` preserves values.
168
+ - Other primitive type changes convert safe values, such as `42` to `"42"`, and reject unsafe values without changing content or schema.
169
+ - Lowering blocks `max` trims items from the end. Raising `min` appends blocks from the field's non-empty `default` array.
170
+ - Changing a reference target clears those connections. Renaming a relation field with the same target preserves them.
171
+ - Preserve top-level or nested renames with repeatable one-time operations: `fimo schemas push Page --rename sections.hero.heading=sections.hero.title`. Renames are command intent, not schema JSON.
172
+ - A many-to-one change or scalar/reference change clears only the changed field.
109
173
  - Collection-to-singleton removes that type's entries and cleans references to those documents.
110
174
  - Singleton-to-collection preserves the existing entry.
175
+ - Blocks migrations are surgical: unaffected nested fields, block keys, and block order survive every supported change.
176
+
177
+ There are no reset or data-loss flags. A failed migration is atomic: neither schema nor entries change.
111
178
 
112
- There are no reset or data-loss flags. Do not invent one or promise that incompatible field values survive; the schema change itself selects the behavior above.
179
+ Choose by editing intent:
113
180
 
114
- **Default to `richtext`** for fields named `body`, `content`, `description`, `summary`, `bio`, `intro`, `details`, `excerpt` — only use `string` when the field is explicitly short (e.g. a 160-char meta description).
181
+ - Use `string` for one-line values such as titles, names, labels, slugs, URLs, and short metadata.
182
+ - Use `text` for plain multiline copy such as summaries, descriptions, bios, excerpts, intros, and details when formatting is unnecessary.
183
+ - Use `richtext` for content that needs formatting or structured blocks, especially article bodies and page content.
115
184
 
116
185
  ## Tiptap JSONContent (richtext)
117
186
 
@@ -202,6 +271,7 @@ interface BlogPost {
202
271
  contentType: string;
203
272
  };
204
273
  title: FimoString;
274
+ summary: FimoString;
205
275
  body: FimoRichText;
206
276
  coverImage: FimoMedia;
207
277
  publishDate: FimoString;
@@ -391,6 +461,7 @@ The entry objects a hook returns are **not** plain JS values. The generated clie
391
461
  | Schema field type | Field value you get | Notes |
392
462
  | ----------------- | ----------------------------------- | ------------------------------------------------------------------------------------- |
393
463
  | `string` | `FimoString` | `extends String` — **not** a primitive `string` |
464
+ | `text` | `FimoString` | Multiline plain text with the same source tracking as `string` |
394
465
  | `richtext` | `FimoRichText` | Tiptap JSONContent + source metadata |
395
466
  | `boolean` | `FimoBoolean` | class; `.valueOf()` → `boolean` |
396
467
  | `media` | `FimoMedia` / `FimoMedia[]` | shape + rendering in `references/assets.md` |
@@ -6,9 +6,9 @@ description: >-
6
6
  Triggers: "in Fimo Studio", "in the dashboard", "in the web app",
7
7
  "how do I X in the UI", or screenshots of the dashboard. Topics
8
8
  covered: dashboard content and CMS, publishing from the dashboard,
9
- dashboard SEO/domain settings, visual editing, version history UI,
10
- dashboard sharing/billing, and dashboard chat. Never describe UI
11
- locations, buttons, or panels from memory — always read the relevant
9
+ dashboard SEO/domain settings, outbound webhooks, visual editing, version
10
+ history UI, dashboard sharing/billing, and dashboard chat. Never describe
11
+ UI locations, buttons, or panels from memory — always read the relevant
12
12
  reference file first.
13
13
  ---
14
14
 
@@ -37,6 +37,7 @@ Read the relevant reference file when the user's question matches a topic.
37
37
  | AI Chat | references/ai-chat.md | "What can the AI do?", "How do I give context?" |
38
38
  | Code Editor | references/code-editor.md | "How do I edit code?", "Where are my files?" |
39
39
  | SEO Settings | references/seo-settings.md | "How do I set up SEO?", "Favicon, title, share image" |
40
+ | Webhooks | references/webhooks.md | "React to forms", "Send events to another service" |
40
41
  | Preview & Responsive | references/preview-and-responsive.md | "How does it look on mobile?", "How do I test sizes?" |
41
42
  | Visual Editing | references/visual-editing.md | "Can I edit visually?", "How do I change colors?" |
42
43
  | Version History | references/version-history.md | "How do I undo?", "How do I go back?" |
@@ -53,6 +54,7 @@ Read the relevant reference file when the user's question matches a topic.
53
54
  | Custom domains | Publishing (must publish first), Billing (premium required) |
54
55
  | Adding images | Media Library, AI Chat, Edit Mode |
55
56
  | Content/CMS | AI Chat, Media Library |
57
+ | Webhooks | Project secrets, Forms, Publishing, Agents |
56
58
  | Visual changes | Edit Mode (quick tweaks), AI Chat (bigger changes), Code Editor (full control) |
57
59
  | Something went wrong | Version History, AI Chat |
58
60
  | Working with others | Sharing, Collaboration |
@@ -42,7 +42,7 @@ When you open a Collection, the entry list provides several tools:
42
42
  2. Click the **+** (plus) icon button at the top of the Collection (labeled **New entry** on hover). If the Collection is empty, use the **Create entry** button in the center of the empty state instead.
43
43
  3. Fill in the form fields (text, images, dates, whatever the collection defines).
44
44
 
45
- Changes save automatically as you fill in each field (the save is debounced), so there is no Save button. The save status appears in the top bar (Saving / Saved). The entry is now part of your Collection. If the Collection is wired to a page on your site, the new content shows up automatically.
45
+ Changes save automatically as you fill in each field (the save is debounced), so there is no Save button. The save status appears in the top bar (Saving / Saved). An incomplete new entry waits until its required fields are valid before it becomes part of the Collection. If the Collection is wired to a page on your site, new content shows up automatically.
46
46
 
47
47
  ## Editing an Entry
48
48
 
@@ -51,6 +51,14 @@ Changes save automatically as you fill in each field (the save is debounced), so
51
51
 
52
52
  Your edits save automatically as you change each field (the save is debounced), so there is no Save button. Watch the top bar for the save status (Saving / Saved). The entry editor's only header actions are delete (trash icon) and copy link.
53
53
 
54
+ If a field is invalid, the editor keeps the change unsaved and pins a status bar below the header. Choose **Review issues** to jump to the first invalid field, then **Next issue** to move through the remaining fields. Collapsed blocks open automatically. Once every issue is fixed, the editor confirms that all fields are valid and resumes saving.
55
+
56
+ ## Editing Text
57
+
58
+ - Short text such as titles, names, and slugs uses one compact line.
59
+ - Plain multiline text such as summaries and descriptions starts taller and grows as you write.
60
+ - Formatted content uses the rich-text editor for headings, links, lists, and media.
61
+
54
62
  ## Bulk Operations
55
63
 
56
64
  Need to update or remove several entries at once?
@@ -0,0 +1,42 @@
1
+ # Webhooks
2
+
3
+ > **Beta:** Test each destination and review its delivery history before depending on it in production.
4
+
5
+ Webhooks send project activity to an external HTTPS endpoint. Use them for focused reactions such as adding a waitlist submission to an email tool, notifying Slack after a publish, or starting a GitHub workflow after an agent review.
6
+
7
+ Only project members with Full Access can see Webhooks in Settings or manage its destinations and delivery history.
8
+
9
+ ## Create one
10
+
11
+ 1. Open the project and choose **Settings**.
12
+ 2. Select **Webhooks**.
13
+ 3. Choose **New webhook**.
14
+ 4. Name it, select one event, and enter the destination URL.
15
+ 5. Optionally narrow form, agent, media, or entry events with the filter shown for that event.
16
+ 6. Review the request and select **Save**.
17
+
18
+ The event groups are Entries, Forms, Publish, Agents, Analytics, and Media. Webhooks belong to the project, with up to 20 configurations. They listen to main by default or can include every environment.
19
+
20
+ Entry webhooks show **Combine rapid changes**. The default waits 5 seconds after direct editing stops and sends one delivery with the combined changes. Immediate, 30-second, and 1-minute windows are also available. Bulk edits and environment merges already produce batches and send immediately.
21
+
22
+ ## Configure the request
23
+
24
+ The default payload is the complete Fimo event, including its type, project, environment, timestamp, and event-specific data. Keep this when the destination can accept it.
25
+
26
+ Choose **Custom template** when a service expects a specific JSON shape. Use **Insert variable** to pick fields for the selected event. Variables use paths such as `{{ event.data.submission.data.email }}`. The preview catches invalid JSON and missing variables before save.
27
+
28
+ When Studio recognizes a Resend, Slack, or GitHub URL, it offers a request setup for that service. The suggestion never changes the request automatically. Accept it to prefill relevant headers and JSON, then review every field.
29
+
30
+ ## Add authentication
31
+
32
+ Under **Headers**, add a header name and type any non-secret prefix, such as `Bearer `. Choose **Insert secret** to select an existing project secret or create one without leaving the webhook editor. Creating a secret never replaces an existing secret with the same name; select the existing secret instead. Fixed values are suitable only for non-sensitive headers.
33
+
34
+ Fimo signs requests by default. Save the signing secret shown after creation so a custom receiver can verify `X-Fimo-Signature`. Rotate it from the webhook configuration if it is exposed.
35
+
36
+ ## Test and monitor
37
+
38
+ Use **Send test** before depending on a workflow. Tests use documented sample data and travel through the same delivery path as real events.
39
+
40
+ Open **Deliveries** to see the event ID, masked destination, request metadata and payload excerpt, queue message ID, status, HTTP response, duration, and individual attempts. Fimo automatically retries temporary failures. After all automatic retries are exhausted, open the failed delivery and choose **Retry now**. A delivery accepts up to five manual retries.
41
+
42
+ Destination credentials are masked in configuration and delivery details. A successful test means the destination returned a successful HTTP response; it does not necessarily mean the provider completed its downstream action, so check the provider when that distinction matters.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "bundled": true,
3
3
  "bundler": "esbuild",
4
- "bundledAt": "2026-07-23T08:29:03.159Z",
4
+ "bundledAt": "2026-07-24T08:33:36.585Z",
5
5
  "cliVersion": "0.8.0",
6
6
  "external": [
7
7
  "oxc-parser",