Skip to content

v9.0.0 — Scripts are TypeScript; bash only for the hooks, the worktree resolvers and the installer

Choose a tag to compare

@Ashkaan Ashkaan released this 01 Oct 00:02
· 10 commits to main since this release

Scripts are TypeScript; bash only for the hooks, the worktree resolvers and the installer

Every script the layer installs is now TypeScript, run by Node as node --experimental-strip-types <file>.ts. Bash stays only where Node cannot run: the two hooks your tools fire on every tool call (and the libraries they source), the scripts that create the worktree a session runs in (write-root.sh with the harness.sh and lock.sh it sources, and setup-worktree.sh), and install.sh, which runs on a machine where nothing else exists yet.

What you need

  • Node 22.6 or later. Everything is run with --experimental-strip-types, which Node 22.6 through 26 accept. On Node 22 you will see Node's own "Type Stripping is an experimental feature" warning; .agents/package.json now declares the layer an ES-module tree, so that is the only one.
  • /qa still assumes Node 22.18 or later.

Upgrading from v8

Re-run the installer. The .sh checks v8 installed in .agents/checks/ are removed while they are still as it installed them; one you edited is kept and named, and nothing runs it any more — carry your change to its .ts successor. If you call a Contextium script by name from your own tooling, change x.sh to node --experimental-strip-types x.ts. Details: docs/update-guide.md § Upgrading to v9.0.0.

Also in this release

  • The installer keeps more of what is yours: an edited file in an old apps/ folder, a root AGENTS.md you wrote under the old generated marker (moved to AGENTS.md.pre-agents), a retired skill folder that is now your own link, and your hooks and Gemini settings on a machine without jq.
  • /close: Codex and Grok worktrees are kept per repository, so two repos never share one; a worktree is never reclaimed for a different repository; a check that ignores its timeout is killed with everything it started; land runs a repo's deploy poller in that repo.
  • /qa: a local Cloudflare app gets its own D1 migrations applied (and an optional qa:seed script) instead of empty tables; a busy port is never taken for a free one on a machine without ss/lsof; --after serves a nested app from its own folder; the visual fallback only accepts a reviewer that proves it saw the screenshots.
  • /implement: a directory scope checks the files in it rather than passing without running; a Makefile make cannot read fails the step instead of skipping it.
  • The checks: check-skills.ts reads YAML block scalars the way the published validator does; check-harness-config-links.ts requires the manifest of every tool recorded in .agents/harness.

Tested

  • The full suite, 2,867 tests, on Node 26 and on Node 22.6; the bash files and their suites under bash 3.2.
  • Live, against a fresh install with a control run for each: Grok Build and Gemini CLI read AGENTS.md, load a skill from .agents/skills, and the host-infra guard blocks; in Claude Code and Codex the guard blocks (Codex once its hooks are trusted). Antigravity was not re-run for this release; its hook manifest is unchanged from v8.0.1, where it was probed live, and the guard scripts it runs are the ones the other four ran.