Project scan & architecture

KrowForge auto-detects what kind of project you're in and surfaces the structure.

What "scan" does

services/repo_scanner.py walks the project once on load (and again on Refresh) to detect:

  • Languages — file extension census, weighted.
  • Frameworks — Flask, Django, Next.js, React, Vue, Svelte, FastAPI, Rails, Spring, etc. Detected by signature files (requirements.txt, package.json, pom.xml, etc.).
  • Entry pointsmain.py, app.py, server.js, index.html, etc.
  • Build systemmake, npm, cargo, maven, gradle.
  • Test frameworkpytest, jest, mocha, vitest, cargo test, go test.
  • Dependency groups — production vs dev vs test.
  • Sections — heuristic grouping into frontend/, backend/, infra/, docs/, etc.

The Architecture panel

Right side of the workspace, dedicated tab. Sections:

  • Overview — language breakdown, file count, total size.
  • Frameworks — detected frameworks with confidence.
  • Entry points — clickable links into the editor.
  • Build & test — detected commands. "Run tests" / "Build" buttons trigger the shell API.
  • Dependencies — top-level deps, grouped, with versions.
  • Structure — section grouping.

Project Summary

A condensed view at the top of the Overview tab:

  • File count.
  • Language breakdown.
  • Total size on disk.
  • Detected frameworks.
  • Build command.
  • Test command.

Rescan

The top-bar Refresh button (enabled only when a project is loaded) re-runs the full scan: repo_scanner + symbol_indexer + sec_scanner. Use after large external changes (git pull, file imports, etc.).

POST /api/project/rescan is the underlying endpoint.

When detection is wrong

Heuristics aren't perfect. If KrowForge picks the wrong framework (e.g., calls a Vue project React because of stray imports), drop a .krowforge/project.yaml to override:

framework: vue
test_command: pnpm test
build_command: pnpm build
entry_point: src/main.ts

The override file is read on every scan and takes precedence over heuristics.