diff --git a/.claude/skills/changelog/SKILL.md b/.claude/skills/changelog/SKILL.md index e0ec04ae1..db9682cfe 100644 --- a/.claude/skills/changelog/SKILL.md +++ b/.claude/skills/changelog/SKILL.md @@ -1,6 +1,6 @@ --- name: changelog -description: Generate and update the product changelog in Mintlify docs. Use when the user asks to update the changelog, add a changelog entry, document recent changes, or write release notes. Reads git history on main, filters to user-facing changes, and writes dated MDX files to docs/changelog/. +description: Generate and update the product changelog in Mintlify docs. Use when the user asks to update the changelog, add a changelog entry, document recent changes, or write release notes. Reads git history on main, filters to user-facing changes, and writes dated MDX files to docs/public/changelog/. --- # Changelog @@ -43,13 +43,13 @@ If there are no user-facing changes in the entire range, tell the user and stop. ### 4. Write changelog entries -Create one file per date at `docs/changelog/YYYY-MM-DD.mdx`, using the commit date (not today's date). If a file already exists for a date, regenerate it with the full set of commits for that day (not just new ones). Follow the references linked above for format, writing style, and hero vs. accordion decisions. +Create one file per date at `docs/public/changelog/YYYY-MM-DD.mdx`, using the commit date (not today's date). If a file already exists for a date, regenerate it with the full set of commits for that day (not just new ones). Follow the references linked above for format, writing style, and hero vs. accordion decisions. - **Batch related commits** into a single feature section (e.g., multiple hook-related commits become one "Lifecycle hooks" section) -### 5. Update docs/docs.json +### 5. Update docs/public/docs.json -Add all new pages to the Changelog tab's pages array in `docs/docs.json`. List entries most recent first. The page path is `changelog/YYYY-MM-DD` (no `.mdx` extension). +Add all new pages to the Changelog tab's pages array in `docs/public/docs.json`. List entries most recent first. The page path is `changelog/YYYY-MM-DD` (no `.mdx` extension). ### 6. Write watermark @@ -57,4 +57,4 @@ Write the output of `git rev-parse HEAD` to `.claude/skills/changelog/watermark` ### 7. Clean up legacy single-file changelog -If `docs/changelog.mdx` still exists as the old single-file changelog, delete it and remove its reference from `docs/docs.json`. +If `docs/public/changelog.mdx` still exists as the old single-file changelog, delete it and remove its reference from `docs/public/docs.json`. diff --git a/.claude/skills/changelog/references/format.md b/.claude/skills/changelog/references/format.md index deb4012a8..394529404 100644 --- a/.claude/skills/changelog/references/format.md +++ b/.claude/skills/changelog/references/format.md @@ -1,6 +1,6 @@ # Mintlify Changelog MDX Format -Each changelog entry is a separate `.mdx` file in `docs/changelog/`. +Each changelog entry is a separate `.mdx` file in `docs/public/changelog/`. ## Template diff --git a/.claude/skills/docs/SKILL.md b/.claude/skills/docs/SKILL.md index 7c5426345..cd86f4144 100644 --- a/.claude/skills/docs/SKILL.md +++ b/.claude/skills/docs/SKILL.md @@ -1,6 +1,6 @@ --- name: update-docs -description: Update documentation in docs/ based on recent code changes. Reads git history since a watermark commit, maps changed files to doc pages, and makes surgical edits to keep docs in sync with code. +description: Update documentation in docs/public/ based on recent code changes. Reads git history since a watermark commit, maps changed files to doc pages, and makes surgical edits to keep docs in sync with code. --- # Update Docs @@ -8,7 +8,7 @@ description: Update documentation in docs/ based on recent code changes. Reads g Detect code changes since the last run and update affected documentation pages. - [references/mapping.md](references/mapping.md) — code-to-doc page mapping -- Follow `docs/CONTRIBUTING.md` and `docs/AGENTS.md` for writing style +- Follow the existing pages under `docs/public/` for writing style ## Workflow @@ -50,7 +50,7 @@ Surgical edits only — change only affected sections. Preserve existing voice, - Insert rows into reference tables in logical position - Add new sections for entirely new capabilities - Update existing descriptions when behavior changes -- Never edit `docs/api-reference/fabro-api.yaml` — that is the API workflow's source of truth +- Never edit `docs/public/api-reference/fabro-api.yaml` — that is the API workflow's source of truth ### 6. Validate DOT examples diff --git a/.claude/skills/docs/references/mapping.md b/.claude/skills/docs/references/mapping.md index 5d15a1cc8..93b867938 100644 --- a/.claude/skills/docs/references/mapping.md +++ b/.claude/skills/docs/references/mapping.md @@ -4,33 +4,33 @@ Which source files affect which doc pages. Use this as guidance — also apply j | Source | Docs | |--------|------| -| `lib/crates/fabro-cli/src/main.rs`, `lib/crates/fabro-workflow/src/cli/mod.rs`, `lib/crates/fabro-workflow/src/cli/run.rs` | `docs/reference/cli.mdx` | -| `lib/crates/fabro-cli/src/cli_config.rs` | `docs/reference/cli-configuration.mdx` | -| `lib/crates/fabro-llm/src/cli.rs` | `docs/reference/cli.mdx` | -| `lib/crates/fabro-api/src/serve.rs` | `docs/reference/cli.mdx` | -| `lib/crates/fabro-workflow/src/parser/*.rs` | `docs/reference/dot-language.mdx` | -| `lib/crates/fabro-workflow/src/condition.rs` | `docs/reference/dot-language.mdx` | -| `lib/crates/fabro-workflow/src/cli/validate.rs` | `docs/reference/dot-language.mdx` | -| `lib/crates/fabro-workflow/src/stylesheet.rs` | `docs/workflows/stylesheets.mdx` | -| `lib/crates/fabro-workflow/src/transform.rs` | `docs/workflows/variables.mdx` | -| `lib/crates/fabro-workflow/src/handler/*.rs` | `docs/workflows/stages-and-nodes.mdx`, `docs/reference/dot-language.mdx` | -| `lib/crates/fabro-workflow/src/handler/human.rs` | `docs/workflows/human-in-the-loop.mdx` | -| `lib/crates/fabro-workflow/src/cli/run_config.rs` | `docs/execution/run-configuration.mdx` | -| `lib/crates/fabro-workflow/src/engine.rs` | `docs/core-concepts/how-arc-works.mdx` | -| `lib/crates/fabro-workflow/src/context/*.rs` | `docs/execution/context.mdx` | -| `lib/crates/fabro-workflow/src/checkpoint.rs` | `docs/execution/checkpoints.mdx` | -| `lib/crates/fabro-workflow/src/retro.rs`, `lib/crates/fabro-workflow/src/retro_agent.rs` | `docs/execution/retros.mdx` | -| `lib/crates/fabro-workflow/src/interviewer/*.rs` | `docs/execution/interviews.mdx` | -| `lib/crates/fabro-workflow/src/hook/*.rs` | `docs/agents/hooks.mdx` | -| `lib/crates/fabro-workflow/src/daytona_sandbox.rs` | `docs/integrations/daytona.mdx`, `docs/execution/environments.mdx` | -| `lib/crates/fabro-agent/src/tools.rs`, `lib/crates/fabro-agent/src/tool_registry.rs`, `lib/crates/fabro-agent/src/tool_execution.rs` | `docs/agents/tools.mdx` | -| `lib/crates/fabro-agent/src/v4a_patch.rs` | `docs/agents/tools.mdx` | -| `lib/crates/fabro-agent/src/cli.rs` | `docs/agents/permissions.mdx` | -| `lib/crates/fabro-agent/src/subagent.rs` | `docs/agents/subagents.mdx` | -| `lib/crates/fabro-agent/src/mcp_integration.rs` | `docs/agents/mcp.mdx` | -| `lib/crates/fabro-llm/src/catalog.rs`, `lib/crates/fabro-llm/src/providers/*.rs` | `docs/core-concepts/models.mdx` | -| `lib/crates/fabro-devcontainer/src/*.rs` | `docs/execution/devcontainers.mdx` | -| `lib/crates/fabro-slack/src/*.rs` | `docs/integrations/slack.mdx` | -| `lib/crates/fabro-mcp/src/*.rs` | `docs/agents/mcp.mdx` | -| `lib/crates/fabro-api/src/*.rs` | `docs/api-reference/overview.mdx`, `docs/api-reference/demo-mode.mdx` | -| `lib/crates/fabro-api/src/server_config.rs` | `docs/administration/server-configuration.mdx` | +| `lib/crates/fabro-cli/src/main.rs`, `lib/crates/fabro-workflow/src/cli/mod.rs`, `lib/crates/fabro-workflow/src/cli/run.rs` | `docs/public/reference/cli.mdx` | +| `lib/crates/fabro-cli/src/cli_config.rs` | `docs/public/reference/cli-configuration.mdx` | +| `lib/crates/fabro-llm/src/cli.rs` | `docs/public/reference/cli.mdx` | +| `lib/crates/fabro-api/src/serve.rs` | `docs/public/reference/cli.mdx` | +| `lib/crates/fabro-workflow/src/parser/*.rs` | `docs/public/reference/dot-language.mdx` | +| `lib/crates/fabro-workflow/src/condition.rs` | `docs/public/reference/dot-language.mdx` | +| `lib/crates/fabro-workflow/src/cli/validate.rs` | `docs/public/reference/dot-language.mdx` | +| `lib/crates/fabro-workflow/src/stylesheet.rs` | `docs/public/workflows/stylesheets.mdx` | +| `lib/crates/fabro-workflow/src/transform.rs` | `docs/public/workflows/variables.mdx` | +| `lib/crates/fabro-workflow/src/handler/*.rs` | `docs/public/workflows/stages-and-nodes.mdx`, `docs/public/reference/dot-language.mdx` | +| `lib/crates/fabro-workflow/src/handler/human.rs` | `docs/public/workflows/human-in-the-loop.mdx` | +| `lib/crates/fabro-workflow/src/cli/run_config.rs` | `docs/public/execution/run-configuration.mdx` | +| `lib/crates/fabro-workflow/src/engine.rs` | `docs/public/core-concepts/how-arc-works.mdx` | +| `lib/crates/fabro-workflow/src/context/*.rs` | `docs/public/execution/context.mdx` | +| `lib/crates/fabro-workflow/src/checkpoint.rs` | `docs/public/execution/checkpoints.mdx` | +| `lib/crates/fabro-workflow/src/retro.rs`, `lib/crates/fabro-workflow/src/retro_agent.rs` | `docs/public/execution/retros.mdx` | +| `lib/crates/fabro-workflow/src/interviewer/*.rs` | `docs/public/execution/interviews.mdx` | +| `lib/crates/fabro-workflow/src/hook/*.rs` | `docs/public/agents/hooks.mdx` | +| `lib/crates/fabro-workflow/src/daytona_sandbox.rs` | `docs/public/integrations/daytona.mdx`, `docs/public/execution/environments.mdx` | +| `lib/crates/fabro-agent/src/tools.rs`, `lib/crates/fabro-agent/src/tool_registry.rs`, `lib/crates/fabro-agent/src/tool_execution.rs` | `docs/public/agents/tools.mdx` | +| `lib/crates/fabro-agent/src/v4a_patch.rs` | `docs/public/agents/tools.mdx` | +| `lib/crates/fabro-agent/src/cli.rs` | `docs/public/agents/permissions.mdx` | +| `lib/crates/fabro-agent/src/subagent.rs` | `docs/public/agents/subagents.mdx` | +| `lib/crates/fabro-agent/src/mcp_integration.rs` | `docs/public/agents/mcp.mdx` | +| `lib/crates/fabro-llm/src/catalog.rs`, `lib/crates/fabro-llm/src/providers/*.rs` | `docs/public/core-concepts/models.mdx` | +| `lib/crates/fabro-devcontainer/src/*.rs` | `docs/public/execution/devcontainers.mdx` | +| `lib/crates/fabro-slack/src/*.rs` | `docs/public/integrations/slack.mdx` | +| `lib/crates/fabro-mcp/src/*.rs` | `docs/public/agents/mcp.mdx` | +| `lib/crates/fabro-api/src/*.rs` | `docs/public/api-reference/overview.mdx`, `docs/public/api-reference/demo-mode.mdx` | +| `lib/crates/fabro-api/src/server_config.rs` | `docs/public/administration/server-configuration.mdx` | diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 83d5739e6..80cca83b3 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -11,8 +11,8 @@ on: - ".cargo/**" - ".config/**" - "bin/dev/**" - - "docs/reference/cli.mdx" - - "docs/reference/user-configuration.mdx" + - "docs/public/reference/cli.mdx" + - "docs/public/reference/user-configuration.mdx" - "openapi/**" - ".github/workflows/rust.yml" pull_request: @@ -25,8 +25,8 @@ on: - ".cargo/**" - ".config/**" - "bin/dev/**" - - "docs/reference/cli.mdx" - - "docs/reference/user-configuration.mdx" + - "docs/public/reference/cli.mdx" + - "docs/public/reference/user-configuration.mdx" - "openapi/**" - ".github/workflows/rust.yml" workflow_dispatch: diff --git a/AGENTS.md b/AGENTS.md index 1c0a24325..886a4002c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -46,16 +46,16 @@ macOS note: if `cargo nextest run` fails with `Too many open files (os error 24) 2. `cd apps/fabro-web && bun run dev` — rebuilds web assets on change; refresh the browser manually 3. Mintlify docs dev server (requires Docker — `mintlify dev` needs Node LTS which may not match the host): ``` - docker run --rm -d -p 3333:3333 -v $(pwd)/docs:/docs -w /docs --name mintlify-dev node:22-slim \ + docker run --rm -d -p 3333:3333 -v $(pwd)/docs/public:/docs -w /docs --name mintlify-dev node:22-slim \ bash -c "npx mintlify dev --host 0.0.0.0 --port 3333" ``` Then open http://localhost:3333. Stop with `docker stop mintlify-dev`. ## API workflow -The OpenAPI spec at `docs/api-reference/fabro-api.yaml` is the source of truth for the fabro-api HTTP interface. +The OpenAPI spec at `docs/public/api-reference/fabro-api.yaml` is the source of truth for the fabro-api HTTP interface. -1. Edit `docs/api-reference/fabro-api.yaml` +1. Edit `docs/public/api-reference/fabro-api.yaml` 2. `cargo build -p fabro-api` — build.rs regenerates Rust types and client via progenitor 3. Write/update handler in `lib/crates/fabro-server/src/server.rs`, add route to `build_router()` 4. `cargo nextest run -p fabro-server` — conformance test catches spec/router drift @@ -106,10 +106,10 @@ Fabro is an AI-powered workflow orchestration platform. Workflows are defined as When working on Rust crates, read the relevant strategy doc **before** making changes: -- **`docs-internal/logging-strategy.md`** — read when adding `tracing` calls (`info!`, `debug!`, `warn!`, `error!`), working on error handling paths, or adding new operations that should be observable -- **`docs-internal/events-strategy.md`** — read when adding or modifying `Event` variants, touching `Emitter`/`emit()`, changing `progress.jsonl` output, or adding new workflow stage types -- **`docs-internal/testing-strategy.md`** — read when adding or reorganizing tests, choosing between unit vs `tests/it`, deciding whether a test belongs in `cmd` vs `workflow` vs `scenario`, or deciding how to structure snapshots and fixtures -- **`docs-internal/server-secrets-strategy.md`** — read when adding or changing server-level secrets, startup validation, install-time secret persistence, or subprocess env inheritance/scrubbing +- **`docs/internal/logging-strategy.md`** — read when adding `tracing` calls (`info!`, `debug!`, `warn!`, `error!`), working on error handling paths, or adding new operations that should be observable +- **`docs/internal/events-strategy.md`** — read when adding or modifying `Event` variants, touching `Emitter`/`emit()`, changing `progress.jsonl` output, or adding new workflow stage types +- **`docs/internal/testing-strategy.md`** — read when adding or reorganizing tests, choosing between unit vs `tests/it`, deciding whether a test belongs in `cmd` vs `workflow` vs `scenario`, or deciding how to structure snapshots and fixtures +- **`docs/internal/server-secrets-strategy.md`** — read when adding or changing server-level secrets, startup validation, install-time secret persistence, or subprocess env inheritance/scrubbing ## Shell quoting in sandbox code diff --git a/README.md b/README.md index 77163de2f..d2d663b6e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@
-Fabro +Fabro
## The open source dark software factory for expert engineers @@ -27,7 +27,7 @@ curl -fsSL https://fabro.sh/install.sh | bash Then run `fabro server start` to finish setup in your browser. The server opens a web wizard, exits when the wizard completes, and starts in configured mode the next time you run it. -Fabro Runs board showing workflows across Working, Pending, Verify, and Merge stages +Fabro Runs board showing workflows across Working, Pending, Verify, and Merge stages --- @@ -67,7 +67,7 @@ Then run `fabro server start` to finish setup in your browser. The server opens A plan-approve-implement workflow where a human reviews the plan before the agent writes code: -Plan-Implement workflow graph showing Start → Plan → Approve Plan → Implement → Simplify → Exit with a Revise loop +Plan-Implement workflow graph showing Start → Plan → Approve Plan → Implement → Simplify → Exit with a Revise loop ```dot digraph PlanImplement { diff --git a/clippy.toml b/clippy.toml index 406f78c74..9a1759ec3 100644 --- a/clippy.toml +++ b/clippy.toml @@ -20,8 +20,8 @@ disallowed-methods = [ { path = "std::fs::File::create", reason = "Blocking open; prefer tokio::fs::File::create on Tokio paths. Document intentional sync I/O with #[expect(clippy::disallowed_methods, reason = \"...\")]" }, { path = "std::fs::File::create_new", reason = "Blocking open; prefer tokio::fs::File::create_new on Tokio paths. Document intentional sync I/O with #[expect(clippy::disallowed_methods, reason = \"...\")]" }, { path = "std::fs::OpenOptions::open", reason = "Blocking open; prefer tokio::fs::OpenOptions::open on Tokio paths. OS file-lock semantics may require spawn_blocking instead. Document intentional sync I/O with #[expect(clippy::disallowed_methods, reason = \"...\")]" }, - { path = "std::env::set_var", reason = "Server/process env must be injected at construction or child-process spawn time, not mutated globally. See docs-internal/server-secrets-strategy.md" }, - { path = "std::env::remove_var", reason = "Server/process env must be injected at construction or child-process spawn time, not mutated globally. See docs-internal/server-secrets-strategy.md" }, + { path = "std::env::set_var", reason = "Server/process env must be injected at construction or child-process spawn time, not mutated globally. See docs/internal/server-secrets-strategy.md" }, + { path = "std::env::remove_var", reason = "Server/process env must be injected at construction or child-process spawn time, not mutated globally. See docs/internal/server-secrets-strategy.md" }, { path = "std::env::var", reason = "Use fabro_static::EnvVars for fixed environment variable names; document intentional process-env lookup facades with #[expect(clippy::disallowed_methods, reason = \"...\")]", allow-invalid = true }, { path = "std::env::var_os", reason = "Use fabro_static::EnvVars for fixed environment variable names; document intentional process-env lookup facades with #[expect(clippy::disallowed_methods, reason = \"...\")]", allow-invalid = true }, { path = "std::env::vars", reason = "Snapshotting the ambient process env must be limited to documented subprocess/test/bootstrap facades.", allow-invalid = true }, diff --git a/docs-internal/assets/brand/github-header-v2-mesh.png b/docs/internal/assets/brand/github-header-v2-mesh.png similarity index 100% rename from docs-internal/assets/brand/github-header-v2-mesh.png rename to docs/internal/assets/brand/github-header-v2-mesh.png diff --git a/docs-internal/assets/brand/github-header-v2-mesh.svg b/docs/internal/assets/brand/github-header-v2-mesh.svg similarity index 100% rename from docs-internal/assets/brand/github-header-v2-mesh.svg rename to docs/internal/assets/brand/github-header-v2-mesh.svg diff --git a/docs-internal/assets/brand/logo/logotype-black.svg b/docs/internal/assets/brand/logo/logotype-black.svg similarity index 100% rename from docs-internal/assets/brand/logo/logotype-black.svg rename to docs/internal/assets/brand/logo/logotype-black.svg diff --git a/docs-internal/assets/brand/logo/logotype.svg b/docs/internal/assets/brand/logo/logotype.svg similarity index 100% rename from docs-internal/assets/brand/logo/logotype.svg rename to docs/internal/assets/brand/logo/logotype.svg diff --git a/docs-internal/assets/brand/logo/symbol-black.svg b/docs/internal/assets/brand/logo/symbol-black.svg similarity index 100% rename from docs-internal/assets/brand/logo/symbol-black.svg rename to docs/internal/assets/brand/logo/symbol-black.svg diff --git a/docs-internal/assets/brand/logo/symbol.svg b/docs/internal/assets/brand/logo/symbol.svg similarity index 100% rename from docs-internal/assets/brand/logo/symbol.svg rename to docs/internal/assets/brand/logo/symbol.svg diff --git a/docs-internal/assets/brand/palette-lockups.svg b/docs/internal/assets/brand/palette-lockups.svg similarity index 100% rename from docs-internal/assets/brand/palette-lockups.svg rename to docs/internal/assets/brand/palette-lockups.svg diff --git a/docs-internal/assets/brand/palette-mockup-icons.svg b/docs/internal/assets/brand/palette-mockup-icons.svg similarity index 100% rename from docs-internal/assets/brand/palette-mockup-icons.svg rename to docs/internal/assets/brand/palette-mockup-icons.svg diff --git a/docs-internal/assets/brand/palette-mockup.svg b/docs/internal/assets/brand/palette-mockup.svg similarity index 100% rename from docs-internal/assets/brand/palette-mockup.svg rename to docs/internal/assets/brand/palette-mockup.svg diff --git a/docs-internal/assets/brand/palette.png b/docs/internal/assets/brand/palette.png similarity index 100% rename from docs-internal/assets/brand/palette.png rename to docs/internal/assets/brand/palette.png diff --git a/docs-internal/assets/brand/palette.svg b/docs/internal/assets/brand/palette.svg similarity index 100% rename from docs-internal/assets/brand/palette.svg rename to docs/internal/assets/brand/palette.svg diff --git a/docs-internal/assets/brand/social-card.html b/docs/internal/assets/brand/social-card.html similarity index 100% rename from docs-internal/assets/brand/social-card.html rename to docs/internal/assets/brand/social-card.html diff --git a/docs-internal/assets/brand/social-card.png b/docs/internal/assets/brand/social-card.png similarity index 100% rename from docs-internal/assets/brand/social-card.png rename to docs/internal/assets/brand/social-card.png diff --git a/docs-internal/assets/brand/twitter-card-v0.176.1.html b/docs/internal/assets/brand/twitter-card-v0.176.1.html similarity index 100% rename from docs-internal/assets/brand/twitter-card-v0.176.1.html rename to docs/internal/assets/brand/twitter-card-v0.176.1.html diff --git a/docs-internal/assets/brand/twitter-card-v0.176.1.png b/docs/internal/assets/brand/twitter-card-v0.176.1.png similarity index 100% rename from docs-internal/assets/brand/twitter-card-v0.176.1.png rename to docs/internal/assets/brand/twitter-card-v0.176.1.png diff --git a/docs-internal/cli-workflow-coupling-audit.md b/docs/internal/cli-workflow-coupling-audit.md similarity index 100% rename from docs-internal/cli-workflow-coupling-audit.md rename to docs/internal/cli-workflow-coupling-audit.md diff --git a/docs-internal/demo/01-hello.fabro b/docs/internal/demo/01-hello.fabro similarity index 100% rename from docs-internal/demo/01-hello.fabro rename to docs/internal/demo/01-hello.fabro diff --git a/docs-internal/demo/01-hello.png b/docs/internal/demo/01-hello.png similarity index 100% rename from docs-internal/demo/01-hello.png rename to docs/internal/demo/01-hello.png diff --git a/docs-internal/demo/01-hello.svg b/docs/internal/demo/01-hello.svg similarity index 100% rename from docs-internal/demo/01-hello.svg rename to docs/internal/demo/01-hello.svg diff --git a/docs-internal/demo/02-tool-use.fabro b/docs/internal/demo/02-tool-use.fabro similarity index 100% rename from docs-internal/demo/02-tool-use.fabro rename to docs/internal/demo/02-tool-use.fabro diff --git a/docs-internal/demo/02-tool-use.png b/docs/internal/demo/02-tool-use.png similarity index 100% rename from docs-internal/demo/02-tool-use.png rename to docs/internal/demo/02-tool-use.png diff --git a/docs-internal/demo/02-tool-use.svg b/docs/internal/demo/02-tool-use.svg similarity index 100% rename from docs-internal/demo/02-tool-use.svg rename to docs/internal/demo/02-tool-use.svg diff --git a/docs-internal/demo/03-subagent.fabro b/docs/internal/demo/03-subagent.fabro similarity index 100% rename from docs-internal/demo/03-subagent.fabro rename to docs/internal/demo/03-subagent.fabro diff --git a/docs-internal/demo/03-subagent.png b/docs/internal/demo/03-subagent.png similarity index 100% rename from docs-internal/demo/03-subagent.png rename to docs/internal/demo/03-subagent.png diff --git a/docs-internal/demo/03-subagent.svg b/docs/internal/demo/03-subagent.svg similarity index 100% rename from docs-internal/demo/03-subagent.svg rename to docs/internal/demo/03-subagent.svg diff --git a/docs-internal/demo/04-pipeline.fabro b/docs/internal/demo/04-pipeline.fabro similarity index 100% rename from docs-internal/demo/04-pipeline.fabro rename to docs/internal/demo/04-pipeline.fabro diff --git a/docs-internal/demo/04-pipeline.png b/docs/internal/demo/04-pipeline.png similarity index 100% rename from docs-internal/demo/04-pipeline.png rename to docs/internal/demo/04-pipeline.png diff --git a/docs-internal/demo/04-pipeline.svg b/docs/internal/demo/04-pipeline.svg similarity index 100% rename from docs-internal/demo/04-pipeline.svg rename to docs/internal/demo/04-pipeline.svg diff --git a/docs-internal/demo/05-branch-loop.fabro b/docs/internal/demo/05-branch-loop.fabro similarity index 100% rename from docs-internal/demo/05-branch-loop.fabro rename to docs/internal/demo/05-branch-loop.fabro diff --git a/docs-internal/demo/05-branch-loop.png b/docs/internal/demo/05-branch-loop.png similarity index 100% rename from docs-internal/demo/05-branch-loop.png rename to docs/internal/demo/05-branch-loop.png diff --git a/docs-internal/demo/05-branch-loop.svg b/docs/internal/demo/05-branch-loop.svg similarity index 100% rename from docs-internal/demo/05-branch-loop.svg rename to docs/internal/demo/05-branch-loop.svg diff --git a/docs-internal/demo/06-parallel.fabro b/docs/internal/demo/06-parallel.fabro similarity index 100% rename from docs-internal/demo/06-parallel.fabro rename to docs/internal/demo/06-parallel.fabro diff --git a/docs-internal/demo/06-parallel.png b/docs/internal/demo/06-parallel.png similarity index 100% rename from docs-internal/demo/06-parallel.png rename to docs/internal/demo/06-parallel.png diff --git a/docs-internal/demo/06-parallel.svg b/docs/internal/demo/06-parallel.svg similarity index 100% rename from docs-internal/demo/06-parallel.svg rename to docs/internal/demo/06-parallel.svg diff --git a/docs-internal/demo/07-human-gate.fabro b/docs/internal/demo/07-human-gate.fabro similarity index 100% rename from docs-internal/demo/07-human-gate.fabro rename to docs/internal/demo/07-human-gate.fabro diff --git a/docs-internal/demo/07-human-gate.png b/docs/internal/demo/07-human-gate.png similarity index 100% rename from docs-internal/demo/07-human-gate.png rename to docs/internal/demo/07-human-gate.png diff --git a/docs-internal/demo/07-human-gate.svg b/docs/internal/demo/07-human-gate.svg similarity index 100% rename from docs-internal/demo/07-human-gate.svg rename to docs/internal/demo/07-human-gate.svg diff --git a/docs-internal/demo/08-multi-model.fabro b/docs/internal/demo/08-multi-model.fabro similarity index 100% rename from docs-internal/demo/08-multi-model.fabro rename to docs/internal/demo/08-multi-model.fabro diff --git a/docs-internal/demo/08-multi-model.png b/docs/internal/demo/08-multi-model.png similarity index 100% rename from docs-internal/demo/08-multi-model.png rename to docs/internal/demo/08-multi-model.png diff --git a/docs-internal/demo/08-multi-model.svg b/docs/internal/demo/08-multi-model.svg similarity index 100% rename from docs-internal/demo/08-multi-model.svg rename to docs/internal/demo/08-multi-model.svg diff --git a/docs-internal/demo/09-simplify.fabro b/docs/internal/demo/09-simplify.fabro similarity index 100% rename from docs-internal/demo/09-simplify.fabro rename to docs/internal/demo/09-simplify.fabro diff --git a/docs-internal/demo/09-simplify.png b/docs/internal/demo/09-simplify.png similarity index 100% rename from docs-internal/demo/09-simplify.png rename to docs/internal/demo/09-simplify.png diff --git a/docs-internal/demo/09-simplify.svg b/docs/internal/demo/09-simplify.svg similarity index 100% rename from docs-internal/demo/09-simplify.svg rename to docs/internal/demo/09-simplify.svg diff --git a/docs-internal/demo/10-plan-implement.fabro b/docs/internal/demo/10-plan-implement.fabro similarity index 100% rename from docs-internal/demo/10-plan-implement.fabro rename to docs/internal/demo/10-plan-implement.fabro diff --git a/docs-internal/demo/10-plan-implement.png b/docs/internal/demo/10-plan-implement.png similarity index 100% rename from docs-internal/demo/10-plan-implement.png rename to docs/internal/demo/10-plan-implement.png diff --git a/docs-internal/demo/10-plan-implement.svg b/docs/internal/demo/10-plan-implement.svg similarity index 100% rename from docs-internal/demo/10-plan-implement.svg rename to docs/internal/demo/10-plan-implement.svg diff --git a/docs-internal/demo/11-ensemble.fabro b/docs/internal/demo/11-ensemble.fabro similarity index 100% rename from docs-internal/demo/11-ensemble.fabro rename to docs/internal/demo/11-ensemble.fabro diff --git a/docs-internal/demo/11-ensemble.png b/docs/internal/demo/11-ensemble.png similarity index 100% rename from docs-internal/demo/11-ensemble.png rename to docs/internal/demo/11-ensemble.png diff --git a/docs-internal/demo/11-ensemble.svg b/docs/internal/demo/11-ensemble.svg similarity index 100% rename from docs-internal/demo/11-ensemble.svg rename to docs/internal/demo/11-ensemble.svg diff --git a/docs-internal/demo/12-web-fetch.fabro b/docs/internal/demo/12-web-fetch.fabro similarity index 100% rename from docs-internal/demo/12-web-fetch.fabro rename to docs/internal/demo/12-web-fetch.fabro diff --git a/docs-internal/demo/13-web-search.fabro b/docs/internal/demo/13-web-search.fabro similarity index 100% rename from docs-internal/demo/13-web-search.fabro rename to docs/internal/demo/13-web-search.fabro diff --git a/docs-internal/demo/14-search-imagegen.fabro b/docs/internal/demo/14-search-imagegen.fabro similarity index 100% rename from docs-internal/demo/14-search-imagegen.fabro rename to docs/internal/demo/14-search-imagegen.fabro diff --git a/docs-internal/demo/14-search-imagegen.toml b/docs/internal/demo/14-search-imagegen.toml similarity index 100% rename from docs-internal/demo/14-search-imagegen.toml rename to docs/internal/demo/14-search-imagegen.toml diff --git a/docs-internal/event-schema-competitive-analysis.md b/docs/internal/event-schema-competitive-analysis.md similarity index 100% rename from docs-internal/event-schema-competitive-analysis.md rename to docs/internal/event-schema-competitive-analysis.md diff --git a/docs-internal/events-strategy.md b/docs/internal/events-strategy.md similarity index 100% rename from docs-internal/events-strategy.md rename to docs/internal/events-strategy.md diff --git a/docs-internal/events.md b/docs/internal/events.md similarity index 100% rename from docs-internal/events.md rename to docs/internal/events.md diff --git a/docs-internal/fabro-event-schema-v2-concrete-shape.md b/docs/internal/fabro-event-schema-v2-concrete-shape.md similarity index 100% rename from docs-internal/fabro-event-schema-v2-concrete-shape.md rename to docs/internal/fabro-event-schema-v2-concrete-shape.md diff --git a/docs-internal/fabro-event-schema-v2-proposal.md b/docs/internal/fabro-event-schema-v2-proposal.md similarity index 100% rename from docs-internal/fabro-event-schema-v2-proposal.md rename to docs/internal/fabro-event-schema-v2-proposal.md diff --git a/docs-internal/licenses/graphviz-14.1.5-LICENSE b/docs/internal/licenses/graphviz-14.1.5-LICENSE similarity index 100% rename from docs-internal/licenses/graphviz-14.1.5-LICENSE rename to docs/internal/licenses/graphviz-14.1.5-LICENSE diff --git a/docs-internal/llm-client-resolution.md b/docs/internal/llm-client-resolution.md similarity index 100% rename from docs-internal/llm-client-resolution.md rename to docs/internal/llm-client-resolution.md diff --git a/docs-internal/logging-strategy.md b/docs/internal/logging-strategy.md similarity index 100% rename from docs-internal/logging-strategy.md rename to docs/internal/logging-strategy.md diff --git a/docs-internal/plan-events-as-source-of-truth-follow-ups.md b/docs/internal/plan-events-as-source-of-truth-follow-ups.md similarity index 100% rename from docs-internal/plan-events-as-source-of-truth-follow-ups.md rename to docs/internal/plan-events-as-source-of-truth-follow-ups.md diff --git a/docs-internal/plan-events-as-source-of-truth.md b/docs/internal/plan-events-as-source-of-truth.md similarity index 100% rename from docs-internal/plan-events-as-source-of-truth.md rename to docs/internal/plan-events-as-source-of-truth.md diff --git a/docs-internal/product/business-problem.md b/docs/internal/product/business-problem.md similarity index 100% rename from docs-internal/product/business-problem.md rename to docs/internal/product/business-problem.md diff --git a/docs-internal/product/current-state.md b/docs/internal/product/current-state.md similarity index 100% rename from docs-internal/product/current-state.md rename to docs/internal/product/current-state.md diff --git a/docs-internal/product/personas.md b/docs/internal/product/personas.md similarity index 100% rename from docs-internal/product/personas.md rename to docs/internal/product/personas.md diff --git a/docs-internal/product/product-description.md b/docs/internal/product/product-description.md similarity index 100% rename from docs-internal/product/product-description.md rename to docs/internal/product/product-description.md diff --git a/docs-internal/product/success-metrics.md b/docs/internal/product/success-metrics.md similarity index 100% rename from docs-internal/product/success-metrics.md rename to docs/internal/product/success-metrics.md diff --git a/docs-internal/product/technical-requirements.md b/docs/internal/product/technical-requirements.md similarity index 100% rename from docs-internal/product/technical-requirements.md rename to docs/internal/product/technical-requirements.md diff --git a/docs-internal/run-directory-keys.md b/docs/internal/run-directory-keys.md similarity index 100% rename from docs-internal/run-directory-keys.md rename to docs/internal/run-directory-keys.md diff --git a/docs-internal/server-secrets-strategy.md b/docs/internal/server-secrets-strategy.md similarity index 100% rename from docs-internal/server-secrets-strategy.md rename to docs/internal/server-secrets-strategy.md diff --git a/docs-internal/slow-test-opportunities-2026-04-07.md b/docs/internal/slow-test-opportunities-2026-04-07.md similarity index 100% rename from docs-internal/slow-test-opportunities-2026-04-07.md rename to docs/internal/slow-test-opportunities-2026-04-07.md diff --git a/docs-internal/testing-strategy.md b/docs/internal/testing-strategy.md similarity index 100% rename from docs-internal/testing-strategy.md rename to docs/internal/testing-strategy.md diff --git a/docs-internal/updating-web-screenshots.md b/docs/internal/updating-web-screenshots.md similarity index 94% rename from docs-internal/updating-web-screenshots.md rename to docs/internal/updating-web-screenshots.md index efdfb30bc..df1a745fa 100644 --- a/docs-internal/updating-web-screenshots.md +++ b/docs/internal/updating-web-screenshots.md @@ -32,7 +32,7 @@ With the SPA baked into the binary, there's no in-container edit path. Commit th ## Updating logos -Logos live at `apps/fabro-web/public/logotype.svg` (dark) and `apps/fabro-web/public/logotype-light.svg` (light). These are bundled into the SPA at build time — rebuilding the image picks up the changes. The source-of-truth logos are in `docs/logo/dark.svg` and `docs/logo/light.svg`. +Logos live at `apps/fabro-web/public/logotype.svg` (dark) and `apps/fabro-web/public/logotype-light.svg` (light). These are bundled into the SPA at build time — rebuilding the image picks up the changes. The source-of-truth logos are in `docs/public/logo/dark.svg` and `docs/public/logo/light.svg`. ## Browser setup @@ -45,7 +45,7 @@ If the nav bar is too crowded at this width, hide low-priority items (Start, Set ## Taking screenshots -Screenshots live in `docs/images/web/`. Each screenshot maps to a specific URL (served from `http://localhost/` with the `X-Fabro-Demo: 1` header): +Screenshots live in `docs/public/images/web/`. Each screenshot maps to a specific URL (served from `http://localhost/` with the `X-Fabro-Demo: 1` header): | File | URL | |---|---| diff --git a/docs/.mintignore b/docs/public/.mintignore similarity index 78% rename from docs/.mintignore rename to docs/public/.mintignore index cead52917..be35e7f40 100644 --- a/docs/.mintignore +++ b/docs/public/.mintignore @@ -2,9 +2,4 @@ # .git, .github, .claude, .agents, .idea, node_modules, # README.md, LICENSE.md, CHANGELOG.md, CONTRIBUTING.md -# Non-docs files -AGENTS.md - -# Draft content -drafts/ *.draft.mdx diff --git a/docs/administration/deploy-digital-ocean.mdx b/docs/public/administration/deploy-digital-ocean.mdx similarity index 100% rename from docs/administration/deploy-digital-ocean.mdx rename to docs/public/administration/deploy-digital-ocean.mdx diff --git a/docs/administration/deploy-fly-io.mdx b/docs/public/administration/deploy-fly-io.mdx similarity index 100% rename from docs/administration/deploy-fly-io.mdx rename to docs/public/administration/deploy-fly-io.mdx diff --git a/docs/administration/deploy-railway.mdx b/docs/public/administration/deploy-railway.mdx similarity index 100% rename from docs/administration/deploy-railway.mdx rename to docs/public/administration/deploy-railway.mdx diff --git a/docs/administration/deploy-render.mdx b/docs/public/administration/deploy-render.mdx similarity index 100% rename from docs/administration/deploy-render.mdx rename to docs/public/administration/deploy-render.mdx diff --git a/docs/administration/deploy-server.mdx b/docs/public/administration/deploy-server.mdx similarity index 100% rename from docs/administration/deploy-server.mdx rename to docs/public/administration/deploy-server.mdx diff --git a/docs/administration/sandboxing.mdx b/docs/public/administration/sandboxing.mdx similarity index 100% rename from docs/administration/sandboxing.mdx rename to docs/public/administration/sandboxing.mdx diff --git a/docs/administration/security.mdx b/docs/public/administration/security.mdx similarity index 100% rename from docs/administration/security.mdx rename to docs/public/administration/security.mdx diff --git a/docs/administration/server-configuration.mdx b/docs/public/administration/server-configuration.mdx similarity index 100% rename from docs/administration/server-configuration.mdx rename to docs/public/administration/server-configuration.mdx diff --git a/docs/administration/troubleshooting.mdx b/docs/public/administration/troubleshooting.mdx similarity index 100% rename from docs/administration/troubleshooting.mdx rename to docs/public/administration/troubleshooting.mdx diff --git a/docs/agents/hooks.mdx b/docs/public/agents/hooks.mdx similarity index 100% rename from docs/agents/hooks.mdx rename to docs/public/agents/hooks.mdx diff --git a/docs/agents/mcp.mdx b/docs/public/agents/mcp.mdx similarity index 100% rename from docs/agents/mcp.mdx rename to docs/public/agents/mcp.mdx diff --git a/docs/agents/outputs.mdx b/docs/public/agents/outputs.mdx similarity index 100% rename from docs/agents/outputs.mdx rename to docs/public/agents/outputs.mdx diff --git a/docs/agents/permissions.mdx b/docs/public/agents/permissions.mdx similarity index 100% rename from docs/agents/permissions.mdx rename to docs/public/agents/permissions.mdx diff --git a/docs/agents/prompts.mdx b/docs/public/agents/prompts.mdx similarity index 100% rename from docs/agents/prompts.mdx rename to docs/public/agents/prompts.mdx diff --git a/docs/agents/skills.mdx b/docs/public/agents/skills.mdx similarity index 100% rename from docs/agents/skills.mdx rename to docs/public/agents/skills.mdx diff --git a/docs/agents/subagents.mdx b/docs/public/agents/subagents.mdx similarity index 100% rename from docs/agents/subagents.mdx rename to docs/public/agents/subagents.mdx diff --git a/docs/agents/tools.mdx b/docs/public/agents/tools.mdx similarity index 100% rename from docs/agents/tools.mdx rename to docs/public/agents/tools.mdx diff --git a/docs/api-reference/client-sdks.mdx b/docs/public/api-reference/client-sdks.mdx similarity index 72% rename from docs/api-reference/client-sdks.mdx rename to docs/public/api-reference/client-sdks.mdx index e0170abf4..e0fcb4a94 100644 --- a/docs/api-reference/client-sdks.mdx +++ b/docs/public/api-reference/client-sdks.mdx @@ -3,7 +3,7 @@ title: "Client SDKs" description: "Language-specific clients generated from the Fabro OpenAPI spec" --- -The Fabro API is defined by an OpenAPI 3.1 specification (`docs/api-reference/fabro-api.yaml` in the repository) that serves as the single source of truth for all endpoints, request/response schemas, and parameter definitions. The spec is also available at runtime from the server at `GET /api/v1/openapi.json`. Both client SDKs below are generated directly from this spec. +The Fabro API is defined by an OpenAPI 3.1 specification (`docs/public/api-reference/fabro-api.yaml` in the repository) that serves as the single source of truth for all endpoints, request/response schemas, and parameter definitions. The spec is also available at runtime from the server at `GET /api/v1/openapi.json`. Both client SDKs below are generated directly from this spec. ## TypeScript (Axios) @@ -18,7 +18,7 @@ cd lib/packages/fabro-api-client bun run generate ``` -This runs `openapi-generator-cli` against `docs/api-reference/fabro-api.yaml` and writes the generated source into `lib/packages/fabro-api-client/src/`. +This runs `openapi-generator-cli` against `docs/public/api-reference/fabro-api.yaml` and writes the generated source into `lib/packages/fabro-api-client/src/`. ### Usage @@ -40,7 +40,7 @@ The `fabro-api` crate generates Rust structs, enums, and a `reqwest`-based HTTP ### How It Works -A `build.rs` script reads `docs/api-reference/fabro-api.yaml`, patches it from OpenAPI 3.1 to 3.0 for progenitor compatibility, and generates both types and a client. The generated code is written to `OUT_DIR` and included via: +A `build.rs` script reads `docs/public/api-reference/fabro-api.yaml`, patches it from OpenAPI 3.1 to 3.0 for progenitor compatibility, and generates both types and a client. The generated code is written to `OUT_DIR` and included via: ```rust // lib/crates/fabro-api/src/lib.rs diff --git a/docs/api-reference/demo-mode.mdx b/docs/public/api-reference/demo-mode.mdx similarity index 100% rename from docs/api-reference/demo-mode.mdx rename to docs/public/api-reference/demo-mode.mdx diff --git a/docs/api-reference/fabro-api.yaml b/docs/public/api-reference/fabro-api.yaml similarity index 100% rename from docs/api-reference/fabro-api.yaml rename to docs/public/api-reference/fabro-api.yaml diff --git a/docs/api-reference/overview.mdx b/docs/public/api-reference/overview.mdx similarity index 100% rename from docs/api-reference/overview.mdx rename to docs/public/api-reference/overview.mdx diff --git a/docs/changelog/2026-02-23.mdx b/docs/public/changelog/2026-02-23.mdx similarity index 100% rename from docs/changelog/2026-02-23.mdx rename to docs/public/changelog/2026-02-23.mdx diff --git a/docs/changelog/2026-02-24.mdx b/docs/public/changelog/2026-02-24.mdx similarity index 100% rename from docs/changelog/2026-02-24.mdx rename to docs/public/changelog/2026-02-24.mdx diff --git a/docs/changelog/2026-02-25.mdx b/docs/public/changelog/2026-02-25.mdx similarity index 100% rename from docs/changelog/2026-02-25.mdx rename to docs/public/changelog/2026-02-25.mdx diff --git a/docs/changelog/2026-02-26.mdx b/docs/public/changelog/2026-02-26.mdx similarity index 100% rename from docs/changelog/2026-02-26.mdx rename to docs/public/changelog/2026-02-26.mdx diff --git a/docs/changelog/2026-02-27.mdx b/docs/public/changelog/2026-02-27.mdx similarity index 100% rename from docs/changelog/2026-02-27.mdx rename to docs/public/changelog/2026-02-27.mdx diff --git a/docs/changelog/2026-02-28.mdx b/docs/public/changelog/2026-02-28.mdx similarity index 100% rename from docs/changelog/2026-02-28.mdx rename to docs/public/changelog/2026-02-28.mdx diff --git a/docs/changelog/2026-03-01.mdx b/docs/public/changelog/2026-03-01.mdx similarity index 100% rename from docs/changelog/2026-03-01.mdx rename to docs/public/changelog/2026-03-01.mdx diff --git a/docs/changelog/2026-03-02.mdx b/docs/public/changelog/2026-03-02.mdx similarity index 100% rename from docs/changelog/2026-03-02.mdx rename to docs/public/changelog/2026-03-02.mdx diff --git a/docs/changelog/2026-03-03.mdx b/docs/public/changelog/2026-03-03.mdx similarity index 100% rename from docs/changelog/2026-03-03.mdx rename to docs/public/changelog/2026-03-03.mdx diff --git a/docs/changelog/2026-03-04.mdx b/docs/public/changelog/2026-03-04.mdx similarity index 100% rename from docs/changelog/2026-03-04.mdx rename to docs/public/changelog/2026-03-04.mdx diff --git a/docs/changelog/2026-03-05.mdx b/docs/public/changelog/2026-03-05.mdx similarity index 100% rename from docs/changelog/2026-03-05.mdx rename to docs/public/changelog/2026-03-05.mdx diff --git a/docs/changelog/2026-03-06.mdx b/docs/public/changelog/2026-03-06.mdx similarity index 100% rename from docs/changelog/2026-03-06.mdx rename to docs/public/changelog/2026-03-06.mdx diff --git a/docs/changelog/2026-03-07.mdx b/docs/public/changelog/2026-03-07.mdx similarity index 100% rename from docs/changelog/2026-03-07.mdx rename to docs/public/changelog/2026-03-07.mdx diff --git a/docs/changelog/2026-03-08.mdx b/docs/public/changelog/2026-03-08.mdx similarity index 100% rename from docs/changelog/2026-03-08.mdx rename to docs/public/changelog/2026-03-08.mdx diff --git a/docs/changelog/2026-03-09.mdx b/docs/public/changelog/2026-03-09.mdx similarity index 100% rename from docs/changelog/2026-03-09.mdx rename to docs/public/changelog/2026-03-09.mdx diff --git a/docs/changelog/2026-03-10.mdx b/docs/public/changelog/2026-03-10.mdx similarity index 100% rename from docs/changelog/2026-03-10.mdx rename to docs/public/changelog/2026-03-10.mdx diff --git a/docs/changelog/2026-03-11.mdx b/docs/public/changelog/2026-03-11.mdx similarity index 100% rename from docs/changelog/2026-03-11.mdx rename to docs/public/changelog/2026-03-11.mdx diff --git a/docs/changelog/2026-03-12.mdx b/docs/public/changelog/2026-03-12.mdx similarity index 100% rename from docs/changelog/2026-03-12.mdx rename to docs/public/changelog/2026-03-12.mdx diff --git a/docs/changelog/2026-03-13.mdx b/docs/public/changelog/2026-03-13.mdx similarity index 100% rename from docs/changelog/2026-03-13.mdx rename to docs/public/changelog/2026-03-13.mdx diff --git a/docs/changelog/2026-03-14.mdx b/docs/public/changelog/2026-03-14.mdx similarity index 100% rename from docs/changelog/2026-03-14.mdx rename to docs/public/changelog/2026-03-14.mdx diff --git a/docs/changelog/2026-03-15.mdx b/docs/public/changelog/2026-03-15.mdx similarity index 100% rename from docs/changelog/2026-03-15.mdx rename to docs/public/changelog/2026-03-15.mdx diff --git a/docs/changelog/2026-03-16.mdx b/docs/public/changelog/2026-03-16.mdx similarity index 100% rename from docs/changelog/2026-03-16.mdx rename to docs/public/changelog/2026-03-16.mdx diff --git a/docs/changelog/2026-03-17.mdx b/docs/public/changelog/2026-03-17.mdx similarity index 100% rename from docs/changelog/2026-03-17.mdx rename to docs/public/changelog/2026-03-17.mdx diff --git a/docs/changelog/2026-03-18.mdx b/docs/public/changelog/2026-03-18.mdx similarity index 100% rename from docs/changelog/2026-03-18.mdx rename to docs/public/changelog/2026-03-18.mdx diff --git a/docs/changelog/2026-03-19.mdx b/docs/public/changelog/2026-03-19.mdx similarity index 100% rename from docs/changelog/2026-03-19.mdx rename to docs/public/changelog/2026-03-19.mdx diff --git a/docs/changelog/2026-03-20.mdx b/docs/public/changelog/2026-03-20.mdx similarity index 100% rename from docs/changelog/2026-03-20.mdx rename to docs/public/changelog/2026-03-20.mdx diff --git a/docs/changelog/2026-03-21.mdx b/docs/public/changelog/2026-03-21.mdx similarity index 100% rename from docs/changelog/2026-03-21.mdx rename to docs/public/changelog/2026-03-21.mdx diff --git a/docs/changelog/2026-03-22.mdx b/docs/public/changelog/2026-03-22.mdx similarity index 100% rename from docs/changelog/2026-03-22.mdx rename to docs/public/changelog/2026-03-22.mdx diff --git a/docs/changelog/2026-03-23.mdx b/docs/public/changelog/2026-03-23.mdx similarity index 100% rename from docs/changelog/2026-03-23.mdx rename to docs/public/changelog/2026-03-23.mdx diff --git a/docs/changelog/2026-03-26.mdx b/docs/public/changelog/2026-03-26.mdx similarity index 100% rename from docs/changelog/2026-03-26.mdx rename to docs/public/changelog/2026-03-26.mdx diff --git a/docs/changelog/2026-03-27.mdx b/docs/public/changelog/2026-03-27.mdx similarity index 100% rename from docs/changelog/2026-03-27.mdx rename to docs/public/changelog/2026-03-27.mdx diff --git a/docs/changelog/2026-03-28.mdx b/docs/public/changelog/2026-03-28.mdx similarity index 100% rename from docs/changelog/2026-03-28.mdx rename to docs/public/changelog/2026-03-28.mdx diff --git a/docs/changelog/2026-03-29.mdx b/docs/public/changelog/2026-03-29.mdx similarity index 100% rename from docs/changelog/2026-03-29.mdx rename to docs/public/changelog/2026-03-29.mdx diff --git a/docs/changelog/2026-03-30.mdx b/docs/public/changelog/2026-03-30.mdx similarity index 100% rename from docs/changelog/2026-03-30.mdx rename to docs/public/changelog/2026-03-30.mdx diff --git a/docs/changelog/2026-03-31.mdx b/docs/public/changelog/2026-03-31.mdx similarity index 100% rename from docs/changelog/2026-03-31.mdx rename to docs/public/changelog/2026-03-31.mdx diff --git a/docs/changelog/2026-04-01.mdx b/docs/public/changelog/2026-04-01.mdx similarity index 100% rename from docs/changelog/2026-04-01.mdx rename to docs/public/changelog/2026-04-01.mdx diff --git a/docs/changelog/2026-04-02.mdx b/docs/public/changelog/2026-04-02.mdx similarity index 100% rename from docs/changelog/2026-04-02.mdx rename to docs/public/changelog/2026-04-02.mdx diff --git a/docs/changelog/2026-04-04.mdx b/docs/public/changelog/2026-04-04.mdx similarity index 100% rename from docs/changelog/2026-04-04.mdx rename to docs/public/changelog/2026-04-04.mdx diff --git a/docs/changelog/2026-04-06.mdx b/docs/public/changelog/2026-04-06.mdx similarity index 100% rename from docs/changelog/2026-04-06.mdx rename to docs/public/changelog/2026-04-06.mdx diff --git a/docs/changelog/2026-04-07.mdx b/docs/public/changelog/2026-04-07.mdx similarity index 100% rename from docs/changelog/2026-04-07.mdx rename to docs/public/changelog/2026-04-07.mdx diff --git a/docs/changelog/2026-04-08.mdx b/docs/public/changelog/2026-04-08.mdx similarity index 100% rename from docs/changelog/2026-04-08.mdx rename to docs/public/changelog/2026-04-08.mdx diff --git a/docs/changelog/2026-04-09.mdx b/docs/public/changelog/2026-04-09.mdx similarity index 100% rename from docs/changelog/2026-04-09.mdx rename to docs/public/changelog/2026-04-09.mdx diff --git a/docs/changelog/2026-04-10.mdx b/docs/public/changelog/2026-04-10.mdx similarity index 100% rename from docs/changelog/2026-04-10.mdx rename to docs/public/changelog/2026-04-10.mdx diff --git a/docs/changelog/2026-04-11.mdx b/docs/public/changelog/2026-04-11.mdx similarity index 100% rename from docs/changelog/2026-04-11.mdx rename to docs/public/changelog/2026-04-11.mdx diff --git a/docs/changelog/2026-04-12.mdx b/docs/public/changelog/2026-04-12.mdx similarity index 100% rename from docs/changelog/2026-04-12.mdx rename to docs/public/changelog/2026-04-12.mdx diff --git a/docs/changelog/2026-04-13.mdx b/docs/public/changelog/2026-04-13.mdx similarity index 100% rename from docs/changelog/2026-04-13.mdx rename to docs/public/changelog/2026-04-13.mdx diff --git a/docs/changelog/2026-04-14.mdx b/docs/public/changelog/2026-04-14.mdx similarity index 100% rename from docs/changelog/2026-04-14.mdx rename to docs/public/changelog/2026-04-14.mdx diff --git a/docs/changelog/2026-04-15.mdx b/docs/public/changelog/2026-04-15.mdx similarity index 100% rename from docs/changelog/2026-04-15.mdx rename to docs/public/changelog/2026-04-15.mdx diff --git a/docs/changelog/2026-04-16.mdx b/docs/public/changelog/2026-04-16.mdx similarity index 100% rename from docs/changelog/2026-04-16.mdx rename to docs/public/changelog/2026-04-16.mdx diff --git a/docs/changelog/2026-04-17.mdx b/docs/public/changelog/2026-04-17.mdx similarity index 100% rename from docs/changelog/2026-04-17.mdx rename to docs/public/changelog/2026-04-17.mdx diff --git a/docs/changelog/2026-04-18.mdx b/docs/public/changelog/2026-04-18.mdx similarity index 100% rename from docs/changelog/2026-04-18.mdx rename to docs/public/changelog/2026-04-18.mdx diff --git a/docs/changelog/2026-04-19.mdx b/docs/public/changelog/2026-04-19.mdx similarity index 100% rename from docs/changelog/2026-04-19.mdx rename to docs/public/changelog/2026-04-19.mdx diff --git a/docs/changelog/2026-04-20.mdx b/docs/public/changelog/2026-04-20.mdx similarity index 100% rename from docs/changelog/2026-04-20.mdx rename to docs/public/changelog/2026-04-20.mdx diff --git a/docs/changelog/2026-04-21.mdx b/docs/public/changelog/2026-04-21.mdx similarity index 100% rename from docs/changelog/2026-04-21.mdx rename to docs/public/changelog/2026-04-21.mdx diff --git a/docs/changelog/2026-04-22.mdx b/docs/public/changelog/2026-04-22.mdx similarity index 100% rename from docs/changelog/2026-04-22.mdx rename to docs/public/changelog/2026-04-22.mdx diff --git a/docs/changelog/2026-04-23.mdx b/docs/public/changelog/2026-04-23.mdx similarity index 100% rename from docs/changelog/2026-04-23.mdx rename to docs/public/changelog/2026-04-23.mdx diff --git a/docs/changelog/2026-04-24.mdx b/docs/public/changelog/2026-04-24.mdx similarity index 100% rename from docs/changelog/2026-04-24.mdx rename to docs/public/changelog/2026-04-24.mdx diff --git a/docs/changelog/2026-04-25.mdx b/docs/public/changelog/2026-04-25.mdx similarity index 100% rename from docs/changelog/2026-04-25.mdx rename to docs/public/changelog/2026-04-25.mdx diff --git a/docs/changelog/2026-04-26.mdx b/docs/public/changelog/2026-04-26.mdx similarity index 100% rename from docs/changelog/2026-04-26.mdx rename to docs/public/changelog/2026-04-26.mdx diff --git a/docs/core-concepts/agents.mdx b/docs/public/core-concepts/agents.mdx similarity index 100% rename from docs/core-concepts/agents.mdx rename to docs/public/core-concepts/agents.mdx diff --git a/docs/core-concepts/how-fabro-works.mdx b/docs/public/core-concepts/how-fabro-works.mdx similarity index 100% rename from docs/core-concepts/how-fabro-works.mdx rename to docs/public/core-concepts/how-fabro-works.mdx diff --git a/docs/core-concepts/models.mdx b/docs/public/core-concepts/models.mdx similarity index 100% rename from docs/core-concepts/models.mdx rename to docs/public/core-concepts/models.mdx diff --git a/docs/core-concepts/workflows.mdx b/docs/public/core-concepts/workflows.mdx similarity index 100% rename from docs/core-concepts/workflows.mdx rename to docs/public/core-concepts/workflows.mdx diff --git a/docs/docs.json b/docs/public/docs.json similarity index 100% rename from docs/docs.json rename to docs/public/docs.json diff --git a/docs/dot-highlight.js b/docs/public/dot-highlight.js similarity index 100% rename from docs/dot-highlight.js rename to docs/public/dot-highlight.js diff --git a/docs/examples/clone-substack.mdx b/docs/public/examples/clone-substack.mdx similarity index 100% rename from docs/examples/clone-substack.mdx rename to docs/public/examples/clone-substack.mdx diff --git a/docs/examples/definition-of-done.mdx b/docs/public/examples/definition-of-done.mdx similarity index 100% rename from docs/examples/definition-of-done.mdx rename to docs/public/examples/definition-of-done.mdx diff --git a/docs/examples/nlspec-conformance.mdx b/docs/public/examples/nlspec-conformance.mdx similarity index 100% rename from docs/examples/nlspec-conformance.mdx rename to docs/public/examples/nlspec-conformance.mdx diff --git a/docs/examples/repl-handoff.mdx b/docs/public/examples/repl-handoff.mdx similarity index 100% rename from docs/examples/repl-handoff.mdx rename to docs/public/examples/repl-handoff.mdx diff --git a/docs/examples/semantic-port.mdx b/docs/public/examples/semantic-port.mdx similarity index 100% rename from docs/examples/semantic-port.mdx rename to docs/public/examples/semantic-port.mdx diff --git a/docs/examples/solitaire.mdx b/docs/public/examples/solitaire.mdx similarity index 100% rename from docs/examples/solitaire.mdx rename to docs/public/examples/solitaire.mdx diff --git a/docs/execution/checkpoints.mdx b/docs/public/execution/checkpoints.mdx similarity index 100% rename from docs/execution/checkpoints.mdx rename to docs/public/execution/checkpoints.mdx diff --git a/docs/execution/context.mdx b/docs/public/execution/context.mdx similarity index 100% rename from docs/execution/context.mdx rename to docs/public/execution/context.mdx diff --git a/docs/execution/devcontainers.mdx b/docs/public/execution/devcontainers.mdx similarity index 100% rename from docs/execution/devcontainers.mdx rename to docs/public/execution/devcontainers.mdx diff --git a/docs/execution/environments.mdx b/docs/public/execution/environments.mdx similarity index 100% rename from docs/execution/environments.mdx rename to docs/public/execution/environments.mdx diff --git a/docs/execution/failures.mdx b/docs/public/execution/failures.mdx similarity index 100% rename from docs/execution/failures.mdx rename to docs/public/execution/failures.mdx diff --git a/docs/execution/observability.mdx b/docs/public/execution/observability.mdx similarity index 100% rename from docs/execution/observability.mdx rename to docs/public/execution/observability.mdx diff --git a/docs/execution/outcomes.mdx b/docs/public/execution/outcomes.mdx similarity index 100% rename from docs/execution/outcomes.mdx rename to docs/public/execution/outcomes.mdx diff --git a/docs/execution/retros.mdx b/docs/public/execution/retros.mdx similarity index 100% rename from docs/execution/retros.mdx rename to docs/public/execution/retros.mdx diff --git a/docs/execution/run-configuration.mdx b/docs/public/execution/run-configuration.mdx similarity index 100% rename from docs/execution/run-configuration.mdx rename to docs/public/execution/run-configuration.mdx diff --git a/docs/favicon.svg b/docs/public/favicon.svg similarity index 100% rename from docs/favicon.svg rename to docs/public/favicon.svg diff --git a/docs/getting-started/comparison.mdx b/docs/public/getting-started/comparison.mdx similarity index 100% rename from docs/getting-started/comparison.mdx rename to docs/public/getting-started/comparison.mdx diff --git a/docs/getting-started/dark-factory.mdx b/docs/public/getting-started/dark-factory.mdx similarity index 100% rename from docs/getting-started/dark-factory.mdx rename to docs/public/getting-started/dark-factory.mdx diff --git a/docs/getting-started/introduction.mdx b/docs/public/getting-started/introduction.mdx similarity index 100% rename from docs/getting-started/introduction.mdx rename to docs/public/getting-started/introduction.mdx diff --git a/docs/getting-started/quick-start.mdx b/docs/public/getting-started/quick-start.mdx similarity index 100% rename from docs/getting-started/quick-start.mdx rename to docs/public/getting-started/quick-start.mdx diff --git a/docs/getting-started/why-fabro.mdx b/docs/public/getting-started/why-fabro.mdx similarity index 100% rename from docs/getting-started/why-fabro.mdx rename to docs/public/getting-started/why-fabro.mdx diff --git a/docs/human-tools/interviews.mdx b/docs/public/human-tools/interviews.mdx similarity index 100% rename from docs/human-tools/interviews.mdx rename to docs/public/human-tools/interviews.mdx diff --git a/docs/human-tools/preview.mdx b/docs/public/human-tools/preview.mdx similarity index 100% rename from docs/human-tools/preview.mdx rename to docs/public/human-tools/preview.mdx diff --git a/docs/human-tools/ssh-access.mdx b/docs/public/human-tools/ssh-access.mdx similarity index 100% rename from docs/human-tools/ssh-access.mdx rename to docs/public/human-tools/ssh-access.mdx diff --git a/docs/human-tools/steering.mdx b/docs/public/human-tools/steering.mdx similarity index 100% rename from docs/human-tools/steering.mdx rename to docs/public/human-tools/steering.mdx diff --git a/docs/human-tools/vnc-access.mdx b/docs/public/human-tools/vnc-access.mdx similarity index 100% rename from docs/human-tools/vnc-access.mdx rename to docs/public/human-tools/vnc-access.mdx diff --git a/docs/human-tools/vpn-connections.mdx b/docs/public/human-tools/vpn-connections.mdx similarity index 100% rename from docs/human-tools/vpn-connections.mdx rename to docs/public/human-tools/vpn-connections.mdx diff --git a/docs/human-tools/vs-code.mdx b/docs/public/human-tools/vs-code.mdx similarity index 100% rename from docs/human-tools/vs-code.mdx rename to docs/public/human-tools/vs-code.mdx diff --git a/docs/images/anatomy-workflow.svg b/docs/public/images/anatomy-workflow.svg similarity index 100% rename from docs/images/anatomy-workflow.svg rename to docs/public/images/anatomy-workflow.svg diff --git a/docs/images/branch-loop-workflow.svg b/docs/public/images/branch-loop-workflow.svg similarity index 100% rename from docs/images/branch-loop-workflow.svg rename to docs/public/images/branch-loop-workflow.svg diff --git a/docs/images/brave-search-research.svg b/docs/public/images/brave-search-research.svg similarity index 100% rename from docs/images/brave-search-research.svg rename to docs/public/images/brave-search-research.svg diff --git a/docs/images/ensemble-workflow.svg b/docs/public/images/ensemble-workflow.svg similarity index 100% rename from docs/images/ensemble-workflow.svg rename to docs/public/images/ensemble-workflow.svg diff --git a/docs/images/example-clone-substack.svg b/docs/public/images/example-clone-substack.svg similarity index 100% rename from docs/images/example-clone-substack.svg rename to docs/public/images/example-clone-substack.svg diff --git a/docs/images/example-dod-multimodel.svg b/docs/public/images/example-dod-multimodel.svg similarity index 100% rename from docs/images/example-dod-multimodel.svg rename to docs/public/images/example-dod-multimodel.svg diff --git a/docs/images/example-dod.svg b/docs/public/images/example-dod.svg similarity index 100% rename from docs/images/example-dod.svg rename to docs/public/images/example-dod.svg diff --git a/docs/images/example-repl-handoff.svg b/docs/public/images/example-repl-handoff.svg similarity index 100% rename from docs/images/example-repl-handoff.svg rename to docs/public/images/example-repl-handoff.svg diff --git a/docs/images/example-semantic-port.svg b/docs/public/images/example-semantic-port.svg similarity index 100% rename from docs/images/example-semantic-port.svg rename to docs/public/images/example-semantic-port.svg diff --git a/docs/images/example-solitaire.svg b/docs/public/images/example-solitaire.svg similarity index 100% rename from docs/images/example-solitaire.svg rename to docs/public/images/example-solitaire.svg diff --git a/docs/images/hero-dark.png b/docs/public/images/hero-dark.png similarity index 100% rename from docs/images/hero-dark.png rename to docs/public/images/hero-dark.png diff --git a/docs/images/hero-light.png b/docs/public/images/hero-light.png similarity index 100% rename from docs/images/hero-light.png rename to docs/public/images/hero-light.png diff --git a/docs/images/how-fabro-works.svg b/docs/public/images/how-fabro-works.svg similarity index 100% rename from docs/images/how-fabro-works.svg rename to docs/public/images/how-fabro-works.svg diff --git a/docs/images/nlspec-conformance.svg b/docs/public/images/nlspec-conformance.svg similarity index 100% rename from docs/images/nlspec-conformance.svg rename to docs/public/images/nlspec-conformance.svg diff --git a/docs/images/parallel-workflow.svg b/docs/public/images/parallel-workflow.svg similarity index 100% rename from docs/images/parallel-workflow.svg rename to docs/public/images/parallel-workflow.svg diff --git a/docs/images/permission-flow.svg b/docs/public/images/permission-flow.svg similarity index 100% rename from docs/images/permission-flow.svg rename to docs/public/images/permission-flow.svg diff --git a/docs/images/plan-implement-readme.svg b/docs/public/images/plan-implement-readme.svg similarity index 100% rename from docs/images/plan-implement-readme.svg rename to docs/public/images/plan-implement-readme.svg diff --git a/docs/images/plan-implement-workflow.svg b/docs/public/images/plan-implement-workflow.svg similarity index 100% rename from docs/images/plan-implement-workflow.svg rename to docs/public/images/plan-implement-workflow.svg diff --git a/docs/images/preview-workflow.svg b/docs/public/images/preview-workflow.svg similarity index 100% rename from docs/images/preview-workflow.svg rename to docs/public/images/preview-workflow.svg diff --git a/docs/images/run-detail.png b/docs/public/images/run-detail.png similarity index 100% rename from docs/images/run-detail.png rename to docs/public/images/run-detail.png diff --git a/docs/images/runs-board.png b/docs/public/images/runs-board.png similarity index 100% rename from docs/images/runs-board.png rename to docs/public/images/runs-board.png diff --git a/docs/images/tutorial-branch-loop.svg b/docs/public/images/tutorial-branch-loop.svg similarity index 100% rename from docs/images/tutorial-branch-loop.svg rename to docs/public/images/tutorial-branch-loop.svg diff --git a/docs/images/tutorial-ensemble.svg b/docs/public/images/tutorial-ensemble.svg similarity index 100% rename from docs/images/tutorial-ensemble.svg rename to docs/public/images/tutorial-ensemble.svg diff --git a/docs/images/tutorial-hello.svg b/docs/public/images/tutorial-hello.svg similarity index 100% rename from docs/images/tutorial-hello.svg rename to docs/public/images/tutorial-hello.svg diff --git a/docs/images/tutorial-multi-model.svg b/docs/public/images/tutorial-multi-model.svg similarity index 100% rename from docs/images/tutorial-multi-model.svg rename to docs/public/images/tutorial-multi-model.svg diff --git a/docs/images/tutorial-parallel-review.svg b/docs/public/images/tutorial-parallel-review.svg similarity index 100% rename from docs/images/tutorial-parallel-review.svg rename to docs/public/images/tutorial-parallel-review.svg diff --git a/docs/images/tutorial-plan-implement.svg b/docs/public/images/tutorial-plan-implement.svg similarity index 100% rename from docs/images/tutorial-plan-implement.svg rename to docs/public/images/tutorial-plan-implement.svg diff --git a/docs/images/tutorial-sub-workflow-child.svg b/docs/public/images/tutorial-sub-workflow-child.svg similarity index 100% rename from docs/images/tutorial-sub-workflow-child.svg rename to docs/public/images/tutorial-sub-workflow-child.svg diff --git a/docs/images/tutorial-sub-workflow.svg b/docs/public/images/tutorial-sub-workflow.svg similarity index 100% rename from docs/images/tutorial-sub-workflow.svg rename to docs/public/images/tutorial-sub-workflow.svg diff --git a/docs/images/tutorial-subagent.svg b/docs/public/images/tutorial-subagent.svg similarity index 100% rename from docs/images/tutorial-subagent.svg rename to docs/public/images/tutorial-subagent.svg diff --git a/docs/images/tutorial-tool-use.svg b/docs/public/images/tutorial-tool-use.svg similarity index 100% rename from docs/images/tutorial-tool-use.svg rename to docs/public/images/tutorial-tool-use.svg diff --git a/docs/images/vnc-access-workflow.svg b/docs/public/images/vnc-access-workflow.svg similarity index 100% rename from docs/images/vnc-access-workflow.svg rename to docs/public/images/vnc-access-workflow.svg diff --git a/docs/images/vpn-connections-workflow.svg b/docs/public/images/vpn-connections-workflow.svg similarity index 100% rename from docs/images/vpn-connections-workflow.svg rename to docs/public/images/vpn-connections-workflow.svg diff --git a/docs/images/web/retros-list.png b/docs/public/images/web/retros-list.png similarity index 100% rename from docs/images/web/retros-list.png rename to docs/public/images/web/retros-list.png diff --git a/docs/images/web/run-files-changed.png b/docs/public/images/web/run-files-changed.png similarity index 100% rename from docs/images/web/run-files-changed.png rename to docs/public/images/web/run-files-changed.png diff --git a/docs/images/web/run-overview.png b/docs/public/images/web/run-overview.png similarity index 100% rename from docs/images/web/run-overview.png rename to docs/public/images/web/run-overview.png diff --git a/docs/images/web/run-retro.png b/docs/public/images/web/run-retro.png similarity index 100% rename from docs/images/web/run-retro.png rename to docs/public/images/web/run-retro.png diff --git a/docs/images/web/run-stages.png b/docs/public/images/web/run-stages.png similarity index 100% rename from docs/images/web/run-stages.png rename to docs/public/images/web/run-stages.png diff --git a/docs/images/web/run-usage.png b/docs/public/images/web/run-usage.png similarity index 100% rename from docs/images/web/run-usage.png rename to docs/public/images/web/run-usage.png diff --git a/docs/images/web/runs-board.png b/docs/public/images/web/runs-board.png similarity index 100% rename from docs/images/web/runs-board.png rename to docs/public/images/web/runs-board.png diff --git a/docs/images/web/workflow-detail.png b/docs/public/images/web/workflow-detail.png similarity index 100% rename from docs/images/web/workflow-detail.png rename to docs/public/images/web/workflow-detail.png diff --git a/docs/images/web/workflow-diagram.png b/docs/public/images/web/workflow-diagram.png similarity index 100% rename from docs/images/web/workflow-diagram.png rename to docs/public/images/web/workflow-diagram.png diff --git a/docs/images/web/workflow-runs.png b/docs/public/images/web/workflow-runs.png similarity index 100% rename from docs/images/web/workflow-runs.png rename to docs/public/images/web/workflow-runs.png diff --git a/docs/images/web/workflows-list.png b/docs/public/images/web/workflows-list.png similarity index 100% rename from docs/images/web/workflows-list.png rename to docs/public/images/web/workflows-list.png diff --git a/docs/images/workflow-example.png b/docs/public/images/workflow-example.png similarity index 100% rename from docs/images/workflow-example.png rename to docs/public/images/workflow-example.png diff --git a/docs/integrations/brave-search.mdx b/docs/public/integrations/brave-search.mdx similarity index 100% rename from docs/integrations/brave-search.mdx rename to docs/public/integrations/brave-search.mdx diff --git a/docs/integrations/daytona.mdx b/docs/public/integrations/daytona.mdx similarity index 100% rename from docs/integrations/daytona.mdx rename to docs/public/integrations/daytona.mdx diff --git a/docs/integrations/github.mdx b/docs/public/integrations/github.mdx similarity index 100% rename from docs/integrations/github.mdx rename to docs/public/integrations/github.mdx diff --git a/docs/integrations/slack.mdx b/docs/public/integrations/slack.mdx similarity index 100% rename from docs/integrations/slack.mdx rename to docs/public/integrations/slack.mdx diff --git a/docs/languages/dot.json b/docs/public/languages/dot.json similarity index 100% rename from docs/languages/dot.json rename to docs/public/languages/dot.json diff --git a/docs/languages/fabro.json b/docs/public/languages/fabro.json similarity index 100% rename from docs/languages/fabro.json rename to docs/public/languages/fabro.json diff --git a/docs/logo/dark.svg b/docs/public/logo/dark.svg similarity index 100% rename from docs/logo/dark.svg rename to docs/public/logo/dark.svg diff --git a/docs/logo/light.svg b/docs/public/logo/light.svg similarity index 100% rename from docs/logo/light.svg rename to docs/public/logo/light.svg diff --git a/docs/reference/acknowledgements.mdx b/docs/public/reference/acknowledgements.mdx similarity index 100% rename from docs/reference/acknowledgements.mdx rename to docs/public/reference/acknowledgements.mdx diff --git a/docs/reference/architecture.mdx b/docs/public/reference/architecture.mdx similarity index 100% rename from docs/reference/architecture.mdx rename to docs/public/reference/architecture.mdx diff --git a/docs/reference/cli.mdx b/docs/public/reference/cli.mdx similarity index 100% rename from docs/reference/cli.mdx rename to docs/public/reference/cli.mdx diff --git a/docs/reference/dot-language.mdx b/docs/public/reference/dot-language.mdx similarity index 100% rename from docs/reference/dot-language.mdx rename to docs/public/reference/dot-language.mdx diff --git a/docs/reference/run-directory.mdx b/docs/public/reference/run-directory.mdx similarity index 100% rename from docs/reference/run-directory.mdx rename to docs/public/reference/run-directory.mdx diff --git a/docs/reference/sdk.mdx b/docs/public/reference/sdk.mdx similarity index 100% rename from docs/reference/sdk.mdx rename to docs/public/reference/sdk.mdx diff --git a/docs/reference/shell-completions.mdx b/docs/public/reference/shell-completions.mdx similarity index 100% rename from docs/reference/shell-completions.mdx rename to docs/public/reference/shell-completions.mdx diff --git a/docs/reference/user-configuration.mdx b/docs/public/reference/user-configuration.mdx similarity index 100% rename from docs/reference/user-configuration.mdx rename to docs/public/reference/user-configuration.mdx diff --git a/docs/reference/verifying-releases.mdx b/docs/public/reference/verifying-releases.mdx similarity index 100% rename from docs/reference/verifying-releases.mdx rename to docs/public/reference/verifying-releases.mdx diff --git a/docs/tutorials/branch-loop.mdx b/docs/public/tutorials/branch-loop.mdx similarity index 100% rename from docs/tutorials/branch-loop.mdx rename to docs/public/tutorials/branch-loop.mdx diff --git a/docs/tutorials/ensemble.mdx b/docs/public/tutorials/ensemble.mdx similarity index 100% rename from docs/tutorials/ensemble.mdx rename to docs/public/tutorials/ensemble.mdx diff --git a/docs/tutorials/hello-world.mdx b/docs/public/tutorials/hello-world.mdx similarity index 100% rename from docs/tutorials/hello-world.mdx rename to docs/public/tutorials/hello-world.mdx diff --git a/docs/tutorials/multi-model.mdx b/docs/public/tutorials/multi-model.mdx similarity index 100% rename from docs/tutorials/multi-model.mdx rename to docs/public/tutorials/multi-model.mdx diff --git a/docs/tutorials/parallel-review.mdx b/docs/public/tutorials/parallel-review.mdx similarity index 100% rename from docs/tutorials/parallel-review.mdx rename to docs/public/tutorials/parallel-review.mdx diff --git a/docs/tutorials/plan-implement.mdx b/docs/public/tutorials/plan-implement.mdx similarity index 100% rename from docs/tutorials/plan-implement.mdx rename to docs/public/tutorials/plan-implement.mdx diff --git a/docs/tutorials/sub-workflow.mdx b/docs/public/tutorials/sub-workflow.mdx similarity index 100% rename from docs/tutorials/sub-workflow.mdx rename to docs/public/tutorials/sub-workflow.mdx diff --git a/docs/workflows/human-in-the-loop.mdx b/docs/public/workflows/human-in-the-loop.mdx similarity index 100% rename from docs/workflows/human-in-the-loop.mdx rename to docs/public/workflows/human-in-the-loop.mdx diff --git a/docs/workflows/stages-and-nodes.mdx b/docs/public/workflows/stages-and-nodes.mdx similarity index 100% rename from docs/workflows/stages-and-nodes.mdx rename to docs/public/workflows/stages-and-nodes.mdx diff --git a/docs/workflows/stylesheets.mdx b/docs/public/workflows/stylesheets.mdx similarity index 100% rename from docs/workflows/stylesheets.mdx rename to docs/public/workflows/stylesheets.mdx diff --git a/docs/workflows/transitions.mdx b/docs/public/workflows/transitions.mdx similarity index 100% rename from docs/workflows/transitions.mdx rename to docs/public/workflows/transitions.mdx diff --git a/docs/workflows/variables.mdx b/docs/public/workflows/variables.mdx similarity index 100% rename from docs/workflows/variables.mdx rename to docs/public/workflows/variables.mdx diff --git a/lib/crates/fabro-api/build.rs b/lib/crates/fabro-api/build.rs index 5a2c4c42a..3c103b161 100644 --- a/lib/crates/fabro-api/build.rs +++ b/lib/crates/fabro-api/build.rs @@ -132,7 +132,7 @@ fn spec_path_from_manifest_dir(manifest_dir: &Path) -> PathBuf { .ancestors() .nth(3) .expect("fabro-api manifest dir should be nested under /lib/crates/fabro-api") - .join("docs/api-reference/fabro-api.yaml") + .join("docs/public/api-reference/fabro-api.yaml") } fn main() { diff --git a/lib/crates/fabro-dev/src/commands/docs.rs b/lib/crates/fabro-dev/src/commands/docs.rs index b0f9eeb37..91c93810f 100644 --- a/lib/crates/fabro-dev/src/commands/docs.rs +++ b/lib/crates/fabro-dev/src/commands/docs.rs @@ -23,7 +23,7 @@ enum DocsCommand { #[derive(Debug, Args)] struct DocsCommandArgs { - /// Workspace root containing docs/reference. + /// Workspace root containing docs/public/reference. #[arg(long, hide = true)] root: Option, } diff --git a/lib/crates/fabro-dev/src/commands/docs_cli_reference.rs b/lib/crates/fabro-dev/src/commands/docs_cli_reference.rs index 0d8715443..6004cd021 100644 --- a/lib/crates/fabro-dev/src/commands/docs_cli_reference.rs +++ b/lib/crates/fabro-dev/src/commands/docs_cli_reference.rs @@ -6,7 +6,7 @@ use clap::{Arg, ArgAction, Command}; use super::{markdown_cell, replace_generated_region}; -const CLI_REFERENCE_PATH: &str = "docs/reference/cli.mdx"; +const CLI_REFERENCE_PATH: &str = "docs/public/reference/cli.mdx"; const FENCE_START: &str = ""; const FENCE_END: &str = ""; diff --git a/lib/crates/fabro-dev/src/commands/docs_options_reference.rs b/lib/crates/fabro-dev/src/commands/docs_options_reference.rs index 46aa0e9f2..750a98823 100644 --- a/lib/crates/fabro-dev/src/commands/docs_options_reference.rs +++ b/lib/crates/fabro-dev/src/commands/docs_options_reference.rs @@ -6,7 +6,7 @@ use fabro_options_metadata::{OptionField, OptionSet}; use super::{markdown_cell, replace_generated_region}; -const OPTIONS_REFERENCE_PATH: &str = "docs/reference/user-configuration.mdx"; +const OPTIONS_REFERENCE_PATH: &str = "docs/public/reference/user-configuration.mdx"; const FENCE_START: &str = ""; const FENCE_END: &str = ""; diff --git a/lib/crates/fabro-dev/tests/it/docs.rs b/lib/crates/fabro-dev/tests/it/docs.rs index f619d6a4b..6e8aa9060 100644 --- a/lib/crates/fabro-dev/tests/it/docs.rs +++ b/lib/crates/fabro-dev/tests/it/docs.rs @@ -17,7 +17,7 @@ fn docs_check(root: &Path) -> assert_cmd::Command { fn write_reference_fixtures(root: &Path) { write_file( root, - "docs/reference/cli.mdx", + "docs/public/reference/cli.mdx", r"--- title: CLI --- @@ -33,7 +33,7 @@ Tail copy. ); write_file( root, - "docs/reference/user-configuration.mdx", + "docs/public/reference/user-configuration.mdx", r"--- title: Settings --- @@ -56,7 +56,7 @@ fn refresh_updates_both_reference_files() { docs_refresh(fixture.path()).assert().success(); - let cli = read_file(fixture.path(), "docs/reference/cli.mdx"); + let cli = read_file(fixture.path(), "docs/public/reference/cli.mdx"); assert!( cli.contains("Intro copy."), "manual cli intro should be preserved:\n{cli}" @@ -78,7 +78,10 @@ fn refresh_updates_both_reference_files() { "stale cli generated content should be replaced:\n{cli}" ); - let options = read_file(fixture.path(), "docs/reference/user-configuration.mdx"); + let options = read_file( + fixture.path(), + "docs/public/reference/user-configuration.mdx", + ); assert!( options.contains("Settings intro copy."), "manual options intro should be preserved:\n{options}" @@ -129,7 +132,7 @@ fn check_fails_when_either_generated_region_is_stale() { let stderr = output_text(&output.stderr); assert!( - stderr.contains("docs/reference/cli.mdx is stale; run `cargo dev docs refresh`"), + stderr.contains("docs/public/reference/cli.mdx is stale; run `cargo dev docs refresh`"), "check failure should explain how to regenerate docs:\n{stderr}" ); } @@ -140,12 +143,18 @@ fn refresh_is_deterministic() { write_reference_fixtures(fixture.path()); docs_refresh(fixture.path()).assert().success(); - let first_cli = read_file(fixture.path(), "docs/reference/cli.mdx"); - let first_options = read_file(fixture.path(), "docs/reference/user-configuration.mdx"); + let first_cli = read_file(fixture.path(), "docs/public/reference/cli.mdx"); + let first_options = read_file( + fixture.path(), + "docs/public/reference/user-configuration.mdx", + ); docs_refresh(fixture.path()).assert().success(); - let second_cli = read_file(fixture.path(), "docs/reference/cli.mdx"); - let second_options = read_file(fixture.path(), "docs/reference/user-configuration.mdx"); + let second_cli = read_file(fixture.path(), "docs/public/reference/cli.mdx"); + let second_options = read_file( + fixture.path(), + "docs/public/reference/user-configuration.mdx", + ); assert_eq!(first_cli, second_cli); assert_eq!(first_options, second_options); diff --git a/lib/crates/fabro-server/src/server.rs b/lib/crates/fabro-server/src/server.rs index 408c0ebc2..86d440747 100644 --- a/lib/crates/fabro-server/src/server.rs +++ b/lib/crates/fabro-server/src/server.rs @@ -2154,7 +2154,7 @@ async fn run_diagnostics( } async fn openapi_spec() -> Response { - let yaml = include_str!("../../../../docs/api-reference/fabro-api.yaml"); + let yaml = include_str!("../../../../docs/public/api-reference/fabro-api.yaml"); let value: serde_json::Value = serde_yaml::from_str(yaml).expect("embedded OpenAPI YAML is invalid"); Json(value).into_response() diff --git a/lib/crates/fabro-server/tests/it/api/docs.rs b/lib/crates/fabro-server/tests/it/api/docs.rs index 006fe67db..b8a120f82 100644 --- a/lib/crates/fabro-server/tests/it/api/docs.rs +++ b/lib/crates/fabro-server/tests/it/api/docs.rs @@ -2,13 +2,13 @@ use crate::helpers::read_repo_file as read_doc; #[test] fn active_server_docs_describe_the_unix_socket_default() { - let architecture = read_doc("docs/reference/architecture.mdx"); + let architecture = read_doc("docs/public/reference/architecture.mdx"); assert!( architecture.contains("~/.fabro/fabro.sock"), "architecture doc should mention the default Unix socket bind" ); - let api_overview = read_doc("docs/api-reference/overview.mdx"); + let api_overview = read_doc("docs/public/api-reference/overview.mdx"); assert!( api_overview.contains("~/.fabro/fabro.sock"), "API overview should mention the default Unix socket bind" @@ -17,7 +17,7 @@ fn active_server_docs_describe_the_unix_socket_default() { #[test] fn security_doc_does_not_require_jwt_keys_for_the_current_web_flow() { - let security = read_doc("docs/administration/security.mdx"); + let security = read_doc("docs/public/administration/security.mdx"); assert!( security.contains("SESSION_SECRET"), "security doc should still mention the session secret" @@ -34,7 +34,7 @@ fn security_doc_does_not_require_jwt_keys_for_the_current_web_flow() { #[test] fn deploy_server_doc_links_to_the_cli_target_section_slug() { - let deploy_server = read_doc("docs/administration/deploy-server.mdx"); + let deploy_server = read_doc("docs/public/administration/deploy-server.mdx"); assert!( deploy_server.contains("/reference/user-configuration#cli-target-section"), "deploy-server doc should link to the Mintlify slug for the [cli.target] section" @@ -43,7 +43,7 @@ fn deploy_server_doc_links_to_the_cli_target_section_slug() { #[test] fn changelog_marks_removed_mutual_tls_as_historical() { - let changelog = read_doc("docs/changelog/2026-03-03.mdx"); + let changelog = read_doc("docs/public/changelog/2026-03-03.mdx"); assert!( changelog.contains("removed inbound mutual TLS listener support"), "historical changelog should clarify that inbound mutual TLS is no longer supported" @@ -52,7 +52,7 @@ fn changelog_marks_removed_mutual_tls_as_historical() { #[test] fn github_docs_describe_webhooks_as_strategy_dependent() { - let github = read_doc("docs/integrations/github.mdx"); + let github = read_doc("docs/public/integrations/github.mdx"); assert!( !github.contains("enables browser OAuth and webhooks"), "GitHub integration docs should not imply app auth alone enables webhook delivery" @@ -62,7 +62,7 @@ fn github_docs_describe_webhooks_as_strategy_dependent() { "GitHub strategy matrix should describe webhook delivery as strategy-dependent" ); - let server_configuration = read_doc("docs/administration/server-configuration.mdx"); + let server_configuration = read_doc("docs/public/administration/server-configuration.mdx"); assert!( !server_configuration.contains("enables the GitHub App flow, browser OAuth, and webhooks"), "server configuration docs should not imply app auth alone enables webhook delivery" diff --git a/lib/crates/fabro-server/tests/it/openapi_conformance.rs b/lib/crates/fabro-server/tests/it/openapi_conformance.rs index bab9d4c68..8234e3474 100644 --- a/lib/crates/fabro-server/tests/it/openapi_conformance.rs +++ b/lib/crates/fabro-server/tests/it/openapi_conformance.rs @@ -21,7 +21,7 @@ use tower::ServiceExt; use super::helpers::{read_repo_file, test_app_state, test_settings}; fn load_spec() -> Value { - let text = read_repo_file("docs/api-reference/fabro-api.yaml"); + let text = read_repo_file("docs/public/api-reference/fabro-api.yaml"); serde_yaml::from_str(&text).expect("failed to parse spec") } diff --git a/lib/packages/fabro-api-client/package.json b/lib/packages/fabro-api-client/package.json index 8bbbc3421..10194cabf 100644 --- a/lib/packages/fabro-api-client/package.json +++ b/lib/packages/fabro-api-client/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "scripts": { - "generate": "bunx @openapitools/openapi-generator-cli generate -i ../../../docs/api-reference/fabro-api.yaml -g typescript-axios --additional-properties=supportsES6=true,typescriptThreePlus=true,withSeparateModelsAndApi=true,apiPackage=api,modelPackage=models,useTags=true,enumPropertyNaming=UPPERCASE -o src" + "generate": "bunx @openapitools/openapi-generator-cli generate -i ../../../docs/public/api-reference/fabro-api.yaml -g typescript-axios --additional-properties=supportsES6=true,typescriptThreePlus=true,withSeparateModelsAndApi=true,apiPackage=api,modelPackage=models,useTags=true,enumPropertyNaming=UPPERCASE -o src" }, "dependencies": { "axios": "^1.7.0"