geneseed 3.6.0 → 3.8.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 +74 -0
- package/DESIGN.md +6 -6
- package/QUICKSTART.md +1 -1
- package/README.md +33 -31
- package/SETUP.md +36 -10
- package/SHIPPED.md +3 -3
- package/adapters/claude-code/skills/geneseed/SKILL.md +1 -1
- package/adapters/openclaude/README.md +64 -0
- package/adapters/opencode/plugins/geneseed-workflow.js +1 -1
- package/adapters/opencode/workflows/_runtime.js +1 -1
- package/docs/extending.md +18 -6
- package/docs/web/exclusions.md +1 -0
- package/docs/web/footprint.md +1 -1
- package/docs/web/harnesses.md +14 -14
- package/docs/web/install-quick.md +1 -1
- package/docs/web/rules.md +1 -1
- package/docs/web/themes-author.md +1 -1
- package/docs/web-ui.md +1 -1
- package/harness.config.json +1 -1
- package/js/README.md +3 -3
- package/js/build/driver.mjs +64 -14
- package/js/build/emit-claude.mjs +1 -1
- package/js/build/generate.mjs +92 -42
- package/js/build/source.mjs +5 -4
- package/js/cli-table.json +151 -2
- package/js/hosts/hooks.mjs +11 -4
- package/js/hosts/hosts.mjs +17 -2
- package/js/hosts/installs.mjs +32 -2
- package/js/hosts/mcp.mjs +8 -1
- package/js/hosts/settings.mjs +4 -1
- package/js/inspect/diff.mjs +1 -1
- package/js/inspect/doctor.mjs +3 -3
- package/js/inspect/excludes.mjs +7 -5
- package/js/inspect/status.mjs +44 -8
- package/js/maintain/migrate.mjs +1 -1
- package/js/maintain/setup.mjs +7 -2
- package/js/maintain/uninstall.mjs +3 -3
- package/js/web/actions.mjs +7 -5
- package/js/web/api.mjs +2 -2
- package/js/web/docs.mjs +1 -1
- package/package.json +2 -1
- package/src/doctrines/README.md +3 -2
- package/src/doctrines/comms.md +53 -0
- package/src/doctrines/process.md +0 -26
- package/src/skills/geneseed.md +9 -8
- package/src/skills/parallel-agents.md +1 -1
- package/src/skills/pipeline.md +1 -1
- package/src/skills/token-report/SKILL.md +2 -1
- package/src/skills/token-report/VENDOR.md +3 -3
- package/src/skills/token-report/scripts/token_report.mjs +14 -7
- package/src/skills/workflow.md +2 -2
- package/themes/_TEMPLATE.json +5 -3
- package/themes/biker.json +5 -3
- package/themes/commentator.json +5 -3
- package/themes/cyberpunk.json +5 -3
- package/themes/gamer.json +5 -3
- package/themes/imperial.json +5 -3
- package/themes/joker.json +5 -3
- package/themes/marvin.json +5 -3
- package/themes/mean.json +5 -3
- package/themes/military.json +5 -3
- package/themes/neutral.json +5 -3
- package/themes/pirate.json +5 -3
- package/themes/sports.json +5 -3
- package/themes/verstappen.json +5 -3
- package/themes/wizard.json +5 -3
- package/web/dist/assets/{Activity-Flgf4kHy.js → Activity-CH-7cPIM.js} +1 -1
- package/web/dist/assets/{ActivityDetail-DIpr85nh.js → ActivityDetail-DZvz0xS5.js} +1 -1
- package/web/dist/assets/{CatalogRow-CjyLjaLb.js → CatalogRow-DftXpZHY.js} +1 -1
- package/web/dist/assets/{Diff-Deisdha8.js → Diff-DvwdG0L9.js} +1 -1
- package/web/dist/assets/{Docs-DGUdY4l4.js → Docs-DrJNDPwI.js} +1 -1
- package/web/dist/assets/{Doctor-F74lJ69P.js → Doctor-OTmwmYZg.js} +1 -1
- package/web/dist/assets/{GreenhouseView-D072lBiD.js → GreenhouseView-XxrAdriX.js} +1 -1
- package/web/dist/assets/Harness-C_LYNk5c.js +1 -0
- package/web/dist/assets/{JournalView-DWFqZ0Iw.js → JournalView-BcuyeEaR.js} +1 -1
- package/web/dist/assets/{Laws-BN6g3HU7.js → Laws-CWHrTKY4.js} +1 -1
- package/web/dist/assets/{Library-CDOv4emM.js → Library-CA9IHghn.js} +1 -1
- package/web/dist/assets/{OperatorHudView-CwNIUVX8.js → OperatorHudView-BMRY1Tt4.js} +1 -1
- package/web/dist/assets/{Profile-CpP9BTne.js → Profile-wceET1JY.js} +1 -1
- package/web/dist/assets/{Rules-DFXsUCB7.js → Rules-BEXvY4Tx.js} +1 -1
- package/web/dist/assets/{Settings-BqZVUtJ5.js → Settings-DS2zF0Ez.js} +1 -1
- package/web/dist/assets/{Skills-Cu6kBgfF.js → Skills-DahlOJuI.js} +1 -1
- package/web/dist/assets/{drawable-BgfrEBer.js → drawable-BTHjTzF7.js} +1 -1
- package/web/dist/assets/{index-CAqrWhKl.js → index-AN5Emnrg.js} +2 -2
- package/web/dist/assets/{lawCats-BLgxl151.js → lawCats-Btjp3Hk_.js} +1 -1
- package/web/dist/index.html +1 -1
- package/web/src/pages/Laws.jsx +6 -2
- package/web/dist/assets/Harness-DNRP2Va7.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,80 @@ label. For the capability ↔ spec map, see [SHIPPED.md](SHIPPED.md).
|
|
|
10
10
|
|
|
11
11
|
_Nothing yet._
|
|
12
12
|
|
|
13
|
+
## [3.8.0] — 2026-09-30
|
|
14
|
+
|
|
15
|
+
**Upgrading:** re-emit (or `geneseed rebuild-all`) after installing, so each install carries the
|
|
16
|
+
rewritten `geneseed` skill.
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
- `geneseed status` lists every install with its theme, footprint, posture/mode, doctrine packs
|
|
20
|
+
and excluded rules; `geneseed status --json` prints the same payload plus, per install, the
|
|
21
|
+
`geneseed build` command that rebuilds it unchanged — a global install's command names its
|
|
22
|
+
config dir with `--config-dir`, so it rebuilds in place even from a shell without the env
|
|
23
|
+
override that located it.
|
|
24
|
+
- `geneseed build` forwards the generator's flags (`--emit`, `--footprint`, `--posture`, `--mode`,
|
|
25
|
+
`--doctrines`, `--exclude-rules`, `--out`, `--root`, `--config-dir`); the dry run is
|
|
26
|
+
`geneseed validate`.
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
- `setup`'s non-interactive hint (`geneseed build --emit … --theme …`) was a usage error.
|
|
30
|
+
- The `geneseed` skill named `geneseed learn` and `geneseed context`, which are hook verbs the CLI
|
|
31
|
+
refuses; it now reads `status --json` and changes an install by one flag of its rebuild command.
|
|
32
|
+
- README and SETUP claimed `geneseed-build --validate-only` dry-runs a build; the generator refuses
|
|
33
|
+
that flag, and both now name `geneseed validate`.
|
|
34
|
+
- A `-global` emit ignored `--out` and always wrote the live config dir, so a global install could
|
|
35
|
+
not be previewed anywhere else; `--config-dir <dir>` now redirects it, and a per-repo emit
|
|
36
|
+
refuses the flag rather than ignoring it (#156).
|
|
37
|
+
|
|
38
|
+
## [3.7.0] — 2026-09-28
|
|
39
|
+
|
|
40
|
+
**Upgrading:** re-emit (or `geneseed rebuild-all`) after installing. An install built before
|
|
41
|
+
this change keeps the reference-codes rule: see *Address migration* below.
|
|
42
|
+
|
|
43
|
+
### Added — doctrines
|
|
44
|
+
|
|
45
|
+
- **A fifth doctrine pack, `comms` — how answers are presented.** On by default, rendered last
|
|
46
|
+
(craft → rigor → ops → process → comms), toggleable like every pack. It holds two rules:
|
|
47
|
+
- `comms 1` — *Codes That Persist*: the reference-codes rule (`D`/`O`/`F`/`R`/`Q`/`A`),
|
|
48
|
+
moved out of process unchanged, themed titles included.
|
|
49
|
+
- `comms 2` — *Structure Beside Prose*: beside the prose, pick a diagram or a table, rarely
|
|
50
|
+
both. Draw a boxes-and-arrows diagram only when the arrows carry meaning (flow,
|
|
51
|
+
dependencies, topology, a spatial subject, four or more linked elements, or on request);
|
|
52
|
+
classifications and comparisons take a table or list; three steps or fewer stay inline.
|
|
53
|
+
ASCII in a terminal, Mermaid where markdown renders it; a richer rendered page is offered
|
|
54
|
+
in one line, never built unasked. Strictly additive to `comms 1`: a diagram or table may
|
|
55
|
+
tag a coded item, never absorb, merge or renumber it.
|
|
56
|
+
|
|
57
|
+
### Changed — address migration
|
|
58
|
+
|
|
59
|
+
Anyone citing a doctrine rule by address must remap two of them:
|
|
60
|
+
|
|
61
|
+
| Old address | New address | Rule |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| `process 7` | `comms 1` | Codes That Persist (reference codes) |
|
|
64
|
+
| `process 8` | `process 7` | One Writer Per File |
|
|
65
|
+
|
|
66
|
+
`process 1`–`6` are unchanged. Every citation inside `src/` was remapped in this change. An
|
|
67
|
+
existing install is migrated when it is next rebuilt: if its carrier was rendered before the
|
|
68
|
+
comms pack existed (it names `process 8`, as a heading or in its `Excluded rules:` line) and its
|
|
69
|
+
`Active packs:` marker names `process`, `comms` is added so the codes rule is not lost; its
|
|
70
|
+
excluded rules are re-addressed by the table above. An install built after this change that has
|
|
71
|
+
comms switched off stays off.
|
|
72
|
+
|
|
73
|
+
### Added — hosts
|
|
74
|
+
|
|
75
|
+
- **OpenClaude as a fifth host** (`--emit openclaude` / `--emit openclaude-global`).
|
|
76
|
+
[OpenClaude](https://openclaude.gitlawb.com/) is an any-model CLI forked from Claude Code, so
|
|
77
|
+
it rides the Claude engine and hook dialect verbatim. Only the paths differ:
|
|
78
|
+
`~/.openclaude` (`$OPENCLAUDE_CONFIG_DIR`, OpenClaude's own variable) globally, and
|
|
79
|
+
`.openclaude/` per repo. The per-repo preamble is `.openclaude/CLAUDE.md` rather than a root
|
|
80
|
+
file, because OpenClaude skips a root `CLAUDE.md` whenever `AGENTS.md` exists. MCP config goes
|
|
81
|
+
in `.openclaude.json` / `.mcp.json`. The host is wired through setup (appended after `files`,
|
|
82
|
+
so scripted menu answers keep their numbers), uninstall, disable/enable, excludes, status,
|
|
83
|
+
doctor, the web console's Harness page and Deploy form, and the `token-report` skill. The
|
|
84
|
+
golden matrix gains 56 cells, plus 2 deletion cells. Unverified live: no OpenClaude install
|
|
85
|
+
on the authoring machine. See `adapters/openclaude/README.md`.
|
|
86
|
+
|
|
13
87
|
## [3.6.0] — 2026-09-27
|
|
14
88
|
|
|
15
89
|
**Upgrading:** re-emit (or `geneseed rebuild-all`) after installing. The root file changed, and
|
package/DESIGN.md
CHANGED
|
@@ -44,8 +44,8 @@ vault or a specific tool's hooks.
|
|
|
44
44
|
and the prose words the docs use: the core nouns `LAW(S)`/`DOCTRINE(S)`/`ONTOLOGY`/
|
|
45
45
|
`AGENT(S)`/`SKILL(S)`/`MEMORY`/`NOTEBOOK`/`VAULT`/`WIKI`, plus `TAGLINE`,
|
|
46
46
|
`LOADED_SIGIL`, `EPI_*`, `BENEDICTION`, `DESC_*`, `ROAST_PERSONA`, the invariant
|
|
47
|
-
titles `LEX_I`..`LEX_XI`, the
|
|
48
|
-
names `PACK_CRAFT`/`PACK_RIGOR`/`PACK_OPS`/`PACK_PROCESS`, and the section intros
|
|
47
|
+
titles `LEX_I`..`LEX_XI`, the 28 doctrine-rule titles `DOC_<PACK>_<n>`, the five pack
|
|
48
|
+
names `PACK_CRAFT`/`PACK_RIGOR`/`PACK_OPS`/`PACK_PROCESS`/`PACK_COMMS`, and the section intros
|
|
49
49
|
`INTRO_*`. Each theme defines its own nouns; **neutral keeps the plain words** (Rule,
|
|
50
50
|
Doctrine, Agent, Skill, Memory, Workspace), so neutral output is unchanged.
|
|
51
51
|
`{{LAW}}` and `{{DOCTRINE}}` must each be a **single word** — both heading parsers
|
|
@@ -101,9 +101,9 @@ vault or a specific tool's hooks.
|
|
|
101
101
|
- **Invariants** (`src/laws/universal.md`) — *what is never traded*. Eleven numbered
|
|
102
102
|
Rules, `I`..`XI`, nine in force — IX and XI are retired in place, their numbers kept so
|
|
103
103
|
existing citations resolve — headed `### {{LAW}} <roman> — {{LEX_<roman>}}`.
|
|
104
|
-
- **Doctrines** (`src/doctrines/{craft,rigor,ops,process}.md`) — *how work is done
|
|
104
|
+
- **Doctrines** (`src/doctrines/{craft,rigor,ops,process,comms}.md`) — *how work is done
|
|
105
105
|
here*. Practice rules addressed by pack and number, cited as `Doctrine process 5`.
|
|
106
|
-
`PACK_ORDER` (`js/build/source.mjs`) fixes the order craft → rigor → ops → process, which
|
|
106
|
+
`PACK_ORDER` (`js/build/source.mjs`) fixes the order craft → rigor → ops → process → comms, which
|
|
107
107
|
is narrative and deliberately not alphabetical.
|
|
108
108
|
|
|
109
109
|
**The Ontology and the Invariants are never toggleable** — every build carries both,
|
|
@@ -197,7 +197,7 @@ theme file defines a `DIR_*` key, so `laws/` is `laws/` in all fourteen voices.
|
|
|
197
197
|
| Themes | `themes/*.json` | — | token → label maps; `themes/opencode/` is a separate colour system |
|
|
198
198
|
| Release label | `harness.config.json` | `.geneseed-version` | the theme and the human-readable version the driver reads; the canonical identity is the source fingerprint, not this string |
|
|
199
199
|
| Lifecycle | `registry.json` | — | maintainer-side status/version/owner per agent and skill; never rendered into a bundle |
|
|
200
|
-
| Generator | `bin/build-driver.mjs` (`geneseed-build`) | — | substitution + `<!-- INCLUDE: -->` inlining, and the
|
|
200
|
+
| Generator | `bin/build-driver.mjs` (`geneseed-build`) | — | substitution + `<!-- INCLUDE: -->` inlining, and the eleven `--emit` targets |
|
|
201
201
|
| CLI, as data | `js/cli-table.json` | — | the owned document the entry point parses its own argv from |
|
|
202
202
|
| Automation | `bin/geneseed-cli.mjs` (`geneseed`) | — | 25 verbs — `build` / `doctor` / `status` / `prompt` / `diff` / `setup` / `web` / `upgrade` / … |
|
|
203
203
|
| Hooks | `bin/geneseed-hook.mjs` (`geneseed-hook`) | — | the five verbs an emitted hook config invokes: `context` / `git-gate` / `rule-gate` / `tool-gate` / `learn` |
|
|
@@ -225,7 +225,7 @@ theme file defines a `DIR_*` key, so `laws/` is `laws/` in all fourteen voices.
|
|
|
225
225
|
stuck. WIRE must precede MANIFEST because wiring is what fills the `managed` record the
|
|
226
226
|
manifest stores, and no RENDER may follow a WIRE because a render writes wholesale a file
|
|
227
227
|
a wire has just reconciled. `tests/unit/emit_phase_order.test.mjs` fails the build if any of
|
|
228
|
-
the
|
|
228
|
+
the eleven emits drifts out of that order, or if a new file-mutating routine in
|
|
229
229
|
`js/hosts/settings.mjs` is called from an emit without being classified. RENDER and WIRE now run
|
|
230
230
|
in the *same process* — the seam that once spawned a second runtime per emit is gone — so
|
|
231
231
|
the render and wire dispatchers stay two separate functions and two separate statements on
|
package/QUICKSTART.md
CHANGED
|
@@ -43,7 +43,7 @@ or a login item it did not create. Your clone keeps working meanwhile.
|
|
|
43
43
|
|
|
44
44
|
## Everything else
|
|
45
45
|
|
|
46
|
-
Claude Code, Bob and plain-`AGENT.md` installs, per-repo mode, MCP servers, all
|
|
46
|
+
Claude Code, Bob, Copilot, OpenClaude and plain-`AGENT.md` installs, per-repo mode, MCP servers, all
|
|
47
47
|
environment knobs, and troubleshooting live in the full **[Setup guide](SETUP.md)**.
|
|
48
48
|
|
|
49
49
|
Once installed, point the agent at your repo's own docs with a tiny
|
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
[](src/agents/)
|
|
15
15
|
[](src/laws/universal.md)
|
|
16
16
|
[](adapters/opencode/plugins/)
|
|
17
|
-
[](#-supported-harnesses)
|
|
17
|
+
[](#-supported-harnesses)
|
|
18
18
|
|
|
19
19
|
[**Why**](#-1--why-geneseed) · [**Setup**](#-2--setup) · [**Web & terminal**](#-3--web--terminal) · [**What you get**](#-4--what-you-get)
|
|
20
20
|
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
|
|
25
25
|
<p align="center"><img src="docs/assets/demo.svg" alt="geneseed setup, then two laws catching a force-push and a credential at the tool boundary" width="760"></p>
|
|
26
26
|
|
|
27
|
-
**Geneseed compiles your agent's rules instead of asking you to write them.** One source in `src/` renders into a ready-made harness for OpenCode, Claude Code, Bob, Copilot, or any `AGENT.md` tool: a constitution of laws and doctrines, a roster of capability agents, native skills, a memory convention — and, wherever the host has a hook surface, gates that *enforce* the laws at the tool boundary instead of hoping the model remembers them.
|
|
27
|
+
**Geneseed compiles your agent's rules instead of asking you to write them.** One source in `src/` renders into a ready-made harness for OpenCode, Claude Code, Bob, Copilot, OpenClaude, or any `AGENT.md` tool: a constitution of laws and doctrines, a roster of capability agents, native skills, a memory convention — and, wherever the host has a hook surface, gates that *enforce* the laws at the tool boundary instead of hoping the model remembers them.
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
30
|
npx geneseed setup
|
|
@@ -36,8 +36,8 @@ Want to read what it leaves behind before installing anything? [**geneseed-demo*
|
|
|
36
36
|
|
|
37
37
|
A hand-written instructions file is prose the model may or may not honour, copied into every repo and drifting in each one. Geneseed is a build, and that changes four things:
|
|
38
38
|
|
|
39
|
-
- **Laws are enforced, not suggested.** A force-push, a `reset --hard`, or a credential written into a tracked file is caught by a hook *before* the tool runs, in the host's own dialect — a prompt on Claude Code and
|
|
40
|
-
- **One source,
|
|
39
|
+
- **Laws are enforced, not suggested.** A force-push, a `reset --hard`, or a credential written into a tracked file is caught by a hook *before* the tool runs, in the host's own dialect — a prompt on Claude Code, Copilot and OpenClaude, a hard block on OpenCode, exit 2 on Bob. The gates fail closed, and every catch is one line in a ledger that `geneseed status` counts.
|
|
40
|
+
- **One source, six targets.** Skills are byte-identical on every host; only the wiring differs. Every commit renders all 317 emit configurations, and a second emit into the same tree must change nothing.
|
|
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
|
|
|
@@ -164,7 +164,7 @@ The harness ships as a small set of layers, and the web console's rail is the sa
|
|
|
164
164
|
| --- | --- |
|
|
165
165
|
| **🧭 Ethos** (`ontology/`) | the mind the rules govern, in four prose sections — **Telos** (the Pact: three ranked laws — protect the user, serve their intent, keep your own honesty), **Evidence** (every claim graded by how it was obtained), **Decisions** (classify and tier by reversibility, show the real forks), **Conduct** (answer what was asked, once). Always in force, never toggleable |
|
|
166
166
|
| **🛡️ Rules** (`laws/`) | 11 universal laws, nine of them in force — always, never toggleable: sealed-secrets, one-intent-one-act, verify-before-assert, deletion-is-deliberate, surface-failures, data-not-orders, least-privilege, root-cause, echo-the-intent. Laws IX and XI are retired, their numbers kept so old references resolve |
|
|
167
|
-
| **📐 Doctrines** (`doctrines/`) | practice packs, chosen per install at build time: **craft** (how code is written), **rigor** (how work is proven), **ops** (how the machine is operated), **process** (how a task is run). A doctrine rule may tighten a Rule, never repeal one, and the user's own `user-rules.md` outranks it. Pick with `geneseed-build --doctrines craft,rigor` (or `none`), a single rule with `--exclude-rules "process 7"`, in the setup wizard, or through the switches on the console's Constitution page; all
|
|
167
|
+
| **📐 Doctrines** (`doctrines/`) | practice packs, chosen per install at build time: **craft** (how code is written), **rigor** (how work is proven), **ops** (how the machine is operated), **process** (how a task is run), **comms** (how answers are presented). A doctrine rule may tighten a Rule, never repeal one, and the user's own `user-rules.md` outranks it. Pick with `geneseed-build --doctrines craft,rigor` (or `none`), a single rule with `--exclude-rules "process 7"`, in the setup wizard, or through the switches on the console's Constitution page; all five pack files ship on disk either way, so a citation into a pack you left out still resolves |
|
|
168
168
|
| **🤖 Agents** (18) | capability specialists: `reviewer`, `tester`, `architect`, `docs`, `security`, `explorer`, `researcher`, `developer` — plus a debate **council** the `council` skill convenes: `advocate`, `skeptic`, `pragmatist`, `steward`, `visionary`, `user-advocate`, `framer`, `empiricist`, `operator`, `historian` |
|
|
169
169
|
| **🛠 Skills** (52) | repeatable workflows: brainstorm · plan · **codebase-design** · **domain-modeling** · **wayfinder** · **tickets** · **develop** · **worktree** · debug · **prototype** · refactor · **ponytail** · **forge-mcp** · **bruno-collection-generator** · **bruno-test-writer** · geneseed-code-review · **fresh-eyes** · **security-audit** · **ci-fix** · **deps-audit** · **review-response** · commit · **ship** · **release** · **migrate** · **git-archaeology** · **git-rescue** · repo-map · document-project · **frontend-design** · **prose** · **ingest** · **research** · **teach** · **quiz** · handoff · roast-me · **council** · parallel-agents · **workflow** · **wiki** · **geneseed** · **rule** · **profile** · **consolidate-memory** · **skill-forge** · **opencode-theme** · **herdr** · **pipeline** · **daydream** · **react-view-transitions** · **token-report** |
|
|
170
170
|
| **🔌 Plugins** (OpenCode) | `geneseed-context` injects project docs *and your machine wiki* every session (and across compaction); `geneseed-learn` distils memory at session end; `geneseed-guard` enforces the safety Laws and protected wiki folders at the tool boundary; `geneseed-workflow` registers the `workflow` tool that runs saved orchestration scripts; `geneseed-notify` sends a native OS notification when a long run finishes; `geneseed-ponytail` holds a minimal-code mode (`/ponytail lite\|full\|ultra\|off`), opt-in, injecting the laziest-that-works ruleset every turn so it doesn't drift; `geneseed-activity` streams what each session is doing to the web console's Activity view |
|
|
@@ -210,49 +210,49 @@ A second per-install dial, **footprint**, sets how much of the constitution `AGE
|
|
|
210
210
|
|
|
211
211
|
**Lean is authored, not cut.** The Ethos, every Rule and every doctrine rule carry a hand-written lean form beside their full text (`LEAN` blocks in `src/`), so a rule's lean footprint is decided by its author and not by where its first full stop happens to fall — the earlier first-sentence cut shipped Rule II as one 36-character line and dropped its stop-and-ask mechanism, and shipped a doctrine rule like *Change as little as the task requires.* as six words with no verb to act on.
|
|
212
212
|
|
|
213
|
-
Both footprints put the full text on disk beside `AGENT.md`: `laws/`, `ontology/` and `doctrines/` all ship in the bundle at **full** text whatever the footprint, and **all
|
|
213
|
+
Both footprints put the full text on disk beside `AGENT.md`: `laws/`, `ontology/` and `doctrines/` all ship in the bundle at **full** text whatever the footprint, and **all five pack files ship whether or not the pack was built in** — which is what lets a citation into an inactive pack resolve. So lean is a context/token optimization, **not** a rules cut.
|
|
214
214
|
|
|
215
215
|
Lean is the default: the rationale is one read away and the context it frees is paid back on every turn. Switch to **full** when token cost is a non-issue or you run a smaller model, which leans harder on always-present rationale. Set it with `--footprint lean|full`, the Settings toggle, the per-harness dropdown in the Harnesses tab, or the setup wizard. It's remembered in a `.geneseed-footprint` marker and preserved across rebuilds, on every host (OpenCode, Claude Code, Bob, Copilot).
|
|
216
216
|
|
|
217
217
|
Either way the harness is otherwise identical — same files, Rules, capabilities, and guards; lean only relocates the *reasoning* to on-demand (and adds the standalone law, ontology and doctrine files to global/Claude/Bob installs). The one behavioural edge: with the rationale always in context, **full** applies a rule's nuance more reliably on subtle edge cases — or with a weaker model that may not reach for the pointer.
|
|
218
218
|
|
|
219
|
-
Want to check a build before it touches anything real? `geneseed
|
|
219
|
+
Want to check a build before it touches anything real? `geneseed validate --theme NAME --emit MODE --out TARGET` renders and validates into a throwaway sandbox — nothing under `--out`/`--root` is written — and exits non-zero on any problem. Details: [SETUP.md](SETUP.md#dry-run-a-build-validate).
|
|
220
220
|
|
|
221
221
|
---
|
|
222
222
|
|
|
223
223
|
## 🔌 Supported harnesses
|
|
224
224
|
|
|
225
|
-
One source,
|
|
225
|
+
One source, six emit targets. Geneseed builds into whichever host you point it
|
|
226
226
|
at — each with a per-repo and a global (`-global`) variant — plus a portable
|
|
227
227
|
`files` bundle any `AGENT.md`-aware tool can read. **OpenCode** runs its own
|
|
228
|
-
engine (JS plugins, colour themes, LSP); **Claude Code**, **Bob**,
|
|
229
|
-
**
|
|
228
|
+
engine (JS plugins, colour themes, LSP); **Claude Code**, **Bob**, **Copilot**
|
|
229
|
+
and **OpenClaude** share one Claude-shaped engine that diverges only by host dialect.
|
|
230
230
|
|
|
231
231
|
The harness — its Rules, Agents, Skills, Memory convention, and preamble voice —
|
|
232
232
|
is **identical on every host**. What differs is how much of it the host can
|
|
233
233
|
*automate* for you (via plugins or hooks) versus carry as preamble discipline.
|
|
234
234
|
|
|
235
|
-
| Capability | OpenCode | Claude Code | Bob | Copilot |
|
|
236
|
-
| --- | :---: | :---: | :---: | :---: |
|
|
237
|
-
| **Instructions file** | `AGENT.md` + `opencode.json` | `CLAUDE.md` | `AGENTS.md` + `rules/geneseed.md` | `AGENTS.md` / `copilot-instructions.md` |
|
|
238
|
-
| **Agents** (capability specialists) | ✅ native | ✅ | ✅ | ✅ `.agent.md` |
|
|
239
|
-
| **Skills** (byte-identical) | ✅ | ✅ | ✅ | ✅ |
|
|
240
|
-
| **Memory & Notebook** | ✅ | ✅ | ✅ | ✅ |
|
|
241
|
-
| **Context injection** | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ |
|
|
242
|
-
| **Memory write-back** (learn) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ |
|
|
243
|
-
| **Git-gate consent** (process 5) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ |
|
|
244
|
-
| **Rule-gate consent** (process 1) | ⚙️ plugin² | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ |
|
|
245
|
-
| **Laws I / IV at the boundary** | ⚙️ plugin (block) | 🪝 hook (ask) | 🪝 hook¹ (exit 2) | 🪝 hook³ (ask) |
|
|
246
|
-
| **Sovereign-repo excludes** | ⚙️ plugin | ✅ `claudeMdExcludes` | ✅ rules-shadow | ➖ none |
|
|
247
|
-
| **MCP server wiring** | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcp.json` | ✅ `mcp-config.json` |
|
|
248
|
-
| **Colour themes** | ✅ full palette | ➖ | ➖ | ➖ |
|
|
249
|
-
| **LSP · workflow runner · primary-agent · `/`-commands** | ✅ | ➖ | ➖ | ➖ |
|
|
250
|
-
|
|
251
|
-
<sub>✅ native support · ⚙️ OpenCode plugin · 🪝 `settings.json` hook · 📄 carried by preamble prose only · ➖ no host mechanism (harness discipline still applies) · ¹ Bob's own hook contract: global hooks in `~/.bob/settings/settings.json`, Claude's event names but stdout ignored on `PreToolUse` — a refusal is **exit code 2**. So Laws I/IV exit 2, the consent rules are a stderr line, `SessionStart` context is plain stdout, `Stop` runs learn; `SubagentStop`/`PreCompact` are not Bob events and are not written. Unverified live (no Bob install on the authoring machine); the harness still holds via the rules preamble. · ² OpenCode's `tool.execute.before` can only allow or throw, with no "ask the user" tier, so the rule gate is a one-shot speed bump there rather than a prompt. · ³ Copilot's `~/.copilot/settings.json` hooks (`sessionStart`, `preToolUse`, `agentStop`, `preCompact`) wired by the **global** emit only; `preToolUse` has an ask tier, so every rule asks as on Claude Code. Unverified live (no Copilot CLI on the authoring machine).</sub>
|
|
235
|
+
| Capability | OpenCode | Claude Code | Bob | Copilot | OpenClaude |
|
|
236
|
+
| --- | :---: | :---: | :---: | :---: | :---: |
|
|
237
|
+
| **Instructions file** | `AGENT.md` + `opencode.json` | `CLAUDE.md` | `AGENTS.md` + `rules/geneseed.md` | `AGENTS.md` / `copilot-instructions.md` | `CLAUDE.md` (in `.openclaude/` per repo) |
|
|
238
|
+
| **Agents** (capability specialists) | ✅ native | ✅ | ✅ | ✅ `.agent.md` | ✅ |
|
|
239
|
+
| **Skills** (byte-identical) | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|
240
|
+
| **Memory & Notebook** | ✅ | ✅ | ✅ | ✅ | ✅ |
|
|
241
|
+
| **Context injection** | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ | 🪝 hook⁴ |
|
|
242
|
+
| **Memory write-back** (learn) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ | 🪝 hook³ | 🪝 hook⁴ |
|
|
243
|
+
| **Git-gate consent** (process 5) | ⚙️ plugin | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ | 🪝 hook⁴ |
|
|
244
|
+
| **Rule-gate consent** (process 1) | ⚙️ plugin² | 🪝 hook | 🪝 hook¹ (warn) | 🪝 hook³ | 🪝 hook⁴ |
|
|
245
|
+
| **Laws I / IV at the boundary** | ⚙️ plugin (block) | 🪝 hook (ask) | 🪝 hook¹ (exit 2) | 🪝 hook³ (ask) | 🪝 hook⁴ (ask) |
|
|
246
|
+
| **Sovereign-repo excludes** | ⚙️ plugin | ✅ `claudeMdExcludes` | ✅ rules-shadow | ➖ none | ✅ `claudeMdExcludes` |
|
|
247
|
+
| **MCP server wiring** | ✅ `mcp` | ✅ `mcpServers` | ✅ `mcp.json` | ✅ `mcp-config.json` | ✅ `mcpServers` |
|
|
248
|
+
| **Colour themes** | ✅ full palette | ➖ | ➖ | ➖ | ➖ |
|
|
249
|
+
| **LSP · workflow runner · primary-agent · `/`-commands** | ✅ | ➖ | ➖ | ➖ | ➖ |
|
|
250
|
+
|
|
251
|
+
<sub>✅ native support · ⚙️ OpenCode plugin · 🪝 `settings.json` hook · 📄 carried by preamble prose only · ➖ no host mechanism (harness discipline still applies) · ¹ Bob's own hook contract: global hooks in `~/.bob/settings/settings.json`, Claude's event names but stdout ignored on `PreToolUse` — a refusal is **exit code 2**. So Laws I/IV exit 2, the consent rules are a stderr line, `SessionStart` context is plain stdout, `Stop` runs learn; `SubagentStop`/`PreCompact` are not Bob events and are not written. Unverified live (no Bob install on the authoring machine); the harness still holds via the rules preamble. · ² OpenCode's `tool.execute.before` can only allow or throw, with no "ask the user" tier, so the rule gate is a one-shot speed bump there rather than a prompt. · ³ Copilot's `~/.copilot/settings.json` hooks (`sessionStart`, `preToolUse`, `agentStop`, `preCompact`) wired by the **global** emit only; `preToolUse` has an ask tier, so every rule asks as on Claude Code. Unverified live (no Copilot CLI on the authoring machine). · ⁴ OpenClaude is a Claude Code fork: Claude's hook groups and verdicts verbatim, in `~/.openclaude/settings.json` (global) or `.openclaude/settings.local.json` (per repo). Unverified live (no OpenClaude install on the authoring machine).</sub>
|
|
252
252
|
|
|
253
253
|
**Reading the matrix.** Everything above the divider is at full parity — no host
|
|
254
254
|
drops an Agent, Skill, or the memory convention. The asymmetry is entirely in
|
|
255
|
-
*automation mechanism*: OpenCode's plugin surface and the Claude/Bob/Copilot hook
|
|
255
|
+
*automation mechanism*: OpenCode's plugin surface and the Claude/Bob/Copilot/OpenClaude hook
|
|
256
256
|
surfaces enforce a few Rules for you, each in the tier its host offers (a prompt on
|
|
257
257
|
Claude Code, a hard block or a logged warning where the host has no prompt to
|
|
258
258
|
give), and what no host can automate rides the preamble. The OpenCode-only extras (themes, LSP,
|
|
@@ -260,7 +260,8 @@ workflow runner, primary-agent) have no analogue on a Claude-shaped host.
|
|
|
260
260
|
|
|
261
261
|
Per-host wiring in depth: **[OpenCode](adapters/opencode/README.md)** ·
|
|
262
262
|
**[Claude Code](adapters/claude-code/README.md)** ·
|
|
263
|
-
**[Bob](adapters/bob/README.md)** · **[Copilot](adapters/copilot/README.md)
|
|
263
|
+
**[Bob](adapters/bob/README.md)** · **[Copilot](adapters/copilot/README.md)** ·
|
|
264
|
+
**[OpenClaude](adapters/openclaude/README.md)**.
|
|
264
265
|
Token cost per host: **[docs/token-footprint.md](docs/token-footprint.md)**.
|
|
265
266
|
|
|
266
267
|
## 🗂 Layout
|
|
@@ -281,7 +282,7 @@ Geneseed/
|
|
|
281
282
|
│ ├── AGENT.md.tmpl the entrypoint, rendered to AGENT.md
|
|
282
283
|
│ ├── ontology/ how the agent thinks — Telos, Evidence, Decisions, Conduct
|
|
283
284
|
│ ├── laws/ the universal invariants
|
|
284
|
-
│ ├── doctrines/ the
|
|
285
|
+
│ ├── doctrines/ the five practice packs (craft, rigor, ops, process, comms)
|
|
285
286
|
│ ├── postures/ the relationship register, inlined into AGENT.md
|
|
286
287
|
│ ├── modes/ the operating register, inlined into AGENT.md
|
|
287
288
|
│ ├── agents/ capability specialists
|
|
@@ -293,7 +294,7 @@ Geneseed/
|
|
|
293
294
|
├── tests/ Node test suites, golden.mjs (every emit config) and mutate.mjs
|
|
294
295
|
├── docs/ guides (web-ui, wiki, …) + docs/web/ (the console's Docs pages);
|
|
295
296
|
│ specs/, reviews/, superpowers/ are local working docs — git-ignored
|
|
296
|
-
├── adapters/ per-host glue (opencode/, claude-code/, bob/, copilot/)
|
|
297
|
+
├── adapters/ per-host glue (opencode/, claude-code/, bob/, copilot/, openclaude/)
|
|
297
298
|
└── .github/workflows/ ci.yml (doctor + tests) · publish.yml (npm, OIDC, manual only)
|
|
298
299
|
```
|
|
299
300
|
|
|
@@ -345,6 +346,7 @@ Details and precedence rules: [SETUP.md → Upgrade](SETUP.md#upgrade).
|
|
|
345
346
|
| **[adapters/claude-code/](adapters/claude-code/README.md)** | The Claude Code hook adapter |
|
|
346
347
|
| **[adapters/bob/](adapters/bob/README.md)** | The IBM Bob adapter — Claude-shaped, rules-file preamble |
|
|
347
348
|
| **[adapters/copilot/](adapters/copilot/README.md)** | The GitHub Copilot adapter — global hooks (`sessionStart`, `preToolUse`, `agentStop`, `preCompact`) |
|
|
349
|
+
| **[adapters/openclaude/](adapters/openclaude/README.md)** | The OpenClaude adapter — the Claude engine under `~/.openclaude` / `.openclaude/` |
|
|
348
350
|
| **[src/memory/README.md](src/memory/README.md)** | The memory convention |
|
|
349
351
|
| **[src/notebook/README.md](src/notebook/README.md)** | The agent's own freeform-space convention |
|
|
350
352
|
|
package/SETUP.md
CHANGED
|
@@ -22,7 +22,7 @@ that matches your tool, then configure and verify. For the conceptual overview s
|
|
|
22
22
|
|
|
23
23
|
- **Node ≥ 22.3** — the only hard requirement. Geneseed ships as an npm package with
|
|
24
24
|
**zero dependencies**; `npx geneseed` needs nothing else.
|
|
25
|
-
- **Your agent tool** — OpenCode (recommended), Claude Code, Bob, Copilot, or anything
|
|
25
|
+
- **Your agent tool** — OpenCode (recommended), Claude Code, Bob, Copilot, OpenClaude, or anything
|
|
26
26
|
that reads a root instructions file.
|
|
27
27
|
- *Only for a git checkout:* **git**. Nothing else — a checkout runs the same Node
|
|
28
28
|
entry points the npm package installs.
|
|
@@ -94,6 +94,7 @@ hand? Pick a path below.
|
|
|
94
94
|
| [B — OpenCode, per-repo](#path-b--opencode-per-repo) | You want a committed `.opencode/` layer in one repository. |
|
|
95
95
|
| [C — Claude Code](#path-c--claude-code) | You drive Claude Code and want the lifecycle hooks. |
|
|
96
96
|
| [C′ — GitHub Copilot](#path-c--github-copilot) | You drive the Copilot CLI, coding agent, or VS Code agent mode. |
|
|
97
|
+
| [C″ — OpenClaude](#path-c--openclaude) | You drive OpenClaude, the any-model Claude Code fork. |
|
|
97
98
|
| [D — Any `AGENT.md` tool](#path-d--any-agentmd-tool) | Cursor, Aider, or any tool that reads a root instructions file. |
|
|
98
99
|
| [E — No runtime on the target at all](#path-e--no-runtime-on-the-target-at-all) | The machine that *uses* the harness cannot run Node. |
|
|
99
100
|
|
|
@@ -214,7 +215,8 @@ Inside an excluded folder the global install is fully dormant: the context,
|
|
|
214
215
|
learn and git-gate hooks exit silently (they check `<config dir>/excludes.json`
|
|
215
216
|
on every call — edits take effect immediately, no re-emit), and the global
|
|
216
217
|
preamble is suppressed natively (Claude: `claudeMdExcludes` written to the
|
|
217
|
-
repo's own `.claude/settings.local.json
|
|
218
|
+
repo's own `.claude/settings.local.json`, and OpenClaude's in `.openclaude/settings.local.json`;
|
|
219
|
+
Bob: the workspace rules shadow stub;
|
|
218
220
|
OpenCode: the plugins stand down). Everything is reversed by `exclude remove`.
|
|
219
221
|
|
|
220
222
|
Limitations: GitHub Copilot has no per-repo suppression mechanism, so the global
|
|
@@ -255,6 +257,28 @@ shape). `$COPILOT_CONFIG_DIR` relocates the personal dir, mirroring
|
|
|
255
257
|
`$BOB_CONFIG_DIR`. Note both carriers stack if you install globally *and* per-repo —
|
|
256
258
|
the global emit warns when that's about to happen.
|
|
257
259
|
|
|
260
|
+
### Path C″ — OpenClaude
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
geneseed-build --emit openclaude-global # render into ~/.openclaude
|
|
264
|
+
geneseed-build --emit openclaude --out . --root . # per-repo: .openclaude/, committed
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
[OpenClaude](https://openclaude.gitlawb.com/) grew out of the Claude Code codebase, so this
|
|
268
|
+
is Path C with another config dir: the same agents, skills, hook groups and `ask` verdicts.
|
|
269
|
+
It never reads `~/.claude` or a project `.claude/`, so a Claude Code install does not reach
|
|
270
|
+
it. Both installs can live side by side. Two differences:
|
|
271
|
+
|
|
272
|
+
- **The per-repo preamble is `.openclaude/CLAUDE.md`**, not a root file. OpenClaude skips a
|
|
273
|
+
root `CLAUDE.md` whenever the repo has an `AGENTS.md`, and reads `.openclaude/CLAUDE.md`
|
|
274
|
+
always. Hooks go in `.openclaude/settings.local.json` (gitignored) with a
|
|
275
|
+
`claudeMdExcludes` for the global preamble, as on Claude Code.
|
|
276
|
+
- **`$OPENCLAUDE_CONFIG_DIR` relocates the global dir.** It is OpenClaude's own variable.
|
|
277
|
+
MCP servers go in `~/.openclaude.json`, or in `.openclaude.json` inside that dir when it is
|
|
278
|
+
set. Per repo they go in `.mcp.json`.
|
|
279
|
+
|
|
280
|
+
Details in [adapters/openclaude/](adapters/openclaude/README.md).
|
|
281
|
+
|
|
258
282
|
### Path D — Any `AGENT.md` tool
|
|
259
283
|
|
|
260
284
|
```
|
|
@@ -323,7 +347,7 @@ case where a `0` would have meant "in sync" without having checked anything.
|
|
|
323
347
|
The constitution is three tiers, and only one of them is a choice. The **Ontology** (how the
|
|
324
348
|
agent thinks — Telos, Evidence, Decisions, Conduct) and the nine **Rules** (what it never
|
|
325
349
|
trades away) are always on and cannot be switched off. The **Doctrines** are practices rather
|
|
326
|
-
than principles, and they ship as
|
|
350
|
+
than principles, and they ship as five packs:
|
|
327
351
|
|
|
328
352
|
| Pack | What it governs |
|
|
329
353
|
| --- | --- |
|
|
@@ -331,17 +355,18 @@ than principles, and they ship as four packs:
|
|
|
331
355
|
| **rigor** | how work is proven — idempotence, honest tests, cover-and-verify, gates that can actually fail |
|
|
332
356
|
| **ops** | how the machine is driven — tool discovery, commands that return, complete teardowns, restart is not reload |
|
|
333
357
|
| **process** | how a session runs — planning, context economy, docs first, bounded loops, and the consent gate on every commit and push |
|
|
358
|
+
| **comms** | how answers are presented — stable reference codes on tracked items, a diagram or a table only where it earns its place |
|
|
334
359
|
|
|
335
360
|
They are picked **at build time**, once, on the generator — there is no runtime toggle — and
|
|
336
|
-
the default is all
|
|
361
|
+
the default is all five:
|
|
337
362
|
|
|
338
363
|
geneseed-build --doctrines craft,rigor # two packs
|
|
339
364
|
geneseed-build --doctrines none # ontology and the nine Rules only
|
|
340
|
-
geneseed-build # all
|
|
365
|
+
geneseed-build # all five (the default)
|
|
341
366
|
|
|
342
367
|
`harness.config.json`'s `doctrines` array sets this checkout's own default, and `doctor`
|
|
343
368
|
refuses one that names a pack the checkout does not ship. Order is fixed by the harness
|
|
344
|
-
(craft → rigor → ops → process) regardless of the order you type.
|
|
369
|
+
(craft → rigor → ops → process → comms) regardless of the order you type.
|
|
345
370
|
|
|
346
371
|
### One rule at a time
|
|
347
372
|
|
|
@@ -428,7 +453,7 @@ you run a smaller model.
|
|
|
428
453
|
**Same harness, either way.** Footprint changes neither what the harness *is* nor what it
|
|
429
454
|
can *do*: lean and full emit identical files (same agents, skills, plugins, commands, memory,
|
|
430
455
|
notebook, hooks) and every Rule is present and binding. The only structural difference is
|
|
431
|
-
that a lean install on a global / Claude / Bob / Copilot target also ships the standalone
|
|
456
|
+
that a lean install on a global / Claude / Bob / Copilot / OpenClaude target also ships the standalone
|
|
432
457
|
`laws/universal.md` and `ontology/` (project bundles already carry them, and `doctrines/`
|
|
433
458
|
ships at both footprints on every target); the only behavioural difference is that the
|
|
434
459
|
reasoning loads on demand instead of every turn. Lean is the default; full, with the rationale
|
|
@@ -438,7 +463,7 @@ with a weaker model, and is one flag away.
|
|
|
438
463
|
Set it with `--footprint lean|full` (alongside any `--emit`), the **Footprint** toggle in
|
|
439
464
|
the web Settings, the per-harness dropdown in the Harnesses tab, or the setup wizard. It is
|
|
440
465
|
remembered in a `.geneseed-footprint` marker and preserved across every rebuild, on every
|
|
441
|
-
host (OpenCode, Claude Code, Bob, Copilot).
|
|
466
|
+
host (OpenCode, Claude Code, Bob, Copilot, OpenClaude).
|
|
442
467
|
|
|
443
468
|
### Dry-run a build (`validate`)
|
|
444
469
|
|
|
@@ -447,8 +472,8 @@ geneseed validate --theme imperial --emit opencode --out /path/to/repo/Harness
|
|
|
447
472
|
```
|
|
448
473
|
|
|
449
474
|
(It is a verb on the CLI rather than a flag on the generator because it runs `doctor`, and
|
|
450
|
-
the generator is deliberately unable to start a process
|
|
451
|
-
|
|
475
|
+
the generator is deliberately unable to start a process — `geneseed-build` refuses
|
|
476
|
+
`--validate-only` outright.)
|
|
452
477
|
|
|
453
478
|
Renders and emits the requested `--theme`/`--emit`/`--out`/`--root`/`--footprint`
|
|
454
479
|
combination into a throwaway sandbox — nothing under the real `--out`/`--root` is
|
|
@@ -917,6 +942,7 @@ not connected, walk these in order:
|
|
|
917
942
|
| `GENESEED_NO_WEB` | `home` | `1` disables the web-first default of bare `geneseed` — it prints the command list instead |
|
|
918
943
|
| `GENESEED_STACK_GLOBAL` | context hook | `1` disables project-bypasses-global: a project install of the same host no longer makes the global install's hook stand down, so both inject |
|
|
919
944
|
| `OPENCODE_CONFIG_DIR` / `XDG_CONFIG_HOME` | global emit | where the global install is written |
|
|
945
|
+
| `OPENCLAUDE_CONFIG_DIR` | `openclaude-global` emit | OpenClaude's own config dir variable (default `~/.openclaude`); also moves `.openclaude.json` |
|
|
920
946
|
| `OPENCODE_DISABLE_LSP_DOWNLOAD` | OpenCode (LSP) | `true` stops OpenCode auto-downloading built-in language servers (typescript, pyright, jdtls) — set it on air-gapped machines and pre-install each server yourself |
|
|
921
947
|
|
|
922
948
|
---
|
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.8.0**.
|
|
24
24
|
|
|
25
25
|
## Capabilities
|
|
26
26
|
|
|
@@ -30,14 +30,14 @@ Every row below is present in the tree today; "Spec" names the design record.
|
|
|
30
30
|
| --- | --- | --- |
|
|
31
31
|
| **Themed generator** | One neutral `src/` → 14 themed bundles via `geneseed-build` (zero dependencies); structure stays theme-independent | [DESIGN.md](DESIGN.md) |
|
|
32
32
|
| **Laws / Agents / Skills / Memory / Notebook** | 11 laws, 18 agents, 52 skills, the memory convention, and the agent's sovereign notebook | `2026-06-11-notebook-sovereign-space` · `2026-06-10-notebook-agent-own-space` |
|
|
33
|
-
| **Three-tier constitution** | The governance surface splits into an always-on **Ontology** (Telos, Evidence, Decisions, Conduct — the Pact absorbed into Telos), the eleven always-on **Invariants** (IX and XI retired in place — folded into rigor 5 and Law III, numbers kept), and
|
|
33
|
+
| **Three-tier constitution** | The governance surface splits into an always-on **Ontology** (Telos, Evidence, Decisions, Conduct — the Pact absorbed into Telos), the eleven always-on **Invariants** (IX and XI retired in place — folded into rigor 5 and Law III, numbers kept), and five toggleable **Doctrine** packs (craft, rigor, ops, process, comms) addressed `<pack> <n>`. Packs are chosen at build time with `--doctrines` or the setup wizard; the whole catalogue ships on disk either way, so a citation into an inactive pack still resolves. Precedence, in order: Ontology + Invariants, then the user's `user-rules.md`, then the active Doctrines, then `PROFILE.md`. `doctor`'s `constitutionProblems` gates pack numbering, the per-rule Principle column, every `{{DOCTRINE}}` citation in `src/`, and the rule that an always-on tier may never cite a toggleable one | `2026-08-19-three-tier-constitution-design` |
|
|
34
34
|
| **`doctor`** | One check: unresolved tokens, dead/non-hermetic links, theme-key parity, authoring gates, rendered-bundle drift | `2026-06-07-theme-aware-doctor-diff` |
|
|
35
35
|
| **`diff` + improvements export** | Deployed-vs-source drift report; export an `improvements.md` back-port | `2026-06-12-improvements-export` |
|
|
36
36
|
| **`status` / `version`** | Headless dashboard + fingerprint verdict (no TUI needed) | `2026-06-07-status-command` · `2026-06-07-version-and-uninstall` |
|
|
37
37
|
| **Terminal rendering** | There is no full-screen control panel: `tui` and `menu` are verbs that say so and print the command list. The display-width and glyph layer ships on, behind `status` and the install animation | `2026-06-07-tui-refactor-polish` · `2026-06-08-tui-modern-refresh` · `2026-06-11-windows-tui` |
|
|
38
38
|
| **Web console** | Local browser UI (Dashboard; Codex: Constitution, Rules, Profile, Skills, Agents, Library, Docs; Care: Activity, Changes, Doctor; Setup: Harness, Settings), auto-build, in-app docs menu | `2026-06-12-web-ui-v2` · `2026-06-12-web-auto-build` · `2026-06-13-docs-menu` |
|
|
39
39
|
| **OpenCode adapter** | Native agents/skills mapping + plugins (context, learn, guard, workflow, notify, ponytail, activity); global-emit link integrity; JSONC config target | `2026-06-07-opencode-adapter-features` · `2026-06-07-global-emit-link-integrity` · `2026-06-12-opencode-jsonc-target` · `2026-06-16-ponytail-minimal-code-mode` |
|
|
40
|
-
| **Host hooks, per dialect** | Every host gets the hook surface its runtime offers, spoken in that runtime's own verdict dialect via `--host`: Claude Code asks (`permissionDecision`), Copilot asks as Claude does (`sessionStart`, `preToolUse`, `agentStop`, `preCompact` in `~/.copilot/settings.json`, global scope only), Bob refuses by exit code 2 (five Claude-named events, nested `~/.bob/settings/settings.json`, no subagent event), OpenCode's guard throws. Laws I/IV are the hard tier everywhere; the consent rules ask where a host can ask and warn where it cannot. `tool-gate` fuses the two gates for hosts that run one command per event; `PreCompact` runs `learn` before Claude compacts; every block or ask lands in `notebook/gates.jsonl` on every host | [copilot](adapters/copilot/README.md) · [bob](adapters/bob/README.md) · [claude-code](adapters/claude-code/README.md) · [candidate hosts](docs/candidate-hosts.md) |
|
|
40
|
+
| **Host hooks, per dialect** | Every host gets the hook surface its runtime offers, spoken in that runtime's own verdict dialect via `--host`: Claude Code asks (`permissionDecision`), OpenClaude asks exactly as Claude does (a Claude Code fork, under `~/.openclaude` / `.openclaude/`), Copilot asks as Claude does (`sessionStart`, `preToolUse`, `agentStop`, `preCompact` in `~/.copilot/settings.json`, global scope only), Bob refuses by exit code 2 (five Claude-named events, nested `~/.bob/settings/settings.json`, no subagent event), OpenCode's guard throws. Laws I/IV are the hard tier everywhere; the consent rules ask where a host can ask and warn where it cannot. `tool-gate` fuses the two gates for hosts that run one command per event; `PreCompact` runs `learn` before Claude compacts; every block or ask lands in `notebook/gates.jsonl` on every host | [copilot](adapters/copilot/README.md) · [bob](adapters/bob/README.md) · [claude-code](adapters/claude-code/README.md) · [candidate hosts](docs/candidate-hosts.md) |
|
|
41
41
|
| **Workflow primitive** | Saved, code-driven subagent orchestration (`workflow` tool + runtime); shipped scripts include `dispatch` — decompose a goal, route each subtask to its owning agent, converge | `2026-06-09-opencode-workflow-primitive` |
|
|
42
42
|
| **Per-agent memory** | Each capability agent keeps durable lessons in `memory/agents/<name>.md`: read at dispatch, written back mechanically by `learn` on session/subagent end (OpenCode plugin + Claude `SubagentStop`; Bob has no subagent event); `learn --consolidate` rebuilds the index | `2026-07-04-orchestration-memory-upgrade` |
|
|
43
43
|
| **Wiki integration** | Machine-wide knowledge base (`wiki.jsonc`): eager/lazy loading, conventions, protected folders enforced at the tool boundary | `2026-06-11-wiki-knowledge-base` |
|
|
@@ -21,7 +21,7 @@ If none resolve, the user does not have Geneseed deployed here — say so and st
|
|
|
21
21
|
|
|
22
22
|
A live harness root contains: `AGENT.md`, `ontology/universal.md`, `laws/universal.md`, `doctrines/<pack>.md`, `agents/<name>.md`, `skills/<name>/SKILL.md`, `memory/MEMORY.md`, `notebook/NOTEBOOK.md`, `themes/`, and (on OpenCode) `plugins/`, `workflows/`, `opencode.jsonc`, `wiki.jsonc`.
|
|
23
23
|
|
|
24
|
-
The constitution is **three tiers**: an always-on **Ontology** (four prose sections — Telos, Evidence, Decisions, Conduct), nine always-on **Rules** numbered I–IX, and the **Doctrines** — practice packs (`craft`, `rigor`, `ops`, `process`) chosen per install at build time. `AGENT.md` carries all three inline (whole at the `full` footprint, heading-plus-first-line at `lean`), *and* the complete text ships as files beside it. All
|
|
24
|
+
The constitution is **three tiers**: an always-on **Ontology** (four prose sections — Telos, Evidence, Decisions, Conduct), nine always-on **Rules** numbered I–IX, and the **Doctrines** — practice packs (`craft`, `rigor`, `ops`, `process`, `comms`) chosen per install at build time. `AGENT.md` carries all three inline (whole at the `full` footprint, heading-plus-first-line at `lean`), *and* the complete text ships as files beside it. All five pack files ship even when a pack was not built in, so a citation into an inactive pack still resolves on disk — which is why a question about a rule is answered from the tier file, never only from `AGENT.md`.
|
|
25
25
|
|
|
26
26
|
## Read-only verbs (safe, no confirmation needed)
|
|
27
27
|
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# 🦀 OpenClaude adapter
|
|
2
|
+
|
|
3
|
+
> [← Back to README](../../README.md) · [Setup guide](../../SETUP.md) · [Claude Code adapter](../claude-code/README.md) · [OpenCode adapter](../opencode/README.md)
|
|
4
|
+
|
|
5
|
+
[OpenClaude](https://openclaude.gitlawb.com/) (`@gitlawb/openclaude`, binary
|
|
6
|
+
`openclaude`) is an open-source coding-agent CLI that "originated from the Claude
|
|
7
|
+
Code codebase" and talks to any model provider. Its config surfaces are Claude
|
|
8
|
+
Code's (`settings.json` hooks, `agents/*.md`, `skills/<name>/SKILL.md`,
|
|
9
|
+
`CLAUDE.md`, `claudeMdExcludes`), so the emit **reuses the Claude engine and the
|
|
10
|
+
Claude hook dialect verbatim**. What changes is where OpenClaude keeps its config.
|
|
11
|
+
There is nothing to install by hand: `geneseed setup` (or `geneseed-build --emit
|
|
12
|
+
openclaude` / `--emit openclaude-global`) writes everything.
|
|
13
|
+
|
|
14
|
+
**OpenClaude never reads `~/.claude`, a project `.claude/`, or `$CLAUDE_CONFIG_DIR`.**
|
|
15
|
+
A Claude Code install is invisible to it, so it gets its own. The two coexist on one
|
|
16
|
+
machine and in one repo without touching each other.
|
|
17
|
+
|
|
18
|
+
## What the emit writes
|
|
19
|
+
|
|
20
|
+
### Per-repo (`--emit openclaude`)
|
|
21
|
+
|
|
22
|
+
Everything lives under **`.openclaude/`**. Nothing is written at the repo root.
|
|
23
|
+
|
|
24
|
+
- `CLAUDE.md`: the harness preamble as a delimited **managed block**. OpenClaude
|
|
25
|
+
loads the root `AGENTS.md`, or the root `CLAUDE.md` only when `AGENTS.md` is
|
|
26
|
+
absent, but it **always** reads `.openclaude/CLAUDE.md`. Writing there means the
|
|
27
|
+
preamble loads in every repo, and a root `CLAUDE.md` owned by a Claude Code install
|
|
28
|
+
(or by you) is left alone.
|
|
29
|
+
- `agents/<name>.md` in the Claude subagent dialect, and `skills/<name>/SKILL.md`,
|
|
30
|
+
byte-identical to every other host.
|
|
31
|
+
- `settings.local.json`: Geneseed's hooks, plus a `claudeMdExcludes` entry for the
|
|
32
|
+
global `~/.openclaude/CLAUDE.md` (project-bypasses-global, as on Claude).
|
|
33
|
+
Gitignored by the emit's `.openclaude/.gitignore`, because the hook commands name
|
|
34
|
+
this machine's paths.
|
|
35
|
+
- `memory/`, `notebook/` stores and their indices.
|
|
36
|
+
- MCP servers you wire with `geneseed mcp` or the web console go in the repo's
|
|
37
|
+
`.mcp.json`, as on Claude.
|
|
38
|
+
|
|
39
|
+
### Global (`--emit openclaude-global` → `~/.openclaude`, or `$OPENCLAUDE_CONFIG_DIR`)
|
|
40
|
+
|
|
41
|
+
The same layout under the config dir, with `CLAUDE.md` (auto-loaded as user
|
|
42
|
+
memory) and `settings.json`. `$OPENCLAUDE_CONFIG_DIR` is OpenClaude's own
|
|
43
|
+
documented variable, so Geneseed honours it. Claude's `$CLAUDE_CONFIG_DIR` is
|
|
44
|
+
ignored, as OpenClaude ignores it. MCP servers go in `~/.openclaude.json`, or in
|
|
45
|
+
`$OPENCLAUDE_CONFIG_DIR/.openclaude.json` when the variable is set: OpenClaude's
|
|
46
|
+
global config file.
|
|
47
|
+
|
|
48
|
+
## Hooks
|
|
49
|
+
|
|
50
|
+
The Claude group set, unchanged: `PreToolUse` (git gate on `Bash`, rule gate on
|
|
51
|
+
writes), `SessionStart` (context on `startup|clear` and `resume|compact`), `Stop`,
|
|
52
|
+
`SubagentStop` and `PreCompact` (learn). OpenClaude reads Claude's
|
|
53
|
+
`hookSpecificOutput.permissionDecision`, so the gates **ask** where Claude asks.
|
|
54
|
+
The context hook carries `--host openclaude` for one reason. It tells the hook
|
|
55
|
+
which root file OpenClaude already loads (`AGENTS.md` when present, else
|
|
56
|
+
`CLAUDE.md`), so that file is not injected a second time.
|
|
57
|
+
|
|
58
|
+
## Not supported
|
|
59
|
+
|
|
60
|
+
- **Workflows.** OpenClaude ships its `WorkflowTool` disabled, so the `workflow`
|
|
61
|
+
skill falls back to parallel agents, as on Bob and Copilot.
|
|
62
|
+
- **Live verification.** The emit follows OpenClaude's source (`src/utils/envUtils.ts`,
|
|
63
|
+
`src/utils/claudemd.ts`, `src/utils/config.ts`, `src/types/hooks.ts`) as of
|
|
64
|
+
2026-09. It has not been run against an installed OpenClaude yet.
|
|
@@ -89,7 +89,7 @@ function summarize(name, result, stats, tracePath) {
|
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
// Kept worktrees are work awaiting review, and an overlap is a conflict awaiting ONE
|
|
92
|
-
// merger (process
|
|
92
|
+
// merger (process 7) — both are said out loud, never left for the trace to hold.
|
|
93
93
|
function isolationReport(stats) {
|
|
94
94
|
const kept = stats.worktrees || []
|
|
95
95
|
if (!kept.length) return ""
|
|
@@ -182,7 +182,7 @@ async function runChildSession(client, { prompt, agent, model, title, directory
|
|
|
182
182
|
|
|
183
183
|
// ---- worktree isolation ------------------------------------------------------
|
|
184
184
|
// `agent(prompt, { isolation: "worktree" })` — the same option Claude Code's Workflow
|
|
185
|
-
// takes. Parallel editors in one tree lose each other's writes (process
|
|
185
|
+
// takes. Parallel editors in one tree lose each other's writes (process 7, one writer per
|
|
186
186
|
// file), so each isolated agent gets its own branch + worktree off the root's HEAD, and
|
|
187
187
|
// the files it changed are recorded for `overlaps()`. A worktree with no change is
|
|
188
188
|
// removed with its branch; one with changes is KEPT for the parent to review and merge —
|
package/docs/extending.md
CHANGED
|
@@ -119,7 +119,7 @@ Notes that matter:
|
|
|
119
119
|
from the seven commands; the container one is reachable locally through
|
|
120
120
|
`tests/helpers/no-python-container.sh` with a docker daemon.
|
|
121
121
|
- **Two assertions in `tests/unit/claude.test.mjs` silently stand down** on any machine where an
|
|
122
|
-
ancestor of the temp sandbox is a `.claude`/`.bob` install — which is every developer machine
|
|
122
|
+
ancestor of the temp sandbox is a `.claude`/`.bob`/`.openclaude` install — which is every developer machine
|
|
123
123
|
with Claude Code installed under `~`. They are replaced by a `t.diagnostic`, so the TAP
|
|
124
124
|
`# skipped` count does **not** move, and a local run shows no sign of it.
|
|
125
125
|
|
|
@@ -280,7 +280,7 @@ of nine emit modes in order and themed, under both footprints, with a `CEILING`
|
|
|
280
280
|
(half the ceiling) on the rendered size. Its docblock carries the current measurement against
|
|
281
281
|
the largest carrier — the host-agnostic `files` bundle; no figure is repeated here, because a
|
|
282
282
|
typed headroom is stale by the next rule. Read that docblock before adding text to any tier; it is
|
|
283
|
-
re-measured, never nudged, and the ceiling is measured **with all
|
|
283
|
+
re-measured, never nudged, and the ceiling is measured **with all five packs active**, which is
|
|
284
284
|
the only configuration it can speak for.
|
|
285
285
|
|
|
286
286
|
### 2d — Adding a whole PACK
|
|
@@ -291,15 +291,27 @@ Rare, and mechanical. On top of §2a for each rule the pack carries:
|
|
|
291
291
|
file `PACK_ORDER` names but cannot read, or one carrying no `### {{DOCTRINE}} <pack> <n>`
|
|
292
292
|
heading at all, is a refusal.
|
|
293
293
|
2. `PACK_ORDER` in `js/build/source.mjs` — the registration, and the render order. It is **narrative,
|
|
294
|
-
not alphabetical** (craft → rigor → ops → process); discovery sorts alphabetically and the
|
|
294
|
+
not alphabetical** (craft → rigor → ops → process → comms); discovery sorts alphabetically and the
|
|
295
295
|
renderer refuses a `.md` under `src/doctrines/` that `PACK_ORDER` does not name, rather than
|
|
296
296
|
skipping it.
|
|
297
297
|
3. `PACK_<NAME>` in `themes/_TEMPLATE.json` and all fourteen voices. Unlike `DOC_*`, this family is
|
|
298
298
|
held only by `themeParityProblems` — presence, across the voices, template excluded.
|
|
299
299
|
4. `DOCTRINE_BLURBS` in `js/maintain/setup.mjs` — the one-line description an installer sees in the wizard,
|
|
300
300
|
and the only place a pack is ever explained to them. Missing entries fall back to the bare name.
|
|
301
|
-
5. `harness.config.json` if
|
|
302
|
-
`doctrines`
|
|
301
|
+
5. `harness.config.json` only if this checkout's default must be *narrower* than every pack. The
|
|
302
|
+
shipped file carries no `doctrines` key, and an absent key means all of `PACK_ORDER`, so
|
|
303
|
+
step 2 already makes a new pack default-on. `constitutionProblems` refuses a `doctrines`
|
|
304
|
+
array naming a pack this checkout does not ship.
|
|
305
|
+
6. The written-out **pack lists** in `tests/` — not only the rule totals of §2a. The full set is
|
|
306
|
+
spelled out, in `PACK_ORDER`, in `emit_smoke`, `generate`, `harness`, `setup`, `web_api`,
|
|
307
|
+
`web_jobs` and `wizard`, and the wizard cells also feed one y/n answer per pack on stdin.
|
|
308
|
+
Grep `tests/` for `'process']` and `ops,process` before trusting this list.
|
|
309
|
+
7. **Existing installs.** An install's pack set is read back off its carrier's `Active packs:`
|
|
310
|
+
marker (§9), which names only the packs that existed when it was built, so a new pack reaches
|
|
311
|
+
an existing install only if that install is re-emitted *and* the reader adds it. A pack that
|
|
312
|
+
merely adds rules can stay off for old installs. A pack that *moves* a rule out of another
|
|
313
|
+
pack cannot, or the moved rule disappears on the next rebuild: `comms` (2026-09-27) is the
|
|
314
|
+
worked example — see `legacyProcessCarrier` in `js/hosts/installs.mjs`.
|
|
303
315
|
|
|
304
316
|
---
|
|
305
317
|
|
|
@@ -682,7 +694,7 @@ rows, nor `web/package.json`.
|
|
|
682
694
|
|---|---|---|
|
|
683
695
|
| git checkout | `geneseed upgrade` | export improvements → preflight → ff-only pull → `doctor` on the pulled tree → re-emit this bundle → bounce the web daemon → `rebuild-all` |
|
|
684
696
|
| npm | `npm install -g geneseed@latest`, then `geneseed rebuild-all` | there is no `postinstall`; the two steps are manual |
|
|
685
|
-
| any | `geneseed rebuild-all` | every **active** install, each re-read in its own
|
|
697
|
+
| any | `geneseed rebuild-all` | every **active** install, each re-read in its own values: theme, emit, footprint, posture, mode, and the two doctrine axes (`Active packs:` and `Excluded rules:`, read back by `doctrinesForBuild` and `excludedRulesOfDir`) |
|
|
686
698
|
|
|
687
699
|
**Which installs get missed:** project installs that were never registered; installs disabled via
|
|
688
700
|
the `.geneseed-disabled` stash; registry rows whose directory is gone; and everything after the
|