geneseed 3.9.0 → 3.11.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 +89 -1
- package/DESIGN.md +1 -1
- package/README.md +52 -71
- package/SHIPPED.md +3 -3
- package/adapters/bob/README.md +18 -2
- package/adapters/claude-code/README.md +17 -12
- package/adapters/openclaude/README.md +2 -2
- package/adapters/opencode/README.md +4 -4
- package/adapters/opencode/plugins/geneseed-context.js +78 -8
- package/bin/build-driver.mjs +2 -0
- package/bin/geneseed-cli.mjs +17 -0
- package/bin/geneseed-hook.mjs +3 -1
- package/docs/README.md +42 -0
- package/docs/_groups.json +18 -0
- package/docs/candidate-hosts.md +12 -5
- package/docs/concepts/agents.md +44 -0
- package/docs/concepts/collaboration.md +62 -0
- package/docs/concepts/exclusions.md +55 -0
- package/docs/concepts/footprint.md +52 -0
- package/docs/concepts/foreman-mode.md +69 -0
- package/docs/concepts/hooks.md +101 -0
- package/docs/concepts/hosts.md +55 -0
- package/docs/concepts/lsp.md +50 -0
- package/docs/{web → concepts}/memory.md +2 -2
- package/docs/{web → concepts}/notebook.md +2 -2
- package/docs/concepts/rules.md +52 -0
- package/docs/concepts/skills.md +49 -0
- package/docs/concepts/themes.md +50 -0
- package/docs/extending.md +27 -21
- package/docs/guides/autostart.md +70 -0
- package/docs/guides/choose-your-setup.md +120 -0
- package/docs/guides/headless.md +22 -0
- package/docs/guides/install.md +161 -0
- package/docs/guides/mcp.md +195 -0
- package/docs/guides/migrate.md +41 -0
- package/docs/guides/project-context.md +87 -0
- package/docs/guides/run-anywhere.md +45 -0
- package/docs/guides/uninstall.md +51 -0
- package/docs/guides/upgrade.md +65 -0
- package/docs/guides/verify.md +65 -0
- package/docs/guides/wiki.md +69 -0
- package/docs/guides/worktree.md +47 -0
- package/docs/reference/about.md +7 -0
- package/docs/reference/cli.md +7 -0
- package/docs/reference/environment.md +99 -0
- package/docs/reference/glossary.md +33 -0
- package/docs/reference/opencode-plugins.md +131 -0
- package/docs/reference/troubleshooting.md +350 -0
- package/docs/token-footprint.md +26 -21
- package/docs/understand/a-day.md +77 -0
- package/docs/understand/enforced-vs-asked.md +64 -0
- package/docs/understand/harness.md +36 -0
- package/docs/understand/on-your-machine.md +76 -0
- package/docs/web-ui.md +2 -2
- package/harness.config.json +1 -1
- package/js/README.md +7 -6
- package/js/build/driver.mjs +26 -95
- package/js/build/emit-claude.mjs +76 -81
- package/js/build/generate.mjs +12 -2
- package/js/build/render.mjs +4 -0
- package/js/build/source.mjs +6 -0
- package/js/build/stubs.mjs +18 -2
- package/js/cli-table.json +6 -6
- package/js/hosts/hooks.mjs +86 -54
- package/js/hosts/hosts.mjs +5 -21
- package/js/hosts/installs.mjs +4 -6
- package/js/hosts/mcp.mjs +4 -14
- package/js/hosts/native.mjs +27 -50
- package/js/hosts/opencode.mjs +1 -1
- package/js/hosts/settings.mjs +17 -79
- package/js/inspect/checks-authoring.mjs +9 -4
- package/js/inspect/checks-repo.mjs +45 -1
- package/js/inspect/diff.mjs +11 -3
- package/js/inspect/doctor.mjs +4 -4
- package/js/inspect/excludes.mjs +0 -4
- package/js/inspect/inventory.mjs +1 -1
- package/js/inspect/registry.mjs +20 -3
- package/js/inspect/status.mjs +11 -6
- package/js/lib/node-floor.mjs +30 -0
- package/js/maintain/migrate.mjs +5 -5
- package/js/maintain/setup.mjs +112 -26
- package/js/maintain/uninstall.mjs +8 -42
- package/js/maintain/update.mjs +4 -15
- package/js/ui/cli.mjs +2 -2
- package/js/web/actions.mjs +4 -5
- package/js/web/api.mjs +7 -4
- package/js/web/daemon.mjs +52 -0
- package/js/web/docs.mjs +149 -65
- package/js/web/server.mjs +5 -2
- package/package.json +6 -5
- package/registry.json +7 -0
- package/src/AGENT.md.tmpl +73 -52
- package/src/laws/universal.md +3 -0
- package/src/ontology/universal.md +1 -1
- package/src/postures/mentor.md +1 -0
- package/src/skills/daydream/SKILL.md +10 -3
- package/src/skills/daydream/VENDOR.md +10 -2
- package/src/skills/daydream/instructions.md +2 -2
- package/src/skills/explain-changes/SKILL.md +1 -1
- package/src/skills/explain-changes/VENDOR.md +1 -1
- package/src/skills/geneseed.md +1 -1
- package/src/skills/learn-mode.md +89 -0
- package/src/skills/pipeline.md +2 -2
- package/src/skills/quiz.md +2 -1
- package/src/skills/react-view-transitions/SKILL.md +1 -1
- package/src/skills/react-view-transitions/VENDOR.md +7 -2
- package/src/skills/teach.md +2 -1
- package/src/skills/token-report/SKILL.md +2 -3
- package/src/skills/token-report/VENDOR.md +2 -3
- package/src/skills/token-report/scripts/token_report.mjs +7 -121
- package/src/skills/workflow.md +1 -1
- package/themes/_TEMPLATE.json +1 -0
- package/themes/biker.json +1 -0
- package/themes/commentator.json +1 -0
- package/themes/cyberpunk.json +1 -0
- package/themes/gamer.json +1 -0
- package/themes/imperial.json +1 -0
- package/themes/joker.json +1 -0
- package/themes/marvin.json +1 -0
- package/themes/mean.json +1 -0
- package/themes/military.json +1 -0
- package/themes/neutral.json +1 -0
- package/themes/pirate.json +1 -0
- package/themes/sports.json +1 -0
- package/themes/verstappen.json +1 -0
- package/themes/wizard.json +1 -0
- package/web/dist/assets/Activity-C52LEb-2.js +1 -0
- package/web/dist/assets/ActivityDetail-CjNLRvXg.js +1 -0
- package/web/dist/assets/Dashboard-B6_sSCHi.js +2 -0
- package/web/dist/assets/Docs-Dj7BmCSA.js +5 -0
- package/web/dist/assets/{GreenhouseView-Bq1QmaGO.js → GreenhouseView-BALwjQsA.js} +1 -1
- package/web/dist/assets/Installs-BbffDQm3.js +2 -0
- package/web/dist/assets/JournalView-JpAQ8Hqe.js +1 -0
- package/web/dist/assets/Laws-DK7eCWSm.js +3 -0
- package/web/dist/assets/Library-CoamHelE.js +1 -0
- package/web/dist/assets/{Markdown-CkFyfgNf.js → Markdown-qjM2_ofS.js} +5 -5
- package/web/dist/assets/{OperatorHudView-B-HVBqfY.js → OperatorHudView-DVx1HlBx.js} +1 -1
- package/web/dist/assets/Personal-eaXb1zcj.js +1 -0
- package/web/dist/assets/{Tabs-_pjUFIEI.js → Tabs-BmGtt8E2.js} +1 -1
- package/web/dist/assets/api-Dc8f3ca-.js +1 -0
- package/web/dist/assets/drawable-Du_PZrQj.js +1 -0
- package/web/dist/assets/index-Bz_KMRDH.css +1 -0
- package/web/dist/assets/index-CNFH7o55.js +2 -0
- package/web/dist/index.html +3 -2
- package/QUICKSTART.md +0 -50
- package/SETUP.md +0 -1183
- package/adapters/copilot/README.md +0 -105
- package/docs/web/_groups.json +0 -45
- package/docs/web/about.md +0 -6
- package/docs/web/adapters-claude-code.md +0 -8
- package/docs/web/adapters-opencode-loads.md +0 -8
- package/docs/web/adapters-opencode-spec.md +0 -8
- package/docs/web/adapters-opencode.md +0 -8
- package/docs/web/agents.md +0 -8
- package/docs/web/authoring.md +0 -11
- package/docs/web/autostart.md +0 -9
- package/docs/web/claude-hooks.md +0 -37
- package/docs/web/cli.md +0 -6
- package/docs/web/collaboration.md +0 -27
- package/docs/web/configure-wiki.md +0 -9
- package/docs/web/design.md +0 -7
- package/docs/web/env-knobs.md +0 -9
- package/docs/web/exclusions.md +0 -27
- package/docs/web/first-session.md +0 -28
- package/docs/web/footprint.md +0 -38
- package/docs/web/foreman-mode.md +0 -33
- package/docs/web/glossary.md +0 -6
- package/docs/web/harnesses.md +0 -30
- package/docs/web/headless.md +0 -9
- package/docs/web/ingest-docs.md +0 -9
- package/docs/web/install-paths.md +0 -9
- package/docs/web/install-quick.md +0 -35
- package/docs/web/lsp-overview.md +0 -37
- package/docs/web/mcp-claude-code.md +0 -10
- package/docs/web/mcp-filesystem.md +0 -9
- package/docs/web/mcp-gitlab.md +0 -9
- package/docs/web/mcp-markitdown.md +0 -9
- package/docs/web/mcp-overview.md +0 -34
- package/docs/web/mcp-trouble.md +0 -9
- package/docs/web/mcp-verify.md +0 -9
- package/docs/web/migrate.md +0 -39
- package/docs/web/model.md +0 -20
- package/docs/web/pipelines.md +0 -24
- package/docs/web/plugin-activity.md +0 -23
- package/docs/web/plugin-context.md +0 -26
- package/docs/web/plugin-guard.md +0 -24
- package/docs/web/plugin-learn.md +0 -27
- package/docs/web/plugin-notify.md +0 -24
- package/docs/web/plugin-ponytail.md +0 -23
- package/docs/web/plugin-setup.md +0 -7
- package/docs/web/plugin-workflow.md +0 -25
- package/docs/web/plugins.md +0 -17
- package/docs/web/project-context.md +0 -9
- package/docs/web/rules.md +0 -30
- package/docs/web/run-anywhere.md +0 -9
- package/docs/web/self-improve.md +0 -8
- package/docs/web/setup-choices.md +0 -64
- package/docs/web/skills.md +0 -8
- package/docs/web/themes-author.md +0 -20
- package/docs/web/themes.md +0 -9
- package/docs/web/token-footprint.md +0 -7
- package/docs/web/trouble.md +0 -38
- package/docs/web/upgrade.md +0 -9
- package/docs/web/verify.md +0 -30
- package/docs/web/wiki.md +0 -7
- package/docs/web/worktree.md +0 -10
- package/docs/wiki.md +0 -43
- package/web/dist/assets/Activity-DAzV-qQj.js +0 -1
- package/web/dist/assets/ActivityDetail-CwEwMtKl.js +0 -1
- package/web/dist/assets/Dashboard-C2ELBW-X.js +0 -2
- package/web/dist/assets/Docs-iZrvQP8J.js +0 -2
- package/web/dist/assets/Installs-BiqR8xdO.js +0 -2
- package/web/dist/assets/JournalView-6wilG5Zd.js +0 -1
- package/web/dist/assets/Laws-D8YXD_XE.js +0 -3
- package/web/dist/assets/Library-DwuTZ2-L.js +0 -1
- package/web/dist/assets/Personal-BbUTmZQR.js +0 -1
- package/web/dist/assets/drawable-CoIulEH2.js +0 -1
- package/web/dist/assets/index-BMwSp8BP.js +0 -2
- package/web/dist/assets/index-CDPDk2vj.css +0 -1
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 9
|
|
4
|
+
title: "Run geneseed from anywhere"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
---
|
|
7
|
+
**Installed from npm? You have nothing to do.** `npm install -g geneseed` already puts `geneseed`, `geneseed-build` and `geneseed-hook` on your `PATH`.
|
|
8
|
+
|
|
9
|
+
From a clone, you call the launcher inside the clone: `./geneseed` (Windows: `.\geneseed.cmd`). To type plain `geneseed` from any folder, link it.
|
|
10
|
+
|
|
11
|
+
## macOS and Linux
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
./geneseed link # a launcher in ~/.local/bin, no sudo
|
|
15
|
+
./geneseed link /usr/local/bin # or another bin folder (may ask for sudo)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`link` writes a small shell launcher that runs this clone by its absolute path. It also tells you whether the target folder is on your `PATH`, and if it is not, the one line to add to your shell profile. Then:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
geneseed # the web console (or the command list), from any folder
|
|
22
|
+
geneseed build # and every other command
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
If you prefer a shell function, add one to your `~/.zshrc` or `~/.bashrc` from inside the clone instead:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
echo 'geneseed() { "'"$PWD"'/geneseed" "$@"; }' >> ~/.zshrc
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Windows
|
|
32
|
+
|
|
33
|
+
```powershell
|
|
34
|
+
.\geneseed.cmd link
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
This writes a `geneseed.cmd` launcher into `%LOCALAPPDATA%\Geneseed\bin` and adds that folder to your user `PATH`. You need neither admin rights nor symlinks. Open a new terminal, then call `geneseed` from any folder.
|
|
38
|
+
|
|
39
|
+
## Undo it
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
geneseed unlink
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`unlink` removes the launchers that `link` wrote. It leaves alone any `geneseed` it did not write itself. In the web console, **Settings** has the same link and unlink controls.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 5
|
|
4
|
+
title: "Uninstall"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
---
|
|
7
|
+
`geneseed uninstall` removes one install at a time. It deletes only what Geneseed wrote and keeps anything you would not be able to rebuild.
|
|
8
|
+
|
|
9
|
+
## Remove an install
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
geneseed uninstall # the project install in this folder, else the OpenCode global one
|
|
13
|
+
geneseed uninstall --target /path/to/repo # a project install
|
|
14
|
+
geneseed uninstall --target ~/.claude # a global install: pass its config directory
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Without `--target`, the command picks the project install in the current folder if there is one, and the OpenCode global install otherwise. It prints what it will remove and asks before going on. Pass `--yes` to skip the question. In a shell without an interactive terminal, `--yes` is required: without it, the command refuses and exits 1.
|
|
18
|
+
|
|
19
|
+
To see where each install lives, run `geneseed status`. The web console's **Harnesses** page can also uninstall.
|
|
20
|
+
|
|
21
|
+
## What it removes
|
|
22
|
+
|
|
23
|
+
Each install keeps a manifest, a list of the files Geneseed wrote. **Uninstall deletes exactly those files and nothing else**, then removes any folders they leave empty. A file of yours that sits in the same folder stays.
|
|
24
|
+
|
|
25
|
+
- **OpenCode global:** `AGENT.md`, `agents/`, `skills/`, `plugins/`, the marker files, and the `instructions` entry in `opencode.json`.
|
|
26
|
+
- **OpenCode per repo:** `AGENT.md`, `.opencode/`, `laws/`, `agents/`, `skills/`, and the `instructions` entry in `opencode.json`.
|
|
27
|
+
- **Claude Code, Bob, OpenClaude:** `agents/`, `skills/`, the marker files, Geneseed's managed block in the instructions file (`CLAUDE.md` or `AGENTS.md`), and Geneseed's own hooks and exclusions in `settings.json`. Your own settings keys and hooks stay.
|
|
28
|
+
|
|
29
|
+
It also removes the install's row from the registry of installs. Start a new session in your tool afterwards so it stops loading the old files.
|
|
30
|
+
|
|
31
|
+
## What it keeps
|
|
32
|
+
|
|
33
|
+
- **`memory/` and `notebook/`.** These are never deleted. `--archive-memory` moves both aside, into sibling `archived-memory/<timestamp>/` and `archived-notebook/<timestamp>/` folders, instead of leaving them in place. Even then they are moved, not deleted.
|
|
34
|
+
- **`wiki.jsonc`**, **`context.json`** and the **`improvements/`** folder. None of these are in the manifest.
|
|
35
|
+
- **Other installs.** Removing the global install does not touch any project install. Uninstall lists the project installs that remain, each with the command that removes it. If a repo carries installs for several hosts, uninstall removes one and tells you to run it again for the next.
|
|
36
|
+
|
|
37
|
+
## The hook shim
|
|
38
|
+
|
|
39
|
+
Claude Code, Bob and OpenClaude hooks all run through one shared file, the hook shim at `~/.geneseed/bin/geneseed-hook` (or under `$GENESEED_HOME`). Uninstalling an install removes that install's hooks but leaves the shim, because other installs may still use it. Once no install is left, you can delete the `~/.geneseed` folder yourself.
|
|
40
|
+
|
|
41
|
+
## Remove the `geneseed` command
|
|
42
|
+
|
|
43
|
+
The commands themselves are removed separately:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
npm uninstall -g geneseed # installed from npm
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
From a clone, `geneseed unlink` removes the launcher that `geneseed link` put on your `PATH` (see [Run geneseed from anywhere](run-anywhere.md)). Then delete the clone folder.
|
|
50
|
+
|
|
51
|
+
If you set the web console to start at login, delete that login item too. It is a file you created, and Geneseed never removes it (see [Start the web console at login](autostart.md)).
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 4
|
|
4
|
+
title: "Upgrade"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
---
|
|
7
|
+
Upgrading happens in two steps: get the new Geneseed, then rebuild every install from it. Editing or updating Geneseed changes nothing on your machine until something rebuilds. The route depends on how you installed.
|
|
8
|
+
|
|
9
|
+
## Installed from npm
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
npm install -g geneseed@latest # get the new version
|
|
13
|
+
geneseed rebuild-all # rebuild every install with its own settings
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
`rebuild-all` re-renders each registered install in place, keeping its own theme, host, footprint, posture, mode, packs and rule exclusions. It is best-effort: when one install fails, it reports the failure and carries on with the rest.
|
|
17
|
+
|
|
18
|
+
`upgrade`, `update`, `sync-self` and `bootstrap` are the clone route. Run from an npm install, they stop before touching anything and point you to `npm install -g geneseed@latest` instead.
|
|
19
|
+
|
|
20
|
+
## Installed from a clone
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
geneseed upgrade # pull, check, rebuild; keeps theme and install mode
|
|
24
|
+
geneseed upgrade imperial # the same, switching the theme
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`upgrade` does three things:
|
|
28
|
+
|
|
29
|
+
1. It runs a fast-forward-only `git pull` from the clone's own remote, on the current branch.
|
|
30
|
+
2. It runs a blocking `doctor` pass over the result, and rolls back if it fails.
|
|
31
|
+
3. It rebuilds the bundle and every install in place.
|
|
32
|
+
|
|
33
|
+
A dirty working tree, or a folder that is not a git clone, is reported rather than force-updated. `update` and `sync-self` are aliases of `upgrade`. `bootstrap` does the same and then opens the setup wizard (`--no-setup` skips the wizard).
|
|
34
|
+
|
|
35
|
+
## What an upgrade keeps
|
|
36
|
+
|
|
37
|
+
A rebuild only replaces files the install's manifest says Geneseed owns. It leaves these alone:
|
|
38
|
+
|
|
39
|
+
- the `memory/` and `notebook/` stores;
|
|
40
|
+
- your `context.json` and `wiki.jsonc`;
|
|
41
|
+
- the marker files that record each install's choices (theme, footprint, packs, excluded rules), which every rebuild reads back;
|
|
42
|
+
- your own agents, skills, plugins and hooks, and any `opencode.json` or `settings.json` keys you wrote yourself;
|
|
43
|
+
- the `improvements/` folder (see below).
|
|
44
|
+
|
|
45
|
+
## Local edits, and the improvements file
|
|
46
|
+
|
|
47
|
+
The agent can refine its own deployed agent and skill files as it works, and so can you. A rebuild would overwrite those edits, so **setup, re-theme and upgrade export them first**. When the files they are about to overwrite differ from a fresh render, the differences are written to a markdown **improvements file** in `improvements/`, inside the install's own folder (for the OpenCode global install, `~/.config/opencode/improvements/`). The manifest does not list that folder, so rebuilds never overwrite it and uninstall never removes it.
|
|
48
|
+
|
|
49
|
+
To see the drift yourself, or to export it on demand:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
geneseed diff # file-level summary of what diverged
|
|
53
|
+
geneseed diff --full # with line-level diffs
|
|
54
|
+
geneseed diff --out improvements.md # write the improvements file
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
`diff` compares the global OpenCode install by default. Pass `--target <config dir>` to compare another install. The improvements file is self-contained. To make the changes permanent, hand it to an agent in a Geneseed clone and ask it to fold them back into `src/`. Then they survive every future build. The web console's **Changes** page exports the same file.
|
|
58
|
+
|
|
59
|
+
## Moving from a clone to npm
|
|
60
|
+
|
|
61
|
+
If you installed from a clone and now want the npm package, `geneseed migrate` moves every install across in one pass. See [Migrate to npm](migrate.md).
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
**Next:** [Verify it works](verify.md) · [Uninstall](uninstall.md)
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 3
|
|
4
|
+
title: "Verify it works"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
---
|
|
7
|
+
Four checks, from quickest to most thorough. The first one alone tells you whether the harness loaded.
|
|
8
|
+
|
|
9
|
+
## 1. The readiness sigil
|
|
10
|
+
|
|
11
|
+
Open your agent in any repo and say anything. The first reply opens with the readiness line: `✅` for the neutral theme, `🧬` for imperial, or your theme's own sigil.
|
|
12
|
+
|
|
13
|
+
If the sigil is missing, the tool is not loading `AGENT.md`. Check that your tool's instructions setting points at it. On OpenCode, that is the `instructions` key in `opencode.json`.
|
|
14
|
+
|
|
15
|
+
## 2. `geneseed doctor`
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
geneseed doctor
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`npx geneseed doctor` runs the same check without installing anything. Doctor renders the harness and checks the result for unresolved theme tokens, dead links, missing files and drift from the source. It checks the theme you installed, unless you pass `--theme NAME` for another theme or `--all` for every theme. A clean run ends with a line like this:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
[doctor] ok — 1 theme(s) clean: no unresolved tokens, no dead …
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Every failure comes with a hint for fixing it. Doctor also reports a stale hook shim, the file every Claude Code, Bob and OpenClaude hook goes through. If that shim points at a folder that no longer exists, the hooks stop silently. One `geneseed build` (or `geneseed rebuild-all`) rewrites it.
|
|
28
|
+
|
|
29
|
+
## 3. `geneseed status`
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
geneseed status
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
This prints a dashboard with your theme, the components installed, the memory store, the version, the active doctrine packs, and one row per install with its host, scope, theme, footprint, posture, mode and packs. A healthy install reads `active`. If the bottom of the dashboard says the installed build differs from the current source, run `geneseed rebuild-all` (see [Upgrade](upgrade.md)).
|
|
36
|
+
|
|
37
|
+
The `gates` row counts how often a gate asked or blocked, per rule. It shows the hooks are actually firing. `geneseed status --json` prints the same data as JSON, including the exact `geneseed build` command that rebuilds each install.
|
|
38
|
+
|
|
39
|
+
## 4. Context delivery
|
|
40
|
+
|
|
41
|
+
<!--harness:opencode-->
|
|
42
|
+
*(OpenCode only)*
|
|
43
|
+
|
|
44
|
+
Start a session with `GENESEED_DEBUG=1` set. The context plugin then logs what it discovered and injected, and you should see the repo's `README.md` and its docs listed. To check memory, do a little work and end the session. After a quiet period, the learn plugin logs `wrote N memory file(s)` or the reason it skipped. Total silence means the plugin did not load.
|
|
45
|
+
<!--/harness-->
|
|
46
|
+
|
|
47
|
+
<!--harness:claude-->
|
|
48
|
+
*(Claude Code only)*
|
|
49
|
+
|
|
50
|
+
At session start, the context hook adds the repo's docs to the conversation. Ask the agent what project context it received. It should name your `README.md` and list your `docs/`.
|
|
51
|
+
<!--/harness-->
|
|
52
|
+
|
|
53
|
+
## Dry-run a build before you write it
|
|
54
|
+
|
|
55
|
+
`geneseed validate` takes the same flags as `geneseed build`. It renders into a throwaway sandbox and runs every doctor check against the result. Nothing is written under the real `--out` or `--root`: no marker files, no settings merge, no registry record.
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
geneseed validate --theme imperial --emit opencode --out /path/to/repo/Harness
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
It prints how many files each layer would get (`-v` lists the paths), exits `0` when the build is clean, and exits non-zero on any problem. It is useful in CI, or before you point a real build at a repo you do not want to touch yet. The generator itself (`geneseed-build`) has no dry-run flag. `validate` is a separate command because it runs doctor, and the generator is not allowed to start processes.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
Something wrong? See [Troubleshooting](../reference/troubleshooting.md).
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 7
|
|
4
|
+
title: "Connect your wiki"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
---
|
|
7
|
+
If you keep a personal knowledge base on this machine, such as an Obsidian vault or any folder of interlinked markdown, you can declare it once. The agent then reads from it and writes to it while following your own structure. This is optional. Until you declare a wiki, the feature stays off.
|
|
8
|
+
|
|
9
|
+
> **You already know this:** a wiki is a shared drive with a README that says "read me before you add anything". The agent reads that note first, files new notes where your structure says they belong, and keeps out of the folders you marked off-limits.
|
|
10
|
+
|
|
11
|
+
## Wiki, memory, notebook: three different stores
|
|
12
|
+
|
|
13
|
+
- **[Memory](../concepts/memory.md)**: small facts the agent learns, one per file, private to this machine.
|
|
14
|
+
- **[Notebook](../concepts/notebook.md)**: the agent's own scratch space.
|
|
15
|
+
- **Wiki**: durable knowledge that spans projects, which **you** own and curate.
|
|
16
|
+
|
|
17
|
+
When a memory fact or a notebook note hardens into knowledge worth keeping across projects, the agent promotes it into the wiki, so the truth lives in one place.
|
|
18
|
+
|
|
19
|
+
## Declare it in `wiki.jsonc`
|
|
20
|
+
|
|
21
|
+
The build writes a `wiki.jsonc` stub beside `AGENT.md` (for the OpenCode global install, `~/.config/opencode/wiki.jsonc`) and never overwrites it. The file is JSONC, so comments and trailing commas are fine. The stub contains this example, commented out:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"wikis": [{
|
|
26
|
+
"name": "Brain",
|
|
27
|
+
"path": "/home/me/Documents/Brain",
|
|
28
|
+
"description": "my machine-wide knowledge base",
|
|
29
|
+
"entries": [
|
|
30
|
+
{ "path": "ARCHITECTURE.md", "load": "eager", "description": "the root map" },
|
|
31
|
+
{ "path": ".", "load": "lazy" }
|
|
32
|
+
],
|
|
33
|
+
"conventions": "STYLE.md",
|
|
34
|
+
"inbox": "Inbox/",
|
|
35
|
+
"protected": ["Journal/"]
|
|
36
|
+
}]
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
- **`path`**: the vault root, absolute. On Windows, use forward slashes (`C:/Users/me/Brain`).
|
|
41
|
+
- **`entries`**: notes the agent sees each session, with the same `eager` and `lazy` meaning as [project context](project-context.md). An eager note is loaded in full. A lazy note is only listed, and the agent reads it on demand. An entry can be one note or a folder (`"."` is the whole vault; dot-folders like `.obsidian` are skipped). A file entry overrides its folder's mode, and `"load": "exclude"` removes a note or folder from the list. The example above is the usual shape: the root index eager, everything else lazy.
|
|
42
|
+
- **`conventions`**: the note the agent must read before its first write, so new notes match your naming, frontmatter and folder rules.
|
|
43
|
+
- **`inbox`**: where the agent drops a note it cannot confidently file, instead of guessing.
|
|
44
|
+
- **`protected`**: folders the agent must never write to.
|
|
45
|
+
|
|
46
|
+
You can declare several wikis. An empty `wikis` list keeps the feature off. The file may hold private paths. It is specific to this machine and must never be committed. A project install's own `.gitignore` already lists it.
|
|
47
|
+
|
|
48
|
+
Geneseed looks for the file in this order: `$GENESEED_WIKI`, then `$GENESEED_HARNESS/wiki.jsonc`, then beside the installed `AGENT.md`. A `wiki.json` left by an older install is still read at each of those places.
|
|
49
|
+
|
|
50
|
+
## How each host honours it
|
|
51
|
+
|
|
52
|
+
<!--harness:opencode-->
|
|
53
|
+
*(OpenCode only)*
|
|
54
|
+
|
|
55
|
+
The context plugin loads your eager entries and lists your lazy ones at session start. A big vault's lazy list stops at 200 notes and shows a count of the rest (`GENESEED_WIKI_LAZY_LIMIT` changes the limit). The guard plugin **blocks** any write into a `protected` folder at the tool boundary, before the write happens. `GENESEED_GUARD=warn` turns the block into a warning, and `GENESEED_GUARD=off` disables the guard.
|
|
56
|
+
<!--/harness-->
|
|
57
|
+
|
|
58
|
+
<!--harness:claude-->
|
|
59
|
+
*(Claude Code only)*
|
|
60
|
+
|
|
61
|
+
No hook reads the wiki. The instructions in your harness tell the agent to read `wiki.jsonc` at session start and to honour it, including the `protected` folders. That is an instruction the model follows, not a block. Nothing stops a write at the tool boundary. The same applies to Bob, OpenClaude and plain `AGENT.md` tools. See [Enforced vs. asked](../understand/enforced-vs-asked.md).
|
|
62
|
+
<!--/harness-->
|
|
63
|
+
|
|
64
|
+
## What the agent does with it
|
|
65
|
+
|
|
66
|
+
The `wiki` skill drives the procedure.
|
|
67
|
+
|
|
68
|
+
- **Reading.** The agent starts from your entry notes and moves outward by your own structure, following `[[wikilinks]]` and index notes, instead of reading the whole vault. It treats what it reads as true when written, and checks it against the live system before building on it.
|
|
69
|
+
- **Writing.** Durable, reusable facts that span projects go back into the wiki as proper notes: wikilinked, in your house style, filed where your structure says (or in the inbox). Session details stay in memory, and secrets are never written anywhere. The agent never restructures the vault. Moving and renaming notes is your call.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: guides
|
|
3
|
+
order: 12
|
|
4
|
+
title: "Add git-worktree isolation"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
harness: "opencode"
|
|
7
|
+
---
|
|
8
|
+
This is a third-party, optional OpenCode plugin. Geneseed does not ship it or install it.
|
|
9
|
+
|
|
10
|
+
[`opencode-worktree`](https://github.com/kdcokenny/opencode-worktree) gives the agent two tools:
|
|
11
|
+
|
|
12
|
+
- `worktree_create(branch, baseBranch?)` creates an isolated git worktree under `~/.local/share/opencode/worktree/<project-id>/<branch>/` and opens a terminal with OpenCode already running in it.
|
|
13
|
+
- `worktree_delete(reason)` commits and cleans up the worktree.
|
|
14
|
+
|
|
15
|
+
It suits parallel work when you want separate *files* on disk, not just separate sessions. It coexists with Geneseed's plugins: it registers two tools and hooks no event they use, so nothing fires twice.
|
|
16
|
+
|
|
17
|
+
It cannot ride Geneseed's install. Geneseed's plugins are single dependency-free files. This one is multi-file TypeScript with npm dependencies and Bun-only APIs, so it installs on its own track.
|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
1. **Install [OCX](https://github.com/kdcokenny/ocx)**, the package manager that distributes the plugin, if you do not have it.
|
|
22
|
+
2. **Add the plugin:**
|
|
23
|
+
```bash
|
|
24
|
+
ocx add kdco/worktree --from https://registry.kdco.dev
|
|
25
|
+
```
|
|
26
|
+
OCX manages the plugin's dependencies and updates. You do not need a separate Bun install, because OpenCode already runs on Bun.
|
|
27
|
+
3. **Configure it.** On first use the plugin creates `.opencode/worktree.jsonc`. Fill in what each new worktree should inherit and run. For a Node repo, for example:
|
|
28
|
+
```jsonc
|
|
29
|
+
{
|
|
30
|
+
"sync": {
|
|
31
|
+
"copyFiles": [".env", ".env.local"], // copied from the main worktree
|
|
32
|
+
"symlinkDirs": ["node_modules"], // symlinked, not duplicated
|
|
33
|
+
"exclude": []
|
|
34
|
+
},
|
|
35
|
+
"hooks": {
|
|
36
|
+
"postCreate": ["pnpm install"], // after the worktree is created
|
|
37
|
+
"preDelete": [] // before it is removed
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
4. **Optional: a terminal multiplexer.** The plugin detects your terminal on macOS, Linux and Windows. It prefers `tmux` when you are already inside it, and [`cmux`](https://www.cmux.dev/) for agent workflows. Neither is required. Without them, it uses your OS default terminal.
|
|
42
|
+
|
|
43
|
+
**Without OCX**, you can copy the plugin's `src/` into `.opencode/plugin/` and install `jsonc-parser` yourself. You then lose dependency management and automatic updates, and you have to re-copy the plugin to upgrade it.
|
|
44
|
+
|
|
45
|
+
## Consent
|
|
46
|
+
|
|
47
|
+
`worktree_delete` **commits before it removes the worktree.** The harness's *Consent Before Push* rule (when the `process` pack is built in) asks before a *shell* `git commit` through `opencode.json` permissions. This plugin commits through its own tool, so that gate never sees the commit. Before you call delete, review what it will commit, or keep the worktree and commit yourself.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: reference
|
|
3
|
+
order: 6
|
|
4
|
+
title: "About — version, license, links"
|
|
5
|
+
kind: "about"
|
|
6
|
+
---
|
|
7
|
+
The console fills this page from your install: the version, the deployed theme and host, and where updates come from. Geneseed is MIT-licensed; the source is at [github.com/Arylmera/Geneseed](https://github.com/Arylmera/Geneseed).
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: reference
|
|
3
|
+
order: 1
|
|
4
|
+
title: "CLI — every subcommand"
|
|
5
|
+
kind: "cli"
|
|
6
|
+
---
|
|
7
|
+
The console renders this page from `js/cli-table.json`, the CLI's own description of itself, so it is always in step with the installed version. Outside the console, `geneseed --help` lists every command and `geneseed <command> --help` describes one.
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: reference
|
|
3
|
+
order: 2
|
|
4
|
+
title: "Environment variables"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
---
|
|
7
|
+
Every environment variable Geneseed reads, grouped by what it changes. None is required: an install works with all of them unset. Set one in your shell profile (or your tool's environment) when you need to move a default.
|
|
8
|
+
|
|
9
|
+
"Plugin" means one of the OpenCode plugins — see [OpenCode plugins](opencode-plugins.md). "Hook" means `geneseed-hook`, the small binary your tool's settings call on Claude Code, Bob and OpenClaude (see the [glossary](glossary.md)).
|
|
10
|
+
|
|
11
|
+
### Where things install
|
|
12
|
+
|
|
13
|
+
Where Geneseed writes an install, and what an upgrade re-renders.
|
|
14
|
+
|
|
15
|
+
| Variable | Read by | Effect |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| `GENESEED_HOME` | build / hooks | Directory holding the hook shim `bin/geneseed-hook` (default `~/.geneseed`). Change it, then rebuild, so the emitted hooks point at the new location. |
|
|
18
|
+
| `GENESEED_NO_SHIM_CHECK` | CLI | `1` silences the warning every `geneseed` command prints when the hook shim points at a path that no longer exists. For scripted callers; the `status` gates row still says `DEAD`. |
|
|
19
|
+
| `OPENCODE_CONFIG_DIR` | OpenCode emits, `diff`, plugins | OpenCode's config dir — where the global install is written. |
|
|
20
|
+
| `XDG_CONFIG_HOME` | OpenCode emits, plugins | Used when `OPENCODE_CONFIG_DIR` is unset: the install goes to `$XDG_CONFIG_HOME/opencode` (default `~/.config/opencode`). |
|
|
21
|
+
| `BOB_CONFIG_DIR` | Bob emits | Bob's config dir (default `~/.bob`). |
|
|
22
|
+
| `OPENCLAUDE_CONFIG_DIR` | OpenClaude emits | OpenClaude's own config-dir variable (default `~/.openclaude`); also moves `.openclaude.json`. |
|
|
23
|
+
| `GENESEED_EMIT` | `geneseed upgrade` | Which emit target to re-render (e.g. `opencode-global`). Unset, it is read from the install's `.geneseed-emit` marker, else the plain bundle. |
|
|
24
|
+
| `GENESEED_OUT` | `geneseed upgrade` | Bundle location for a plain-bundle install (default `Harness/` beside the checkout). |
|
|
25
|
+
| `GENESEED_ROOT` | `geneseed upgrade` | Project root for that bundle (default: the bundle's parent). |
|
|
26
|
+
| `GENESEED_PRIMARY` | `geneseed build` | `1` also emits the primary orchestrator agent (OpenCode). |
|
|
27
|
+
| `GENESEED_COMMANDS` | `geneseed build` | `1` also emits the `/slash` command layer (OpenCode). |
|
|
28
|
+
|
|
29
|
+
### Context injection
|
|
30
|
+
|
|
31
|
+
What gets loaded into the agent's context at session start — your project's docs and your machine wiki. See [Project context](../guides/project-context.md).
|
|
32
|
+
|
|
33
|
+
| Variable | Read by | Effect |
|
|
34
|
+
| --- | --- | --- |
|
|
35
|
+
| `GENESEED_CONTEXT` | context plugin, context hook | Explicit `context.json` manifest path; overrides discovery. |
|
|
36
|
+
| `GENESEED_ROOT` | context hook | Repo root to discover docs from (default: the current directory). |
|
|
37
|
+
| `GENESEED_WIKI` | context + guard plugins, context hook, web console | Explicit `wiki.jsonc` path (default `$GENESEED_HARNESS/wiki.jsonc`, else beside the install). |
|
|
38
|
+
| `GENESEED_STACK_GLOBAL` | context hook, Claude Code project build | `1` lets a global and a project install of the same host both inject. By default the project install makes the global one stand down. Rebuild the project install after changing it. |
|
|
39
|
+
| `GENESEED_CONTEXT_INJECT` | context plugin | `off` disables injection; the agent is only *asked* to read the docs. |
|
|
40
|
+
| `GENESEED_CONTEXT_VISIBLE` | context plugin | `1` shows the visible `PROJECT CONTEXT` block instead of the invisible per-request delivery. |
|
|
41
|
+
| `GENESEED_CONTEXT_TRANSFORM` | context plugin | Legacy. `0`/`off` = same as `GENESEED_CONTEXT_VISIBLE=1`; `1` matches the default. |
|
|
42
|
+
| `GENESEED_EAGER_FILE_KB` / `GENESEED_EAGER_TOTAL_KB` | context plugin | Per-file / total budget for docs injected in full (default 16 / 48). An oversized file is listed instead, never truncated. |
|
|
43
|
+
| `GENESEED_LAZY_HEADINGS` | context plugin | Cap on headings read for listed docs per session (default 64). |
|
|
44
|
+
| `GENESEED_WIKI_LAZY_LIMIT` | context plugin | Cap on wiki notes listed per wiki per session (default 200; beyond it the listing ends with a count). |
|
|
45
|
+
|
|
46
|
+
### Memory and learn
|
|
47
|
+
|
|
48
|
+
Where distilled memories land at session end, and which model distils them. See [Memory](../concepts/memory.md).
|
|
49
|
+
|
|
50
|
+
| Variable | Read by | Effect |
|
|
51
|
+
| --- | --- | --- |
|
|
52
|
+
| `GENESEED_HARNESS` | learn, context, guard plugins; CLI | Base whose `memory/` is written (and where `wiki.jsonc` is looked up). Optional — the plugin finds the in-config store by itself; set it to pin the location. |
|
|
53
|
+
| `GENESEED_MEMORY` | learn plugin, CLI | Explicit memory dir; wins over `GENESEED_HARNESS`. |
|
|
54
|
+
| `GENESEED_MODEL` | learn + context plugins | `provider/model` fallback when the session's model can't be read from the transcript. |
|
|
55
|
+
| `GENESEED_LLM` | learn hook (Claude Code, Bob, OpenClaude) | Model CLI used to distil, e.g. `claude -p`. Unset, the hook prints the prompt instead of distilling. |
|
|
56
|
+
| `GENESEED_LEARN_DEBOUNCE_MS` | learn plugin | Quiet period before distilling, in ms (default 60000). |
|
|
57
|
+
|
|
58
|
+
### Guard
|
|
59
|
+
|
|
60
|
+
The OpenCode safety guard. On Claude Code, Bob and OpenClaude the same gates are hooks and have no environment switch.
|
|
61
|
+
|
|
62
|
+
| Variable | Read by | Effect |
|
|
63
|
+
| --- | --- | --- |
|
|
64
|
+
| `GENESEED_GUARD` | guard plugin | `warn` downgrades every block to a logged warning; `off` disables the guard. |
|
|
65
|
+
|
|
66
|
+
### Notifications
|
|
67
|
+
|
|
68
|
+
The desktop ping when a long turn finishes (OpenCode).
|
|
69
|
+
|
|
70
|
+
| Variable | Read by | Effect |
|
|
71
|
+
| --- | --- | --- |
|
|
72
|
+
| `GENESEED_NOTIFY` | notify plugin | `off` disables notifications. |
|
|
73
|
+
| `GENESEED_NOTIFY_MIN_SECONDS` | notify plugin | Minimum turn length before notifying (default 30; `0` = every turn). |
|
|
74
|
+
| `GENESEED_NOTIFY_TITLE` | notify plugin | Notification title (default `Geneseed`). |
|
|
75
|
+
|
|
76
|
+
### Other OpenCode plugins
|
|
77
|
+
|
|
78
|
+
| Variable | Read by | Effect |
|
|
79
|
+
| --- | --- | --- |
|
|
80
|
+
| `GENESEED_PONYTAIL` | ponytail plugin | Starting minimal-code level: `lite` \| `full` \| `ultra` \| `off` (default `off`; switch live with `/ponytail <level>`). |
|
|
81
|
+
| `GENESEED_WORKFLOWS_DIR` | workflow plugin | Directory the `workflow` tool loads saved scripts from. |
|
|
82
|
+
| `GENESEED_ACTIVITY` | activity plugin | `off` stops writing the live-activity files the web console reads. |
|
|
83
|
+
| `GENESEED_DEBUG` | every plugin but guard and learn (which always log) | `1` logs what each plugin decided to stderr. |
|
|
84
|
+
| `OPENCODE_DISABLE_LSP_DOWNLOAD` | OpenCode itself | `true` stops OpenCode downloading language servers — for air-gapped machines; install each server yourself. |
|
|
85
|
+
|
|
86
|
+
### Web console and CLI
|
|
87
|
+
|
|
88
|
+
How the `geneseed` command behaves and prints.
|
|
89
|
+
|
|
90
|
+
| Variable | Read by | Effect |
|
|
91
|
+
| --- | --- | --- |
|
|
92
|
+
| `GENESEED_NO_WEB` | `geneseed` (bare) | `1` stops bare `geneseed` opening the web console; it falls back to the terminal menu. |
|
|
93
|
+
| `GENESEED_NODE` | `./geneseed`, `geneseed.cmd`, `install` scripts | Node interpreter to run (default `node` on PATH). |
|
|
94
|
+
| `GENESEED_TUI_ASCII` | CLI output | Pure-ASCII output: no box-drawing or emoji. |
|
|
95
|
+
| `GENESEED_TUI_PLAIN` | CLI output | Drop emoji and animation. |
|
|
96
|
+
| `GENESEED_NO_ANIM` | install animation | Disable the themed install animation. |
|
|
97
|
+
| `NO_COLOR` | `geneseed status` | Any value disables colour. |
|
|
98
|
+
| `GENESEED_LOG` | `geneseed upgrade` | Install/upgrade log path (default `~/.geneseed-install.log`). |
|
|
99
|
+
| `GENESEED_NET_TIMEOUT` | `geneseed upgrade` | Seconds before the network fetch gives up (default 120, minimum 30). |
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: reference
|
|
3
|
+
order: 3
|
|
4
|
+
title: "Glossary"
|
|
5
|
+
kind: "glossary"
|
|
6
|
+
---
|
|
7
|
+
Every word Geneseed uses that you would not find in a general programming glossary. The console shows this table in your installed theme's voice beside the neutral words; on GitHub you read the neutral ones.
|
|
8
|
+
|
|
9
|
+
| Term | Theme key | Meaning | In dev terms |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| Harness | — | everything Geneseed installs around the model: the rules it loads, the gates that run before its actions, the workflows it can call | git hooks + CI + a runbook, for an agent |
|
|
12
|
+
| Hook | — | a command your tool runs before or after an agent action; Geneseed's hooks gate risky actions and load context | a git hook, fired on every tool call |
|
|
13
|
+
| Ethos (Ontology) | ONTOLOGY | the always-on worldview under the rules — telos, evidence, decisions, conduct; it holds the Pact | the team's engineering principles |
|
|
14
|
+
| Rule (Law) | LAW | one of the nine always-on invariants: what is never done | a lint rule set to error |
|
|
15
|
+
| Rules (Laws) | LAWS | the body of always-on invariants | the error-level rule set |
|
|
16
|
+
| Doctrine | DOCTRINE | one practice rule, cited `<pack> <n>` — how work is done here | a team convention in CONTRIBUTING.md |
|
|
17
|
+
| Doctrines | DOCTRINES | the practice packs, chosen at build time; inactive packs still ship in the bundle | opt-in lint presets |
|
|
18
|
+
| Agent | AGENT | a capability specialist | a colleague you hand a ticket to |
|
|
19
|
+
| Agents | AGENTS | the roster of specialists | the team |
|
|
20
|
+
| Skill | SKILL | a repeatable workflow | a runbook |
|
|
21
|
+
| Skills | SKILLS | the catalogue of workflows | the runbook folder |
|
|
22
|
+
| Memory | MEMORY | durable, one-fact-per-file knowledge | a team wiki the agent writes |
|
|
23
|
+
| Notebook | NOTEBOOK | the agent's sovereign space | the agent's scratch branch |
|
|
24
|
+
| Wiki | WIKI | the machine-wide knowledge base | your personal notes, shared with the agent |
|
|
25
|
+
| Pact | PACT | the two-way collaboration contract, stated in Telos, the first Ethos section | a working agreement |
|
|
26
|
+
| Posture | — | the relationship register the agent works in (peer, mentor, expert, assistant, artisan) | pairing style |
|
|
27
|
+
| Mode | — | how work gets executed — direct (the agent works every task itself) or foreman (substantial tasks spawn an isolated pipeline) | solo vs. delegating to a sub-team |
|
|
28
|
+
| Footprint | — | how much of the Rules loads inline each turn (full vs lean) | eager vs. lazy loading |
|
|
29
|
+
| Profile | — | who you are — seeded once, colours but never binds | your onboarding notes |
|
|
30
|
+
| Memory force | — | a memory's binding strength (constraint, choice, conviction, tempered) | MUST / SHOULD / MAY |
|
|
31
|
+
| Tagline | TAGLINE | the one-line essence of the theme | — |
|
|
32
|
+
| Loaded sigil | LOADED_SIGIL | what the agent emits when ready | a health-check line |
|
|
33
|
+
| Benediction | BENEDICTION | the closing line of an install | — |
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: reference
|
|
3
|
+
order: 5
|
|
4
|
+
title: "OpenCode plugins"
|
|
5
|
+
kind: "concept"
|
|
6
|
+
---
|
|
7
|
+
On OpenCode, Geneseed's automation runs as {N_PLUGINS} plugins: small JavaScript files OpenCode loads from its `plugins/` directory at startup. They are what turns a rule from *asked* into *enforced* — the context load, the safety gates, memory distillation. On Claude Code, Bob and OpenClaude the same jobs are done by hooks instead (see [Hooks](../concepts/hooks.md)).
|
|
8
|
+
|
|
9
|
+
> **You already know this:** a plugin is a git hook for your agent — code that runs on an event (session start, before a tool call, session idle), not text the model may or may not follow.
|
|
10
|
+
|
|
11
|
+
Every plugin installs in the same step as the rest of the harness: `geneseed setup`, or `geneseed build --emit opencode-global` (global, into `~/.config/opencode/plugins/`) / `--emit opencode` (per-repo, into `.opencode/plugins/`). Installing by hand is covered in [Install](../guides/install.md). Keep **one** copy of each: OpenCode loads two local copies of the same plugin twice.
|
|
12
|
+
|
|
13
|
+
Every plugin swallows its own errors — none can block or crash a session. Each variable below is also listed in [Environment variables](environment.md).
|
|
14
|
+
|
|
15
|
+
## geneseed-context
|
|
16
|
+
|
|
17
|
+
**What it does.** Puts your project's documentation (and your machine wiki) into the agent's context before your first turn, so the agent never has to be trusted to read it. It needs **no per-repo file**: it discovers docs by convention.
|
|
18
|
+
|
|
19
|
+
- **Injected in full (eager):** root `README.md`, `CONTRIBUTING.md`, `.cursorrules`, `user-rules.md`, `PROFILE.md`. Budget-capped; an oversized file is listed instead, never silently truncated. (`AGENT.md`, `AGENTS.md` and `CLAUDE.md` are not injected — OpenCode already loads them.)
|
|
20
|
+
- **Listed (lazy, path + first heading, read on demand):** `docs/`, `doc/`, `documentation/`, `architecture/`, `adr/`, and `packages/*/README.md` / `apps/*/README.md` in a monorepo. `node_modules`, `.git`, `dist`, `build`, `vendor` and similar are never scanned.
|
|
21
|
+
- **Machine wiki:** the wikis declared in `wiki.jsonc` ride in the same block, on the same budgets. See [Wiki](../guides/wiki.md).
|
|
22
|
+
- **Explicit manifest:** `$GENESEED_CONTEXT`, `.harness/context.json` or a root `context.json` takes over from discovery; `"extend": true` layers it on top instead. See [Project context](../guides/project-context.md).
|
|
23
|
+
|
|
24
|
+
**When it runs.** On every request: the context rides invisibly in the request's message list, so it also survives compaction. If your OpenCode build lacks that (experimental) hook, the plugin notices and falls back to one visible message at session start, re-pushed when the session compacts.
|
|
25
|
+
|
|
26
|
+
**What you see.** Normally nothing — the context is there, but not shown. With the visible fallback, a `PROJECT CONTEXT` block at the top of the session.
|
|
27
|
+
|
|
28
|
+
**Switches.**
|
|
29
|
+
- `GENESEED_CONTEXT_INJECT=off` — no injection; the agent is only *asked* to read the docs.
|
|
30
|
+
- `GENESEED_CONTEXT_VISIBLE=1` — force the visible block (legacy `GENESEED_CONTEXT_TRANSFORM=0` does the same).
|
|
31
|
+
- `GENESEED_EAGER_FILE_KB` / `GENESEED_EAGER_TOTAL_KB` (default 16 / 48), `GENESEED_LAZY_HEADINGS` (64), `GENESEED_WIKI_LAZY_LIMIT` (200) — budgets.
|
|
32
|
+
- `GENESEED_WIKI` — explicit `wiki.jsonc` path.
|
|
33
|
+
- `GENESEED_DEBUG=1` — log what it discovered and injected to stderr. Silence with this set means the plugin did not load.
|
|
34
|
+
|
|
35
|
+
## geneseed-guard
|
|
36
|
+
|
|
37
|
+
**What it does.** Enforces the safety rules at the tool boundary — before a tool call runs, not after. High-confidence patterns only, so legitimate work is not caught.
|
|
38
|
+
|
|
39
|
+
- **Blocks** writes to private-key and credential files (*Sealed Secrets*), catastrophic shell commands such as deleting the filesystem root (*Deletion Is Deliberate*), and any change — write, move, rename, delete — under a wiki folder declared `protected` in `wiki.jsonc`.
|
|
40
|
+
- **Warns** (logged, allowed) on `.env` writes and force-push.
|
|
41
|
+
- **Speed-bumps** the *first* write to `user-rules.md` or a memory file: it is refused once, naming *Persist Insight* — whether something is a standing rule or a fact to remember is your call, settled through the `rule` skill. The re-issued write goes through.
|
|
42
|
+
|
|
43
|
+
It ships whole on every install, whatever [doctrine packs](../concepts/rules.md) you chose. On Claude Code and Bob the same checks are hooks, which can *ask* you instead of refusing; OpenCode's tool hook has no ask tier. Protected wiki folders are enforced only here — on the other hosts they are an instruction.
|
|
44
|
+
|
|
45
|
+
**When it runs.** Before every tool call (`tool.execute.before`).
|
|
46
|
+
|
|
47
|
+
**What you see.** A refused tool call: `[geneseed-guard] blocked: <reason> — set GENESEED_GUARD=off to allow`. Warnings go to stderr.
|
|
48
|
+
|
|
49
|
+
**Switches.**
|
|
50
|
+
- `GENESEED_GUARD=warn` — log every block, allow the call.
|
|
51
|
+
- `GENESEED_GUARD=off` — disable the guard.
|
|
52
|
+
|
|
53
|
+
## geneseed-learn
|
|
54
|
+
|
|
55
|
+
**What it does.** Distils durable memories from the conversation into the install's `memory/` directory and keeps `MEMORY.md` up to date, de-duplicating against what is already stored. It is the OpenCode counterpart of the Claude Code `Stop` hook, but needs no API key and no model CLI: it distils with the **same model the session used**, through your OpenCode provider config. See [Memory](../concepts/memory.md).
|
|
56
|
+
|
|
57
|
+
**When it runs.** After the session goes quiet. OpenCode signals "idle" after every turn, so each idle re-arms a timer and the distil runs once nothing has happened for `GENESEED_LEARN_DEBOUNCE_MS` (default 60 s). Trivial sessions are skipped.
|
|
58
|
+
|
|
59
|
+
**What you see.** On stderr: `[geneseed-learn] wrote N memory file(s): …`, or `skipped: <reason>`. Total silence means it did not load.
|
|
60
|
+
|
|
61
|
+
**Where it writes** — the first that resolves:
|
|
62
|
+
1. `GENESEED_MEMORY` — an explicit memory dir;
|
|
63
|
+
2. `$GENESEED_HARNESS/memory` (`/anamnesis` for the imperial theme);
|
|
64
|
+
3. the `memory/` beside the plugin's own install (the global install's store);
|
|
65
|
+
4. `./memory` or `./Harness/memory`, when the bundle lives in the project.
|
|
66
|
+
|
|
67
|
+
So a global install needs nothing set; use `GENESEED_HARNESS` only to pin the location. If none resolves, it logs `no memory dir — set $GENESEED_HARNESS or $GENESEED_MEMORY.` and does nothing.
|
|
68
|
+
|
|
69
|
+
**Switches.**
|
|
70
|
+
- `GENESEED_MODEL=provider/model` — fallback when the session's model can't be read. Without it you get `could not determine a model`.
|
|
71
|
+
- `GENESEED_LEARN_DEBOUNCE_MS` — the quiet period.
|
|
72
|
+
|
|
73
|
+
## geneseed-workflow
|
|
74
|
+
|
|
75
|
+
**What it does.** Registers one tool, `workflow`, that runs saved orchestration scripts. The script — not the model — drives the control flow: the deterministic counterpart of the `council` and `parallel-agents` skills.
|
|
76
|
+
|
|
77
|
+
- **Saved scripts only.** It loads `<name>.js` from the `workflows/` directory beside `plugins/`; nothing the model writes is evaluated. Shipped: `council`, `dispatch`, `research-plan-implement`, `review`.
|
|
78
|
+
- **Call shape:** `workflow({ name, args })`; with no name it lists what is available.
|
|
79
|
+
- **Isolation:** a script can run a child agent in its own git worktree on its own branch. A worktree with no change is removed; one with changes is kept, and the summary lists every kept branch and every file more than one agent changed. Nothing is merged or committed for you. Without git, such a child fails rather than falling back to the shared tree.
|
|
80
|
+
|
|
81
|
+
**When it runs.** When the agent calls the `workflow` tool — usually because you asked for one.
|
|
82
|
+
|
|
83
|
+
**What you see.** The tool's summary in the conversation. A phase-by-phase trace and the full result land in `.geneseed/workflow-runs/<runId>.log`.
|
|
84
|
+
|
|
85
|
+
**Switches.**
|
|
86
|
+
- `GENESEED_WORKFLOWS_DIR` — load scripts from another directory.
|
|
87
|
+
- `GENESEED_DEBUG=1` — log to stderr.
|
|
88
|
+
|
|
89
|
+
Ask the agent to *"list available workflows"* to check it loaded.
|
|
90
|
+
|
|
91
|
+
## geneseed-notify
|
|
92
|
+
|
|
93
|
+
**What it does.** Sends a native desktop notification when the agent finishes a long turn, so you can start a run, walk away, and be called back. macOS uses `osascript`, Linux `notify-send` (install `libnotify` if nothing appears), Windows a PowerShell balloon.
|
|
94
|
+
|
|
95
|
+
**When it runs.** When a session goes idle, and only if the turn took longer than `GENESEED_NOTIFY_MIN_SECONDS` (default 30) since your last prompt. Sub-agent sessions and the learn plugin's own sessions are skipped.
|
|
96
|
+
|
|
97
|
+
**What you see.** A notification titled `Geneseed`. With `GENESEED_DEBUG=1`, `[geneseed-notify] notified for …` on stderr.
|
|
98
|
+
|
|
99
|
+
**Switches.**
|
|
100
|
+
- `GENESEED_NOTIFY=off` — disable.
|
|
101
|
+
- `GENESEED_NOTIFY_MIN_SECONDS=N` — threshold (`0` = every turn).
|
|
102
|
+
- `GENESEED_NOTIFY_TITLE="…"` — the title.
|
|
103
|
+
|
|
104
|
+
## geneseed-ponytail
|
|
105
|
+
|
|
106
|
+
**What it does.** Holds an opt-in minimal-code mode: once on, it appends the "laziest solution that works" ruleset to the system prompt **every turn**, so the agent doesn't drift back to over-building mid-session. It is the sustained form of the `ponytail` skill, and it is not part of the [rules](../concepts/rules.md): nothing about it applies until you switch it on.
|
|
107
|
+
|
|
108
|
+
**When it runs.** Every turn, while a level is set. It starts `off`.
|
|
109
|
+
|
|
110
|
+
**What you see.** Replies that favour the smallest working change. Switch with `/ponytail lite|full|ultra|off` (bare `/ponytail` means `full`); the level is saved to `.geneseed-ponytail` beside OpenCode's config and applies from the next turn. On an OpenCode build without the experimental system-prompt hook it never injects; the skill still works.
|
|
111
|
+
|
|
112
|
+
**Switches.**
|
|
113
|
+
- `GENESEED_PONYTAIL=lite|full|ultra` — the starting level (default `off`).
|
|
114
|
+
- `GENESEED_DEBUG=1` — logs `[geneseed-ponytail] ponytail <level>` on each switch.
|
|
115
|
+
|
|
116
|
+
## geneseed-activity
|
|
117
|
+
|
|
118
|
+
**What it does.** Feeds the web console's **Activity** view: one small JSON file per session under `activity/` beside OpenCode's config, recording what the session is doing — phase, model, token and cost totals, files touched, plan, last error. The console reads and prunes those files; the two only meet on disk, so a crash on either side never blocks a session.
|
|
119
|
+
|
|
120
|
+
**When it runs.** On session events, for top-level sessions only (sub-agents and learn's sessions are skipped). Entries whose process died or went stale are pruned by the reader.
|
|
121
|
+
|
|
122
|
+
**What you see.** A card per live session in **Activity** (`geneseed web`).
|
|
123
|
+
|
|
124
|
+
**Switches.**
|
|
125
|
+
- `GENESEED_ACTIVITY=off` — kill switch at startup.
|
|
126
|
+
- The Activity page's own toggle writes a `.geneseed-activity` flag file, read per event — no restart needed.
|
|
127
|
+
- `GENESEED_DEBUG=1` — logs each write as `[geneseed-activity] …`.
|
|
128
|
+
|
|
129
|
+
## Excluded folders
|
|
130
|
+
|
|
131
|
+
`geneseed-context`, `geneseed-guard` and `geneseed-learn` go dormant inside a folder listed in the global install's `excludes.json` (managed by `geneseed exclude`). See [Exclusions](../concepts/exclusions.md).
|