BMAD-METHOD/docs/opencode-integration-implem...

166 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# OpenCode Integration Implementation Plan (Single PR, Small Commits)
This document describes how well implement the OpenCode (SST) integration for BMAD-METHOD in a single PR composed of small, focused commits that comply with the repositorys CONTRIBUTING guidelines.
## Scope and Constraints
- JSON-only project-level integration (no Markdown generation).
- Existing project `opencode.json(c)`:
- Only add BMAD `agent` and `command` entries.
- Ensure `instructions` includes a single entry: `.bmad-core/core-config.yaml`.
- Do not modify other top-level fields (e.g., `theme`, `model`, `small_model`, `permission`).
- No project `opencode.json(c)`:
- Create a minimal `opencode.jsonc` with `$schema`, `instructions: [".bmad-core/core-config.yaml"]`, and `agent`/`command` populated.
- Intentionally omit top-level `theme`, `model`, `small_model`, and `permission` to avoid overriding a global config.
- Idempotent behavior: safe re-runs; no duplication; preserve user entries and JSONC comments.
- Path mapping: Source is `bmad-core/...` in this repo; installed project references must use `.bmad-core/...` with POSIX-style `./`-prefixed relative paths.
## Single-PR Strategy
- Base branch: `next` (per CONTRIBUTING recommendations for new features).
- One PR containing ~69 small commits; each commit is independently reviewable and keeps the PR within the 200400 LOC ideal (max 800 LOC).
- Each commit runs the standard validation: `npm run pre-release` (or at minimum `npm run format:check` and `npm run lint`).
## Commit-by-Commit Plan
1. docs(opencode): add implementation plan (this file)
- Goal: Check in the execution plan to guide the PR.
- Files: `docs/opencode-integration-implementation-plan.md`
- Validation: `npm run format:check` and `npm run lint`
2. feat(installer): register opencode target (metadata only)
- Goal: Add `opencode` to installer config (no runtime behavior yet).
- Files: `tools/installer/config/install.config.yaml`
- Validation: `npm run lint`
3. chore(deps): add JSONC support for config IO
- Goal: Add dependency to parse/write JSONC while preserving comments.
- Choice: `comment-json` (parse + stringify with comments)
- Files: `package.json` (+ lockfile updates by package manager)
- Validation: install completes; `npm run lint`
4. feat(installer): scaffold opencode handler (detect-only)
- Goal: Wire `case 'opencode'` and add `setupOpenCode()` with dry-run detection/logging (no write operations yet).
- Files: `tools/installer/lib/ide-setup.js`
- Validation: run the installer in a test repo; verify it detects an existing or missing config and exits without modifications.
5. feat(installer): minimal config creation/merge (instructions only)
- Goal:
- If config exists: ensure `instructions` contains `.bmad-core/core-config.yaml` (append once).
- If config is missing: create minimal `opencode.jsonc` with `$schema` and `instructions` only (empty `agent` and `command`).
- Files: `tools/installer/lib/ide-setup.js` (and optional `tools/installer/lib/opencode-config.js` helper)
- Validation: re-run safely; confirm idempotence.
6. feat(installer): add agent mapping + merge
- Goal: Map BMAD agents (core + expansions) to OpenCode `agent` entries with:
- `description`, `mode`, `prompt: {file:...}`, default `tools`/`permission` by role.
- Optional name prefix `bmad-`.
- Files: `tools/installer/lib/ide-setup.js` (and optional `tools/installer/lib/opencode-map.js` helper)
- Validation: verify agents are added once; re-run remains stable.
7. feat(installer): add command mapping + merge
- Goal: Map BMAD tasks to OpenCode `command` entries:
- `template`: `{file:...}` (standardize on `{file:...}`; do not mix with `@file`).
- `description` and optional `agent` per task.
- Files: `tools/installer/lib/ide-setup.js`
- Validation: verify commands are added once; re-run remains stable.
8. feat(installer): polish UX (prefix prompt + summary)
- Goal: Add a prompt to apply `bmad-` prefix to names; output a concise summary of added/updated/skipped entries and config path.
- Files: `tools/installer/lib/ide-setup.js`
- Validation: manual smoke in a test repo with and without pre-existing config.
9. docs(opencode): user guide update (JSON-only usage)
- Goal: Add a short OpenCode section in `docs/user-guide.md` describing usage and re-run behavior.
- Files: `docs/user-guide.md`
- Validation: `npm run format:check` and `npm run lint`
## Technical Details & Contracts
- Config detection order: `opencode.jsonc``opencode.json` → create `opencode.jsonc`.
- JSONC parsing/writing: use `comment-json` to preserve comments where present.
- Existing config path:
- Only modify `instructions` (append `.bmad-core/core-config.yaml` if missing), `agent`, and `command` sections.
- Never change top-level `theme`, `model`, `small_model`, or `permission`.
- New config path:
- Create minimal file with `$schema`, `instructions`, `agent`, and `command`.
- Exclude top-level `theme`, `model`, `small_model`, `permission`.
- Agent defaults (examples):
- dev/build-like: `tools: { write: true, edit: true, bash: true }`, `permission: { edit: "allow", bash: "ask" }`
- pm/analyst/plan: `tools: { write: false, edit: false, bash: false }`, `permission: { edit: "deny", bash: "deny" }`
- qa: `tools: { write: true, edit: true, bash: false }`, `permission: { edit: "ask", bash: "deny" }`
- Commands: `template` references to BMAD tasks via `{file:...}` or `@file` strings; optional `agent` per task.
- Commands: `template` references use `{file:...}` consistently; optional `agent` per task (explicit where sensible).
- Prefix: Optional `bmad-` applied consistently to agent and command keys to avoid collisions.
- Idempotence: Re-runs should not duplicate or clobber user-defined entries; only update BMAD-managed keys.
- Mode values: restrict to `primary` and `subagent` unless spec confirms more.
- Default tools: minimal `{ write, edit, bash }` to avoid schema drift; extend later if needed.
### Collision strategy and BMAD-managed detection
- Collision handling (when prefix is off):
- If an unprefixed key exists and is not BMAD-managed → skip and warn; suggest `--prefix bmad-`.
- If a key is BMAD-managed → update idempotently.
- BMAD-managed detection:
- Agent with `prompt` pointing into `.bmad-core/agents` or `.bmad-core/expansion-packs/.../agents`.
- Command with `template` pointing into `.bmad-core/tasks` or `.bmad-core/expansion-packs/.../tasks`.
## Minimal JSONC Example (New Project Config)
```jsonc
{
"$schema": "https://opencode.ai/config.json",
"instructions": [".bmad-core/core-config.yaml"],
"agent": {
"dev": {
"description": "Product development / implementation agent",
"mode": "primary",
"prompt": "{file:./.bmad-core/agents/dev.md}",
"tools": { "write": true, "edit": true, "bash": true },
"permission": { "edit": "allow", "bash": "ask" },
},
},
"command": {
"test-design": {
"description": "Design tests based on the test levels framework",
"agent": "qa",
"template": "{file:./.bmad-core/tasks/test-design.md}",
},
},
}
```
## Validation & QA
- Automated (prefer Bun, npm fallback):
- `bun run format:check` (or `npm run format:check`)
- `bun run lint` (or `npm run lint`)
- Optionally `bun run pre-release` (or `npm run pre-release`)
- Manual smoke (in a temp repo):
- With no `opencode.json(c)`: creates minimal JSONC, adds agents/commands.
- With an existing `opencode.jsonc`: merges agents/commands and appends `.bmad-core/core-config.yaml` to `instructions` if missing; preserves other top-level fields and comments.
- Re-run: no duplicates; only new/changed BMAD entries update.
## Acceptance Criteria
- Selecting `Opencode` integrates BMAD agents/commands into project-level `opencode.json(c)` or creates a minimal `opencode.jsonc`.
- Existing configs are preserved; only `instructions`, `agent`, and `command` are touched.
- Minimal new config contains only: `$schema`, `instructions`, `agent`, `command` (no theme/model/permission at top level).
- Idempotent behavior and expansion pack support are verified.
- User guide updated with JSON-only usage and re-run behavior.
## Out of Scope (Future)
- Markdown-based agent/command generation.
- Advanced provider-specific model settings at top-level.
- Force-overwrite behavior for colliding user-owned keys.