geneseed 3.10.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.
Files changed (186) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/DESIGN.md +1 -1
  3. package/README.md +26 -44
  4. package/SHIPPED.md +2 -2
  5. package/adapters/bob/README.md +1 -1
  6. package/adapters/claude-code/README.md +17 -12
  7. package/adapters/openclaude/README.md +1 -1
  8. package/adapters/opencode/README.md +4 -4
  9. package/bin/build-driver.mjs +2 -0
  10. package/bin/geneseed-cli.mjs +17 -0
  11. package/bin/geneseed-hook.mjs +2 -0
  12. package/docs/README.md +42 -0
  13. package/docs/_groups.json +18 -0
  14. package/docs/concepts/agents.md +44 -0
  15. package/docs/concepts/collaboration.md +62 -0
  16. package/docs/concepts/exclusions.md +55 -0
  17. package/docs/concepts/footprint.md +52 -0
  18. package/docs/concepts/foreman-mode.md +69 -0
  19. package/docs/concepts/hooks.md +101 -0
  20. package/docs/concepts/hosts.md +55 -0
  21. package/docs/concepts/lsp.md +50 -0
  22. package/docs/{web → concepts}/memory.md +2 -2
  23. package/docs/{web → concepts}/notebook.md +2 -2
  24. package/docs/concepts/rules.md +52 -0
  25. package/docs/concepts/skills.md +49 -0
  26. package/docs/concepts/themes.md +50 -0
  27. package/docs/extending.md +27 -21
  28. package/docs/guides/autostart.md +70 -0
  29. package/docs/guides/choose-your-setup.md +120 -0
  30. package/docs/guides/headless.md +22 -0
  31. package/docs/guides/install.md +161 -0
  32. package/docs/guides/mcp.md +195 -0
  33. package/docs/guides/migrate.md +41 -0
  34. package/docs/guides/project-context.md +87 -0
  35. package/docs/guides/run-anywhere.md +45 -0
  36. package/docs/guides/uninstall.md +51 -0
  37. package/docs/guides/upgrade.md +65 -0
  38. package/docs/guides/verify.md +65 -0
  39. package/docs/guides/wiki.md +69 -0
  40. package/docs/guides/worktree.md +47 -0
  41. package/docs/reference/about.md +7 -0
  42. package/docs/reference/cli.md +7 -0
  43. package/docs/reference/environment.md +99 -0
  44. package/docs/reference/glossary.md +33 -0
  45. package/docs/reference/opencode-plugins.md +131 -0
  46. package/docs/reference/troubleshooting.md +350 -0
  47. package/docs/understand/a-day.md +77 -0
  48. package/docs/understand/enforced-vs-asked.md +64 -0
  49. package/docs/understand/harness.md +36 -0
  50. package/docs/understand/on-your-machine.md +76 -0
  51. package/docs/web-ui.md +1 -1
  52. package/harness.config.json +1 -1
  53. package/js/README.md +3 -2
  54. package/js/build/generate.mjs +12 -1
  55. package/js/build/source.mjs +6 -0
  56. package/js/cli-table.json +1 -1
  57. package/js/hosts/mcp.mjs +1 -1
  58. package/js/hosts/settings.mjs +13 -1
  59. package/js/inspect/checks-authoring.mjs +5 -3
  60. package/js/inspect/doctor.mjs +1 -1
  61. package/js/inspect/inventory.mjs +1 -1
  62. package/js/inspect/registry.mjs +20 -3
  63. package/js/inspect/status.mjs +7 -2
  64. package/js/lib/node-floor.mjs +30 -0
  65. package/js/maintain/setup.mjs +109 -21
  66. package/js/maintain/update.mjs +4 -15
  67. package/js/ui/cli.mjs +2 -2
  68. package/js/web/api.mjs +3 -0
  69. package/js/web/daemon.mjs +52 -0
  70. package/js/web/docs.mjs +149 -65
  71. package/js/web/server.mjs +5 -2
  72. package/package.json +6 -4
  73. package/registry.json +7 -0
  74. package/src/AGENT.md.tmpl +4 -0
  75. package/src/postures/mentor.md +1 -0
  76. package/src/skills/learn-mode.md +89 -0
  77. package/src/skills/pipeline.md +2 -2
  78. package/src/skills/quiz.md +2 -1
  79. package/src/skills/teach.md +2 -1
  80. package/themes/_TEMPLATE.json +1 -0
  81. package/themes/biker.json +1 -0
  82. package/themes/commentator.json +1 -0
  83. package/themes/cyberpunk.json +1 -0
  84. package/themes/gamer.json +1 -0
  85. package/themes/imperial.json +1 -0
  86. package/themes/joker.json +1 -0
  87. package/themes/marvin.json +1 -0
  88. package/themes/mean.json +1 -0
  89. package/themes/military.json +1 -0
  90. package/themes/neutral.json +1 -0
  91. package/themes/pirate.json +1 -0
  92. package/themes/sports.json +1 -0
  93. package/themes/verstappen.json +1 -0
  94. package/themes/wizard.json +1 -0
  95. package/web/dist/assets/Activity-C52LEb-2.js +1 -0
  96. package/web/dist/assets/ActivityDetail-CjNLRvXg.js +1 -0
  97. package/web/dist/assets/Dashboard-B6_sSCHi.js +2 -0
  98. package/web/dist/assets/Docs-Dj7BmCSA.js +5 -0
  99. package/web/dist/assets/{GreenhouseView-D0cbCJ5m.js → GreenhouseView-BALwjQsA.js} +1 -1
  100. package/web/dist/assets/Installs-BbffDQm3.js +2 -0
  101. package/web/dist/assets/JournalView-JpAQ8Hqe.js +1 -0
  102. package/web/dist/assets/Laws-DK7eCWSm.js +3 -0
  103. package/web/dist/assets/Library-CoamHelE.js +1 -0
  104. package/web/dist/assets/{Markdown-CkFyfgNf.js → Markdown-qjM2_ofS.js} +5 -5
  105. package/web/dist/assets/{OperatorHudView-CiAkAkQL.js → OperatorHudView-DVx1HlBx.js} +1 -1
  106. package/web/dist/assets/Personal-eaXb1zcj.js +1 -0
  107. package/web/dist/assets/{Tabs-B4HNrrCs.js → Tabs-BmGtt8E2.js} +1 -1
  108. package/web/dist/assets/api-Dc8f3ca-.js +1 -0
  109. package/web/dist/assets/drawable-Du_PZrQj.js +1 -0
  110. package/web/dist/assets/index-Bz_KMRDH.css +1 -0
  111. package/web/dist/assets/index-CNFH7o55.js +2 -0
  112. package/web/dist/index.html +3 -2
  113. package/QUICKSTART.md +0 -50
  114. package/SETUP.md +0 -1148
  115. package/docs/web/_groups.json +0 -45
  116. package/docs/web/about.md +0 -6
  117. package/docs/web/adapters-claude-code.md +0 -8
  118. package/docs/web/adapters-opencode-loads.md +0 -8
  119. package/docs/web/adapters-opencode-spec.md +0 -8
  120. package/docs/web/adapters-opencode.md +0 -8
  121. package/docs/web/agents.md +0 -8
  122. package/docs/web/authoring.md +0 -11
  123. package/docs/web/autostart.md +0 -9
  124. package/docs/web/claude-hooks.md +0 -37
  125. package/docs/web/cli.md +0 -6
  126. package/docs/web/collaboration.md +0 -27
  127. package/docs/web/configure-wiki.md +0 -9
  128. package/docs/web/design.md +0 -7
  129. package/docs/web/env-knobs.md +0 -9
  130. package/docs/web/exclusions.md +0 -26
  131. package/docs/web/first-session.md +0 -28
  132. package/docs/web/footprint.md +0 -38
  133. package/docs/web/foreman-mode.md +0 -33
  134. package/docs/web/glossary.md +0 -6
  135. package/docs/web/harnesses.md +0 -30
  136. package/docs/web/headless.md +0 -9
  137. package/docs/web/ingest-docs.md +0 -9
  138. package/docs/web/install-paths.md +0 -9
  139. package/docs/web/install-quick.md +0 -35
  140. package/docs/web/lsp-overview.md +0 -37
  141. package/docs/web/mcp-claude-code.md +0 -10
  142. package/docs/web/mcp-filesystem.md +0 -9
  143. package/docs/web/mcp-gitlab.md +0 -9
  144. package/docs/web/mcp-markitdown.md +0 -9
  145. package/docs/web/mcp-overview.md +0 -34
  146. package/docs/web/mcp-trouble.md +0 -9
  147. package/docs/web/mcp-verify.md +0 -9
  148. package/docs/web/migrate.md +0 -39
  149. package/docs/web/model.md +0 -20
  150. package/docs/web/pipelines.md +0 -24
  151. package/docs/web/plugin-activity.md +0 -23
  152. package/docs/web/plugin-context.md +0 -26
  153. package/docs/web/plugin-guard.md +0 -24
  154. package/docs/web/plugin-learn.md +0 -27
  155. package/docs/web/plugin-notify.md +0 -24
  156. package/docs/web/plugin-ponytail.md +0 -23
  157. package/docs/web/plugin-setup.md +0 -7
  158. package/docs/web/plugin-workflow.md +0 -25
  159. package/docs/web/plugins.md +0 -17
  160. package/docs/web/project-context.md +0 -9
  161. package/docs/web/rules.md +0 -30
  162. package/docs/web/run-anywhere.md +0 -9
  163. package/docs/web/self-improve.md +0 -8
  164. package/docs/web/setup-choices.md +0 -64
  165. package/docs/web/skills.md +0 -8
  166. package/docs/web/themes-author.md +0 -20
  167. package/docs/web/themes.md +0 -9
  168. package/docs/web/token-footprint.md +0 -7
  169. package/docs/web/trouble.md +0 -38
  170. package/docs/web/upgrade.md +0 -9
  171. package/docs/web/verify.md +0 -30
  172. package/docs/web/wiki.md +0 -7
  173. package/docs/web/worktree.md +0 -10
  174. package/docs/wiki.md +0 -43
  175. package/web/dist/assets/Activity-BjVp522q.js +0 -1
  176. package/web/dist/assets/ActivityDetail-8ep1bspW.js +0 -1
  177. package/web/dist/assets/Dashboard-OkC_PCH6.js +0 -2
  178. package/web/dist/assets/Docs-CKPWz00o.js +0 -2
  179. package/web/dist/assets/Installs-BtGGdoTt.js +0 -2
  180. package/web/dist/assets/JournalView-Ckl4dmzR.js +0 -1
  181. package/web/dist/assets/Laws-CLpdRRk8.js +0 -3
  182. package/web/dist/assets/Library-wPPuKQrI.js +0 -1
  183. package/web/dist/assets/Personal-D8CnDo9v.js +0 -1
  184. package/web/dist/assets/drawable-BiwaOo6x.js +0 -1
  185. package/web/dist/assets/index-C1yil5j1.js +0 -2
  186. package/web/dist/assets/index-CDPDk2vj.css +0 -1
@@ -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).