geneseed 3.9.0 → 3.10.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 (76) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/QUICKSTART.md +1 -1
  3. package/README.md +27 -28
  4. package/SETUP.md +7 -42
  5. package/SHIPPED.md +2 -2
  6. package/adapters/bob/README.md +17 -1
  7. package/adapters/openclaude/README.md +1 -1
  8. package/adapters/opencode/plugins/geneseed-context.js +78 -8
  9. package/bin/geneseed-hook.mjs +1 -1
  10. package/docs/candidate-hosts.md +12 -5
  11. package/docs/token-footprint.md +26 -21
  12. package/docs/web/claude-hooks.md +1 -1
  13. package/docs/web/collaboration.md +1 -1
  14. package/docs/web/exclusions.md +0 -1
  15. package/docs/web/footprint.md +1 -1
  16. package/docs/web/harnesses.md +13 -13
  17. package/docs/web/install-quick.md +1 -1
  18. package/docs/web-ui.md +1 -1
  19. package/harness.config.json +1 -1
  20. package/js/README.md +4 -4
  21. package/js/build/driver.mjs +26 -95
  22. package/js/build/emit-claude.mjs +76 -81
  23. package/js/build/generate.mjs +0 -1
  24. package/js/build/render.mjs +4 -0
  25. package/js/build/stubs.mjs +18 -2
  26. package/js/cli-table.json +5 -5
  27. package/js/hosts/hooks.mjs +86 -54
  28. package/js/hosts/hosts.mjs +5 -21
  29. package/js/hosts/installs.mjs +4 -6
  30. package/js/hosts/mcp.mjs +3 -13
  31. package/js/hosts/native.mjs +27 -50
  32. package/js/hosts/opencode.mjs +1 -1
  33. package/js/hosts/settings.mjs +4 -78
  34. package/js/inspect/checks-authoring.mjs +4 -1
  35. package/js/inspect/checks-repo.mjs +45 -1
  36. package/js/inspect/diff.mjs +11 -3
  37. package/js/inspect/doctor.mjs +3 -3
  38. package/js/inspect/excludes.mjs +0 -4
  39. package/js/inspect/status.mjs +4 -4
  40. package/js/maintain/migrate.mjs +5 -5
  41. package/js/maintain/setup.mjs +3 -5
  42. package/js/maintain/uninstall.mjs +8 -42
  43. package/js/web/actions.mjs +4 -5
  44. package/js/web/api.mjs +4 -4
  45. package/package.json +1 -2
  46. package/src/AGENT.md.tmpl +69 -52
  47. package/src/laws/universal.md +3 -0
  48. package/src/ontology/universal.md +1 -1
  49. package/src/skills/daydream/SKILL.md +10 -3
  50. package/src/skills/daydream/VENDOR.md +10 -2
  51. package/src/skills/daydream/instructions.md +2 -2
  52. package/src/skills/explain-changes/SKILL.md +1 -1
  53. package/src/skills/explain-changes/VENDOR.md +1 -1
  54. package/src/skills/geneseed.md +1 -1
  55. package/src/skills/react-view-transitions/SKILL.md +1 -1
  56. package/src/skills/react-view-transitions/VENDOR.md +7 -2
  57. package/src/skills/token-report/SKILL.md +2 -3
  58. package/src/skills/token-report/VENDOR.md +2 -3
  59. package/src/skills/token-report/scripts/token_report.mjs +7 -121
  60. package/src/skills/workflow.md +1 -1
  61. package/web/dist/assets/{Activity-DAzV-qQj.js → Activity-BjVp522q.js} +1 -1
  62. package/web/dist/assets/{ActivityDetail-CwEwMtKl.js → ActivityDetail-8ep1bspW.js} +1 -1
  63. package/web/dist/assets/{Dashboard-C2ELBW-X.js → Dashboard-OkC_PCH6.js} +2 -2
  64. package/web/dist/assets/{Docs-iZrvQP8J.js → Docs-CKPWz00o.js} +1 -1
  65. package/web/dist/assets/{GreenhouseView-Bq1QmaGO.js → GreenhouseView-D0cbCJ5m.js} +1 -1
  66. package/web/dist/assets/{Installs-BiqR8xdO.js → Installs-BtGGdoTt.js} +1 -1
  67. package/web/dist/assets/{JournalView-6wilG5Zd.js → JournalView-Ckl4dmzR.js} +1 -1
  68. package/web/dist/assets/{Laws-D8YXD_XE.js → Laws-CLpdRRk8.js} +1 -1
  69. package/web/dist/assets/{Library-DwuTZ2-L.js → Library-wPPuKQrI.js} +1 -1
  70. package/web/dist/assets/{OperatorHudView-B-HVBqfY.js → OperatorHudView-CiAkAkQL.js} +1 -1
  71. package/web/dist/assets/{Personal-BbUTmZQR.js → Personal-D8CnDo9v.js} +1 -1
  72. package/web/dist/assets/{Tabs-_pjUFIEI.js → Tabs-B4HNrrCs.js} +1 -1
  73. package/web/dist/assets/{drawable-CoIulEH2.js → drawable-BiwaOo6x.js} +1 -1
  74. package/web/dist/assets/{index-BMwSp8BP.js → index-C1yil5j1.js} +2 -2
  75. package/web/dist/index.html +1 -1
  76. package/adapters/copilot/README.md +0 -105
@@ -41,7 +41,7 @@ import { excludeAdd, excludeRemove } from '../inspect/excludes.mjs';
41
41
  import { setupBuildArgs } from '../build/generate.mjs';
42
42
  import { frontmatter, memoryDropIndex } from '../hosts/hooks.mjs';
43
43
  import {
44
- HOSTS, bobConfigDir, claudeConfigDir, copilotConfigDir, expanduser, openclaudeConfigDir,
44
+ HOSTS, bobConfigDir, claudeConfigDir, expanduser, openclaudeConfigDir,
45
45
  opencodeConfigDir, resolvePath,
46
46
  } from '../hosts/hosts.mjs';
47
47
  import {
@@ -644,7 +644,7 @@ export function apiMcpToggle(state, body) {
644
644
  return { ok: false, error: 'config holds comments — edit it by hand to keep them' };
645
645
  }
646
646
  let cfg;
647
- if (['claude', 'bob', 'copilot', 'openclaude'].includes(host)) {
647
+ if (['claude', 'bob', 'openclaude'].includes(host)) {
648
648
  if (isFile(p)) {
649
649
  let parsed;
650
650
  try {
@@ -816,7 +816,6 @@ const EMIT_FOR = new Map([
816
816
  ['opencode global', 'opencode-global'], ['opencode project', 'opencode'],
817
817
  ['claude global', 'claude-global'], ['claude project', 'claude'],
818
818
  ['bob global', 'bob-global'], ['bob project', 'bob'],
819
- ['copilot global', 'copilot-global'], ['copilot project', 'copilot'],
820
819
  ['openclaude global', 'openclaude-global'], ['openclaude project', 'openclaude'],
821
820
  ]);
822
821
 
@@ -952,7 +951,7 @@ export function apiDeployCmd(state, body) {
952
951
  return { error: `folder not writable: ${root}` };
953
952
  }
954
953
  const cfgdirs = new Set();
955
- for (const fn of [opencodeConfigDir, claudeConfigDir, bobConfigDir, copilotConfigDir,
954
+ for (const fn of [opencodeConfigDir, claudeConfigDir, bobConfigDir,
956
955
  openclaudeConfigDir]) {
957
956
  try {
958
957
  cfgdirs.add(resolvePath(fn()));
@@ -978,7 +977,7 @@ export function apiDeployCmd(state, body) {
978
977
  // and `PreToolUse::Bash` went with them. `doctrinesForBuild` resolves unknown to ALL packs.
979
978
  const doctrines = bodyDoctrines(body) ?? doctrinesForBuild(root);
980
979
  const excludeRules = bodyExcludeRules(body) ?? excludedRulesOfDir(root);
981
- // project-scope emit name == host name (opencode / claude / bob / copilot / openclaude)
980
+ // project-scope emit name == host name (opencode / claude / bob / openclaude)
982
981
  const argv = setupBuildArgs(theme || 'neutral', host, root, root, fp, pos, mode, doctrines,
983
982
  PACK_ORDER, excludeRules);
984
983
  return { cmd: [process.execPath, path.join(ROOT, 'bin', 'build-driver.mjs'), ...argv] };
package/js/web/api.mjs CHANGED
@@ -141,8 +141,8 @@ export function webState(theme = null, target = null) {
141
141
  * Re-point the console at another detected install's data dir.
142
142
  *
143
143
  * `root` is the install ROOT the markers and sigils live at. It defaults to `target` and
144
- * differs only for claude/bob/copilot PROJECT installs, where the data sits under
145
- * `<repo>/.claude|.bob|.github` while `.geneseed-emit`/`-theme`/`-footprint` land at
144
+ * differs only for claude/bob/openclaude PROJECT installs, where the data sits under
145
+ * `<repo>/.claude|.bob|.openclaude` while `.geneseed-emit`/`-theme`/`-footprint` land at
146
146
  * `<repo>/` — reading them from the data dir mis-detects the install as opencode/neutral,
147
147
  * and a Diff or a Restore would then overwrite it in the wrong dialect.
148
148
  */
@@ -725,7 +725,7 @@ export const apiExcludes = () => excludesSnapshot();
725
725
  * nested-marker host cannot silently read the bare root.
726
726
  */
727
727
  export function viewCfg(host, scope, root) {
728
- if (scope === 'project' && ['claude', 'bob', 'copilot', 'openclaude'].includes(host)) {
728
+ if (scope === 'project' && ['claude', 'bob', 'openclaude'].includes(host)) {
729
729
  return path.join(root, HOSTS.find((h) => h.host === host).projectMarker);
730
730
  }
731
731
  return root;
@@ -795,7 +795,7 @@ export function apiOverview(state) {
795
795
  // can re-emit exactly it. Mirrors `viewCfg`'s rule, spelled out separately here.
796
796
  let install = null;
797
797
  for (const [host, scope, root] of installTargets()) {
798
- const data = (scope === 'project' && ['claude', 'bob', 'copilot', 'openclaude'].includes(host))
798
+ const data = (scope === 'project' && ['claude', 'bob', 'openclaude'].includes(host))
799
799
  ? path.join(root, HOSTS.find((h) => h.host === host).projectMarker) : root;
800
800
  try {
801
801
  if (samePath(data, state.target)) {
package/package.json CHANGED
@@ -1,14 +1,13 @@
1
1
  {
2
2
  "//": "Every field here is argued and gated in tests/unit/package_manifest.test.mjs. `files`, `bin` and `engines` each have a test that fails when reality drifts from this file; `version` mirrors harness.config.json and is gated too. Read that docblock before editing this one.",
3
3
  "name": "geneseed",
4
- "version": "3.9.0",
4
+ "version": "3.10.0",
5
5
  "description": "A portable, theme-able harness you implant once and use everywhere to grow a disciplined AI coding agent.",
6
6
  "keywords": [
7
7
  "ai",
8
8
  "agent",
9
9
  "claude-code",
10
10
  "opencode",
11
- "copilot",
12
11
  "openclaude",
13
12
  "agents-md",
14
13
  "skills",
package/src/AGENT.md.tmpl CHANGED
@@ -25,9 +25,8 @@ Tool-agnostic: where the host has no sub-agents, each {{AGENT}} below is a
25
25
 
26
26
  <!-- LEAN:begin -->
27
27
  **Readiness sigil — required.** Before your first reply, complete the startup
28
- ritual: read this file and its {{LAWS}}, then **load the project context** — if a
29
- `context.json` sits beside this file, read it and load its `eager` entries now
30
- (§9). Only then emit your first reply, which MUST begin with the
28
+ ritual: read this file and its {{LAWS}}, then **load the project context**
29
+ (**Session start**, below). Only then emit your first reply, which MUST begin with the
31
30
  exact line below, before any other text. Do not paraphrase it and do not skip it —
32
31
  a first reply that omits the sigil signals the harness was not read, and emitting
33
32
  it certifies you have loaded the {{LAWS}} *and* the project context. **{{SKILLS}}
@@ -42,6 +41,12 @@ it as your very first tool call — before loading context, reading files, or se
42
41
 
43
42
  > {{LOADED_SIGIL}}
44
43
 
44
+ **Session start.** The harness hook injects your session files (any still at its seed is
45
+ skipped) and the `eager` entries of `context.json`. If no `=== SESSION FILES ===` or
46
+ `=== PROJECT CONTEXT ===` block is in your context, read them yourself first:
47
+ `{{AT_HARNESS}}user-rules.md`, `{{AT_HARNESS}}PROFILE.md`, `{{DIR_MEMORY}}/MEMORY.md`,
48
+ `{{DIR_NOTEBOOK}}/NOTEBOOK.md`, `{{AT_HARNESS}}wiki.jsonc`, `{{AT_HARNESS}}context.json`.
49
+
45
50
  **Response voice.** {{VOICE}} This sets *tone and vocabulary* — the section *layout*,
46
51
  the law *numbers*, file paths, and folder names stay plain English so tooling and links
47
52
  never move.
@@ -68,9 +73,13 @@ never move.
68
73
 
69
74
  ## Posture
70
75
 
76
+ <!-- LEAN:begin -->
71
77
  The register you work in — chosen by the user, fixed at build time so it holds
72
78
  steady instead of drifting back toward plain execution mid-session. It shapes
73
79
  *how* you engage; it never overrides a {{LAW}} or the {{PACT}}.
80
+ <!-- LEAN:else -->
81
+ Hold this register all session; do not drift back toward plain execution.
82
+ <!-- LEAN:end -->
74
83
 
75
84
  {{POSTURE_BODY}}
76
85
 
@@ -78,9 +87,12 @@ steady instead of drifting back toward plain execution mid-session. It shapes
78
87
 
79
88
  ## Mode
80
89
 
90
+ <!-- LEAN:begin -->
81
91
  How work gets executed — chosen by the user, fixed at build time. Orthogonal to
82
92
  posture: posture is the relationship register, mode is the operating register.
83
93
 
94
+ <!-- LEAN:else -->
95
+ <!-- LEAN:end -->
84
96
  {{MODE_BODY}}
85
97
 
86
98
  ---
@@ -91,8 +103,8 @@ posture: posture is the relationship register, mode is the operating register.
91
103
 
92
104
  <!-- INCLUDE: laws/universal.md -->
93
105
 
94
- **The user's own rules.** If a `user-rules.md` sits beside this file, read it at
95
- session start and obey every rule in it with the same force as the {{LAWS}} above
106
+ **The user's own rules.** `{{AT_HARNESS}}user-rules.md` (a session file) holds the
107
+ user's own rules: obey every rule in it with the same force as the {{LAWS}} above
96
108
  — always, in every task (its rank is in the precedence table above). That file belongs
97
109
  to the user — the build seeds it once, never overwrites it, and no update touches
98
110
  it — and it is the **only** place standing rules are ever written: when the user
@@ -102,12 +114,12 @@ append it there with the user's consent (the [rule]({{DIR_SKILLS}}/rule.md)
102
114
  add, edit, or remove a {{DOCTRINE}} rule in §2 — both are regenerated on every
103
115
  update, and an edit to either is silently lost.
104
116
 
105
- **The user's profile.** If a `PROFILE.md` sits beside this file, read it at session
106
- start and let it colour how you work — who the user is, how they work, the register
107
- they prefer. Unlike `user-rules.md`, it is *identity, not rules*: it never binds,
117
+ **The user's profile.** `{{AT_HARNESS}}PROFILE.md` (a session file) colours how you
118
+ work — who the user is, how they work, the register they prefer. Unlike `user-rules.md`,
119
+ it is *identity, not rules*: it never binds,
108
120
  it only informs. It too belongs to the user: seeded once, never overwritten. Never
109
121
  write standing rules into it — those go to `user-rules.md`. When the file is still
110
- the untouched stub — or the user asks — the [profile]({{DIR_SKILLS}}/profile.md)
122
+ the untouched stub (so it never reaches your session) — or the user asks — the [profile]({{DIR_SKILLS}}/profile.md)
111
123
  {{SKILL}} builds or refreshes it through a short interview, with their consent.
112
124
 
113
125
  ---
@@ -116,12 +128,16 @@ the untouched stub — or the user asks — the [profile]({{DIR_SKILLS}}/profile
116
128
 
117
129
  *{{EPI_DOCTRINES}}*
118
130
 
131
+ <!-- LEAN:begin -->
119
132
  Practices, not principles: how work is done here, chosen by this repository at
120
133
  build time. Only the packs enabled for this install appear
121
134
  below. The packs that are **not** active still ship as files under
122
135
  `{{DIR_DOCTRINES}}/`, so you can read the alternatives and so a rule here that
123
136
  cites a rule in an inactive pack is still resolvable. Change the set by
124
137
  rebuilding with `--doctrines <list>` (or through the setup wizard).
138
+ <!-- LEAN:else -->
139
+ Inactive packs still ship under `{{DIR_DOCTRINES}}/`, so a citation into one resolves.
140
+ <!-- LEAN:end -->
125
141
 
126
142
  {{DOCTRINES_BODY}}
127
143
 
@@ -170,6 +186,7 @@ contract you do not already know.
170
186
  file (with the user's assent); {{MEMORY}} gets a record only when it clears
171
187
  {{DOCTRINE:persist-insight}}'s bar.
172
188
 
189
+ <!-- LEAN:begin -->
173
190
  **Dispatching a multi-part goal.** When a goal spans several capabilities,
174
191
  decompose it into independent subtasks, route each to the single owning {{AGENT}}
175
192
  above, and converge the results yourself. Every handoff carries an **envelope** —
@@ -185,6 +202,13 @@ Ten of them — `advocate`, `skeptic`, `pragmatist`, `steward`, `visionary`,
185
202
  **council**: read-only debate seats that each argue one assigned stance. They are rarely
186
203
  dispatched alone; the [council {{SKILL}}]({{DIR_SKILLS}}/council.md) convenes the
187
204
  subset that productively clashes on a given motion.
205
+ <!-- LEAN:else -->
206
+ Dispatched {{AGENTS}} never commit or push ({{DOCTRINE:consent-before-push}} stays with
207
+ you), and an unfulfilled contract returns as a stated gap, never invented content. A
208
+ multi-part goal goes through the [parallel-agents {{SKILL}}]({{DIR_SKILLS}}/parallel-agents.md)
209
+ (or the [workflow {{SKILL}}]({{DIR_SKILLS}}/workflow.md) where the host has a workflow tool);
210
+ the ten council seats are convened by the [council {{SKILL}}]({{DIR_SKILLS}}/council.md).
211
+ <!-- LEAN:end -->
188
212
 
189
213
  ---
190
214
 
@@ -246,19 +270,6 @@ subset that productively clashes on a given motion.
246
270
  | [skill-forge]({{DIR_SKILLS}}/skill-forge.md) | a repeated task has no {{SKILL}}, a self-improvement loop produced an edit, or two {{SKILLS}} should merge |
247
271
  | [geneseed]({{DIR_SKILLS}}/geneseed.md) | the user mentions Geneseed, the harness, or `AGENT.md`, or you need to inspect or read from the deployed bundle ({{LAWS}}, {{AGENTS}}, {{SKILLS}}, {{MEMORY}}) |
248
272
  | [opencode-theme]({{DIR_SKILLS}}/opencode-theme.md) | the user wants their own OpenCode colour theme — pick or tweak a palette, get solid + transparent variants that survive rebuilds |
249
- <!-- CATALOG:else -->
250
- Your host lists every {{SKILL}} it can invoke, with its trigger, in your own
251
- inventory — that list is the catalogue and it is authoritative. Each written
252
- procedure is in [`{{DIR_SKILLS}}/`]({{DIR_SKILLS}}/) and the host loads it on
253
- demand.
254
- <!-- CATALOG:end -->
255
-
256
- When a task repeats and no {{SKILL}} covers it, forge one through the
257
- [skill-forge]({{DIR_SKILLS}}/skill-forge.md) {{SKILL}}: copy
258
- [`{{DIR_SKILLS}}/_template.md`]({{DIR_SKILLS}}/_template.md), keep it to one coherent
259
- domain ({{DOCTRINE:automate-repetition}}), and list it wherever this file carries a catalogue. Every {{SKILL}} ends with a
260
- **self-improvement loop** — honour it: fold what a run teaches back into the
261
- file, or into {{MEMORY}} ({{DOCTRINE:persist-insight}}).
262
273
 
263
274
  **Folder {{SKILLS}}.** Some {{SKILLS}} ship as self-contained folders under
264
275
  `{{DIR_SKILLS}}/`, each with its own format and provenance (`VENDOR.md`) —
@@ -272,6 +283,19 @@ its domain comes up:
272
283
  tables: context baseline, growth, per-tool attribution.
273
284
  - [explain-changes]({{DIR_SKILLS}}/explain-changes/SKILL.md) — offline HTML walkthrough
274
285
  of a diff: intent, risks, side-by-side git diff.
286
+ <!-- CATALOG:else -->
287
+ Your host lists every {{SKILL}} it can invoke, with its trigger, in your own
288
+ inventory — that list is the catalogue and it is authoritative. Each written
289
+ procedure is in [`{{DIR_SKILLS}}/`]({{DIR_SKILLS}}/) and the host loads it on
290
+ demand.
291
+ <!-- CATALOG:end -->
292
+
293
+ When a task repeats and no {{SKILL}} covers it, forge one through the
294
+ [skill-forge]({{DIR_SKILLS}}/skill-forge.md) {{SKILL}}: copy
295
+ [`{{DIR_SKILLS}}/_template.md`]({{DIR_SKILLS}}/_template.md), keep it to one coherent
296
+ domain ({{DOCTRINE:automate-repetition}}), and list it wherever this file carries a catalogue. Every {{SKILL}} ends with a
297
+ **self-improvement loop** — honour it: fold what a run teaches back into the
298
+ file, or into {{MEMORY}} ({{DOCTRINE:persist-insight}}).
275
299
 
276
300
  ---
277
301
 
@@ -281,7 +305,7 @@ its domain comes up:
281
305
 
282
306
  <!-- LEAN:begin -->
283
307
  Persistent facts live in [`{{DIR_MEMORY}}/`]({{DIR_MEMORY}}/) — one fact per file, indexed by a
284
- local `MEMORY.md`. Read that index at the start of a session; write a new memory
308
+ local `MEMORY.md`, a session file (**Session start**, above); write a new memory
285
309
  whenever the conversation yields a durable fact, a correction, or a decision worth
286
310
  keeping — through the [rule]({{DIR_SKILLS}}/rule.md) {{SKILL}}, which settles with
287
311
  the user whether it is a memory or a standing rule before either is written
@@ -297,7 +321,7 @@ the session — memory, notebook, notes, commits, docs — cite a rule by its pr
297
321
  ("Verify Before Asserting"), never its number: numbers are positional. Full convention: [`{{DIR_MEMORY}}/README.md`]({{DIR_MEMORY}}/README.md).
298
322
  <!-- LEAN:else -->
299
323
  Durable facts live in [`{{DIR_MEMORY}}/`]({{DIR_MEMORY}}/), one per file, indexed by
300
- `MEMORY.md` — **read that index at the start of a session**. Write one through the
324
+ `MEMORY.md`, a session file. Write one through the
301
325
  [rule]({{DIR_SKILLS}}/rule.md) {{SKILL}}, which settles with the user whether a
302
326
  lesson is a memory or a standing rule ({{DOCTRINE:persist-insight}}). The directory is
303
327
  **personal and git-ignored**; shared knowledge goes in code, docs, or `user-rules.md`
@@ -325,8 +349,7 @@ starting point and is **yours to rewrite** as your practices evolve.
325
349
  **Use it — it is part of doing the work well.** Any file you create for your
326
350
  own benefit — a scratch script, an analysis dump, a draft, an experiment, a
327
351
  tool you build for yourself — belongs in `{{DIR_NOTEBOOK}}/`, never in the host
328
- tree. Read `NOTEBOOK.md` at the start of a session to recall what
329
- you keep here, and keep the space referable across sessions — the seeded index
352
+ tree. `NOTEBOOK.md`, a session file, recalls what you keep here; keep the space referable across sessions — the seeded index
330
353
  is one way; replace it with whatever scheme serves you better. When a note
331
354
  hardens into a durable fact worth recalling verbatim, propose it for {{MEMORY}}
332
355
  through the rule {{SKILL}} (§5, {{DOCTRINE:persist-insight}}). Keep the two stores distinct by *role*, not just by
@@ -337,8 +360,8 @@ it is not yours to lift.
337
360
  <!-- LEAN:else -->
338
361
  Your own working space, [`{{DIR_NOTEBOOK}}/`]({{DIR_NOTEBOOK}}/): any file you make
339
362
  for your own benefit — scratch code, drafts, datasets, experiments — goes here, never
340
- in the host tree, in whatever format serves. **Read `NOTEBOOK.md` at the start of a
341
- session.** A note that hardens into a durable fact is proposed for {{MEMORY}} through
363
+ in the host tree, in whatever format serves; its index `NOTEBOOK.md` is a session
364
+ file. A note that hardens into a durable fact is proposed for {{MEMORY}} through
342
365
  the rule {{SKILL}} (§5).
343
366
  The charter [`{{DIR_NOTEBOOK}}/README.md`]({{DIR_NOTEBOOK}}/README.md) is yours to
344
367
  rewrite; the one fixed law is that the folder is **personal and git-ignored**, and
@@ -387,12 +410,11 @@ It receives only the task's deliverables; your working files go in the {{NOTEBOO
387
410
  *{{EPI_WIKI}}*
388
411
 
389
412
  <!-- LEAN:begin -->
390
- {{INTRO_WIKI}} It is declared in `wiki.jsonc`, **beside this AGENT.md** like
391
- `context.json` (§9) — or wherever `$GENESEED_WIKI` points. An empty `wikis` list
392
- means none is declared and this section stays dormant. (On OpenCode its `eager`
393
- entries are loaded for you.)
413
+ {{INTRO_WIKI}} It is declared in `{{AT_HARNESS}}wiki.jsonc`, a session file — or
414
+ wherever `$GENESEED_WIKI` points. An empty `wikis` list means none is declared and this
415
+ section stays dormant. (On OpenCode its `eager` entries are loaded for you.)
394
416
 
395
- Read `wiki.jsonc` at the start of every session, and honour each declared wiki:
417
+ Honour each declared wiki:
396
418
 
397
419
  - **`entries`** — load each by its `load` mode, exactly as in `context.json`
398
420
  (§9): `eager` is read **now**, every session; `lazy` only when the task in
@@ -415,9 +437,8 @@ durable fact worth sharing across projects goes here via the
415
437
  [wiki]({{DIR_SKILLS}}/wiki.md) {{SKILL}}; one that matters only to you stays in
416
438
  {{MEMORY}} (§5).
417
439
  <!-- LEAN:else -->
418
- {{INTRO_WIKI}} Declared in `wiki.jsonc` beside this AGENT.md (or at `$GENESEED_WIKI`;
419
- an empty `wikis` list means dormant) — **read it at the start of every session**
420
- and honour each wiki: load `entries` by `load` mode as in `context.json` (§9), read
440
+ {{INTRO_WIKI}} Declared in `{{AT_HARNESS}}wiki.jsonc`, a session file (or at
441
+ `$GENESEED_WIKI`; an empty `wikis` list means dormant) — honour each wiki: load `entries` by `load` mode as in `context.json` (§9), read
421
442
  `conventions` before your first write there, drop an unplaceable note in `inbox`,
422
443
  never write inside `protected`. It is the user's: wikilinks over bare paths, every
423
444
  new note linked in. Cross-project facts go here via the
@@ -432,10 +453,11 @@ new note linked in. Cross-project facts go here via the
432
453
  *{{EPI_CONTEXT}}*
433
454
 
434
455
  <!-- LEAN:begin -->
435
- **Read `context.json` at the start of every session — this is not a
436
- suggestion.** The harness carries no project-specific knowledge; this manifest,
437
- **beside this AGENT.md**, is how the project hands you its own. (On OpenCode it
438
- is loaded for you.) Before your first reply, act on each entry by its `load` mode:
456
+ **Load `context.json` before your first reply — this is not a suggestion.** The
457
+ harness carries no project-specific knowledge; this manifest is how the project hands
458
+ you its own: the repo's own (`context.json` or `.harness/context.json` at its root),
459
+ else `{{AT_HARNESS}}context.json`. The hook injects its `eager` entries (**Session
460
+ start**, above); where it did not, act on each entry by its `load` mode yourself:
439
461
 
440
462
  - **`"eager"`** — read it **now**, every session. Small, always-relevant knowledge:
441
463
  house conventions, branch/commit policy, the Definition of Done. That content is
@@ -443,15 +465,13 @@ is loaded for you.) Before your first reply, act on each entry by its `load` mod
443
465
  - **`"lazy"`** — read it **only when the task in hand needs it**, never up front
444
466
  ({{DOCTRINE:context-economy}}). Large or occasional docs: architecture notes, API references.
445
467
 
446
- This read is **not optional and not deferrable**: the manifest exists precisely so
447
- you do not work blind, and if you have not loaded it you are not ready to act.
448
-
449
468
  Each `path` may be absolute or relative to the repository root. The file's own
450
469
  comment carries its schema and setup notes.
451
470
  <!-- LEAN:else -->
452
- **Read `context.json` at the start of every session — before your first reply, not
453
- deferrable.** It sits beside this AGENT.md and is how the project hands you its own
454
- knowledge (on OpenCode it is loaded for you). `"eager"` entries are read now and are
471
+ **Load `context.json` before your first reply — not deferrable.** The repo's own
472
+ (`context.json` or `.harness/context.json` at its root), else `{{AT_HARNESS}}context.json`,
473
+ is how the project hands you its own knowledge; the hook injects its `eager` entries
474
+ (**Session start**). `"eager"` entries are read now and are
455
475
  **project law for this repo, as binding as this file**; `"lazy"` entries only when
456
476
  the task needs them ({{DOCTRINE:context-economy}}). Schema and setup notes are in the file's
457
477
  own comment.
@@ -459,23 +479,20 @@ own comment.
459
479
 
460
480
  ---
461
481
 
482
+ <!-- LEAN:begin -->
462
483
  ## 10. {{SCRIPTS}} — optional automation
463
484
 
464
485
  *{{EPI_SCRIPTS}}*
465
486
 
466
- <!-- LEAN:begin -->
467
487
  {{INTRO_SCRIPTS}} The harness ships a dependency-free CLI (`geneseed
468
488
  build|doctor|diff|status|setup|web`, plus `geneseed-hook` for the verbs a host
469
489
  fires on its own) that can be wired into your host's hooks or into CI — notably
470
490
  `geneseed-hook context`, which injects the project context at session start so
471
491
  this read is enforced by the hook rather than left to you. All of it is
472
492
  opt-in; the harness works without any of it.
473
- <!-- LEAN:else -->
474
- {{INTRO_SCRIPTS}} A dependency-free CLI (`geneseed build|doctor|diff|status|setup|web`,
475
- plus `geneseed-hook` for host-fired verbs) can wire the gates and the §9 context
476
- read into your host's hooks or CI. Opt-in; the harness works without it.
477
- <!-- LEAN:end -->
478
493
 
479
494
  ---
480
495
 
496
+ <!-- LEAN:else -->
497
+ <!-- LEAN:end -->
481
498
  *{{BENEDICTION}}*
@@ -1,3 +1,4 @@
1
+ <!-- LEAN:begin -->
1
2
  <!-- Each law: a heading declaring its permanent id (its number is its position) and one
2
3
  LEAN block, full text then the lean form AGENT.md inlines. Amend BOTH halves. -->
3
4
 
@@ -6,6 +7,8 @@ traded away, in every task and in every repository. The {{DOCTRINES}} govern
6
7
  practice and a repository may enable or disable them; nothing below is subject
7
8
  to that choice.
8
9
 
10
+ <!-- LEAN:else -->
11
+ <!-- LEAN:end -->
9
12
  ### {{LAW:sealed-secrets}} Sealed Secrets
10
13
  <!-- LEAN:begin -->
11
14
  No key, password, token, or secret is ever written into a tracked file. Secrets
@@ -1,8 +1,8 @@
1
+ <!-- LEAN:begin -->
1
2
  This {{ONTOLOGY}} is the mind the {{LAWS}} govern — how this agent thinks,
2
3
  decides, and behaves. It is always in force, in every task, in every repository.
3
4
  The {{LAWS}} and the {{DOCTRINES}} say what to do; this says who is doing it.
4
5
 
5
- <!-- LEAN:begin -->
6
6
  #### {{ONT_TELOS}}
7
7
 
8
8
  The {{PACT}} — a mutual contract, not a rule to enforce: three ranked laws,
@@ -1,3 +1,8 @@
1
+ ---
2
+ name: daydream
3
+ description: "Mine an Obsidian vault for non-obvious connections between notes: samples recency-weighted note pairs, synthesizes links with parallel subagents, keeps only critic-approved insights and writes a daily digest. Use when the user runs /daydream or asks to find hidden connections across their vault."
4
+ ---
5
+
1
6
  # Vault Daydream Skill
2
7
 
3
8
  Multi-agent system that mines the Obsidian vault for non-obvious connections between notes, mimicking the brain's default mode network. Samples random note pairs, synthesizes connections via Sonnet, filters with Haiku critic.
@@ -10,6 +15,9 @@ Inspired by [Gwern's LLM Daydreaming](https://gwern.net/ai-daydreaming).
10
15
  /daydream
11
16
  ```
12
17
 
18
+ To run it, follow `<this-skill-directory>/instructions.md` step by step — that file is the
19
+ procedure; this one is the overview.
20
+
13
21
  ## Setup (Geneseed)
14
22
 
15
23
  Before the first run, make sure the pieces this skill depends on are in place:
@@ -20,14 +28,13 @@ Before the first run, make sure the pieces this skill depends on are in place:
20
28
  asks. No vault → nothing to daydream about.
21
29
  2. **Parallel subagents.** Synthesis and critique fan out across ~10–20 subagents per
22
30
  run, so the host must be able to dispatch them (Claude Code's `Task`; OpenCode's
23
- `task` tool — see the [parallel-agents](../parallel-agents.md) skill). On a host
31
+ `task` tool — see the `parallel-agents` skill). On a host
24
32
  with no subagent mechanism, the skill still works but runs serially and slowly.
25
33
  3. **Models.** The upstream prompts request `sonnet` for synthesis and `haiku` for
26
34
  critique. Those are Claude model names — on another host, substitute the host's
27
35
  capable/cheap pair (a strong model for synthesis, a fast one for scoring).
28
36
  4. **Prompt templates.** Steps 4 and 5 read the `synthesizer-prompt.md` and
29
- `critic-prompt.md` files **in this skill's own folder** (`skills/daydream/` in a
30
- deployed Geneseed bundle). They ship with the skill — nothing to install.
37
+ `critic-prompt.md` files **in this skill's own folder** (`<this-skill-directory>/`). They ship with the skill — nothing to install.
31
38
  5. **Writable output folders.** The run writes `Daydreams/`, `Daydreams/digests/`,
32
39
  `Daily/`, and `ai-research/daydream/history.json` into the vault. If any of those
33
40
  sit under a `protected` path in `wiki.jsonc`, the guard plugin will block the write —
@@ -23,5 +23,13 @@ subagents over recency-weighted note pairs. The model-name references (`sonnet`,
23
23
  non-Claude host, read the sibling `synthesizer-prompt.md` / `critic-prompt.md`
24
24
  directly and dispatch through whatever subagent mechanism the host provides.
25
25
 
26
- To update, re-copy the upstream folder, re-apply the wiki.jsonc adaptation in
27
- `SKILL.md` / `instructions.md`, and bump the commit above.
26
+ `SKILL.md` also carries a `name`/`description` frontmatter that upstream lacks — without it
27
+ a host that registers skills from frontmatter (the Agent Skills format: Claude Code, Bob, …)
28
+ never lists the skill — and points the agent at `instructions.md`, which upstream leaves to
29
+ its slash command. Sibling files are named through the this-skill-directory placeholder (see
30
+ `SKILL_DIR_PLACEHOLDER` in `js/hosts/native.mjs`), which the emit resolves for a host that
31
+ does not tell the model where a skill lives.
32
+
33
+ To update, re-copy the upstream folder, re-apply the wiki.jsonc adaptation, the
34
+ frontmatter and the placeholder paths in `SKILL.md` / `instructions.md`, and
35
+ bump the commit above.
@@ -152,7 +152,7 @@ Store the pairs array. Each pair has:
152
152
  ## Step 4: Synthesize Connections (Parallel Task Agents)
153
153
 
154
154
  ### 4a. Read synthesizer prompt
155
- Read `synthesizer-prompt.md` from this skill's own folder to get the prompt template (in a deployed Geneseed bundle that is `skills/daydream/synthesizer-prompt.md`; an upstream Claude install uses `.claude/skills/daydream/synthesizer-prompt.md`).
155
+ Read `synthesizer-prompt.md` from this skill's own folder to get the prompt template (`<this-skill-directory>/synthesizer-prompt.md`; an upstream Claude install uses `.claude/skills/daydream/synthesizer-prompt.md`).
156
156
 
157
157
  ### 4b. Batch pairs
158
158
  Split the pairs into batches of 5. This yields up to 10 batches.
@@ -212,7 +212,7 @@ If a Task agent returns malformed JSON, skip that batch and note the error. Do n
212
212
  ## Step 5: Critique and Score (Parallel Task Agents)
213
213
 
214
214
  ### 5a. Read critic prompt
215
- Read `critic-prompt.md` from this skill's own folder to get the prompt template (in a deployed Geneseed bundle that is `skills/daydream/critic-prompt.md`; an upstream Claude install uses `.claude/skills/daydream/critic-prompt.md`).
215
+ Read `critic-prompt.md` from this skill's own folder to get the prompt template (`<this-skill-directory>/critic-prompt.md`; an upstream Claude install uses `.claude/skills/daydream/critic-prompt.md`).
216
216
 
217
217
  ### 5b. Batch synthesis results
218
218
  Split synthesis results into batches of 5 (same pattern as Step 4).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: explain-changes
3
- description: "Explain a change visually before it is committed: renders one offline HTML page — the intent, the risks to check first, a walkthrough by logical unit, and the exact git diff side by side — and opens it. Use when the user asks to explain, walk through, show, visualise or review the changes ('what did you change?', 'show me the diff'), before asking consent to commit a non-trivial change (offer it, never impose it), or to explain a whole branch or PR."
3
+ description: "Renders one offline HTML page explaining a change — intent, risks, walkthrough, side-by-side git diff — and opens it. Use when the user asks to explain, show or review the changes ('what did you change?', 'show me the diff'), for a branch or PR, or offer it (never impose) before asking to commit a non-trivial change."
4
4
  ---
5
5
 
6
6
  # explain-changes
@@ -5,7 +5,7 @@ the vendored-folder mechanism because it bundles an executable
5
5
  (`scripts/render_changes.mjs`) and Geneseed's flat-skill pipeline renders single
6
6
  `.md` files only. Listing it in the generator's `VENDORED_SKILL_DIRS` makes the
7
7
  whole folder ride along verbatim into every host emit — Claude Code, IBM Bob,
8
- OpenCode, GitHub Copilot, OpenClaude.
8
+ OpenCode, OpenClaude.
9
9
 
10
10
  - **Upstream:** this repository (first-party)
11
11
  - **License:** same as Geneseed (see repository LICENSE)
@@ -5,7 +5,7 @@
5
5
  **Trigger:** the user mentions Geneseed, the harness, or `AGENT.md`; asks how the install is set up; asks to change its theme, footprint, posture, mode, doctrine packs or excluded rules — or you need to know what {{LAWS}}, {{AGENTS}}, or {{SKILLS}} this install carries.
6
6
 
7
7
  ## Procedure
8
- 1. **Locate.** Run `geneseed status --json` first: `installs` lists every install on this machine — host, scope, root, state, theme, footprint, posture, mode, packs, excluded rules — and `rebuild`, the command that reproduces each one exactly. `geneseed` not on PATH → ask the user before using `npx geneseed` (it downloads the package), and prefix every command below the same way. Still nothing → look for a host root file: `~/.config/opencode/AGENT.md` or `.opencode/AGENT.md` (OpenCode), `~/.claude/CLAUDE.md` or `.claude/` (Claude Code), `.openclaude/` (OpenClaude), `AGENTS.md` beside `.bob/` or `.github/` (Bob, Copilot). None → say so; never install to "fix" it.
8
+ 1. **Locate.** Run `geneseed status --json` first: `installs` lists every install on this machine — host, scope, root, state, theme, footprint, posture, mode, packs, excluded rules — and `rebuild`, the command that reproduces each one exactly. `geneseed` not on PATH → ask the user before using `npx geneseed` (it downloads the package), and prefix every command below the same way. Still nothing → look for a host root file: `~/.config/opencode/AGENT.md` or `.opencode/AGENT.md` (OpenCode), `~/.claude/CLAUDE.md` or `.claude/` (Claude Code), `.openclaude/` (OpenClaude), `AGENTS.md` beside `.bob/` (Bob). None → say so; never install to "fix" it.
9
9
  2. **Read state** with the read-only verbs, cheapest first ({{DOCTRINE:context-economy}}): `geneseed status --json`, `geneseed version`, `geneseed catalog` (optionally `agents|skills|laws|ontology|doctrines`), `geneseed doctor`, `geneseed diff`, `geneseed mcp`, `geneseed memory list`, `geneseed exclude list`.
10
10
  3. **Read a piece** from disk, not from recall ({{LAW:verify-before-asserting}}): `<root>/agents/<name>.md`, `<root>/skills/<name>/SKILL.md`, `<root>/memory/`, `<root>/notebook/`. The {{ONTOLOGY}}, the {{LAWS}} and the active {{DOCTRINES}} are numbered `## N. …` sections of the install's root file.
11
11
  4. **Change an install only when the user asked for that change** ({{LAW:one-intent-one-act}}). Take that install's `rebuild` command from step 1, edit only the flag the user named (add it if the command omits it — `--posture` and `--mode` are left out at their defaults) — `--theme`, `--footprint lean|full`, `--posture`, `--mode direct|foreman`, `--doctrines craft,rigor|none`, `--exclude-rules "process 7"|none` — dry-run it first by running the same flags through `geneseed validate`, show the command, and run it once the user agrees. Never rebuild from a bare `geneseed build`: every omitted flag resets that setting to the generator default. Confirm with `geneseed status`.
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: vercel-react-view-transitions
2
+ name: react-view-transitions
3
3
  description: Guide for implementing smooth, native-feeling animations using React's View Transition API (`<ViewTransition>` component, `addTransitionType`, and CSS view transition pseudo-elements). Use this skill whenever the user wants to add page transitions, animate route changes, create shared element animations, animate enter/exit of components, animate list reorder, implement directional (forward/back) navigation animations, or integrate view transitions in Next.js. Also use when the user mentions view transitions, `startViewTransition`, `ViewTransition`, transition types, or asks about animating between UI states in React without third-party animation libraries.
4
4
  license: MIT
5
5
  metadata:
@@ -1,6 +1,6 @@
1
1
  # Vendored skill — react-view-transitions
2
2
 
3
- This folder is a third-party skill vendored **verbatim** into Geneseed, not a
3
+ This folder is a third-party skill vendored **verbatim** (one line aside, below) into Geneseed, not a
4
4
  Geneseed-authored skill. It rides along in the rendered bundle and is exempt from
5
5
  Geneseed's authoring gates (token, dead-link, hermeticity, skill counts) — it is
6
6
  listed in the generator's `VENDORED_SKILL_DIRS`.
@@ -15,7 +15,12 @@ listed in the generator's `VENDORED_SKILL_DIRS`.
15
15
  The skill follows the [Agent Skills](https://agentskills.io/) format (`SKILL.md` +
16
16
  `references/`). Its internal links point at the upstream project's own files; do not
17
17
  "fix" them to Geneseed paths — that is why the folder is gate-exempt. To update,
18
- re-copy the upstream folder and bump the commit above.
18
+ re-copy the upstream folder, re-apply the one deviation below, and bump the commit above.
19
+
20
+ **The one deviation:** upstream's frontmatter says `name: vercel-react-view-transitions`;
21
+ here it is `name: react-view-transitions`. The Agent Skills format requires the name to
22
+ match the skill's folder, and a strict host skips a skill that breaks it —
23
+ renaming the folder instead would rename the installed skill on every host.
19
24
 
20
25
  **Deliberately not copied:** upstream's `README.md` (the repo-facing readme: install
21
26
  command and folder tree, nothing an agent reads). `AGENTS.md`, upstream's compiled
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: token-report
3
- description: "Generate a token usage report for the current session — a markdown table breakdown of context window usage: the session-start baseline (harness, system prompt, tools, skills), everything processed since (user messages, replies, thinking, tool calls and results per tool), exact recorded totals, and the heaviest single items. Use this whenever the user asks about token usage, context usage, context window size, session cost in tokens, 'how full is the context', 'what is eating my context', a usage breakdown or usage report — even if they don't say the word 'token'."
3
+ description: "Session token usage report — markdown tables of the context window: start-up baseline (harness, tools, skills), growth since, per-tool attribution, heaviest items. Use when the user asks about token or context usage, size or cost, 'how full is the context', 'what is eating my context' — even without the word 'token'."
4
4
  ---
5
5
 
6
6
  # Token usage report
@@ -29,9 +29,8 @@ picking the most recently active source:
29
29
  | IBM Bob | `~/.bob/projects/<slug>/*.jsonl` (Claude-shaped, `$BOB_CONFIG_DIR` honoured) | exact usage per request |
30
30
  | OpenCode | `~/.local/share/opencode/opencode.db` (SQLite, v1.2+; pre-1.2 falls back to `storage/` JSON files) | exact `tokens` per request; child sessions attributed as subagents |
31
31
  | OpenClaude | `~/.openclaude/projects/<slug>/*.jsonl` (Claude-shaped, `$OPENCLAUDE_CONFIG_DIR` honoured) | exact usage per request |
32
- | GitHub Copilot | `~/.copilot/history-session-state/` | best effort — undocumented schema; token-like fields harvested, else estimates only |
33
32
 
34
- Useful flags: `--host claude|bob|openclaude|opencode|copilot` to force a host,
33
+ Useful flags: `--host claude|bob|openclaude|opencode` to force a host,
35
34
  `--transcript <path>` / `--session <id>` for a specific session,
36
35
  `--limit <tokens>` for the context-window limit used in the % columns
37
36
  (default 200000), `--top <n>` for the heaviest-items list.
@@ -5,7 +5,7 @@ not third-party. It rides the vendored-folder mechanism because it bundles an
5
5
  executable (`scripts/token_report.mjs`) and Geneseed's flat-skill pipeline renders
6
6
  single `.md` files only. Listing it in the generator's `VENDORED_SKILL_DIRS`
7
7
  makes the whole folder ride along verbatim into every host emit — Claude Code,
8
- IBM Bob, OpenCode, GitHub Copilot, OpenClaude — which is exactly what a multi-file skill needs.
8
+ IBM Bob, OpenCode, OpenClaude — which is exactly what a multi-file skill needs.
9
9
 
10
10
  - **Upstream:** this repository (first-party)
11
11
  - **License:** same as Geneseed (see repository LICENSE)
@@ -17,7 +17,6 @@ Consequences of riding this mechanism (deliberate):
17
17
  `description` and blockquote purpose line instead;
18
18
  - listed in AGENT.md's folder-skills section, not the main skills table.
19
19
 
20
- The script supports all five emitted hosts (exact usage on Claude Code, Bob,
21
- OpenClaude and OpenCode; best-effort on Copilot, whose session-state schema is undocumented).
20
+ The script supports all four emitted hosts, with exact usage on each.
22
21
  If a host changes its session storage layout, fix the corresponding finder or
23
22
  parser in `scripts/token_report.mjs`.