fimo 0.20.1-staging.1 → 0.21.0-staging.2

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/README.md CHANGED
@@ -74,7 +74,7 @@ fimo deploy -m "your message"
74
74
  Go live to production:
75
75
 
76
76
  ```bash
77
- fimo publish --version 1.0.0
77
+ fimo publish --label "Homepage launch"
78
78
  ```
79
79
 
80
80
  Environments work like git branches:
@@ -128,7 +128,8 @@ These fire at specific moments in the project lifecycle. **Surface them proactiv
128
128
  - **When the user wants to try something risky / explore a redesign without touching the live site** → suggest a feature Branch: `fimo checkout -b <name>` gives an isolated Branch + DB + preview. Deploy previews there, then `fimo merge` it back and `fimo publish`. See `references/branches.md`.
129
129
  - **After completing or safely preserving the user's main work, when a confirmed Fimo platform failure still materially blocks the task after one safe recovery attempt, or a confirmed missing capability blocks completion or forces a fragile or heavily manual workaround** → use the built-in `supportReport` tool. Do not wait for the user to ask and do not stop after only describing the gap. See `references/support.md`.
130
130
  - **After the first successful `fimo deploy`** → suggest `fimo invite` if the project involves multiple people. Typical roles: `edit` for developers/content editors, `view` or `comment` for clients/stakeholders, `full` for project leads. See `references/invite.md`.
131
- - **When the user wants to modify the URL of their website** → walk through `references/domains.md`. The CLI surface covers renaming the Fimo-provided subdomain (`fimo domains rename-default`, free), attaching a domain they already own (`fimo domains add`, Premium), and buying a new domain through Fimo (`fimo domains buy`, Premium). The auto-generated default URL on every project is a fallback, not a final choice — proactively offer this after `fimo deploy --publish` if the user mentioned a real brand or domain.
131
+ - **After the first successful `fimo deploy --publish`** (not the automatic first preview) → if there is no custom domain and the free default `*.fimo.site` slug still looks generated or was never explicitly chosen, offer to find a cleaner free subdomain. It needs no DNS. Never claim one without explicit user confirmation: suggest candidates, let the user choose, then rename it. Skip this nudge if the user already chose the default slug, attached a custom domain, or declined. See `references/domains.md` § Offer a cleaner default URL after first publish.
132
+ - **When the user wants to modify the URL of their website** → walk through `references/domains.md`. The CLI surface covers renaming the Fimo-provided subdomain (`fimo domains rename-default`, free), attaching a domain they already own (`fimo domains add`, Premium), and buying a new domain through Fimo (`fimo domains buy`, Premium).
132
133
 
133
134
  ## Anti-Patterns
134
135
 
@@ -22,7 +22,7 @@ fimo validate # project build and codegen checks
22
22
  fimo deploy # push to main — this also wires the declared triggers
23
23
  fimo agents run <name> # trigger a manual run → sessionId
24
24
  fimo agents runs <name> # see past sessions
25
- fimo agents report <name> # print a run's report (the agent's final message)
25
+ fimo agents report <name> # print a run's outcome summary
26
26
  fimo agents logs <name> # stream a session's log
27
27
  ```
28
28
 
@@ -56,6 +56,52 @@ integrations:
56
56
  An explicit map is restrictive: only entries set to `true` are available. An omitted or disabled integration cannot be
57
57
  used. See `references/integrations.md` for project setup, auth, and provider-specific commands.
58
58
 
59
+ ## How a cloud run ends
60
+
61
+ Fimo creates one task Branch and environment for a cloud run, tells the agent their names, and manages their lifecycle.
62
+ The agent works only in that checkout. Extra branches, worktrees, and `git push` are unsupported and cannot be cleaned up
63
+ or handed off correctly.
64
+
65
+ - **Merge** when the work is ready for the target Branch. Fimo applies it or keeps any conflict for review.
66
+ - **Retain** when a person should review the work, the run stops or fails, the agent needs an answer, or recovery may be
67
+ necessary. Fimo keeps the task Branch for a follow-up run.
68
+ - **Discard** when none of the run's work should be applied, including when it made no useful changes or deliberately
69
+ abandoned an approach. This permanently deletes the task Branch and every change in it without review.
70
+
71
+ If the agent exits without a decision, Fimo retains the task Branch. `fimo deploy` inside a run may build a preview of
72
+ that Branch for inspection or screenshots; it does not finish or hand off the run.
73
+
74
+ The run report is a concise outcome summary: what changed, what was verified, and what is still blocked. It is not a
75
+ chronological account, and it should not use decorative emoji.
76
+
77
+ When a run cannot continue correctly without a decision from a project member, it may call `ask_user` instead. The
78
+ question goes to the Fimo Inbox, the current invocation ends, and Fimo keeps the same task Branch and environment until
79
+ an authorized member answers. The answer starts one ordinary continuation in the same run thread; the original model
80
+ process does not wait.
81
+
82
+ Use `ask_user` sparingly, especially from scheduled agents:
83
+
84
+ - Ask only for a genuinely blocking human decision. Prefer a safe reversible default when one exists.
85
+ - Group every known blocker into one form with 1–4 related steps. Give it a 1–3 sentence description that says where
86
+ the work stands and why the decision matters or what it unlocks; keep implementation detail in the run.
87
+ - Use choices for compact text options. Use cards only when an option benefits from an image or a richer title and
88
+ subtitle. Use assets when the image itself is the answer, and tables when options need the same structured comparison.
89
+ - Do not repeat a question or request already waiting in prior run history.
90
+ - Use `finish_run` with `retain` when the work is ready for review but no answer is required.
91
+
92
+ An agent may include one multi-select `capabilities` step in that same form to request public Fimo capabilities it does
93
+ not currently hold. Group related tokens in one request. Selected tokens apply only to the continuation started by that
94
+ answer; unselected tokens are denied, selecting none is valid, and the blocked invocation never gains new authority.
95
+ Internal runtime abilities, integration setup, and OAuth are not capability requests.
96
+
97
+ At the start of a run, `run_history` provides bounded summaries of earlier outcomes and work still awaiting a person. An agent
98
+ may also maintain `.fimo/agents/<name>/MEMORY.md` as an ordinary reviewed file for durable facts that change future
99
+ behavior. Keep it under 4 KB, record no secrets or run log, and prune stale entries before adding new ones.
100
+
101
+ When three or more earlier runs still await a question answer, review, conflict resolution, or recovery, the agent
102
+ normally starts no new independent work. Unless the current trigger explicitly asks it to proceed anyway, it makes no
103
+ changes and finishes with `discard` and a brief report of what is waiting.
104
+
59
105
  ## Capabilities
60
106
 
61
107
  Capabilities describe the opt-in Fimo and network actions an agent may take. Managed agents always receive project
@@ -88,9 +134,10 @@ There is no all-capabilities wildcard; keeping the list explicit makes each agen
88
134
  | `runtime:long_running` | Run beyond the default time limit | High |
89
135
  | `runtime:auto_merge` | Auto-merge trivial proposed branches | Critical |
90
136
 
91
- If a capability is missing, the related command is denied and the agent should choose another path or report the
92
- blocker. Add the capability to `capabilities.yaml`, run `fimo agents validate <name>`, deploy the bundle, and start a
93
- new run. A denied capability does not grant access to anything else.
137
+ If a public Fimo capability is missing and the work is genuinely blocked, the agent can request it through `ask_user`.
138
+ Fimo grants only the selected subset to the next invocation in that run thread. Unknown capabilities, internal runtime
139
+ abilities, and capabilities the run already holds are refused before the question is stored. For durable access on
140
+ ordinary future runs, add the capability to `capabilities.yaml`, validate, and deploy the bundle.
94
141
 
95
142
  Studio chat and project-bound Slack turns receive `fimo:logs:read`. Autonomous agents receive it only when their
96
143
  `capabilities.yaml` declares it; use `fimo logs` with the deploy guidance when diagnosing a failed preview.
@@ -113,7 +160,7 @@ fimo agents logs <name> [--session <id>] [--project <id>] [-C <dir>]
113
160
 
114
161
  - **`run <name>`** — fire the agent's `manual` trigger on the server; prints a `sessionId` on success. Skips with `no-manual-trigger` when `config.yaml` declares none, or `trigger-not-wired` when the push-to-main sync recorded the trigger but refused to wire it (see the wiring note below). **Pre-flight drift check**: if `.fimo/agents/<name>/` (or the legacy root bundle) has uncommitted git changes, the command refuses — the server would dispatch the _deployed_ version, so deploy first. Pass `--skip-drift-check` to dispatch the deployed bundle anyway. Defaults `--branch` to `main`; legacy `--env` remains an alias.
115
162
  - **`runs <name>`** — list past run sessions for the agent in a compact table (id, started, duration, status, trigger, Branch, cost). Default `--limit 20`; `--branch` filters to one Branch. The response's legacy `env` field is still present for API compatibility.
116
- - **`report <name>`** — print a run's **report**: the agent's final message, captured when the run finishes (for a read-only agent like `seo-audit` this _is_ the audit; for a write agent it's a "what I changed" summary). With no `--session`, the most recent run for `<name>` is used (combine with `--branch` to scope); `--session <id>` targets a specific run. Output is raw markdown, so it stays readable in the terminal and pipes cleanly (e.g. `fimo agents report seo-audit | glow`). If the run hasn't finished, or produced no message, it says so (and shows the stop reason when there is one). This is the command to read what a run actually produced — see the `logs` note below.
163
+ - **`report <name>`** — print a run's **report**: its durable outcome summary (for a read-only agent like `seo-audit` this _is_ the audit; for a write agent it's a "what I changed" summary). A run that never finalised falls back to its last message. With no `--session`, the most recent run for `<name>` is used (combine with `--branch` to scope); `--session <id>` targets a specific run. Output is raw markdown, so it stays readable in the terminal and pipes cleanly (e.g. `fimo agents report seo-audit | glow`). If the run hasn't finished, or produced no message, it says so (and shows the stop reason when there is one). This is the command to read what a run actually produced — see the `logs` note below.
117
164
  - **`logs <name>`** — stream a run's log (defaults to the latest session; `--session <id>` targets one). **Note:** the log-streaming endpoint is still a server-side stub at time of writing — the command prints a placeholder rather than real log lines. To read a finished run's output today, use `report`.
118
165
 
119
166
  ## How triggers get wired
@@ -35,7 +35,7 @@ fimo --branch <name> <command> # peek at another Branch for one command (does n
35
35
  | `fimo diff [from] [to]` | `git diff` | Two-Branch diff across all surfaces. Defaults `from` = current Branch, `to` = `main`. `--surface <name>` limits to one; `--json`; `--no-color`. |
36
36
  | `fimo status` | `git status` | Multi-surface status for the current Branch vs its parent. See below. |
37
37
  | `fimo merge <from>` | `git merge` | Merge another Branch into the current one (multi-surface, atomic, interactive conflict resolver). See below. |
38
- | `fimo publish` | — | Tag `main@HEAD` as `release/<version>` and trigger the prod swap. See "Publishing" below. |
38
+ | `fimo publish` | — | Publish the already-synced `main` revision with a stable Fimo publication ID. See "Publishing" below. |
39
39
 
40
40
  All of these accept the global `--branch` override; legacy `--env` remains an alias. `diff`, `status`, `merge`, and `publish` additionally accept `-C, --cwd <dir>` to point at a project directory.
41
41
 
@@ -59,7 +59,7 @@ fimo preview url # canonical URL to open / screenshot the feat/s
59
59
  fimo status # see what changed vs main, surface by surface
60
60
  fimo checkout main # back to main
61
61
  fimo merge feat/seo # merge the Branch back into main (resolve conflicts)
62
- fimo publish --version 1.4.0 # tag a release + prod swap
62
+ fimo publish --label "Homepage launch" --notes "Initial production publish"
63
63
  fimo branch -d feat/seo # tear down the feature Branch
64
64
  ```
65
65
 
@@ -97,10 +97,10 @@ Syncs the current Branch's data plane from its parent (or `--from <ancestor>`).
97
97
 
98
98
  Two different "go live" mechanisms — don't confuse them:
99
99
 
100
- - **`fimo publish --version <ver> [--notes <md>]`** — the release path. Runs from `main` only, validates, tags `main@HEAD` as `release/<ver>`, and triggers the prod swap. `--skip-validate` is an operator override. This is the versioned, prod-facing publish.
100
+ - **`fimo publish [--label <text>] [--notes <md>]`** — publishes the already-synced `main` revision. Fimo assigns the immutable publication ID; the label and notes are optional annotations. `--skip-validate` is an operator override.
101
101
  - **`fimo deploy --publish`** — the project-publish path. Pushes the current `main` code and flips the project live in one shot. See `references/deploy.md`.
102
102
 
103
- Use `fimo publish` for versioned prod releases; use `fimo deploy --publish` for the simple "ship what's on main now" flow. Both only run from `main`.
103
+ Use `fimo publish` when `main` is already synced; use `fimo deploy --publish` when the local revision still needs to be pushed first. Both only run from `main`.
104
104
 
105
105
  ## Anti-patterns
106
106
 
@@ -113,9 +113,9 @@ There's nothing special about this — it's the same `fimo deploy` you'd run lat
113
113
  Two different "go live" mechanisms — pick deliberately:
114
114
 
115
115
  - **`fimo deploy --publish`** — push what's on `main` now and flip the project live in one shot. The simple "ship it" path. Runs from `main` only.
116
- - **`fimo publish --version <ver> [--notes <md>]`** — the **versioned release** path. From `main`, it validates, tags `main@HEAD` as `release/<ver>`, and triggers the prod swap. Use this when the user wants a real, tagged production release (e.g. "cut v1.4.0", "publish a new version"). See `references/branches.md`.
116
+ - **`fimo publish [--label <text>] [--notes <md>]`** — publish the already-synced `main` revision without pushing. Fimo assigns the immutable publication ID; a label and notes are optional human annotations. See `references/branches.md`.
117
117
 
118
- When unsure, `fimo deploy --publish` is the lighter-weight default; reach for `fimo publish` only when versioning/release semantics are wanted.
118
+ When unsure, use `fimo deploy --publish` so the local revision is pushed before it goes live. Use `fimo publish` when `main` is already synced.
119
119
 
120
120
  ## Markdown for AI agents
121
121
 
@@ -56,6 +56,18 @@ When a user says "I want to change my website's URL," ask which case fits:
56
56
 
57
57
  If they aren't sure, run `fimo domains suggest-default` first — it's free, takes one step, and a good fallback if they don't want to commit to a domain purchase.
58
58
 
59
+ ## Offer a cleaner default URL after first publish
60
+
61
+ After the project's first successful `fimo deploy --publish`, offer a cleaner free `*.fimo.site` URL when there is no custom domain and the current default slug still looks generated or was never explicitly chosen. This is not part of the automatic first preview. Skip the offer if the user already chose the default slug, attached a custom domain, or declined.
62
+
63
+ The default URL is free and needs no DNS. A custom domain is the separate Premium workflow above. Renaming the default slug changes a public URL, so never silently claim a suggestion:
64
+
65
+ 1. Run `fimo domains suggest-default --base "<brand>" --json` to get candidates.
66
+ 2. Show the candidates and ask the user to choose one explicitly.
67
+ 3. After confirmation, run `fimo domains rename-default <slug>` or `fimo domains suggest-default --pick <slug>`.
68
+
69
+ The renamed URL resolves after a successful publish.
70
+
59
71
  ## Pricing & how money moves
60
72
 
61
73
  The CLI never charges directly. Two distinct money paths:
@@ -18,7 +18,7 @@ fimo projects rename <name> [projectId] [-C <dir>] # set seo.siteName in the l
18
18
  - **`create`** — identical to `fimo init` (create-new path); see `references/init.md`.
19
19
  - **`clone`** — clone a remote Fimo project's git repo to your machine and write the local `.fimo/project.json` and agent files. Use `fimo clone <projectId>` when scripting or when the ID is known. In an interactive terminal, bare `fimo clone` opens a project picker for the active org; JSON mode and non-TTY shells require an explicit project ID and fail fast instead of prompting. By default it clones `main`; pass `--branch <name>` to clone a specific Branch. The legacy `--env <name>` spelling remains a compatibility alias. The target directory defaults to the project display name/name, or pass `[dir]` explicitly.
20
20
  - **`delete`** — destructive; prompts unless `-y`. Removes the remote project.
21
- - **`publish` / `unpublish`** — toggle the project's public visibility. `publish` flips the current `main` state live (the same "go live" as `fimo deploy --publish`, minus the git push). This is **not** the versioned release path — for that, see `fimo publish` in `references/branches.md`.
21
+ - **`publish` / `unpublish`** — toggle the project's public visibility. `publish` flips the current `main` state live (the same "go live" as `fimo deploy --publish`, minus the git push).
22
22
  - **`rename`** — edits only the linked local project immediately. It requires a project marker in the cwd, and if you pass a `[projectId]` that doesn't match the linked project it errors and exits 1 (so you can't rename a different project). It writes `seo.siteName` into the current or legacy project config; commit and run `fimo deploy` to reconcile the remote `displayName` and deploy the new site name.
23
23
 
24
24
  ## Top-level clone shortcut
@@ -41,12 +41,12 @@ fimo rename "<Site Name>" # local edit: set seo.siteName in the project c
41
41
 
42
42
  `fimo rename` sets the **site name** (`seo.siteName`) in the local project config — it is a local edit, not an immediate remote update, so it requires a follow-up commit + `fimo deploy` to take effect. Deploy reconciles the project's remote `displayName` with the committed site name while pushing the config. See `references/init.md` and `references/deploy.md`.
43
43
 
44
- ## Three "publish" verbs — don't confuse them
44
+ ## Publish commands
45
45
 
46
- | Command | Effect |
47
- | ---------------------------- | -------------------------------------------------------------- |
48
- | `fimo deploy --publish` | Push current `main` + flip the project live in one shot. |
49
- | `fimo projects publish` | Flip the project live (no git push). |
50
- | `fimo publish --version <v>` | Tag `release/<v>` + trigger the prod swap (versioned release). |
46
+ | Command | Effect |
47
+ | ----------------------- | ----------------------------------------------------------------------- |
48
+ | `fimo deploy --publish` | Push current `main` + flip the project live in one shot. |
49
+ | `fimo projects publish` | Flip the project live (no git push). |
50
+ | `fimo publish` | Flip the already-synced `main` revision live; optional label and notes. |
51
51
 
52
52
  See `references/deploy.md` and `references/branches.md` for the full picture.
@@ -76,11 +76,20 @@ the selected pinned CLI. Give workers the project id, environment, exact CLI
76
76
  invocation, and verification command. Generated `.fimo` JSON without a
77
77
  successful platform read is not initialization.
78
78
 
79
- For an existing non-empty application, reuse the CLI's real flow: create or
80
- select the Fimo project with `fimo init`, then run
81
- `fimo link <project-id> -C <target> --env <env>` and verify the data plane.
82
- `fimo migrate init <url> <dir>` is only usable when the target directory is
83
- empty or already linked.
79
+ Pick the setup path from the evidence:
80
+
81
+ - **Source-backed, same framework** — copy or `git worktree` the source into the
82
+ target directory first, then run `fimo link -C <target> --env <env>`
83
+ (`fimo link <project-id> -C <target> --env <env>` when the owner supplied an
84
+ id). Link creates or selects the project, keeps the source's code, framework,
85
+ git history, and `origin`, initializes a repository when the copy has none,
86
+ and adds only the Fimo dependency, `.fimo/project.json`, the `fimo` remote,
87
+ and `.fimo/config.json#runtime.framework`. It never overlays a template, so
88
+ the target must already contain the source.
89
+ - **Empty target, or an explicit framework conversion** — `fimo init` with the
90
+ chosen `--framework`, or `fimo migrate init <url> <dir>` for a URL crawl.
91
+ Both refuse a non-empty target and write nothing when they refuse.
92
+
84
93
  If authentication, organization selection, project creation, environment
85
94
  resolution, linking, or the verification read fails, stop before workers and
86
95
  report the exact failed command and setup requirement.
@@ -134,8 +143,9 @@ report the exact failed command and setup requirement.
134
143
  Private APIs and CMSs require a user-provided export or a narrowly scoped
135
144
  server-side credential. Never read credentials from browser code or copy
136
145
  them into browser code, migration artifacts, or reports. Target-project
137
- authentication does not grant source access. Missing access stops only that
138
- data lane and becomes unresolved; never invent replacement content.
146
+ authentication does not grant source access. If the source API URL or access
147
+ is missing or unreachable, stop and ask the user for it; do not guess, replace
148
+ the content, or mark the lane complete.
139
149
  - Model content before page code. Generated JSON is not imported content.
140
150
  - Model editorial content Fimo-natively: blocks for structured or repeatable
141
151
  sections, richtext for rich bodies, references for categories, authors,
@@ -162,8 +172,9 @@ report the exact failed command and setup requirement.
162
172
  - Do not report completion until the QA gate passes or every failed check is
163
173
  present in the migration report.
164
174
  - Import through the data-plane commands and verify locally before deployment.
165
- Propose one preview deployment after a successful run, but deploy or publish
166
- only after an explicit user request.
175
+ Deployment is not QA evidence. After successful local QA, follow the
176
+ new-project or existing-project rule in Completion and deployment. Never
177
+ publish without an explicit user request.
167
178
 
168
179
  ## Orient and route
169
180
 
@@ -204,14 +215,16 @@ The target is its own Fimo project directory. The client source checkout is
204
215
  read-only evidence: never run setup inside it, never modify it, and never
205
216
  hand-write a `.fimo/project.json` marker to fake a link.
206
217
 
207
- `fimo migrate init` is the migration setup gate. For a source-backed migration
208
- it validates the target and CLI auth, then delegates project selection and
209
- creation to the standard `fimo init` flow (same options, no separate creation
210
- path), and returns a setup receipt covering auth, the target link, the
211
- migration directory, and readiness. It fails with a structured error when auth
212
- is missing, the target is missing or invalid, or the project or organization
213
- is inaccessible. Both forms need a real ID supplied by the owner — without
214
- one, stop with an unresolved owner action instead of inventing an ID:
218
+ `fimo migrate init` is the setup gate for an empty target; a target that
219
+ already holds the copied source is set up with `fimo link` instead (see
220
+ Initialized target precondition). `fimo migrate init` validates the target and
221
+ CLI auth, then delegates project selection and creation to the standard
222
+ `fimo init` flow (same options, no separate creation path), and returns a setup
223
+ receipt covering auth, the target link, the migration directory, and readiness.
224
+ It fails with a structured error when auth is missing, the target is missing or
225
+ invalid, or the project or organization is inaccessible. Both forms need a real
226
+ ID supplied by the owner — without one, stop with an unresolved owner action
227
+ instead of inventing an ID:
215
228
 
216
229
  - Link an owner-supplied (empty) project:
217
230
  `fimo migrate init <target-dir> --project-id <projectId> --framework <framework>`
@@ -225,8 +238,8 @@ React Router scaffold.
225
238
 
226
239
  Setup scaffolds the target and pushes its initial commit; that is the only
227
240
  remote write it performs — it never pushes schemas, uploads assets, or imports
228
- entries. `fimo deploy` and `fimo publish` stay separate and are never run
229
- automatically (see Completion and deployment).
241
+ entries. Setup itself never deploys or publishes; the one new-project preview
242
+ deploy happens only after successful local QA (see Completion and deployment).
230
243
 
231
244
  ## Command surface
232
245
 
@@ -253,12 +266,16 @@ Commands that perform actual data writes, all requiring the linked target:
253
266
  `fimo singles update`, `fimo labels set|set-many`, `fimo forms push`.
254
267
  - `fimo migrate init` (source-backed form): the project link/creation and
255
268
  initial commit push described above.
269
+ - `fimo link`: project creation or selection plus the in-place adoption of a
270
+ copied source target.
256
271
  - `fimo deploy` / `fimo publish` — owner-approved only.
257
272
 
258
273
  ## Migration loop
259
274
 
260
- 1. Run `fimo migrate init` and inspect the initialized target before any worker
261
- edits it. Choose the target framework through the same canonical option as
275
+ 1. Run the setup path from "Initialized target precondition" and inspect the
276
+ initialized target before any worker edits it. A `fimo link` adoption keeps
277
+ the source framework; the `fimo init` / `fimo migrate init` paths choose the
278
+ target framework through the same canonical option as
262
279
  `fimo init`: pass the detected source framework for a source-backed
263
280
  migration, the framework the user explicitly chose for a conversion, and —
264
281
  for a URL-only or rebuild migration — the framework the user selected (ask
@@ -276,15 +293,19 @@ Commands that perform actual data writes, all requiring the linked target:
276
293
  all structural target code, and must pass the framework gate in
277
294
  `references/workers/framework.md` before content data and code workers
278
295
  start. Worker prompts and worker reports are plain text.
279
- 3. The content planner reads every content-bearing source and consumer, writes
280
- and pushes complete schemas, and writes the content import payloads required
281
- by the Fimo CLI. It records source items, consumers, batches, and unresolved
282
- behavior in the text plan; it does not create a second orchestration format.
283
- 4. Once the content plan is ready, upload every planned asset and patch its
284
- target payload references. After the asset gate passes (and, in conversion
285
- mode, the framework gate), run data workers per schema/locale. Start content
286
- code workers only after their imported records read back successfully, so
287
- they can prove real values render through the native Fimo APIs.
296
+ 3. The content planner reads every content-bearing source and consumer. When
297
+ content comes from an API, it traces the active application client and
298
+ retrieves the complete accessible dataset before pushing schemas. It then
299
+ writes complete schemas and import payloads, recording source items,
300
+ consumers, batches, and unresolved behavior in the text plan rather than a
301
+ second orchestration format.
302
+ 4. Each discovery lane reports active media in its own surface. After the
303
+ runtime/framework, routes/SEO, and content discovery receipts are terminal,
304
+ the coordinator performs one fan-in: combine and deduplicate them into the
305
+ complete media-obligation list. Give only that list to the media worker; do
306
+ not require a content-planner rescan. Once it returns every mapping, patch
307
+ code and payload consumers. Start data after the asset gate and content code
308
+ only after its imported records read back successfully.
288
309
  5. Fan in the workers' plain-text reports. Compare their claimed files with
289
310
  `git diff`, their Fimo writes with read-back CLI queries, and their source
290
311
  coverage with the content plan. Every source item must be migrated,
@@ -94,12 +94,16 @@ If a media asset cannot be downloaded or uploaded:
94
94
  - include a suggested action such as re-exporting the asset folder or providing
95
95
  credentials
96
96
 
97
- ## Planner obligations
98
-
99
- The content planner enumerates every media obligation before fan-out: route and
100
- SEO media, every schema media field, and every image node nested in richtext or
101
- Tiptap JSON. Record its source location, consuming route/entry, and intended
102
- target field or node. Give each obligation a stable identity that includes its
103
- field or rich-text node path; a shared label or source URL is not unique. The
104
- asset worker cannot report complete until every obligation has an uploaded or
97
+ ## Media obligations
98
+
99
+ Each discovery lane reports active media in its own surface: runtime/framework
100
+ files, routes and SEO, or content and API data. After every discovery receipt is
101
+ terminal, the coordinator combines and deduplicates those findings into the
102
+ complete media-obligation list. This consolidated list is the media worker's
103
+ only input; do not make the content planner rescan the whole application.
104
+
105
+ Record each obligation's source location, consuming route/entry, and intended
106
+ target field or node. Give it a stable identity that includes its field or
107
+ rich-text node path; a shared label or source URL is not unique. The media
108
+ worker cannot report complete until every obligation has an uploaded or
105
109
  duplicate Fimo mapping, or an explicit unresolved/unsupported disposition.
@@ -44,9 +44,10 @@ items.
44
44
  - Every media item referenced by routes, CMS entries, SEO, or forms is uploaded to
45
45
  the Fimo media library (Fimo asset id/URL) or has an unresolved item. A local
46
46
  `public/` copy is not an upload mapping.
47
- - Every planner media obligation, including schema media fields and nested
48
- richtext/Tiptap image nodes, has a mapping or explicit disposition; the asset
49
- worker's completion claim alone is not evidence.
47
+ - Every obligation in the coordinator's consolidated media list, including
48
+ schema media fields and nested richtext/Tiptap image nodes, has a mapping or
49
+ explicit disposition; the media worker's completion claim alone is not
50
+ evidence. Reconcile the list against every discovery lane's media findings.
50
51
  - Every visible form has a Fimo replacement, a preserved third-party
51
52
  integration, or an unsupported note. A form became Fimo-native only when the
52
53
  Fimo form matches the source behavior 1:1.
@@ -5,9 +5,8 @@ handoff. Do not import entries or rewrite application consumers.
5
5
 
6
6
  1. Inspect every content-bearing source and consumer: Markdown/MDX bodies and
7
7
  frontmatter, JSX/TSX modules, hardcoded arrays and objects, imports, data
8
- clients, and call sites. Read local exports and public APIs directly. A
9
- private API requires a user-provided export or narrowly scoped server-side
10
- credential; never recover or copy secret values.
8
+ clients, and call sites. Identify whether each active source is a file,
9
+ inline value, API, CMS, or a mix before designing schemas.
11
10
  2. Classify each value as collection content, single content, an
12
11
  editor-visible label, or application-owned code. Repetition is evidence,
13
12
  not an automatic collection rule. Assistive text, identifiers, and values
@@ -54,11 +53,41 @@ A construct is unresolved only when it genuinely cannot be migrated. Include
54
53
  its exact source, user-visible impact, reason, and owner action; "custom" is not
55
54
  a reason.
56
55
 
56
+ ## API-backed content
57
+
58
+ Retrieve API content during this planning pass, before schemas are pushed or
59
+ data workers start:
60
+
61
+ 1. Trace the application's active client, base-URL environment key, endpoints,
62
+ queries, pagination, locales, publication states, relations, media, and
63
+ consuming call sites. Server rendering may hide requests from the browser,
64
+ so browser traffic is fallback evidence rather than the source of truth.
65
+ 2. Prove access with one read-only request. Read public APIs directly. Private
66
+ APIs require an owner-provided export or narrowly scoped server-side
67
+ credential; never recover, log, persist, or copy secret values. If the base
68
+ URL or required access is missing or unreachable, stop and ask the user for
69
+ it before planning schemas or payloads.
70
+ 3. Fetch every required page, locale, and referenced record. For a few bounded
71
+ endpoints, direct requests are enough. For repeated or paginated reads,
72
+ write a temporary source-specific read-only script under
73
+ `.fimo/migration/tmp/`, then spot-check counts and references.
74
+ 4. Preserve the retrieved responses as source evidence and payload inputs;
75
+ normalize transport details only. Do not create a provider registry or a
76
+ universal CMS model.
77
+ 5. Design Fimo schemas from both the retrieved values and the code that uses
78
+ them. Never invent replacement content when source access is unavailable.
79
+
80
+ Once retrieval and consumer tracing are complete, push schemas, prepare
81
+ payloads, and let the coordinator fan out assets and one data batch per
82
+ schema/locale. Runtime, routes, locales, and other independent workers continue
83
+ in parallel while retrieval runs.
84
+
57
85
  ## Optional extraction helpers
58
86
 
59
87
  Start with `rg` and targeted reads. A bounded read-only helper under
60
88
  `.fimo/migration/tmp/` may parse repeated frontmatter, JSON/YAML exports, or
61
- literal structures while preserving source locations. Spot-check its output.
89
+ literal structures, or retrieve repeated API pages while preserving source
90
+ identities. Spot-check its output.
62
91
  The agent still owns classification, schema design, and consumer tracing. Do
63
92
  not build a generic codemod system or let the helper write Fimo data or app
64
93
  code.
@@ -19,6 +19,16 @@ Verify:
19
19
  - build and representative browser interactions pass; and
20
20
  - every unsupported item names its impact and owner action.
21
21
 
22
+ `fimo deploy` readiness proves only that the server stays up and a
23
+ representative page responds. After an approved deploy, browser QA must:
24
+
25
+ - open one representative route per route family and exercise one key interaction;
26
+ - fail on route `5xx`, blank or reloading pages, or required module, API, or runtime failures;
27
+ - inspect browser evidence and `fimo logs --json` before editing; and
28
+ - run at most one focused repair and redeploy, then report remaining failures unresolved.
29
+
30
+ Optional development-tool failures do not fail a rendered, stable application.
31
+
22
32
  Return a plain-text report with status, duration, checks run, counts, failing
23
33
  source items, and suggested bounded repair surface. The coordinator may run one
24
34
  repair for that surface and rerun validation. It does not restart every worker
@@ -19,7 +19,7 @@ Plan a lane only when the source proves that surface exists:
19
19
  | routes | route modules, redirects, SEO and host behavior | immediately |
20
20
  | content planner | schemas, content payloads, and content handoff | immediately |
21
21
  | locales | locale setup and translated UI copy | immediately |
22
- | assets/forms | media uploads and form behavior | after content planner |
22
+ | assets/forms | media uploads and form behavior | after discovery fan-in |
23
23
  | content data | one schema/locale import | after assets |
24
24
  | content code | listed consuming files | after its data read-back |
25
25
  | validator | read-only final checks | after all writers |
@@ -35,15 +35,19 @@ read-back.
35
35
  - **runtime** preserves the detected framework, router, runtime, dependencies,
36
36
  provider setup, environment wiring, and provider-specific configuration. An
37
37
  unclear or unsupported setup produces a question, not a silent conversion.
38
+ It reports active media found in its surface.
38
39
  - **routes** preserves every route, redirect, 404, SEO/OG/social output,
39
40
  sitemap, robots, feeds, headers, and other observable host behavior. A file
40
- that consumes migrated content belongs to its later content-code worker.
41
+ that consumes migrated content belongs to its later content-code worker. It
42
+ reports active route and SEO media.
41
43
  - **content planner** discovers and models all editable content, labels,
42
- consumers, schemas, payloads, media obligations, and execution batches. It
43
- never imports entries or rewrites consumers. Read
44
+ consumers, schemas, payloads, media in its content/API surface, and execution
45
+ batches. It first retrieves any API-backed source through the application's
46
+ real client contract; it never imports entries or rewrites consumers. Read
44
47
  `references/workers/content-planner.md`.
45
- - **assets/forms** uploads every planner media obligation and patches payload
46
- references. It replaces a form or integration only when Fimo preserves its
48
+ - **assets/forms** receives only the coordinator's consolidated, deduplicated
49
+ media-obligation list, uploads it, and returns mappings for code and payload
50
+ consumers. It replaces a form or integration only when Fimo preserves its
47
51
  behavior end to end; otherwise it preserves or reports it.
48
52
  - **content data and code** execute the planner handoff without rediscovering
49
53
  or redesigning it. Read `references/workers/content-execution.md`.
@@ -62,12 +66,17 @@ other after it. Do not add a metadata format for a small overlap.
62
66
  write.
63
67
  2. Start runtime/routes/content-planner/locales together, or the framework
64
68
  worker plus content planner/locales in conversion mode.
65
- 3. After the content plan, upload every planned asset and patch payloads.
66
- 4. Start data workers only after the asset gate and, in conversion mode, the
69
+ 3. Wait for every discovery receipt to become terminal, then perform one fan-in
70
+ of runtime/framework, routes/SEO, and content media findings. Combine and
71
+ deduplicate them into the complete media-obligation list; do not run another
72
+ discovery pass.
73
+ 4. Give only that consolidated list to assets/forms. Wait for its mappings
74
+ before code or payload consumers replace source references.
75
+ 5. Start data workers only after the asset gate and, in conversion mode, the
67
76
  framework gate.
68
- 5. Start each code worker only after its own imported records read back as
77
+ 6. Start each code worker only after its own imported records read back as
69
78
  non-empty. A build over empty data proves nothing.
70
- 6. Start the independent validator only after every writer has returned.
79
+ 7. Start the independent validator only after every writer has returned.
71
80
 
72
81
  Each prompt names the worker's source paths, exact target ownership, applicable
73
82
  reference above, and dependencies. Each report states status, duration, source
@@ -45,8 +45,16 @@ Classify the available evidence:
45
45
 
46
46
  For private APIs or CMSs, ask for a user-provided export or a narrowly scoped
47
47
  server-side credential. Never recover credentials from browser bundles or copy
48
- them into migration artifacts. Missing access blocks only that lane and becomes
49
- an unresolved item; never invent replacement content.
48
+ them into migration artifacts. If the source API URL or access is missing or
49
+ unreachable, stop and ask the user for it; do not guess or continue with
50
+ replacement content.
51
+
52
+ For API-backed content, trace the active client and call sites in source code,
53
+ prove one read, then retrieve all required pages, locales, relations, and media
54
+ during content planning. Use direct requests for bounded endpoints or a
55
+ temporary read-only script for repeated and paginated reads. Do not wait for
56
+ schema or code workers, and do not rely on browser traffic when SSR or build
57
+ time fetches may hide the requests.
50
58
 
51
59
  For URL-only migrations, run `fimo migrate <url> [dir]` and inspect the
52
60
  generated `.fimo/migrations/current/` files as source evidence. Do not copy
@@ -58,16 +66,18 @@ The coordinator launches only the workers supported by the source:
58
66
 
59
67
  - **runtime**: preserve the detected framework, router, runtime, dependencies,
60
68
  provider configuration, and environment wiring. A framework conversion needs
61
- an explicit user choice.
69
+ an explicit user choice. Report active media found in this surface.
62
70
  - **routes/SEO**: preserve one target route per source route, redirects, 404,
63
71
  metadata, OG/social output, sitemap, robots, and other observable behavior.
72
+ Report active media found in this surface.
64
73
  - **content planner**: discover content, labels, data sources, consumers, and
65
74
  schemas; push schemas and prepare content payloads. It does not rewrite page
66
- code or import every entry itself.
75
+ code or import every entry itself. Report active media found in content and
76
+ API data; do not rescan unrelated runtime or route surfaces.
67
77
  - **locales**: configure locales and migrate translated UI-visible copy when
68
78
  the source has it.
69
- - **assets/forms**: after content planning, upload every referenced media item
70
- and preserve, replace, or report forms and integrations.
79
+ - **assets/forms**: after the discovery fan-in, upload the consolidated media
80
+ obligations and preserve, replace, or report forms and integrations.
71
81
 
72
82
  When the user explicitly chose a framework conversion, one framework
73
83
  conversion worker replaces the runtime and routes lanes and owns all
@@ -82,17 +92,22 @@ Workers may write the application inside their ownership. They do not need a
82
92
  JSON plan or receipt. If two workers need the same file, name one owner and run
83
93
  the other after it.
84
94
 
85
- ## Phase 3: Content planning
95
+ ## Phase 3: Discovery fan-in and content planning
86
96
 
87
97
  The planner follows `references/workers/content-planner.md`, plus
88
98
  `references/content.md`, `references/decision.md`, and
89
99
  `references/import-contract.md`. Its text plan and payloads must be complete
90
- before Phase 4; data workers must not rediscover unrelated source files.
100
+ before Phase 4; this includes retrieving API-backed source data and tracing its
101
+ consumers. Data workers must not rediscover unrelated source files.
102
+
103
+ After the runtime/framework, routes/SEO, and content discovery receipts are all
104
+ terminal, the coordinator combines and deduplicates their media findings into
105
+ the complete media-obligation list. This is the media worker's only input.
91
106
 
92
107
  ## Phase 4: Media, forms, and integrations
93
108
 
94
- 1. Account for every planner media obligation, including schema media fields
95
- and richtext/Tiptap image nodes, plus route, SEO, and form media.
109
+ 1. Account for every consolidated media obligation, including schema media
110
+ fields and richtext/Tiptap image nodes, plus route, SEO, and form media.
96
111
  2. Upload media through Fimo and replace references only after the upload is
97
112
  confirmed. A local `public/` copy or source URL is not an imported asset.
98
113
  3. Preserve third-party integrations unless Fimo reproduces their exact
@@ -139,4 +154,7 @@ Use `complete` only when required checks pass, `complete-with-unresolved` when
139
154
  the app works and every gap is explicit, and `draft-only` when import or
140
155
  verification is incomplete.
141
156
 
142
- All checks are local. Do not deploy or publish to verify a migration.
157
+ All checks are local. Deployment is not QA evidence. After successful local QA,
158
+ run one plain `fimo deploy` for a newly created project unless the user opted out
159
+ or `FIMO_MIGRATION_NO_DEPLOY=1`; for an existing linked project, offer deploy and
160
+ wait for approval. Never publish automatically.