Application
Unique directory, name, technologies, optional entrypoint, ecosystem dependency sets, build facts, Python metadata, evidence, and diagnostics.
Implementation complete · 10 July 2026
Kenbun now identifies application boundaries across Python, JavaScript, and TypeScript repositories; understands modern frontend frameworks and five workspace managers; and reports one normalized, platform-neutral schema without executing repository code.
Architecture
The scanner walks once, extracts ecosystem-specific facts, then assembles applications by directory.
Public contract
Selection, deployability, prompting, and runtime command policy stay with consumers.
ScanResult ├─ projects: list[Project] ├─ deploy_targets: list[DeployTarget] ├─ classification: Classification ├─ want_files: list[WantFile] └─ status / input scan(root, target_dir=...) Policy embedded in output └─ recommended: bool
ScanResult ├─ workspace: Workspace | None ├─ applications: list[Application] └─ diagnostics: list[Diagnostic] scan(root, application_dir=...) Facts only ├─ Technology ├─ DependencySet └─ BuildScript
Unique directory, name, technologies, optional entrypoint, ecosystem dependency sets, build facts, Python metadata, evidence, and diagnostics.
Stable name plus kind, primary/supporting role, confidence, and evidence. Vite remains a build tool even when it identifies a standalone app.
One application can carry both Python and Node manifests, managers, locks, declared dependencies, and resolved Python packages.
Detection coverage
FastAPI retains detailed AST resolution. Other frameworks use conservative manifest, config, and script evidence.
FastAPI stays primary; Python, TypeScript, React, Vite, and Cross Inertia attach as supporting facts.
Recursive discovery emits backend FastAPI and frontend Next.js as independent application choices.
External corpus
Twenty clean public repositories live in test-patrick; Cross Inertia is pinned directly to its upstream template.
| Source | Category | Expected result | Revision | Status |
|---|---|---|---|---|
| kenbun-fastapi-basic | Python | FastAPI · main:app | ed740d6 | Pass |
| kenbun-django-basic | Python | Django identity | 0f251b7 | Pass |
| kenbun-flask-basic | Python | Flask identity | 1d56f35 | Pass |
| kenbun-nextjs-basic | Node | Next.js + React + TypeScript | e8fd986 | Pass |
| kenbun-astro-basic | Node | Astro + TypeScript | 6aca222 | Pass |
| kenbun-nuxt-basic | Node | Nuxt + Vue + TypeScript | c2dc8e8 | Pass |
| kenbun-sveltekit-basic | Node | SvelteKit + Svelte + Vite | f3966ac | Pass |
| kenbun-tanstack-start-basic | Node | TanStack Start + React + Vite | 0539925 | Pass |
| kenbun-react-router-basic | Node | React Router Framework Mode | eaaa53d | Pass |
| kenbun-solidstart-basic | Node | SolidStart + Solid | 2d52a02 | Pass |
| kenbun-remix-basic | Node | Legacy Remix + React | acc2752 | Pass |
| kenbun-vite-react-basic | Node | Standalone Vite + React + JavaScript | 9698ba1 | Pass |
| kenbun-vite-boundaries | Boundary | SPA included; Vite library excluded | 2670c8e | Pass |
| kenbun-fullstack-directories | Boundary | FastAPI backend + Next.js frontend | ab1dae1 | Pass |
| kenbun-no-app | Boundary | Libraries produce zero applications | 10f1453 | Pass |
| kenbun-workspace-uv | Workspace | FastAPI + Django + library | b856a62 | Pass |
| kenbun-workspace-npm | Workspace | npm · Next.js + library | a404bb6 | Pass |
| kenbun-workspace-pnpm | Workspace | pnpm · Astro + library | f239edb | Pass |
| kenbun-workspace-yarn | Workspace | Yarn · SvelteKit + library | ec2ce61 | Pass |
| kenbun-workspace-bun | Workspace | Bun · Nuxt + library | 4d3e1d3 | Pass |
| cross-inertia-templates / fastapi-basic | Integration | One FastAPI app + React, Vite, Inertia | 28db570 | Pass |
The runner expands these 21 pinned sources into 29 scenarios by scanning workspace roots, member directories, nested member directories, and both full-stack application hints.
Verification
External fixtures are manual-only; default CI remains deterministic and network-independent.
Zero failing checks in the final consolidated run.
Implementation map
The working tree remains uncommitted so the complete implementation can be reviewed before publishing.
src/model.rsSchema v1 public records and canonical JSON surface.
src/node.rsNode manifests, frameworks, languages, Vite, workspaces, and manager inference.
src/scan.rsPython/Node candidate assembly, same-root merging, technologies, build scripts.
src/workspace.rsuv, Node, mixed, member, nested-member, and upward discovery behavior.
src/fileset.rsDeterministic root-scoped filesystem indexing and exclusions.
src/kenbun/Python exports and exact typed stubs for the new public surface.
tests/test_node_scan.pyFramework, Vite, Inertia, workspace, boundary, and manager regressions.
tests/external_fixtures.jsonCommit-pinned sources, scan variants, and normalized expectations.
scripts/check_external_fixtures.pySafe archive download, cache, extraction, scan, and focused diff runner.
docs/spec.mdNormative schema-v1 contract, behavior, and deferred capabilities.
README.mdUpdated multi-ecosystem usage and supported detection overview.
CHANGELOG.mdUnreleased breaking API and detector additions.