geneseed 3.17.0 → 3.18.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 +22 -0
- package/README.md +17 -3
- package/SHIPPED.md +3 -3
- package/adapters/claude-code/skills/geneseed/SKILL.md +1 -1
- package/adapters/opencode/README.md +2 -2
- package/adapters/opencode/plugins/geneseed-context.js +19 -17
- package/adapters/opencode/plugins/geneseed-guard.js +7 -7
- package/bin/geneseed-cli.mjs +5 -0
- package/docs/concepts/exclusions.md +1 -1
- package/docs/concepts/skills.md +4 -0
- package/docs/extending.md +33 -0
- package/docs/guides/read-non-markdown.md +1 -1
- package/docs/guides/uninstall.md +1 -1
- package/docs/guides/upgrade.md +1 -1
- package/docs/guides/wiki.md +4 -4
- package/docs/opencode-plugin-setup.md +1 -1
- package/docs/reference/env-context.md +2 -2
- package/docs/reference/plugin-context.md +2 -2
- package/docs/reference/plugin-guard.md +1 -1
- package/docs/token-footprint.md +18 -15
- package/docs/understand/take-it-out.md +1 -1
- package/harness.config.json +1 -1
- package/js/README.md +4 -1
- package/js/build/args.mjs +22 -20
- package/js/build/bundle.mjs +1 -3
- package/js/build/emit-claude.mjs +5 -4
- package/js/build/emit-opencode.mjs +9 -2
- package/js/build/generate.mjs +6 -6
- package/js/build/render.mjs +19 -12
- package/js/build/source.mjs +82 -7
- package/js/build/stubs.mjs +35 -6
- package/js/build/themes.mjs +1 -3
- package/js/cli-table.json +53 -0
- package/js/hosts/hooks-context.mjs +13 -6
- package/js/hosts/hosts.mjs +1 -3
- package/js/hosts/installs.mjs +13 -7
- package/js/hosts/mcp.mjs +1 -1
- package/js/hosts/native.mjs +60 -5
- package/js/hosts/opencode.mjs +37 -6
- package/js/hosts/settings.mjs +1 -0
- package/js/hosts/shim.mjs +1 -0
- package/js/inspect/checks-authoring.mjs +4 -1
- package/js/inspect/checks-repo.mjs +164 -2
- package/js/inspect/diff.mjs +5 -1
- package/js/inspect/doctor.mjs +2 -1
- package/js/inspect/inventory.mjs +7 -9
- package/js/inspect/scorecard-checks.mjs +571 -0
- package/js/inspect/scorecard-svg.mjs +85 -0
- package/js/inspect/scorecard.mjs +839 -0
- package/js/lib/json.mjs +1 -1
- package/js/maintain/migrate.mjs +2 -1
- package/js/maintain/uninstall.mjs +2 -3
- package/js/maintain/update.mjs +10 -3
- package/js/ui/menu.mjs +2 -2
- package/js/ui/tui.mjs +1 -0
- package/js/web/api.mjs +2 -0
- package/js/web/catalog.mjs +24 -7
- package/js/web/daemon.mjs +2 -1
- package/js/web/routes.mjs +2 -0
- package/js/web/server.mjs +1 -1
- package/js/web/user-files.mjs +1 -0
- package/package.json +11 -3
- package/registry.json +12 -75
- package/src/AGENT.md.tmpl +13 -22
- package/src/agents/docs.md +1 -1
- package/src/agents/researcher.md +1 -1
- package/src/bricks/bruno-test.md +2 -2
- package/src/bricks/ci-fix.md +3 -3
- package/src/bricks/deps-audit.md +3 -3
- package/src/bricks/migration-plan.md +2 -2
- package/src/doctrines/process.md +2 -2
- package/src/laws/universal.md +2 -2
- package/src/skills/brainstorm.md +14 -10
- package/src/skills/bruno.md +84 -0
- package/src/skills/codebase-design.md +41 -23
- package/src/skills/daydream/SKILL.md +3 -3
- package/src/skills/daydream/VENDOR.md +2 -2
- package/src/skills/daydream/instructions.md +1 -1
- package/src/skills/debug/ci.md +11 -0
- package/src/skills/debug.md +11 -8
- package/src/skills/dependencies.md +65 -0
- package/src/skills/develop.md +9 -4
- package/src/skills/document-project.md +27 -22
- package/src/skills/geneseed-code-review.md +13 -8
- package/src/skills/geneseed.md +4 -1
- package/src/skills/git-history.md +78 -0
- package/src/skills/handoff.md +4 -3
- package/src/skills/parallel-agents.md +1 -0
- package/src/skills/plan.md +5 -1
- package/src/skills/prototype.md +10 -7
- package/src/skills/research.md +6 -1
- package/src/skills/rule/consolidate.md +32 -0
- package/src/skills/rule.md +14 -4
- package/src/skills/security-audit.md +1 -1
- package/src/skills/ship.md +8 -5
- package/src/skills/teach.md +5 -3
- package/src/skills/wayfinder.md +19 -16
- package/src/skills/wiki.md +2 -2
- package/themes/_TEMPLATE.json +7 -16
- package/themes/biker.json +7 -16
- package/themes/commentator.json +7 -16
- package/themes/cyberpunk.json +7 -16
- package/themes/gamer.json +7 -16
- package/themes/imperial.json +7 -16
- package/themes/joker.json +7 -16
- package/themes/marvin.json +7 -16
- package/themes/mean.json +7 -16
- package/themes/military.json +7 -16
- package/themes/neutral.json +7 -16
- package/themes/pirate.json +7 -16
- package/themes/sports.json +7 -16
- package/themes/verstappen.json +7 -16
- package/themes/wizard.json +7 -16
- package/web/dist/assets/{Activity-DonKN1pi.js → Activity-4M4VQJOh.js} +1 -1
- package/web/dist/assets/{ActivityDetail-e47a3cdE.js → ActivityDetail-CnmDs43F.js} +1 -1
- package/web/dist/assets/{Dashboard-Cr7i0PsO.js → Dashboard-lTaH58R9.js} +2 -2
- package/web/dist/assets/{Docs-Lne3nuzD.js → Docs-DU5znu5f.js} +1 -1
- package/web/dist/assets/FilterInput-BSfpStOZ.js +1 -0
- package/web/dist/assets/{GreenhouseView-4CbIuTpl.js → GreenhouseView-BxO84bKX.js} +1 -1
- package/web/dist/assets/{Installs-CIzbV1Ks.js → Installs-B1WcObxK.js} +1 -1
- package/web/dist/assets/{JournalView-BlBfuvzj.js → JournalView-0YNKcaaD.js} +1 -1
- package/web/dist/assets/{Laws-B-pjcjHr.js → Laws-DnDpRwpE.js} +1 -1
- package/web/dist/assets/Library-DBkKsBMe.js +1 -0
- package/web/dist/assets/{Loops-DIOxW1xH.js → Loops-P-6RCdzS.js} +1 -1
- package/web/dist/assets/Markdown-C6fRd4A4.js +67 -0
- package/web/dist/assets/{OperatorHudView-D7S7z7CJ.js → OperatorHudView-BZZ3uJPH.js} +1 -1
- package/web/dist/assets/{Personal-Ws3v35AB.js → Personal-BoVw6OCW.js} +1 -1
- package/web/dist/assets/{Tabs-6Z1eziAq.js → Tabs-VYLhUTiX.js} +1 -1
- package/web/dist/assets/{activity-Dr7ZMBI3.js → activity-dcg5vF9j.js} +1 -1
- package/web/dist/assets/{drawable-ATNeYKbT.js → drawable-CdNARIKC.js} +1 -1
- package/web/dist/assets/{index-CDg5XUhG.js → index-hsabpYzv.js} +2 -2
- package/web/dist/assets/react-DRhoX0kS.js +9 -0
- package/web/dist/assets/{usePoll-DD8VjtSg.js → usePoll-BmR631BB.js} +1 -1
- package/web/dist/index.html +2 -2
- package/src/skills/bruno-collection-generator.md +0 -52
- package/src/skills/bruno-test-writer.md +0 -51
- package/src/skills/ci-fix.md +0 -49
- package/src/skills/consolidate-memory.md +0 -50
- package/src/skills/deps-audit.md +0 -46
- package/src/skills/domain-modeling.md +0 -27
- package/src/skills/git-archaeology.md +0 -36
- package/src/skills/git-rescue.md +0 -58
- package/src/skills/migrate.md +0 -34
- package/src/skills/opencode-theme.md +0 -42
- package/src/skills/repo-map.md +0 -25
- package/src/skills/tickets.md +0 -33
- package/web/dist/assets/FilterInput-CVyqmYWM.js +0 -1
- package/web/dist/assets/Library-x8Nzg6yq.js +0 -1
- package/web/dist/assets/Markdown-X2a3qvOh.js +0 -38
- package/web/dist/assets/react-B9Z_tXRV.js +0 -8
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The scorecard as an SVG card — the grade, and one bar per pillar — for a README.
|
|
3
|
+
*
|
|
4
|
+
* WHY A FILE AND NOT A BADGE SERVICE. A shields.io badge carries one number; the point of the card
|
|
5
|
+
* is the five pillars side by side, which is where a reader sees what to fix. And a card nobody
|
|
6
|
+
* regenerates is a lie with a date on it, so `checks-repo.mjs` compares this repo's committed card
|
|
7
|
+
* against a fresh render on every doctor run in a checkout: the drawing cannot drift from the
|
|
8
|
+
* score.
|
|
9
|
+
*
|
|
10
|
+
* DETERMINISTIC ON PURPOSE. No date, no repo path, no folder name (a worktree's name differs from
|
|
11
|
+
* CI's checkout), nothing but the assessment's numbers — so the same tree renders the same bytes
|
|
12
|
+
* on every machine, which is what lets doctor compare them. Colours follow the viewer's theme
|
|
13
|
+
* through a `prefers-color-scheme` block, which GitHub honours inside an `<img>` SVG.
|
|
14
|
+
*/
|
|
15
|
+
import { round1 } from './scorecard.mjs';
|
|
16
|
+
|
|
17
|
+
/** The grade band a percentage falls in — the same thresholds as the overall grade. */
|
|
18
|
+
const band = (pct) => (pct >= 85 ? 'a' : pct >= 70 ? 'b' : pct >= 55 ? 'c' : pct >= 40 ? 'd' : 'f');
|
|
19
|
+
|
|
20
|
+
const esc = (s) => String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
21
|
+
|
|
22
|
+
/** Render an assessment (from `assessRepo`) as a standalone SVG document. */
|
|
23
|
+
export function renderSvg(a) {
|
|
24
|
+
const W = 760;
|
|
25
|
+
const top = 96;
|
|
26
|
+
const rowH = 46;
|
|
27
|
+
const H = top + a.categories.length * rowH + 40;
|
|
28
|
+
const barX = 300;
|
|
29
|
+
const barW = 330;
|
|
30
|
+
const rows = a.categories.map((c, i) => {
|
|
31
|
+
const y = top + i * rowH;
|
|
32
|
+
const pct = round1(c.percentage);
|
|
33
|
+
const passed = c.checks.filter((k) => k.passed).length;
|
|
34
|
+
const w = Math.max(0, Math.min(barW, (barW * c.percentage) / 100));
|
|
35
|
+
return [
|
|
36
|
+
` <text class="label" x="32" y="${y + 20}">${esc(c.name)}</text>`,
|
|
37
|
+
` <text class="muted" x="32" y="${y + 37}">weight ${Math.round(c.weight * 100)} % · ${passed}/${c.checks.length} checks</text>`,
|
|
38
|
+
` <rect class="track" x="${barX}" y="${y + 10}" width="${barW}" height="16" rx="8"/>`,
|
|
39
|
+
` <rect class="bar ${band(c.percentage)}" x="${barX}" y="${y + 10}" width="${round1(w)}" height="16" rx="8"/>`,
|
|
40
|
+
` <text class="pct" x="${W - 32}" y="${y + 24}" text-anchor="end">${pct} %</text>`,
|
|
41
|
+
].join('\n');
|
|
42
|
+
});
|
|
43
|
+
const g = band(a.overallScore);
|
|
44
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" width="${W}" height="${H}" viewBox="0 0 ${W} ${H}" role="img" aria-label="AI Harness Scorecard: grade ${a.grade}, ${round1(a.overallScore)} out of 100">
|
|
45
|
+
<style>
|
|
46
|
+
svg { --bg: #ffffff; --fg: #1f2328; --muted: #656d76; --track: #eaeef2; --line: #d0d7de;
|
|
47
|
+
--a: #1a7f37; --b: #0969da; --c: #9a6700; --d: #bc4c00; --f: #cf222e; }
|
|
48
|
+
@media (prefers-color-scheme: dark) {
|
|
49
|
+
svg { --bg: #0d1117; --fg: #e6edf3; --muted: #8d96a0; --track: #21262d; --line: #30363d;
|
|
50
|
+
--a: #3fb950; --b: #4493f8; --c: #d29922; --d: #db6d28; --f: #f85149; }
|
|
51
|
+
}
|
|
52
|
+
text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; fill: var(--fg); }
|
|
53
|
+
.title { font-size: 20px; font-weight: 600; }
|
|
54
|
+
.label { font-size: 15px; font-weight: 600; }
|
|
55
|
+
.muted { font-size: 12px; fill: var(--muted); }
|
|
56
|
+
.pct { font-size: 15px; font-weight: 600; font-variant-numeric: tabular-nums; }
|
|
57
|
+
.grade { font-size: 30px; font-weight: 700; fill: #ffffff; }
|
|
58
|
+
.score { font-size: 22px; font-weight: 600; font-variant-numeric: tabular-nums; }
|
|
59
|
+
.track { fill: var(--track); }
|
|
60
|
+
.a { fill: var(--a); } .b { fill: var(--b); } .c { fill: var(--c); } .d { fill: var(--d); } .f { fill: var(--f); }
|
|
61
|
+
</style>
|
|
62
|
+
<rect x="0.5" y="0.5" width="${W - 1}" height="${H - 1}" rx="12" fill="var(--bg)" stroke="var(--line)"/>
|
|
63
|
+
<text class="title" x="32" y="44">AI Harness Scorecard</text>
|
|
64
|
+
<text class="muted" x="32" y="66">${a.passedChecks} of ${a.totalChecks} deterministic checks passing · five weighted pillars</text>
|
|
65
|
+
<text class="score" x="${W - 100}" y="56" text-anchor="end">${round1(a.overallScore)}<tspan class="muted"> / 100</tspan></text>
|
|
66
|
+
<rect class="${g}" x="${W - 84}" y="22" width="52" height="52" rx="10"/>
|
|
67
|
+
<text class="grade" x="${W - 58}" y="59" text-anchor="middle">${a.grade}</text>
|
|
68
|
+
<line x1="32" y1="${top - 12}" x2="${W - 32}" y2="${top - 12}" stroke="var(--line)"/>
|
|
69
|
+
${rows.join('\n')}
|
|
70
|
+
<text class="muted" x="32" y="${H - 16}">markmishaev76/ai-harness-scorecard, ported to JavaScript · geneseed scorecard --svg</text>
|
|
71
|
+
</svg>
|
|
72
|
+
`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** The light-theme band colours, reused by the badge (shields.io takes a bare hex). */
|
|
76
|
+
const BADGE_COLOUR = { a: '1a7f37', b: '0969da', c: '9a6700', d: 'bc4c00', f: 'cf222e' };
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The README badge for an assessment — grade and score, coloured by band. `--svg` prints it next to
|
|
80
|
+
* writing the card, and doctor requires the README to carry exactly this URL, so the one number a
|
|
81
|
+
* reader sees first cannot lag the card below it.
|
|
82
|
+
*/
|
|
83
|
+
export function badgeUrl(a) {
|
|
84
|
+
return `https://img.shields.io/badge/AI%20harness%20scorecard-${a.grade}%20%C2%B7%20${round1(a.overallScore)}-${BADGE_COLOUR[band(a.overallScore)]}`;
|
|
85
|
+
}
|