Dev Environment
SABLE is four JavaScript workspaces under one repository, plus a repository-root developer tooling layer that ties them together. This page is the map of what runs where.
Node engine
The repository root pins "engines": { "node": ">=22 <23" }. Use nvm use before anything else —
npm run bootstrap and CI both assume Node 22.
The four workspaces
| Workspace | Path | What it is | Test command |
|---|---|---|---|
| Trigger foundation | sable-agents-demo/ | Trigger.dev tasks, agent source, prompts, skills, docs | npm test (from sable-agents-demo/) |
| Web app | sable-agents-demo/web/ | Static HTML/JS pages plus Vercel serverless functions in api/*.js | npm test (native Node test runner over tests/*.mjs and tests/security/*.test.mjs) |
| Supabase backend | sable-agents-demo/supabase/ | Migrations, Edge Functions, seeds, backend helper tests | npm test |
| Docs site | sable-agents-demo/docs-site/ | This Docusaurus site | npm run build |
Each workspace has its own package.json and lockfile. npm run bootstrap (repository root)
installs all four from their committed lockfiles in one pass; it does not touch secrets or link a
cloud project.
Repository-root developer commands
These live in scripts/developer/ and are invoked from the repository root:
| Command | Purpose |
|---|---|
npm run bootstrap | Install every SABLE workspace from lockfiles. |
npm run doctor | Check runtime, repository state, dependencies, CLIs, and GitHub/Supabase/Vercel access. |
npm run doctor -- --offline | The same checks, skipping calls to cloud services. |
npm run doctor -- --strict | Treat missing optional service access as a failure (useful in CI-like verification). |
npm run setup:gitnexus | Build or refresh the local GitNexus code-intelligence index. Root-only — it does not run from inside sable-agents-demo/. |
npm run doctor:claude | Validate Claude Code, the repo-local skills, MCP configuration, and the destructive-command safety hook. |
npm run doctor:claude -- --offline | The same validation without checking sign-in. |
npm run dev:sable | Start static pages and web/api/*.js together via vercel dev. |
npm run check | The local equivalent of SABLE CI: manifests, tests, typecheck, and docs build. |
npm test | Tests the developer tooling itself (scripts/developer/*.test.mjs). |
You can also run a workspace's own scripts directly without the root wrapper:
npm --prefix sable-agents-demo/web test
npm --prefix sable-agents-demo test
npm --prefix sable-agents-demo/supabase test
npm --prefix sable-agents-demo/docs-site run build
Environment-manager commands
Run from inside sable-agents-demo/ — see Env Manager for the full
picture of what they check:
| Command | Purpose |
|---|---|
npm run env:validate | Validate every env-manifests/*.json file against the manifest schema. |
npm run env:drift | Compare manifests against what each platform actually has configured. |
npm run env:drift:strict | The same check, failing the run on any drift. |
npm run env:drift:portfolio | Drift check scoped to the portfolio/lead-to-cash apps. |
npm run env:bundle | Bundle manifests for distribution/reference. |
npm run env:check | env:validate followed by env:drift:strict — this is what CI's env-manifests job runs. |
Trigger.dev commands
Also from sable-agents-demo/:
| Command | Purpose |
|---|---|
npm run trigger:dev | trigger dev start — runs the Trigger.dev dev server against your tasks. |
npm run trigger:deploy | trigger deploy — deploys tasks (production deploys still go through CI/CD, not a workstation). |
npm run trigger:skills | trigger skills --target codex -y — generates Trigger.dev's Codex-targeted skill files. |
npm run parity:check | Runs scripts/parity/check-parity.mjs, the Cowork-vs-enterprise behavioral parity comparator (needs ANTHROPIC_API_KEY). |
Claude Code sessions
Open sable-agents-demo/ as the project root for an AI-assisted session — that is where
.mcp.json, .claude/settings.json, and CLAUDE.md live together. .mcp.json configures a
Supabase MCP server against project fvngkfrmienkltuwtoxa (hosted, OAuth once) and a GitNexus
server; approve both with /mcp the first time. Opening the repository root or
sable-agents-demo/web/ alone loses this configuration — the root has no .mcp.json at all, and
web/ alone loses the parent directory's safety hook.
CI, for comparison
.github/workflows/sable-ci.yml runs on every PR and every push to main, with jobs that mirror
the local commands above: env-manifests (npm run env:check), web-tests (npm test in
sable-agents-demo/web), and trigger-foundation (npm test in sable-agents-demo), plus the
Supabase helper tests and the docs build. npm run check at the repository root is the closest
local approximation of the whole set; running it before opening a PR catches most CI failures
before they cost a round trip.
Where the code lives
package.json(repository root) — engines, and the developer-tooling script entries.scripts/developer/bootstrap.mjs,doctor.mjs,doctor-claude.mjs,dev-sable.mjs,check.mjs.sable-agents-demo/package.json— Trigger commands andenv:*scripts.sable-agents-demo/web/package.json,sable-agents-demo/supabase/package.json,sable-agents-demo/docs-site/package.json.sable-agents-demo/.mcp.json,sable-agents-demo/.claude/settings.json,sable-agents-demo/.claude/hooks/guard.py..github/workflows/sable-ci.yml.