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,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
group: understand
|
|
3
|
+
order: 2
|
|
4
|
+
title: "What lands on your machine"
|
|
5
|
+
kind: "map"
|
|
6
|
+
---
|
|
7
|
+
An install writes a handful of files into your host's config folder and, where the host allows it, wires small programs that run at fixed moments: when a session starts, before a tool call, when a session ends. Everything below says what each piece does for you, when it runs, what it costs, and how to turn it off. The **Kind** column uses four words:
|
|
8
|
+
|
|
9
|
+
- **enforced**: code runs before the action and can stop it. The model cannot argue past it.
|
|
10
|
+
- **automatic**: runs by itself at a fixed moment, such as session start or session end.
|
|
11
|
+
- **asked**: text the model reads every session. It usually follows it, but nothing makes it.
|
|
12
|
+
- **on demand**: loads only when you or the agent call it by name.
|
|
13
|
+
|
|
14
|
+
Token costs are for the default *lean* footprint. Before you type anything, a session carries about 12k tokens of harness. That is roughly 6% of a 200k window. A `--footprint full` build adds about 5k on the rules file. For a live figure on your own install, ask the agent to use the `token-report` skill.
|
|
15
|
+
|
|
16
|
+
<!--harness:claude-->
|
|
17
|
+
*(Claude Code only)*
|
|
18
|
+
|
|
19
|
+
| Piece | What it does for you | Kind | Cost | Turn it off |
|
|
20
|
+
|---|---|---|---|---|
|
|
21
|
+
| `CLAUDE.md` (managed block) | The rules, the pointers to agents and skills, and how memory works. Geneseed writes only its own block; your own lines in the file stay | asked | ~7.2k tokens every session | Shrink it with fewer doctrine packs (`--doctrines`); remove it with `geneseed uninstall` |
|
|
22
|
+
| `user-rules.md` | Your own standing rules, read every session. Seeded empty | asked | 0 until you write in it | Leave it empty |
|
|
23
|
+
| `PROFILE.md` | Who you are and how you like answers pitched. Fill it with the `profile` skill | asked | 0 until you fill it | Leave the seeded text untouched |
|
|
24
|
+
| context hook | At session start, and again after a resume or compaction, puts your repo's README, CONTRIBUTING and a listing of `docs/` in front of the agent, with your rules, profile, memory index and wiki | automatic | Your docs, capped at 16 KB a file and 48 KB a session | `geneseed exclude add <folder>` silences every hook in that folder |
|
|
25
|
+
| git-gate hook | Before each shell command: asks you before any `git commit` or `git push`, and before a force-push, `reset --hard`, `clean -f`, `branch -D` or `checkout --` | enforced | ~14 ms per shell call | The commit/push question goes away if you build without the **process** pack; the destructive-git question has no switch except `geneseed exclude` |
|
|
26
|
+
| rule-gate hook | Before each write or edit: asks you when the file would carry a credential-shaped string (outside `.env`), or when the agent writes to `user-rules.md` or memory | enforced | ~14 ms per write | `geneseed exclude add <folder>` |
|
|
27
|
+
| learn hook | When the agent finishes a reply, and before compaction, distils durable facts from the recent conversation into `memory/`. Off until you set `GENESEED_LLM` to a model command such as `claude -p` | automatic | One model call each time it runs, once enabled | Leave `GENESEED_LLM` unset (the default) |
|
|
28
|
+
| `skills/` | Written procedures you call by name, such as `brainstorm` or `plan` | on demand | ~4.1k tokens for names and descriptions; a skill's body loads only when called | No per-skill switch; `geneseed uninstall` removes them all |
|
|
29
|
+
| `agents/` | Specialists the agent can delegate to, such as `reviewer` or `tester` | on demand | ~0.5k tokens | `geneseed uninstall` |
|
|
30
|
+
| `memory/` | Durable facts, one per file, with a `MEMORY.md` index the context hook injects | automatic | 0 when fresh; grows as facts accumulate | `geneseed memory list`, then `geneseed memory rm <name>` |
|
|
31
|
+
| `notebook/` | The agent's own working space: plans, scratch notes, and the gate log `gates.jsonl` | automatic | 0 when fresh; its index grows with use | Delete what you do not want; it is git-ignored and yours |
|
|
32
|
+
| hook shim | `~/.geneseed/bin/geneseed-hook`, the one stable path every hook calls, so moving the Geneseed checkout does not break your hooks | automatic | Nothing on its own | Not removed by uninstall, since every install on the machine shares it. `GENESEED_HOME` moves it |
|
|
33
|
+
|
|
34
|
+
<!--/harness-->
|
|
35
|
+
<!--harness:opencode-->
|
|
36
|
+
*(OpenCode only)*
|
|
37
|
+
|
|
38
|
+
| Piece | What it does for you | Kind | Cost | Turn it off |
|
|
39
|
+
|---|---|---|---|---|
|
|
40
|
+
| `AGENT.md` | The rules, the pointers to agents and skills, and how memory works | asked | ~7.2k tokens every session | Shrink it with fewer doctrine packs (`--doctrines`); remove it with `geneseed uninstall` |
|
|
41
|
+
| `user-rules.md` | Your own standing rules, read every session. Seeded empty | asked | 0 until you write in it | Leave it empty |
|
|
42
|
+
| `PROFILE.md` | Who you are and how you like answers pitched. Fill it with the `profile` skill | asked | 0 until you fill it | Leave the seeded text untouched |
|
|
43
|
+
| `opencode.json` entries | `instructions` points OpenCode at `AGENT.md`. `permission.bash` makes OpenCode ask before `rm -rf`, a force-push, `reset --hard`, `clean -f`, `branch -D` or `checkout --`, and before every commit and push when the **process** pack is on | enforced | No tokens | Edit the `permission` block yourself. The commit/push questions follow the **process** pack |
|
|
44
|
+
| context plugin | Puts your repo's README, CONTRIBUTING and a listing of `docs/` in front of the agent, with your rules, profile, memory index and wiki | automatic | Your docs, capped at 16 KB a file and 48 KB a session | `GENESEED_CONTEXT_INJECT=off` |
|
|
45
|
+
| guard plugin | Blocks writes to key and credential files (`id_rsa`, `.pem`, `.ssh/`…), catastrophic commands (`rm -rf /`, formatting a disk), and changes inside your wiki's protected folders. Refuses the first write to `user-rules.md` or memory once, so the choice is yours | enforced | No tokens | `GENESEED_GUARD=off`, or `GENESEED_GUARD=warn` to log instead of block |
|
|
46
|
+
| learn plugin | Once a session has been quiet for 60 seconds, distils durable facts into `memory/` with the model the session already uses | automatic | One model call per quiet session | `geneseed exclude add <folder>` silences it in that folder |
|
|
47
|
+
| activity plugin | Writes one small file per session that the web console's Activity view shows | automatic | No tokens | `GENESEED_ACTIVITY=off` |
|
|
48
|
+
| notify plugin | A desktop notification when a turn took longer than 30 seconds | automatic | No tokens | `GENESEED_NOTIFY=off` |
|
|
49
|
+
| ponytail plugin | Minimal-code mode. `/ponytail lite`, `full` or `ultra` adds a short ruleset to every turn until you switch it off | on demand | 0 while off, which is the default | `/ponytail off` |
|
|
50
|
+
| workflow plugin | Adds a `workflow` tool that runs saved orchestration scripts | on demand | Runs only when called | `geneseed uninstall` |
|
|
51
|
+
| `skills/` | Written procedures you call by name, such as `brainstorm` or `plan` | on demand | ~4.1k tokens for names and descriptions; a skill's body loads only when called | No per-skill switch; `geneseed uninstall` removes them all |
|
|
52
|
+
| `agents/` | Specialists the agent can delegate to, such as `reviewer` or `tester` | on demand | ~0.5k tokens | `geneseed uninstall` |
|
|
53
|
+
| `memory/` | Durable facts, one per file, with a `MEMORY.md` index the context plugin injects | automatic | 0 when fresh; grows as facts accumulate | `geneseed memory list`, then `geneseed memory rm <name>` |
|
|
54
|
+
| `notebook/` | The agent's own working space: plans, scratch notes, and the gate log `gates.jsonl` | automatic | 0 when fresh; its index grows with use | Delete what you do not want; it is git-ignored and yours |
|
|
55
|
+
|
|
56
|
+
<!--/harness-->
|
|
57
|
+
|
|
58
|
+
### Where the files are
|
|
59
|
+
|
|
60
|
+
**OpenCode.** A global install writes to `~/.config/opencode/`. Setting `OPENCODE_CONFIG_DIR` or `XDG_CONFIG_HOME` moves it. Geneseed merges its entries into your existing `opencode.json` and keeps every other key. A per-repo install writes into the repo instead.
|
|
61
|
+
|
|
62
|
+
**Claude Code.** A global install writes to `~/.claude/`, and its hooks go into `~/.claude/settings.json`, next to any hooks of your own. A per-repo install uses the repo's `.claude/` folder, with the hooks in `.claude/settings.local.json`.
|
|
63
|
+
|
|
64
|
+
**Bob.** A global install writes to `~/.bob/`, or `BOB_CONFIG_DIR`. Bob does not load a global `AGENTS.md`, so the rules go into `~/.bob/rules/geneseed.md`. A per-repo install writes `AGENTS.md` instead. Hooks live in `~/.bob/settings/settings.json`. Bob runs three of them: context at session start, one combined gate before each tool call, and learn at session end. Bob has no "ask" prompt, so the gate refuses outright, and only for credentials and destructive git. The commit/push and memory questions become log lines.
|
|
65
|
+
|
|
66
|
+
**OpenClaude.** Same pieces as Claude Code, under `~/.openclaude/` or `OPENCLAUDE_CONFIG_DIR`. A per-repo install uses `.openclaude/`, with the hooks in `.openclaude/settings.local.json`.
|
|
67
|
+
|
|
68
|
+
**Plain bundle.** The `files` target writes `AGENT.md` and the same folders into `./Harness/` for any tool that reads `AGENT.md`. It installs no hooks and no plugins, so nothing in it is enforced.
|
|
69
|
+
|
|
70
|
+
### Taking it back out
|
|
71
|
+
|
|
72
|
+
`geneseed uninstall` removes only what Geneseed recorded writing: the rules file or its managed block, `agents/`, `skills/`, plugins, and Geneseed's own hook and config entries. It keeps `memory/` and `notebook/` in place, along with the files it seeded for you to edit (`user-rules.md`, `PROFILE.md`, `wiki.jsonc`). Add `--archive-memory` to move memory and notebook aside instead. It still deletes nothing. See [Uninstall](../guides/uninstall.md).
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
**Next:** [A day with the harness](a-day.md)
|
package/docs/web-ui.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**Every view in the local browser console, what it shows, and how to drive it.**
|
|
6
6
|
|
|
7
|
-
[← README](../README.md) · [
|
|
7
|
+
[← README](../README.md) · [Docs](README.md) · [What's shipped](../SHIPPED.md)
|
|
8
8
|
|
|
9
9
|
</div>
|
|
10
10
|
|
|
@@ -120,7 +120,7 @@ streams the output of background jobs and keeps their history across reloads.
|
|
|
120
120
|
- **Docs** (`#/docs`) — rendered documentation: markdown pages, concept pages, a CLI
|
|
121
121
|
reference (generated from the harness argument parser), and a glossary, grouped into
|
|
122
122
|
Get started / Core concepts / How-to / MCP servers / Plugins / Reference / Deeper. Filtered
|
|
123
|
-
for one host family (OpenCode, or Claude Code — which Bob
|
|
123
|
+
for one host family (OpenCode, or Claude Code — which Bob and OpenClaude share); with no
|
|
124
124
|
choice stored it follows the deployed install.
|
|
125
125
|
|
|
126
126
|
### 🩺 Care
|
package/harness.config.json
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
"_comment": "version is a human-readable release label only; the canonical identity of an installed harness is the source fingerprint stamped in .geneseed-version (see `harness version`), not this string.",
|
|
3
3
|
"theme": "neutral",
|
|
4
4
|
"product": "Geneseed",
|
|
5
|
-
"version": "3.
|
|
5
|
+
"version": "3.11.0"
|
|
6
6
|
}
|
package/js/README.md
CHANGED
|
@@ -40,12 +40,12 @@ as a per-host install at project or global scope.
|
|
|
40
40
|
| `source.mjs` | Where the SOURCE is: `ROOT`/`SRC`/`THEMES`/`CONFIG`, `PACK_ORDER`, the rule canon (stable ids → positional numbers, citations → names), the cfg object |
|
|
41
41
|
| `render.mjs` | The pure text pipeline: theme load, `INCLUDE` inlining, CATALOG blocks, `{{TOKENS}}`, dest paths |
|
|
42
42
|
| `bundle.mjs` | `build` — render a theme into a bundle dir, plus the source-completeness refusal. Sits UNDER both emits |
|
|
43
|
-
| `emit-claude.mjs` | The Claude/Bob/
|
|
43
|
+
| `emit-claude.mjs` | The Claude/Bob/OpenClaude emit — the render half plus the settings + CLAUDE.md managed-block wire |
|
|
44
44
|
| `emit-opencode.mjs` | The OpenCode emits — a project's `.opencode/` and the global config dir. Deliberate twin of the above |
|
|
45
45
|
| `emit-common.mjs` | Constants, tree walkers, and the three writers BOTH global emits share. Decides no host |
|
|
46
46
|
| `stubs.mjs` | Write-once seed files: context, wiki, rules, excludes, profile, `.gitignore`, memory/notebook indexes |
|
|
47
47
|
| `version.mjs` | The release marker: fingerprint the sources, read/compare/write an install's version, warn on downgrade |
|
|
48
|
-
| `driver.mjs` | The generator driver: `--emit`/`--theme`/`--footprint` flag parsing, the
|
|
48
|
+
| `driver.mjs` | The generator driver: `--emit`/`--theme`/`--footprint` flag parsing, the nine emit targets, per-host emit orchestration, the prune and the manifest. `bin/build-driver.mjs` is only its entry |
|
|
49
49
|
| `generate.mjs` | CLI verbs `build`, `prompt`, `theme`, `rebuild-all` — the thin face over `driver.mjs` |
|
|
50
50
|
| `catalog.mjs` | `geneseed catalog` — prints the shipped roster. Classifies nothing itself |
|
|
51
51
|
| `themes.mjs` | Maintainer-only `--sync-themes`: inserts `_TEMPLATE.json`'s missing keys into the committed themes |
|
|
@@ -66,8 +66,8 @@ user co-owns, and the hook verbs those emitted configs then run.
|
|
|
66
66
|
|
|
67
67
|
| module | owns |
|
|
68
68
|
|---|---|
|
|
69
|
-
| `hosts.mjs` | The
|
|
70
|
-
| `hooks.mjs` | The verbs the emitted hooks run every session: `context`, `git-gate`, `rule-gate`, `tool-gate` (the two gates fused, for
|
|
69
|
+
| `hosts.mjs` | The four host config dirs (opencode/claude/bob/openclaude), plus `resolvePath`/`expanduser` |
|
|
70
|
+
| `hooks.mjs` | The verbs the emitted hooks run every session: `context`, `git-gate`, `rule-gate`, `tool-gate` (the two gates fused, for Bob), `learn`. `--host` picks the verdict dialect |
|
|
71
71
|
| `settings.mjs` | Merges into user-owned `settings.json`/`opencode.json`; owns the hook shim and the managed blocks |
|
|
72
72
|
| `native.mjs` | Capability specs → host-native subagents and skills. The impure half of the emit |
|
|
73
73
|
| `opencode.mjs` | OpenCode-only extras: colour themes, primary agent, `/commands`, plugins, overrides stub |
|
|
@@ -118,6 +118,7 @@ into files users have committed, so change the test that states it in the same c
|
|
|
118
118
|
| `text.mjs` | String primitives: `codePointLength`, `WHITESPACE`, `parseIntStrict`, `percentDecode` |
|
|
119
119
|
| `udiff.mjs` | `geneseed diff`'s own difflib clone — the alignment IS the printed hunks — plus `splitLines` |
|
|
120
120
|
| `proc.mjs` | One constant: the `windowsHide` flag every spawn in `js/` must reuse |
|
|
121
|
+
| `node-floor.mjs` | The first import of all three binaries: below Node 22.3, one sentence on stderr and exit 1 (0 in the hook) instead of a stack trace |
|
|
121
122
|
|
|
122
123
|
**Before editing:** parse with `parseJson`, never `JSON.parse` — the latter collapses int `1` and
|
|
123
124
|
float `1.0` into one double, and that value gets written into a user's file. Do not swap in a diff
|
|
@@ -168,7 +169,7 @@ the deployed harness as JSON.
|
|
|
168
169
|
| `actions.mjs` | The mutating endpoints — rules, profile, memory, MCP, excludes — plus install/deploy argv |
|
|
169
170
|
| `daemon.mjs` | Detached web start/stop/status/restart, the `.geneseed-web.json` record, and `openUrl` |
|
|
170
171
|
| `jobs.mjs` | `JobManager` and the action→argv table. The only module here that spawns job children |
|
|
171
|
-
| `docs.mjs` | The Docs tab: the `docs
|
|
172
|
+
| `docs.mjs` | The Docs tab: the `docs/<folder>/` page registry, `?harness=` filtering, link rewriting, the six page kinds |
|
|
172
173
|
| `activity.mjs` | The `activity/` session files: pid-liveness prune, list, detail, and the on/off flag |
|
|
173
174
|
|
|
174
175
|
**Before editing:** `makeHandler(state, jm, token, dist, holder)`'s arity is load-bearing — three
|
|
@@ -190,6 +191,6 @@ and inline lists are held against a surface list written out in
|
|
|
190
191
|
| a web endpoint | GET → `js/web/api.mjs`; POST → `js/web/actions.mjs` | declare it in `js/web/routes.mjs`; the partition test probes the real handler |
|
|
191
192
|
| a CLI verb | `js/cli-table.json` — the table IS the parser | the `VERBS` row in `bin/geneseed-cli.mjs`, the row count in `cli_table.test.mjs`, `NATIVE` in **two** test files |
|
|
192
193
|
| a hook verb | `js/hosts/hooks.mjs` | `claudeHookGroups` in `settings.mjs`, `VERBS` in `bin/geneseed-hook.mjs`. Keep the import graph tiny |
|
|
193
|
-
| a console doc page | `docs
|
|
194
|
+
| a console doc page | `docs/<understand|guides|concepts|reference>/<id>.md` — the stem is the id | `docs/extending.md` §4c. Only `kind: "concept"` gets `{N_*}` substitution |
|
|
194
195
|
| an OpenCode plugin | `adapters/opencode/plugins/geneseed-<name>.js` | `docs/extending.md` §4a — the `geneseed-` prefix is mechanically load-bearing |
|
|
195
196
|
| to change a `js/lib/` primitive | `tests/fixtures/pure_probe.mjs` **first** | the docblock says which Node default it deliberately departs from — change that sentence too, or the next reader restores the default |
|
package/js/build/driver.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The generator driver — flag parsing, the
|
|
2
|
+
* The generator driver — flag parsing, the nine emit targets, and the per-host emit orchestration.
|
|
3
3
|
* `bin/build-driver.mjs` (`geneseed-build`) is only its entry; this module is what the CLI verbs
|
|
4
4
|
* (`build`, `setup`, `migrate`, `doctor`, `diff`, `validate`, the web console) import. It lived in
|
|
5
5
|
* `bin/` until 2026-09, which made nine `js/` modules import upward from a binary.
|
|
@@ -51,7 +51,7 @@ import { parseJson, jsonDumpsIndent } from '../lib/json.mjs';
|
|
|
51
51
|
// that should exist twice. golden.py's 259 cells are what made the move safe to attempt.
|
|
52
52
|
import {
|
|
53
53
|
GLOBAL_MANIFEST, resolvePath, opencodeConfigDir, claudeConfigDir, bobConfigDir,
|
|
54
|
-
|
|
54
|
+
openclaudeConfigDir, hostCatalogsNatively,
|
|
55
55
|
} from '../hosts/hosts.mjs';
|
|
56
56
|
|
|
57
57
|
// P5d moved these out of this file for the reason P5c moved the host resolvers: `harness
|
|
@@ -71,9 +71,9 @@ import { registryRecord, registryRoots } from '../inspect/registry.mjs';
|
|
|
71
71
|
// maintainer pair that needs nothing this driver is banned from having.
|
|
72
72
|
import { syncThemes } from './themes.mjs';
|
|
73
73
|
|
|
74
|
-
/** The
|
|
74
|
+
/** The nine `--emit` choices: a plain bundle, then a project and a global emit per host. */
|
|
75
75
|
const EMITS = ['files', 'opencode', 'opencode-global', 'claude', 'claude-global',
|
|
76
|
-
'bob', 'bob-global', '
|
|
76
|
+
'bob', 'bob-global', 'openclaude', 'openclaude-global'];
|
|
77
77
|
|
|
78
78
|
/** `_build_emit.PRIMARY_AGENT_SRC`. */
|
|
79
79
|
const PRIMARY_AGENT_SRC = path.join(ROOT, 'adapters', 'opencode', 'agents', 'orchestrator.md');
|
|
@@ -497,7 +497,7 @@ export function hookRunnerEntry() {
|
|
|
497
497
|
* to suppress the GLOBAL preamble of the same host, or null for a host that gets none.
|
|
498
498
|
*
|
|
499
499
|
* `_PREAMBLE_CONFIG_DIR` has exactly one key, so only a `CLAUDE.md` carrier resolves to a
|
|
500
|
-
* value: Bob's
|
|
500
|
+
* value: Bob's `AGENTS.md` gets null.
|
|
501
501
|
*
|
|
502
502
|
* Computed HERE and not in the render child, and that is the inverted boundary rule doing
|
|
503
503
|
* real work rather than being restated. P3b's note on the Python original: it resolves
|
|
@@ -519,10 +519,8 @@ function preambleExclude(claudeMd, host) {
|
|
|
519
519
|
/**
|
|
520
520
|
* `_build_global._warn_bob_global_over_project` — informational, never auto-removes.
|
|
521
521
|
*
|
|
522
|
-
*
|
|
523
|
-
*
|
|
524
|
-
* workspace rules may or may not shadow the global copy depending on precedence nothing can
|
|
525
|
-
* verify at emit time — so this text hedges where Copilot's asserts.
|
|
522
|
+
* The text hedges on purpose: Bob's workspace rules may or may not shadow the global copy,
|
|
523
|
+
* depending on a precedence nothing can verify at emit time.
|
|
526
524
|
*/
|
|
527
525
|
function warnBobGlobalOverProject() {
|
|
528
526
|
const survivors = projectSurvivors('bob');
|
|
@@ -646,27 +644,6 @@ function projectSurvivors(emitName) {
|
|
|
646
644
|
return out;
|
|
647
645
|
}
|
|
648
646
|
|
|
649
|
-
/**
|
|
650
|
-
* `_build_global._warn_copilot_global_over_project` — purely informational.
|
|
651
|
-
*
|
|
652
|
-
* Copilot documents no exclude or shadow mechanism, so a global preamble and a project
|
|
653
|
-
* one simply stack. UNREACHABLE from every golden cell: each emits into a fresh sandbox
|
|
654
|
-
* whose registry is empty, so `projectSurvivors` is always `[]` and this never prints.
|
|
655
|
-
* Reaching it needs a project emit registered BEFORE a global one in the same sandbox.
|
|
656
|
-
*/
|
|
657
|
-
function warnCopilotGlobalOverProject() {
|
|
658
|
-
const survivors = projectSurvivors('copilot');
|
|
659
|
-
if (!survivors.length) return;
|
|
660
|
-
process.stderr.write(
|
|
661
|
-
`[geneseed] WARN: ${survivors.length} project Copilot install(s) already exist — `
|
|
662
|
-
+ 'emitting GLOBAL now means BOTH preambles load together in those repos '
|
|
663
|
-
+ '(doubled context): Copilot stacks ~/.copilot/copilot-instructions.md on top '
|
|
664
|
-
+ "of a repo's own AGENTS.md. Review and remove what you don't want:\n");
|
|
665
|
-
for (const root of survivors) {
|
|
666
|
-
process.stderr.write(` - ${root} -> geneseed uninstall --target "${root}"\n`);
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
|
|
670
647
|
/**
|
|
671
648
|
* `_build_emit.emit_opencode` — the driver body, which is what this phase actually ports.
|
|
672
649
|
*
|
|
@@ -776,22 +753,14 @@ function emitOpencodeGlobal(cfg, args, out) {
|
|
|
776
753
|
}
|
|
777
754
|
|
|
778
755
|
/**
|
|
779
|
-
* `_build_global._emit_claude_core` — the shared engine behind six emits
|
|
780
|
-
*
|
|
781
|
-
* Only the two Copilot ones run through it so far, and that is a deliberate split rather
|
|
782
|
-
* than an arbitrary stopping point: `js/build/emit-claude.mjs's wire` gates the entire settings/hook path
|
|
783
|
-
* behind `if (!isCopilot)`, so a Copilot emit never reaches `hookPrefix` and therefore never
|
|
784
|
-
* needs `hookOpts` — the pair of machine-absolute values (`sys.executable` and the harness
|
|
785
|
-
* entry point) that a Node driver has no way to produce. Copilot crossing first isolates
|
|
786
|
-
* this driver body from that question entirely.
|
|
756
|
+
* `_build_global._emit_claude_core` — the shared engine behind six emits (Claude, Bob and
|
|
757
|
+
* OpenClaude, each per-repo and global).
|
|
787
758
|
*
|
|
788
|
-
*
|
|
789
|
-
*
|
|
790
|
-
* would receive `undefined`, hit its own default and throw the error it was
|
|
791
|
-
* — where `null` would raise an unrelated TypeError and `{}` would bake the
|
|
792
|
-
* `"undefined"` into the shim and silently kill every hook in the install.
|
|
793
|
-
* purpose. The four hook-writing hosts pass a real pair from `hookRunnerEntry()`, which
|
|
794
|
-
* cannot fail to produce one — `process.execPath` is the node already running.
|
|
759
|
+
* Every caller passes a real `hookOpts` pair from `hookRunnerEntry()`, which cannot fail to
|
|
760
|
+
* produce one — `process.execPath` is the node already running. Were it ever omitted,
|
|
761
|
+
* `hookPrefix()` would receive `undefined`, hit its own default and throw the error it was
|
|
762
|
+
* built to throw — where `null` would raise an unrelated TypeError and `{}` would bake the
|
|
763
|
+
* literal string `"undefined"` into the shim and silently kill every hook in the install.
|
|
795
764
|
*/
|
|
796
765
|
function emitClaudeCore(cfg, args, { cfgDir, claudeMd, scope, host, out, hookOpts }) {
|
|
797
766
|
const manifestPath = path.join(cfgDir, GLOBAL_MANIFEST);
|
|
@@ -799,12 +768,10 @@ function emitClaudeCore(cfg, args, { cfgDir, claudeMd, scope, host, out, hookOpt
|
|
|
799
768
|
const oldOwned = (doc && doc.owned) || [];
|
|
800
769
|
const oldManaged = (doc && doc.managed && typeof doc.managed === 'object'
|
|
801
770
|
&& !Array.isArray(doc.managed)) ? doc.managed : {};
|
|
802
|
-
const isCopilot = host === 'copilot';
|
|
803
771
|
|
|
804
|
-
// RENDER + WIRE in one child's worth of work. `preambleExclude` is null for every
|
|
805
|
-
// but
|
|
806
|
-
//
|
|
807
|
-
// neither does Bob's. Spelling it as a call rather than a literal is what makes that a
|
|
772
|
+
// RENDER + WIRE in one child's worth of work. `preambleExclude` is null for every
|
|
773
|
+
// carrier but `CLAUDE.md` — `_PREAMBLE_CONFIG_DIR` has exactly one key — so Bob's
|
|
774
|
+
// `AGENTS.md` does not resolve to one. Spelling it as a call rather than a literal is what makes that a
|
|
808
775
|
// measured `null` instead of an assumed one.
|
|
809
776
|
const rendered = emitClaudeRender(cfg, {
|
|
810
777
|
theme: args.theme, cfgDir, claudeMd, scope, host,
|
|
@@ -832,8 +799,7 @@ function emitClaudeCore(cfg, args, { cfgDir, claudeMd, scope, host, out, hookOpt
|
|
|
832
799
|
// VERIFY — re-read the settings file just written and match it against the claims just
|
|
833
800
|
// recorded, so a merge that silently did not stick (a commented file, a mid-flight
|
|
834
801
|
// external edit, a bug in the merge) is loud now instead of surfacing as hooks that
|
|
835
|
-
// quietly never fire.
|
|
836
|
-
// Copilot PROJECT emit records no hooks and so checks nothing.
|
|
802
|
+
// quietly never fire.
|
|
837
803
|
//
|
|
838
804
|
// On the Python driver this stage runs in Python AFTER a Node child did the wiring, which
|
|
839
805
|
// makes it a live cross-implementation check on every build. Here both halves are Node, so
|
|
@@ -845,10 +811,8 @@ function emitClaudeCore(cfg, args, { cfgDir, claudeMd, scope, host, out, hookOpt
|
|
|
845
811
|
// deleting this call is byte-identical in all 259 cells. `test_verify_reports_an_orphaned
|
|
846
812
|
// _geneseed_hook` plants the fault that makes it speak.
|
|
847
813
|
phaseLog('VERIFY');
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
path.join(cfgDir, managed.settings_file || 'settings.json'), managed, 'present');
|
|
851
|
-
}
|
|
814
|
+
settingsIntegrityCheck(
|
|
815
|
+
path.join(cfgDir, managed.settings_file || 'settings.json'), managed, 'present');
|
|
852
816
|
return {
|
|
853
817
|
nAgents: stats.nAgents,
|
|
854
818
|
nSkills: stats.nSkills,
|
|
@@ -858,38 +822,6 @@ function emitClaudeCore(cfg, args, { cfgDir, claudeMd, scope, host, out, hookOpt
|
|
|
858
822
|
};
|
|
859
823
|
}
|
|
860
824
|
|
|
861
|
-
/** `_build_global.emit_copilot` — per-repo: AGENTS.md at the repo root + a `.github/` layer. */
|
|
862
|
-
function emitCopilot(cfg, args, out) {
|
|
863
|
-
const root = args.root ? resolveOut(args.root) : out;
|
|
864
|
-
const cfgDir = path.join(root, '.github');
|
|
865
|
-
const r = emitClaudeCore(cfg, args, {
|
|
866
|
-
cfgDir, claudeMd: path.join(root, 'AGENTS.md'), scope: 'project', host: 'copilot', out,
|
|
867
|
-
});
|
|
868
|
-
process.stdout.write(`[geneseed] copilot (folder) -> ${root}: AGENTS.md + .github/ `
|
|
869
|
-
+ `(${r.nAgents} agents (.agent.md), ${r.nSkills} skills), ${r.memStatus}, `
|
|
870
|
-
+ `${r.nbStatus}. No hooks at project scope (Copilot reads hooks from `
|
|
871
|
-
+ '~/.copilot/settings.json only — the global emit wires them).\n');
|
|
872
|
-
return cfgDir;
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
/** `_build_global.emit_copilot_global` — into Copilot's personal config dir (~/.copilot). */
|
|
876
|
-
function emitCopilotGlobal(cfg, args, out) {
|
|
877
|
-
const cfgDir = args.cfgDir ?? copilotConfigDir();
|
|
878
|
-
warnCopilotGlobalOverProject();
|
|
879
|
-
// The hook runner pair, as for Claude and Bob: the global emit is the one Copilot scope
|
|
880
|
-
// that wires hooks (`~/.copilot/settings.json`), and the shim it bakes is machine-wide.
|
|
881
|
-
const hookOpts = hookRunnerEntry();
|
|
882
|
-
const r = emitClaudeCore(cfg, args, {
|
|
883
|
-
cfgDir, claudeMd: path.join(cfgDir, 'copilot-instructions.md'),
|
|
884
|
-
scope: 'global', host: 'copilot', out, hookOpts,
|
|
885
|
-
});
|
|
886
|
-
process.stdout.write(`[geneseed] copilot-global -> ${cfgDir}: ${r.nAgents} agents (.agent.md), `
|
|
887
|
-
+ `${r.nSkills} skills, copilot-instructions.md, ${r.memStatus}, ${r.nbStatus}, `
|
|
888
|
-
+ `${r.nHooks} hooks (settings.json: sessionStart context, preToolUse gate, agentStop + `
|
|
889
|
-
+ 'preCompact learn); MCP servers go in mcp-config.json.\n');
|
|
890
|
-
return cfgDir;
|
|
891
|
-
}
|
|
892
|
-
|
|
893
825
|
/**
|
|
894
826
|
* `_build_global.emit_claude_global` — into Claude Code's global config dir (~/.claude).
|
|
895
827
|
*
|
|
@@ -1018,7 +950,7 @@ function writeMarkers(markerDir, emit, footprint) {
|
|
|
1018
950
|
mkdirSync(markerDir, { recursive: true });
|
|
1019
951
|
writeText(path.join(markerDir, '.geneseed-emit'), `${emit}\n`);
|
|
1020
952
|
// Written for EVERY emit (build.py:443, unconditional), unlike the theme marker:
|
|
1021
|
-
// the claude/bob/
|
|
953
|
+
// the claude/bob/openclaude PROJECT installs never call build(), so this is their only
|
|
1022
954
|
// footprint record. Read by harness._footprint_of_dir, which defaults to 'full'.
|
|
1023
955
|
writeText(path.join(markerDir, '.geneseed-footprint'), `${footprint}\n`);
|
|
1024
956
|
} catch { /* best-effort, exactly as build.py:444-445 — a marker hiccup never fails a build */ }
|
|
@@ -1049,14 +981,13 @@ const GLOBAL_EMITS = {
|
|
|
1049
981
|
opencode: emitOpencodeGlobal,
|
|
1050
982
|
claude: emitClaudeGlobal,
|
|
1051
983
|
bob: emitBobGlobal,
|
|
1052
|
-
copilot: emitCopilotGlobal,
|
|
1053
984
|
openclaude: emitOpenclaudeGlobal,
|
|
1054
985
|
};
|
|
1055
986
|
|
|
1056
987
|
/**
|
|
1057
988
|
* The PER-REPO half of the same idea, and `doctor` is its only caller.
|
|
1058
989
|
*
|
|
1059
|
-
* `_claude_bob_emit_problems` renders `emit_claude`, `emit_bob` and `
|
|
990
|
+
* `_claude_bob_emit_problems` renders `emit_claude`, `emit_bob` and `emit_openclaude` into
|
|
1060
991
|
* throwaway sandboxes and scans each — the three emits that write CLAUDE.md/AGENTS.md
|
|
1061
992
|
* straight into a repo, and the ones outside doctor's sweep when the skill-table dead links
|
|
1062
993
|
* shipped.
|
|
@@ -1072,7 +1003,7 @@ const GLOBAL_EMITS = {
|
|
|
1072
1003
|
* three-positional call leaves in place, inherited here rather than re-decided.
|
|
1073
1004
|
*/
|
|
1074
1005
|
const PROJECT_EMITS = {
|
|
1075
|
-
claude: emitClaude, bob: emitBob,
|
|
1006
|
+
claude: emitClaude, bob: emitBob, openclaude: emitOpenclaude,
|
|
1076
1007
|
// P2. `opencode` joins the three for `cmdValidate`, which has to be able to render EVERY
|
|
1077
1008
|
// `--emit` choice into its sandbox and not only the three doctor already scans. Its call
|
|
1078
1009
|
// shape is `emitClaude`'s exactly — `(cfg, args, out)` — so the row is the whole change.
|
|
@@ -1210,7 +1141,7 @@ function run(argv) {
|
|
|
1210
1141
|
markerDir = GLOBAL_EMITS[args.emit.slice(0, -'-global'.length)](cfg, args, out);
|
|
1211
1142
|
} else if (args.emit !== 'files') {
|
|
1212
1143
|
// The PROJECT emits keep their markers in `out`, not in the host config dir the emit
|
|
1213
|
-
// wrote to (build.py:435-436) — `.
|
|
1144
|
+
// wrote to (build.py:435-436) — `.claude/` is the layer, `out` is the install.
|
|
1214
1145
|
PROJECT_EMITS[args.emit](cfg, args, out);
|
|
1215
1146
|
} else {
|
|
1216
1147
|
// The ninth choice, a plain bundle: `nativeCatalog: false` is build.py:421's
|
|
@@ -1223,7 +1154,7 @@ function run(argv) {
|
|
|
1223
1154
|
writeMarkers(markerDir, args.emit, args.footprint);
|
|
1224
1155
|
// build() drops a .geneseed-theme in `out` for the emits that call it; the global emits
|
|
1225
1156
|
// render into the config dir WITHOUT calling build(), so the theme is recorded here.
|
|
1226
|
-
// Deliberately not written for the claude/bob/
|
|
1157
|
+
// Deliberately not written for the claude/bob/openclaude PROJECT emits — they carry none,
|
|
1227
1158
|
// and `_harness_setup._installed_defaults` detects those by an AGENT.md sigil scan
|
|
1228
1159
|
// instead. Writing one for them would change the emitted tree.
|
|
1229
1160
|
if (args.emit.endsWith('-global')) {
|
|
@@ -1234,7 +1165,7 @@ function run(argv) {
|
|
|
1234
1165
|
// An ALLOW-LIST, not "everything that is not global": a plain `--emit files` dev build —
|
|
1235
1166
|
// the default — must never pollute the registry, and only the four per-repo host emits
|
|
1236
1167
|
// are ones `_EMIT_HOST_SCOPE` can map back to a row. Records `out`, where the marker is.
|
|
1237
|
-
if (['opencode', 'claude', 'bob', '
|
|
1168
|
+
if (['opencode', 'claude', 'bob', 'openclaude'].includes(args.emit)) {
|
|
1238
1169
|
registryRecord(markerDir);
|
|
1239
1170
|
}
|
|
1240
1171
|
return 0;
|