geneseed 3.5.0 → 3.7.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 +82 -0
- package/DESIGN.md +6 -6
- package/QUICKSTART.md +1 -1
- package/README.md +32 -30
- package/SETUP.md +34 -8
- package/SHIPPED.md +3 -3
- package/adapters/claude-code/skills/geneseed/SKILL.md +1 -1
- package/adapters/openclaude/README.md +64 -0
- package/adapters/opencode/plugins/geneseed-workflow.js +1 -1
- package/adapters/opencode/workflows/_runtime.js +1 -1
- package/docs/extending.md +22 -6
- package/docs/web/exclusions.md +1 -0
- package/docs/web/footprint.md +1 -1
- package/docs/web/harnesses.md +14 -14
- package/docs/web/install-quick.md +1 -1
- package/docs/web/rules.md +1 -1
- package/docs/web/themes-author.md +1 -1
- package/docs/web-ui.md +1 -1
- package/harness.config.json +1 -1
- package/js/README.md +3 -3
- package/js/build/driver.mjs +50 -9
- package/js/build/emit-claude.mjs +1 -1
- package/js/build/generate.mjs +2 -1
- package/js/build/source.mjs +5 -4
- package/js/hosts/hooks.mjs +11 -4
- package/js/hosts/hosts.mjs +17 -2
- package/js/hosts/installs.mjs +32 -2
- package/js/hosts/mcp.mjs +8 -1
- package/js/hosts/settings.mjs +4 -1
- package/js/inspect/diff.mjs +1 -1
- package/js/inspect/doctor.mjs +3 -3
- package/js/inspect/excludes.mjs +7 -5
- package/js/inspect/status.mjs +4 -4
- package/js/maintain/migrate.mjs +1 -1
- package/js/maintain/setup.mjs +7 -2
- package/js/maintain/uninstall.mjs +3 -3
- package/js/web/actions.mjs +7 -5
- package/js/web/api.mjs +2 -2
- package/js/web/docs.mjs +1 -1
- package/package.json +2 -1
- package/src/AGENT.md.tmpl +8 -5
- package/src/doctrines/README.md +3 -2
- package/src/doctrines/comms.md +53 -0
- package/src/doctrines/process.md +0 -26
- package/src/skills/debug.md +1 -1
- package/src/skills/document-project.md +127 -25
- package/src/skills/parallel-agents.md +1 -1
- package/src/skills/pipeline.md +1 -1
- package/src/skills/token-report/SKILL.md +2 -1
- package/src/skills/token-report/VENDOR.md +3 -3
- package/src/skills/token-report/scripts/token_report.mjs +14 -7
- package/src/skills/workflow.md +2 -2
- package/themes/_TEMPLATE.json +5 -3
- package/themes/biker.json +5 -3
- package/themes/commentator.json +5 -3
- package/themes/cyberpunk.json +5 -3
- package/themes/gamer.json +5 -3
- package/themes/imperial.json +5 -3
- package/themes/joker.json +5 -3
- package/themes/marvin.json +5 -3
- package/themes/mean.json +5 -3
- package/themes/military.json +5 -3
- package/themes/neutral.json +5 -3
- package/themes/pirate.json +5 -3
- package/themes/sports.json +5 -3
- package/themes/verstappen.json +5 -3
- package/themes/wizard.json +5 -3
- package/web/dist/assets/{Activity-Flgf4kHy.js → Activity-CH-7cPIM.js} +1 -1
- package/web/dist/assets/{ActivityDetail-DIpr85nh.js → ActivityDetail-DZvz0xS5.js} +1 -1
- package/web/dist/assets/{CatalogRow-CjyLjaLb.js → CatalogRow-DftXpZHY.js} +1 -1
- package/web/dist/assets/{Diff-Deisdha8.js → Diff-DvwdG0L9.js} +1 -1
- package/web/dist/assets/{Docs-DGUdY4l4.js → Docs-DrJNDPwI.js} +1 -1
- package/web/dist/assets/{Doctor-F74lJ69P.js → Doctor-OTmwmYZg.js} +1 -1
- package/web/dist/assets/{GreenhouseView-D072lBiD.js → GreenhouseView-XxrAdriX.js} +1 -1
- package/web/dist/assets/Harness-C_LYNk5c.js +1 -0
- package/web/dist/assets/{JournalView-DWFqZ0Iw.js → JournalView-BcuyeEaR.js} +1 -1
- package/web/dist/assets/{Laws-BN6g3HU7.js → Laws-CWHrTKY4.js} +1 -1
- package/web/dist/assets/{Library-CDOv4emM.js → Library-CA9IHghn.js} +1 -1
- package/web/dist/assets/{OperatorHudView-CwNIUVX8.js → OperatorHudView-BMRY1Tt4.js} +1 -1
- package/web/dist/assets/{Profile-CpP9BTne.js → Profile-wceET1JY.js} +1 -1
- package/web/dist/assets/{Rules-DFXsUCB7.js → Rules-BEXvY4Tx.js} +1 -1
- package/web/dist/assets/{Settings-BqZVUtJ5.js → Settings-DS2zF0Ez.js} +1 -1
- package/web/dist/assets/{Skills-Cu6kBgfF.js → Skills-DahlOJuI.js} +1 -1
- package/web/dist/assets/{drawable-BgfrEBer.js → drawable-BTHjTzF7.js} +1 -1
- package/web/dist/assets/{index-CAqrWhKl.js → index-AN5Emnrg.js} +2 -2
- package/web/dist/assets/{lawCats-BLgxl151.js → lawCats-Btjp3Hk_.js} +1 -1
- package/web/dist/index.html +1 -1
- package/web/src/pages/Laws.jsx +6 -2
- package/web/dist/assets/Harness-DNRP2Va7.js +0 -1
package/js/maintain/setup.mjs
CHANGED
|
@@ -228,6 +228,7 @@ const DOCTRINE_BLURBS = {
|
|
|
228
228
|
ops: 'how the machine is driven — tool discovery, non-blocking commands, teardown',
|
|
229
229
|
process: 'how a session runs — planning, context economy, docs first, and the consent gate '
|
|
230
230
|
+ 'on every commit and push (drop this pack and that gate goes with it)',
|
|
231
|
+
comms: 'how answers are presented — stable reference codes, a diagram or a table only where it earns its place',
|
|
231
232
|
};
|
|
232
233
|
|
|
233
234
|
/**
|
|
@@ -279,7 +280,7 @@ export function doctrineOptions() {
|
|
|
279
280
|
/**
|
|
280
281
|
* `_harness_setup.EMIT_OPTIONS`.
|
|
281
282
|
*
|
|
282
|
-
* Exported since P6b: `/api/themes` returns the same
|
|
283
|
+
* Exported since P6b: `/api/themes` returns the same eleven as its `emits` list, and a copy
|
|
283
284
|
* of a table under test silently stops being the table under test.
|
|
284
285
|
*/
|
|
285
286
|
export const EMIT_OPTIONS = [
|
|
@@ -292,6 +293,10 @@ export const EMIT_OPTIONS = [
|
|
|
292
293
|
['copilot-global', 'GitHub Copilot personal config dir (~/.copilot) — copilot-instructions.md, agents, skills.'],
|
|
293
294
|
['copilot', 'Per-repo AGENTS.md + .github/ for GitHub Copilot, committed into one repository.'],
|
|
294
295
|
['files', 'Plain bundle for any AGENT.md tool.'],
|
|
296
|
+
// Appended AFTER `files`, not beside the other hosts: the menu is answered by number, and a
|
|
297
|
+
// scripted `setup` that pipes its answers must keep meaning what it meant.
|
|
298
|
+
['openclaude-global', 'OpenClaude global config dir (~/.openclaude) — CLAUDE.md, agents, skills, hooks.'],
|
|
299
|
+
['openclaude', 'Per-repo .openclaude/ (CLAUDE.md, agents, skills, hooks) for OpenClaude, committed into one repository.'],
|
|
295
300
|
];
|
|
296
301
|
|
|
297
302
|
/** `_harness_setup.FOOTPRINT_OPTIONS`. */
|
|
@@ -375,7 +380,7 @@ export function collectSetupLines() {
|
|
|
375
380
|
// Every PROJECT emit needs the repo root — claude/bob/copilot included: without `--out`
|
|
376
381
|
// their CLAUDE.md/.claude land in the generator's default ./Harness, where the host never
|
|
377
382
|
// looks.
|
|
378
|
-
if (['opencode', 'claude', 'bob', 'copilot'].includes(emit)) {
|
|
383
|
+
if (['opencode', 'claude', 'bob', 'copilot', 'openclaude'].includes(emit)) {
|
|
379
384
|
root = ask('Repo root to install into', '.');
|
|
380
385
|
out = root;
|
|
381
386
|
} else if (emit === 'files') {
|
|
@@ -71,7 +71,7 @@ import { comparePaths, isAbsolutePath, within } from '../lib/paths.mjs';
|
|
|
71
71
|
const hostSpec = (host) => HOSTS.find((h) => h.host === host);
|
|
72
72
|
|
|
73
73
|
/** The Claude-STYLE hosts — one manifest shape, one reversal. Spelled once. */
|
|
74
|
-
const CLAUDE_STYLE = ['claude', 'bob', 'copilot'];
|
|
74
|
+
const CLAUDE_STYLE = ['claude', 'bob', 'copilot', 'openclaude'];
|
|
75
75
|
|
|
76
76
|
/**
|
|
77
77
|
* `shutil.rmtree(p, ignore_errors=True)`.
|
|
@@ -681,7 +681,7 @@ export function cmdUninstall(args) {
|
|
|
681
681
|
const targetDesc = resolvePath(expanduser(args.target));
|
|
682
682
|
printErr(`[uninstall] no Geneseed install detected at ${targetDesc}.\n`
|
|
683
683
|
+ '[uninstall] pass --target <repo> for a project install (.opencode/.claude/'
|
|
684
|
-
+ '.bob/.github) or --target <config dir> for a global one.\n');
|
|
684
|
+
+ '.bob/.github/.openclaude) or --target <config dir> for a global one.\n');
|
|
685
685
|
return 1;
|
|
686
686
|
}
|
|
687
687
|
const [host, scope, root] = hit;
|
|
@@ -700,7 +700,7 @@ export function cmdUninstall(args) {
|
|
|
700
700
|
+ `${hostSpec(host).agentFile} managed block, and Geneseed's `
|
|
701
701
|
+ '~/.copilot/settings.json hooks on a global install (your own keys/hooks and '
|
|
702
702
|
+ '.github files are kept).\n');
|
|
703
|
-
} else if (
|
|
703
|
+
} else if (['claude', 'bob', 'openclaude'].includes(host)) {
|
|
704
704
|
printOut('[uninstall] removes: agents/, skills/, markers, the '
|
|
705
705
|
+ `${hostSpec(host).agentFile} managed block, and Geneseed's `
|
|
706
706
|
+ 'settings.json hooks/excludes (your own keys/hooks are kept).\n');
|
package/js/web/actions.mjs
CHANGED
|
@@ -41,8 +41,8 @@ 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,
|
|
45
|
-
resolvePath,
|
|
44
|
+
HOSTS, bobConfigDir, claudeConfigDir, copilotConfigDir, expanduser, openclaudeConfigDir,
|
|
45
|
+
opencodeConfigDir, resolvePath,
|
|
46
46
|
} from '../hosts/hosts.mjs';
|
|
47
47
|
import {
|
|
48
48
|
EMIT_HOST_SCOPE, doctrinesForBuild, excludedRulesOfDir, footprintOfDir, installState,
|
|
@@ -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'].includes(host)) {
|
|
647
|
+
if (['claude', 'bob', 'copilot', 'openclaude'].includes(host)) {
|
|
648
648
|
if (isFile(p)) {
|
|
649
649
|
let parsed;
|
|
650
650
|
try {
|
|
@@ -817,6 +817,7 @@ const EMIT_FOR = new Map([
|
|
|
817
817
|
['claude global', 'claude-global'], ['claude project', 'claude'],
|
|
818
818
|
['bob global', 'bob-global'], ['bob project', 'bob'],
|
|
819
819
|
['copilot global', 'copilot-global'], ['copilot project', 'copilot'],
|
|
820
|
+
['openclaude global', 'openclaude-global'], ['openclaude project', 'openclaude'],
|
|
820
821
|
]);
|
|
821
822
|
|
|
822
823
|
/**
|
|
@@ -951,7 +952,8 @@ export function apiDeployCmd(state, body) {
|
|
|
951
952
|
return { error: `folder not writable: ${root}` };
|
|
952
953
|
}
|
|
953
954
|
const cfgdirs = new Set();
|
|
954
|
-
for (const fn of [opencodeConfigDir, claudeConfigDir, bobConfigDir, copilotConfigDir
|
|
955
|
+
for (const fn of [opencodeConfigDir, claudeConfigDir, bobConfigDir, copilotConfigDir,
|
|
956
|
+
openclaudeConfigDir]) {
|
|
955
957
|
try {
|
|
956
958
|
cfgdirs.add(resolvePath(fn()));
|
|
957
959
|
} catch { /* not every host has a resolvable config dir; skip it */ }
|
|
@@ -976,7 +978,7 @@ export function apiDeployCmd(state, body) {
|
|
|
976
978
|
// and `PreToolUse::Bash` went with them. `doctrinesForBuild` resolves unknown to ALL packs.
|
|
977
979
|
const doctrines = bodyDoctrines(body) ?? doctrinesForBuild(root);
|
|
978
980
|
const excludeRules = bodyExcludeRules(body) ?? excludedRulesOfDir(root);
|
|
979
|
-
// project-scope emit name == host name (opencode / claude / bob / copilot)
|
|
981
|
+
// project-scope emit name == host name (opencode / claude / bob / copilot / openclaude)
|
|
980
982
|
const argv = setupBuildArgs(theme || 'neutral', host, root, root, fp, pos, mode, doctrines,
|
|
981
983
|
PACK_ORDER, excludeRules);
|
|
982
984
|
return { cmd: [process.execPath, path.join(ROOT, 'bin', 'build-driver.mjs'), ...argv] };
|
package/js/web/api.mjs
CHANGED
|
@@ -724,7 +724,7 @@ export const apiExcludes = () => excludesSnapshot();
|
|
|
724
724
|
* nested-marker host cannot silently read the bare root.
|
|
725
725
|
*/
|
|
726
726
|
export function viewCfg(host, scope, root) {
|
|
727
|
-
if (scope === 'project' && ['claude', 'bob', 'copilot'].includes(host)) {
|
|
727
|
+
if (scope === 'project' && ['claude', 'bob', 'copilot', 'openclaude'].includes(host)) {
|
|
728
728
|
return path.join(root, HOSTS.find((h) => h.host === host).projectMarker);
|
|
729
729
|
}
|
|
730
730
|
return root;
|
|
@@ -790,7 +790,7 @@ export function apiOverview(state) {
|
|
|
790
790
|
// can re-emit exactly it. Mirrors `viewCfg`'s rule, spelled out separately here.
|
|
791
791
|
let install = null;
|
|
792
792
|
for (const [host, scope, root] of installTargets()) {
|
|
793
|
-
const data = (scope === 'project' && ['claude', 'bob', 'copilot'].includes(host))
|
|
793
|
+
const data = (scope === 'project' && ['claude', 'bob', 'copilot', 'openclaude'].includes(host))
|
|
794
794
|
? path.join(root, HOSTS.find((h) => h.host === host).projectMarker) : root;
|
|
795
795
|
try {
|
|
796
796
|
if (samePath(data, state.target)) {
|
package/js/web/docs.mjs
CHANGED
|
@@ -207,7 +207,7 @@ const HARNESS_HINT_RE = /<!--\s*harness:/;
|
|
|
207
207
|
export function normHarness(value, state) {
|
|
208
208
|
const v = (value || '').trim().toLowerCase();
|
|
209
209
|
if (HARNESSES.includes(v)) return v;
|
|
210
|
-
return String(state.emit || '')
|
|
210
|
+
return /^(claude|openclaude)/.test(String(state.emit || '')) ? 'claude' : 'opencode';
|
|
211
211
|
}
|
|
212
212
|
|
|
213
213
|
/**
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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.
|
|
4
|
+
"version": "3.7.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",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"claude-code",
|
|
10
10
|
"opencode",
|
|
11
11
|
"copilot",
|
|
12
|
+
"openclaude",
|
|
12
13
|
"agents-md",
|
|
13
14
|
"skills",
|
|
14
15
|
"harness",
|
package/src/AGENT.md.tmpl
CHANGED
|
@@ -30,11 +30,14 @@ ritual: read this file and its {{LAWS}}, then **load the project context** — i
|
|
|
30
30
|
(§9). Only then emit your first reply, which MUST begin with the
|
|
31
31
|
exact line below, before any other text. Do not paraphrase it and do not skip it —
|
|
32
32
|
a first reply that omits the sigil signals the harness was not read, and emitting
|
|
33
|
-
it certifies you have loaded the {{LAWS}} *and* the project context.
|
|
33
|
+
it certifies you have loaded the {{LAWS}} *and* the project context. **{{SKILLS}}
|
|
34
|
+
first:** when a request matches a {{SKILL}}, invoke it as your first tool
|
|
35
|
+
call — before loading context or touching files.
|
|
34
36
|
<!-- LEAN:else -->
|
|
35
|
-
**Readiness sigil — required.**
|
|
36
|
-
{{LAWS}}
|
|
37
|
-
|
|
37
|
+
**Readiness sigil — required.** Your first reply MUST begin with the exact line below,
|
|
38
|
+
verbatim — it certifies you have read this file and its {{LAWS}} and loaded `context.json`
|
|
39
|
+
and its `eager` entries (§9). **{{SKILLS}} first:** when the request matches a {{SKILL}}, invoke
|
|
40
|
+
it as your very first tool call — before loading context, reading files, or searching.
|
|
38
41
|
<!-- LEAN:end -->
|
|
39
42
|
|
|
40
43
|
> {{LOADED_SIGIL}}
|
|
@@ -206,7 +209,7 @@ subset that productively clashes on a given motion.
|
|
|
206
209
|
| [debug]({{DIR_SKILLS}}/debug.md) | a bug or failure to diagnose before fixing |
|
|
207
210
|
| [prototype]({{DIR_SKILLS}}/prototype.md) | a design question needs a runnable answer before real implementation |
|
|
208
211
|
| [repo-map]({{DIR_SKILLS}}/repo-map.md) | orienting to the repo, or structure changed |
|
|
209
|
-
| [document-project]({{DIR_SKILLS}}/document-project.md) |
|
|
212
|
+
| [document-project]({{DIR_SKILLS}}/document-project.md) | missing/drifted docs, or a PRD, design system, architecture doc or AGENTS.md |
|
|
210
213
|
| [ingest]({{DIR_SKILLS}}/ingest.md) | a task needs content from a PDF, Office doc, or URL |
|
|
211
214
|
| [research]({{DIR_SKILLS}}/research.md) | a question needs answers gathered and verified from the open web |
|
|
212
215
|
| [teach]({{DIR_SKILLS}}/teach.md) | the user wants to be taught — a crash course, confusing material decoded, or a day-by-day path to a deadline |
|
package/src/doctrines/README.md
CHANGED
|
@@ -8,7 +8,7 @@ documentation repo and a production service do not need the same practices.
|
|
|
8
8
|
The selected packs are inlined into `AGENT.md`'s Doctrines section at build time;
|
|
9
9
|
every pack ships here as a catalogue so you can read the alternatives and switch.
|
|
10
10
|
Change the active set by rebuilding with `--doctrines <list>` (or via the setup
|
|
11
|
-
wizard); the choice is stored in `harness.config.json`. All
|
|
11
|
+
wizard); the choice is stored in `harness.config.json`. All five are active by
|
|
12
12
|
default.
|
|
13
13
|
|
|
14
14
|
A pack is **orthogonal to theme and posture**: the theme sets the *voice*, the
|
|
@@ -21,9 +21,10 @@ composes.
|
|
|
21
21
|
| [rigor](rigor.md) | How work is proven — idempotence, honest tests, coverage, gates that can fail. |
|
|
22
22
|
| [ops](ops.md) | How the machine is operated — tool discovery, non-blocking commands, source-layer edits, teardown. |
|
|
23
23
|
| [process](process.md) | How a task is run — planning, context economy, docs-first, consent before push. |
|
|
24
|
+
| [comms](comms.md) | How answers are presented — stable reference codes, a diagram or a table only where it earns its place. |
|
|
24
25
|
|
|
25
26
|
A rule in one pack may cite a rule in another. That is safe because the **full
|
|
26
|
-
catalogue ships in every bundle** — all
|
|
27
|
+
catalogue ships in every bundle** — all five pack files are installed whether or not
|
|
27
28
|
their pack is built into `AGENT.md` — so a cross-pack reference is always readable
|
|
28
29
|
even when the pack it names is not active.
|
|
29
30
|
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
**{{PACK_COMMS}}** — how answers are presented.
|
|
2
|
+
|
|
3
|
+
### {{DOCTRINE}} comms 1 — {{DOC_COMMS_1}}
|
|
4
|
+
<!-- LEAN:begin -->
|
|
5
|
+
Give every tracked item a short reference code and keep it unchanged for the rest of
|
|
6
|
+
the session — `D` decisions, `O` options, `F` findings, `R` risks, `Q` questions,
|
|
7
|
+
`A` actions. The trigger is countable: any reply naming two or more such items takes
|
|
8
|
+
codes, a {{SKILL}}'s or an {{AGENT}}'s report included, whatever layout its template
|
|
9
|
+
shows; a reply with one item or none takes none. The code opens the item's line —
|
|
10
|
+
`**F1** — the token is logged in plain text`, `**Q2** — keep the v1 route?` — not a
|
|
11
|
+
bare `1.` or a bullet. Number from one within each kind, keep counting across turns
|
|
12
|
+
(the next finding after `F3` is `F4`, even three replies later), invent a new letter
|
|
13
|
+
for a kind the list omits, and never renumber a code once issued — the user will cite
|
|
14
|
+
it back, and a moved code makes their reply mean something you did not say. A code is an address, not an ornament:
|
|
15
|
+
it lets a long exchange be answered by reference, and a decision taken on turn
|
|
16
|
+
three still be named on turn thirty. Where the {{ONTOLOGY}}'s {{ONT_CONDUCT}}
|
|
17
|
+
governs how an answer speaks, this is only the addressing convention — a practice
|
|
18
|
+
a repository adopts or drops like any other rule in these {{DOCTRINES}}.
|
|
19
|
+
<!-- LEAN:else -->
|
|
20
|
+
Give every tracked item a short reference code, unchanged for the session —
|
|
21
|
+
`D` decisions, `O` options, `F` findings, `R` risks, `Q` questions, `A` actions.
|
|
22
|
+
Any reply naming two or more such items takes codes, a {{SKILL}}'s or {{AGENT}}'s
|
|
23
|
+
report included; one item or none takes none. The code opens the line, never a bare
|
|
24
|
+
`1.` or bullet: `**F1** — token logged in plain text`, `**Q2** — keep the v1 route?`
|
|
25
|
+
Number from one within each kind and keep counting across turns (after `F3` comes
|
|
26
|
+
`F4`), invent letters for missing kinds, never renumber a code once issued.
|
|
27
|
+
<!-- LEAN:end -->
|
|
28
|
+
|
|
29
|
+
### {{DOCTRINE}} comms 2 — {{DOC_COMMS_2}}
|
|
30
|
+
<!-- LEAN:begin -->
|
|
31
|
+
Prose and structure are distinct: beside the prose, pick **either** a diagram **or** a
|
|
32
|
+
table — whichever the matter needs, rarely both — and let the prose keep the context, the
|
|
33
|
+
why, the pitfall and the decision. Draw a boxes-and-arrows diagram only when its arrows
|
|
34
|
+
carry meaning: links to follow (a flow, a sequence, dependencies, a causal chain, a
|
|
35
|
+
topology), a visual or spatial subject, four or more interlinked elements, or when the
|
|
36
|
+
user asks. The test: erase the arrows — if nothing is lost, it was never a diagram.
|
|
37
|
+
Classifications, inventories and attribute comparisons take a table or a list; a chain of
|
|
38
|
+
three steps or fewer stays inline (`A -> B -> C`); a trivial fact stays plain text. A small
|
|
39
|
+
diagram replaces prose only where the prose would run long describing a structure. The
|
|
40
|
+
medium follows the surface: ASCII diagrams and tables in a terminal, Mermaid in markdown
|
|
41
|
+
that renders it; for a situation too dense for ASCII, offer a richer rendered page in one
|
|
42
|
+
line, never build one unasked. This is strictly additive to {{DOCTRINE}} comms 1: tracked
|
|
43
|
+
items keep their codes, one coded line each, and a diagram or table may carry a code as a
|
|
44
|
+
tag but never absorbs, merges or renumbers an item.
|
|
45
|
+
<!-- LEAN:else -->
|
|
46
|
+
Prose and structure are distinct: beside the prose, pick a diagram or a table, rarely
|
|
47
|
+
both; prose keeps the why and the decision. Draw a diagram only when its arrows carry
|
|
48
|
+
meaning — flow, dependencies, topology, a spatial subject, four or more linked elements,
|
|
49
|
+
or on request; if erasing them loses nothing, use a table or list. Three steps or fewer
|
|
50
|
+
stay inline (`A -> B -> C`). ASCII in a terminal, Mermaid where markdown renders; offer a
|
|
51
|
+
rendered page in one line, never unasked. Codes stay ({{DOCTRINE}} comms 1): a diagram
|
|
52
|
+
may tag an item, never absorb or renumber it.
|
|
53
|
+
<!-- LEAN:end -->
|
package/src/doctrines/process.md
CHANGED
|
@@ -130,32 +130,6 @@ stalls, halt with a structured summary of what was tried, learned, and remains (
|
|
|
130
130
|
|
|
131
131
|
### {{DOCTRINE}} process 7 — {{DOC_PROCESS_7}}
|
|
132
132
|
<!-- LEAN:begin -->
|
|
133
|
-
Give every tracked item a short reference code and keep it unchanged for the rest of
|
|
134
|
-
the session — `D` decisions, `O` options, `F` findings, `R` risks, `Q` questions,
|
|
135
|
-
`A` actions. The trigger is countable: any reply naming two or more such items takes
|
|
136
|
-
codes, a {{SKILL}}'s or an {{AGENT}}'s report included, whatever layout its template
|
|
137
|
-
shows; a reply with one item or none takes none. The code opens the item's line —
|
|
138
|
-
`**F1** — the token is logged in plain text`, `**Q2** — keep the v1 route?` — not a
|
|
139
|
-
bare `1.` or a bullet. Number from one within each kind, keep counting across turns
|
|
140
|
-
(the next finding after `F3` is `F4`, even three replies later), invent a new letter
|
|
141
|
-
for a kind the list omits, and never renumber a code once issued — the user will cite
|
|
142
|
-
it back, and a moved code makes their reply mean something you did not say. A code is an address, not an ornament:
|
|
143
|
-
it lets a long exchange be answered by reference, and a decision taken on turn
|
|
144
|
-
three still be named on turn thirty. Where the {{ONTOLOGY}}'s {{ONT_CONDUCT}}
|
|
145
|
-
governs how an answer speaks, this is only the addressing convention — a practice
|
|
146
|
-
a repository adopts or drops like any other rule in these {{DOCTRINES}}.
|
|
147
|
-
<!-- LEAN:else -->
|
|
148
|
-
Give every tracked item a short reference code, unchanged for the session —
|
|
149
|
-
`D` decisions, `O` options, `F` findings, `R` risks, `Q` questions, `A` actions.
|
|
150
|
-
Any reply naming two or more such items takes codes, a {{SKILL}}'s or {{AGENT}}'s
|
|
151
|
-
report included; one item or none takes none. The code opens the line, never a bare
|
|
152
|
-
`1.` or bullet: `**F1** — token logged in plain text`, `**Q2** — keep the v1 route?`
|
|
153
|
-
Number from one within each kind and keep counting across turns (after `F3` comes
|
|
154
|
-
`F4`), invent letters for missing kinds, never renumber a code once issued.
|
|
155
|
-
<!-- LEAN:end -->
|
|
156
|
-
|
|
157
|
-
### {{DOCTRINE}} process 8 — {{DOC_PROCESS_8}}
|
|
158
|
-
<!-- LEAN:begin -->
|
|
159
133
|
When several {{AGENTS}} work on the same code — sub-{{AGENTS}}, a pipeline crew, a
|
|
160
134
|
workflow fan-out, another session or tool in this checkout — each file has one writer at
|
|
161
135
|
a time. Before dispatch, give every unit a **write set** (the files or globs it may
|
package/src/skills/debug.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> {{DESC_DEBUG}}
|
|
4
4
|
|
|
5
|
-
**Trigger:** a
|
|
5
|
+
**Trigger:** a test fails, something crashes, an error or stack trace appears, or code returns the wrong result — load this FIRST, before reading code or investigating, not only before proposing a fix.
|
|
6
6
|
|
|
7
7
|
**No fix without a root cause.** A change you cannot tie to a cause you understand is
|
|
8
8
|
a guess — and a guess that happens to pass is worse than a failure, because it hides.
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
> {{DESC_DOCUMENT_PROJECT}}
|
|
4
4
|
|
|
5
|
-
**Trigger:** the project's
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
**Trigger:** the project's docs are missing or have drifted from the code, or it needs a PRD, a design system, an architecture document or an AGENTS.md. Existing codebases only — every document is extracted from the code, never written ahead of it.
|
|
6
|
+
|
|
7
|
+
**Argument:** `[prd|design|architecture|agents|all]` — optional. It names the doc-set members to
|
|
8
|
+
write; with none, step 3 proposes them.
|
|
8
9
|
|
|
9
10
|
## Procedure
|
|
10
11
|
1. **Find the doc home.** Look for an existing `docs/`, `doc/`, `documentation/`, or
|
|
@@ -15,35 +16,53 @@ into line with the implementation.
|
|
|
15
16
|
commands, config, and key directories — read the actual behaviour (universal {{LAW}} III,
|
|
16
17
|
{{DOCTRINE}} process 4). If there is no `ARCHITECTURE.md`, run [repo-map {{SKILL}}](repo-map.md)
|
|
17
18
|
first so you have the orientation map to build on.
|
|
18
|
-
3. **
|
|
19
|
+
3. **Select the doc set.** Unless the argument names the targets, propose which of the four
|
|
20
|
+
documents apply and wait for the user's go-ahead — e.g. "no UI detected (no stylesheet,
|
|
21
|
+
theme, or component tree) — skipping `DESIGN.md`". `AGENTS.md`, `PRD.md` and
|
|
22
|
+
`architecture.md` apply to every project; `DESIGN.md` only when a UI exists.
|
|
23
|
+
`all` still skips `DESIGN.md` when no UI exists, and says so in one line.
|
|
24
|
+
4. **Write or refresh each selected document** from its template in *The doc set* below,
|
|
25
|
+
under the rules in *Re-runs*. **Invent nothing**: every claim cites `path:line`, or carries
|
|
26
|
+
the marker `⚠ to confirm` (in the user's language). When drafting is done, put every `⚠` to
|
|
27
|
+
the user as **one** batch of questions — not one at a time — and fold the answers in as plain
|
|
28
|
+
text. A command you could not run is recorded as `⚠ fails: <error>`, never as working.
|
|
29
|
+
Every document follows the three page conventions in step 5.
|
|
30
|
+
5. **Reconcile the markdown (whole tree).** Check every existing page against the current
|
|
19
31
|
implementation — renamed or removed APIs, changed flags, dead examples — and fix the
|
|
20
32
|
drift. Add pages for significant undocumented surfaces; remove docs for features that no
|
|
21
33
|
longer exist (deletion is deliberate — {{LAW}} IV). For substantial writing, dispatch
|
|
22
34
|
the [docs {{AGENT}}](../{{DIR_AGENTS}}/docs.md). Keep examples runnable — run them.
|
|
23
35
|
Every generated page follows three conventions:
|
|
24
36
|
- **Typed frontmatter.** Open each page with YAML frontmatter carrying `type:` (one of
|
|
25
|
-
`overview`, `module`, `api`, `flow`, `how-to`
|
|
26
|
-
`generated: <date>` — so drift is auditable per page, not only
|
|
27
|
-
doc-home `index.md` is reserved and carries no frontmatter
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
`overview`, `module`, `api`, `flow`, `how-to`, `prd`, `design-system`, `architecture`),
|
|
38
|
+
`mirrors-commit: <sha>`, and `generated: <date>` — so drift is auditable per page, not only
|
|
39
|
+
in the HTML footer. The doc-home `index.md` is reserved and carries no frontmatter, and
|
|
40
|
+
neither does the root `AGENTS.md` (agents read it raw) — though it still takes the
|
|
41
|
+
fences below.
|
|
42
|
+
- **Fenced generated regions.** Wrap each generated **section** between
|
|
43
|
+
`<!-- geneseed:doc:start -->` and `<!-- geneseed:doc:end -->` markers — one pair per
|
|
44
|
+
section, so prose a reader adds between sections survives — and on re-runs rewrite *only*
|
|
45
|
+
inside them; hand-authored prose outside the markers is never touched.
|
|
32
46
|
- **Diagrams as Mermaid, keyed by purpose.** In the markdown, render diagrams as fenced
|
|
33
47
|
`mermaid` code blocks — they render natively on GitHub, Obsidian, and VS Code with no
|
|
34
48
|
dependency. Pick the kind by what you are showing: sequence for runtime/request flows,
|
|
35
|
-
ER for data models, state for lifecycles, flowchart for control flow. Reserve
|
|
36
|
-
hand-authored inline SVG for the offline HTML
|
|
37
|
-
|
|
38
|
-
with the set you just reconciled.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
49
|
+
ER for data models, state for lifecycles, flowchart for control flow and C4 views. Reserve
|
|
50
|
+
hand-authored inline SVG for the offline HTML only (step 7).
|
|
51
|
+
6. **Keep an index.** Ensure the doc home has an index/README linking every page, the doc-set
|
|
52
|
+
members included, current with the set you just reconciled.
|
|
53
|
+
7. **Regenerate the HTML** — self-contained files at the doc home, a visual parallel to the
|
|
54
|
+
markdown and never a source of truth: regenerate them whole from the markdown each run
|
|
55
|
+
({{DOCTRINE}} ops 3: edit the source, not the surface).
|
|
56
|
+
Overwrite the previous ones, but confirm each is the generated artifact before clobbering
|
|
57
|
+
({{LAW}} III, {{LAW}} IV). Both files:
|
|
43
58
|
- **Stand alone, fully offline** — a single file, content pre-rendered to semantic HTML,
|
|
44
59
|
all styling in one inline `<style>`, at most minimal vanilla JS (light/dark toggle, TOC
|
|
45
60
|
scroll). No CDN, no external assets, no web fonts (use a system-font stack). Render any
|
|
46
61
|
diagram as hand-authored inline SVG or CSS — never a CDN library.
|
|
62
|
+
- **Stay project-facing** — clean and professional styling, never the harness voice; and
|
|
63
|
+
footer it with `mirrors commit <sha> · generated <date>` so the sync is auditable.
|
|
64
|
+
|
|
65
|
+
**`overview.html`** (always) must:
|
|
47
66
|
- **Carry the digest** — hero (project name + one-line purpose), a quick-facts strip
|
|
48
67
|
(language, entry point, build/test/run, license), an architecture section (component
|
|
49
68
|
cards and an inline-SVG or CSS directory tree), and links out to the markdown docs for
|
|
@@ -53,16 +72,99 @@ into line with the implementation.
|
|
|
53
72
|
control or data flow) and render *those* in depth: a plain-language explanation, the
|
|
54
73
|
key code excerpt(s) in a styled monospace block, and the flow as inline SVG. Leave
|
|
55
74
|
peripheral code at digest level.
|
|
56
|
-
- **
|
|
57
|
-
|
|
58
|
-
|
|
75
|
+
- **Present the doc set** that exists — *Product*: the one-line problem, FR and NFR counts
|
|
76
|
+
per status as ✅ ◐ ✗ pills, journeys as cards, a link to `PRD.md`. *Architecture*: C4 L1
|
|
77
|
+
and L2 as inline SVG, the ADR list (ID, title, one-line decision), a link to
|
|
78
|
+
`architecture.md` for L3. *Design*: the main palette as a strip and a link to
|
|
79
|
+
`design.html`.
|
|
80
|
+
|
|
81
|
+
**`design.html`** (only when `DESIGN.md` exists) renders the design system as seen, not
|
|
82
|
+
read: colour swatches with role and a computed AA/AAA contrast badge; the type scale at real
|
|
83
|
+
sizes and weights; spacing, radius and shadow on sample squares; components as cards
|
|
84
|
+
(variants, states, path) — no live rendering, which would need the project's framework; and
|
|
85
|
+
the hard-coded-value drift in a separate callout.
|
|
86
|
+
8. **Do not auto-publish.** Leave the changes for the user to review; stage and commit only
|
|
59
87
|
on consent, via the [commit {{SKILL}}](commit.md) ({{DOCTRINE}} process 5).
|
|
60
88
|
|
|
89
|
+
## The doc set
|
|
90
|
+
|
|
91
|
+
### `docs/PRD.md` — `type: prd`
|
|
92
|
+
One product PRD for the whole project — the intent reconstructed from the code and the user.
|
|
93
|
+
1. **Problem** — 2–4 sentences.
|
|
94
|
+
2. **Users** — the roles, inferred from auth, permissions, and screens.
|
|
95
|
+
3. **Goals**, then 4. **Non-goals** — the least code-derivable sections; expect most `⚠` here.
|
|
96
|
+
5. **User journeys** — the top 3–5, as "As a … I want … so that …"; add a Mermaid sequence
|
|
97
|
+
diagram when more than two actors take part.
|
|
98
|
+
6. **Functional requirements** — a table `ID | Requirement | Acceptance criteria | Status | Code`.
|
|
99
|
+
IDs run `FR-001`, `FR-002`, …; the requirement is one present-tense sentence; the acceptance
|
|
100
|
+
criteria a checklist; the status ✅ implemented, ◐ partial, ✗ absent, or `retired`; the code
|
|
101
|
+
the implementing path. Source them from routes, commands, screens, and tests.
|
|
102
|
+
7. **Non-functional requirements** — the same table plus a `Threshold` column, IDs `NFR-001`, ….
|
|
103
|
+
The threshold is the measurable value the code or config fixes (timeout, rate limit, size
|
|
104
|
+
budget), else `⚠`.
|
|
105
|
+
|
|
106
|
+
### `docs/DESIGN.md` — `type: design-system`
|
|
107
|
+
Only when a UI exists.
|
|
108
|
+
1. **Principles** — 3–5 lines on the visual character the code shows.
|
|
109
|
+
2. **Tokens** — one table per family (colour, typography, spacing, radius, shadow, motion):
|
|
110
|
+
`Name | Value | Role | Source`. Colours add their semantic role and their WCAG 2.x contrast
|
|
111
|
+
ratio (relative luminance) against the reference background; flag every pair below WCAG AA.
|
|
112
|
+
A family the code has no scale for keeps its heading and one line: `⚠ no <family> scale
|
|
113
|
+
found`. List **hard-coded values** found outside the token system separately, as drift —
|
|
114
|
+
never legitimise them as tokens.
|
|
115
|
+
3. **Components** — each reusable component: role, variants, states, key props, path.
|
|
116
|
+
4. **Usage rules** — do / don't for layout, accessibility, and UI copy tone. Only rules the code
|
|
117
|
+
actually follows — never generic best practice.
|
|
118
|
+
|
|
119
|
+
### `docs/architecture.md` — `type: architecture`
|
|
120
|
+
The detailed architecture. Open with a link to the root `ARCHITECTURE.md` (repo-map's short
|
|
121
|
+
map) and make sure the map links back — one fenced `geneseed:doc` line at its top, nothing else
|
|
122
|
+
in that file touched; repeat nothing between the two.
|
|
123
|
+
1. **Context (C4 L1)** — the system, its actors, and the external systems (APIs, SSO, shared
|
|
124
|
+
databases), as a Mermaid flowchart.
|
|
125
|
+
2. **Containers (C4 L2)** — the deployable units and the protocols between them.
|
|
126
|
+
3. **Components (C4 L3)** — one diagram per *significant* container, not one per module. On a
|
|
127
|
+
monorepo, work one container or package at a time.
|
|
128
|
+
4. **Decisions** — lightweight inline ADRs, `ADR-001`, …, four lines each: *context · decision ·
|
|
129
|
+
consequences · evidence*. Structural choices only (framework, storage, architectural style,
|
|
130
|
+
decomposition) — not details.
|
|
131
|
+
|
|
132
|
+
### `AGENTS.md` — repo root, at most ~60 lines
|
|
133
|
+
The short manual an agent reads before touching the repo.
|
|
134
|
+
1. **Commands** — build, test, lint, run: exact, and verified by running each one.
|
|
135
|
+
2. **Non-obvious conventions**.
|
|
136
|
+
3. **Do not touch** — generated files, vendored code, applied migrations.
|
|
137
|
+
4. **Before you change…** — targeted pointers: a UI → `docs/DESIGN.md`; a new flow or
|
|
138
|
+
container → `docs/architecture.md`; a feature → `docs/PRD.md` (its FR ID).
|
|
139
|
+
|
|
140
|
+
Geneseed may own a block in this file, between `<!-- BEGIN GENESEED -->` and
|
|
141
|
+
`<!-- END GENESEED -->` — never write inside it. Create the file if it is absent; if it holds
|
|
142
|
+
only that block, add the project sections below it.
|
|
143
|
+
|
|
144
|
+
## Re-runs
|
|
145
|
+
- **Reader prose is sacred.** Rewrite only inside a section's `geneseed:doc` fences. A
|
|
146
|
+
document that already exists **without** fences (a hand-written `PRD.md`, say) is never
|
|
147
|
+
rewritten: offer to fence the sections you recognise, or to leave it and report its drift —
|
|
148
|
+
the user chooses.
|
|
149
|
+
- **IDs are stable.** Before rewriting, read the existing FR, NFR and ADR tables. Keep every
|
|
150
|
+
ID and any wording the user corrected; update only *Status*, *Code*, *Threshold*, and
|
|
151
|
+
*Evidence*; append new rows with the next free number. A requirement that disappears becomes
|
|
152
|
+
`retired` — never deleted, never renumbered. An ADR the code no longer bears is marked
|
|
153
|
+
`superseded`, never deleted.
|
|
154
|
+
- **`mirrors-commit` moves only with a rewrite.** A document outside this run's target keeps
|
|
155
|
+
its old value, so its staleness stays visible.
|
|
156
|
+
- **An answered `⚠` stays answered** — it is plain text now, not re-asked unless the code
|
|
157
|
+
contradicts it.
|
|
158
|
+
|
|
61
159
|
## Done when
|
|
160
|
+
- Every selected doc-set member exists, follows its template, and cites its evidence or
|
|
161
|
+
carries `⚠`; the batch of `⚠` questions has been put to the user.
|
|
62
162
|
- The doc home mirrors the current implementation: every markdown page carries typed
|
|
63
|
-
frontmatter, wraps its generated
|
|
163
|
+
frontmatter, wraps its generated sections in `geneseed:doc` markers, and is verified against
|
|
64
164
|
the code or flagged; examples run, Mermaid fences are well-formed, and the index links
|
|
65
|
-
them all
|
|
66
|
-
|
|
165
|
+
them all.
|
|
166
|
+
- `overview.html` opens offline and shows the digest, the complex-core deep-dives, and the
|
|
167
|
+
doc set; `design.html` does too wherever `DESIGN.md` exists; and any surface left
|
|
168
|
+
undocumented is named explicitly.
|
|
67
169
|
|
|
68
170
|
<!-- INCLUDE: skills/_self-improvement.md -->
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
**Trigger:** two or more independent subtasks with no shared state or ordering between them — and a tool that can run subagents.
|
|
6
6
|
|
|
7
7
|
## Procedure
|
|
8
|
-
1. Confirm independence: the subtasks must not depend on each other's output or write the same files ({{DOCTRINE}} process
|
|
8
|
+
1. Confirm independence: the subtasks must not depend on each other's output or write the same files ({{DOCTRINE}} process 7). Write down each unit's **write set** — the files or globs it may change — and intersect them; an overlap runs in sequence or goes to one owner, and shared append files (registries, index tables, lockfiles, generated bundles) stay with you. If they're sequential or share state, use [plan](plan.md) instead.
|
|
9
9
|
2. Split the work into self-contained units, each with one clear goal and a defined output contract — what it must return.
|
|
10
10
|
3. Dispatch each unit to its own subagent in one batch, each under a handoff envelope: the unit's goal, the inputs it needs, its **write set** (edit nothing outside it; return rows for a shared file instead of writing it), the observable check that proves it done, its output contract — naming every file it changed — and the inherited constraints (no commit/push — {{DOCTRINE}} process 5 stays with you; gaps reported, never invented). Hand each unit only the access its goal needs ({{LAW}} VII). Prefer the read-only [explorer {{AGENT}}](../{{DIR_AGENTS}}/explorer.md) for investigation so the heavy reading stays out of the main context ({{DOCTRINE}} process 3). Where no subagent capability exists, run the units sequentially as personas instead, converging the same way.
|
|
11
11
|
4. Keep the main context lean: collect each subagent's distilled result, not its working transcript.
|
package/src/skills/pipeline.md
CHANGED
|
@@ -23,7 +23,7 @@ The minimum roster per task type. The parent may add specialists on top — secu
|
|
|
23
23
|
|
|
24
24
|
1. Confirm the task is genuinely substantial — a trivial one-file tweak or a question does not warrant a crew; do it directly instead.
|
|
25
25
|
2. Compose the crew from the floor above, adding specialists only where the task demands them.
|
|
26
|
-
3. Isolate the crew's work in its own git worktree/branch (the SETUP.md worktree add-on). Where worktrees are unavailable, fall back to a single tree, one pipeline at a time, and say so. Give the crew a **write set** and check it against every other pipeline in flight ({{DOCTRINE}} process
|
|
26
|
+
3. Isolate the crew's work in its own git worktree/branch (the SETUP.md worktree add-on). Where worktrees are unavailable, fall back to a single tree, one pipeline at a time, and say so. Give the crew a **write set** and check it against every other pipeline in flight ({{DOCTRINE}} process 7): two crews whose sets overlap do not run at once, and shared append files (registries, index tables, lockfiles, generated bundles) are the parent's to apply, never a crew's.
|
|
27
27
|
4. **The dev↔tester loop:** the developer implements, the tester validates — runs the tests and lint, produces raw logs. On failure, the findings go back to the developer. Cap at **5** iterations; on exhaustion, stop, do not merge, and report the failure with the branch left in place for inspection.
|
|
28
28
|
5. **Two execution shapes**, chosen by host capability (same pattern as the [workflow {{SKILL}}](workflow.md)):
|
|
29
29
|
- *Deterministic:* where the host exposes a `workflow` tool, run a saved script encoding analyst → developer → (tester ⇄ developer)×≤5 → proof.
|
|
@@ -28,9 +28,10 @@ picking the most recently active source:
|
|
|
28
28
|
| Claude Code | `~/.claude/projects/<slug>/*.jsonl` | exact usage per request |
|
|
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
|
+
| OpenClaude | `~/.openclaude/projects/<slug>/*.jsonl` (Claude-shaped, `$OPENCLAUDE_CONFIG_DIR` honoured) | exact usage per request |
|
|
31
32
|
| GitHub Copilot | `~/.copilot/history-session-state/` | best effort — undocumented schema; token-like fields harvested, else estimates only |
|
|
32
33
|
|
|
33
|
-
Useful flags: `--host claude|bob|opencode|copilot` to force a host,
|
|
34
|
+
Useful flags: `--host claude|bob|openclaude|opencode|copilot` to force a host,
|
|
34
35
|
`--transcript <path>` / `--session <id>` for a specific session,
|
|
35
36
|
`--limit <tokens>` for the context-window limit used in the % columns
|
|
36
37
|
(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 — which is exactly what a multi-file skill needs.
|
|
8
|
+
IBM Bob, OpenCode, GitHub Copilot, 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,7 @@ 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
|
|
21
|
-
OpenCode; best-effort on Copilot, whose session-state schema is undocumented).
|
|
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).
|
|
22
22
|
If a host changes its session storage layout, fix the corresponding finder or
|
|
23
23
|
parser in `scripts/token_report.mjs`.
|