From daa3edadbf5925a50289269410c2b4fca0ef4779 Mon Sep 17 00:00:00 2001 From: Leon Cheng Date: Sun, 30 Aug 2026 00:15:17 -0400 Subject: [PATCH 1/4] Retire the command catalogue for generic-argument workflows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a generic argument kind to composer workflows, ports 16 of the 23 repository-owned OpenCode commands onto it verbatim, and deletes the command catalogue, its parser, its simulations and its Playbooks UI. A `WorkflowPreset` may now declare one `argument` spec whose typed value IS the visible prompt, or a fixed `prompt` when it collects nothing. The dialog previously branched on workflow id in four places, one of which fell through to `objective.trim()` — so an unrecognized id was silently treated as a Managed Child launch. It now keeps a list of what is special (the five workflows with real bespoke fields or their own submit path) rather than a list of what is supported, so an unknown id degrades to "generic form, sent into this session". `maxLength` is clamped server-side to the prompt route's own 100,000 character ceiling, and an optional field left blank is refused rather than sent: the message would be the trusted injector with nothing to apply it to. The preview now states "Sent in this session's current mode" for every workflow that sends into this session. The ported procedures could pin their own agent in frontmatter (`agent: plan` for the read-only ones) and a workflow cannot, so the UI says the guarantee is gone instead of dropping it silently. The seven commands already covered by same-subject reminders — background, build-waves, handoff, duck-mode, grill-me, cite-file-lines, diagram — are deleted rather than converted. `standup` could not be ported cleanly: its three shell interpolations were its entire input dataset and an injector is never expanded, so it now instructs the agent to run them itself and says bash may be denied in a Plan session. Playbooks becomes workflows-only: the per-project load-state badge, the install-command blocks, the simulation player and `/playbooks/commands*` are gone, and the page no longer calls `/api/catalog` at all. The reminder picker's documentation link follows to `/playbooks/workflows/` for the six reminders whose command survived as a workflow, and renders nothing for the six whose command was deleted. Known breakage, owned by a sibling PR: deleting `agent-skills/commands/` and its parser leaves `scripts/agent-skills-site.ts` and `tests/agent-skills-site.test.ts` unable to compile or run. Those files are deliberately untouched here. --- AGENTS.md | 103 +- README.md | 24 +- agent-skills/CREDITS.md | 23 +- agent-skills/README.md | 127 +- agent-skills/command-docs/diagram-examples.md | 62 - .../command-simulations/background.md | 40 - .../command-simulations/build-waves.md | 56 - .../command-simulations/cite-file-lines.md | 30 - agent-skills/command-simulations/dca.md | 61 - .../command-simulations/deep-research.md | 55 - agent-skills/command-simulations/diagram.md | 44 - .../command-simulations/docs-preview.md | 50 - agent-skills/command-simulations/duck-mode.md | 47 - agent-skills/command-simulations/goal.md | 72 - agent-skills/command-simulations/grill-me.md | 51 - agent-skills/command-simulations/handoff.md | 65 - .../leaving-now-wrap-up.md | 73 - .../command-simulations/manager-children.md | 42 - .../command-simulations/mini-design-doc.md | 185 --- .../native-worktree-subagents.md | 37 - agent-skills/command-simulations/red-team.md | 66 - .../command-simulations/research-handoff.md | 48 - .../command-simulations/review-learning.md | 69 - .../command-simulations/session-handoff.md | 52 - agent-skills/command-simulations/standup.md | 54 - .../system-design-artifacts.md | 57 - agent-skills/command-simulations/verify.md | 63 - .../command-simulations/worktree-up.md | 49 - agent-skills/commands/background.md | 44 - agent-skills/commands/build-waves.md | 57 - agent-skills/commands/cite-file-lines.md | 25 - agent-skills/commands/dca.md | 133 -- agent-skills/commands/deep-research.md | 46 - agent-skills/commands/diagram.md | 46 - agent-skills/commands/docs-preview.md | 51 - agent-skills/commands/duck-mode.md | 33 - agent-skills/commands/goal.md | 51 - agent-skills/commands/grill-me.md | 41 - agent-skills/commands/handoff.md | 56 - agent-skills/commands/leaving-now-wrap-up.md | 51 - agent-skills/commands/manager-children.md | 66 - agent-skills/commands/mini-design-doc.md | 45 - .../commands/native-worktree-subagents.md | 38 - agent-skills/commands/red-team.md | 40 - agent-skills/commands/research-handoff.md | 46 - agent-skills/commands/review-learning.md | 83 -- agent-skills/commands/session-handoff.md | 46 - agent-skills/commands/standup.md | 38 - .../commands/system-design-artifacts.md | 164 --- agent-skills/commands/verify.md | 57 - agent-skills/commands/worktree-up.md | 42 - agent-skills/src/lib/commandInstall.test.ts | 32 - agent-skills/src/lib/commandInstall.ts | 92 -- .../src/lib/commandSimulation.test.ts | 105 -- agent-skills/src/lib/commands.test.ts | 174 --- agent-skills/src/lib/commands.ts | 151 -- agent-skills/src/lib/commandsSource.ts | 52 - agent-skills/src/lib/designCommands.test.ts | 44 - agent-skills/src/lib/frontmatter.test.ts | 312 ----- agent-skills/src/lib/frontmatter.ts | 387 ------ agent-skills/src/lib/reminderCommands.ts | 27 - agent-skills/src/lib/repo.ts | 23 - agent-skills/src/lib/simulation.test.ts | 194 --- agent-skills/src/lib/simulation.ts | 183 --- .../src/lib/simulationPlayback.test.ts | 36 - agent-skills/src/lib/simulationPlayback.ts | 17 - client/components/app-shell.tsx | 4 +- client/components/playbook-simulation.tsx | 43 - client/components/reminder-picker.tsx | 8 +- client/components/workflow-dialog.tsx | 117 +- client/lib/api.ts | 17 + client/lib/playbooks.ts | 49 - client/lib/reminderWorkflows.ts | 30 + client/lib/usePlaybookInstallState.ts | 95 -- client/lib/workflows.ts | 59 +- client/main.tsx | 3 - client/pages/PlaybookDetail.tsx | 57 +- client/pages/Playbooks.tsx | 61 +- client/simulator/publicSimulator.ts | 18 +- reminders/cite-file-lines/SKILL.md | 3 - reminders/native-worktree-subagents/SKILL.md | 3 - scripts/pr-screenshots.ts | 2 +- server/routes/workflows.ts | 10 +- server/workflows/workflows.ts | 1212 ++++++++++++++++- tests/e2e/playbooks.ui.spec.ts | 195 +-- tests/e2e/smoke.ui.spec.ts | 17 +- tests/e2e/workflows.ui.spec.ts | 103 +- tests/playbook-install-state.test.ts | 56 - tests/pr-screenshots.test.ts | 9 +- tests/public-simulator.test.ts | 26 +- tests/reminders.test.ts | 55 +- tests/workflows.test.ts | 110 +- vite.config.ts | 1 - vitest.config.ts | 2 +- 94 files changed, 1915 insertions(+), 5283 deletions(-) delete mode 100644 agent-skills/command-docs/diagram-examples.md delete mode 100644 agent-skills/command-simulations/background.md delete mode 100644 agent-skills/command-simulations/build-waves.md delete mode 100644 agent-skills/command-simulations/cite-file-lines.md delete mode 100644 agent-skills/command-simulations/dca.md delete mode 100644 agent-skills/command-simulations/deep-research.md delete mode 100644 agent-skills/command-simulations/diagram.md delete mode 100644 agent-skills/command-simulations/docs-preview.md delete mode 100644 agent-skills/command-simulations/duck-mode.md delete mode 100644 agent-skills/command-simulations/goal.md delete mode 100644 agent-skills/command-simulations/grill-me.md delete mode 100644 agent-skills/command-simulations/handoff.md delete mode 100644 agent-skills/command-simulations/leaving-now-wrap-up.md delete mode 100644 agent-skills/command-simulations/manager-children.md delete mode 100644 agent-skills/command-simulations/mini-design-doc.md delete mode 100644 agent-skills/command-simulations/native-worktree-subagents.md delete mode 100644 agent-skills/command-simulations/red-team.md delete mode 100644 agent-skills/command-simulations/research-handoff.md delete mode 100644 agent-skills/command-simulations/review-learning.md delete mode 100644 agent-skills/command-simulations/session-handoff.md delete mode 100644 agent-skills/command-simulations/standup.md delete mode 100644 agent-skills/command-simulations/system-design-artifacts.md delete mode 100644 agent-skills/command-simulations/verify.md delete mode 100644 agent-skills/command-simulations/worktree-up.md delete mode 100644 agent-skills/commands/background.md delete mode 100644 agent-skills/commands/build-waves.md delete mode 100644 agent-skills/commands/cite-file-lines.md delete mode 100644 agent-skills/commands/dca.md delete mode 100644 agent-skills/commands/deep-research.md delete mode 100644 agent-skills/commands/diagram.md delete mode 100644 agent-skills/commands/docs-preview.md delete mode 100644 agent-skills/commands/duck-mode.md delete mode 100644 agent-skills/commands/goal.md delete mode 100644 agent-skills/commands/grill-me.md delete mode 100644 agent-skills/commands/handoff.md delete mode 100644 agent-skills/commands/leaving-now-wrap-up.md delete mode 100644 agent-skills/commands/manager-children.md delete mode 100644 agent-skills/commands/mini-design-doc.md delete mode 100644 agent-skills/commands/native-worktree-subagents.md delete mode 100644 agent-skills/commands/red-team.md delete mode 100644 agent-skills/commands/research-handoff.md delete mode 100644 agent-skills/commands/review-learning.md delete mode 100644 agent-skills/commands/session-handoff.md delete mode 100644 agent-skills/commands/standup.md delete mode 100644 agent-skills/commands/system-design-artifacts.md delete mode 100644 agent-skills/commands/verify.md delete mode 100644 agent-skills/commands/worktree-up.md delete mode 100644 agent-skills/src/lib/commandInstall.test.ts delete mode 100644 agent-skills/src/lib/commandInstall.ts delete mode 100644 agent-skills/src/lib/commandSimulation.test.ts delete mode 100644 agent-skills/src/lib/commands.test.ts delete mode 100644 agent-skills/src/lib/commands.ts delete mode 100644 agent-skills/src/lib/commandsSource.ts delete mode 100644 agent-skills/src/lib/designCommands.test.ts delete mode 100644 agent-skills/src/lib/frontmatter.test.ts delete mode 100644 agent-skills/src/lib/frontmatter.ts delete mode 100644 agent-skills/src/lib/reminderCommands.ts delete mode 100644 agent-skills/src/lib/repo.ts delete mode 100644 agent-skills/src/lib/simulation.test.ts delete mode 100644 agent-skills/src/lib/simulation.ts delete mode 100644 agent-skills/src/lib/simulationPlayback.test.ts delete mode 100644 agent-skills/src/lib/simulationPlayback.ts delete mode 100644 client/components/playbook-simulation.tsx delete mode 100644 client/lib/playbooks.ts create mode 100644 client/lib/reminderWorkflows.ts delete mode 100644 client/lib/usePlaybookInstallState.ts delete mode 100644 tests/playbook-install-state.test.ts diff --git a/AGENTS.md b/AGENTS.md index a1ccb588..182a9c9a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -53,10 +53,12 @@ several decisions below. - `reminders//SKILL.md` is read at runtime, not emitted by `tsc`. Keep the root catalogue beside `dist/` in deployments. Per-message injection accepts an ID only; the BFF resolves the body and appends the `` sentinel. -- `agent-skills/` holds repository-owned OpenCode commands, simulations, and supporting - docs; it is content, not a second app. The Runner renders it natively under - `/playbooks`. This remains separate from runtime reminders and `/api/catalog`, which - reports external skills and commands loaded by the connected OpenCode process. +- `agent-skills/` is **retired** (decision 21c): its commands, simulations, parser and + supporting docs are deleted, and only `README.md`, `CREDITS.md` and `LICENSE` remain + so the third-party attribution outlives the file that carried it. `/playbooks` now + renders the live workflow catalogue only. This remains separate from runtime + reminders and `/api/catalog`, which reports external skills and commands loaded by + the connected OpenCode process. ## Agent working conventions @@ -451,7 +453,7 @@ several decisions below. it gates. A client-side match grants nothing; an unverified candidate simply renders as the ordinary text it renders as today. 21. **Composer workflows are forms first, and their injectors are visible-but-trusted.** - The Workflows picker beside Reminder (#167) offers four guided actions — + The Workflows picker beside Reminder (#167) started with four guided actions — Playwright UI review, snippet-by-snippet PR review, send an update to another session, launch a Managed Child. Choosing one only opens a form; the sole exits are Cancel, "Apply to composer" @@ -468,6 +470,44 @@ several decisions below. dialog states that prompt_async 204/202 means accepted, not completed. The managed-child form reuses decision #19's route and creates no task card and no automatic hand-back. +21b. **Most workflows are one generic argument, not a bespoke branch.** Adding a + workflow used to mean adding a fifth, sixth and seventh id to four separate + ternaries in `workflow-dialog.tsx`, one of which ended `: objective.trim()` — so an + unrecognized id was silently treated as a Managed Child launch. A `WorkflowPreset` + may now declare one `argument` spec (label, placeholder, hint, required, + maxLength) whose typed value **is** the visible prompt, or a fixed `prompt` when it + collects nothing; the dialog renders both from the server's description. The + dialog keeps a list of what is *special* — the five workflows with real bespoke + fields or their own submit path — rather than a list of what is supported, so an + id this build has never seen degrades to "generic form, sent into this session" + instead of to "launch a child". `maxLength` is clamped server-side to the prompt + route's own 100,000-character ceiling, so a preset can never advertise a field + whose full contents the send would reject. An optional field left blank is refused + rather than sent: the message would be the trusted injector with nothing to apply + it to. + The preview states **"Sent in this session's current mode"** for every workflow + that sends into this session, and this is not decoration. The 16 procedures ported + out of the retired command catalogue could pin their own agent in frontmatter + (`agent: plan` for the read-only ones). A workflow carries no declarative mode, and + adding one was deliberately rejected as out of scope — so the guarantee is gone, + and the UI has to say so rather than let a reader assume it survived. +21c. **The repository command catalogue is retired; its procedures are workflows.** + 23 commands under `agent-skills/commands/` became 16 workflows and 7 deletions. + The 7 — `background`, `build-waves`, `handoff`, `duck-mode`, `grill-me`, + `cite-file-lines`, `diagram` — were already covered by same-subject reminders, and + a second copy of the same instructions is worse than none. The 16 were ported + **verbatim**, with only their `$ARGUMENTS` sentences rewritten, because the typed + argument now precedes the injector as the prompt. + `standup` is the one that could not be ported cleanly: its three `` !`…` `` + shell interpolations were its entire input dataset and a workflow injector is + never expanded, so it now instructs the agent to run those commands itself and + says plainly that bash may be denied in a Plan session. Pretending the data was + pre-fetched would have produced a confident standup written from the transcript. + The reminder picker's per-reminder documentation link follows to + `/playbooks/workflows/` through `client/lib/reminderWorkflows.ts`. That map + covers 6 reminders, not the 12 the old command map covered, and the gap is the + honest number: the other 6 commands were deleted precisely because the reminder + already said what they said, so there is nothing to link to. 21a. **The PR review workflow accepts a number, never a repository.** Its only input is a pull request, and `parsePullRequestNumber` reduces `253`, `#253` and a pasted PR URL to the integer alone — a URL's owner, repository and host are **discarded rather than @@ -893,41 +933,24 @@ several decisions below. worth reaching. Its wording is duplicated in the outside-window notice, which tells the reader to use it by name — change the two together or the notice points at a control that is not on screen. -31. **Repository Playbooks are commands-first, while connected-process skills remain - a separate inventory.** The catalogue is a build-time, repository-owned command - inventory compiled from `agent-skills/` into the bundle. Commands require explicit - human invocation and contribute zero at-rest retrieval context, so each command owns - its complete procedure, safety boundaries and failure handling. This repository ships - no skills. Runtime reminders under root `reminders/` are also separate: they remain - application-owned per-message prompt bodies and are never sourced from commands. - The runtime `/skill` Catalog panel still reports whatever external skills and - commands the connected OpenCode process loaded; do not remove or narrow - `server/opencode/catalog.ts`. Whether a repository command is - actually *loaded* is a per-directory runtime fact only `/api/catalog` knows. - Those are different questions and the page now answers both without conflating - them. Installation itself stays external: the UI only ever copies a shell - command the human runs, and it says so rather than leaving "Install grill-me" - to imply the app did something. The load-state badge is **always labelled with - the project**, because `/playbooks` is a global route while installation is - per-directory — a bare "Loaded" would be false in any other project, which is - worse than saying nothing. Since the route carries no `?directory=`, the last - selected project is resolved through the same `resolvePaletteDirectory` seam - the palette and notification centre use. Every failure — no directory, an - unreachable BFF, a rejected directory — renders **no claim at all** rather than - defaulting to "not installed", so the badge's absence means "unknown" and never - "absent". Source links follow the default branch and now say `main` out loud: - what GitHub shows can be newer than the bundle being read, and looking pinned - while tracking a moving target is the dishonest option. Related but distinct, - and stated on the page because the composer's reminder picker deep-links here: - attaching a reminder is a per-message action that needs no installation, and - links through an explicit validated reminder-id-to-command mapping; name transforms - are never guessed. - Workflows are the live, first-class Playbooks category: they are read only from - `GET /api/workflows`, including their exact trusted injector, and are never copied - into a client catalogue. Their picker grouping is presentation-only; unknown ids - fall under `Other`. Workflow-only routes never query `/api/catalog` or make command - installation claims, and deep-link absence is reported only after a successful - workflow catalogue load. +31. **Playbooks is the live workflow catalogue, and connected-process skills remain + a separate inventory.** The repository-owned command catalogue this decision used + to describe is retired (decision 21c), and with it the per-project "Loaded in + " badge, the install-command copy blocks, the simulation player and the + `/playbooks/commands*` routes. Nothing replaced them, because a workflow needs no + installation: there is no per-directory question left to ask, so the page no longer + calls `/api/catalog` at all. + Workflows are read only from `GET /api/workflows`, including their exact trusted + injector, and are never copied into a client catalogue. Their grouping is + presentation-only and every shipped workflow must be placed in one of the five named + groups; the `Other` bucket exists for an id a newer server ships, and a shipped + workflow landing there is a placement bug that reads identically in the UI. A + detail route reports absence only after a successful catalogue load, never during + loading or after a failure. + Runtime reminders under root `reminders/` stay separate: application-owned + per-message prompt bodies, never sourced from a workflow. The runtime `/skill` + Catalog panel still reports whatever external skills and commands the connected + OpenCode process loaded; do not remove or narrow `server/opencode/catalog.ts`. 32. **RETIRED — the public command catalogue is gone, and `gh-pages:agent-skills/` was deleted rather than left serving a stale index.** This decision used to specify a dependency-free generator that reused the command parser and published diff --git a/README.md b/README.md index 7abca1b3..423fb156 100644 --- a/README.md +++ b/README.md @@ -27,19 +27,17 @@ the same server and can be attached at the same time, watching the same sessions ## Playbooks -The Runner's native **Playbooks** section at `/playbooks` catalogs repository-owned, -human-invoked OpenCode commands and their worked simulations. Their installable -Markdown source lives in [`agent-skills/`](agent-skills/). Commands add zero retrieval -context until explicitly invoked and contain their complete workflow and failure -handling; this repository intentionally ships no skills. - -Install a command directly from this repository: - -```bash -mkdir -p ~/.config/opencode/commands -curl -sL https://raw.githubusercontent.com/leoncheng57/custom-dca-opencode/main/agent-skills/commands/verify.md \ - -o ~/.config/opencode/commands/verify.md -``` +The Runner's native **Playbooks** section at `/playbooks` catalogs the live **composer +workflows** the server supplies over `GET /api/workflows`, including the exact trusted +injector each one appends. A workflow is a guided action: you fill in one form, read +the exact prompt and the exact trusted instructions, and only then send. Nothing is +installed, nothing is copied to your machine, and no restart is involved. + +The repository-owned command catalogue that used to live here is retired. Sixteen of +its procedures were ported verbatim into workflows; the other seven were already +covered by runtime reminders and were simply deleted. One thing genuinely changed +rather than moved: a command could pin its own agent (`agent: plan`), and a workflow +cannot — it is sent in the sending session's current mode, and the preview says so. Runtime reminders under root `reminders/` remain separate per-message prompt content, and the live `/skill` Catalog panel remains the connected OpenCode process's inventory diff --git a/agent-skills/CREDITS.md b/agent-skills/CREDITS.md index 54dc4ccf..b414e04c 100644 --- a/agent-skills/CREDITS.md +++ b/agent-skills/CREDITS.md @@ -1,7 +1,10 @@ # Credits -One command in this repository is adapted from another open-source project. -The original author retains copyright; their licence terms are reproduced below. +One command in this repository was adapted from another open-source project. +That command has since been retired along with the rest of this directory, but +the attribution stays: the derived work remains in this repository's history, +and a credit is not something a deletion cancels. The original author retains +copyright; their licence terms are reproduced below. --- @@ -14,12 +17,14 @@ The original author retains copyright; their licence terms are reproduced below. ### Adapted, not vendored -No file in this repository is a copy of upstream. The command that derives -from it is an original rewrite: +No file in this repository was ever a copy of upstream. The command that +derived from it was an original rewrite: -[`commands/grill-me.md`](commands/grill-me.md) adopts the -rounds-and-frontier model from upstream `skills/productivity/grilling/SKILL.md` -@ `0ab1b63`, including its round output format. It differs deliberately: +`agent-skills/commands/grill-me.md`, retired in the change that emptied this +directory and readable in history at commit +`fe9e5ede5f3dc749b0515372ee2e2bc2fc3b3fba`, adopted the rounds-and-frontier +model from upstream `skills/productivity/grilling/SKILL.md` @ `0ab1b63`, +including its round output format. It differed deliberately: - Upstream ships a `grill-me` → `grilling` skill pair. This repository adapts the behavior into one explicitly invoked `/grill-me` command with no @@ -27,6 +32,10 @@ rounds-and-frontier model from upstream `skills/productivity/grilling/SKILL.md` - A closing step offering to emit the outcome as a handoff document or an ADR is added; upstream has no equivalent. +The `grill-me` runtime reminder under `../reminders/` is a separate lineage with +its own recorded provenance, not a relocation of this adapted command. This +credit does not transfer to it. + ### MIT Licence ``` diff --git a/agent-skills/README.md b/agent-skills/README.md index 29962e73..cf10790b 100644 --- a/agent-skills/README.md +++ b/agent-skills/README.md @@ -1,8 +1,8 @@ -# OpenCode commands +# Retired: repository-owned OpenCode commands -Repository-owned Playbooks are explicit, human-invoked OpenCode slash commands. -Their source, worked simulations, parser, and documentation live here and are -built into the Runner's `/playbooks` catalogue. +This directory used to hold 23 human-invoked OpenCode slash commands, their +worked simulations, and the build-time parser that fed the Runner's +`/playbooks` catalogue. All of it has been removed. There is no public catalogue. The former commands-only static site under `/custom-dca-opencode/agent-skills/` and the workflow that published it are retired, @@ -11,91 +11,34 @@ the Runner's own `/playbooks`, which reads this content out of the bundle it was built from. The archived separate repository still owns ; this repository's token cannot modify it. -This repository intentionally ships no skills. Model-retrieved skills place -descriptions in agent context before they are used, while a command costs zero -context until a human types `/name`. Each command therefore carries its complete -workflow, safety boundaries, edge cases, and failure handling rather than -deferring to another content type. - -Runtime reminders under root [`reminders/`](../reminders/) are independent -application-owned, per-message instructions. Their prompt bodies remain in that -directory; command files are never used as reminder prompt sources. The live -OpenCode `/skill` Catalog panel is different again: it reports external skills -and commands loaded by the connected process for one project. - -## Layout - -``` -commands/.md invocable command -command-simulations/.md worked transcript rendered by Playbooks -command-docs/.md optional longer supporting examples -src/lib/ build-time parser and command install helpers -``` - -Every `commands/*.md` file is auto-discovered. A command does not need a paired -reminder or any naming relationship, so adding a standalone command requires -only its command file and, normally, a same-named simulation. - -## Format - -```markdown ---- -description: Shown in OpenCode autocomplete -agent: build # optional: build | plan -model: provider/model # optional -subtask: true # optional: run in a subagent ---- - -The complete procedure. $ARGUMENTS is substituted, !`cmd` output is injected, -and @path/to/file.ts is inlined before the model sees it. -``` - -Keep the body imperative and self-contained. Include preconditions, explicit -stopping rules, safety constraints, boundary cases, and responses to likely -failures. A command may be long; explicit invocation and zero at-rest retrieval -context are the reason it can own the full procedure without duplication. - -## Install - -Install globally: - -```bash -mkdir -p ~/.config/opencode/commands -curl -sL https://raw.githubusercontent.com/leoncheng57/custom-dca-opencode/main/agent-skills/commands/verify.md \ - -o ~/.config/opencode/commands/verify.md -``` - -Or install for one project by writing the file under -`.opencode/commands/.md`. Restart OpenCode after installation because the -connected process reads commands at startup. Playbooks only shows and copies -install commands; it never installs content itself. - -## Simulations - -All simulation frontmatter fields are required: - -```markdown ---- -title: Verifying a mixed UI change -trigger: /verify -caveat: The transcript omits the later human execution phase. ---- - -## user - -/verify playbooks - -## assistant - -... -``` - -The trigger must be the exact slash command. Turns use `## user`, -`## assistant`, `## tool`, or `## note`, optionally followed by ` —