geneseed 3.12.0 → 3.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +121 -0
- package/README.md +2 -2
- package/SHIPPED.md +1 -1
- package/adapters/bob/README.md +1 -1
- package/adapters/claude-code/README.md +1 -1
- package/adapters/openclaude/README.md +1 -1
- package/adapters/opencode/README.md +3 -3
- package/docs/README.md +41 -22
- package/docs/concepts/agents.md +3 -1
- package/docs/concepts/collaboration.md +3 -1
- package/docs/concepts/exclusions.md +4 -2
- package/docs/concepts/footprint.md +3 -1
- package/docs/concepts/foreman-mode.md +3 -1
- package/docs/concepts/hook-gates.md +61 -0
- package/docs/concepts/hooks.md +8 -56
- package/docs/concepts/host-matrix.md +38 -0
- package/docs/concepts/hosts.md +6 -32
- package/docs/concepts/loop-branch.md +66 -0
- package/docs/concepts/loop-bricks.md +48 -0
- package/docs/concepts/loop-contracts.md +33 -0
- package/docs/concepts/loop-gates.md +30 -0
- package/docs/concepts/loop-notes.md +43 -0
- package/docs/concepts/loop-risk.md +36 -0
- package/docs/concepts/loop-templates.md +50 -0
- package/docs/concepts/loops.md +24 -116
- package/docs/concepts/lsp.md +2 -0
- package/docs/concepts/memory.md +3 -1
- package/docs/concepts/notebook.md +3 -1
- package/docs/concepts/rules.md +4 -2
- package/docs/concepts/skills.md +3 -1
- package/docs/concepts/themes.md +3 -1
- package/docs/extending.md +23 -8
- package/docs/guides/autostart.md +3 -1
- package/docs/guides/choose-your-setup.md +5 -80
- package/docs/guides/headless.md +5 -3
- package/docs/guides/install-agent-md.md +37 -0
- package/docs/guides/install-bob.md +20 -0
- package/docs/guides/install-claude-code.md +22 -0
- package/docs/guides/install-clone.md +34 -0
- package/docs/guides/install-openclaude.md +25 -0
- package/docs/guides/install-opencode.md +35 -0
- package/docs/guides/install-scripted.md +21 -0
- package/docs/guides/install.md +9 -118
- package/docs/guides/loop-finish.md +54 -0
- package/docs/guides/loop-running.md +66 -0
- package/docs/guides/loop-which-template.md +35 -0
- package/docs/guides/mcp-filesystem.md +41 -0
- package/docs/guides/mcp-gitlab.md +66 -0
- package/docs/guides/mcp-markitdown.md +36 -0
- package/docs/guides/mcp.md +8 -137
- package/docs/guides/migrate.md +3 -1
- package/docs/guides/project-context.md +4 -2
- package/docs/guides/read-non-markdown.md +17 -0
- package/docs/guides/run-a-loop.md +64 -0
- package/docs/guides/run-anywhere.md +2 -0
- package/docs/guides/setup-doctrines.md +55 -0
- package/docs/guides/setup-footprint.md +48 -0
- package/docs/guides/uninstall.md +3 -1
- package/docs/guides/upgrade.md +3 -1
- package/docs/guides/verify.md +3 -1
- package/docs/guides/wiki.md +3 -1
- package/docs/guides/worktree.md +3 -1
- package/docs/reference/about.md +3 -1
- package/docs/reference/cli.md +2 -0
- package/docs/reference/env-context.md +40 -0
- package/docs/reference/environment.md +10 -59
- package/docs/reference/glossary.md +3 -1
- package/docs/reference/loop-actions.md +20 -0
- package/docs/reference/opencode-plugins.md +14 -118
- package/docs/reference/plugin-activity.md +20 -0
- package/docs/reference/plugin-context.md +27 -0
- package/docs/reference/plugin-guard.md +27 -0
- package/docs/reference/plugin-learn.md +27 -0
- package/docs/reference/plugin-notify.md +20 -0
- package/docs/reference/plugin-ponytail.md +19 -0
- package/docs/reference/plugin-workflow.md +25 -0
- package/docs/reference/troubleshoot-doctor.md +50 -0
- package/docs/reference/troubleshoot-hooks.md +99 -0
- package/docs/reference/troubleshoot-install.md +108 -0
- package/docs/reference/troubleshoot-tools.md +56 -0
- package/docs/reference/troubleshoot-update.md +23 -0
- package/docs/reference/troubleshoot-web.md +66 -0
- package/docs/reference/troubleshooting.md +13 -337
- package/docs/understand/a-day.md +3 -1
- package/docs/understand/enforced-vs-asked.md +3 -1
- package/docs/understand/harness.md +2 -0
- package/docs/understand/machine-bob.md +17 -0
- package/docs/understand/machine-claude.md +35 -0
- package/docs/understand/machine-opencode.md +36 -0
- package/docs/understand/on-your-machine.md +12 -55
- package/docs/understand/take-it-out.md +13 -0
- package/docs/web-ui.md +35 -15
- package/harness.config.json +1 -1
- package/js/README.md +11 -3
- package/js/cli-table.json +27 -1
- package/js/hosts/mcp.mjs +1 -1
- package/js/hosts/native.mjs +43 -5
- package/js/inspect/checks-build.mjs +28 -0
- package/js/loop/catalog.mjs +12 -1
- package/js/loop/cli.mjs +28 -6
- package/js/loop/graph.mjs +18 -0
- package/js/loop/registry.mjs +196 -0
- package/js/loop/score.mjs +45 -6
- package/js/loop/state.mjs +125 -11
- package/js/maintain/setup.mjs +1 -1
- package/js/web/actions.mjs +25 -0
- package/js/web/api.mjs +13 -0
- package/js/web/docs.mjs +64 -12
- package/js/web/routes.mjs +5 -1
- package/package.json +1 -1
- package/src/agents/explorer.md +2 -2
- package/src/agents/researcher.md +3 -3
- package/src/bricks/README.md +3 -1
- package/src/bricks/adr-challenge.md +20 -0
- package/src/bricks/adr-draft.md +15 -0
- package/src/bricks/characterize.md +17 -0
- package/src/bricks/ci-fix.md +2 -1
- package/src/bricks/ci-triage.md +20 -0
- package/src/bricks/compat-check.md +16 -0
- package/src/bricks/done-check.md +16 -0
- package/src/bricks/fitness-define.md +22 -0
- package/src/bricks/flake-check.md +17 -0
- package/src/bricks/flake-repro.md +18 -0
- package/src/bricks/identify.md +6 -3
- package/src/bricks/migration-plan.md +21 -0
- package/src/bricks/mutation-check.md +18 -0
- package/src/bricks/plan.md +6 -6
- package/src/bricks/red-test.md +16 -0
- package/src/bricks/review.md +5 -3
- package/src/bricks/spec.md +18 -0
- package/src/bricks/upgrade-scout.md +16 -0
- package/src/loops/api-endpoint.json +31 -0
- package/src/loops/architecture-decision.json +22 -0
- package/src/loops/bugfix.json +1 -0
- package/src/loops/ci-repair.json +19 -0
- package/src/loops/deps-upgrade.json +29 -0
- package/src/loops/enforce-architecture-rule.json +28 -0
- package/src/loops/feature.json +8 -5
- package/src/loops/fix-flaky-tests.json +30 -0
- package/src/loops/legacy-refactor.json +26 -0
- package/src/loops/legacy-tests.json +29 -0
- package/src/loops/refactor.json +5 -1
- package/src/loops/remove-dead-code.json +30 -0
- package/src/loops/spec-first-feature.json +29 -0
- package/src/loops/tdd.json +25 -0
- package/src/loops/update-contract.json +33 -0
- package/src/skills/brick-forge.md +3 -1
- package/src/skills/bruno-collection-generator.md +3 -3
- package/src/skills/bruno-test-writer.md +3 -3
- package/src/skills/ci-fix.md +3 -3
- package/src/skills/consolidate-memory.md +4 -4
- package/src/skills/council.md +1 -1
- package/src/skills/fresh-eyes.md +1 -1
- package/src/skills/git-archaeology.md +1 -1
- package/src/skills/git-rescue.md +4 -3
- package/src/skills/handoff.md +1 -1
- package/src/skills/herdr.md +1 -1
- package/src/skills/learn-mode.md +2 -2
- package/src/skills/loop.md +22 -10
- package/src/skills/opencode-theme.md +3 -3
- package/src/skills/ponytail.md +1 -1
- package/src/skills/profile.md +3 -4
- package/src/skills/prose.md +2 -3
- package/src/skills/quiz.md +1 -1
- package/src/skills/react-view-transitions/SKILL.md +1 -1
- package/src/skills/react-view-transitions/VENDOR.md +8 -3
- package/src/skills/research.md +3 -3
- package/src/skills/review-response.md +2 -2
- package/src/skills/rule.md +3 -3
- package/src/skills/security-audit.md +4 -4
- package/src/skills/teach.md +1 -1
- package/src/skills/wiki.md +3 -3
- package/src/skills/workflow.md +4 -4
- package/src/skills/worktree.md +2 -2
- package/web/dist/assets/Activity-Ca2Aruu7.js +1 -0
- package/web/dist/assets/ActivityDetail-Bo7v4Z_r.js +1 -0
- package/web/dist/assets/Dashboard-BuMq46aT.js +2 -0
- package/web/dist/assets/Docs-BzccCllG.js +5 -0
- package/web/dist/assets/FilterInput-CBcJBQPI.js +1 -0
- package/web/dist/assets/GreenhouseView-BCIKcnGG.js +2 -0
- package/web/dist/assets/Installs-DMFJvq7s.js +2 -0
- package/web/dist/assets/JournalView-o1rmd1_1.js +1 -0
- package/web/dist/assets/Laws-BANxq_I_.js +3 -0
- package/web/dist/assets/Library-DW4x0fbh.js +1 -0
- package/web/dist/assets/Loops-DEBibbBP.js +2 -0
- package/web/dist/assets/{Markdown-qjM2_ofS.js → Markdown-CdTX0kLe.js} +14 -14
- package/web/dist/assets/OperatorHudView-CLD0fYaA.js +2 -0
- package/web/dist/assets/Personal-6uMJvyBG.js +1 -0
- package/web/dist/assets/Tabs-BubnyZhF.js +1 -0
- package/web/dist/assets/activity-CObqyxkL.js +1 -0
- package/web/dist/assets/{api-CyMRbU2x.js → api-D_ixdyEY.js} +1 -1
- package/web/dist/assets/drawable-C_x5xncq.js +1 -0
- package/web/dist/assets/index-CMPgezFm.js +2 -0
- package/web/dist/assets/index-DMsT4Aa6.css +1 -0
- package/web/dist/assets/{react-B9Z_tXRV.js → react-Bbzhmq4v.js} +1 -1
- package/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
- package/web/dist/assets/sections-Dg23Hel5.js +1 -0
- package/web/dist/assets/usePoll-BOqeunzF.js +1 -0
- package/web/dist/index.html +6 -5
- package/web/dist/assets/Activity-GaaZWXTY.js +0 -1
- package/web/dist/assets/ActivityDetail-4t7d45Du.js +0 -1
- package/web/dist/assets/Dashboard-CYn7Tp16.js +0 -2
- package/web/dist/assets/Docs-BeFKLg2T.js +0 -5
- package/web/dist/assets/FilterInput-CVyqmYWM.js +0 -1
- package/web/dist/assets/GreenhouseView-C6ibc8IE.js +0 -2
- package/web/dist/assets/Installs-DRYjYnxs.js +0 -2
- package/web/dist/assets/JournalView-1HbU1mfg.js +0 -1
- package/web/dist/assets/Laws-DFoG8JWB.js +0 -3
- package/web/dist/assets/Library-DDjgNwz_.js +0 -1
- package/web/dist/assets/Loops-D9VEoO0F.js +0 -1
- package/web/dist/assets/OperatorHudView-Bs7paWmh.js +0 -2
- package/web/dist/assets/Personal-BY5n4gTw.js +0 -1
- package/web/dist/assets/Tabs-ho-EYD8i.js +0 -1
- package/web/dist/assets/drawable-CLS9drMb.js +0 -1
- package/web/dist/assets/index-CX_hXMi5.css +0 -1
- package/web/dist/assets/index-Cjr7XCA3.js +0 -2
- package/web/dist/assets/sections-GalMS0Zv.js +0 -1
- package/web/dist/assets/usePoll-O0sJEw1Y.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,127 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
|
|
|
8
8
|
|
|
9
9
|
## [Unreleased]
|
|
10
10
|
|
|
11
|
+
## [3.13.0] — 2026-10-04
|
|
12
|
+
|
|
13
|
+
**Upgrading:** re-emit (`geneseed rebuild-all`) so the installed `loop` skill knows the new
|
|
14
|
+
templates, human gates and note files; then `geneseed web restart` (and a hard reload) for the
|
|
15
|
+
new Loops and Docs pages.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **Template `category`** — `architecture`, `tests`, `development`, `refactoring` or `day-to-day`;
|
|
19
|
+
every shipped template carries one, and the console's Loops page groups templates by it.
|
|
20
|
+
- **Five loop templates** — `tdd` (plan, then write each failing test before the code that passes
|
|
21
|
+
it), `legacy-tests` (pin undocumented behaviour with characterization tests, mutation-checked,
|
|
22
|
+
production code untouched), `legacy-refactor` (pin current behaviour once, then refactor behind
|
|
23
|
+
that net), `deps-upgrade` (upgrade one package or group per iteration, breaking changes read
|
|
24
|
+
before the bump, lockfiles excluded from the deletion count so their churn doesn't force a
|
|
25
|
+
blocking score), and `ci-repair` (triage the current commit's failing CI checks and fix one
|
|
26
|
+
code failure per iteration).
|
|
27
|
+
- **Five bricks** backing the templates above — `red-test`, `characterize`, `mutation-check`
|
|
28
|
+
(reports `unavailable` rather than a silent `pass` when no mutation tool is on the stack),
|
|
29
|
+
`upgrade-scout`, `ci-triage` (reports `done` rather than green when CI has no run for HEAD).
|
|
30
|
+
- **`geneseed loop record --note` / `--note-file`** — carries a `read` brick's finding (a plan, a
|
|
31
|
+
review finding, a mutation gap, a CI classification) into `LOOP.md`'s notes so it survives into
|
|
32
|
+
the next brick and the next iteration; `--note-file` for anything multi-line or that mentions
|
|
33
|
+
`git commit`/`push`, which a shell argument can't carry safely.
|
|
34
|
+
- **Console: Loops › Active tab** — every loop `geneseed loop init` has launched, discovered via a
|
|
35
|
+
new **loop registry** (`$XDG_CONFIG_HOME/geneseed/loops.json`, identity only — `LOOP.md` stays
|
|
36
|
+
the source of state) instead of a worktree scan. `GET /api/loops/active` reports each loop's
|
|
37
|
+
branch, status, iteration, current node and preset; a card per loop, an `awaiting` loop
|
|
38
|
+
highlighted with what it's waiting on (answered in the agent's session, never the page),
|
|
39
|
+
finished loops kept muted for 7 days. Selecting a card draws its ring with the current node and
|
|
40
|
+
its iteration history. A per-loop preset picker (`POST /api/loops/preset`) rewrites `LOOP.md`'s
|
|
41
|
+
`preset`, applying from the next score on — the tab's only write; no `decide` and no relaunch
|
|
42
|
+
from the page. Only loops launched on this version or later are registered.
|
|
43
|
+
|
|
44
|
+
- **Seven more loop templates** — `architecture-decision` (one ADR per decision, challenged by a
|
|
45
|
+
skeptic brick, reviewed by the user), `enforce-architecture-rule` (encode a rule as a test with
|
|
46
|
+
an allowlist of today's violations, fix one violation per iteration), `update-contract` (expand,
|
|
47
|
+
migrate one consumer per iteration, contract, with contract files gated for a human by default),
|
|
48
|
+
`spec-first-feature` (write the spec first, build one task per iteration, closed by an
|
|
49
|
+
independent `done-check`), `api-endpoint` (plan, apply, test, a Bruno request and a security
|
|
50
|
+
review per endpoint), `remove-dead-code` (confirm green, delete one coherent unused group per
|
|
51
|
+
iteration, deletions scored soft) and `fix-flaky-tests` (confirm by repeated runs, fix the root
|
|
52
|
+
cause per iteration, never a retry or a sleep).
|
|
53
|
+
- **Nine bricks** backing the templates above — `adr-draft`, `adr-challenge`, `fitness-define`,
|
|
54
|
+
`migration-plan`, `spec`, `done-check`, `compat-check`, `flake-repro`, `flake-check`.
|
|
55
|
+
- **Human gates** — a brick's frontmatter can carry `gate: human` (optionally `gateOn:
|
|
56
|
+
<outcomes>`), holding its transition for a person regardless of preset or score. `geneseed loop
|
|
57
|
+
decide --verdict ok|no|amend` answers it: `ok` follows the reported outcome (a held failure
|
|
58
|
+
still stops), `no` stops the loop, `amend` re-runs the brick with a note and restarts its ring
|
|
59
|
+
budget, capped at 3 amends per brick per iteration. A passed gate is named under the closing
|
|
60
|
+
commit's new `Loop-Gates` trailer. In the console, a gated brick carries a person badge on the
|
|
61
|
+
loop ring ("Human gate", or "Human gate on pass") and a "human gate" tag in its rows, and the
|
|
62
|
+
Active section shows a gated loop as `Awaiting gate at <node>`.
|
|
63
|
+
- **Template `contracts` and `ignoreDeletions` globs** — `contracts` names interface/schema files
|
|
64
|
+
that always escalate a touching iteration to at least the `api` risk weight; copied from the
|
|
65
|
+
template at `loop init`, extendable with `--contracts` or by hand in `LOOP.md`.
|
|
66
|
+
`ignoreDeletions` excludes matched files from the >20-deleted-lines escalation only — the write
|
|
67
|
+
set still applies to them.
|
|
68
|
+
- **`rules` on every node** — a template may carry `rules`, a list of one-line instructions
|
|
69
|
+
(`loop check` refuses anything else); `geneseed loop next` hands them to every brick it runs,
|
|
70
|
+
not only the iteration head, so a template-wide proviso is visible everywhere, including to
|
|
71
|
+
`review`. `description` stays the catalogue blurb and is never sent as rules. The shipped
|
|
72
|
+
templates' instructions moved out of their descriptions into `rules`.
|
|
73
|
+
- **A guide to running a loop** — `docs/guides/run-a-loop.md`, `loop-running.md` and
|
|
74
|
+
`loop-finish.md`: what you need, how to ask, which template for which job, the trust preset,
|
|
75
|
+
answering a blocking score or a human gate, watching, stopping, merging, driving the engine by
|
|
76
|
+
hand, and a symptom table.
|
|
77
|
+
- **Console: rendered brick view** — the Loops page's Bricks reader renders a brick's body as
|
|
78
|
+
markdown under its facts (effect, outcomes, gate), with the raw source one click away.
|
|
79
|
+
|
|
80
|
+
### Changed
|
|
81
|
+
- **Categories nest under the selected rail entry** — on the Library (skill types), Docs
|
|
82
|
+
(sections) and Loops (template categories, brick origins, run statuses) pages, a selected
|
|
83
|
+
entry's categories open in the rail beneath it, with counts and a share bar, replacing the
|
|
84
|
+
full-width banner above the page.
|
|
85
|
+
- **The Docs selector names all four hosts** — OpenCode, Claude Code, OpenClaude and IBM Bob. A
|
|
86
|
+
page or inline block tagged with a family still shows to every host in it; a page can now name
|
|
87
|
+
several hosts (`harness: ["claude", "openclaude"]`), so Bob no longer sees the Claude Code /
|
|
88
|
+
OpenClaude machine page.
|
|
89
|
+
- **Docs in the Library layout** — the console's Docs tab is a rail of parts (Understand, Guides,
|
|
90
|
+
Concepts, Reference), a filterable list grouped by section, and a reader with a breadcrumb,
|
|
91
|
+
the page's outline and Previous / Next within its section. Pages carry a new `section` and
|
|
92
|
+
`description` in their frontmatter.
|
|
93
|
+
- **Long doc pages split into short ones**, each a section of its part: the install guide (one
|
|
94
|
+
page per host, from a clone, without the wizard), what lands on your machine (one page per
|
|
95
|
+
host, taking it back out), troubleshooting (installing, hooks, updating, doctor, web console),
|
|
96
|
+
the OpenCode plugins (one page per plugin), loops (templates, bricks, notes and rules, risk,
|
|
97
|
+
human gates, contracts, the loop branch) and the run-a-loop guide. The `geneseed loop` actions
|
|
98
|
+
table moved to Reference. Then the rest of the long ones: choose your setup (voice and working
|
|
99
|
+
style · doctrine packs and single rules · footprint, loop trust and changing later), MCP servers
|
|
100
|
+
(a hub, one page per preset, reading non-markdown docs; the won't-connect checklist moved to
|
|
101
|
+
Troubleshooting), hooks (the hooks · gates, settings and the shim), environment variables (the
|
|
102
|
+
context and memory ones on their own page; plugin switches live on each plugin's page), the
|
|
103
|
+
host capability matrix, and which loop template. Every first page keeps its old address.
|
|
104
|
+
- **The Understand track has more pages** — what lands on your machine is now one page per host
|
|
105
|
+
plus taking it back out, so a returning reader's "New here?" progress shows the new steps
|
|
106
|
+
as unread.
|
|
107
|
+
- **Console Loops page in the Library layout** — a rail (Templates · Bricks · Active, with
|
|
108
|
+
counts) replaces the tabs; each section is a filterable list grouped like the Library's
|
|
109
|
+
(templates by `category`, bricks by origin, active loops by status, awaiting first) beside a
|
|
110
|
+
detail pane: the ring, the template's `rules`, and its bricks as compact rows that a click on a
|
|
111
|
+
ring node highlights. Inner-ring nodes no longer overlap (`api-endpoint`).
|
|
112
|
+
- **`feature`** now closes through an independent `done-check` — it maps every requirement to a
|
|
113
|
+
passing test before `$close` instead of trusting the iterations that already ran.
|
|
114
|
+
- **`deps-upgrade`** marks lockfiles with `ignoreDeletions` instead of a lowered `delete` weight,
|
|
115
|
+
so lockfile churn stays out of the deletion count without lowering the weight for any other
|
|
116
|
+
deletion in the same iteration.
|
|
117
|
+
- **Write-set entries accept globs** when they have at least one literal path segment (a tool's
|
|
118
|
+
generated store, say); a wildcard-only entry (`**`, `**/*.java`) still matches nothing rather
|
|
119
|
+
than declaring the whole repo writable.
|
|
120
|
+
|
|
121
|
+
### Fixed
|
|
122
|
+
- **Skill and agent descriptions follow the skill-authoring rules** — no trigger sentence is cut
|
|
123
|
+
mid-way in any theme, and no description carries XML-like tags (#179).
|
|
124
|
+
- **The install page no longer scrolls on open** — the reader's own host is lit (its link on the
|
|
125
|
+
Install page, its scope's heading on the OpenCode page) without moving the page.
|
|
126
|
+
- The bricks README link on the loops page pointed at a repository that does not exist; the
|
|
127
|
+
console's wiki button opened a docs page that does not exist.
|
|
128
|
+
- A read-setup brick's plan or review findings no longer vanish between steps — `record --note`
|
|
129
|
+
/ `--note-file` writes them into `LOOP.md`'s notes instead of leaving them in the brick's own,
|
|
130
|
+
discarded context.
|
|
131
|
+
|
|
11
132
|
## [3.12.0] — 2026-10-03
|
|
12
133
|
|
|
13
134
|
**Upgrading:** re-emit after installing (`geneseed rebuild-all`) to get the `loop` and
|
package/README.md
CHANGED
|
@@ -41,7 +41,7 @@ A hand-written instructions file is prose the model may or may not honour, copie
|
|
|
41
41
|
- **Costs are measured, not guessed.** Zero runtime dependencies. The hook path loads in about 14 ms per tool call. The default *lean* footprint keeps the always-on context small and puts the full rationale one read away — the numbers are in [docs/token-footprint.md](docs/token-footprint.md).
|
|
42
42
|
- **It follows you.** Install once, globally; every repo inherits it. One `git pull` or `npm install -g geneseed@latest` rebuilds every active install.
|
|
43
43
|
|
|
44
|
-
This page is the overview. **New to agent harnesses?** Start with [Understand](docs/understand/harness.md) —
|
|
44
|
+
This page is the overview. **New to agent harnesses?** Start with [Understand](docs/understand/harness.md) — a short course on what a harness is, what lands on your machine, what changes in your day, and what is enforced versus only asked. Everything else — every install path, configuration knob, and troubleshooting step — is in the **[documentation](docs/README.md)**, which the web console also renders.
|
|
45
45
|
|
|
46
46
|
---
|
|
47
47
|
|
|
@@ -199,7 +199,7 @@ Pick with `--theme NAME` or via the setup wizard; upgrades remember it. More in
|
|
|
199
199
|
|
|
200
200
|
### 🪶 Footprint (lean vs full)
|
|
201
201
|
|
|
202
|
-
A second per-install dial sets how much of the constitution the root file carries *inline* every turn — a token-cost knob, not a change to which Rules apply. **lean** (the default) carries each rule's hand-written short form and points to the full text on disk; **full** inlines every rule with its rationale. Every rule is in force either way. More in [Footprint](docs/concepts/footprint.md) and [
|
|
202
|
+
A second per-install dial sets how much of the constitution the root file carries *inline* every turn — a token-cost knob, not a change to which Rules apply. **lean** (the default) carries each rule's hand-written short form and points to the full text on disk; **full** inlines every rule with its rationale. Every rule is in force either way. More in [Footprint](docs/concepts/footprint.md) and [Footprint, loop trust and changing later](docs/guides/setup-footprint.md).
|
|
203
203
|
|
|
204
204
|
---
|
|
205
205
|
|
package/SHIPPED.md
CHANGED
|
@@ -20,7 +20,7 @@ historical references, not files distributed with the repo.
|
|
|
20
20
|
> **On version numbers.** [`harness.config.json`](harness.config.json)'s `version` is a
|
|
21
21
|
> human-readable label only. The canonical identity of an installed harness is the
|
|
22
22
|
> **source fingerprint** stamped in `.geneseed-version` (see `geneseed version`), not the
|
|
23
|
-
> string. Current label: **3.
|
|
23
|
+
> string. Current label: **3.13.0**.
|
|
24
24
|
|
|
25
25
|
## Capabilities
|
|
26
26
|
|
package/adapters/bob/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 🤖 IBM Bob adapter
|
|
2
2
|
|
|
3
|
-
> [← Back to README](../../README.md) · [Install guide](../../docs/guides/install.md) · [Claude Code adapter](../claude-code/README.md) · [OpenCode adapter](../opencode/README.md)
|
|
3
|
+
> [← Back to README](../../README.md) · [Install guide](../../docs/guides/install-bob.md) · [Claude Code adapter](../claude-code/README.md) · [OpenCode adapter](../opencode/README.md)
|
|
4
4
|
|
|
5
5
|
[IBM Bob](https://bob.ibm.com) is **Claude-Code-shaped**: a project `.bob/`
|
|
6
6
|
layer, an `AGENTS.md` instructions file, `SKILL.md` skills, subagents, and a
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 🪝 Claude Code adapter
|
|
2
2
|
|
|
3
|
-
> [← Back to README](../../README.md) · [Install guide](../../docs/guides/install.md) · [OpenCode adapter](../opencode/README.md)
|
|
3
|
+
> [← Back to README](../../README.md) · [Install guide](../../docs/guides/install-claude-code.md) · [OpenCode adapter](../opencode/README.md)
|
|
4
4
|
|
|
5
5
|
Optional. Claude Code supports lifecycle **hooks**, so a team using it can make
|
|
6
6
|
parts of the harness fire automatically instead of relying on agent
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 🦀 OpenClaude adapter
|
|
2
2
|
|
|
3
|
-
> [← Back to README](../../README.md) · [Install guide](../../docs/guides/install.md) · [Claude Code adapter](../claude-code/README.md) · [OpenCode adapter](../opencode/README.md)
|
|
3
|
+
> [← Back to README](../../README.md) · [Install guide](../../docs/guides/install-openclaude.md) · [Claude Code adapter](../claude-code/README.md) · [OpenCode adapter](../opencode/README.md)
|
|
4
4
|
|
|
5
5
|
[OpenClaude](https://openclaude.gitlawb.com/) (`@gitlawb/openclaude`, binary
|
|
6
6
|
`openclaude`) is an open-source coding-agent CLI that "originated from the Claude
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 🔌 OpenCode adapter
|
|
2
2
|
|
|
3
|
-
> [← Back to README](../../README.md) · [Install guide](../../docs/guides/install.md) · [How OpenCode loads](HOW-OPENCODE-LOADS.md) · [Global harness spec](GLOBAL-HARNESS-SPEC.md)
|
|
3
|
+
> [← Back to README](../../README.md) · [Install guide](../../docs/guides/install-opencode.md) · [How OpenCode loads](HOW-OPENCODE-LOADS.md) · [Global harness spec](GLOBAL-HARNESS-SPEC.md)
|
|
4
4
|
|
|
5
5
|
[OpenCode](https://opencode.ai) is `AGENTS.md`-native and has first-class
|
|
6
6
|
**subagents** and **commands**, so Geneseed fits it cleanly. Pick the depth you
|
|
@@ -468,9 +468,9 @@ OpenCode runs, so the command has to resolve — the `uvx` form above needs only
|
|
|
468
468
|
call). No uv? `pipx install markitdown-mcp` and swap the command to `["markitdown-mcp"]`.
|
|
469
469
|
Or drop the block entirely — the skill falls back to a CLI converter (MarkItDown /
|
|
470
470
|
Pandoc / Docling) and never installs one silently. Listed but not connecting? The
|
|
471
|
-
command isn't on PATH — see [
|
|
471
|
+
command isn't on PATH — see [Model, agent and MCP problems](../../docs/reference/troubleshoot-tools.md).
|
|
472
472
|
Full runbook, including the corporate-TLS (`UV_SYSTEM_CERTS`) step and the OCR extras:
|
|
473
|
-
[the
|
|
473
|
+
[the MarkItDown guide](../../docs/guides/mcp-markitdown.md).
|
|
474
474
|
|
|
475
475
|
## Optional add-on — git-worktree isolation (third-party, not vendored)
|
|
476
476
|
|
package/docs/README.md
CHANGED
|
@@ -2,40 +2,59 @@
|
|
|
2
2
|
|
|
3
3
|
[← Back to README](../README.md)
|
|
4
4
|
|
|
5
|
-
**New to agent harnesses?** Read **Understand** first —
|
|
5
|
+
**New to agent harnesses?** Read **Understand** first — a short track, about ten minutes, that every other page assumes. The same pages open the **Docs** tab of the web console (`geneseed web`), which groups each part into sections, adds an interactive map of your own install, and filters host-specific passages to the tool you use.
|
|
6
6
|
|
|
7
7
|
## 1 · Understand
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
**Start here** — [What a harness is](understand/harness.md): git hooks + CI + a runbook, but for your AI agent.
|
|
10
|
+
|
|
11
|
+
**On your machine** — [What lands on your machine](understand/on-your-machine.md) · [On OpenCode](understand/machine-opencode.md) · [On Claude Code and OpenClaude](understand/machine-claude.md) · [On Bob, or any AGENT.md tool](understand/machine-bob.md) · [Taking it back out](understand/take-it-out.md): every file and hook an install writes, what it does for you, what it costs, how to turn it off.
|
|
12
|
+
|
|
13
|
+
**Day to day** — [A day with the harness](understand/a-day.md): the moments you will actually meet · [Enforced vs. asked](understand/enforced-vs-asked.md): what is guaranteed by code, and what the model is only asked to do.
|
|
13
14
|
|
|
14
15
|
## 2 · Guides
|
|
15
16
|
|
|
16
|
-
| Guide | When |
|
|
17
|
-
| --- | --- |
|
|
18
|
-
| [Install](guides/install.md) | First time —
|
|
19
|
-
| [
|
|
20
|
-
| [
|
|
21
|
-
| [
|
|
22
|
-
| [
|
|
23
|
-
| [
|
|
24
|
-
| [
|
|
25
|
-
| [
|
|
26
|
-
| [
|
|
27
|
-
| [
|
|
28
|
-
| [Run
|
|
29
|
-
|
|
|
30
|
-
| [Migrate from a clone to npm](guides/migrate.md) | Moving an old clone install to the npm package |
|
|
17
|
+
| Section | Guide | When |
|
|
18
|
+
| --- | --- | --- |
|
|
19
|
+
| Install | [Install](guides/install.md) | First time — one command, and the page for each host |
|
|
20
|
+
| Install | [From a clone](guides/install-clone.md) | npm is out of reach, or you want to change the harness |
|
|
21
|
+
| Install | [OpenCode](guides/install-opencode.md) · [Claude Code](guides/install-claude-code.md) · [OpenClaude](guides/install-openclaude.md) · [IBM Bob](guides/install-bob.md) · [Any AGENT.md tool](guides/install-agent-md.md) | Installing for one host, global or per repo |
|
|
22
|
+
| Install | [Without the wizard](guides/install-scripted.md) | A script, a CI job, a shell with no terminal |
|
|
23
|
+
| Install | [Run geneseed from anywhere](guides/run-anywhere.md) | Putting the CLI on your PATH from a clone |
|
|
24
|
+
| Set up | [Choose your setup](guides/choose-your-setup.md) · [Doctrine packs and single rules](guides/setup-doctrines.md) · [Footprint, loop trust and changing later](guides/setup-footprint.md) | Theme, posture, mode; doctrine packs and single rules; footprint, loop trust, changing a choice |
|
|
25
|
+
| Set up | [Verify it works](guides/verify.md) | Right after installing, or when something feels off |
|
|
26
|
+
| Set up | [Project context](guides/project-context.md) | Choosing which of a repo's docs the agent loads |
|
|
27
|
+
| Set up | [Connect your wiki](guides/wiki.md) | Giving the agent your own notes, machine-wide |
|
|
28
|
+
| Set up | [MCP servers](guides/mcp.md) · [MarkItDown](guides/mcp-markitdown.md) · [GitLab](guides/mcp-gitlab.md) · [Filesystem](guides/mcp-filesystem.md) · [Reading non-markdown docs](guides/read-non-markdown.md) | Where the config lives, the three presets, and reading PDF and Office files |
|
|
29
|
+
| Loops | [Run a loop](guides/run-a-loop.md) · [Which loop template](guides/loop-which-template.md) · [While a loop runs](guides/loop-running.md) · [Finish a loop](guides/loop-finish.md) | Working a requirement as small, validated, committed iterations |
|
|
30
|
+
| Keep it running | [Upgrade](guides/upgrade.md) | Getting a new version onto every install |
|
|
31
|
+
| Keep it running | [Migrate from a clone to npm](guides/migrate.md) | Moving an old clone install to the npm package |
|
|
32
|
+
| Keep it running | [Start the web console at login](guides/autostart.md) | Keeping the console running |
|
|
33
|
+
| Keep it running | [Uninstall](guides/uninstall.md) | Removing an install — and what stays behind |
|
|
34
|
+
| OpenCode extras | [Run in CI / headless](guides/headless.md) | OpenCode without a terminal |
|
|
35
|
+
| OpenCode extras | [Add git-worktree isolation](guides/worktree.md) | OpenCode, optional third-party add-on |
|
|
31
36
|
|
|
32
37
|
## 3 · Concepts
|
|
33
38
|
|
|
34
|
-
[Hosts](concepts/hosts.md) · [
|
|
39
|
+
**Harness** — [Hosts](concepts/hosts.md) · [What each host automates](concepts/host-matrix.md) · [Rules](concepts/rules.md) · [Agents](concepts/agents.md) · [Skills](concepts/skills.md) · [Hooks](concepts/hooks.md) · [Hook gates, settings and the shim](concepts/hook-gates.md)
|
|
40
|
+
|
|
41
|
+
**Memory** — [Memory](concepts/memory.md) · [Notebook](concepts/notebook.md)
|
|
42
|
+
|
|
43
|
+
**Configuration** — [Footprint](concepts/footprint.md) · [Themes](concepts/themes.md) · [Exclusions](concepts/exclusions.md) · [Code intelligence (LSP)](concepts/lsp.md)
|
|
44
|
+
|
|
45
|
+
**Working together** — [Collaboration](concepts/collaboration.md) · [Foreman mode](concepts/foreman-mode.md)
|
|
46
|
+
|
|
47
|
+
**Loops** — [Loops](concepts/loops.md) · [Templates](concepts/loop-templates.md) · [Bricks and their origins](concepts/loop-bricks.md) · [Notes and rules](concepts/loop-notes.md) · [Risk, trust and validation levels](concepts/loop-risk.md) · [Human gates](concepts/loop-gates.md) · [Contracts and ignored deletions](concepts/loop-contracts.md) · [LOOP.md, trailers and the loop branch](concepts/loop-branch.md)
|
|
35
48
|
|
|
36
49
|
## 4 · Reference
|
|
37
50
|
|
|
38
|
-
[CLI](reference/cli.md) · [
|
|
51
|
+
**CLI & environment** — [CLI](reference/cli.md) · [Loop actions](reference/loop-actions.md) · [Environment variables](reference/environment.md) · [Context and memory variables](reference/env-context.md)
|
|
52
|
+
|
|
53
|
+
**Troubleshooting** (by symptom) — [Overview](reference/troubleshooting.md) · [Install](reference/troubleshoot-install.md) · [Hooks, context and memory](reference/troubleshoot-hooks.md) · [Model, agents and MCP](reference/troubleshoot-tools.md) · [Updating](reference/troubleshoot-update.md) · [Doctor findings](reference/troubleshoot-doctor.md) · [Web console](reference/troubleshoot-web.md)
|
|
54
|
+
|
|
55
|
+
**OpenCode plugins** — [Overview](reference/opencode-plugins.md) · [context](reference/plugin-context.md) · [guard](reference/plugin-guard.md) · [learn](reference/plugin-learn.md) · [workflow](reference/plugin-workflow.md) · [notify](reference/plugin-notify.md) · [ponytail](reference/plugin-ponytail.md) · [activity](reference/plugin-activity.md)
|
|
56
|
+
|
|
57
|
+
**Glossary & about** — [Glossary](reference/glossary.md) · [About](reference/about.md)
|
|
39
58
|
|
|
40
59
|
## For contributors
|
|
41
60
|
|
package/docs/concepts/agents.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
group: concepts
|
|
3
|
-
order:
|
|
3
|
+
order: 4
|
|
4
4
|
title: "Agents"
|
|
5
5
|
kind: "concept"
|
|
6
|
+
section: "Harness"
|
|
7
|
+
description: "The specialists the main session can hand work to."
|
|
6
8
|
link: {"hash": "#/section/agents", "label": "Browse the catalog →"}
|
|
7
9
|
---
|
|
8
10
|
An **agent** is a specialist the main session can hand a piece of work to. Each one is a markdown file with its own instructions, installed where your host looks for subagents (`agents/` in the install). It runs in its own context and returns a result, so its reading and searching does not fill your conversation.
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
group: concepts
|
|
3
|
-
order:
|
|
3
|
+
order: 14
|
|
4
4
|
title: "Collaboration"
|
|
5
5
|
kind: "concept"
|
|
6
|
+
section: "Working together"
|
|
7
|
+
description: "Register, contract, how firmly a memory binds, and who you are."
|
|
6
8
|
---
|
|
7
9
|
Beside the [rules](rules.md), a few pieces shape *how* the agent works with you: the register it speaks in, the contract between you, how firmly a memory binds, and who you are. All of them are plain text in the install, so they reach every host unchanged.
|
|
8
10
|
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
group: concepts
|
|
3
|
-
order:
|
|
3
|
+
order: 12
|
|
4
4
|
title: "Exclusions"
|
|
5
5
|
kind: "concept"
|
|
6
|
+
section: "Configuration"
|
|
7
|
+
description: "Two ways to switch things off: one rule, or every hook in a folder."
|
|
6
8
|
link: {"hash": "#/harness", "label": "Manage in Harness →"}
|
|
7
9
|
---
|
|
8
10
|
Geneseed has two different ways to switch something off, and they work at different scales:
|
|
@@ -52,4 +54,4 @@ The finer switch removes a single doctrine rule from an install while keeping th
|
|
|
52
54
|
geneseed build --emit claude-global --exclude-rules "process 7"
|
|
53
55
|
```
|
|
54
56
|
|
|
55
|
-
The install records it (`Excluded rules: process 7` beside its pack list) and every rebuild and upgrade keeps it. The always-on Rules and the Ethos cannot be excluded. Picking packs and rules is covered in [
|
|
57
|
+
The install records it (`Excluded rules: process 7` beside its pack list) and every rebuild and upgrade keeps it. The always-on Rules and the Ethos cannot be excluded. Picking packs and rules is covered in [Doctrine packs and single rules](../guides/setup-doctrines.md); what the layers are is in [Rules](rules.md).
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
group: concepts
|
|
3
|
-
order:
|
|
3
|
+
order: 10
|
|
4
4
|
title: "Footprint (lean vs full)"
|
|
5
5
|
kind: "concept"
|
|
6
|
+
section: "Configuration"
|
|
7
|
+
description: "Lean or full: how much of the constitution rides inline every turn."
|
|
6
8
|
link: {"hash": "#/settings", "label": "Toggle it in Settings →"}
|
|
7
9
|
---
|
|
8
10
|
**Footprint** decides how much of the [constitution](rules.md) the agent carries *inline* in its instructions file on every turn. It has two settings, **lean** (the default) and **full**, chosen per install. It is a token-cost dial, not a rules dial: every rule the install adopted is in force at either setting.
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
group: concepts
|
|
3
|
-
order:
|
|
3
|
+
order: 15
|
|
4
4
|
title: "Foreman mode"
|
|
5
5
|
kind: "concept"
|
|
6
|
+
section: "Working together"
|
|
7
|
+
description: "Direct or foreman: whether the session does the work or hands it to a crew."
|
|
6
8
|
link: {"hash": "#/harness", "label": "Set the mode in Harness →"}
|
|
7
9
|
---
|
|
8
10
|
**Mode** decides how work gets executed in a session. Two modes ship: **direct**, the default, where the agent does every task itself, and **foreman**, where the session hands substantial tasks to a crew of [agents](agents.md) and keeps talking to you while they work.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: concepts
|
|
3
|
+
order: 7
|
|
4
|
+
title: "Hook gates, settings and the shim"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
section: "Harness"
|
|
7
|
+
description: "Gates fail closed, the settings files hooks are written to, Bob and OpenClaude, and the hook shim."
|
|
8
|
+
---
|
|
9
|
+
How Geneseed's [hooks](hooks.md) behave when something goes wrong, where they are written on each host, and the one file they all run through.
|
|
10
|
+
|
|
11
|
+
## Gates fail closed, and leave a trace
|
|
12
|
+
|
|
13
|
+
If a gate cannot evaluate a call — an unreadable payload, a bug — it asks, with the error as its reason, rather than silently letting the call through. Every prompt a gate raises adds one line to `notebook/gates.jsonl` in the install: the rule and the time, never the command or content. `geneseed status` counts them by rule.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
geneseed status
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
In an [excluded folder](exclusions.md), every hook of a global install exits silently. And a global install's `context` hook stands down when the repo has its own per-repo install of the same host, so nothing is injected twice.
|
|
20
|
+
|
|
21
|
+
## Where they are written
|
|
22
|
+
|
|
23
|
+
| Host | Global | Per repo |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| Claude Code | `~/.claude/settings.json` | `.claude/settings.local.json` |
|
|
26
|
+
| OpenClaude | `~/.openclaude/settings.json` | `.openclaude/settings.local.json` |
|
|
27
|
+
| Bob | `~/.bob/settings/settings.json` | `.bob/settings.json` |
|
|
28
|
+
|
|
29
|
+
Per repo, Claude Code and OpenClaude hooks go into the **local**, untracked settings file: the hook commands contain paths on your machine, and the team-shared `settings.json` would hand every teammate broken hooks.
|
|
30
|
+
|
|
31
|
+
The merge is surgical. Every other key and every hook of your own survive, and the install manifest records exactly which hook groups are Geneseed's, so an upgrade replaces and an uninstall removes only those.
|
|
32
|
+
|
|
33
|
+
## Bob and OpenClaude
|
|
34
|
+
|
|
35
|
+
**OpenClaude** is a Claude Code fork: it gets the same hooks and the same prompts, unchanged.
|
|
36
|
+
|
|
37
|
+
**Bob** has its own contract. It uses Claude's event names but ignores a hook's output before a tool call — the only way to refuse is exit code 2 — and it has no tool matcher, `SubagentStop` or `PreCompact`. So Bob gets three hooks:
|
|
38
|
+
|
|
39
|
+
- `SessionStart` → `geneseed-hook context`.
|
|
40
|
+
- `PreToolUse` → `geneseed-hook tool-gate`, the git gate and the rule gate fused into one command that decides from the shape of the call. It **blocks** (exit 2) only for the two Rules, secrets and destructive git. The commit/push and rule-or-memory checks become a warning line, because a hard block would leave Bob unable to commit at all.
|
|
41
|
+
- `Stop` → `geneseed-hook learn`.
|
|
42
|
+
|
|
43
|
+
Neither host has been verified live on the authoring machine. If a hook does not fire, the same rules still reach the agent through the instructions file.
|
|
44
|
+
|
|
45
|
+
## The hook shim
|
|
46
|
+
|
|
47
|
+
Hooks run with your project as the working directory, so each command needs an absolute path. Rather than write the Node path and the Geneseed checkout path into every settings file, every hook points at one stable file, the **hook shim**: `~/.geneseed/bin/geneseed-hook` (`geneseed-hook.cmd` on Windows). The shim holds those two paths; your settings hold none. Set `GENESEED_HOME` to keep it somewhere other than `~/.geneseed`.
|
|
48
|
+
|
|
49
|
+
Every build rewrites the shim, so moving the checkout and running one build repairs every install at once.
|
|
50
|
+
|
|
51
|
+
**A stale shim fails silently.** Hooks report through their output and exit 0 on every path — that is what keeps a broken hook from breaking your tool calls. The flip side: if the shim points at a checkout that no longer exists, every hook on the machine stops working and nothing tells you. The agent simply stops getting project context and the gates stop asking. `geneseed doctor` checks the shim; a build repairs it.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
geneseed doctor
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
See [Hook, context and memory problems](../reference/troubleshoot-hooks.md).
|
|
58
|
+
|
|
59
|
+
## Cost
|
|
60
|
+
|
|
61
|
+
The hook program is small on purpose: it adds about 14 ms to each tool call.
|
package/docs/concepts/hooks.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
group: concepts
|
|
3
|
-
order:
|
|
3
|
+
order: 6
|
|
4
4
|
title: "Hooks (Claude Code, Bob, OpenClaude)"
|
|
5
5
|
kind: "concept"
|
|
6
|
+
section: "Harness"
|
|
7
|
+
description: "The commands Claude Code, Bob and OpenClaude run at fixed moments, and what each gate does."
|
|
6
8
|
---
|
|
7
9
|
A **hook** is a command your host runs at a fixed moment — when a session starts, before a tool call, when the agent finishes. On Claude Code, Bob and OpenClaude, hooks are how Geneseed does anything *in code* rather than in prose: load your project's docs, stop a risky command for your confirmation, save what was learned.
|
|
8
10
|
|
|
@@ -10,7 +12,7 @@ A **hook** is a command your host runs at a fixed moment — when a session star
|
|
|
10
12
|
|
|
11
13
|
Geneseed writes its hooks into the host's settings file. Every hook calls one program, `geneseed-hook`, with a verb — not the `geneseed` CLI you type yourself. The instructions file (`CLAUDE.md`) needs no hook: the host loads it by location.
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
## The hooks on Claude Code
|
|
14
16
|
|
|
15
17
|
| Event | When | Command | What it does | Conditional? |
|
|
16
18
|
| --- | --- | --- | --- | --- |
|
|
@@ -22,7 +24,7 @@ Geneseed writes its hooks into the host's settings file. Every hook calls one pr
|
|
|
22
24
|
| `SubagentStop` | a subagent finishes | `geneseed-hook learn` | records a lesson for that agent in `memory/agents/<name>.md` | needs `GENESEED_LLM` |
|
|
23
25
|
| `PreCompact` | before auto-compaction | `geneseed-hook learn` | captures memory before the transcript is summarised | needs `GENESEED_LLM` |
|
|
24
26
|
|
|
25
|
-
|
|
27
|
+
## What each one does, and what you see
|
|
26
28
|
|
|
27
29
|
**context.** Before your first message, the agent receives your own harness files — `user-rules.md`, `PROFILE.md`, the memory index, the notebook index, your wiki declaration — skipping any still untouched since install, then the repo's docs, discovered by convention or listed in a `context.json`. Each file is capped at 16 KB and the whole injection at 48 KB; what does not fit is listed for the agent to read on demand. You see nothing, except that the agent already knows your project. See [Project context](../guides/project-context.md).
|
|
28
30
|
|
|
@@ -44,58 +46,8 @@ export GENESEED_LLM="claude -p"
|
|
|
44
46
|
|
|
45
47
|
Unset, `learn` does nothing useful — it prints the prompt it would have sent. Geneseed never stores or embeds an API key. See [Memory](memory.md).
|
|
46
48
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
If a gate cannot evaluate a call — an unreadable payload, a bug — it asks, with the error as its reason, rather than silently letting the call through. Every prompt a gate raises adds one line to `notebook/gates.jsonl` in the install: the rule and the time, never the command or content. `geneseed status` counts them by rule.
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
geneseed status
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
In an [excluded folder](exclusions.md), every hook of a global install exits silently. And a global install's `context` hook stands down when the repo has its own per-repo install of the same host, so nothing is injected twice.
|
|
56
|
-
|
|
57
|
-
### Where they are written
|
|
58
|
-
|
|
59
|
-
| Host | Global | Per repo |
|
|
60
|
-
| --- | --- | --- |
|
|
61
|
-
| Claude Code | `~/.claude/settings.json` | `.claude/settings.local.json` |
|
|
62
|
-
| OpenClaude | `~/.openclaude/settings.json` | `.openclaude/settings.local.json` |
|
|
63
|
-
| Bob | `~/.bob/settings/settings.json` | `.bob/settings.json` |
|
|
64
|
-
|
|
65
|
-
Per repo, Claude Code and OpenClaude hooks go into the **local**, untracked settings file: the hook commands contain paths on your machine, and the team-shared `settings.json` would hand every teammate broken hooks.
|
|
66
|
-
|
|
67
|
-
The merge is surgical. Every other key and every hook of your own survive, and the install manifest records exactly which hook groups are Geneseed's, so an upgrade replaces and an uninstall removes only those.
|
|
68
|
-
|
|
69
|
-
### Bob and OpenClaude
|
|
70
|
-
|
|
71
|
-
**OpenClaude** is a Claude Code fork: it gets the same hooks and the same prompts, unchanged.
|
|
72
|
-
|
|
73
|
-
**Bob** has its own contract. It uses Claude's event names but ignores a hook's output before a tool call — the only way to refuse is exit code 2 — and it has no tool matcher, `SubagentStop` or `PreCompact`. So Bob gets three hooks:
|
|
74
|
-
|
|
75
|
-
- `SessionStart` → `geneseed-hook context`.
|
|
76
|
-
- `PreToolUse` → `geneseed-hook tool-gate`, the git gate and the rule gate fused into one command that decides from the shape of the call. It **blocks** (exit 2) only for the two Rules, secrets and destructive git. The commit/push and rule-or-memory checks become a warning line, because a hard block would leave Bob unable to commit at all.
|
|
77
|
-
- `Stop` → `geneseed-hook learn`.
|
|
78
|
-
|
|
79
|
-
Neither host has been verified live on the authoring machine. If a hook does not fire, the same rules still reach the agent through the instructions file.
|
|
80
|
-
|
|
81
|
-
### The hook shim
|
|
82
|
-
|
|
83
|
-
Hooks run with your project as the working directory, so each command needs an absolute path. Rather than write the Node path and the Geneseed checkout path into every settings file, every hook points at one stable file, the **hook shim**: `~/.geneseed/bin/geneseed-hook` (`geneseed-hook.cmd` on Windows). The shim holds those two paths; your settings hold none. Set `GENESEED_HOME` to keep it somewhere other than `~/.geneseed`.
|
|
84
|
-
|
|
85
|
-
Every build rewrites the shim, so moving the checkout and running one build repairs every install at once.
|
|
86
|
-
|
|
87
|
-
**A stale shim fails silently.** Hooks report through their output and exit 0 on every path — that is what keeps a broken hook from breaking your tool calls. The flip side: if the shim points at a checkout that no longer exists, every hook on the machine stops working and nothing tells you. The agent simply stops getting project context and the gates stop asking. `geneseed doctor` checks the shim; a build repairs it.
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
geneseed doctor
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
See [Troubleshooting](../reference/troubleshooting.md).
|
|
94
|
-
|
|
95
|
-
### Cost
|
|
96
|
-
|
|
97
|
-
The hook program is small on purpose: it adds about 14 ms to each tool call.
|
|
98
|
-
|
|
99
|
-
### Verify
|
|
49
|
+
## Verify
|
|
100
50
|
|
|
101
51
|
Open a session in a repo and ask the agent what it knows about the project — it should answer from the repo's docs without reading them first. Ask it to commit something: you should get a prompt before the commit runs.
|
|
52
|
+
|
|
53
|
+
What happens when a gate cannot decide, where the hooks are written, and the one file they all run through: [Hook gates, settings and the shim](hook-gates.md).
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: concepts
|
|
3
|
+
order: 2
|
|
4
|
+
title: "What each host automates"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
section: "Harness"
|
|
7
|
+
description: "Row by row, which checks each host runs in code and which stay prose."
|
|
8
|
+
---
|
|
9
|
+
Every [host](hosts.md) gets the same content. This table is what each one lets Geneseed **automate** (check in code before an action) rather than only **ask** of the model.
|
|
10
|
+
|
|
11
|
+
| Capability | OpenCode | Claude Code | Bob | OpenClaude |
|
|
12
|
+
| --- | :---: | :---: | :---: | :---: |
|
|
13
|
+
| Instructions file | `AGENT.md` via `opencode.json` | `CLAUDE.md` | `AGENTS.md` + `rules/geneseed.md` | `CLAUDE.md` (`.openclaude/` per repo) |
|
|
14
|
+
| Agents · Skills · Memory · Notebook | ✅ | ✅ | ✅ | ✅ |
|
|
15
|
+
| Project context loaded at session start | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook² |
|
|
16
|
+
| Memory written back at session end (learn) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook² |
|
|
17
|
+
| Destructive git (force-push, `reset --hard`…) | 🔒 permission ask | 🪝 ask | 🪝 block¹ | 🪝 ask² |
|
|
18
|
+
| Secrets kept out of files | ⚙️ block⁴ | 🪝 ask | 🪝 block¹ | 🪝 ask² |
|
|
19
|
+
| Consent before every commit and push | 🔒 permission ask | 🪝 ask | 🪝 warning¹ | 🪝 ask² |
|
|
20
|
+
| Rule-or-memory write needs your call | ⚙️ speed bump³ | 🪝 ask | 🪝 warning¹ | 🪝 ask² |
|
|
21
|
+
| Sovereign-repo exclusions | ⚙️ plugins stand down | ✅ `claudeMdExcludes` | ✅ rules shadow stub | ✅ `claudeMdExcludes` |
|
|
22
|
+
| MCP server wiring | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcp.json` | ✅ `mcpServers` |
|
|
23
|
+
| Colour themes · LSP · workflow runner · primary agent · `/`-commands | ✅ | ➖ | ➖ | ➖ |
|
|
24
|
+
|
|
25
|
+
✅ native · ⚙️ OpenCode plugin · 🔒 `permission.bash` entry in `opencode.json` · 🪝 `settings.json` hook · ➖ no host mechanism (the rule still applies as prose).
|
|
26
|
+
|
|
27
|
+
¹ **Bob** has its own hook contract: Claude's event names, but it ignores a hook's output on `PreToolUse`, so the only way to refuse is exit code 2. Geneseed therefore blocks only the two always-on rules (secrets, destructive git) and turns the two consent checks into a logged warning. It has no `SubagentStop` or `PreCompact` event, so learn runs on `Stop` only. **Unverified live** — there is no Bob install on the authoring machine; the rules preamble still holds if a hook does not fire.
|
|
28
|
+
² **OpenClaude** is a Claude Code fork and gets Claude's hooks and verdicts verbatim, in `~/.openclaude/settings.json` (global) or `.openclaude/settings.local.json` (per repo). **Unverified live** for the same reason.
|
|
29
|
+
³ OpenCode's plugin hook can only allow or throw — there is no "ask the user" — so this check stops the first such write once rather than prompting.
|
|
30
|
+
⁴ The checks differ in shape: OpenCode's guard plugin blocks writes *to* private-key and credential files by path; the Claude-shaped hook looks at the *content* being written for credential-shaped strings (cloud keys, tokens, private-key blocks) and asks. A `.env` file is exempt on the hook side — that is where a secret is allowed to live.
|
|
31
|
+
|
|
32
|
+
## The one conditional row
|
|
33
|
+
|
|
34
|
+
The **consent before commit and push** row depends on a choice you make at build time. It enforces the rule *Consent Before Push*, which belongs to the **process** doctrine pack ([Rules](rules.md)). Build without that pack, or exclude that one rule, and the commit/push question goes away — but the gate itself stays: on Claude Code and OpenClaude the `git-gate` hook is still wired (with `--no-consent`), so destructive git is still caught. Everything else in the table is always on.
|
|
35
|
+
|
|
36
|
+
One OpenCode asymmetry: Geneseed shares `opencode.json` with you and cannot tell its own `git commit*` permission entry from one you typed, so a rebuild without the process pack leaves an existing entry in place and says so instead of deleting it.
|
|
37
|
+
|
|
38
|
+
In plain terms: [Enforced vs. asked](../understand/enforced-vs-asked.md).
|