Run setup from the repo root.
Initialize submodules:
git submodule update --init --recursiveInstall pinned tools:
mise trust mise.toml
mise installAuthenticate Tuist before using cache-backed generation or cache warming:
mise exec -- tuist auth login
mise exec -- tuist auth whoamiGenerate the macOS workspace:
make mac-generateGenerate without external binary cache:
make mac-generate-sourcesWarm the external Tuist cache:
make mac-warm-cacheBuild and run the Debug app:
make mac-build
make mac-runRun checks and tests:
make mac-check
make mac-testRun one test target or method:
xcodebuild test -workspace apps/mac/supaterm.xcworkspace -scheme supaterm -destination "platform=macOS" \
-only-testing:supatermTests/AppFeatureTests \
CODE_SIGNING_ALLOWED=NO CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY="" -skipMacroValidationUse $SUPATERM_CLI_PATH inside Supaterm panes to call the Debug CLI injected by the running app instead of an installed sp:
"$SUPATERM_CLI_PATH" diagnosticUseful diagnostics:
"$SUPATERM_CLI_PATH" instance ls
"$SUPATERM_CLI_PATH" diagnostic --json
"$SUPATERM_CLI_PATH" config validateSupaterm uses Calendar Versioning for public releases: YY.release.patch.
- Use
regularfor the first release of a year and normal feature releases. The first 2026 release after1.3.7is26.0.0; the next regular 2026 release is26.1.0. - Use
hotfixfor patch-only follow-ups within the current release line. A hotfix after26.1.0is26.1.1. MARKETING_VERSIONis the public version shown in the app, changelog, tags, GitHub releases, and Sparkle short version.CURRENT_PROJECT_VERSIONis a private monotonic build number. Stable CI publishesCURRENT_PROJECT_VERSION * 1000; tip CI publishesCURRENT_PROJECT_VERSION * 1000 + github.run_number.
Run stable releases from the repo root:
make bump-and-releasemake mac-run creates disposable state and zmx directories under apps/mac/.build/run-state by default. To reuse a specific development state root:
SUPATERM_RUN_STATE_HOME=/tmp/supaterm-dev make mac-runTo reuse a named development instance and make sp --instance stable:
SUPATERM_RUN_INSTANCE_NAME=supaterm-dev SUPATERM_RUN_STATE_HOME=/tmp/supaterm-dev make mac-runmake mac-run accepts these runtime overrides:
SUPATERM_RUN_IDcontrols the disposable run directory suffix.SUPATERM_RUN_INSTANCE_NAMEbecomesSUPATERM_INSTANCE_NAMEfor the app process.SUPATERM_RUN_STATE_HOMEbecomesSUPATERM_STATE_HOMEfor the app process and spawned panes.SUPATERM_RUN_ZMX_DIRbecomesZMX_DIRfor the app process.
Panes inherit Supaterm context from the running app:
SUPATERM_SOCKET_PATHSUPATERM_CLI_PATHSUPATERM_STATE_HOMEwhen an app state root is configuredSUPATERM_SURFACE_IDSUPATERM_TAB_ID
The app also prepends the bundled CLI directory to pane PATH.
Install dependencies:
make web-installRun checks, tests, and production build:
make web-check
make web-test
make web-buildRun the Vite dev server:
make web-devRun the Cloudflare Worker locally after building:
make web-worker-devDeploy the Worker:
make web-deployTests that exercise polling or timeout behavior should inject a clock and advance it instead of waiting on wall clock time.
In tests, use TestClock from Clocks and call advance(by:) rather than sleeping for a real poll interval or timeout.
When parsing Codex, Claude Code, or any coding-agent integration, inspect real JSONL files, transcript files, or hook payloads before designing parser behavior. Do not infer event shapes from UI text, source names, or assumptions.