diff --git a/README.md b/README.md index 21db9cc2..21c4b464 100644 --- a/README.md +++ b/README.md @@ -156,7 +156,7 @@ $ gx ● oh-my-codex active ● oh-my-claude-sisyphus active ● @fission-ai/openspec active - ● cavemem active + ● colony active ● cavekit optional · not installed ● gh authenticated @@ -320,7 +320,7 @@ Install repo skills with `npx skills add recodee/gitguardex`; `npx skills add re | [**oh-my-codex**](https://github.com/Yeachan-Heo/oh-my-codex) — `npm i -g oh-my-codex` | Codex config + skills framework. Merged into every agent worktree so each spawned Codex starts with the same tuned config. | [![stars](https://img.shields.io/github/stars/Yeachan-Heo/oh-my-codex?style=social)](https://github.com/Yeachan-Heo/oh-my-codex) | | [**oh-my-claudecode**](https://github.com/Yeachan-Heo/oh-my-claudecode) — `npm i -g oh-my-claude-sisyphus@latest` | Claude-side mirror of oh-my-codex. Skills, commands, and defaults for every Claude Code session. | [![stars](https://img.shields.io/github/stars/Yeachan-Heo/oh-my-claudecode?style=social)](https://github.com/Yeachan-Heo/oh-my-claudecode) | | [**OpenSpec**](https://github.com/Fission-AI/OpenSpec) — `npm i -g @fission-ai/openspec` | Structured plan / change / apply / archive flow so long agent runs don't drift off-task. | [![stars](https://img.shields.io/github/stars/Fission-AI/OpenSpec?style=social)](https://github.com/Fission-AI/OpenSpec) | -| [**cavemem**](https://github.com/JuliusBrussee/cavemem) — `npm i -g cavemem` | Local persistent memory for agents via SQLite + MCP. Retains compressed history across runs. | [![stars](https://img.shields.io/github/stars/JuliusBrussee/cavemem?style=social)](https://github.com/JuliusBrussee/cavemem) | +| [**Colony**](https://github.com/recodeee/colony) — `npm i -g @imdeadpool/colony-cli` | Multi-agent task coordination and handoff routing. After install, register runtimes with `colony install --ide codex`, `colony install --ide claude-code`, `colony install --ide cursor`, `colony install --ide gemini-cli`, or `colony install --ide opencode`, then verify with `colony status`. | [![stars](https://img.shields.io/github/stars/recodeee/colony?style=social)](https://github.com/recodeee/colony) | | [**cavekit**](https://github.com/JuliusBrussee/cavekit) — `npx skills add JuliusBrussee/cavekit` | Spec-driven build loop with `spec`, `build`, `check`, `caveman`, `backprop` skills bundled in. | [![stars](https://img.shields.io/github/stars/JuliusBrussee/cavekit?style=social)](https://github.com/JuliusBrussee/cavekit) | | [**caveman**](https://github.com/JuliusBrussee/caveman) — `npx skills add JuliusBrussee/caveman` | Ultra-compressed response mode for Claude / Codex. Less output-token churn on long reviews and debug loops. | [![stars](https://img.shields.io/github/stars/JuliusBrussee/caveman?style=social)](https://github.com/JuliusBrussee/caveman) | | [**codex-account-switcher**](https://github.com/recodeecom/codex-account-switcher-cli) — `npm i -g @imdeadpool/codex-account-switcher` | Multi-identity Codex account switcher. Auto-registers accounts on `codex login`; switch with one command. | [![stars](https://img.shields.io/github/stars/recodeecom/codex-account-switcher-cli?style=social)](https://github.com/recodeecom/codex-account-switcher-cli) | diff --git a/docs/images/workflow-gx-terminal-status.svg b/docs/images/workflow-gx-terminal-status.svg index bf402d9c..309d42ac 100644 --- a/docs/images/workflow-gx-terminal-status.svg +++ b/docs/images/workflow-gx-terminal-status.svg @@ -30,7 +30,7 @@ @fission-ai/openspec: active - - cavemem: active + colony: active - @imdeadpool/codex-account-switcher: active diff --git a/openspec/changes/agent-codex-replace-cavemem-with-colony-companion-2026-04-28-20-34/proposal.md b/openspec/changes/agent-codex-replace-cavemem-with-colony-companion-2026-04-28-20-34/proposal.md new file mode 100644 index 00000000..01cfc24d --- /dev/null +++ b/openspec/changes/agent-codex-replace-cavemem-with-colony-companion-2026-04-28-20-34/proposal.md @@ -0,0 +1,17 @@ +## Why + +- Guardex currently prompts for `cavemem` as a global companion, but the active coordination direction is Colony-first. +- Users should see and install the Colony CLI from Guardex setup/status surfaces instead of being prompted for the older cavemem memory tool. +- README companion guidance should include the Colony runtime registration commands and `colony status` check. + +## What Changes + +- Replace the global companion package mapping from `cavemem` to `@imdeadpool/colony-cli`, displayed as `colony`. +- Update setup/status regression fixtures so missing companion prompts install `@imdeadpool/colony-cli`. +- Update README companion examples to show `colony`, `npm i -g @imdeadpool/colony-cli`, `colony install --ide ...`, and `colony status`. + +## Impact + +- `gx` and `gx setup` stop asking users to install `cavemem`. +- Colony becomes the detected global companion for multi-agent coordination. +- Existing cavekit/caveman optional local companion handling is unchanged. diff --git a/openspec/changes/agent-codex-replace-cavemem-with-colony-companion-2026-04-28-20-34/specs/companion-tooling/spec.md b/openspec/changes/agent-codex-replace-cavemem-with-colony-companion-2026-04-28-20-34/specs/companion-tooling/spec.md new file mode 100644 index 00000000..1e64962e --- /dev/null +++ b/openspec/changes/agent-codex-replace-cavemem-with-colony-companion-2026-04-28-20-34/specs/companion-tooling/spec.md @@ -0,0 +1,30 @@ +## ADDED Requirements + +### Requirement: Colony replaces cavemem as the global coordination companion + +Guardex SHALL detect and prompt for the Colony CLI package `@imdeadpool/colony-cli` as the global multi-agent coordination companion instead of `cavemem`. + +#### Scenario: `gx status --json` reports the Colony companion + +- **WHEN** the user runs `gx status --json` +- **THEN** the `services` array contains an entry named `colony` +- **AND** that entry exposes `packageName` as `@imdeadpool/colony-cli` +- **AND** the services array does not require a `cavemem` entry + +#### Scenario: setup installs missing global companions + +- **GIVEN** `@imdeadpool/colony-cli` is absent from detected global npm packages +- **WHEN** the user approves companion installation +- **THEN** Guardex includes `@imdeadpool/colony-cli` in the global npm install command +- **AND** Guardex does not install `cavemem` as part of the global companion set + +### Requirement: README shows Colony runtime registration + +Guardex documentation SHALL show users how to install Colony and register one or more agent runtimes. + +#### Scenario: user reads companion tooling docs + +- **WHEN** the README companion tools table is inspected +- **THEN** the Colony row includes `npm i -g @imdeadpool/colony-cli` +- **AND** it lists `colony install --ide codex`, `colony install --ide claude-code`, `colony install --ide cursor`, `colony install --ide gemini-cli`, and `colony install --ide opencode` +- **AND** it tells users to verify with `colony status` diff --git a/openspec/changes/agent-codex-replace-cavemem-with-colony-companion-2026-04-28-20-34/tasks.md b/openspec/changes/agent-codex-replace-cavemem-with-colony-companion-2026-04-28-20-34/tasks.md new file mode 100644 index 00000000..58a91496 --- /dev/null +++ b/openspec/changes/agent-codex-replace-cavemem-with-colony-companion-2026-04-28-20-34/tasks.md @@ -0,0 +1,9 @@ +- [x] 1.1 Define the companion-tooling scope for replacing `cavemem` with Colony. +- [x] 1.2 Add normative spec coverage for status and setup install behavior. +- [x] 2.1 Replace the global companion package mapping with `@imdeadpool/colony-cli`. +- [x] 2.2 Update README companion install and runtime registration guidance. +- [x] 2.3 Update setup/status regression fixtures for Colony. +- [x] 3.1 Run targeted setup/status verification. Evidence: `node --test --test-name-pattern "setup skips global install when companion npm tools are already installed|setup installs only missing global tools|setup warns when user declines oh-my-claudecode dependency install|setup installs missing local companion tools with explicit approval|setup warns when gh dependency is missing" test/setup.test.js` passed 5/5; `node --test test/status.test.js` passed 19/19. +- [x] 3.2 Run `node --check` for the CLI entrypoint. Evidence: `node --check bin/multiagent-safety.js` exited 0. +- [x] 3.3 Run OpenSpec validation. Evidence: `openspec validate agent-codex-replace-cavemem-with-colony-companion-2026-04-28-20-34 --type change --strict` passed. +- [ ] 4.1 Finish the guarded branch via PR merge and cleanup. diff --git a/src/context.js b/src/context.js index 181578ba..475674e0 100644 --- a/src/context.js +++ b/src/context.js @@ -21,7 +21,7 @@ const GLOBAL_INSTALL_COMMAND = `npm i -g ${packageJson.name}`; const OPENSPEC_PACKAGE = '@fission-ai/openspec'; const OMC_PACKAGE = 'oh-my-claude-sisyphus'; const OMC_REPO_URL = 'https://github.com/Yeachan-Heo/oh-my-claudecode'; -const CAVEMEM_PACKAGE = 'cavemem'; +const COLONY_PACKAGE = '@imdeadpool/colony-cli'; const NPX_BIN = process.env.GUARDEX_NPX_BIN || 'npx'; const GUARDEX_HOME_DIR = path.resolve(process.env.GUARDEX_HOME_DIR || os.homedir()); const GLOBAL_TOOLCHAIN_SERVICES = [ @@ -32,7 +32,7 @@ const GLOBAL_TOOLCHAIN_SERVICES = [ dependencyUrl: OMC_REPO_URL, }, { name: OPENSPEC_PACKAGE, packageName: OPENSPEC_PACKAGE }, - { name: CAVEMEM_PACKAGE, packageName: CAVEMEM_PACKAGE }, + { name: 'colony', packageName: COLONY_PACKAGE }, { name: '@imdeadpool/codex-account-switcher', packageName: '@imdeadpool/codex-account-switcher', @@ -674,7 +674,7 @@ module.exports = { OPENSPEC_PACKAGE, OMC_PACKAGE, OMC_REPO_URL, - CAVEMEM_PACKAGE, + COLONY_PACKAGE, NPX_BIN, GUARDEX_HOME_DIR, GLOBAL_TOOLCHAIN_SERVICES, diff --git a/test/setup.test.js b/test/setup.test.js index a63d38cb..8b615d15 100644 --- a/test/setup.test.js +++ b/test/setup.test.js @@ -1274,7 +1274,7 @@ test('setup skips global install when companion npm tools are already installed' const fakeNpm = createFakeNpmScript(` if [[ "$1" == "list" ]]; then cat <<'JSON' -{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"oh-my-claude-sisyphus":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"cavemem":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} +{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"oh-my-claude-sisyphus":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"@imdeadpool/colony-cli":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} JSON exit 0 fi @@ -1326,7 +1326,7 @@ exit 1 assert.equal(result.status, 0, result.stderr || result.stdout); assert.equal(fs.existsSync(marker), true, 'global install should run for missing package'); const args = fs.readFileSync(marker, 'utf8').trim(); - assert.equal(args, 'i -g oh-my-claude-sisyphus @fission-ai/openspec cavemem @imdeadpool/codex-account-switcher'); + assert.equal(args, 'i -g oh-my-claude-sisyphus @fission-ai/openspec @imdeadpool/colony-cli @imdeadpool/codex-account-switcher'); }); @@ -1337,7 +1337,7 @@ test('setup warns when user declines oh-my-claudecode dependency install', () => const fakeNpm = createFakeNpmScript(` if [[ "$1" == "list" ]]; then cat <<'JSON' -{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"cavemem":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} +{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"@imdeadpool/colony-cli":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} JSON exit 0 fi @@ -1368,7 +1368,7 @@ test('setup installs missing local companion tools with explicit approval', () = const fakeNpm = createFakeNpmScript(` if [[ "$1" == "list" ]]; then cat <<'JSON' -{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"oh-my-claude-sisyphus":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"cavemem":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} +{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"oh-my-claude-sisyphus":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"@imdeadpool/colony-cli":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} JSON exit 0 fi @@ -1419,7 +1419,7 @@ test('setup warns when gh dependency is missing', () => { const fakeNpm = createFakeNpmScript(` if [[ "$1" == "list" ]]; then cat <<'JSON' -{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"oh-my-claude-sisyphus":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"cavemem":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} +{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"oh-my-claude-sisyphus":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"@imdeadpool/colony-cli":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} JSON exit 0 fi diff --git a/test/status.test.js b/test/status.test.js index 2ec7d289..a21d8350 100644 --- a/test/status.test.js +++ b/test/status.test.js @@ -481,7 +481,9 @@ test('status --json returns cli, services, and repo summary', () => { claudeService.dependencyUrl, 'https://github.com/Yeachan-Heo/oh-my-claudecode', ); - assert.ok(parsed.services.some((service) => service.name === 'cavemem')); + const colonyService = parsed.services.find((service) => service.name === 'colony'); + assert.ok(colonyService, 'colony service should be included'); + assert.equal(colonyService.packageName, '@imdeadpool/colony-cli'); assert.ok(parsed.services.some((service) => service.name === 'cavekit')); assert.ok(parsed.services.some((service) => service.name === 'caveman')); assert.equal(parsed.repo.inGitRepo, true); @@ -496,7 +498,7 @@ test('status warns when oh-my-claudecode dependency is inactive', () => { const fakeNpm = createFakeNpmScript(` if [[ "$1" == "list" ]]; then cat <<'JSON' -{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"cavemem":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} +{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"@imdeadpool/colony-cli":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} JSON exit 0 fi @@ -524,7 +526,7 @@ test('status detects local cavekit and caveman companion installs', () => { const fakeNpm = createFakeNpmScript(` if [[ "$1" == "list" ]]; then cat <<'JSON' -{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"oh-my-claude-sisyphus":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"cavemem":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} +{"dependencies":{"oh-my-codex":{"version":"1.0.0"},"oh-my-claude-sisyphus":{"version":"1.0.0"},"@fission-ai/openspec":{"version":"1.0.0"},"@imdeadpool/colony-cli":{"version":"1.0.0"},"@imdeadpool/codex-account-switcher":{"version":"1.0.0"}}} JSON exit 0 fi