Skip to content

Dev loop

The local dev loop is three commands once your toolchain is in place. This page covers the toolchain pins, the full mise task catalogue, and when to reach for the long-running check:full and acceptance targets.

ToolVersionHow it gets installed
Node22 (CI also tests 24)mise.toml — matches root engines.node
pnpm10.x (lockfile generated by 10.33.2)mise.toml + packageManager field
Python3.12mise.toml — auxiliary tooling only
uvlatestmise.toml — Python package manager

You do not need pyenv, nvm, direnv, or a hand-rolled venv. mise activates tools and environment variables when you cd into the repo.

Daily loop
mise install # once per machine or after mise.toml changes
pnpm install --frozen-lockfile # once per pnpm-lock.yaml change
mise run check # every time you want to know if your branch is green

mise run check runs lint, typecheck, test, and the banned-strings sweep in a single chain and stops on the first failure. The equivalent pnpm run check is wired to the same task.

Run one gate at a time when you want a faster loop:

Terminal window
mise run lint # Biome check across packages/**/src, packages/**/test, scripts
mise run typecheck # tsc --noEmit across every workspace package
mise run test # pnpm -r test (each package's `test` script)
mise run banned-strings # scripts/check-banned-strings.sh
Terminal window
mise run check:full # check + licenses + osv
mise run acceptance # v1 Definition-of-Done gates
mise run smoke:mcp # boot MCP server over stdio, assert tools/list

check:full adds the license allowlist (license-checker-rseidelsohn) and the osv-scanner vulnerability scan against pnpm-lock.yaml. CI runs both on every PR.

acceptance is the full v1.0 Definition-of-Done. Some gates are soft — they log but do not block — because they depend on optional binaries (semgrep, embedder weights) or measure timings on the local machine.

Every task in mise.toml:

TaskPurpose
installpnpm install --frozen-lockfile
install:updatepnpm install — allows the lockfile to update
bootstrapinstall
buildpnpm -r build across every package
build:cliBuild only @opencodehub/cli
build:cleanClean + full rebuild
cleanpnpm -r clean
clean:allClean + delete node_modules everywhere
cli:linkpnpm link --global — expose codehub system-wide for dev
cli:unlinkReverse of cli:link
cli:packProduce a distributable tarball of the CLI
cli:install-globalInstall the packed tarball globally with pnpm
cli:uninstall-globalRemove the globally installed codehub
testpnpm -r test
lintbiome check .
lint:fixbiome check --write .
formatbiome format --write .
typecheckpnpm -r exec tsc --noEmit
banned-stringsscripts/check-banned-strings.sh
licensesLicense allowlist check (prod deps, private packages excluded)
osvosv-scanner scan source --lockfile pnpm-lock.yaml
sarif:validateValidate emitted SARIF against the Zod schema
checklint + typecheck + test + banned-strings
check:fullcheck + licenses + osv
acceptancev1 Definition-of-Done gates (scripts/acceptance.sh)
smoke:mcpBoot the MCP server over stdio and assert tools/list
commitCommitizen-guided Conventional Commit prompt
envinfoPrint tool versions for bug reports
analyzecodehub analyze against the current repo
statuscodehub status
mcpStart the stdio MCP server

lefthook install (run once after pnpm install) wires three hooks:

HookRuns
pre-commitBiome autofix on staged .ts/.tsx/.js/.jsx/.json/.jsonc + banned-strings sweep
commit-msgcommitlint --edit on the draft message
pre-pushtsc --noEmit across packages + pnpm -r test

The pre-push hook is the last safety net before CI picks up your branch. If it fails on a supposedly-unrelated test, see Tenets: we fix it, we do not skip it.

Before opening a PR that touches any of:

  • The analyze pipeline (packages/ingestion, packages/analysis).
  • Storage (packages/storage).
  • The MCP server (packages/mcp).
  • The graph-hash contract (anything that could affect determinism).
  • scripts/check-banned-strings.sh or the CI workflows.

Otherwise mise run check is enough locally; CI will run the full matrix.