All template changes must be logged here. See capabilities/general/skills/template-changelog for the rules and entry format.
- Summary:
- ...
- Why:
- ...
- LLM Notes:
- To apply elsewhere: see
- Key files: ...
- Impact:
- None | Minor | Breaking (include steps)
- Summary:
- Replace the root
enginefield withengines.node: ">=24.14.0 <25"and add.nvmrcpinned to24.14.0. - Pin local tooling to Node
24.14.0and pnpm10.32.1indevbox.jsonand refreshdevbox.lock. - Pin CI and the API Docker image to Node
24.14.0, and align Docker Corepack with pnpm10.24.0.
- Replace the root
- Why:
- Floating Node 24 and
latestdevbox packages make local, CI, and container behavior drift over time. - Enforcing one concrete Node baseline catches unsupported runtimes early instead of failing deeper into install or build steps.
- Floating Node 24 and
- LLM Notes:
- Key files:
package.json,.nvmrc,devbox.json,devbox.lock,.github/workflows/ci.yml,apps/backend/api/Dockerfile. - Verification for this commit was run with
devbox run -- bash -lc 'corepack pnpm typecheck'because the repo now rejects non-24.x Node versions throughengines.node.
- Key files:
- Impact:
- Breaking. Local development and CI must use Node
24.14.0or another24.xrelease at or above24.14.0; older Node versions and Node 25+ are rejected bypnpm.
- Breaking. Local development and CI must use Node
- Summary:
- Rewrite aliased source imports from
#footo#/fooand remove.ts/.tsxsuffixes from aliased import sites. - Rename
tsconfigpath aliases andpackage.json#importsentries from#*to#/*across backend, frontend, shared, and mobile packages. - Update the backend Vitest resolver to only intercept
#/...imports within the local API package.
- Rewrite aliased source imports from
- Why:
#/*is the explicit package-import form supported by Node import maps and avoids the ambiguity of matching every#...string.- Keeping alias imports extensionless prevents import-map targets from resolving to doubled suffixes like
.ts.ts.
- LLM Notes:
- Key files:
apps/backend/api/vitest.config.ts,apps/backend/api/package.json,apps/backend/api/tsconfig.json,packages/frontend/web/package.json,apps/frontend/mobile/package.json. - The Vitest plugin now checks
source.startsWith("#/")and strips the#/prefix withslice(2)before resolving intosrc/.
- Key files:
- Impact:
- Breaking. Internal aliased imports must now use
#/..., and package import maps or custom resolvers still expecting#*need the same rename.
- Breaking. Internal aliased imports must now use
- Summary:
- Upgrade the workspace TypeScript catalog from
^5.9.2to6.0.2and refreshpnpm-lock.yaml. - Simplify the shared presets in
packages/shared/config/to the TS 6 baseline and move lib targets toES2025. - Remove stale
baseUrlusage from package tsconfigs and add package-localtypescriptor@types/nodedevDependencies where package-localtscnow relies on them.
- Upgrade the workspace TypeScript catalog from
- Why:
- TS 6 makes the old config baseline noisier than necessary and pushes the repo toward explicit
pathsoverbaseUrl. - Packages invoking
tscdirectly should declare the compiler and node types they depend on instead of relying on root installs or hoisting.
- TS 6 makes the old config baseline noisier than necessary and pushes the repo toward explicit
- LLM Notes:
- Key files:
pnpm-workspace.yaml,pnpm-lock.yaml,packages/shared/config/tsconfig.base.json,packages/shared/config/tsconfig.node.json,packages/shared/config/tsconfig.react.app.json,packages/shared/config/tsconfig.react.node.json. apps/frontend/webandpackages/frontend/testingnow carry local@types/nodebecausetsconfig.react.nodesetstypes: ["node"].
- Key files:
- Impact:
- Minor.
pnpm installis required to gettypescript@6.0.2; current upstream packages still emit peer warnings that expect TypeScript 5.
- Minor.
- Summary:
- Emit
COMPOSE_PROJECT_NAME=template_<branch>ingenerate-worktree-env.shso each worktree/branch gets a unique Docker Compose project name and network (template_<branch>_default). - Rename
.env.ports→.env.worktree,generate-ports.sh→generate-worktree-env.sh,with-ports.sh→with-worktree-env.shto reflect broader purpose.
- Emit
- Why:
- Different projects sharing the same branch name (e.g.
main) produced identical<branch>_defaultnetworks, causing Docker network collisions. - The env file now contains more than just ports (e.g.
COMPOSE_PROJECT_NAME), so the old name was misleading.
- Different projects sharing the same branch name (e.g.
- LLM Notes:
- Key files:
scripts/generate-worktree-env.sh,scripts/with-worktree-env.sh. with-worktree-env.shsources.env.worktreeinto the shell beforeexec, soCOMPOSE_PROJECT_NAMEis automatically available to Docker Compose without any compose.yml changes.
- Key files:
- Impact:
- Breaking. All references to
.env.ports,generate-ports.sh,with-ports.shmust be updated. Existing worktrees should regenerate viascripts/generate-worktree-env.sh.
- Breaking. All references to
- Summary:
- Fix
scripts/check-changelog.sh—git diff-treewith multiple SHAs treated extras as path filters, producing empty output. - Replace single-pipeline
xargsapproach with a per-commit for-loop.
- Fix
- Why:
- The hook silently passed pushes without changelog entries, defeating its purpose.
- LLM Notes:
- Key files:
scripts/check-changelog.sh. git diff-tree -r sha1 sha2 sha3interpretssha2 sha3as path filters, not additional commits.
- Key files:
- Impact:
- None.
- Summary:
- Remove hardcoded ports and URLs from all
.env.examplefiles — apps now compute them from port env vars at startup. - Update
config.ts(API),vite.config.ts(Web), andastro.config.mjs(Landing) to resolve ports fromAPI_PORT,WEB_PORT,LANDING_PORTenv vars with sensible defaults. - Add
globalPassThroughEnvtoturbo.jsonso port vars reach child processes. - Update
justfileto auto-generate.env.portsand export port vars via backtick expressions. - Wrap
pnpm devwithwith-ports.shso ports propagate through turbo to all apps. - Add
strictPort: trueto Vite and Astro configs — prevents silent port bumping that breaks CORS. - Fix
with-ports.shto auto-generate.env.portsif missing. - Fix
db_isready.shto usedocker compose execinstead of fragile container name lookup.
- Remove hardcoded ports and URLs from all
- Why:
- Previous commit added port infrastructure but apps still had hardcoded ports in
.envfiles, defeating port isolation. Now.env.portsis the single source of truth.
- Previous commit added port infrastructure but apps still had hardcoded ports in
- LLM Notes:
- Key files:
apps/backend/api/src/config.ts,apps/frontend/web/vite.config.ts,apps/frontend/landing/astro.config.mjs,turbo.json,justfile,package.json,scripts/with-ports.sh,scripts/db_isready.sh. - Port resolution order: env var (from
.env.portsviawith-ports.shor justfile) >.envfile > built-in default. - Expo mobile is an exception:
EXPO_PUBLIC_API_URLis baked at build time and must stay in.env. turbo.jsonglobalPassThroughEnvis critical — without it, turbo strips env vars from child processes.strictPort: trueis critical — without it, Vite/Astro silently pick another port, causing CORS mismatches with the API.
- Key files:
- Impact:
- Minor.
.env.examplefiles changed; downstream projects should regenerate.envfrom examples and runscripts/generate-ports.sh.
- Minor.
- Summary:
- Add
docs/harness.md— agent harness guide covering skills, subagents, hooks, OMNI.md, model routing, and prompting best practices. - Add
docs/ralph.md— port offset model, Ralph scripts reference, and usage examples.
- Add
- Why:
- Provide reference documentation for writing harness components and using the port isolation / Ralph system.
- LLM Notes:
- Key files:
docs/harness.md,docs/ralph.md. harness.mdis a generic guide (not project-specific).ralph.mdhas this repo's base port table.
- Key files:
- Impact:
- None.
- Summary:
- Add
generate-ports.sh,with-ports.sh, andteardown.shfor port offset management. - Add Ralph orchestration scripts (
setup.sh,start.sh,health-check.sh,teardown.sh). - Update
compose.ymlto use$PG_PORTandjustfileto use$PG_PORTin all Atlas/psql commands. - Add
.env.portsto.gitignore.
- Add
- Why:
- Enable running multiple copies of the stack in parallel via port offsets, and provide Ralph scripts for automated environment lifecycle.
- LLM Notes:
- Key files:
scripts/generate-ports.sh,scripts/with-ports.sh,scripts/ralph/*,compose.yml,justfile. - Base ports: PG=5432, API=8080, WEB=4000, LANDING=4321. Offsets computed from branch name hash.
.envprovides defaultPG_PORT=5432for directjustusage;with-ports.shoverrides from.env.ports.
- Key files:
- Impact:
- Minor.
compose.ymlandjustfilenow requirePG_PORTenv var (provided by.envdefault).
- Minor.
- Summary:
- Add
generate_ports()to worktree setup for automatic per-worktree port generation. - Update cleanup script to require worktree path and refuse to clean main/master.
- Add
check-merge-allowed.shpre-merge guard and updatewt.tomlhooks. - Update worktree docs to reflect port isolation and new scripts.
- Add
- Why:
- Worktrees previously shared ports, preventing simultaneous service execution across branches.
- LLM Notes:
- Key files:
scripts/worktree/setup.sh,scripts/worktree/cleanup.sh,scripts/worktree/check-merge-allowed.sh,.config/wt.toml,docs/worktree.md.
- Key files:
- Impact:
- Minor. Cleanup script now requires a second
<worktree-path>argument.
- Minor. Cleanup script now requires a second
- Summary:
- Add Expo capabilities and a grouped
expocapability set to the default OmniDev profile. - Register Expo capability sources and regenerate the Omni lockfile.
- Add Expo capabilities and a grouped
- Why:
- Include common Expo design, deployment, and upgrade workflows in the template defaults.
- LLM Notes:
- To apply elsewhere: update
omni.toml, then run OmniDev to regenerateomni.lock.toml. - Key files:
omni.toml,omni.lock.toml.
- To apply elsewhere: update
- Impact:
- Minor.
- Summary:
- Add OmniDev config and capability layout for frontend/backend/general.
- Move existing skills into OmniDev capabilities and ignore provider-generated files.
- Add commitlint with a Husky commit-msg hook for conventional commits.
- Document OmniDev in the README.
- Why:
- Standardize AI capability management and enforce consistent commit messages.
- LLM Notes:
- OmniDev config lives in
OMNI.md,omni.toml, andcapabilities/*. - Commitlint is configured in
commitlint.config.cjsand.husky/commit-msg. - README section is under “OmniDev”.
- OmniDev config lives in
- Impact:
- None.
- Summary:
- Add CHANGELOG.md with required entry format.
- Add pre-push enforcement for changelog updates.
- Add a template-changelog skill for LLM guidance.
- Why:
- Track template changes with dates, commits, rationale, and downstream update notes.
- LLM Notes:
- Entry format is in this file and
capabilities/general/skills/template-changelog. - Hook logic lives in
.husky/pre-pushandscripts/check-changelog.sh.
- Entry format is in this file and
- Impact:
- None.