Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ Empryo injects every skill in `skills.autoLoad` in full into every prompt. GAP r

The distro's `gap.toml` and your `~/.config/gap/gap.toml` select pinned [components](#components). Their skill lists and load levels are described under [Load levels](#load-levels). All former `global/skills.json` sources are now pinned components; the separate skills manifest is no longer used.

`gap sync` copies selected component skills directly from the pinned store into `~/.agents/skills` and `~/.claude/skills`. Harnesses that read neither folder get no skills from GAP; the policy still reaches them. Component skill installation, drift repair, and restore do not use Node or `npx`. Project skills use the same two paths under the invoking project instead of the home directory; see [load levels](#load-levels).
`gap sync` copies selected skills directly from the pinned store into `~/.agents/skills` and `~/.claude/skills`. Harnesses that read neither folder get no skills from GAP; the policy still reaches them. GAP's skill copying, drift repair, and restore do not use Node or `npx`. Project skills use the same two paths under the invoking project instead of the home directory; see [load levels](#load-levels).

Sync checks every selected skill against its pinned store. Existing skills.sh installations are adopted in place when both destinations match that source: GAP records component ownership and removes only that skill's entry from the skills.sh lock. The lock is `$XDG_STATE_HOME/skills/.skill-lock.json` when `XDG_STATE_HOME` is set, otherwise `~/.agents/.skill-lock.json`. Unrelated lock entries and fields stay intact. If GAP cannot save component ownership, adoption fails and restores the previous lock contents. If that restoration also fails, the error includes both failures and the lock path. Missing, unreadable, or malformed locks follow the [migration failure contract](cmd/gap/AGENTS.md#sync-steps). Edited copies go to drift review. For each drifted skill, sync shows the diff and asks:

Expand Down Expand Up @@ -189,7 +189,7 @@ names = ["do-commit", "do-todo"]

Pin confirms the new pin, shows the old and new commits when it moves, or reports that it is already current. A new or moved pin includes a reminder to run `gap sync` to install it.

The distro includes Do-Skills, Forge, Echo, and Recall. Forge supplies `forge-interview`. Echo and Recall have empty skill lists: machine sync runs their `install` commands from their verified stores, and those installers own their skills and runtime prerequisites. Hook timing and state are described under [Hooks and trust](#hooks-and-trust). Gap copies no skills from them and never installs a harness.
The distro includes Do-Skills, Forge, Echo, Recall, and the third-party skill sources declared in [`gap.toml`](gap.toml). Forge supplies `forge-interview`. Echo and Recall have empty skill lists: machine sync runs their `install` commands from their verified stores, and those installers own their skills and runtime prerequisites. Hook timing and state are described under [Hooks and trust](#hooks-and-trust). Gap copies no skills from them and never installs a harness.

`gap doctor` runs each configured `doctor` command from its verified pinned store, then reports harness presence using `PATH`. Missing pins, missing or changed stores, and failed doctors produce exit `1`; doctor does not fetch missing components.

Expand Down Expand Up @@ -352,7 +352,7 @@ GAP unregisters recorded servers through the harness CLIs when the manifest drop

## Skill catalog

GAP keeps no skill source. [Do-Skills](https://github.com/edheltzel/Do-Skills#readme) supplies the `do-*` and marketing skills, pinned in `gap.toml` and `gap.lock`; its README holds the catalog and the human docs for each skill. See [Manage skills](#manage-skills) for the other sources GAP selects.
GAP keeps no skill source. [Do-Skills](https://github.com/edheltzel/Do-Skills#readme) supplies the `do-*` and marketing skills, pinned in `gap.toml` and `gap.lock`; its README holds the catalog and the human docs for each skill. See [Components](#components) for the other sources and their installation rules.

## Reference

Expand Down
5 changes: 2 additions & 3 deletions docs/plans/2026-10-20-gap-env-provisioner-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ Render = pinned source file → frontmatter merge → patch → append → write
2. Gap stops writing that lock. It leaves it in place for skills Gap doesn't manage.
3. Replace the symlinks in `~/.claude/skills` with regular copies (backup first), one prompt for the batch.
4. Do-Skills README install section changes from `npx skills add edheltzel/Do-Skills …` to: "Install with Gap: `gap add do-skills` (or it's already in the default distro). Project skills install automatically when the repo matches." Keep a short "without Gap" note pointing at skills.sh for outside users, if you want one. External skills (gitbutler, plannotator, codegraph, …) stay in the default distro (decision 8).
5. GAP README "Manage skills" section and the "you need Node" note go away.
5. Completed: see step 7 of the [plugin-manager plan](2026-11-12-gap-plugin-manager-plan.md#steps).

---

Expand All @@ -294,9 +294,8 @@ Render = pinned source file → frontmatter merge → patch → append → write

## Todo

Open tasks, copied verbatim from Do-Skills' and GAP's `todo.txt`:
GAP tasks live in [todo.txt](../../todo.txt). Do-Skills follow-up:

```text
2026-11-05 Change the README install section from npx skills add to Gap, keeping a short skills.sh note for outside users (GAP provisioner section 9 step 4) +doskills note:/Users/ed/Developer/Atlas/GAP/docs/plans/2026-10-20-gap-env-provisioner-plan.md
2026-11-05 Provisioner section 9 step 5: drop the skills.sh and Node path from README Manage skills once global/skills.json no longer needs npx +gap note:/Users/ed/Developer/Atlas/GAP/docs/plans/2026-10-20-gap-env-provisioner-plan.md
```
43 changes: 19 additions & 24 deletions docs/plans/2026-11-12-gap-plugin-manager-plan.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# GAP as a plugin manager for agent harnesses

Date: 2026-11-12. Planning base: master `3d191c66`. Status: approved by Ed 2026-11-12; prerequisite PR #114 (`feat/gap-utilities`) merged as `fbebb517`.
Date: 2026-11-12. Planning base: master `3d191c66`. Status: completed in v0.5.0. Approved by Ed 2026-11-12; prerequisite PR #114 (`feat/gap-utilities`) merged as `fbebb517`.

## Goal

Expand All @@ -12,40 +12,35 @@ On master: pinned components (`gap.toml`, `gap.lock`, `gap pin`), a verified sto

PR #114 also shipped the [utility lifecycle](../../README.md#add-a-utility), [plugin manifest](../../README.md#publish-a-utility), and [hook trust](../../README.md#hooks-and-trust).

Missing:
Delivered in v0.5.0:

| Gap | Today |
| Capability | Outcome |
| --- | --- |
| Uninstall | Utilities have `gap remove`; nothing for `gap` itself |
| Per-harness delivery | Skills go to `~/.agents/skills` and `~/.claude/skills`; commands follow the [supported harness destinations](../../README.md#where-each-agent-reads-the-policy) |
| MCP servers and harness settings | MCP delivery follows the [manifest contract](../../README.md#publish-a-utility); other harness settings remain installer-owned |
| Install without Go | The installer builds from source; manifest skills need `npx` |
| Discovery | No catalog or search |
| Uninstall | Done: `gap uninstall` (step 5) |
| Per-harness delivery | Done: skills go to `~/.agents/skills` and `~/.claude/skills`; commands follow the [supported harness destinations](../../README.md#where-each-agent-reads-the-policy) |
| MCP servers and harness settings | Done: MCP delivery follows the [manifest contract](../../README.md#publish-a-utility); other harness settings remain installer-owned |
| Install without Go | Done: release binaries, and skills no longer need `npx` (steps 6 and 7) |
| Discovery | Done: `catalog.toml` and `gap search` (step 8) |

## Steps

1. Completed: merge `feat/gap-utilities` (PR #114, `fbebb517`). Owner: GAP API tab.
2. Reorder the README after step 1: Change the policy before Manage skills, Components before the first `gap.toml` example. Move the edge-case detail in Project setup and the Echo pin note into `cmd/gap/AGENTS.md`. Done after step 1 because those sections overlap the utilities branch.
3. Harness adapter table in `cmd/gap`: for each harness, where skills, commands, MCP servers, and hooks go. Drive skill and command delivery from it. Start with Codex, Cursor, Pi, and Empryo commands.
4. MCP entries in `gap-utility.toml` follow the [manifest and lifecycle contract](../../README.md#publish-a-utility) through the harness adapter table and each harness's own MCP CLI.
5. `gap uninstall`: strip the policy blocks, Codex hooks, published commands, and owned skills recorded in the ledger and `state.json`.
6. Release binaries (GoReleaser or `go build` in CI) and an installer that downloads one when Go is absent.
7. Drop the skills.sh path once `global/skills.json` sources become utilities (provisioner section 9 step 5).
8. Catalog: `gap search` over a list of known utility repos, kept in this repo.
2. Completed: reordered the README with Change the policy before Manage skills and Components before the first `gap.toml` example. Project setup edge cases and the Echo pin note live in `cmd/gap/AGENTS.md`.
3. Completed for supported destinations: `cmd/gap/harness.go` drives policy, command, and MCP delivery. Skills use `~/.agents/skills` and `~/.claude/skills`; commands go to Claude, OMP, and Pi. Codex no longer reads custom prompts; Cursor and Empryo command folders remain unproven. Hooks and other harness settings stay installer-owned.
4. Completed: MCP entries in `gap-utility.toml` follow the [manifest and lifecycle contract](../../README.md#publish-a-utility) through the harness adapter table and the Claude, Codex, and Pi MCP CLIs.
5. Completed (PR #120): `gap uninstall`: strip the policy blocks, Codex hooks, published commands, and owned skills recorded in the ledger and `state.json`.
6. Completed (PR #120): release binaries (GoReleaser or `go build` in CI) and an installer that downloads one when Go is absent.
7. Completed: replaced the skills.sh path with [pinned components](../../README.md#components), including [adoption of matching installs](../../README.md#manage-skills). This also completes provisioner section 9 step 5. Branch `feat/drop-skillssh`.
8. Completed (PR #120): catalog, `gap search` over a list of known utility repos, kept in this repo.

Version ranges and dependencies between utilities wait until two utilities need each other.

## Done in this change
## Documentation delivered

README: supported systems, uninstall steps, which harnesses get skills, a shorter Step 4 that links the sync contract, the symlink and Empryo wording fixes, the nessa-docs link. CONCEPTS: Distro terms (component, pin, store, drift, load level, override, profile) and the command ambiguity.

Website: pinned skills, MCP registration, utility lifecycle, release binary installation, and uninstall behavior.

## Todo

```
2026-11-12 Reorder README (policy first, components before gap.toml) and move Project setup and Echo detail to cmd/gap/AGENTS.md +gap dep:gap-utilities-build note:/Users/ed/Developer/Atlas/GAP/docs/plans/2026-11-12-gap-plugin-manager-plan.md
2026-11-12 Harness adapter table: skills, commands, MCP, hooks per harness +gap id:gap-adapters dep:gap-utilities-build note:/Users/ed/Developer/Atlas/GAP/docs/plans/2026-11-12-gap-plugin-manager-plan.md
2026-11-12 MCP server entries in gap-utility.toml through the adapter table +gap dep:gap-adapters note:/Users/ed/Developer/Atlas/GAP/docs/plans/2026-11-12-gap-plugin-manager-plan.md
2026-11-12 gap uninstall from the ledger and state.json +gap dep:gap-utilities-build note:/Users/ed/Developer/Atlas/GAP/docs/plans/2026-11-12-gap-plugin-manager-plan.md
2026-11-12 Release binaries and an installer that works without Go +gap note:/Users/ed/Developer/Atlas/GAP/docs/plans/2026-11-12-gap-plugin-manager-plan.md
2026-11-12 gap search over a catalog of utility repos +gap dep:gap-utilities-build note:/Users/ed/Developer/Atlas/GAP/docs/plans/2026-11-12-gap-plugin-manager-plan.md
```
None. All eight steps are complete for the supported harness destinations above.
31 changes: 24 additions & 7 deletions site/src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,16 @@ import '../styles/landing/landing.css';
<div class="eyebrow">Global Agent Policies</div>
<h1>One set of rules.<br /><span class="l2">Every coding</span><br /><span class="l3">agent.</span></h1>
<p class="sub">
Write your policy once. <code>gap sync</code> copies it into the file each agent already reads.
Write your policy once. <code>gap sync</code> copies it into the file each agent already reads, then
installs pinned skills and registers MCP servers.
</p>
<div class="tabs"><b>Install</b></div>
<div class="cmd">
<span class="d">$</span><span class="t">{installCommand}</span>
<button class="cp" type="button">Copy</button>
</div>
<p class="hint">
See the <a href="/docs/#install-gap">installation requirements</a>.
No Go needed: without it, the script installs a checksum-verified release binary. See the <a href="/docs/#install-gap">installation requirements</a>.
</p>
<div class="cta">
<a class="btn" href="/docs/#install-gap">Read the docs</a>
Expand All @@ -62,7 +63,8 @@ import '../styles/landing/landing.css';
<h2 id="how-title">Write it once. <span>Every agent reads it.</span></h2>
<p class="lead">
One rules file, <code>global/AGENTS.md</code>. <code>gap sync</code> copies it into the file each agent
already reads.
already reads, copies skills from pinned commits, and registers the MCP servers declared in pinned
utility manifests.
</p>
<div class="cards">
<article class="card">
Expand All @@ -76,12 +78,18 @@ import '../styles/landing/landing.css';
<article class="card">
<div class="n"><span>Step</span><i>02</i></div>
<h3>Run gap sync</h3>
<p>Copies your rules into every agent's file and installs any listed skills that are missing.</p>
<p>
Copies your rules into every agent's file, copies pinned skills straight from git with no Node, and
registers MCP servers through the Claude, Codex, and Pi CLIs.
</p>
</article>
<article class="card">
<div class="n"><span>Step</span><i>03</i></div>
<h3>Check status</h3>
<p><code>gap status</code> shows each component's pin and any skill drift. It writes nothing and exits 1 on drift.</p>
<p>
<code>gap status</code> reports each component's pin and any skill drift. It writes nothing and
exits 1 on drift. <code>gap list</code> shows configured components and utilities.
</p>
</article>
</div>
</section>
Expand All @@ -96,7 +104,9 @@ import '../styles/landing/landing.css';
<article class="card">
<div class="n"><span>Add</span><i>01</i></div>
<h3>gap add owner/repo</h3>
<p>Pins the repo in your own lock and installs its skills, commands, and install hook.</p>
<p>
Pins the repo in your own lock, copies its skills and commands, registers MCP servers, and runs its install hook. <code>gap search</code> finds one.
</p>
</article>
<article class="card">
<div class="n"><span>Update</span><i>02</i></div>
Expand All @@ -106,7 +116,7 @@ import '../styles/landing/landing.css';
<article class="card">
<div class="n"><span>Remove</span><i>03</i></div>
<h3>gap remove &lt;id&gt;</h3>
<p>Runs its uninstall hook and moves its files to a backup folder, so nothing is lost.</p>
<p>Runs its uninstall hook, unregisters its MCP servers, and backs up its recorded skills and commands.</p>
</article>
</div>
<div class="cta">
Expand Down Expand Up @@ -145,6 +155,13 @@ import '../styles/landing/landing.css';
<code>Refusing to replace foreign file</code>, skips that file, publishes the rest, and exits 1.
</p>
</div>
<div>
<span>Uninstall</span>
<p>
<b>It removes only what it recorded.</b> <code>gap uninstall</code> previews first. See the
<a href="/docs/#install-gap">cleanup and backup rules</a> for what it removes and retains.
</p>
</div>
</div>
</section>
<div class="end">
Expand Down
3 changes: 1 addition & 2 deletions site/src/site.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
/** Site name and description. `gap` alone is ambiguous in search. */
export const siteName = 'GAP: Global Agent Policies';

export const siteDescription =
'One set of rules for every coding agent. Write the rules once in global/AGENTS.md. gap sync copies them into the file each agent already reads, and gap add installs any utility from GitHub.';
export const siteDescription = 'One set of rules for every coding agent. Write the rules once in global/AGENTS.md. gap sync copies them into the file each agent already reads, installs pinned skills, and registers MCP servers; gap add installs any utility from GitHub.';

/** Install line from the GAP README. The hero shows this and the copy button reads it. */
export const installCommand =
Expand Down
7 changes: 3 additions & 4 deletions site/src/styles/landing/landing.css
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@

.stage {
position: relative;
height: 100vh;
min-height: 680px;
min-height: max(100vh, 680px);
overflow: hidden;
background: var(--bg);
}
Expand Down Expand Up @@ -99,10 +98,10 @@
}

.copy {
position: absolute;
position: relative;
z-index: 2;
left: var(--pad);
top: 15.5vh;
padding-block: 15.5vh 100px;
width: min(520px, calc(100vw - 2 * var(--pad)));
}

Expand Down
2 changes: 1 addition & 1 deletion todo.txt
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,6 @@ x 2026-10-24 2026-10-24 Fix source store status labels and ignore installer buil
2026-10-27 Ship jcode integration: see docs/plans/2026-11-13-jcode-integration-plan.md (U5-U6 after merge) +gap
x 2026-11-05 2026-11-03 Merge gap sync preview PR, release v4.1.0, reinstall gap, rerun gap sync to repair home policy links and the interrupted Recall install +gap pr:https://github.com/edheltzel/GAP/pull/105
2026-11-05 Pin Echo at the first tag with install.sh --list-installed, then confirm gap doctor records adapters +gap dep:echo-list-installed note:/Users/ed/Developer/Atlas/GAP/docs/plans/2026-10-22-gap-breadcrumb-ledger-plan.md
2026-11-05 Provisioner section 9 step 5: drop the skills.sh and Node path from README Manage skills once global/skills.json no longer needs npx +gap note:/Users/ed/Developer/Atlas/GAP/docs/plans/2026-10-20-gap-env-provisioner-plan.md
x 2026-11-14 2026-11-05 Provisioner section 9 step 5: drop the skills.sh and Node path from README Manage skills once global/skills.json no longer needs npx +gap note:/Users/ed/Developer/Atlas/GAP/docs/plans/2026-10-20-gap-env-provisioner-plan.md report:docs/plans/2026-11-12-gap-plugin-manager-plan.md
x 2026-11-06 2026-11-06 Migrate gap-site into GAP site/ on Nimbus: PR, approval, Pages cutover, verify gap.edheltzel.codes +gap id:site-migration pr:https://github.com/edheltzel/GAP/pull/107 cutover 2026-11-06 19:05Z: gap.edheltzel.codes on Pages gap-website at a28f0973
x 2026-11-06 2026-11-06 After cutover verified: update gap-site README, close its issues/PRs, archive edheltzel/gap-site +gap id:site-archive dep:site-migration gap-site README 0fb9ded3, 0 open issues/PRs, archived 2026-11-06
Loading