mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-09-05 08:10:39 +00:00
15 KiB
15 KiB
JavaScript/TypeScript cartography proposal
Assessed revision: 2bcf94fed8a9b429f18d9196fa824711d6f4cb0a
Owned scout scope: every tracked file under apps/** and
lib/packages/** at the assessed revision. package.json, bun.lock, and
docs/public/api-reference/fabro-api.yaml were consulted only as dependency
evidence and are not included in the scope counts. Applicable repository
instructions are AGENTS.md (the CLAUDE.md project instructions) and
CONTRIBUTING.md.
Boundary decisions
apps/fabro-webcontains three coherent assessable responsibilities, not just one directory-shaped component:- the normal-mode React application, shared browser runtime, and bundle production;
- the alternate first-run installation mode, with its own route graph, reducer/form lifecycle, session token, API facade, and focused tests;
- the workflow playground subtree, which explicitly defines a standalone prop boundary and owns a browser-persisted workflow draft, graph simulation, chat adapter, and generated project files.
- The marketing site and Remotion project are separate applications. Each has its own package manifest, framework entry point, build command, assets, and output/deployment lifecycle.
- The hand-written Fabro API client generation package is an assessable
component, but its checked-in
src/**tree is generator output and should be excluded from assessment. The distinction and counts are documented below.
Proposed components
fabro-web-app — Fabro browser application
- Purpose: Build and run the normal-mode React SPA for run operations, chats, automations, insights, settings, profiles, and their shared browser infrastructure.
- Tracked files: 309.
- Globs:
apps/fabro-web/** - Exclude globs (assigned to sibling components):
apps/fabro-web/app/components/playground/**,apps/fabro-web/app/install-*,apps/fabro-web/app/mode.ts,apps/fabro-web/app/mode.test.ts,apps/fabro-web/app/hooks/use-install-effects.ts - Entry points:
apps/fabro-web/scripts/build.ts:main,apps/fabro-web/app/entry.tsx,apps/fabro-web/app/router.tsx:routes,apps/fabro-web/index.template.html - Owns: Browser bundle assembly and content-hashed publication under
dist/; the normal-mode route graph; run, chat, automation, insight, settings, and profile UX; shared API/query/mutation/event-stream adapters; app-wide layouts, components, hooks, browser view preferences, and public UI assets. - Depends-on candidates:
fabro-web-install(alternate route graph composed by the browser entry),fabro-workflow-playground(route-level feature composition),fabro-api-client-generation(through its generated package output), and the parent map's server HTTP/API-contract component (likelyfabro-serverand/orfabro-api). - Evidence:
apps/fabro-web/package.json— declares a private React application, custom build/dev commands, browser dependencies, tests, and a workspace dependency on@qltysh/fabro-api-client.apps/fabro-web/scripts/build.ts:main— bundlesapp/entry.tsx, compiles Tailwind CSS, copies public/worker assets, writes the HTML shell, publishes a content-addressed build, and provides the watch lifecycle.apps/fabro-web/app/entry.tsx— creates the React root, browser router, SWR runtime, build-version guard, and toaster, then selects the normal or install route graph.apps/fabro-web/app/router.tsx:routes— explicitly composes the normal-mode route tree for chats, playground, automations, runs, insights, settings, and profile pages beneath the app shell.apps/fabro-web/app/lib/api-client.tsandapps/fabro-web/app/lib/queries.ts— form the browser-side API and query integration boundary used across normal-mode routes.
fabro-web-install — First-run browser installer
- Purpose: Drive the browser-only first-run installation workflow that configures server URL, object storage, sandbox, LLM providers, and GitHub before finishing installation.
- Tracked files: 14.
- Globs:
apps/fabro-web/app/install-*,apps/fabro-web/app/mode.ts,apps/fabro-web/app/mode.test.ts,apps/fabro-web/app/hooks/use-install-effects.ts - Exclude globs: none.
- Entry points:
apps/fabro-web/app/install-router.tsx:installRoutes,apps/fabro-web/app/install-app.tsx:InstallApp,apps/fabro-web/app/mode.ts:resolveFabroMode - Owns: The
installbrowser mode; installation step navigation and form reducer state; install-session query lifecycle; thefabro-install-tokensession-storage value; URL token/GitHub callback consumption; install-specific validation, persistence, finish, and restart health-poll behavior. - Depends-on candidates:
fabro-web-appfor the shared root, common UI, hooks, and browser API transport;fabro-api-client-generationthrough generated Install DTOs/API methods; and the parent map's server installation/API-contract component. - Evidence:
apps/fabro-web/app/entry.tsx— selectsinstallRoutesinstead of the normalrouteswhenwindow.__FABRO_MODE__resolves toinstall.apps/fabro-web/app/install-router.tsx:installRoutes— defines a separate catch-all route graph centered onInstallApp.apps/fabro-web/app/install-app.tsx— owns the seven-step install flow and its installation-specific reducer/form state.apps/fabro-web/app/install-api.ts— wraps generated Install API methods and owns the session-storage token contract.docs/public/api-reference/fabro-api.yaml— dependency evidence outside owned scope: declares theInstalltag as the first-run browser install workflow.
fabro-workflow-playground — Browser workflow playground
- Purpose: Provide a self-contained workflow drafting, simulation, chat, visualization, file-generation, download, and run-launch surface.
- Tracked files: 44.
- Globs:
apps/fabro-web/app/components/playground/** - Exclude globs: none.
- Entry points:
apps/fabro-web/app/components/playground/playground.tsx:Playground - Owns: The
WorkflowDraftgraph schema and reducer; the versionedfabro:playground:draft:v1local-storage document; draft validation and animation; workflow simulation state; canvas rendering; playground chat/SSE adaptation;workflow.fabro, TOML, and README rendering; download and real-run launch controls. - Depends-on candidates:
fabro-web-appfor a small set of shared chat, graph-theme, dynamic-import, event-hook, and test utilities; and the parent map's server component for/api/v1/playground/chatand/api/v1/runs. - Evidence:
apps/fabro-web/app/components/playground/playground.tsx:Playground— exposeschatEndpoint,authMode, and optional redirect props and states that the subtree is framed for re-embedding without the app shell or app-wide stores.apps/fabro-web/app/components/playground/state/draft.ts:WorkflowDraft— defines the complete workflow document and describes it as a self-contained, re-embeddable island.apps/fabro-web/app/components/playground/state/persist.ts:usePlaygroundDraft— owns reducer-driven browser persistence and the versioned storage key.apps/fabro-web/app/components/playground/chat/runtime.ts:createPlaygroundAdapter— adapts chat turns and streamed tool calls into draft changes.apps/fabro-web/app/routes/playground.tsx:PlaygroundRoute— integration evidence in the sibling app component: mounts the feature at/playgroundand supplies its endpoint/auth contract.
fabro-marketing-site — Fabro marketing site
- Purpose: Build and deploy the public Fabro site, including product landing content, blog, roadmap, showcase, install resources, and social metadata/assets.
- Tracked files: 51 assigned; two generated Vercel link files excluded below.
- Globs:
apps/marketing/** - Exclude globs:
apps/marketing/.vercel/** - Entry points:
apps/marketing/astro.config.mjs,apps/marketing/src/pages/index.astro,apps/marketing/src/content.config.ts - Owns: Astro page routing and layout; global marketing presentation; blog, roadmap, and showcase content collections; workflow showcase rendering; public install script/instructions and brand/social assets; public redirects and Vercel deployment configuration.
- Depends-on candidates: none within this scout's assessable components. It has framework dependencies and renders workflow graphs via Viz.js but does not import another repository workspace.
- Evidence:
apps/marketing/package.json— declares an independent private Astro application with dev/build/preview lifecycle.apps/marketing/astro.config.mjs— integrates React/Tailwind and defines public redirects.apps/marketing/src/content.config.ts— defines separately typed roadmap, blog, and showcase content collections whose source documents are owned undersrc/content/**.apps/marketing/src/pages/**— Astro's file-based entries own the landing, roadmap, blog, and showcase URL surfaces.apps/marketing/vercel.json— owns production redirect behavior for the deployed site.
fabro-remotion-video — Fabro Remotion composition
- Purpose: Render the branded
FabroIntromotion-graphics video. - Tracked files: 9.
- Globs:
apps/remotion/** - Exclude globs: none.
- Entry points:
apps/remotion/src/index.ts,apps/remotion/src/Root.tsx:RemotionRoot,apps/remotion/src/FabroIntro.tsx:FabroIntro - Owns: The
FabroIntrocomposition registration, 1920x1080/30fps/150 frame timeline, image-format configuration, logo animation, brand assets, andout/intro.mp4render lifecycle. - Depends-on candidates: none within this scout's assessable components.
- Evidence:
apps/remotion/package.json— declares an independent Remotion project whose studio and render/build scripts target compositionFabroIntro.apps/remotion/src/index.ts— registers the Remotion root.apps/remotion/src/Root.tsx:RemotionRoot— declares the composition ID, component, dimensions, frame rate, and duration.apps/remotion/src/FabroIntro.tsx:FabroIntro— owns the composition's animation timeline and use of the two local public assets.
fabro-api-client-generation — TypeScript API client generation contract
- Purpose: Configure, normalize, and type-check the generated TypeScript/Axios client for the Fabro OpenAPI contract.
- Tracked files: 6 assigned; 554 generated/output files excluded below.
- Globs:
lib/packages/fabro-api-client/package.json,lib/packages/fabro-api-client/openapitools.json,lib/packages/fabro-api-client/scripts/**,lib/packages/fabro-api-client/tests/**,lib/packages/fabro-api-client/tsconfig.json - Exclude globs:
lib/packages/fabro-api-client/src/** - Entry points:
lib/packages/fabro-api-client/package.json:scripts.generate,lib/packages/fabro-api-client/scripts/normalize-generated.ts - Owns: OpenAPI Generator CLI/template options and version selection; output location; deterministic whitespace normalization; strict TypeScript compilation of output; hand-written exhaustiveness/invariant checks for generated discriminated unions and API shapes.
- Depends-on candidates: the parent map's
fabro-api/OpenAPI-contract component, whose source isdocs/public/api-reference/fabro-api.yaml. - Evidence:
lib/packages/fabro-api-client/package.json—generateinvokes pinned OpenAPI Generator CLI2.20.2, reads the repository OpenAPI YAML, selectstypescript-axioswith separate model/API packages and tag-based APIs, writes tosrc, then runs the normalizer.lib/packages/fabro-api-client/openapitools.json— selects generator version7.20.0.lib/packages/fabro-api-client/scripts/normalize-generated.ts— is explicitly hand-written normalization logic and scans exactlysrc/**/*.ts.lib/packages/fabro-api-client/tests/principal-exhaustive.tsandtests/reasoning-output-invariant.ts— hand-written compile-time assertions over generated types.lib/packages/fabro-api-client/tsconfig.json— type-checks bothsrc/**/*andtests/**/*.
Evidence-backed exclusions
Generated TypeScript/Axios client output
- Glob:
lib/packages/fabro-api-client/src/** - Count: 554 tracked files: 551 TypeScript files and three generator
bookkeeping/ignore files
(
.openapi-generator/FILES,.openapi-generator/VERSION, and.openapi-generator-ignore). - Reason/evidence:
- The hand-written package script directs OpenAPI Generator to
-o src. - 550 of the 551 TypeScript files carry the literal header
NOTE: This class is auto generated by OpenAPI GeneratorandDo not edit the class manually. - The only TypeScript file without that header is
src/models/index.ts; it is explicitly named insrc/.openapi-generator/FILES. src/.openapi-generator/FILEScontains 545 generated path entries andsrc/.openapi-generator/VERSIONrecords7.20.0.- Six additional TypeScript files are not in that
FILESsnapshot, but each has the same auto-generation marker:models/daytona-network-layer-one-of-allow-list.ts,models/daytona-network-layer-one-of.ts,models/daytona-network-layer.ts,models/docker-settings.ts,models/run-projection-checkpoints-inner-inner.ts, andmodels/sandbox-provider.ts. - Therefore the stable exclusion is the output-root glob
src/**, not only the metadata's current list or only marker-bearing files.
- The hand-written package script directs OpenAPI Generator to
Vercel CLI link metadata
- Glob:
apps/marketing/.vercel/** - Count: 2 tracked files.
- Reason/evidence:
apps/marketing/.vercel/README.txtstates that the folder is automatically created when linking a directory to a Vercel project, describesproject.jsonas the linked project/team IDs, and says the directory should not be committed/shared. These are generated local deployment-link records rather than marketing-site source.
Computed coverage
| Category | Count |
|---|---|
| Tracked files in owned scope | 989 |
| Assigned to proposed components | 433 |
| Evidence-backed excluded | 556 |
| Unmapped | 0 |
Assigned counts are 309 + 14 + 44 + 51 + 9 + 6 = 433. Excluded counts are
554 + 2 = 556. The total is 433 + 556 + 0 = 989. No file is claimed by
two proposed components.
Open questions
- Should the 14-file first-run installer remain a separate component in the final map? Its alternate route graph, lifecycle, state, and API boundary support the split, but it imports shared web UI/runtime code while the shared browser entry imports its route graph, so source dependencies are reciprocal at composition time.
- Should
apps/fabro-web/app/routes/playground.tsxremain assigned tofabro-web-appas the app-level integration adapter (the proposal here), or move intofabro-workflow-playground? Keeping the 44-file subtree as the playground boundary matches its own standalone/re-embedding contract. - Which final Rust component ID owns
docs/public/api-reference/fabro-api.yamland the server endpoints:fabro-api,fabro-server, or a separately reconciled API-contract component? The JavaScript dependencies above should be renamed to that final ID.