geneseed 3.12.0 → 3.14.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 +160 -0
- package/README.md +2 -2
- package/SHIPPED.md +1 -1
- package/adapters/bob/README.md +1 -1
- package/adapters/claude-code/README.md +1 -1
- package/adapters/openclaude/README.md +1 -1
- package/adapters/opencode/README.md +3 -3
- package/adapters/opencode/plugins/geneseed-learn.js +10 -1
- package/bin/geneseed-cli.mjs +10 -14
- package/bin/geneseed-hook.mjs +22 -15
- package/docs/README.md +41 -22
- package/docs/concepts/agents.md +3 -1
- package/docs/concepts/collaboration.md +3 -1
- package/docs/concepts/exclusions.md +4 -2
- package/docs/concepts/footprint.md +3 -1
- package/docs/concepts/foreman-mode.md +3 -1
- package/docs/concepts/hook-gates.md +61 -0
- package/docs/concepts/hooks.md +8 -56
- package/docs/concepts/host-matrix.md +38 -0
- package/docs/concepts/hosts.md +6 -32
- package/docs/concepts/loop-branch.md +66 -0
- package/docs/concepts/loop-bricks.md +48 -0
- package/docs/concepts/loop-contracts.md +33 -0
- package/docs/concepts/loop-gates.md +30 -0
- package/docs/concepts/loop-notes.md +43 -0
- package/docs/concepts/loop-risk.md +36 -0
- package/docs/concepts/loop-templates.md +50 -0
- package/docs/concepts/loops.md +24 -116
- package/docs/concepts/lsp.md +2 -0
- package/docs/concepts/memory.md +3 -1
- package/docs/concepts/notebook.md +3 -1
- package/docs/concepts/rules.md +4 -2
- package/docs/concepts/skills.md +3 -1
- package/docs/concepts/themes.md +3 -1
- package/docs/extending.md +28 -13
- package/docs/guides/autostart.md +3 -1
- package/docs/guides/choose-your-setup.md +5 -80
- package/docs/guides/headless.md +5 -3
- package/docs/guides/install-agent-md.md +37 -0
- package/docs/guides/install-bob.md +20 -0
- package/docs/guides/install-claude-code.md +22 -0
- package/docs/guides/install-clone.md +34 -0
- package/docs/guides/install-openclaude.md +25 -0
- package/docs/guides/install-opencode.md +35 -0
- package/docs/guides/install-scripted.md +21 -0
- package/docs/guides/install.md +9 -118
- package/docs/guides/loop-finish.md +54 -0
- package/docs/guides/loop-running.md +66 -0
- package/docs/guides/loop-which-template.md +35 -0
- package/docs/guides/mcp-filesystem.md +41 -0
- package/docs/guides/mcp-gitlab.md +66 -0
- package/docs/guides/mcp-markitdown.md +36 -0
- package/docs/guides/mcp.md +8 -137
- package/docs/guides/migrate.md +3 -1
- package/docs/guides/project-context.md +4 -2
- package/docs/guides/read-non-markdown.md +17 -0
- package/docs/guides/run-a-loop.md +64 -0
- package/docs/guides/run-anywhere.md +2 -0
- package/docs/guides/setup-doctrines.md +55 -0
- package/docs/guides/setup-footprint.md +48 -0
- package/docs/guides/uninstall.md +3 -1
- package/docs/guides/upgrade.md +3 -1
- package/docs/guides/verify.md +3 -1
- package/docs/guides/wiki.md +3 -1
- package/docs/guides/worktree.md +3 -1
- package/docs/reference/about.md +3 -1
- package/docs/reference/cli.md +2 -0
- package/docs/reference/env-context.md +40 -0
- package/docs/reference/environment.md +10 -59
- package/docs/reference/glossary.md +3 -1
- package/docs/reference/loop-actions.md +20 -0
- package/docs/reference/opencode-plugins.md +14 -118
- package/docs/reference/plugin-activity.md +20 -0
- package/docs/reference/plugin-context.md +27 -0
- package/docs/reference/plugin-guard.md +27 -0
- package/docs/reference/plugin-learn.md +27 -0
- package/docs/reference/plugin-notify.md +20 -0
- package/docs/reference/plugin-ponytail.md +19 -0
- package/docs/reference/plugin-workflow.md +25 -0
- package/docs/reference/troubleshoot-doctor.md +50 -0
- package/docs/reference/troubleshoot-hooks.md +99 -0
- package/docs/reference/troubleshoot-install.md +108 -0
- package/docs/reference/troubleshoot-tools.md +56 -0
- package/docs/reference/troubleshoot-update.md +23 -0
- package/docs/reference/troubleshoot-web.md +66 -0
- package/docs/reference/troubleshooting.md +13 -337
- package/docs/understand/a-day.md +3 -1
- package/docs/understand/enforced-vs-asked.md +3 -1
- package/docs/understand/harness.md +2 -0
- package/docs/understand/machine-bob.md +17 -0
- package/docs/understand/machine-claude.md +35 -0
- package/docs/understand/machine-opencode.md +36 -0
- package/docs/understand/on-your-machine.md +12 -55
- package/docs/understand/take-it-out.md +13 -0
- package/docs/web-ui.md +35 -15
- package/harness.config.json +1 -1
- package/js/README.md +30 -13
- package/js/build/args.mjs +374 -0
- package/js/build/driver.mjs +137 -553
- package/js/build/emit-claude.mjs +2 -4
- package/js/build/generate.mjs +6 -3
- package/js/build/render.mjs +5 -9
- package/js/build/source.mjs +3 -11
- package/js/cli-table.json +27 -1
- package/js/hosts/hooks-context.mjs +431 -0
- package/js/hosts/hooks-learn.mjs +275 -0
- package/js/hosts/hooks-prims.mjs +108 -0
- package/js/hosts/hooks.mjs +50 -977
- package/js/hosts/hosts.mjs +12 -4
- package/js/hosts/installs.mjs +5 -6
- package/js/hosts/mcp.mjs +13 -49
- package/js/hosts/memory-files.mjs +181 -0
- package/js/hosts/native.mjs +43 -5
- package/js/hosts/settings.mjs +135 -414
- package/js/hosts/shim.mjs +373 -0
- package/js/inspect/checks-authoring.mjs +21 -828
- package/js/inspect/checks-build.mjs +32 -4
- package/js/inspect/checks-constitution.mjs +493 -0
- package/js/inspect/checks-counts.mjs +242 -0
- package/js/inspect/checks-repo.mjs +17 -8
- package/js/inspect/diff.mjs +4 -1
- package/js/inspect/doctor.mjs +2 -2
- package/js/inspect/inventory.mjs +4 -4
- package/js/inspect/scan.mjs +1 -1
- package/js/inspect/status.mjs +1 -1
- package/js/inspect/validate.mjs +48 -35
- package/js/loop/catalog.mjs +17 -4
- package/js/loop/cli.mjs +52 -16
- package/js/loop/graph.mjs +19 -1
- package/js/loop/registry.mjs +191 -0
- package/js/loop/score.mjs +46 -7
- package/js/loop/state.mjs +157 -19
- package/js/maintain/memory.mjs +1 -1
- package/js/maintain/migrate.mjs +18 -30
- package/js/maintain/setup.mjs +1 -1
- package/js/maintain/uninstall.mjs +47 -88
- package/js/ui/cli.mjs +12 -12
- package/js/web/actions.mjs +39 -4
- package/js/web/api.mjs +34 -21
- package/js/web/docs.mjs +87 -78
- package/js/web/routes.mjs +5 -1
- package/package.json +1 -1
- package/src/agents/explorer.md +2 -2
- package/src/agents/researcher.md +3 -3
- package/src/bricks/README.md +3 -1
- package/src/bricks/adr-challenge.md +20 -0
- package/src/bricks/adr-draft.md +15 -0
- package/src/bricks/characterize.md +17 -0
- package/src/bricks/ci-fix.md +2 -1
- package/src/bricks/ci-triage.md +20 -0
- package/src/bricks/compat-check.md +16 -0
- package/src/bricks/done-check.md +16 -0
- package/src/bricks/fitness-define.md +22 -0
- package/src/bricks/flake-check.md +17 -0
- package/src/bricks/flake-repro.md +18 -0
- package/src/bricks/identify.md +6 -3
- package/src/bricks/migration-plan.md +21 -0
- package/src/bricks/mutation-check.md +18 -0
- package/src/bricks/plan.md +6 -6
- package/src/bricks/red-test.md +16 -0
- package/src/bricks/review.md +5 -3
- package/src/bricks/spec.md +18 -0
- package/src/bricks/upgrade-scout.md +16 -0
- package/src/loops/api-endpoint.json +31 -0
- package/src/loops/architecture-decision.json +22 -0
- package/src/loops/bugfix.json +1 -0
- package/src/loops/ci-repair.json +19 -0
- package/src/loops/deps-upgrade.json +29 -0
- package/src/loops/enforce-architecture-rule.json +28 -0
- package/src/loops/feature.json +8 -5
- package/src/loops/fix-flaky-tests.json +30 -0
- package/src/loops/legacy-refactor.json +26 -0
- package/src/loops/legacy-tests.json +29 -0
- package/src/loops/refactor.json +5 -1
- package/src/loops/remove-dead-code.json +30 -0
- package/src/loops/spec-first-feature.json +29 -0
- package/src/loops/tdd.json +25 -0
- package/src/loops/update-contract.json +33 -0
- package/src/skills/brick-forge.md +3 -1
- package/src/skills/bruno-collection-generator.md +3 -3
- package/src/skills/bruno-test-writer.md +3 -3
- package/src/skills/ci-fix.md +3 -3
- package/src/skills/consolidate-memory.md +4 -4
- package/src/skills/council.md +1 -1
- package/src/skills/fresh-eyes.md +1 -1
- package/src/skills/git-archaeology.md +1 -1
- package/src/skills/git-rescue.md +4 -3
- package/src/skills/handoff.md +1 -1
- package/src/skills/herdr.md +1 -1
- package/src/skills/learn-mode.md +2 -2
- package/src/skills/loop.md +22 -10
- package/src/skills/opencode-theme.md +3 -3
- package/src/skills/ponytail.md +1 -1
- package/src/skills/profile.md +3 -4
- package/src/skills/prose.md +2 -3
- package/src/skills/quiz.md +1 -1
- package/src/skills/react-view-transitions/SKILL.md +1 -1
- package/src/skills/react-view-transitions/VENDOR.md +8 -3
- package/src/skills/research.md +3 -3
- package/src/skills/review-response.md +2 -2
- package/src/skills/rule.md +3 -3
- package/src/skills/security-audit.md +4 -4
- package/src/skills/teach.md +1 -1
- package/src/skills/wiki.md +3 -3
- package/src/skills/workflow.md +4 -4
- package/src/skills/worktree.md +2 -2
- package/web/dist/assets/Activity-CjRqZnr-.js +1 -0
- package/web/dist/assets/ActivityDetail-OQTxKBj2.js +1 -0
- package/web/dist/assets/Dashboard-J-xCe_Gk.js +2 -0
- package/web/dist/assets/Docs-CvOZ8akL.js +5 -0
- package/web/dist/assets/{GreenhouseView-C6ibc8IE.js → GreenhouseView-6KDjX8da.js} +1 -1
- package/web/dist/assets/{Installs-DRYjYnxs.js → Installs-MWuhNjSm.js} +2 -2
- package/web/dist/assets/JournalView-C8MrOz2c.js +1 -0
- package/web/dist/assets/Laws-Du0-Zyp2.js +3 -0
- package/web/dist/assets/Library-DOkO0TtB.js +1 -0
- package/web/dist/assets/Loops-Dv_aLByJ.js +2 -0
- package/web/dist/assets/{Markdown-qjM2_ofS.js → Markdown-X2a3qvOh.js} +14 -14
- package/web/dist/assets/{OperatorHudView-Bs7paWmh.js → OperatorHudView-BPP1dtLz.js} +1 -1
- package/web/dist/assets/{Personal-BY5n4gTw.js → Personal-26VPYkK0.js} +1 -1
- package/web/dist/assets/Tabs-BzKuFskD.js +1 -0
- package/web/dist/assets/{usePoll-O0sJEw1Y.js → activity-Dr7ZMBI3.js} +1 -1
- package/web/dist/assets/{api-CyMRbU2x.js → api-D_ixdyEY.js} +1 -1
- package/web/dist/assets/drawable-zVVDbsyw.js +1 -0
- package/web/dist/assets/index-Ctp-4poP.css +1 -0
- package/web/dist/assets/index-KHt3wE_K.js +2 -0
- package/web/dist/assets/usePoll-DD8VjtSg.js +1 -0
- package/web/dist/index.html +3 -3
- package/web/src/pages/Laws.jsx +0 -1
- package/web/dist/assets/Activity-GaaZWXTY.js +0 -1
- package/web/dist/assets/ActivityDetail-4t7d45Du.js +0 -1
- package/web/dist/assets/Dashboard-CYn7Tp16.js +0 -2
- package/web/dist/assets/Docs-BeFKLg2T.js +0 -5
- package/web/dist/assets/JournalView-1HbU1mfg.js +0 -1
- package/web/dist/assets/Laws-DFoG8JWB.js +0 -3
- package/web/dist/assets/Library-DDjgNwz_.js +0 -1
- package/web/dist/assets/Loops-D9VEoO0F.js +0 -1
- package/web/dist/assets/Tabs-ho-EYD8i.js +0 -1
- package/web/dist/assets/drawable-CLS9drMb.js +0 -1
- package/web/dist/assets/index-CX_hXMi5.css +0 -1
- package/web/dist/assets/index-Cjr7XCA3.js +0 -2
package/src/bricks/review.md
CHANGED
|
@@ -6,12 +6,14 @@ agent: reviewer
|
|
|
6
6
|
outcomes: pass, fail
|
|
7
7
|
---
|
|
8
8
|
Read the card's intent and write set, then read the diff this iteration actually produced. Check
|
|
9
|
-
that the diff matches the intent, stays inside the declared write set,
|
|
10
|
-
unrelated change.
|
|
9
|
+
that the diff matches the intent, stays inside the declared write set, does not smuggle in an
|
|
10
|
+
unrelated change, and keeps any rule in `rules` (e.g. a cited proof that code is unused).
|
|
11
11
|
|
|
12
12
|
Never edit any file — findings go back to `apply`, which makes the fix.
|
|
13
13
|
|
|
14
14
|
Report `pass` if the diff is a faithful, scoped implementation of the card.
|
|
15
15
|
|
|
16
16
|
Report `fail` with concrete findings — `file:line`, what is wrong, what to do instead — if the
|
|
17
|
-
diff drifts from the intent, touches an undeclared file, or leaves an obvious defect behind.
|
|
17
|
+
diff drifts from the intent, touches an undeclared file, breaks a rule, or leaves an obvious defect behind.
|
|
18
|
+
The outcome alone does not carry the findings to `apply` — write them to a file in the OS temp
|
|
19
|
+
directory (never inside the worktree) and report that file's path with the outcome.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec
|
|
3
|
+
description: Write the feature's spec — scope, EARS acceptance criteria, ordered tasks — for the user to review.
|
|
4
|
+
effect: mutate
|
|
5
|
+
agent: architect
|
|
6
|
+
gate: human
|
|
7
|
+
outcomes: pass, fail
|
|
8
|
+
---
|
|
9
|
+
Write `specs/<slug>/spec.md` (the slug of the loop's title) and touch nothing else — no code: the
|
|
10
|
+
problem, what is out of scope, acceptance criteria in EARS form ("WHEN <trigger> THE SYSTEM SHALL
|
|
11
|
+
<response>"), each one testable, and an ordered task list sized to one `identify` card apiece,
|
|
12
|
+
ending with an end-to-end verification task. A gate amendment in LOOP.md's notes answers your
|
|
13
|
+
open questions or corrects the spec: revise the spec to follow it.
|
|
14
|
+
|
|
15
|
+
The user reviews the spec before the loop continues. Report `pass` once every criterion is
|
|
16
|
+
testable, with the spec's path and its criteria count in a file in the OS temp directory — report
|
|
17
|
+
that file's path. Report `fail` if a criterion cannot be stated testably: list the open questions
|
|
18
|
+
in such a file and report its path; the user answers them with an amend.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upgrade-scout
|
|
3
|
+
description: Pick the next dependency upgrade and read its breaking changes, or declare all done.
|
|
4
|
+
effect: read
|
|
5
|
+
agent: researcher
|
|
6
|
+
outcomes: more, done
|
|
7
|
+
---
|
|
8
|
+
Read the requirement and the loop's history (LOOP.md, `git log --format=%(trailers)` on this
|
|
9
|
+
branch). Pick the next package or group the requirement names that is not yet upgraded, skipping
|
|
10
|
+
any release younger than 14 days, and read its changelog or migration guide. Never edit any file.
|
|
11
|
+
|
|
12
|
+
Report `done` when every named package is upgraded. Otherwise report `more` with a card:
|
|
13
|
+
{"intent": "<bump X to N and adapt>", "writeSet": ["<manifest, lockfile, every file to adapt>"],
|
|
14
|
+
"actions": ["<each of: format, imports, rename, logic, new-file, api, delete, architecture>"]}
|
|
15
|
+
Write the breaking changes that hit this repo to a file in the OS temp directory and report that
|
|
16
|
+
file's path with the outcome — the card alone does not carry them to `apply`.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "api-endpoint",
|
|
3
|
+
"description": "Build an HTTP API feature (a Spring MVC controller, say) one endpoint change per iteration: plan, apply, test, write or update the endpoint's Bruno request, run a security review, and review.",
|
|
4
|
+
"category": "development",
|
|
5
|
+
"rules": [
|
|
6
|
+
"The card's write set names the endpoint's .bru requests too, not only the code.",
|
|
7
|
+
"An OpenAPI or Swagger spec edit stops for a human by design; the aggressive preset or trimming LOOP.md's contracts relaxes it."
|
|
8
|
+
],
|
|
9
|
+
"nodes": ["plan", "identify", "apply", "test", "bruno-test", "security-scan", "review"],
|
|
10
|
+
"start": "plan",
|
|
11
|
+
"edges": [
|
|
12
|
+
{ "from": "plan", "on": "pass", "to": "identify" },
|
|
13
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
14
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
15
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
16
|
+
{ "from": "test", "on": "pass", "to": "bruno-test" },
|
|
17
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
18
|
+
{ "from": "bruno-test", "on": "pass", "to": "security-scan" },
|
|
19
|
+
{ "from": "bruno-test", "on": "fail", "to": "$stop" },
|
|
20
|
+
{ "from": "security-scan", "on": "pass", "to": "review" },
|
|
21
|
+
{ "from": "security-scan", "on": "fail", "to": "apply" },
|
|
22
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
23
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
24
|
+
],
|
|
25
|
+
"loops": [
|
|
26
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test", "bruno-test", "security-scan", "review"], "max": 20, "iteration": true },
|
|
27
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
28
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "bruno-test", "security-scan", "review"], "max": 3 }
|
|
29
|
+
],
|
|
30
|
+
"contracts": ["**/openapi*.yaml", "**/openapi*.yml", "**/openapi*.json", "**/swagger*.yaml", "**/swagger*.yml", "**/swagger*.json"]
|
|
31
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "architecture-decision",
|
|
3
|
+
"description": "Record one architecture decision record per decision the requirement names: draft it, have a skeptic attack it, and let the user review the ADR that survives, until every decision is recorded as Proposed.",
|
|
4
|
+
"category": "architecture",
|
|
5
|
+
"rules": [
|
|
6
|
+
"Pick the next undocumented decision; the card's write set is its ADR file."
|
|
7
|
+
],
|
|
8
|
+
"nodes": ["identify", "adr-draft", "adr-challenge"],
|
|
9
|
+
"start": "identify",
|
|
10
|
+
"edges": [
|
|
11
|
+
{ "from": "identify", "on": "more", "to": "adr-draft" },
|
|
12
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
13
|
+
{ "from": "adr-draft", "on": "pass", "to": "adr-challenge" },
|
|
14
|
+
{ "from": "adr-challenge", "on": "pass", "to": "identify" },
|
|
15
|
+
{ "from": "adr-challenge", "on": "fail", "to": "adr-draft" }
|
|
16
|
+
],
|
|
17
|
+
"loops": [
|
|
18
|
+
{ "name": "iterations", "nodes": ["identify", "adr-draft", "adr-challenge"], "max": 8, "iteration": true },
|
|
19
|
+
{ "name": "challenge-fix", "nodes": ["adr-draft", "adr-challenge"], "max": 3 }
|
|
20
|
+
],
|
|
21
|
+
"weights": { "new-file": 0.2, "architecture": 0.2 }
|
|
22
|
+
}
|
package/src/loops/bugfix.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bugfix",
|
|
3
3
|
"description": "Reproduce the bug with a failing test, then iterate: apply the fix, test, and review, until the requirement is met and the reproduction passes.",
|
|
4
|
+
"category": "development",
|
|
4
5
|
"nodes": ["reproduce", "identify", "apply", "test", "review"],
|
|
5
6
|
"start": "reproduce",
|
|
6
7
|
"edges": [
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ci-repair",
|
|
3
|
+
"description": "Read the branch's failing CI checks, fix one code failure per iteration, test, and push, until CI is green or only flaky or infra failures remain.",
|
|
4
|
+
"category": "day-to-day",
|
|
5
|
+
"nodes": ["ci-triage", "ci-fix", "test"],
|
|
6
|
+
"start": "ci-triage",
|
|
7
|
+
"edges": [
|
|
8
|
+
{ "from": "ci-triage", "on": "more", "to": "ci-fix" },
|
|
9
|
+
{ "from": "ci-triage", "on": "done", "to": "$close" },
|
|
10
|
+
{ "from": "ci-fix", "on": "pass", "to": "test" },
|
|
11
|
+
{ "from": "ci-fix", "on": "fail", "to": "$stop" },
|
|
12
|
+
{ "from": "test", "on": "pass", "to": "ci-triage" },
|
|
13
|
+
{ "from": "test", "on": "fail", "to": "ci-fix" }
|
|
14
|
+
],
|
|
15
|
+
"loops": [
|
|
16
|
+
{ "name": "iterations", "nodes": ["ci-triage", "ci-fix", "test"], "max": 10, "iteration": true },
|
|
17
|
+
{ "name": "fix-test", "nodes": ["ci-fix", "test"], "max": 3 }
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "deps-upgrade",
|
|
3
|
+
"description": "Confirm the suite is green, then upgrade one package or group per iteration: read its breaking changes, bump and adapt, test, audit, and review, until every named package is upgraded.",
|
|
4
|
+
"category": "day-to-day",
|
|
5
|
+
"rules": [
|
|
6
|
+
"The card's write set names the manifest, the lockfile and every file the bump adapts."
|
|
7
|
+
],
|
|
8
|
+
"nodes": ["baseline-green", "upgrade-scout", "apply", "test", "deps-audit", "review"],
|
|
9
|
+
"start": "baseline-green",
|
|
10
|
+
"edges": [
|
|
11
|
+
{ "from": "baseline-green", "on": "pass", "to": "upgrade-scout" },
|
|
12
|
+
{ "from": "baseline-green", "on": "fail", "to": "$stop" },
|
|
13
|
+
{ "from": "upgrade-scout", "on": "more", "to": "apply" },
|
|
14
|
+
{ "from": "upgrade-scout", "on": "done", "to": "$close" },
|
|
15
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
16
|
+
{ "from": "test", "on": "pass", "to": "deps-audit" },
|
|
17
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
18
|
+
{ "from": "deps-audit", "on": "pass", "to": "review" },
|
|
19
|
+
{ "from": "deps-audit", "on": "fail", "to": "apply" },
|
|
20
|
+
{ "from": "review", "on": "pass", "to": "upgrade-scout" },
|
|
21
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
22
|
+
],
|
|
23
|
+
"loops": [
|
|
24
|
+
{ "name": "iterations", "nodes": ["upgrade-scout", "apply", "test", "deps-audit", "review"], "max": 20, "iteration": true },
|
|
25
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
26
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "deps-audit", "review"], "max": 3 }
|
|
27
|
+
],
|
|
28
|
+
"ignoreDeletions": ["**/package-lock.json", "**/yarn.lock", "**/pnpm-lock.yaml", "**/*.lock", "**/gradle.lockfile"]
|
|
29
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "enforce-architecture-rule",
|
|
3
|
+
"description": "Confirm the suite is green, encode the requirement's architecture rule as a test with an allowlist of today's violations for the user to review, then fix one violation per iteration, test, and review, until the allowlist is empty.",
|
|
4
|
+
"category": "architecture",
|
|
5
|
+
"rules": [
|
|
6
|
+
"Each fix removes its violation's allowlist entry in the same iteration."
|
|
7
|
+
],
|
|
8
|
+
"nodes": ["baseline-green", "fitness-define", "identify", "apply", "test", "review"],
|
|
9
|
+
"start": "baseline-green",
|
|
10
|
+
"edges": [
|
|
11
|
+
{ "from": "baseline-green", "on": "pass", "to": "fitness-define" },
|
|
12
|
+
{ "from": "baseline-green", "on": "fail", "to": "$stop" },
|
|
13
|
+
{ "from": "fitness-define", "on": "pass", "to": "identify" },
|
|
14
|
+
{ "from": "fitness-define", "on": "fail", "to": "$stop" },
|
|
15
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
16
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
17
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
18
|
+
{ "from": "test", "on": "pass", "to": "review" },
|
|
19
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
20
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
21
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
22
|
+
],
|
|
23
|
+
"loops": [
|
|
24
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test", "review"], "max": 20, "iteration": true },
|
|
25
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
26
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "review"], "max": 3 }
|
|
27
|
+
]
|
|
28
|
+
}
|
package/src/loops/feature.json
CHANGED
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "feature",
|
|
3
|
-
"description": "Plan the feature into ordered iterations, then build each one: apply, test, and review, until the plan is complete.",
|
|
4
|
-
"
|
|
3
|
+
"description": "Plan the feature into ordered iterations, then build each one: apply, test, and review, until the plan is complete — and an independent done-check maps every requirement to a passing test before the loop closes.",
|
|
4
|
+
"category": "development",
|
|
5
|
+
"nodes": ["plan", "identify", "apply", "test", "review", "done-check"],
|
|
5
6
|
"start": "plan",
|
|
6
7
|
"edges": [
|
|
7
8
|
{ "from": "plan", "on": "pass", "to": "identify" },
|
|
8
9
|
{ "from": "identify", "on": "more", "to": "apply" },
|
|
9
|
-
{ "from": "identify", "on": "done", "to": "
|
|
10
|
+
{ "from": "identify", "on": "done", "to": "done-check" },
|
|
10
11
|
{ "from": "apply", "on": "pass", "to": "test" },
|
|
11
12
|
{ "from": "test", "on": "pass", "to": "review" },
|
|
12
13
|
{ "from": "test", "on": "fail", "to": "apply" },
|
|
13
14
|
{ "from": "review", "on": "pass", "to": "identify" },
|
|
14
|
-
{ "from": "review", "on": "fail", "to": "apply" }
|
|
15
|
+
{ "from": "review", "on": "fail", "to": "apply" },
|
|
16
|
+
{ "from": "done-check", "on": "pass", "to": "$close" },
|
|
17
|
+
{ "from": "done-check", "on": "fail", "to": "identify" }
|
|
15
18
|
],
|
|
16
19
|
"loops": [
|
|
17
|
-
{ "name": "iterations", "nodes": ["identify", "apply", "test", "review"], "max": 20, "iteration": true },
|
|
20
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test", "review", "done-check"], "max": 20, "iteration": true },
|
|
18
21
|
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
19
22
|
{ "name": "review-fix", "nodes": ["apply", "test", "review"], "max": 3 }
|
|
20
23
|
]
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fix-flaky-tests",
|
|
3
|
+
"description": "Confirm the suspected flaky tests by 20 repeated runs, then fix one per iteration at its root cause, re-confirm it with 20 runs, test, and review.",
|
|
4
|
+
"category": "tests",
|
|
5
|
+
"rules": [
|
|
6
|
+
"Fix at the root cause — shared state, ordering, time, concurrency — never with a retry, a sleep or a longer timeout.",
|
|
7
|
+
"A test that fails every run is a bug for the bugfix template; one that never fails is not fixed."
|
|
8
|
+
],
|
|
9
|
+
"nodes": ["flake-repro", "identify", "apply", "flake-check", "test", "review"],
|
|
10
|
+
"start": "flake-repro",
|
|
11
|
+
"edges": [
|
|
12
|
+
{ "from": "flake-repro", "on": "flaky", "to": "identify" },
|
|
13
|
+
{ "from": "flake-repro", "on": "stable", "to": "$stop" },
|
|
14
|
+
{ "from": "flake-repro", "on": "broken", "to": "$stop" },
|
|
15
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
16
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
17
|
+
{ "from": "apply", "on": "pass", "to": "flake-check" },
|
|
18
|
+
{ "from": "flake-check", "on": "stable", "to": "test" },
|
|
19
|
+
{ "from": "flake-check", "on": "flaky", "to": "apply" },
|
|
20
|
+
{ "from": "test", "on": "pass", "to": "review" },
|
|
21
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
22
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
23
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
24
|
+
],
|
|
25
|
+
"loops": [
|
|
26
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "flake-check", "test", "review"], "max": 10, "iteration": true },
|
|
27
|
+
{ "name": "stabilise", "nodes": ["apply", "flake-check"], "max": 4 },
|
|
28
|
+
{ "name": "review-fix", "nodes": ["apply", "flake-check", "test", "review"], "max": 3 }
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "legacy-refactor",
|
|
3
|
+
"description": "Confirm the suite is green, pin the code's current behaviour with characterization tests in their own commit, then refactor behind that net: apply, test, and review, until the requirement is met.",
|
|
4
|
+
"category": "refactoring",
|
|
5
|
+
"nodes": ["baseline-green", "characterize", "identify", "apply", "test", "review"],
|
|
6
|
+
"start": "baseline-green",
|
|
7
|
+
"edges": [
|
|
8
|
+
{ "from": "baseline-green", "on": "pass", "to": "characterize" },
|
|
9
|
+
{ "from": "baseline-green", "on": "fail", "to": "$stop" },
|
|
10
|
+
{ "from": "characterize", "on": "pass", "to": "identify" },
|
|
11
|
+
{ "from": "characterize", "on": "fail", "to": "$stop" },
|
|
12
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
13
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
14
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
15
|
+
{ "from": "test", "on": "pass", "to": "review" },
|
|
16
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
17
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
18
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
19
|
+
],
|
|
20
|
+
"loops": [
|
|
21
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test", "review"], "max": 20, "iteration": true },
|
|
22
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
23
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "review"], "max": 3 }
|
|
24
|
+
],
|
|
25
|
+
"weights": { "logic": 0.6 }
|
|
26
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "legacy-tests",
|
|
3
|
+
"description": "Confirm the suite is green, then pin legacy behaviour one change point at a time: characterization tests, a run, and a mutation check that proves they bite.",
|
|
4
|
+
"category": "tests",
|
|
5
|
+
"rules": [
|
|
6
|
+
"Tests only: production code is never touched."
|
|
7
|
+
],
|
|
8
|
+
"nodes": ["baseline-green", "identify", "characterize", "test", "mutation-check"],
|
|
9
|
+
"start": "baseline-green",
|
|
10
|
+
"edges": [
|
|
11
|
+
{ "from": "baseline-green", "on": "pass", "to": "identify" },
|
|
12
|
+
{ "from": "baseline-green", "on": "fail", "to": "$stop" },
|
|
13
|
+
{ "from": "identify", "on": "more", "to": "characterize" },
|
|
14
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
15
|
+
{ "from": "characterize", "on": "pass", "to": "test" },
|
|
16
|
+
{ "from": "characterize", "on": "fail", "to": "$stop" },
|
|
17
|
+
{ "from": "test", "on": "pass", "to": "mutation-check" },
|
|
18
|
+
{ "from": "test", "on": "fail", "to": "characterize" },
|
|
19
|
+
{ "from": "mutation-check", "on": "pass", "to": "identify" },
|
|
20
|
+
{ "from": "mutation-check", "on": "fail", "to": "characterize" },
|
|
21
|
+
{ "from": "mutation-check", "on": "unavailable", "to": "identify" }
|
|
22
|
+
],
|
|
23
|
+
"loops": [
|
|
24
|
+
{ "name": "iterations", "nodes": ["identify", "characterize", "test", "mutation-check"], "max": 20, "iteration": true },
|
|
25
|
+
{ "name": "write-run", "nodes": ["characterize", "test"], "max": 3 },
|
|
26
|
+
{ "name": "kill-mutants", "nodes": ["characterize", "test", "mutation-check"], "max": 3 }
|
|
27
|
+
],
|
|
28
|
+
"weights": { "new-file": 0.2 }
|
|
29
|
+
}
|
package/src/loops/refactor.json
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "refactor",
|
|
3
|
-
"description": "Confirm the suite is green before touching anything, then iterate on the shape of the code alone.
|
|
3
|
+
"description": "Confirm the suite is green before touching anything, then iterate on the shape of the code alone.",
|
|
4
|
+
"category": "refactoring",
|
|
5
|
+
"rules": [
|
|
6
|
+
"Tests are not edited: a refactor that needs a different test is a behaviour change, not a refactor."
|
|
7
|
+
],
|
|
4
8
|
"nodes": ["baseline-green", "identify", "apply", "test"],
|
|
5
9
|
"start": "baseline-green",
|
|
6
10
|
"edges": [
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "remove-dead-code",
|
|
3
|
+
"description": "Confirm the suite is green, then remove one coherent group of unused code per iteration — exports, classes, files, retired flags — test it, and review it. Deletions score soft, not blocking.",
|
|
4
|
+
"category": "refactoring",
|
|
5
|
+
"rules": [
|
|
6
|
+
"Each card's intent cites the proof it is unused: the requirement's tool output (knip, ts-prune, vulture, PMD or IntelliJ inspections) and a reference search (git grep over code AND resources) for reflection, DI by name, Spring bean names and config.",
|
|
7
|
+
"Generated sources do not count as unused.",
|
|
8
|
+
"Public entry points belong in LOOP.md's contracts, not in a deletion."
|
|
9
|
+
],
|
|
10
|
+
"nodes": ["baseline-green", "identify", "apply", "test", "review"],
|
|
11
|
+
"start": "baseline-green",
|
|
12
|
+
"edges": [
|
|
13
|
+
{ "from": "baseline-green", "on": "pass", "to": "identify" },
|
|
14
|
+
{ "from": "baseline-green", "on": "fail", "to": "$stop" },
|
|
15
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
16
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
17
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
18
|
+
{ "from": "test", "on": "pass", "to": "review" },
|
|
19
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
20
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
21
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
22
|
+
],
|
|
23
|
+
"loops": [
|
|
24
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test", "review"], "max": 20, "iteration": true },
|
|
25
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
26
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "review"], "max": 3 }
|
|
27
|
+
],
|
|
28
|
+
"weights": { "delete": 0.5 },
|
|
29
|
+
"ignoreDeletions": ["**/generated/**", "**/generated-sources/**", "**/target/**", "**/build/generated/**"]
|
|
30
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "spec-first-feature",
|
|
3
|
+
"description": "Write the feature's spec first — specs/<slug>/spec.md with EARS acceptance criteria and an ordered task list — for the user to review, commit it, then build it task by task: apply, test, review. An independent done-check maps every criterion to a passing test before the loop closes.",
|
|
4
|
+
"category": "development",
|
|
5
|
+
"rules": [
|
|
6
|
+
"One spec task per iteration, in the spec's order.",
|
|
7
|
+
"Open questions in the spec wait for the user's answers; never answer them yourself."
|
|
8
|
+
],
|
|
9
|
+
"nodes": ["spec", "identify", "apply", "test", "review", "done-check"],
|
|
10
|
+
"start": "spec",
|
|
11
|
+
"edges": [
|
|
12
|
+
{ "from": "spec", "on": "pass", "to": "identify" },
|
|
13
|
+
{ "from": "spec", "on": "fail", "to": "$stop" },
|
|
14
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
15
|
+
{ "from": "identify", "on": "done", "to": "done-check" },
|
|
16
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
17
|
+
{ "from": "test", "on": "pass", "to": "review" },
|
|
18
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
19
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
20
|
+
{ "from": "review", "on": "fail", "to": "apply" },
|
|
21
|
+
{ "from": "done-check", "on": "pass", "to": "$close" },
|
|
22
|
+
{ "from": "done-check", "on": "fail", "to": "identify" }
|
|
23
|
+
],
|
|
24
|
+
"loops": [
|
|
25
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test", "review", "done-check"], "max": 20, "iteration": true },
|
|
26
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
27
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "review"], "max": 3 }
|
|
28
|
+
]
|
|
29
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tdd",
|
|
3
|
+
"description": "Plan the work, then build it test-first: each iteration writes a failing test, makes it pass, and reviews the diff, until the plan is complete.",
|
|
4
|
+
"category": "tests",
|
|
5
|
+
"nodes": ["plan", "identify", "red-test", "apply", "test", "review"],
|
|
6
|
+
"start": "plan",
|
|
7
|
+
"edges": [
|
|
8
|
+
{ "from": "plan", "on": "pass", "to": "identify" },
|
|
9
|
+
{ "from": "identify", "on": "more", "to": "red-test" },
|
|
10
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
11
|
+
{ "from": "red-test", "on": "red", "to": "apply" },
|
|
12
|
+
{ "from": "red-test", "on": "green", "to": "test" },
|
|
13
|
+
{ "from": "red-test", "on": "untestable", "to": "$stop" },
|
|
14
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
15
|
+
{ "from": "test", "on": "pass", "to": "review" },
|
|
16
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
17
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
18
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
19
|
+
],
|
|
20
|
+
"loops": [
|
|
21
|
+
{ "name": "iterations", "nodes": ["identify", "red-test", "apply", "test", "review"], "max": 20, "iteration": true },
|
|
22
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
23
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "review"], "max": 3 }
|
|
24
|
+
]
|
|
25
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "update-contract",
|
|
3
|
+
"description": "Change an interface with live consumers — an API, a schema, an event — as expand, migrate one consumer per iteration, contract: plan it for the user to review, then apply, test, check old and new consumers, and review.",
|
|
4
|
+
"category": "architecture",
|
|
5
|
+
"rules": [
|
|
6
|
+
"Contract files (OpenAPI, AsyncAPI, protobuf, Avro, GraphQL schemas, Flyway and Liquibase migrations) stop for a human by default; a stop on one is expected, not a failure.",
|
|
7
|
+
"`geneseed loop init --contracts <globs>` appends more contract globs, and LOOP.md's `contracts` can be trimmed."
|
|
8
|
+
],
|
|
9
|
+
"nodes": ["migration-plan", "identify", "apply", "test", "compat-check", "review"],
|
|
10
|
+
"start": "migration-plan",
|
|
11
|
+
"edges": [
|
|
12
|
+
{ "from": "migration-plan", "on": "pass", "to": "identify" },
|
|
13
|
+
{ "from": "migration-plan", "on": "fail", "to": "$stop" },
|
|
14
|
+
{ "from": "identify", "on": "more", "to": "apply" },
|
|
15
|
+
{ "from": "identify", "on": "done", "to": "$close" },
|
|
16
|
+
{ "from": "apply", "on": "pass", "to": "test" },
|
|
17
|
+
{ "from": "test", "on": "pass", "to": "compat-check" },
|
|
18
|
+
{ "from": "test", "on": "fail", "to": "apply" },
|
|
19
|
+
{ "from": "compat-check", "on": "pass", "to": "review" },
|
|
20
|
+
{ "from": "compat-check", "on": "fail", "to": "apply" },
|
|
21
|
+
{ "from": "review", "on": "pass", "to": "identify" },
|
|
22
|
+
{ "from": "review", "on": "fail", "to": "apply" }
|
|
23
|
+
],
|
|
24
|
+
"loops": [
|
|
25
|
+
{ "name": "iterations", "nodes": ["identify", "apply", "test", "compat-check", "review"], "max": 20, "iteration": true },
|
|
26
|
+
{ "name": "apply-test", "nodes": ["apply", "test"], "max": 5 },
|
|
27
|
+
{ "name": "review-fix", "nodes": ["apply", "test", "compat-check", "review"], "max": 3 }
|
|
28
|
+
],
|
|
29
|
+
"contracts": [
|
|
30
|
+
"**/openapi*.yaml", "**/openapi*.yml", "**/openapi*.json", "**/asyncapi*.yaml", "**/*.proto", "**/*.avsc",
|
|
31
|
+
"**/*.graphqls", "**/*.graphql", "**/asyncapi*.yml", "**/asyncapi*.json", "**/db/migration/**", "**/db/changelog/**"
|
|
32
|
+
]
|
|
33
|
+
}
|
|
@@ -32,7 +32,9 @@ that…".
|
|
|
32
32
|
<4-10 lines of direct instructions, ending with exactly how to choose among the outcomes>
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
No double-brace tokens in the body: the loop hands it to the model raw.
|
|
35
|
+
No double-brace tokens in the body: the loop hands it to the model raw. If the brick finds
|
|
36
|
+
something the next brick needs, have it write that to a file in the OS temp directory and
|
|
37
|
+
report the path with the outcome — the loop skill records it as a note.
|
|
36
38
|
3. **Overriding by name** — a project or global brick named like a shipped one replaces it in
|
|
37
39
|
every template. That is allowed; say so to the user. `geneseed loop check` lists overrides under `overridden`.
|
|
38
40
|
4. **Check it:** `geneseed loop check --brick <path>` (this file alone), then
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
> {{DESC_BRUNO_COLLECTION_GENERATOR}}
|
|
4
4
|
|
|
5
5
|
**Trigger:** creating, converting, or reorganising a [Bruno](https://www.usebruno.com/)
|
|
6
|
-
collection
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
collection as `.bru` files or OpenCollection YAML. The collection covers requests,
|
|
7
|
+
folders, environments and request docs; the source can be backend routes, an OpenAPI
|
|
8
|
+
snippet, pasted API docs, curl commands, or a plain endpoint list.
|
|
9
9
|
|
|
10
10
|
## Procedure
|
|
11
11
|
1. Gather the inputs, and state every assumption you fill in ({{LAW:echo-the-intent}}): the source
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
> {{DESC_BRUNO_TEST_WRITER}}
|
|
4
4
|
|
|
5
5
|
**Trigger:** writing, reviewing, or strengthening tests for a [Bruno](https://www.usebruno.com/)
|
|
6
|
-
request or collection
|
|
7
|
-
scripts, request chaining, schema checks,
|
|
8
|
-
|
|
6
|
+
request or collection in `.bru` files or OpenCollection YAML. Covers assertions, `tests`
|
|
7
|
+
blocks, pre-request and post-response scripts, request chaining, schema checks, and
|
|
8
|
+
edge cases.
|
|
9
9
|
|
|
10
10
|
## Procedure
|
|
11
11
|
1. Understand the request or collection first: method, path, auth, body, headers,
|
package/src/skills/ci-fix.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
> {{DESC_CI_FIX}}
|
|
4
4
|
|
|
5
|
-
**Trigger:** a CI run, pipeline job, or pre-merge check is red
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
**Trigger:** a CI run, pipeline job, or pre-merge check is red, or the user says "CI is
|
|
6
|
+
failing", "fix the build", "why is the pipeline red". The red run can be on a PR the agent
|
|
7
|
+
opened, the branch it is on, or one the user points at. The [debug {{SKILL}}](debug.md) drives
|
|
8
8
|
the root-causing once the failure reproduces locally; this {{SKILL}} gets it there and
|
|
9
9
|
gets the fix back through the same gate.
|
|
10
10
|
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
> {{DESC_CONSOLIDATE_MEMORY}}
|
|
4
4
|
|
|
5
|
-
**Trigger:** the {{MEMORY}} index has
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
**Trigger:** the {{MEMORY}} index has outgrown one useful read (~40 lines) or holds
|
|
6
|
+
duplicate, contradictory, or stale entries. Stale means a memory naming a file, flag, or
|
|
7
|
+
command that no longer exists; a `feedback` lesson that keeps recurring counts too, as
|
|
8
|
+
does the user saying "clean up memory", "consolidate", "what do you actually remember". Also worth a
|
|
9
9
|
pass after a release or a large refactor, when many recorded facts just changed. The
|
|
10
10
|
[rule {{SKILL}}](rule.md) writes one memory or one rule; this {{SKILL}} tends the
|
|
11
11
|
whole set. The user's wiki is out of scope — that is the [wiki {{SKILL}}](wiki.md).
|
package/src/skills/council.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> {{DESC_COUNCIL}}
|
|
4
4
|
|
|
5
|
-
**Trigger:** the user asks to "convene a council", "debate this", "argue both sides",
|
|
5
|
+
**Trigger:** the user asks to "convene a council", "debate this", or "argue both sides", or wants a decision stress-tested from several points of view. A change, plan, or claim all qualify, as long as it is challenged before committing to it.
|
|
6
6
|
|
|
7
7
|
## Procedure
|
|
8
8
|
1. Frame the motion in one line — the exact decision, change, or claim under debate — and name what it feeds (a choice to make, a design to accept, a discussion to settle). Ground it in the real artifact and the project's own docs ({{DOCTRINE:read-the-docs-first}}) so the council argues the actual thing; if the motion is unclear or bundles several questions, split it and ask once, then proceed.
|
package/src/skills/fresh-eyes.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> {{DESC_FRESH_EYES}}
|
|
4
4
|
|
|
5
|
-
**Trigger:**
|
|
5
|
+
**Trigger:** work is claimed done and needs a blind check against the original ask. That is before merge or handoff, while the solving session believes the artifact works, or when the user asks to "validate", "fresh eyes", "prove it meets the spec", "did this actually solve it", or "independent sign-off" — and the cost of a confidently-wrong "done" is high. This re-judges the *result* from zero context — distinct from [geneseed-code-review](geneseed-code-review.md), which reviews a *diff* with full knowledge of the change. For an open-ended quality critique use [roast-me](roast-me.md); for a multi-stance debate over an undecided question use [council](council.md).
|
|
6
6
|
|
|
7
7
|
## Procedure
|
|
8
8
|
1. Capture the firewall input as TWO things and nothing else: (a) the **verbatim original task/spec** — the raw issue or request text, NOT a solver-written summary or "spec card" (a distilled card launders the solving session's framing into the rubric, the very bias this {{SKILL}} exists to defeat), and (b) a pointer to the **final artifact** as it stands — file paths, built output, or the command to run it. If the raw task is too thin to yield acceptance criteria, have the **user** (never the solver) confirm a one-line acceptance bar, then proceed ({{LAW:echo-the-intent}}); if it is too fuzzy even for that, this is a judgement call — convene [council](council.md) instead.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> {{DESC_GIT_ARCHAEOLOGY}}
|
|
4
4
|
|
|
5
|
-
**Trigger:**
|
|
5
|
+
**Trigger:** something must be learned *from* the history — when a regression was
|
|
6
6
|
introduced, who last touched a line and why, or where a symbol or string entered the
|
|
7
7
|
codebase. Read-only: this {{SKILL}} investigates, it does not change history (to repair
|
|
8
8
|
or rewrite, use git-rescue.md; to write a new commit, use commit.md).
|
package/src/skills/git-rescue.md
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
> {{DESC_GIT_RESCUE}}
|
|
4
4
|
|
|
5
|
-
**Trigger:**
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
**Trigger:** commits are lost, a rebase/merge/reset went wrong, or history is to be
|
|
6
|
+
deliberately rewritten (interactive rebase, squash, amend). The repository can also be
|
|
7
|
+
messy in other ways: a detached HEAD, a half-finished operation, or work stranded in a
|
|
8
|
+
stash. For
|
|
8
9
|
finding *when/why* something changed without altering history, use git-archaeology.md.
|
|
9
10
|
|
|
10
11
|
## Procedure
|
package/src/skills/handoff.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> {{DESC_HANDOFF}}
|
|
4
4
|
|
|
5
|
-
**Trigger:** the context window is filling, a session is ending mid-task, or
|
|
5
|
+
**Trigger:** the context window is filling, a session is ending mid-task, or work is passing to another agent or developer.
|
|
6
6
|
|
|
7
7
|
## Procedure
|
|
8
8
|
1. Capture the state in the worklog (`WORKLOG.md` or the task's plan file): the goal, what's done, the step in progress, and the exact next step.
|