From 6a27b634761b5e0fed1c06f6b0f1183532ea5348 Mon Sep 17 00:00:00 2001 From: t Date: Tue, 13 Oct 2026 08:42:07 -0700 Subject: [PATCH] Describe repository hook setup as detecting harnesses; test that contract Since firstlanding #17487 (CLI 0.50.1), `archdev setup` and `archdev repo hook setup` configure only the coding agents they detect (user config directory exists, or for repository setup the harness's directory is already in the repo), plus ArchDev itself; `--harness ` selects specific ones and `--all-harnesses` prepares every supported harness. The skill still said repository setup prepares Claude Code, Codex, Grok, Pi and ArchDev even before those tools are installed, and the bootstrap scripts asserted all five files after plain `--local`. With the released Rust CLI (v0.52.1) on a clean runner, Codex/Grok/Pi report `absent`, so "Skill bootstrap with the released CLI" and its Windows twin fail on main. - archdev/SKILL.md and references/map.md describe detection, `--harness` and `--all-harnesses` (0.50.1+), and list the Gemini path. - Plugin copies regenerated with tools/plugin-gen `npm run build`. - scripts/test-skill-bootstrap-cli.{sh,ps1} test both commands the skill names: plain `--local` installs only claude and archdev and reports codex/grok/pi absent without creating their directories; `--local --all-harnesses` writes all five files. HOME stays unchanged and no .claude/settings.local.json appears. - Both snapshots ignore .archdev/hooks//queue/, which a background worker drains on its own schedule (1 of 6 runs flaked on it). Co-Authored-By: Claude Opus 5.5 (1M context) --- archdev/SKILL.md | 9 ++++-- archdev/references/map.md | 16 ++++++---- plugins/antigravity/skills/archdev/SKILL.md | 9 ++++-- .../skills/archdev/references/map.md | 16 ++++++---- plugins/claude/skills/archdev/SKILL.md | 9 ++++-- .../claude/skills/archdev/references/map.md | 16 ++++++---- plugins/codex/skills/archdev/SKILL.md | 9 ++++-- .../codex/skills/archdev/references/map.md | 16 ++++++---- plugins/copilot/skills/archdev/SKILL.md | 9 ++++-- .../copilot/skills/archdev/references/map.md | 16 ++++++---- plugins/cursor/skills/archdev/SKILL.md | 9 ++++-- .../cursor/skills/archdev/references/map.md | 16 ++++++---- plugins/grok/skills/archdev/SKILL.md | 9 ++++-- plugins/grok/skills/archdev/references/map.md | 16 ++++++---- plugins/opencode/skills/archdev/SKILL.md | 9 ++++-- .../opencode/skills/archdev/references/map.md | 16 ++++++---- plugins/pi/skills/archdev/SKILL.md | 9 ++++-- plugins/pi/skills/archdev/references/map.md | 16 ++++++---- scripts/test-skill-bootstrap-cli.ps1 | 29 +++++++++++++++-- scripts/test-skill-bootstrap-cli.sh | 31 ++++++++++++++++--- 20 files changed, 198 insertions(+), 87 deletions(-) diff --git a/archdev/SKILL.md b/archdev/SKILL.md index 9576f57..7d50638 100644 --- a/archdev/SKILL.md +++ b/archdev/SKILL.md @@ -77,9 +77,12 @@ not consent; preserve uninstall opt-outs and request permission when needed. | Repository | `"$archdev" repo hook setup --local` | | User-wide | `"$archdev" repo hook setup` | -Repository setup prepares Claude Code, Codex, Grok, Pi, and ArchDev, even -before those tools are installed. User-wide setup detects installed harnesses. -Use `--harness claude codex` only when the user selects particular tools. +Both scopes configure ArchDev and the harnesses they detect: a harness whose +user config directory exists on this machine or, for repository setup, whose +directory is already in the repository. Use `--harness claude codex` only when +the user selects particular tools. To prepare every supported harness in the +repository for teammates who use other tools, add `--all-harnesses` (CLI +0.50.1+). These are first-install commands, not repair commands. Repair existing hooks with `--refresh`, retaining `--local` for repository placement; this preserves personal uninstall opt-outs. Reinstall an opted-out tool only with separate diff --git a/archdev/references/map.md b/archdev/references/map.md index 80d30a8..fd2bed9 100644 --- a/archdev/references/map.md +++ b/archdev/references/map.md @@ -99,12 +99,16 @@ members can read it. Reporting is always on; do not ask about it. "$archdev" repo hook setup --local ``` -This prepares Claude Code, Codex, Grok, Pi, and ArchDev, even if those tools are -not installed yet. It preserves other tools' settings and user-wide hooks. -Claude uses shareable `.claude/settings.json`; the other paths are -`.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, -and `.archdev/hooks.json`. Missing-binary callbacks provide installation -guidance without downloads. Node.js is required for shared JSON callbacks. +This configures ArchDev and the harnesses detected here: a harness whose user +config directory exists on this machine, or whose directory is already in the +repository. It reports the others as absent and preserves other tools' settings +and user-wide hooks. To prepare every supported harness for teammates who use +other tools, add `--all-harnesses` (CLI 0.50.1+); `--harness ` selects +particular ones. Claude uses shareable `.claude/settings.json`; the other paths +are `.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, +`.agents/hooks.json` (Gemini), and `.archdev/hooks.json`. Missing-binary +callbacks provide installation guidance without downloads. Node.js is required +for shared JSON callbacks. Codex and Grok require project trust; never approve it automatically. Reload Pi after installing its extension. Share files only through approved code review, never automatic commits. diff --git a/plugins/antigravity/skills/archdev/SKILL.md b/plugins/antigravity/skills/archdev/SKILL.md index 9576f57..7d50638 100644 --- a/plugins/antigravity/skills/archdev/SKILL.md +++ b/plugins/antigravity/skills/archdev/SKILL.md @@ -77,9 +77,12 @@ not consent; preserve uninstall opt-outs and request permission when needed. | Repository | `"$archdev" repo hook setup --local` | | User-wide | `"$archdev" repo hook setup` | -Repository setup prepares Claude Code, Codex, Grok, Pi, and ArchDev, even -before those tools are installed. User-wide setup detects installed harnesses. -Use `--harness claude codex` only when the user selects particular tools. +Both scopes configure ArchDev and the harnesses they detect: a harness whose +user config directory exists on this machine or, for repository setup, whose +directory is already in the repository. Use `--harness claude codex` only when +the user selects particular tools. To prepare every supported harness in the +repository for teammates who use other tools, add `--all-harnesses` (CLI +0.50.1+). These are first-install commands, not repair commands. Repair existing hooks with `--refresh`, retaining `--local` for repository placement; this preserves personal uninstall opt-outs. Reinstall an opted-out tool only with separate diff --git a/plugins/antigravity/skills/archdev/references/map.md b/plugins/antigravity/skills/archdev/references/map.md index 80d30a8..fd2bed9 100644 --- a/plugins/antigravity/skills/archdev/references/map.md +++ b/plugins/antigravity/skills/archdev/references/map.md @@ -99,12 +99,16 @@ members can read it. Reporting is always on; do not ask about it. "$archdev" repo hook setup --local ``` -This prepares Claude Code, Codex, Grok, Pi, and ArchDev, even if those tools are -not installed yet. It preserves other tools' settings and user-wide hooks. -Claude uses shareable `.claude/settings.json`; the other paths are -`.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, -and `.archdev/hooks.json`. Missing-binary callbacks provide installation -guidance without downloads. Node.js is required for shared JSON callbacks. +This configures ArchDev and the harnesses detected here: a harness whose user +config directory exists on this machine, or whose directory is already in the +repository. It reports the others as absent and preserves other tools' settings +and user-wide hooks. To prepare every supported harness for teammates who use +other tools, add `--all-harnesses` (CLI 0.50.1+); `--harness ` selects +particular ones. Claude uses shareable `.claude/settings.json`; the other paths +are `.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, +`.agents/hooks.json` (Gemini), and `.archdev/hooks.json`. Missing-binary +callbacks provide installation guidance without downloads. Node.js is required +for shared JSON callbacks. Codex and Grok require project trust; never approve it automatically. Reload Pi after installing its extension. Share files only through approved code review, never automatic commits. diff --git a/plugins/claude/skills/archdev/SKILL.md b/plugins/claude/skills/archdev/SKILL.md index 9576f57..7d50638 100644 --- a/plugins/claude/skills/archdev/SKILL.md +++ b/plugins/claude/skills/archdev/SKILL.md @@ -77,9 +77,12 @@ not consent; preserve uninstall opt-outs and request permission when needed. | Repository | `"$archdev" repo hook setup --local` | | User-wide | `"$archdev" repo hook setup` | -Repository setup prepares Claude Code, Codex, Grok, Pi, and ArchDev, even -before those tools are installed. User-wide setup detects installed harnesses. -Use `--harness claude codex` only when the user selects particular tools. +Both scopes configure ArchDev and the harnesses they detect: a harness whose +user config directory exists on this machine or, for repository setup, whose +directory is already in the repository. Use `--harness claude codex` only when +the user selects particular tools. To prepare every supported harness in the +repository for teammates who use other tools, add `--all-harnesses` (CLI +0.50.1+). These are first-install commands, not repair commands. Repair existing hooks with `--refresh`, retaining `--local` for repository placement; this preserves personal uninstall opt-outs. Reinstall an opted-out tool only with separate diff --git a/plugins/claude/skills/archdev/references/map.md b/plugins/claude/skills/archdev/references/map.md index 80d30a8..fd2bed9 100644 --- a/plugins/claude/skills/archdev/references/map.md +++ b/plugins/claude/skills/archdev/references/map.md @@ -99,12 +99,16 @@ members can read it. Reporting is always on; do not ask about it. "$archdev" repo hook setup --local ``` -This prepares Claude Code, Codex, Grok, Pi, and ArchDev, even if those tools are -not installed yet. It preserves other tools' settings and user-wide hooks. -Claude uses shareable `.claude/settings.json`; the other paths are -`.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, -and `.archdev/hooks.json`. Missing-binary callbacks provide installation -guidance without downloads. Node.js is required for shared JSON callbacks. +This configures ArchDev and the harnesses detected here: a harness whose user +config directory exists on this machine, or whose directory is already in the +repository. It reports the others as absent and preserves other tools' settings +and user-wide hooks. To prepare every supported harness for teammates who use +other tools, add `--all-harnesses` (CLI 0.50.1+); `--harness ` selects +particular ones. Claude uses shareable `.claude/settings.json`; the other paths +are `.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, +`.agents/hooks.json` (Gemini), and `.archdev/hooks.json`. Missing-binary +callbacks provide installation guidance without downloads. Node.js is required +for shared JSON callbacks. Codex and Grok require project trust; never approve it automatically. Reload Pi after installing its extension. Share files only through approved code review, never automatic commits. diff --git a/plugins/codex/skills/archdev/SKILL.md b/plugins/codex/skills/archdev/SKILL.md index 9576f57..7d50638 100644 --- a/plugins/codex/skills/archdev/SKILL.md +++ b/plugins/codex/skills/archdev/SKILL.md @@ -77,9 +77,12 @@ not consent; preserve uninstall opt-outs and request permission when needed. | Repository | `"$archdev" repo hook setup --local` | | User-wide | `"$archdev" repo hook setup` | -Repository setup prepares Claude Code, Codex, Grok, Pi, and ArchDev, even -before those tools are installed. User-wide setup detects installed harnesses. -Use `--harness claude codex` only when the user selects particular tools. +Both scopes configure ArchDev and the harnesses they detect: a harness whose +user config directory exists on this machine or, for repository setup, whose +directory is already in the repository. Use `--harness claude codex` only when +the user selects particular tools. To prepare every supported harness in the +repository for teammates who use other tools, add `--all-harnesses` (CLI +0.50.1+). These are first-install commands, not repair commands. Repair existing hooks with `--refresh`, retaining `--local` for repository placement; this preserves personal uninstall opt-outs. Reinstall an opted-out tool only with separate diff --git a/plugins/codex/skills/archdev/references/map.md b/plugins/codex/skills/archdev/references/map.md index 80d30a8..fd2bed9 100644 --- a/plugins/codex/skills/archdev/references/map.md +++ b/plugins/codex/skills/archdev/references/map.md @@ -99,12 +99,16 @@ members can read it. Reporting is always on; do not ask about it. "$archdev" repo hook setup --local ``` -This prepares Claude Code, Codex, Grok, Pi, and ArchDev, even if those tools are -not installed yet. It preserves other tools' settings and user-wide hooks. -Claude uses shareable `.claude/settings.json`; the other paths are -`.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, -and `.archdev/hooks.json`. Missing-binary callbacks provide installation -guidance without downloads. Node.js is required for shared JSON callbacks. +This configures ArchDev and the harnesses detected here: a harness whose user +config directory exists on this machine, or whose directory is already in the +repository. It reports the others as absent and preserves other tools' settings +and user-wide hooks. To prepare every supported harness for teammates who use +other tools, add `--all-harnesses` (CLI 0.50.1+); `--harness ` selects +particular ones. Claude uses shareable `.claude/settings.json`; the other paths +are `.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, +`.agents/hooks.json` (Gemini), and `.archdev/hooks.json`. Missing-binary +callbacks provide installation guidance without downloads. Node.js is required +for shared JSON callbacks. Codex and Grok require project trust; never approve it automatically. Reload Pi after installing its extension. Share files only through approved code review, never automatic commits. diff --git a/plugins/copilot/skills/archdev/SKILL.md b/plugins/copilot/skills/archdev/SKILL.md index 9576f57..7d50638 100644 --- a/plugins/copilot/skills/archdev/SKILL.md +++ b/plugins/copilot/skills/archdev/SKILL.md @@ -77,9 +77,12 @@ not consent; preserve uninstall opt-outs and request permission when needed. | Repository | `"$archdev" repo hook setup --local` | | User-wide | `"$archdev" repo hook setup` | -Repository setup prepares Claude Code, Codex, Grok, Pi, and ArchDev, even -before those tools are installed. User-wide setup detects installed harnesses. -Use `--harness claude codex` only when the user selects particular tools. +Both scopes configure ArchDev and the harnesses they detect: a harness whose +user config directory exists on this machine or, for repository setup, whose +directory is already in the repository. Use `--harness claude codex` only when +the user selects particular tools. To prepare every supported harness in the +repository for teammates who use other tools, add `--all-harnesses` (CLI +0.50.1+). These are first-install commands, not repair commands. Repair existing hooks with `--refresh`, retaining `--local` for repository placement; this preserves personal uninstall opt-outs. Reinstall an opted-out tool only with separate diff --git a/plugins/copilot/skills/archdev/references/map.md b/plugins/copilot/skills/archdev/references/map.md index 80d30a8..fd2bed9 100644 --- a/plugins/copilot/skills/archdev/references/map.md +++ b/plugins/copilot/skills/archdev/references/map.md @@ -99,12 +99,16 @@ members can read it. Reporting is always on; do not ask about it. "$archdev" repo hook setup --local ``` -This prepares Claude Code, Codex, Grok, Pi, and ArchDev, even if those tools are -not installed yet. It preserves other tools' settings and user-wide hooks. -Claude uses shareable `.claude/settings.json`; the other paths are -`.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, -and `.archdev/hooks.json`. Missing-binary callbacks provide installation -guidance without downloads. Node.js is required for shared JSON callbacks. +This configures ArchDev and the harnesses detected here: a harness whose user +config directory exists on this machine, or whose directory is already in the +repository. It reports the others as absent and preserves other tools' settings +and user-wide hooks. To prepare every supported harness for teammates who use +other tools, add `--all-harnesses` (CLI 0.50.1+); `--harness ` selects +particular ones. Claude uses shareable `.claude/settings.json`; the other paths +are `.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, +`.agents/hooks.json` (Gemini), and `.archdev/hooks.json`. Missing-binary +callbacks provide installation guidance without downloads. Node.js is required +for shared JSON callbacks. Codex and Grok require project trust; never approve it automatically. Reload Pi after installing its extension. Share files only through approved code review, never automatic commits. diff --git a/plugins/cursor/skills/archdev/SKILL.md b/plugins/cursor/skills/archdev/SKILL.md index 9576f57..7d50638 100644 --- a/plugins/cursor/skills/archdev/SKILL.md +++ b/plugins/cursor/skills/archdev/SKILL.md @@ -77,9 +77,12 @@ not consent; preserve uninstall opt-outs and request permission when needed. | Repository | `"$archdev" repo hook setup --local` | | User-wide | `"$archdev" repo hook setup` | -Repository setup prepares Claude Code, Codex, Grok, Pi, and ArchDev, even -before those tools are installed. User-wide setup detects installed harnesses. -Use `--harness claude codex` only when the user selects particular tools. +Both scopes configure ArchDev and the harnesses they detect: a harness whose +user config directory exists on this machine or, for repository setup, whose +directory is already in the repository. Use `--harness claude codex` only when +the user selects particular tools. To prepare every supported harness in the +repository for teammates who use other tools, add `--all-harnesses` (CLI +0.50.1+). These are first-install commands, not repair commands. Repair existing hooks with `--refresh`, retaining `--local` for repository placement; this preserves personal uninstall opt-outs. Reinstall an opted-out tool only with separate diff --git a/plugins/cursor/skills/archdev/references/map.md b/plugins/cursor/skills/archdev/references/map.md index 80d30a8..fd2bed9 100644 --- a/plugins/cursor/skills/archdev/references/map.md +++ b/plugins/cursor/skills/archdev/references/map.md @@ -99,12 +99,16 @@ members can read it. Reporting is always on; do not ask about it. "$archdev" repo hook setup --local ``` -This prepares Claude Code, Codex, Grok, Pi, and ArchDev, even if those tools are -not installed yet. It preserves other tools' settings and user-wide hooks. -Claude uses shareable `.claude/settings.json`; the other paths are -`.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, -and `.archdev/hooks.json`. Missing-binary callbacks provide installation -guidance without downloads. Node.js is required for shared JSON callbacks. +This configures ArchDev and the harnesses detected here: a harness whose user +config directory exists on this machine, or whose directory is already in the +repository. It reports the others as absent and preserves other tools' settings +and user-wide hooks. To prepare every supported harness for teammates who use +other tools, add `--all-harnesses` (CLI 0.50.1+); `--harness ` selects +particular ones. Claude uses shareable `.claude/settings.json`; the other paths +are `.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, +`.agents/hooks.json` (Gemini), and `.archdev/hooks.json`. Missing-binary +callbacks provide installation guidance without downloads. Node.js is required +for shared JSON callbacks. Codex and Grok require project trust; never approve it automatically. Reload Pi after installing its extension. Share files only through approved code review, never automatic commits. diff --git a/plugins/grok/skills/archdev/SKILL.md b/plugins/grok/skills/archdev/SKILL.md index 9576f57..7d50638 100644 --- a/plugins/grok/skills/archdev/SKILL.md +++ b/plugins/grok/skills/archdev/SKILL.md @@ -77,9 +77,12 @@ not consent; preserve uninstall opt-outs and request permission when needed. | Repository | `"$archdev" repo hook setup --local` | | User-wide | `"$archdev" repo hook setup` | -Repository setup prepares Claude Code, Codex, Grok, Pi, and ArchDev, even -before those tools are installed. User-wide setup detects installed harnesses. -Use `--harness claude codex` only when the user selects particular tools. +Both scopes configure ArchDev and the harnesses they detect: a harness whose +user config directory exists on this machine or, for repository setup, whose +directory is already in the repository. Use `--harness claude codex` only when +the user selects particular tools. To prepare every supported harness in the +repository for teammates who use other tools, add `--all-harnesses` (CLI +0.50.1+). These are first-install commands, not repair commands. Repair existing hooks with `--refresh`, retaining `--local` for repository placement; this preserves personal uninstall opt-outs. Reinstall an opted-out tool only with separate diff --git a/plugins/grok/skills/archdev/references/map.md b/plugins/grok/skills/archdev/references/map.md index 80d30a8..fd2bed9 100644 --- a/plugins/grok/skills/archdev/references/map.md +++ b/plugins/grok/skills/archdev/references/map.md @@ -99,12 +99,16 @@ members can read it. Reporting is always on; do not ask about it. "$archdev" repo hook setup --local ``` -This prepares Claude Code, Codex, Grok, Pi, and ArchDev, even if those tools are -not installed yet. It preserves other tools' settings and user-wide hooks. -Claude uses shareable `.claude/settings.json`; the other paths are -`.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, -and `.archdev/hooks.json`. Missing-binary callbacks provide installation -guidance without downloads. Node.js is required for shared JSON callbacks. +This configures ArchDev and the harnesses detected here: a harness whose user +config directory exists on this machine, or whose directory is already in the +repository. It reports the others as absent and preserves other tools' settings +and user-wide hooks. To prepare every supported harness for teammates who use +other tools, add `--all-harnesses` (CLI 0.50.1+); `--harness ` selects +particular ones. Claude uses shareable `.claude/settings.json`; the other paths +are `.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, +`.agents/hooks.json` (Gemini), and `.archdev/hooks.json`. Missing-binary +callbacks provide installation guidance without downloads. Node.js is required +for shared JSON callbacks. Codex and Grok require project trust; never approve it automatically. Reload Pi after installing its extension. Share files only through approved code review, never automatic commits. diff --git a/plugins/opencode/skills/archdev/SKILL.md b/plugins/opencode/skills/archdev/SKILL.md index 9576f57..7d50638 100644 --- a/plugins/opencode/skills/archdev/SKILL.md +++ b/plugins/opencode/skills/archdev/SKILL.md @@ -77,9 +77,12 @@ not consent; preserve uninstall opt-outs and request permission when needed. | Repository | `"$archdev" repo hook setup --local` | | User-wide | `"$archdev" repo hook setup` | -Repository setup prepares Claude Code, Codex, Grok, Pi, and ArchDev, even -before those tools are installed. User-wide setup detects installed harnesses. -Use `--harness claude codex` only when the user selects particular tools. +Both scopes configure ArchDev and the harnesses they detect: a harness whose +user config directory exists on this machine or, for repository setup, whose +directory is already in the repository. Use `--harness claude codex` only when +the user selects particular tools. To prepare every supported harness in the +repository for teammates who use other tools, add `--all-harnesses` (CLI +0.50.1+). These are first-install commands, not repair commands. Repair existing hooks with `--refresh`, retaining `--local` for repository placement; this preserves personal uninstall opt-outs. Reinstall an opted-out tool only with separate diff --git a/plugins/opencode/skills/archdev/references/map.md b/plugins/opencode/skills/archdev/references/map.md index 80d30a8..fd2bed9 100644 --- a/plugins/opencode/skills/archdev/references/map.md +++ b/plugins/opencode/skills/archdev/references/map.md @@ -99,12 +99,16 @@ members can read it. Reporting is always on; do not ask about it. "$archdev" repo hook setup --local ``` -This prepares Claude Code, Codex, Grok, Pi, and ArchDev, even if those tools are -not installed yet. It preserves other tools' settings and user-wide hooks. -Claude uses shareable `.claude/settings.json`; the other paths are -`.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, -and `.archdev/hooks.json`. Missing-binary callbacks provide installation -guidance without downloads. Node.js is required for shared JSON callbacks. +This configures ArchDev and the harnesses detected here: a harness whose user +config directory exists on this machine, or whose directory is already in the +repository. It reports the others as absent and preserves other tools' settings +and user-wide hooks. To prepare every supported harness for teammates who use +other tools, add `--all-harnesses` (CLI 0.50.1+); `--harness ` selects +particular ones. Claude uses shareable `.claude/settings.json`; the other paths +are `.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, +`.agents/hooks.json` (Gemini), and `.archdev/hooks.json`. Missing-binary +callbacks provide installation guidance without downloads. Node.js is required +for shared JSON callbacks. Codex and Grok require project trust; never approve it automatically. Reload Pi after installing its extension. Share files only through approved code review, never automatic commits. diff --git a/plugins/pi/skills/archdev/SKILL.md b/plugins/pi/skills/archdev/SKILL.md index 9576f57..7d50638 100644 --- a/plugins/pi/skills/archdev/SKILL.md +++ b/plugins/pi/skills/archdev/SKILL.md @@ -77,9 +77,12 @@ not consent; preserve uninstall opt-outs and request permission when needed. | Repository | `"$archdev" repo hook setup --local` | | User-wide | `"$archdev" repo hook setup` | -Repository setup prepares Claude Code, Codex, Grok, Pi, and ArchDev, even -before those tools are installed. User-wide setup detects installed harnesses. -Use `--harness claude codex` only when the user selects particular tools. +Both scopes configure ArchDev and the harnesses they detect: a harness whose +user config directory exists on this machine or, for repository setup, whose +directory is already in the repository. Use `--harness claude codex` only when +the user selects particular tools. To prepare every supported harness in the +repository for teammates who use other tools, add `--all-harnesses` (CLI +0.50.1+). These are first-install commands, not repair commands. Repair existing hooks with `--refresh`, retaining `--local` for repository placement; this preserves personal uninstall opt-outs. Reinstall an opted-out tool only with separate diff --git a/plugins/pi/skills/archdev/references/map.md b/plugins/pi/skills/archdev/references/map.md index 80d30a8..fd2bed9 100644 --- a/plugins/pi/skills/archdev/references/map.md +++ b/plugins/pi/skills/archdev/references/map.md @@ -99,12 +99,16 @@ members can read it. Reporting is always on; do not ask about it. "$archdev" repo hook setup --local ``` -This prepares Claude Code, Codex, Grok, Pi, and ArchDev, even if those tools are -not installed yet. It preserves other tools' settings and user-wide hooks. -Claude uses shareable `.claude/settings.json`; the other paths are -`.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, -and `.archdev/hooks.json`. Missing-binary callbacks provide installation -guidance without downloads. Node.js is required for shared JSON callbacks. +This configures ArchDev and the harnesses detected here: a harness whose user +config directory exists on this machine, or whose directory is already in the +repository. It reports the others as absent and preserves other tools' settings +and user-wide hooks. To prepare every supported harness for teammates who use +other tools, add `--all-harnesses` (CLI 0.50.1+); `--harness ` selects +particular ones. Claude uses shareable `.claude/settings.json`; the other paths +are `.codex/hooks.json`, `.grok/hooks/archdev.json`, `.pi/extensions/archdev.js`, +`.agents/hooks.json` (Gemini), and `.archdev/hooks.json`. Missing-binary +callbacks provide installation guidance without downloads. Node.js is required +for shared JSON callbacks. Codex and Grok require project trust; never approve it automatically. Reload Pi after installing its extension. Share files only through approved code review, never automatic commits. diff --git a/scripts/test-skill-bootstrap-cli.ps1 b/scripts/test-skill-bootstrap-cli.ps1 index 3b6f547..032a16c 100644 --- a/scripts/test-skill-bootstrap-cli.ps1 +++ b/scripts/test-skill-bootstrap-cli.ps1 @@ -20,7 +20,9 @@ function Assert-Proof([bool]$Condition, [string]$Message) { function Snapshot([string]$Root) { return ((Get-ChildItem -LiteralPath $Root -File -Recurse -Force | Sort-Object FullName | ForEach-Object { $relative = $_.FullName.Substring($Root.Length + 1) - if ($relative -notmatch '^(\.archdev[\\/]logs|\.cache[\\/]archdev)[\\/]') { + # Logs, caches and the hook event queue (drained by a background + # worker on its own schedule) are process state, not configuration. + if ($relative -notmatch '^(\.archdev[\\/]logs|\.cache[\\/]archdev|\.archdev[\\/]hooks[\\/][^\\/]+[\\/]queue)[\\/]') { "$relative $((Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256).Hash)" } }) -join "`n") @@ -89,12 +91,35 @@ try { } # Explicit repository/reporting approval crosses the real CLI boundary. - & $binary repo hook setup --local + # Plain repository setup configures the harnesses it detects: Claude, + # whose config directory exists in this HOME, and ArchDev. + $detected = (& $binary --json repo hook setup --local | Out-String) | ConvertFrom-Json Assert-Proof ($LASTEXITCODE -eq 0) "Repository setup failed" Assert-Proof ((Snapshot $homeDir) -eq $before) "Repository setup changed personal configuration" + $status = @{} + foreach ($outcome in $detected.harnesses) { $status[$outcome.harness] = $outcome.status } + foreach ($harness in @('claude', 'archdev')) { + Assert-Proof ($status[$harness] -eq 'installed') "Detected harness $harness was not installed" + } + foreach ($harness in @('codex', 'grok', 'pi')) { + Assert-Proof ($status[$harness] -eq 'absent') "Undetected harness $harness was not reported absent" + } + foreach ($file in @('.claude/settings.json', '.archdev/hooks.json')) { + Assert-Proof (Test-Path (Join-Path $checkout $file)) "Missing shared hook $file" + } + foreach ($dir in @('.codex', '.grok', '.pi', '.agents')) { + Assert-Proof (-not (Test-Path (Join-Path $checkout $dir))) "Undetected harness wrote $dir" + } + + # Teammates may use agents this machine lacks. --all-harnesses + # prepares every supported harness, still without personal files. + & $binary repo hook setup --local --all-harnesses + Assert-Proof ($LASTEXITCODE -eq 0) "Repository setup for all harnesses failed" + Assert-Proof ((Snapshot $homeDir) -eq $before) "Repository setup changed personal configuration" foreach ($file in @('.claude/settings.json', '.codex/hooks.json', '.grok/hooks/archdev.json', '.pi/extensions/archdev.js', '.archdev/hooks.json')) { Assert-Proof (Test-Path (Join-Path $checkout $file)) "Missing shared hook $file" } + Assert-Proof (-not (Test-Path (Join-Path $checkout '.claude/settings.local.json'))) "Repository setup wrote personal Claude settings" $settings = Get-Content (Join-Path $checkout '.claude/settings.json') -Raw | ConvertFrom-Json $command = @($settings.hooks.SessionStart | ForEach-Object { $_.hooks } | Where-Object { $_.command -match 'archdev repo hook ' })[0].command $payload = @{ hook_event_name = 'SessionStart'; source = 'startup'; cwd = $checkout } | ConvertTo-Json -Compress diff --git a/scripts/test-skill-bootstrap-cli.sh b/scripts/test-skill-bootstrap-cli.sh index 815490e..e77bf56 100755 --- a/scripts/test-skill-bootstrap-cli.sh +++ b/scripts/test-skill-bootstrap-cli.sh @@ -2,7 +2,7 @@ # Canonical proof: an agent resolves ArchDev without configuring hooks, then # applies only an explicitly chosen placement. Real CLI and shell callbacks; # no coding-agent trust or browser authentication is simulated as verified. -# Usage: scripts/test-skill-bootstrap-cli.sh (ArchDev 0.47.0+ and Node on PATH) +# Usage: scripts/test-skill-bootstrap-cli.sh (ArchDev 0.50.1+ and Node on PATH) set -euo pipefail repo="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" @@ -31,6 +31,10 @@ for path in sorted(root.rglob('*')): # Process logs/cache/crash records are not hook or user configuration. if relative.parts[:2] in [('.archdev', 'logs'), ('.cache', 'archdev')]: continue + # Nor is the hook event queue, which a background worker drains on its + # own schedule after an installed callback runs. + if relative.parts[:2] == ('.archdev', 'hooks') and relative.parts[3:4] == ('queue',): + continue if path.is_file(): print(relative, hashlib.sha256(path.read_bytes()).hexdigest()) PY @@ -65,14 +69,33 @@ printf 'ok core and Tasks resolve the real CLI without changing personal confi # The agent has received explicit repository/reporting consent. Cross the real # CLI process boundary into the isolated Git fixture; only shareable project -# files may be written. -(cd "$checkout" && in_home archdev repo hook setup --local) +# files may be written. Plain repository setup configures the harnesses it +# detects: Claude, whose config directory exists in this HOME, and ArchDev. +detected="$(cd "$checkout" && in_home archdev --json repo hook setup --local)" +[[ "$(snapshot "$home")" == "$before" ]] +for file in .claude/settings.json .archdev/hooks.json; do + [[ -f "$checkout/$file" ]] +done +for dir in .codex .grok .pi .agents; do + [[ ! -e "$checkout/$dir" ]] +done +python3 - "$detected" <<'PY' +import json, sys +status = {h['harness']: h['status'] for h in json.loads(sys.argv[1])['harnesses']} +assert status['claude'] == status['archdev'] == 'installed', status +assert all(status[h] == 'absent' for h in ('codex', 'grok', 'pi')), status +PY +printf 'ok approved repository placement configures detected harnesses and reports the rest absent\n' + +# Teammates may use agents this machine lacks. --all-harnesses prepares every +# supported harness in the repository, still without touching personal files. +(cd "$checkout" && in_home archdev repo hook setup --local --all-harnesses) [[ "$(snapshot "$home")" == "$before" ]] for file in .claude/settings.json .codex/hooks.json .grok/hooks/archdev.json .pi/extensions/archdev.js .archdev/hooks.json; do [[ -f "$checkout/$file" ]] done [[ ! -e "$checkout/.claude/settings.local.json" ]] -printf 'ok approved repository placement prepares all five harnesses and leaves personal settings alone\n' +printf 'ok --all-harnesses prepares all five harnesses and leaves personal settings alone\n' # Run the actual installed Claude callback as a harness would. The binary is # present; its existing workflow contract must survive the shared launcher.