Skip to content

Commit b3e8a4d

Browse files
Merge pull request #123 from open-coder-ai/docs/readme-landing
docs: README that leads with the matrix, and a GIF that tells the truth
2 parents b2ec241 + b51e545 commit b3e8a4d

11 files changed

Lines changed: 384 additions & 199 deletions

File tree

.github/workflows/ci.yml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,28 @@ jobs:
148148
agentseam matrix | head -3
149149
agentseam doctor --repo .
150150
151+
# The README's own Quick start is a claim like any other -- extract the real bash
152+
# fence with tools/quickstart_block.py and run it, rather than trusting that a code
153+
# sample still works. `pip install .` first so the block's own `pip install agentseam`
154+
# is satisfied by the tree being tested instead of fetching a different release.
155+
quickstart:
156+
runs-on: ubuntu-latest
157+
steps:
158+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
159+
with:
160+
persist-credentials: false
161+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
162+
with:
163+
python-version: "3.12"
164+
- run: pip install .
165+
- name: Run the README's Quick start block
166+
run: |
167+
set -euo pipefail
168+
workdir=$(mktemp -d)
169+
python3 tools/quickstart_block.py > "$workdir/quickstart.sh"
170+
cd "$workdir"
171+
bash -euo pipefail quickstart.sh
172+
151173
# The runtime path must stay importable with no third-party packages: adapters are
152174
# copied verbatim into other projects, so an accidental dependency breaks exactly
153175
# the consumers this library exists for. Cheaper to assert than to discover.

.github/workflows/render-demo.yml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Renders docs/assets/demo.tape -> demo.gif with VHS, on demand.
2+
#
3+
# Manual-only (workflow_dispatch): rendering is an authoring step, not a build step,
4+
# so it never spends CI minutes on its own. Run it from the Actions tab, download the
5+
# `demo-gif` artifact, review it, and commit the GIF alongside the README change that
6+
# points at it. Linux rendering is canonical -- the tape is authored against a Unix
7+
# shell, and VHS is at its flakiest on Windows.
8+
name: Render demo
9+
10+
on:
11+
workflow_dispatch:
12+
13+
permissions:
14+
contents: read
15+
16+
jobs:
17+
vhs:
18+
runs-on: ubuntu-latest
19+
steps:
20+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
21+
with:
22+
persist-credentials: false
23+
24+
- uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7
25+
with:
26+
python-version: "3.12"
27+
28+
# The tape drives the real CLI; install the tree being rendered.
29+
- name: Install agentseam
30+
run: pip install .
31+
32+
- name: Render tape
33+
uses: charmbracelet/vhs-action@f6d7db07a432fcd3b06772628d36a57f96d95dcf # v2
34+
with:
35+
path: docs/assets/demo.tape
36+
37+
- name: Upload GIF
38+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
39+
with:
40+
name: demo-gif
41+
path: docs/assets/demo.gif
42+
if-no-files-found: error

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@ versioning: [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
88

9+
### Docs
10+
- **README rewritten to lead with the hero demo GIF and the honest capability matrix**,
11+
ahead of the pitch copy. Adds a hero GIF (`docs/assets/demo.tape`, rendered by the new
12+
manual `render-demo` workflow) showing the real `agentseam install all` output; a
13+
Supported agents table now covers all 16 agents with a `Verified` column (basis and
14+
date from `agentseam matrix --evidence`); and a one-sentence count of how many
15+
`pre_tool` claims are live-run witnessed versus doc-derived (4 of 12). The Quick start
16+
block is now run for real in CI (`tools/quickstart_block.py` + the new `quickstart`
17+
job) instead of trusted on faith. Bundles, Design and the per-vendor example-page
18+
generator sections moved to `docs/` verbatim.
19+
920
### Added
1021
- **`claude_code`'s `prompt_submit` and `stop` cells are now witnessed at 2.1.263**, the
1122
way W53 did `pre_tool`. Both gates were re-run against the real CLI with the fixed

README.md

Lines changed: 133 additions & 199 deletions
Large diffs are not rendered by default.

docs/assets/demo.gif

180 KB
Loading

docs/assets/demo.tape

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# agentseam — hero demo GIF
2+
#
3+
# Renders the real loop: a six-line handler, wired into every coding agent's own hook
4+
# system with one command. The end frame is `agentseam install all`'s real output --
5+
# one line per agent, ending in the enforcement level agentseam actually verified for
6+
# it. No level shown here is claimed beyond what the matrix grades that agent today.
7+
#
8+
# Prerequisites: `agentseam` on PATH (pip install -e .) and VHS
9+
# (https://github.com/charmbracelet/vhs)
10+
# Render:
11+
# vhs docs/assets/demo.tape # writes docs/assets/demo.gif
12+
13+
Output docs/assets/demo.gif
14+
15+
Set Shell "bash"
16+
Set FontSize 16
17+
Set Width 1200
18+
Set Height 640
19+
Set Theme "Catppuccin Mocha"
20+
Set TypingSpeed 40ms
21+
Set Padding 24
22+
23+
# --- hidden setup: throwaway repo, throwaway HOME (junie/kimi_code write under $HOME) ---
24+
Hide
25+
Type "cd $(mktemp -d) && git init -q && export HOME=$(mktemp -d) && clear"
26+
Enter
27+
Type "echo ZnJvbSBhZ2VudHNlYW0gaW1wb3J0IHJ1biwgRGVjaXNpb24KCmRlZiBoYW5kbGVyKGV2ZW50KToKICAgIGlmIGV2ZW50LmV2ZW50ID09ICJwcmVfdG9vbCIgYW5kICJBS0lBIiBpbiAoZXZlbnQuY29udGVudCBvciAiIik6CiAgICAgICAgcmV0dXJuIERlY2lzaW9uLmRlbnkoIm5vIEFXUyBrZXlzIGluIG1lbW9yeSBmaWxlcyIpCiAgICByZXR1cm4gRGVjaXNpb24uYWxsb3coKQoKcnVuKGhhbmRsZXIpCg== | base64 -d > my_handler.py && clear"
28+
Enter
29+
Show
30+
31+
# --- 1. the handler is six lines ---
32+
Type "cat my_handler.py"
33+
Enter
34+
Sleep 2500ms
35+
36+
# --- 2. wire it into every agent at once; end frame holds the real per-agent levels ---
37+
Type 'agentseam install all "python3 my_handler.py" --events pre_tool --repo .'
38+
Enter
39+
Sleep 4000ms

docs/bundles.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Bundles: mostly the same directory, twice
2+
3+
A Claude Code plugin and a Gemini CLI extension turn out to be nearly the same thing
4+
underneath two different manifests:
5+
6+
| part | Claude Code plugin | Gemini CLI extension | |
7+
|---|---|---|---|
8+
| skill | `skills/<name>/SKILL.md` | `skills/<name>/SKILL.md` | identical |
9+
| subagent | `agents/<name>.md` | `agents/<name>.md` | identical |
10+
| hooks | `hooks/hooks.json` | `hooks/hooks.json` | identical |
11+
| command | `commands/<name>.md` | `commands/<name>.toml` | same folder, different format |
12+
| manifest | `.claude-plugin/plugin.json` | `gemini-extension.json` | different |
13+
14+
So one directory serves both, and the real work is the second manifest and writing the
15+
commands twice. VS Code has no bundle format at all — parts are found by location, so
16+
committing the file *is* the install — and it reads several of Claude Code's own folders
17+
natively: `.claude/skills`, `.claude/agents`, `.claude/rules`, and hooks straight out of
18+
`.claude/settings.json`.
19+
20+
```bash
21+
agentseam packaging
22+
```
23+
24+
...prints each layout, the templates shared by more than one agent, and which folders an
25+
agent reads that belong to somebody else. That last line matters in both directions: a
26+
repo shipping `.claude/skills` is already shipping skills to VS Code, intended or not.
27+
28+
`plan(agent, bundle)` renders a bundle into the exact files an agent expects, and — as
29+
with permissions — hands back what the format cannot hold, with a reason specific to that
30+
agent. Gemini can't take a `.mcp.json`, but not because it lacks MCP: it declares servers
31+
in the manifest instead, and saying "no MCP support" would be as wrong as saying nothing.

docs/design.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Design
2+
3+
- **stdlib only.** No dependencies, ever, in the adapter path — adapters must stay
4+
copy-portable into other projects that vendor single files.
5+
- **Adapters own all vendor knowledge.** Adding an agent in an existing family is a
6+
config entry plus a matrix row; no consumer changes.
7+
- **Ownership-marked wiring.** Install is idempotent and uninstall is surgical: your own
8+
hooks in the same config are never touched.
9+
- **The matrix carries provenance.** Every row records the version and date it was
10+
verified, and how.
11+
12+
[ARCHITECTURE.md](../ARCHITECTURE.md) explains why those choices, what they cost, and the bug
13+
classes they exist to prevent.

docs/vendor-examples.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# See it per vendor before you install anything
2+
3+
[`examples/generated/`](../examples/generated/) has a page for every agent agentseam can hook,
4+
each showing the **same situation** — an agent about to write a secret into a file it will
5+
read back later — in that vendor's own dialect: the config `install` writes, the normalized
6+
event a handler sees, and what `allow` / `deny` / `escalate` / `transform` / `warn` / `vouch`
7+
each turn into on the way back (aliases: `ask` for `escalate`, `rewrite` for `transform`),
8+
including the ones that get reduced because the agent cannot express them.
9+
10+
There is a section for **every hook each agent supports**, in lifecycle order. Every block
11+
is generated by running the library, and CI fails if the pages drift from what it actually
12+
produces — an example nobody regenerates is a claim nobody checks.
13+
14+
What the pages cannot do is verify the vendors. Each row records what its claims rest on —
15+
`live-run`, `live-run-partial`, `vendor-source`, `vendor-docs`, `third-party-install`,
16+
`inherited` — and most are vendor documentation, which is a claim about what a vendor *says*
17+
rather than an observation of what their build does. Claude Code's row rests on a full live
18+
run; Codex CLI, Cursor, and VS Code Copilot each rest on a partial one, with the observed
19+
events listed on the row. Vendors change hook surfaces without notice, so **verify against
20+
your own installation before relying on any of it**, and open an issue if a page is wrong.
21+
22+
```bash
23+
python3 examples/generate.py # rewrite the pages
24+
python3 examples/generate.py --check # what CI runs
25+
```

tests/test_quickstart_block.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""The extractor CI runs the README's Quick start block through."""
2+
3+
import sys
4+
from pathlib import Path
5+
6+
ROOT = Path(__file__).resolve().parents[1]
7+
sys.path.insert(0, str(ROOT / "tools"))
8+
9+
from quickstart_block import extract # noqa: E402
10+
11+
12+
def test_extracts_the_real_readme_block():
13+
text = (ROOT / "README.md").read_text(encoding="utf-8")
14+
block = extract(text)
15+
assert block is not None
16+
assert "agentseam install all" in block
17+
assert "pip install agentseam" in block
18+
19+
20+
def test_none_when_no_quick_start_heading():
21+
assert extract("# agentseam\n\n```bash\necho hi\n```\n") is None
22+
23+
24+
def test_none_when_quick_start_has_no_bash_fence():
25+
assert extract("## Quick start\n\n```python\nprint('hi')\n```\n") is None
26+
27+
28+
def test_stops_at_the_first_fence():
29+
text = "## Quick start\n\n```bash\none\n```\n\n```bash\ntwo\n```\n"
30+
assert extract(text) == "one\n"

0 commit comments

Comments
 (0)