geneseed 3.12.0 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/README.md +2 -2
  3. package/SHIPPED.md +1 -1
  4. package/adapters/bob/README.md +1 -1
  5. package/adapters/claude-code/README.md +1 -1
  6. package/adapters/openclaude/README.md +1 -1
  7. package/adapters/opencode/README.md +3 -3
  8. package/docs/README.md +41 -22
  9. package/docs/concepts/agents.md +3 -1
  10. package/docs/concepts/collaboration.md +3 -1
  11. package/docs/concepts/exclusions.md +4 -2
  12. package/docs/concepts/footprint.md +3 -1
  13. package/docs/concepts/foreman-mode.md +3 -1
  14. package/docs/concepts/hook-gates.md +61 -0
  15. package/docs/concepts/hooks.md +8 -56
  16. package/docs/concepts/host-matrix.md +38 -0
  17. package/docs/concepts/hosts.md +6 -32
  18. package/docs/concepts/loop-branch.md +66 -0
  19. package/docs/concepts/loop-bricks.md +48 -0
  20. package/docs/concepts/loop-contracts.md +33 -0
  21. package/docs/concepts/loop-gates.md +30 -0
  22. package/docs/concepts/loop-notes.md +43 -0
  23. package/docs/concepts/loop-risk.md +36 -0
  24. package/docs/concepts/loop-templates.md +50 -0
  25. package/docs/concepts/loops.md +24 -116
  26. package/docs/concepts/lsp.md +2 -0
  27. package/docs/concepts/memory.md +3 -1
  28. package/docs/concepts/notebook.md +3 -1
  29. package/docs/concepts/rules.md +4 -2
  30. package/docs/concepts/skills.md +3 -1
  31. package/docs/concepts/themes.md +3 -1
  32. package/docs/extending.md +23 -8
  33. package/docs/guides/autostart.md +3 -1
  34. package/docs/guides/choose-your-setup.md +5 -80
  35. package/docs/guides/headless.md +5 -3
  36. package/docs/guides/install-agent-md.md +37 -0
  37. package/docs/guides/install-bob.md +20 -0
  38. package/docs/guides/install-claude-code.md +22 -0
  39. package/docs/guides/install-clone.md +34 -0
  40. package/docs/guides/install-openclaude.md +25 -0
  41. package/docs/guides/install-opencode.md +35 -0
  42. package/docs/guides/install-scripted.md +21 -0
  43. package/docs/guides/install.md +9 -118
  44. package/docs/guides/loop-finish.md +54 -0
  45. package/docs/guides/loop-running.md +66 -0
  46. package/docs/guides/loop-which-template.md +35 -0
  47. package/docs/guides/mcp-filesystem.md +41 -0
  48. package/docs/guides/mcp-gitlab.md +66 -0
  49. package/docs/guides/mcp-markitdown.md +36 -0
  50. package/docs/guides/mcp.md +8 -137
  51. package/docs/guides/migrate.md +3 -1
  52. package/docs/guides/project-context.md +4 -2
  53. package/docs/guides/read-non-markdown.md +17 -0
  54. package/docs/guides/run-a-loop.md +64 -0
  55. package/docs/guides/run-anywhere.md +2 -0
  56. package/docs/guides/setup-doctrines.md +55 -0
  57. package/docs/guides/setup-footprint.md +48 -0
  58. package/docs/guides/uninstall.md +3 -1
  59. package/docs/guides/upgrade.md +3 -1
  60. package/docs/guides/verify.md +3 -1
  61. package/docs/guides/wiki.md +3 -1
  62. package/docs/guides/worktree.md +3 -1
  63. package/docs/reference/about.md +3 -1
  64. package/docs/reference/cli.md +2 -0
  65. package/docs/reference/env-context.md +40 -0
  66. package/docs/reference/environment.md +10 -59
  67. package/docs/reference/glossary.md +3 -1
  68. package/docs/reference/loop-actions.md +20 -0
  69. package/docs/reference/opencode-plugins.md +14 -118
  70. package/docs/reference/plugin-activity.md +20 -0
  71. package/docs/reference/plugin-context.md +27 -0
  72. package/docs/reference/plugin-guard.md +27 -0
  73. package/docs/reference/plugin-learn.md +27 -0
  74. package/docs/reference/plugin-notify.md +20 -0
  75. package/docs/reference/plugin-ponytail.md +19 -0
  76. package/docs/reference/plugin-workflow.md +25 -0
  77. package/docs/reference/troubleshoot-doctor.md +50 -0
  78. package/docs/reference/troubleshoot-hooks.md +99 -0
  79. package/docs/reference/troubleshoot-install.md +108 -0
  80. package/docs/reference/troubleshoot-tools.md +56 -0
  81. package/docs/reference/troubleshoot-update.md +23 -0
  82. package/docs/reference/troubleshoot-web.md +66 -0
  83. package/docs/reference/troubleshooting.md +13 -337
  84. package/docs/understand/a-day.md +3 -1
  85. package/docs/understand/enforced-vs-asked.md +3 -1
  86. package/docs/understand/harness.md +2 -0
  87. package/docs/understand/machine-bob.md +17 -0
  88. package/docs/understand/machine-claude.md +35 -0
  89. package/docs/understand/machine-opencode.md +36 -0
  90. package/docs/understand/on-your-machine.md +12 -55
  91. package/docs/understand/take-it-out.md +13 -0
  92. package/docs/web-ui.md +35 -15
  93. package/harness.config.json +1 -1
  94. package/js/README.md +11 -3
  95. package/js/cli-table.json +27 -1
  96. package/js/hosts/mcp.mjs +1 -1
  97. package/js/hosts/native.mjs +43 -5
  98. package/js/inspect/checks-build.mjs +28 -0
  99. package/js/loop/catalog.mjs +12 -1
  100. package/js/loop/cli.mjs +28 -6
  101. package/js/loop/graph.mjs +18 -0
  102. package/js/loop/registry.mjs +196 -0
  103. package/js/loop/score.mjs +45 -6
  104. package/js/loop/state.mjs +125 -11
  105. package/js/maintain/setup.mjs +1 -1
  106. package/js/web/actions.mjs +25 -0
  107. package/js/web/api.mjs +13 -0
  108. package/js/web/docs.mjs +64 -12
  109. package/js/web/routes.mjs +5 -1
  110. package/package.json +1 -1
  111. package/src/agents/explorer.md +2 -2
  112. package/src/agents/researcher.md +3 -3
  113. package/src/bricks/README.md +3 -1
  114. package/src/bricks/adr-challenge.md +20 -0
  115. package/src/bricks/adr-draft.md +15 -0
  116. package/src/bricks/characterize.md +17 -0
  117. package/src/bricks/ci-fix.md +2 -1
  118. package/src/bricks/ci-triage.md +20 -0
  119. package/src/bricks/compat-check.md +16 -0
  120. package/src/bricks/done-check.md +16 -0
  121. package/src/bricks/fitness-define.md +22 -0
  122. package/src/bricks/flake-check.md +17 -0
  123. package/src/bricks/flake-repro.md +18 -0
  124. package/src/bricks/identify.md +6 -3
  125. package/src/bricks/migration-plan.md +21 -0
  126. package/src/bricks/mutation-check.md +18 -0
  127. package/src/bricks/plan.md +6 -6
  128. package/src/bricks/red-test.md +16 -0
  129. package/src/bricks/review.md +5 -3
  130. package/src/bricks/spec.md +18 -0
  131. package/src/bricks/upgrade-scout.md +16 -0
  132. package/src/loops/api-endpoint.json +31 -0
  133. package/src/loops/architecture-decision.json +22 -0
  134. package/src/loops/bugfix.json +1 -0
  135. package/src/loops/ci-repair.json +19 -0
  136. package/src/loops/deps-upgrade.json +29 -0
  137. package/src/loops/enforce-architecture-rule.json +28 -0
  138. package/src/loops/feature.json +8 -5
  139. package/src/loops/fix-flaky-tests.json +30 -0
  140. package/src/loops/legacy-refactor.json +26 -0
  141. package/src/loops/legacy-tests.json +29 -0
  142. package/src/loops/refactor.json +5 -1
  143. package/src/loops/remove-dead-code.json +30 -0
  144. package/src/loops/spec-first-feature.json +29 -0
  145. package/src/loops/tdd.json +25 -0
  146. package/src/loops/update-contract.json +33 -0
  147. package/src/skills/brick-forge.md +3 -1
  148. package/src/skills/bruno-collection-generator.md +3 -3
  149. package/src/skills/bruno-test-writer.md +3 -3
  150. package/src/skills/ci-fix.md +3 -3
  151. package/src/skills/consolidate-memory.md +4 -4
  152. package/src/skills/council.md +1 -1
  153. package/src/skills/fresh-eyes.md +1 -1
  154. package/src/skills/git-archaeology.md +1 -1
  155. package/src/skills/git-rescue.md +4 -3
  156. package/src/skills/handoff.md +1 -1
  157. package/src/skills/herdr.md +1 -1
  158. package/src/skills/learn-mode.md +2 -2
  159. package/src/skills/loop.md +22 -10
  160. package/src/skills/opencode-theme.md +3 -3
  161. package/src/skills/ponytail.md +1 -1
  162. package/src/skills/profile.md +3 -4
  163. package/src/skills/prose.md +2 -3
  164. package/src/skills/quiz.md +1 -1
  165. package/src/skills/react-view-transitions/SKILL.md +1 -1
  166. package/src/skills/react-view-transitions/VENDOR.md +8 -3
  167. package/src/skills/research.md +3 -3
  168. package/src/skills/review-response.md +2 -2
  169. package/src/skills/rule.md +3 -3
  170. package/src/skills/security-audit.md +4 -4
  171. package/src/skills/teach.md +1 -1
  172. package/src/skills/wiki.md +3 -3
  173. package/src/skills/workflow.md +4 -4
  174. package/src/skills/worktree.md +2 -2
  175. package/web/dist/assets/Activity-Ca2Aruu7.js +1 -0
  176. package/web/dist/assets/ActivityDetail-Bo7v4Z_r.js +1 -0
  177. package/web/dist/assets/Dashboard-BuMq46aT.js +2 -0
  178. package/web/dist/assets/Docs-BzccCllG.js +5 -0
  179. package/web/dist/assets/FilterInput-CBcJBQPI.js +1 -0
  180. package/web/dist/assets/GreenhouseView-BCIKcnGG.js +2 -0
  181. package/web/dist/assets/Installs-DMFJvq7s.js +2 -0
  182. package/web/dist/assets/JournalView-o1rmd1_1.js +1 -0
  183. package/web/dist/assets/Laws-BANxq_I_.js +3 -0
  184. package/web/dist/assets/Library-DW4x0fbh.js +1 -0
  185. package/web/dist/assets/Loops-DEBibbBP.js +2 -0
  186. package/web/dist/assets/{Markdown-qjM2_ofS.js → Markdown-CdTX0kLe.js} +14 -14
  187. package/web/dist/assets/OperatorHudView-CLD0fYaA.js +2 -0
  188. package/web/dist/assets/Personal-6uMJvyBG.js +1 -0
  189. package/web/dist/assets/Tabs-BubnyZhF.js +1 -0
  190. package/web/dist/assets/activity-CObqyxkL.js +1 -0
  191. package/web/dist/assets/{api-CyMRbU2x.js → api-D_ixdyEY.js} +1 -1
  192. package/web/dist/assets/drawable-C_x5xncq.js +1 -0
  193. package/web/dist/assets/index-CMPgezFm.js +2 -0
  194. package/web/dist/assets/index-DMsT4Aa6.css +1 -0
  195. package/web/dist/assets/{react-B9Z_tXRV.js → react-Bbzhmq4v.js} +1 -1
  196. package/web/dist/assets/rolldown-runtime-hePW80VL.js +1 -0
  197. package/web/dist/assets/sections-Dg23Hel5.js +1 -0
  198. package/web/dist/assets/usePoll-BOqeunzF.js +1 -0
  199. package/web/dist/index.html +6 -5
  200. package/web/dist/assets/Activity-GaaZWXTY.js +0 -1
  201. package/web/dist/assets/ActivityDetail-4t7d45Du.js +0 -1
  202. package/web/dist/assets/Dashboard-CYn7Tp16.js +0 -2
  203. package/web/dist/assets/Docs-BeFKLg2T.js +0 -5
  204. package/web/dist/assets/FilterInput-CVyqmYWM.js +0 -1
  205. package/web/dist/assets/GreenhouseView-C6ibc8IE.js +0 -2
  206. package/web/dist/assets/Installs-DRYjYnxs.js +0 -2
  207. package/web/dist/assets/JournalView-1HbU1mfg.js +0 -1
  208. package/web/dist/assets/Laws-DFoG8JWB.js +0 -3
  209. package/web/dist/assets/Library-DDjgNwz_.js +0 -1
  210. package/web/dist/assets/Loops-D9VEoO0F.js +0 -1
  211. package/web/dist/assets/OperatorHudView-Bs7paWmh.js +0 -2
  212. package/web/dist/assets/Personal-BY5n4gTw.js +0 -1
  213. package/web/dist/assets/Tabs-ho-EYD8i.js +0 -1
  214. package/web/dist/assets/drawable-CLS9drMb.js +0 -1
  215. package/web/dist/assets/index-CX_hXMi5.css +0 -1
  216. package/web/dist/assets/index-Cjr7XCA3.js +0 -2
  217. package/web/dist/assets/sections-GalMS0Zv.js +0 -1
  218. package/web/dist/assets/usePoll-O0sJEw1Y.js +0 -1
@@ -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 — requests, folders, environments, request docs — from backend routes, an
7
- OpenAPI snippet, pasted API docs, curl commands, or a plain endpoint list, as `.bru`
8
- files or OpenCollection YAML.
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 — assertions, `tests` blocks, pre-request and post-response
7
- scripts, request chaining, schema checks, edge cases — in `.bru` files or
8
- OpenCollection YAML.
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,
@@ -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 — on a PR you opened, a
6
- branch you are on, or one the user points you at — or the user says "CI is failing",
7
- "fix the build", "why is the pipeline red". The [debug {{SKILL}}](debug.md) drives
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 grown past what a session can usefully read
6
- (~40 lines), two entries say the same or opposite things, a memory names a file, flag,
7
- or command that no longer exists, a `feedback` lesson keeps recurring, or the user
8
- says "clean up memory", "consolidate", "what do you actually remember". Also worth a
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).
@@ -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", "stress-test this decision", or wants a change, plan, or claim challenged from several points of view before committing to it.
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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  > {{DESC_FRESH_EYES}}
4
4
 
5
- **Trigger:** a task is claimed done and the solving session believes the artifact works — before merge or handoff, 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).
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:** you need to learn something *from* the history — when a regression was
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).
@@ -2,9 +2,10 @@
2
2
 
3
3
  > {{DESC_GIT_RESCUE}}
4
4
 
5
- **Trigger:** the repository is in a broken or messy state — a bad rebase/merge/reset,
6
- lost commits, a detached HEAD, a half-finished operation, work stranded in a stash — or
7
- you intend to deliberately rewrite history (interactive rebase, squash, amend). For
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
@@ -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 you're passing work to another agent or developer.
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.
@@ -4,7 +4,7 @@
4
4
  > {{DESC_HERDR}}
5
5
  <!-- invocation: user -->
6
6
 
7
- **Trigger:** you are running inside a herdr-managed pane (`HERDR_ENV=1`) and a task would benefit from another pane — splitting off a server, watching a long-running build, spawning a sibling agent, or reading what a neighbour is doing. If `HERDR_ENV` is unset or not `1`, you are not inside herdr — stop and do not try to control panes from outside.
7
+ **Trigger:** the session runs inside a herdr-managed pane (`HERDR_ENV=1`) and a task would benefit from another pane. Typical cases: splitting off a server, watching a long-running build, spawning a sibling agent, or reading what a neighbour is doing. If `HERDR_ENV` is unset or not `1`, you are not inside herdr — stop and do not try to control panes from outside.
8
8
 
9
9
  **Requires:** `HERDR_ENV=1` in the environment and the `herdr` binary on `PATH`.
10
10
 
@@ -4,8 +4,8 @@
4
4
 
5
5
  <!-- invocation: user -->
6
6
 
7
- **Trigger:** the user wants to *learn while building* rather than be handed finished code —
8
- "learn mode", "turn on learning", "I want to understand what we build", "let me design it,
7
+ **Trigger:** the user wants to *learn while building* rather than be handed finished code.
8
+ Phrases: "learn mode", "turn on learning", "I want to understand what we build", "let me design it,
9
9
  you write it". Also "pause learning" / "resume learning" / "stop learn mode". To be taught a
10
10
  topic outside a build, use the [teach {{SKILL}}](teach.md); to have knowledge tested, the
11
11
  [quiz {{SKILL}}](quiz.md).
@@ -4,7 +4,9 @@
4
4
 
5
5
  **Trigger:** the user asks to run a loop, or to work a requirement in small validated
6
6
  iterations, each one committed on its own; or names a loop template (`bugfix`, `refactor`,
7
- `feature`).
7
+ `feature`, `tdd`, `legacy-tests`, `legacy-refactor`, `deps-upgrade`, `ci-repair`,
8
+ `architecture-decision`, `enforce-architecture-rule`, `update-contract`, `spec-first-feature`,
9
+ `api-endpoint`, `remove-dead-code`, `fix-flaky-tests`).
8
10
 
9
11
  Default trust preset: **{{TRUST_LABEL}}**
10
12
 
@@ -36,7 +38,8 @@ action prints one JSON object — act on its keys, never on your own reading of
36
38
  Write it to `<name>.json` in the OS temp directory — never inside the worktree, where it would
37
39
  be scored and committed — and validate it: `geneseed loop check --graph <file>`.
38
40
  4. `geneseed loop init --title "<title>" --requirement "<requirement>" --graph <template|file> --preset {{TRUST}}`.
39
- A refused graph prints `problems` — fix them and retry.
41
+ Add `--contracts <globs>` naming the interface or schema files the requirement changes when
42
+ the template's defaults do not cover them. A refused graph prints `problems` — fix them and retry.
40
43
 
41
44
  ## The cycle
42
45
 
@@ -44,17 +47,25 @@ Repeat `geneseed loop next` and act on its JSON:
44
47
 
45
48
  - **`{awaiting}`** — a person must decide. Present it: `launch` → the graph in `LOOP.md`;
46
49
  `declared` → the card, its score and the threshold; `actual` → `git diff --cached` and the
47
- `reasons`. Then **end the run** and wait. On their answer:
50
+ `reasons`; `gate` → what `node` produced (the file its `note` names, or `git diff`), the
51
+ `note` and the `outcome` it reported — `ok` follows the outcome the brick reported (on a held
52
+ `fail` it stops; to continue, `amend` with your answers), `amend` re-runs that brick with their
53
+ note. Then
54
+ **end the run** and wait. On their answer:
48
55
  `geneseed loop decide --verdict ok|no|amend --note "<their words>"` and continue.
49
56
  - **`{verify, run}`** — run exactly the `run` command it prints.
50
57
  - **`{node, validate: true}`** — score the card before the brick runs:
51
- `geneseed loop score --declared` (the card `identify` recorded), or for a setup brick with no
52
- card `geneseed loop score --declared --actions <kinds> --write-set <files> --intent <label>`.
58
+ `geneseed loop score --declared` (the card the iteration head recorded), or for a setup brick with no
59
+ card `geneseed loop score --declared --actions <kinds> --write-set <files> --intent <label>`
60
+ (`spec`: `--actions new-file --write-set 'specs/**'`).
61
+ Single-quote any glob in `--write-set` (safe in bash and PowerShell; unquoted, the shell expands it).
53
62
  `blocking` turns into an `{awaiting}` on the next `next`.
54
63
  - **`{node}`** — run the brick: dispatch its `agent` (or follow its `skill`) with the `prompt`,
55
- the `card` and the `notes`. Then report the outcome, one of its `outcomes`:
56
- `git status --porcelain | geneseed loop record --outcome <outcome>` — `identify` adds
57
- `--card '<card json>'` when it reports `more`.
64
+ the `card`, the `notes` and the template's `rules`. Then report the outcome, one of its `outcomes`:
65
+ `git status --porcelain | geneseed loop record --outcome <outcome>` — the iteration head
66
+ (`identify`, `upgrade-scout`, `ci-triage`) adds `--card '<card json>'` when it reports `more`;
67
+ a brick that reports a note file's path gets `--note-file <path>`, so its finding lands in
68
+ `notes`; `--note "<short, one line, no git command>"` only for a note you write yourself.
58
69
  - **`{terminal: "$close"}`** — see *The end*. **`{terminal: "$stop"}`** — report the `reason`
59
70
  and the `summary`, and leave the branch as it is.
60
71
 
@@ -69,8 +80,9 @@ What `score --diff`, `decide` and `record` print back:
69
80
  keeping `LOOP.md`: `git stash -u -m loop-discarded -- . :^LOOP.md` (never `git stash push` —
70
81
  the word `push` trips the git gate mid-run).
71
82
  - **`{done: true}`**, **`{empty}`**, **`{resumed}`**, **`{dropped}`**, **`{node}`**, **`{verify}`**,
72
- **`{stopped}`**, a declared score, and any result with `commit: false` (a blocking diff score
73
- included — it surfaces as `{awaiting}`) — call `next` again.
83
+ **`{awaiting}`** (a gate), **`{stopped}`**, a declared score, and any result with
84
+ `commit: false` (a blocking diff score included — it surfaces as `{awaiting}`) — call `next`
85
+ again.
74
86
  - **`{error}`** — read it; it names the step you skipped (`score --declared` before a mutate
75
87
  brick, `score --diff` before `record`). Do the step, never edit the state block to get past it.
76
88
  An `{error}` from `record` that mentions JSON means the shell mangled the card's quotes: retry
@@ -3,9 +3,9 @@
3
3
  > {{DESC_THEME}}
4
4
  <!-- invocation: user -->
5
5
 
6
- **Trigger:** the user wants their own OpenCode colour theme — "make me a theme",
7
- "create a custom theme", "I want my own colours", "a theme that matches <brand>", "a
8
- darker/transparent version of <theme>", or asks to tweak the shipped colours. For
6
+ **Trigger:** the user wants their own OpenCode colour theme, or asks to tweak the shipped
7
+ colours. Phrases: "make me a theme", "create a custom theme", "I want my own colours", "a
8
+ theme that matches my brand", "a darker/transparent version of this theme". For
9
9
  changing the agent's *voice* (imperial, pirate…) that is a different concept — point
10
10
  them at `--theme` / the setup wizard, not this {{SKILL}}.
11
11
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  > {{DESC_PONYTAIL}}
4
4
 
5
- **Trigger:** the user says "ponytail", "be lazy", "lazy mode", "simplest/minimal solution", "yagni", "do less", or "shortest path", or complains about over-engineering, bloat, boilerplate, or needless dependencies. Sets a build *mode* that persists across the session, not a one-shot edit — off by default until invoked. Off again on "stop ponytail" / "normal mode". For restructuring code that already exists use [refactor](refactor.md); to critique an artifact use [roast-me](roast-me.md).
5
+ **Trigger:** the user says "ponytail", "be lazy", "lazy mode", "yagni" or "do less", or complains about over-engineering, bloat, or needless dependencies. Also "simplest/minimal solution", "shortest path", or a complaint about boilerplate. Sets a build *mode* that persists across the session, not a one-shot edit — off by default until invoked. Off again on "stop ponytail" / "normal mode". For restructuring code that already exists use [refactor](refactor.md); to critique an artifact use [roast-me](roast-me.md).
6
6
 
7
7
  ## Procedure
8
8
  1. Set the intensity. Ponytail is **off by default**; invoking it turns it on at **full** unless a level is named. **lite** — build what's asked, name the lazier alternative in one line, user picks. **full** — the ladder enforced, shortest diff, shortest explanation. **ultra** — YAGNI extremist, ship the one-liner and challenge the rest of the requirement in the same breath. Switch any time with `/ponytail lite|full|ultra|off` (on OpenCode this command persists the level for the geneseed-ponytail plugin; `off` stops it).
@@ -2,10 +2,9 @@
2
2
 
3
3
  > {{DESC_PROFILE}}
4
4
 
5
- **Trigger:** the user wants the agent to know who they are — "set up my profile",
6
- "create my profile", "update my profile" — a fresh install whose `PROFILE.md` is
7
- still the untouched stub, or an existing profile visibly contradicts how the user
8
- now works.
5
+ **Trigger:** the user wants the agent to know who they are, or `PROFILE.md` is still
6
+ the untouched stub. Phrases: "set up my profile", "create my profile", "update my
7
+ profile". Also when an existing profile visibly contradicts how the user now works.
9
8
 
10
9
  ## Procedure
11
10
  1. Locate `PROFILE.md` beside the deployed AGENT.md and read it ({{LAW:verify-before-asserting}} — the
@@ -2,9 +2,8 @@
2
2
 
3
3
  > {{DESC_PROSE}}
4
4
 
5
- **Trigger:** about to hand a human written prose — a commit body, PR description,
6
- doc, code comment, {{MEMORY}} note, or a written reply — and it should read like a
7
- person wrote it, not a model.
5
+ **Trigger:** about to hand a human written prose (a commit body, PR description, doc,
6
+ code comment, {{MEMORY}} note, or reply) that should read as a person's, not a model's.
8
7
 
9
8
  ## Procedure
10
9
  1. Draft for content first, fix voice on a second pass — don't self-censor while
@@ -4,7 +4,7 @@
4
4
 
5
5
  <!-- invocation: user -->
6
6
 
7
- **Trigger:** the user wants what they know *tested*, not explained — "drill me on X",
7
+ **Trigger:** the user wants what they know *tested*, not explained. Phrases: "drill me on X",
8
8
  "quiz me until it sticks", "let me explain X to you and catch me", "I think I already
9
9
  know X, prove me wrong", "find the holes in what I know". Three shapes, picked from the
10
10
  ask: a **drill** (practise until reflex), a **feynman** (explain it back, get caught on
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: react-view-transitions
3
- description: Guide for implementing smooth, native-feeling animations using React's View Transition API (`<ViewTransition>` component, `addTransitionType`, and CSS view transition pseudo-elements). Use this skill whenever the user wants to add page transitions, animate route changes, create shared element animations, animate enter/exit of components, animate list reorder, implement directional (forward/back) navigation animations, or integrate view transitions in Next.js. Also use when the user mentions view transitions, `startViewTransition`, `ViewTransition`, transition types, or asks about animating between UI states in React without third-party animation libraries.
3
+ description: Guide for implementing smooth, native-feeling animations using React's View Transition API (`ViewTransition` component, `addTransitionType`, and CSS view transition pseudo-elements). Use this skill whenever the user wants to add page transitions, animate route changes, create shared element animations, animate enter/exit of components, animate list reorder, implement directional (forward/back) navigation animations, or integrate view transitions in Next.js. Also use when the user mentions view transitions, `startViewTransition`, `ViewTransition`, transition types, or asks about animating between UI states in React without third-party animation libraries.
4
4
  license: MIT
5
5
  metadata:
6
6
  author: vercel
@@ -1,6 +1,6 @@
1
1
  # Vendored skill — react-view-transitions
2
2
 
3
- This folder is a third-party skill vendored **verbatim** (one line aside, below) into Geneseed, not a
3
+ This folder is a third-party skill vendored **verbatim** (two lines aside, below) into Geneseed, not a
4
4
  Geneseed-authored skill. It rides along in the rendered bundle and is exempt from
5
5
  Geneseed's authoring gates (token, dead-link, hermeticity, skill counts) — it is
6
6
  listed in the generator's `VENDORED_SKILL_DIRS`.
@@ -15,13 +15,18 @@ listed in the generator's `VENDORED_SKILL_DIRS`.
15
15
  The skill follows the [Agent Skills](https://agentskills.io/) format (`SKILL.md` +
16
16
  `references/`). Its internal links point at the upstream project's own files; do not
17
17
  "fix" them to Geneseed paths — that is why the folder is gate-exempt. To update,
18
- re-copy the upstream folder, re-apply the one deviation below, and bump the commit above.
18
+ re-copy the upstream folder, re-apply the two deviations below, and bump the commit above.
19
19
 
20
- **The one deviation:** upstream's frontmatter says `name: vercel-react-view-transitions`;
20
+ **Deviation 1:** upstream's frontmatter says `name: vercel-react-view-transitions`;
21
21
  here it is `name: react-view-transitions`. The Agent Skills format requires the name to
22
22
  match the skill's folder, and a strict host skips a skill that breaks it —
23
23
  renaming the folder instead would rename the installed skill on every host.
24
24
 
25
+ **Deviation 2:** upstream's `description:` writes the component as `` `<ViewTransition>` ``;
26
+ here it is `` `ViewTransition` ``. The Agent Skills spec forbids XML tags in a description, and
27
+ `checkBuild`'s description arm reports one for every first-party skill — the tag would be the
28
+ only one left in any install's catalogue.
29
+
25
30
  **Deliberately not copied:** upstream's `README.md` (the repo-facing readme: install
26
31
  command and folder tree, nothing an agent reads). `AGENTS.md`, upstream's compiled
27
32
  all-in-one copy, IS kept — `SKILL.md`'s closing section points the agent at it.
@@ -2,9 +2,9 @@
2
2
 
3
3
  > {{DESC_RESEARCH}}
4
4
 
5
- **Trigger:** a question needs current, external, or wide-ranging information that is
6
- not in this repository or your own knowledge — facts to gather and verify from the
7
- open web.
5
+ **Trigger:** a question needs current, external, or wide-ranging facts that are neither
6
+ in this repository nor in the model's own knowledge. They are gathered and verified from
7
+ the open web.
8
8
 
9
9
  **Requires:** a host web-search or web-fetch capability ({{DOCTRINE:tool-discovery}}) — without one,
10
10
  stop and report it ({{LAW:surface-failures}}); never substitute recall for verified research.
@@ -2,8 +2,8 @@
2
2
 
3
3
  > {{DESC_REVIEW_RESPONSE}}
4
4
 
5
- **Trigger:** you have received review feedback — from a human or another agent — and
6
- are about to act on it.
5
+ **Trigger:** review feedback has arrived — from a human or another agent — and is about
6
+ to be acted on.
7
7
 
8
8
  ## Procedure
9
9
  1. Read every comment in full before changing anything. Group related comments.
@@ -2,9 +2,9 @@
2
2
 
3
3
  > {{DESC_RULE}}
4
4
 
5
- **Trigger:** anything the user wants to outlive this session — a standing rule of
6
- their own ("always…", "never…", "from now on…", "make that a rule") or a durable
7
- fact ("remember that…", "note that…", "keep in mind…"). Also fires when a
5
+ **Trigger:** the user says "always…", "never…", "from now on…" or "remember that…".
6
+ Anything the user wants to outlive this session counts: a standing rule ("make that a
7
+ rule") or a durable fact ("note that…", "keep in mind…"). Also fires when a
8
8
  `feedback` {{MEMORY}} lesson keeps recurring and deserves promotion, or when
9
9
  `user-rules.md` needs review — a trial rule past its date, a stale rule, a bloated
10
10
  set. Nothing reaches `user-rules.md` or {{MEMORY}} except through here ({{DOCTRINE:persist-insight}}).
@@ -2,10 +2,10 @@
2
2
 
3
3
  > {{DESC_SECURITY_AUDIT}}
4
4
 
5
- **Trigger:** a change touches the security surface — authentication, authorisation,
6
- session or token handling, input from outside the trust boundary, file or shell
7
- access, cryptography, secrets, a new dependency, a network-facing endpoint — or the
8
- user asks for a "security review", "threat model", or "is this safe". The
5
+ **Trigger:** a change touches the security surface, or the user asks for a "security
6
+ review", "threat model", or "is this safe". The surface: authentication, authorisation,
7
+ session or token handling, input from outside the trust boundary, file or shell access,
8
+ cryptography, secrets, a new dependency, a network-facing endpoint. The
9
9
  [geneseed-code-review {{SKILL}}](geneseed-code-review.md) reviews a diff for
10
10
  correctness first; this one asks a different question of the same diff: *how would
11
11
  this be attacked, and what does it leak*. Run both before shipping anything on the
@@ -4,7 +4,7 @@
4
4
 
5
5
  <!-- invocation: user -->
6
6
 
7
- **Trigger:** the user wants to *learn* something and asks you to teach — "teach me X",
7
+ **Trigger:** the user wants to *learn* something and asks to be taught. Phrases: "teach me X",
8
8
  "get me up to speed on X", "this is confusing, break it down", "explain this passage",
9
9
  "how do I get to X in N days". Three shapes, picked from the ask: a **crash course**
10
10
  (from zero to functional, fast), a **decode** (confusing material handed over, make it
@@ -2,9 +2,9 @@
2
2
 
3
3
  > {{DESC_WIKI}}
4
4
 
5
- **Trigger:** a task needs knowledge the user keeps in their machine-wide
6
- knowledge base (declared in `wiki.jsonc`, AGENT.md §8), or the work has produced
7
- a durable, cross-project fact worth writing back into it.
5
+ **Trigger:** a task needs the user's machine-wide knowledge base, or has produced a
6
+ durable cross-project fact worth writing back. The knowledge base is declared in
7
+ `wiki.jsonc` (AGENT.md §8).
8
8
 
9
9
  ## Procedure
10
10
 
@@ -2,10 +2,10 @@
2
2
 
3
3
  > {{DESC_WORKFLOW}}
4
4
 
5
- **Trigger:** a task that benefits from *deterministic* multi-agent orchestration — a
6
- fan-out across independent units, a staged find→verify pipeline, a fresh-context
7
- handoff between phases, or a loop that accumulates to a target — **and** the host
8
- exposes a workflow tool. When it does not, use [parallel-agents](parallel-agents.md)
5
+ **Trigger:** a task benefits from *deterministic* multi-agent orchestration **and** the
6
+ host exposes a workflow tool. The shapes: a fan-out across independent units, a staged
7
+ find→verify pipeline, a fresh-context handoff between phases, or a loop that accumulates
8
+ to a target. When the host has no workflow tool, use [parallel-agents](parallel-agents.md)
9
9
  or [council](council.md) instead — those are *model-driven*; this {{SKILL}} is
10
10
  *code-driven*.
11
11
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  > {{DESC_WORKTREE}}
4
4
 
5
- **Trigger:** work must not share a working tree with what is already in flight — a
6
- [pipeline](pipeline.md) crew needs its own tree, a second task starts while the first
5
+ **Trigger:** the user says "worktree" or "isolate this", or work must not share the
6
+ checkout with work in flight. That covers a [pipeline](pipeline.md) crew needing its own tree, a second task starts while the first
7
7
  is uncommitted, another agent or session is editing this checkout, a risky migration
8
8
  or rewrite needs a disposable copy, or the user says "worktree", "isolate this",
9
9
  "don't touch my checkout". Also the first thing to reach for when `git status` shows
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./react-Bbzhmq4v.js";import{t as r}from"./api-D_ixdyEY.js";import{J as i,N as a,k as o,l as s,y as c}from"./index-CMPgezFm.js";import{a as l,i as u,n as d,o as f,r as p,t as m}from"./activity-CObqyxkL.js";import{t as h}from"./usePoll-BOqeunzF.js";var g=e(t(),1),_=n();function v({s:e}){let t=p[e.status]||p.idle,n=e.files,r=e.todos,i=r&&r.total>0||e.error||e.blocked_on;return(0,_.jsxs)(`a`,{className:`card pad-md act-card`,href:`#/activity/${encodeURIComponent(e.session_id)}`,children:[(0,_.jsxs)(`div`,{className:`row between wrap gap-12`,children:[(0,_.jsxs)(`div`,{className:`row gap-10`,style:{minWidth:0},children:[(0,_.jsx)(`span`,{className:`feed-dot ${t.cls||`acc`}`,style:{width:9,height:9}}),(0,_.jsxs)(`div`,{style:{minWidth:0},children:[(0,_.jsx)(`h3`,{style:{margin:0},children:e.title||l(e.cwd)||e.session_id}),e.cwd&&(0,_.jsx)(`div`,{className:`dim mono`,style:{fontSize:12,...m},title:e.cwd,children:e.cwd})]})]}),(0,_.jsxs)(`div`,{className:`row gap-8`,style:{flexShrink:0},children:[e.model&&(0,_.jsx)(`span`,{className:`badge mono`,title:`model`,children:e.model}),e.agent&&(0,_.jsx)(`span`,{className:`badge`,children:e.agent}),(0,_.jsxs)(`span`,{className:`badge ${t.cls}`,children:[(0,_.jsx)(`span`,{className:`dot`}),t.label]}),(0,_.jsx)(o,{name:`chevron`,className:`glyph act-chev`})]})]}),e.phase&&(0,_.jsxs)(`div`,{className:`row gap-8`,style:{marginTop:10,fontSize:14},children:[(0,_.jsx)(o,{name:`activity`}),(0,_.jsx)(`span`,{style:m,children:e.phase})]}),(e.tokens>0||e.cost>0||e.turn_started_at||n&&n.count>0)&&(0,_.jsxs)(`div`,{className:`row wrap`,style:{gap:16,marginTop:12,fontSize:13,color:`var(--text-2)`},children:[e.tokens>0&&(0,_.jsxs)(`span`,{children:[f(e.tokens),` tok`]}),e.cost>0&&(0,_.jsxs)(`span`,{children:[`$`,e.cost.toFixed(2)]}),e.turn_started_at?(0,_.jsx)(`span`,{children:(0,_.jsx)(d,{startedAt:e.turn_started_at})}):null,n&&n.count>0&&(0,_.jsxs)(`span`,{children:[n.count,` file`,n.count===1?``:`s`,` `,(0,_.jsxs)(`span`,{style:{color:`var(--good)`},children:[`+`,n.additions]}),` `,(0,_.jsxs)(`span`,{style:{color:`var(--bad)`},children:[`−`,n.deletions]})]})]}),i&&(0,_.jsxs)(`div`,{className:`row between wrap gap-12`,style:{marginTop:12,paddingTop:10,borderTop:`1px solid var(--line)`},children:[r&&r.total>0?(0,_.jsxs)(`span`,{className:`row gap-8 dim`,style:{fontSize:13},children:[(0,_.jsx)(u,{done:r.done,total:r.total}),`plan `,r.done,`/`,r.total]}):(0,_.jsx)(`span`,{}),e.error?(0,_.jsx)(`span`,{className:`badge bad`,title:e.error,style:{maxWidth:300,...m},children:e.error}):e.blocked_on?(0,_.jsx)(`span`,{className:`badge bad`,title:e.blocked_on,style:{maxWidth:300,...m},children:e.blocked_on}):null]}),(0,_.jsxs)(`div`,{className:`dim mono`,style:{fontSize:11,marginTop:8},children:[`updated `,a(e.updated_at),` ago`]})]})}function y(){let[e,t]=(0,g.useState)(null),[n,a]=(0,g.useState)(``);h(e=>r.activity().then(n=>{e()&&(t(n),a(``))},t=>{e()&&a(t.message)}),2e3,[]);let o=!e||e.enabled!==!1,l=e?.activity||[],u=i(),d=async()=>{let e=!o;try{let n=await r.activityToggle(e);t(e=>({...e||{},enabled:n.enabled,activity:n.enabled&&e?.activity||[]})),a(``)}catch(e){a(e.message)}};return(0,_.jsxs)(`div`,{className:`narrow`,children:[(0,_.jsxs)(`div`,{className:`head-row mb-16`,children:[(0,_.jsxs)(`div`,{children:[(0,_.jsx)(`h1`,{className:`h`,children:`Activity`}),(0,_.jsx)(`p`,{className:`sub`,children:`Live OpenCode sessions this harness is running: what each one is doing right now. Refreshes every couple of seconds; sessions drop off when their process exits.`})]}),(0,_.jsxs)(`div`,{className:`row gap-10`,style:{alignItems:`center`,flexShrink:0},children:[(0,_.jsx)(`span`,{className:`dim mono`,style:{fontSize:12},children:o?`tracking on`:`tracking off`}),(0,_.jsx)(`div`,{className:`sw-toggle${o?` on`:``}`,role:`switch`,"aria-checked":o,"aria-label":`Toggle activity tracking`,tabIndex:0,onClick:d,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.key===` `&&e.preventDefault(),d())}})]})]}),(0,_.jsx)(s,{error:n,style:{marginBottom:12}}),e?o?l.length===0?(0,_.jsxs)(`div`,{className:`empty`,children:[(0,_.jsx)(`div`,{className:`big`,children:`No active sessions`}),`Run `,(0,_.jsx)(`code`,{children:`opencode`}),` and the sessions it spins up appear here.`]}):(0,_.jsx)(`div`,{className:`stack gap-12`,ref:u,children:l.map(e=>(0,_.jsx)(`div`,{"data-flip":e.session_id,children:(0,_.jsx)(v,{s:e})},e.session_id))}):(0,_.jsxs)(`div`,{className:`empty`,children:[(0,_.jsx)(`div`,{className:`big`,children:`Activity tracking is off`}),`The plugin isn't recording sessions. Flip the switch to turn it back on.`]}):(0,_.jsx)(c,{label:`Reading live sessions…`})]})}export{y as default};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{i as t,t as n}from"./react-Bbzhmq4v.js";import{t as r}from"./api-D_ixdyEY.js";import{N as i,k as a,y as o}from"./index-CMPgezFm.js";import{a as s,n as c,o as l,r as u,t as d}from"./activity-CObqyxkL.js";import{t as f}from"./usePoll-BOqeunzF.js";var p=e(t(),1),m=n();function h(e){return e.kind===`tool`?e.status===`error`?`bad`:e.status===`completed`?`ok`:`acc`:{retry:`warn`,error:`bad`,subtask:`acc`,text:`acc`}[e.kind]||``}function g({rec:e}){let t=e.who===`you`,n=[];t||(e.kind===`tool`&&e.ms!=null&&n.push(`${(e.ms/1e3).toFixed(1)}s`),e.kind===`step`&&(e.tokens&&n.push(`${l(e.tokens)} tok`),e.cost&&n.push(`$${e.cost.toFixed(2)}`)),e.kind===`subtask`&&e.agent&&n.unshift(e.agent));let r=!t&&(e.kind===`text`||e.kind===`thinking`||e.kind===`step`),i=t?e.text:e.label||e.snippet||e.kind;return(0,m.jsxs)(`div`,{className:`row gap-10`,style:{alignItems:`baseline`},children:[(0,m.jsx)(`span`,{className:`badge ${t?``:`acc`}`,style:{flexShrink:0,minWidth:52,justifyContent:`center`},children:t?`you`:`agent`}),(0,m.jsxs)(`div`,{style:{minWidth:0,flex:1,fontSize:13},children:[!t&&(0,m.jsx)(`span`,{className:`feed-dot ${h(e)||`acc`}`,style:{display:`inline-block`,marginRight:8,verticalAlign:`middle`}}),e.kind===`thinking`&&(0,m.jsx)(`span`,{className:`dim`,children:`thinking: `}),r?(0,m.jsx)(`span`,{className:`dim`,children:i}):t?i:(0,m.jsx)(`b`,{children:i}),e.error&&(0,m.jsxs)(`span`,{className:`dim`,children:[`: `,e.error]})]}),n.length>0&&(0,m.jsx)(`span`,{className:`dim mono`,style:{flexShrink:0,fontSize:12},children:n.join(` · `)})]})}function _({turns:e}){return!e||e.length===0?(0,m.jsx)(`div`,{className:`dim`,style:{fontSize:13},children:`No conversation captured yet.`}):(0,m.jsx)(`div`,{className:`stack gap-12`,children:e.map((e,t)=>{let n=e.role===`user`;return(0,m.jsxs)(`div`,{className:`row gap-10`,style:{alignItems:`baseline`},children:[(0,m.jsx)(`span`,{className:`badge ${n?``:`acc`}`,style:{flexShrink:0,minWidth:52,justifyContent:`center`},children:n?`you`:`agent`}),(0,m.jsx)(`div`,{style:{minWidth:0,fontSize:13,color:n?`inherit`:`var(--text-2)`},children:e.text})]},t)})})}function v({sid:e}){let[t,n]=(0,p.useState)(null),[h,v]=(0,p.useState)(``),[y,b]=(0,p.useState)(!1),[x,S]=(0,p.useState)(!1);f(t=>r.activityDetail(e).then(e=>{t()&&(n(e),v(``),b(!1))},e=>{t()&&(e.status===404?b(!0):v(e.message))}),2e3,[e]);let C=(0,m.jsxs)(`a`,{className:`btn ghost sm`,href:`#/activity`,style:{marginBottom:12,display:`inline-flex`,gap:6},children:[(0,m.jsx)(a,{name:`arrow`,style:{transform:`rotate(180deg)`}}),` Activity`]});if(y)return(0,m.jsxs)(`div`,{className:`narrow`,children:[C,(0,m.jsxs)(`div`,{className:`empty`,children:[(0,m.jsx)(`div`,{className:`big`,children:`Session ended`}),`It's no longer live. `,(0,m.jsx)(`a`,{href:`#/activity`,children:`Back to Activity`}),`.`]})]});if(!t)return(0,m.jsxs)(`div`,{className:`narrow`,children:[C,(0,m.jsx)(o,{label:`Loading session…`})]});let w=t.session,T=u[w.status]||u.idle,E=w.files,D=w.todos,O=!!(E&&E.items&&E.items.length>0),k=!!(D&&D.items&&D.items.length>0),A=t.conversation||[],j=t.timeline||[],M=[...A.filter(e=>e.role===`user`).map(e=>({who:`you`,text:e.text,t:e.t||0})),...j.map(e=>({...e,who:`agent`}))].sort((e,t)=>(e.t||0)-(t.t||0));return(0,m.jsxs)(`div`,{className:`narrow`,children:[C,h&&(0,m.jsx)(`p`,{className:`badge bad`,style:{marginBottom:12},children:h}),(0,m.jsxs)(`div`,{className:`card pad-md`,children:[(0,m.jsxs)(`div`,{className:`row between wrap gap-12`,children:[(0,m.jsxs)(`div`,{style:{minWidth:0},children:[(0,m.jsx)(`h1`,{className:`h`,style:{margin:0},children:w.title||s(w.cwd)||w.session_id}),w.cwd&&(0,m.jsx)(`div`,{className:`dim mono`,style:{fontSize:12,...d},title:w.cwd,children:w.cwd})]}),(0,m.jsxs)(`div`,{className:`row gap-8`,style:{flexShrink:0},children:[w.model&&(0,m.jsx)(`span`,{className:`badge mono`,children:w.model}),w.agent&&(0,m.jsx)(`span`,{className:`badge`,children:w.agent}),(0,m.jsxs)(`span`,{className:`badge ${T.cls}`,children:[(0,m.jsx)(`span`,{className:`dot`}),T.label]})]})]}),w.phase&&(0,m.jsxs)(`div`,{className:`row gap-8`,style:{marginTop:10,fontSize:14},children:[(0,m.jsx)(a,{name:`activity`}),(0,m.jsx)(`span`,{style:d,children:w.phase})]}),(0,m.jsxs)(`div`,{className:`row wrap`,style:{gap:16,marginTop:12,fontSize:13,color:`var(--text-2)`},children:[w.tokens>0&&(0,m.jsxs)(`span`,{children:[l(w.tokens),` tok`]}),w.cost>0&&(0,m.jsxs)(`span`,{children:[`$`,w.cost.toFixed(2)]}),w.turn_started_at?(0,m.jsx)(`span`,{children:(0,m.jsx)(c,{startedAt:w.turn_started_at})}):null,(0,m.jsxs)(`span`,{className:`dim`,children:[`updated `,i(w.updated_at),` ago`]})]}),(w.error||w.blocked_on)&&(0,m.jsx)(`div`,{style:{marginTop:10},children:(0,m.jsx)(`span`,{className:`badge bad`,style:{maxWidth:`100%`,...d},children:w.error||w.blocked_on})})]}),(O||k)&&(0,m.jsxs)(`div`,{className:`grid gap-12`,style:{marginTop:12,gridTemplateColumns:O&&k?`minmax(0, 1fr) minmax(0, 1fr)`:`1fr`},children:[O&&(0,m.jsxs)(`div`,{className:`card pad-md`,children:[(0,m.jsx)(`div`,{className:`card-head`,children:(0,m.jsxs)(`h3`,{children:[`Files touched `,(0,m.jsxs)(`span`,{className:`dim`,children:[`(`,E.count,`)`]})]})}),(0,m.jsx)(`div`,{className:`stack`,style:{gap:6,marginTop:8},children:E.items.map(e=>(0,m.jsxs)(`div`,{className:`row between gap-12`,style:{fontSize:13},children:[(0,m.jsx)(`span`,{className:`mono`,style:{...d,minWidth:0,flex:1},title:e.file,children:e.file}),(0,m.jsxs)(`span`,{style:{flexShrink:0},children:[(0,m.jsxs)(`span`,{style:{color:`var(--good)`},children:[`+`,e.additions]}),` `,(0,m.jsxs)(`span`,{style:{color:`var(--bad)`},children:[`−`,e.deletions]})]})]},e.file))})]}),k&&(0,m.jsxs)(`div`,{className:`card pad-md`,children:[(0,m.jsx)(`div`,{className:`card-head`,children:(0,m.jsxs)(`h3`,{children:[`Plan`,` `,(0,m.jsxs)(`span`,{className:`dim`,children:[`(`,D.done,`/`,D.total,`)`]})]})}),(0,m.jsx)(`div`,{className:`stack`,style:{gap:6,marginTop:8},children:D.items.map((e,t)=>(0,m.jsxs)(`div`,{className:`row gap-8`,style:{fontSize:13},children:[(0,m.jsx)(`span`,{className:`feed-dot ${e.status===`completed`?`ok`:e.status===`in_progress`?`acc`:``}`}),(0,m.jsx)(`span`,{style:{textDecoration:e.status===`completed`?`line-through`:`none`,color:e.status===`completed`?`var(--text-3)`:`inherit`},children:e.content})]},t))})]})]}),(0,m.jsxs)(`div`,{className:`card pad-md`,style:{marginTop:12},children:[(0,m.jsxs)(`div`,{className:`card-head`,style:{justifyContent:`space-between`,marginBottom:12},children:[(0,m.jsx)(`h3`,{children:`Timeline`}),j.length>0&&(0,m.jsx)(`button`,{className:`btn ghost sm`,onClick:()=>S(e=>!e),children:x?`Show conversation`:`Show all ${j.length} steps`})]}),x?(0,m.jsx)(`div`,{className:`stack gap-12`,children:M.map((e,t)=>(0,m.jsx)(g,{rec:e},t))}):(0,m.jsx)(_,{turns:A})]})]})}export{v as default};