baseline / docs
friedbotstudio/baseline

Getting started

Install.

The baseline is a repository overlay materialized by npx @friedbotstudio/create-baseline <target>. Four sentinel paths land in the target project; nothing else is touched. Node 18.17 or later is the only hard requirement.

Four sentinel paths drop into the target project on install. ~/your-project .claude/ CLAUDE.md .mcp.json docs/init/seed.md one command · four sentinel paths

v0.4 · Apache 2.0 · open source

§ I

Requirements

Everything the baseline needs from your environment before it can install. Two of the rows below are optional.

RequirementWhy
Node ≥ 18.17The CLI uses node:util.parseArgs with strict mode, available from this version.
npx on $PATHThe canonical invocation. npm exec @friedbotstudio/create-baseline works too.
A target directoryAn existing project root, or an empty directory you intend to populate. The CLI does not mkdir for you.
Git (optional)Without git, the workflow ends at /archive. Phase 11 auto-excepts, including /grant-commit, the ship-pair sub-step changelog at 11.5, and commit at 11. See /swarm-dispatch for the worktree-isolation case.
Java (optional)Required only if you want PlantUML diagrams rendered at /spec-render time. The install fetches a 19 MB sha-pinned jar; you supply the JVM. See CLI · PlantUML jar.

§ II

One command

From the parent of your target, or anywhere with npx available:

~/code · zsh
# preview without writing anything
$ npx @friedbotstudio/create-baseline ./my-project --dry-run

# the real thing
$ npx @friedbotstudio/create-baseline ./my-project
# → Installed manifest version 1 to /Users/you/code/my-project.
# → Pin via "@friedbotstudio/create-baseline@<exact-version>" in your bootstrap docs.

The first run takes 5 to 30 seconds, dominated by the PlantUML jar fetch (~19 MB, sha256-pinned). Subsequent runs reuse the cached jar.

Pin the version in your bootstrap docs.

The baseline changes between releases. Teams sharing a repository should pin to a specific @friedbotstudio/create-baseline@<version> so every install of the repo gets the same hooks, skills, and constitution. Running npx @friedbotstudio/create-baseline upgrade ./project at a newer version reconciles the target against the new template; in a TTY each customised file becomes an interactive prompt, and in CI the prior batch-merge semantics apply (see CLI · Modes).

§ III

What lands

Four sentinel paths plus a small set of vendored bins. Nothing else in your project is touched. The CLI refuses to run if any sentinel is already present, unless you pass --force or use the upgrade subcommand.

PathRole
.claude/22 hooks, 36 skills, 5 consent commands, 1 subagent, memory schemas, project.json, settings.json.
CLAUDE.mdIn-session constitution. Binds Claude's behavior in this repository.
.mcp.jsonThe three baseline MCP servers: context7, plantuml, playwright.
docs/init/seed.mdGenesis prompt. The governing specification of the baseline.
.claude/bin/LICENSE, NOTICEApache 2.0 license + provenance for the side-fetched PlantUML jar.
.claude/bin/plantuml.jarSide-fetched at install time, sha256-pinned, ~19 MB. Skipped if plantuml is already on $PATH.
.claude/.baseline-manifest.jsonThe hash table the CLI writes after install. Used by the upgrade subcommand to do a three-way reconcile on the next install.

If your project has an existing .mcp.json, the install performs an additive merge: the three baseline servers are added (or refreshed); your user-added servers are preserved byte-for-byte. See CLI · .mcp.json merge semantics.

The CLI itself ships one pinned runtime dependency, @clack/prompts, which supplies the prompt primitives behind the branded TTY flows. Everything else it needs is Node stdlib and the contents of the npm tarball; the dependency stays in the CLI and never lands in your project.

§ IV

After install

The baseline runs in project-agnostic mode immediately. Hooks are active. test_runner and lint_runner emit guidance only until tailored.

  1. Open the project in Claude Code. The SessionStart hook injects the memory index. Claude greets you with the project-agnostic banner.
  2. Run /init-project. Claude scouts the codebase, runs the recommender, proposes a tailored project.json (test command, lint command, TDD source globs, destructive patterns, optional MCP servers and skills, optional stack skills for swarm-worker), and writes it after you approve. The configured flag flips to true.
  3. Restart Claude Code. The session re-reads project.json; the runner hooks switch from guide mode to enforcement.
  4. Run your first /triage "<request>". Or /harness to drive the full intake-to-commit pipeline.

Until /init-project runs, you can still use every phase. You just won't have stack-specific tailoring. Project-agnostic mode is a sanctioned operating state, not a partial install.

§ V

Recover from a bad install

Three paths back to a clean baseline. Each is read-and-write safe: the CLI never silently overwrites user customizations.

SituationCommandEffect
Half-installed baseline npx @friedbotstudio/create-baseline ./project --force Refuses unless you type overwrite. Replaces every baseline file except .claude/project.json (preserved).
Upgrade to a newer baseline npx @friedbotstudio/create-baseline upgrade ./project Three-way merge against the last install's manifest. In a TTY, each customised file becomes a keep-mine / take-theirs / abort prompt. In CI, untouched files refresh, customizations are preserved (exit 3 if any), and removed-upstream files prune when you had not touched them.
Suspect drift npx @friedbotstudio/create-baseline doctor ./project Read-only. Reports matched / customized / missing / added. Exit 0 if clean, 1 if any baseline file is missing, 2 if no manifest is present.

For the full semantics of each mode, every flag, every exit code, and the doctor drift report categories, see the CLI reference.