🔌 Compatibility Release: Every Living IDE, Verified For Real
v2.1 is a compatibility release — ตรวจจริง ซ่อมจริง ทุก IDE ที่ยังมีชีวิต. Every supported tool was measured against its current version and repaired where reality had moved: Codex was silently truncating our instructions (now slimmed and hard-guarded), Antigravity and the Antigravity CLI (agy) became a first-class target, Cursor 2.4's native subagents are used instead of denied, every non-Claude runtime — including newcomer ZCode (Z.ai) — discovers one shared open-standard .agents/skills/ surface, and Claude Code subagents preload their skills natively.
Changed
- Codex un-truncated — Codex now reads the whole Toh Framework instead of silently dropping 6 of 8 agents. The generated
AGENTS.mdblock shrank from ~117 KB to 12,958 bytes (EN; TH 12,647) — safely under Codex's 32 KiB combined project-doc budget — by replacing embedded agent bodies with a compact roster table plus runtime reads from.toh/agents/and.toh/commands/. A hard assertion now fails the install if the block ever exceeds 24 KiB, and a project-scoped.codex/config.tomlraisesproject_doc_max_bytesto 131,072 (written only when no userconfig.tomlexists). - Antigravity and the Antigravity CLI (
agy) are a first-class target — a new handler emits the workspace.agents/surface: an Always-On rule, 14 workflows (plus a legacy.agent/workflows/mirror), 8 file-based subagents, skills, and a deterministic Stop hook. Legacy.gemini/output survives for Enterprise/GCP users behind the new--legacy-geminiflag (removed from the interactive menu); its 14 TOML commands and settings.json are unchanged from v2.0.0, GEMINI.md differs only in its version line, and the verbatim-copied.gemini/skills/pick up this release's new skill frontmatter. - Cursor 2.4 gets a real agent team — instead of being told "multi-agent features are unavailable here", Cursor now installs all 8 Toh agents as native
.cursor/agents/*.mdsubagents (root-cause-debugger derivesreadonly: truefrom its read-only tools allowlist), the capability profile declaressubagents: native, and the rule prose describes native delegation with the sequential TOH LOOP as the documented fallback. .cursorrulesno longer written by default — the file has vanished from official Cursor docs and duplicated the alwaysApply.mdc; users on very old Cursor versions can keep it via the new--legacy-cursorrulesflag.- Claude Code subagents preload their skills natively — skill loading no longer depends on prose the subagent can skip: the installer passes the native
skillsfrontmatter key through, filtered to skills that actually exist in.claude/skills/(excluding any markeddisable-model-invocation: true). /toh-protectshortcut is now/toh-pt— resolves the long-standing alias collision:/toh-pbelongs solely to/toh-plan./toh-securityand/toh-auditstill work.npm run listreads the live catalog — the stale hardcoded tables are gone; it now parsessrc/frontmatter at runtime and prints the real 14 commands / 8 agents / 23 skills.- Claude Code Stop hook: deliberately unchanged — the flagship "refuses to quit until DONE" prompt hook ships byte-identical to v2.0.0 (owner decision); the new deterministic command-script Stop hook is Antigravity-only.
Added
toh uninstall— the missing counterpart totoh install— until now a user who installed Toh Framework had no supported way to remove it.npx toh-framework uninstallprints a plain-language preview of every file it would remove, keep, or edit, then asks once before touching anything. Safety outranks completeness throughout: files it cannot prove it installed are left in place and named on screen; co-owned files (CLAUDE.md,AGENTS.md,.claude/settings.json,.agents/hooks.json,.codex/config.toml,.cursorrules) are edited surgically — only our marker-delimited block or our<TFW-STOP-HOOK>entry comes out, and an unparseable or unrecognisable file is skipped with a warning instead of rewritten; symlinked paths are never followed; directories are removed only once they are empty..toh/plan.md,.toh/progress.mdand both memory folders are the project's live work, so they are kept by default and deleted only after a separate opt-in (the second question, or--all) — with a copy saved to.toh-uninstall-backup/first. When there is no install record to check against, files matched by name alone are copied to that same backup folder before removal. Flags:--dry-run,-y/--yes,--all,--verbose,-t/--target. Also available asnpm run uninstall:local.- Install inventory (
manifestSchema2) —.toh/manifest.jsonnow records the path, sha256 and pre-install state of every file the installer wrote, plus the directories it created. That record is what lets uninstall tell "our file, untouched" from "our file, edited by you" (kept, never deleted) and from "your file" (never claimed). Reinstalls carry the original pre-existence facts forward, and a file rewritten with identical bytes is still recorded as ours, so an upgrade never produces an under-reporting record. - The project
CLAUDE.mdblock is delimited — the Toh Framework section is now written between<!-- TOH-FRAMEWORK-START -->/<!-- TOH-FRAMEWORK-END -->markers (the same pair Codex already used inAGENTS.md), so it can be lifted out of a file you also write in without touching a byte of your own text. Projects installed before v2.1 have no markers; uninstall recognises our generated text there instead, and backs the file up before editing it. - ZCode (Z.ai) is a supported target — ZCode reads the same open surfaces this release already writes, so support needed no bespoke file format:
AGENTS.mdas project memory (the identical file Codex reads),.agents/skills/for all 37 skills, and the new.agents/commands/for 14 real/toh-*slash commands — a native command surface Codex itself does not offer. This was verified by running ZCode CLI 0.16.3 against an installed project, not inferred from documentation:zcode skills list --jsonreports 37 entries atscope: project,source: agents, andzcode commands list --jsonreports all 14 commands from<project>/.agents/commands, both with an emptydiagnosticsarray. Selecting ZCode alongside Codex writesAGENTS.mdexactly once, in the conservative Codex variant that stays truthful for both runtimes. - Shared
.agents/commands/— real slash commands beyond Claude Code — the same 14 command prompts that ship as skills are now also written as project slash commands, generated from the one TOML source. Runtimes that ignore the directory are unaffected; they still reach every prompt through.agents/skills/toh-*. - Shared
.agents/skills/open standard — one write, four tools — Codex, Cursor 2.4, Antigravity, and ZCode all natively discover Agent Skills from<project>/.agents/skills/, so the installer now generates 37 skills there: 23 thin wrappers over the framework skills plus 14/toh-*command skills (disable-model-invocation: true, so they surface as explicit/commands). Wrapper descriptions are capped at 300 chars so the whole name+description listing (7,383 chars) fits Codex's shared 8,000-char budget; full skill text still lives in.toh/skills/, which every wrapper reads at runtime. - Real slash aliases on Claude Code — typing
/toh-vor/toh-pno longer risks "Unknown command": the installer generates 15 thin alias command files (toh-v,toh-p,toh-pt,toh-security,toh-audit, …) that forward$ARGUMENTSto the real commands. - Frontmatter for all 23 skills — the 13 previously bare SKILL.md files gained spec-compliant YAML frontmatter (keyword-rich third-person descriptions; internal skills marked
user-invocable: false), so auto-invocation now triggers off real descriptions instead of decorated titles. Skill bodies are byte-identical. - Deterministic Antigravity Stop hook —
.agents/hooks.jsonblocks ending a session while.toh/plan.mdstill has unchecked tasks, via a plaingrepcommand script (exit 2 + reason). Strictly additive and idempotent (<TFW-STOP-HOOK>marker); never removes or reorders user hook entries. - New install flags —
--legacy-gemini(Enterprise Gemini CLI.gemini/output) and--legacy-cursorrules(root.cursorrules). - Install only what you use — the IDE picker now starts with Claude Code alone selected instead of three tools pre-ticked, and
--idedefaults toclaudeto match. Picking your own tools takes one keystroke; cleaning up surfaces you never wanted took a support ticket. The picker also dropped its emoji so the five entries read as one plain list.
Fixed
- Codex footer URLs — both EN and TH
AGENTS.mdfooters pointed at the deadgithub.com/ArtificialWeb; nowgithub.com/wasintoh/toh-framework. - ui-builder dead skill paths — the agent body referenced
src/skills/...paths that don't exist in end-user projects; now the IDE-neutral.toh/skills/.... - TH/EN drift in the Cursor rule — the Thai
/toh-vibeCommand→Skills row was missingui-first-builder; now byte-equal to the EN row. - Stale docs and counts —
src/commands/README.mdnow counts all 14 commands (the/toh-protectrow was missing);toh-help.mdnames the current IDE set; web bundles (npm run bundle) drop the v1.0.0-era*starcommands for/toh-*names, and a failed bundle run now exits non-zero. Every generated per-IDE context file and memory seed now states Next.js 16, matchingsrc/templates. - Dead code removed —
bin/toh-npx-wrapper.js(never referenced anywhere) deleted from the package. - Renamed-tool wording — orchestration-protocol now says "the Agent tool (Task)", matching Claude Code ≥ 2.1.178.
Technical
- Counts (from disk): 8 agents / 23 skills / 14 commands — unchanged from 2.0.0. The parallel command surfaces stay in sync at 14 Gemini CLI TOML files (legacy) and 14 Antigravity workflow files.
- Synced IDE surfaces at 2.1.0, verified from a real install:
- Claude Code —
.claude/commands/(14 commands + 15 generated aliases),.claude/agents/(8),.claude/skills/(23), Stop hook in.claude/settings.json(byte-identical to 2.0.0),.claude/loop.md, projectCLAUDE.md(now wrapped in<!-- TOH-FRAMEWORK-START/END -->markers). - Cursor —
.cursor/rules/toh-framework.mdc+toh-agents.mdc, new.cursor/agents/(8 native subagents); root.cursorrulesonly with--legacy-cursorrules. - Antigravity (agy CLI + IDE) —
.agents/rules/toh-framework.md(EN 6,034 chars / TH 5,780; ≤ 12,000 hard assert),.agents/skills/(37),.agents/workflows/(14) + legacy mirror.agent/workflows/(14),.agents/agents/(8,subagent: true),.agents/hooks.json. - Codex — root
AGENTS.mdTOH block 12,958 B EN / 12,647 B TH (24,576 B hard assert) +.codex/config.toml(project_doc_max_bytes = 131072, never overwrites an existing file); also reads the shared.agents/skills/. - Gemini CLI (legacy,
--legacy-gemini) —.gemini/(GEMINI.md, 14 TOML commands, skills, settings.json); the TOML commands and settings.json are byte-identical to 2.0.0 (verified by diffing real installs), GEMINI.md differs only in its embedded version line, and the copied skills differ in 14 SKILL.md files (the new v2.1 frontmatter, plus this release's small orchestration-protocol wording updates).
- Claude Code —
.toh/capabilities.jsonprofiles updated: cursorsubagents: "native"; antigravitysubagents: "file-based",hooks: true,workflows: true. Union semantics are additive — projects installed under v2.0 with gemini keep bothgemini-cliandantigravitydeclared.- Removed
bin/toh-npx-wrapper.js;installer/list.jsrewritten to live-readsrc/. Package tarball: 142 files, ~1.1 MB unpacked (npm pack --dry-run). - New
installer/uninstall.js, lazy-loaded bybin/toh-cli.jslike every other command;installer/install.jsgained a before/after content snapshot of its own surfaces (.toh,.claude,.cursor,.agents,.agent,.codex,.gemini,CLAUDE.md,AGENTS.md,.cursorrules) to build the schema-2 inventory. The snapshot never follows symlinks and never walks the project tree.generateClaudeMd/generateClaudeMdBlockare now exported frominstaller/ide-handlers/claude-code.jsso the uninstaller can recognise our own generated text in pre-2.1 projects. New npm scriptuninstall:local. - package.json: version 2.0.0 → 2.1.0; description and keywords now name Claude Code, Cursor, Antigravity (+ Antigravity CLI), Codex (CLI + desktop app), and ZCode — the dead
geminikeyword dropped;codex,openai-codex,antigravity-cli,agy,agent-skills,zcode,z-aiadded.