diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 85f2549..f44acac 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,8 +9,8 @@ { "name": "ddaro", "source": "./", - "description": "Worktree-based parallel workflow for Claude Code sessions. 6-tier worktree classification (main / owned / adopted / protected / unmanaged / external), /ddaro:adopt to bring existing worktrees under management, cwd-safe destructive commands (clear/abandon from main only), size-based merge review, crash-recoverable context logs, and plugin-native protective hooks (0.5.0: registered in hooks/hooks.json, active when ddaro is enabled, modes set via /ddaro:config - never written to .claude/settings.json). New in 0.6.0: a lifecycle conductor (/ddaro:spec design-doc scaffold + decision capture, /ddaro:review prism-all + triad fan-out with collated findings, /ddaro:check pre-merge prism + ship-checklist gate) that orchestrates the doc-template/prism-all/triad skills around the worktree cycle. /ddaro:start uses a 6-step setup. /ddaro:abandon accepts adopted via --force. Korean triggers: 따로, 병렬로, 분리해서.", - "version": "0.6.0", + "description": "Worktree-based parallel workflow for Claude Code sessions. 6-tier worktree classification (main / owned / adopted / protected / unmanaged / external), /ddaro:adopt to bring existing worktrees under management, cwd-safe destructive commands (clear/abandon from main only), size-based merge review, crash-recoverable context logs, and plugin-native protective hooks (0.5.0: registered in hooks/hooks.json, active when ddaro is enabled, modes set via /ddaro:config - never written to .claude/settings.json). New in 0.6.0: a lifecycle conductor (/ddaro:spec design-doc scaffold + decision capture, /ddaro:review prism-all + triad fan-out with collated findings, /ddaro:check pre-merge prism + ship-checklist gate) that orchestrates the doc-template/prism-all/triad skills around the worktree cycle. New in 0.6.1: /ddaro:go - one conductor command that reads the worktree's lifecycle stage and auto-runs the next step (spec/review/check remain as manual gears), confirming before the heavy review/check stages. /ddaro:start uses a 6-step setup. /ddaro:abandon accepts adopted via --force. Korean triggers: 따로, 병렬로, 분리해서.", + "version": "0.6.1", "homepage": "https://github.com/minwoo-data/ddaro", "license": "MIT", "author": { diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index a8e7e4e..811bfa3 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "ddaro", - "version": "0.6.0", - "description": "Worktree-based parallel workflow for Claude Code sessions with a lifecycle conductor (new in 0.6.0: /ddaro:spec scaffolds a design doc + captures decisions, /ddaro:review fires prism-all + triad and collates findings, /ddaro:check is a pre-merge prism + ship-checklist gate - pure orchestration over the doc-template/prism-all/triad skills, filling the design->review front half before the existing commit->CI-merge back half), plugin-native protective hooks (new in 0.5.0) and dev-cycle orchestration (0.4.0). The seven hooks (main_protection, branch_naming, cross_worktree_check, branch_worktree_match, evidence_check + the two SessionStart reporters) ship in hooks/hooks.json and activate automatically when ddaro is enabled - config-gated and fail-open, so non-ddaro projects see zero noise and nothing is written to .claude/settings.json (run /ddaro:config migrate once to clean up pre-0.5.0 installs). 6-tier classification (main / owned / adopted / protected / unmanaged / external), /ddaro:adopt, cwd-safe destructive commands (clear/abandon from main only). /ddaro:commit opt-in --verify flag (verify.json + CLAUDE.md fallback discovery). /ddaro:merge drives the PR path through CI: state machine, polling, hard-capped fix loop (default 3, configurable), CI_STUCK detection, idempotency guard, confirm gate, sync-main content-diff preview, --force-with-lease invariant. Korean triggers: /ddaro, 따로, 병렬로. English: /ddaro, parallel, isolated.", + "version": "0.6.1", + "description": "Worktree-based parallel workflow for Claude Code sessions with a lifecycle conductor (new in 0.6.0: /ddaro:spec scaffolds a design doc + captures decisions, /ddaro:review fires prism-all + triad and collates findings, /ddaro:check is a pre-merge prism + ship-checklist gate - pure orchestration over the doc-template/prism-all/triad skills, filling the design->review front half before the existing commit->CI-merge back half; 0.6.1 adds /ddaro:go, a single conductor that reads the worktree's lifecycle stage and runs the next step - spec/review/check stay as the manual gears), plugin-native protective hooks (new in 0.5.0) and dev-cycle orchestration (0.4.0). The seven hooks (main_protection, branch_naming, cross_worktree_check, branch_worktree_match, evidence_check + the two SessionStart reporters) ship in hooks/hooks.json and activate automatically when ddaro is enabled - config-gated and fail-open, so non-ddaro projects see zero noise and nothing is written to .claude/settings.json (run /ddaro:config migrate once to clean up pre-0.5.0 installs). 6-tier classification (main / owned / adopted / protected / unmanaged / external), /ddaro:adopt, cwd-safe destructive commands (clear/abandon from main only). /ddaro:commit opt-in --verify flag (verify.json + CLAUDE.md fallback discovery). /ddaro:merge drives the PR path through CI: state machine, polling, hard-capped fix loop (default 3, configurable), CI_STUCK detection, idempotency guard, confirm gate, sync-main content-diff preview, --force-with-lease invariant. Korean triggers: /ddaro, 따로, 병렬로. English: /ddaro, parallel, isolated.", "author": { "name": "haroom", "url": "https://github.com/minwoo-data" diff --git a/CHANGELOG.md b/CHANGELOG.md index 98c2c9b..42fe755 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), ## [Unreleased] +## [0.6.1] - 2026-06-05 + +### Added + +- **Conductor entry point (`/ddaro:go`).** One command that reads the worktree's lifecycle + stage and runs the next step, so you no longer have to remember which of + spec/review/check to call. It detects the stage from `.ddaro/lifecycle.json` (or infers + it: design doc present? has a `## Review findings` section? are there code changes beyond + the doc?), shows the detected stage + its evidence, confirms before the heavy stages + (review = 8 agents, check = prism-all), then delegates to the existing `/ddaro:spec` / + `/ddaro:review` / `/ddaro:check` section - it adds no review logic of its own. After a + stage it advances `.ddaro/lifecycle.json` and points at the next step; at the + review -> implement boundary it stops (the human writes the feature, then re-runs + `/ddaro:go`). The three named subcommands remain as the manual gears - pass + `/ddaro:go spec|review|check` to force/re-run a specific stage. Pure orchestration over + the 0.6.0 trio; touches no git history. New conductor state file + `/.ddaro/lifecycle.json` lives in the git-ignored `.ddaro/` dir. + ## [0.6.0] - 2026-06-05 ### Added diff --git a/README.ko.md b/README.ko.md index 6bbf506..711489c 100644 --- a/README.ko.md +++ b/README.ko.md @@ -64,6 +64,7 @@ Session A에서 `/ddaro:start billing`, Session B에서 `/ddaro:start auth`. 세 ``` /ddaro:start # 새 격리 worktree 생성 (첫 실행 시 설정 프롬프트) +/ddaro:go # 컨덕터: 라이프사이클 다음 단계 자동 실행 (0.6.1 new) /ddaro:spec # 설계문서 스캐폴드 + 결정 캡처 (0.6.0 new) /ddaro:review # prism-all + triad 병렬 리뷰, findings 문서에 합치기 (0.6.0 new) /ddaro:commit # 안전 검증 + commit + push + context 스냅샷 @@ -74,14 +75,17 @@ Session A에서 `/ddaro:start billing`, Session B에서 `/ddaro:start auth`. 세 설치/업데이트 후 Claude Code 재시작. -### 라이프사이클 컨덕터 (0.6.0 new) +### 라이프사이클 컨덕터 (spec/review/check 0.6.0, `/ddaro:go` 0.6.1) -3개 오케스트레이션 서브커맨드가 dev 사이클의 설계->리뷰 앞부분을 채웁니다 (기존 commit->CI-merge 뒷부분 앞): +오케스트레이션 서브커맨드가 dev 사이클의 설계->리뷰 앞부분을 채웁니다 (기존 commit->CI-merge 뒷부분 앞): ``` /ddaro:start -> /ddaro:spec -> /ddaro:review -> [구현] -> /ddaro:check -> /ddaro:commit -> /ddaro:merge + \______________ /ddaro:go 가 이 구간을 운전 ______________/ ``` +`/ddaro:go` (0.6.1) 는 자동 운전자입니다. spec/review/check 중 뭘 부를지 외울 필요 없이 `/ddaro:go` 만 치면, worktree 의 라이프사이클 단계를 읽고 다음 단계를 실행하며, 무거운 review/check 단계 전에는 물어봅니다. 3개 이름 있는 서브커맨드는 수동 기어로 남습니다 - `/ddaro:go spec|review|check` 로 특정 단계를 강제할 수 있습니다. `[구현]` 경계에서는 멈춥니다 (사람이 코드를 쓴 뒤 `/ddaro:go` 재실행). + 자매 스킬(`doc-template`, `prism`, `triad`)을 순수 지휘만 하며, 없으면 inline으로 폴백합니다. 프로젝트 관리 프레임워크가 아니라, 한 ddaro 세션에 매핑되는 가벼운 "문서 하나 -> 리뷰 -> 구현 -> 리뷰" cadence입니다. --- @@ -91,6 +95,7 @@ Session A에서 `/ddaro:start billing`, Session B에서 `/ddaro:start auth`. 세 | 명령 | 역할 | |---|---| | `/ddaro:start [name]` | 새 worktree + branch + lock 생성 | +| `/ddaro:go [spec\|review\|check]` | 컨덕터 (0.6.1): 라이프사이클 다음 단계 자동 실행 (spec -> review -> 구현 -> check), 인자 주면 해당 단계 강제. spec/review/check 에 위임하며 무거운 단계 전엔 확인. | | `/ddaro:commit [--verify] [msg]` | 전체 stage, 삭제 검증, 확인, *0.4.0:* `--verify` 플래그 시 프로젝트 verify 명령 실행, commit, push, context MD 기록 | | `/ddaro:merge` | 충돌 사전 확인 + 규모별 리뷰 + *0.4.0:* CI 오케스트레이션 (state machine, `gh pr view` 폴링, CI_FAIL 시 hard cap 3회 fix 루프 + `--force-with-lease`, CI_STUCK 별도 처리, idempotency guard, confirm gate, sync-main content-diff preview) | | `/ddaro:status` | worktree 안에선 로컬 상태, main 에선 `/ddaro:list` 로 자동 위임 | diff --git a/README.md b/README.md index 94b362b..45c606d 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ You fire up Session A to fix billing and Session B to refactor auth. Both edit ` ``` /ddaro:start # creates a new isolated worktree (first run prompts for setup) +/ddaro:go # conductor: auto-run the next lifecycle stage (new in 0.6.1) /ddaro:spec # scaffold a design doc + capture decisions (new in 0.6.0) /ddaro:review # prism-all + triad fan-out, findings collated back in (new in 0.6.0) /ddaro:commit # safe commit + push + context snapshot @@ -74,15 +75,22 @@ You fire up Session A to fix billing and Session B to refactor auth. Both edit ` Restart Claude Code after install/update. -### Lifecycle conductor (new in 0.6.0) +### Lifecycle conductor (spec/review/check in 0.6.0, `/ddaro:go` in 0.6.1) -Three orchestration subcommands fill the design->review front half of the dev cycle before +Orchestration subcommands fill the design->review front half of the dev cycle before the existing commit->CI-merge back half: ``` /ddaro:start -> /ddaro:spec -> /ddaro:review -> [implement] -> /ddaro:check -> /ddaro:commit -> /ddaro:merge + \_______________ /ddaro:go drives this row _______________/ ``` +`/ddaro:go` (0.6.1) is the auto-driver: instead of remembering which of spec/review/check +to call, run `/ddaro:go` and it reads the worktree's lifecycle stage, runs the next step, +and asks before the heavy review/check stages. The three named subcommands remain as the +manual gears - `/ddaro:go spec|review|check` forces a specific stage. It stops at the +`[implement]` boundary (the human writes the code, then re-runs `/ddaro:go`). + They are pure orchestration over the sibling skills (`doc-template`, `prism`, `triad`) and degrade to inline steps if those are absent. Not a project-management framework - just the lightweight "one doc -> review -> implement -> review" cadence that maps to one ddaro session. @@ -94,6 +102,7 @@ lightweight "one doc -> review -> implement -> review" cadence that maps to one | Command | What it does | |---|---| | `/ddaro:start [name]` | Create a new worktree + branch + lock | +| `/ddaro:go [spec\|review\|check]` | Conductor (0.6.1): auto-run the next lifecycle stage (spec -> review -> implement -> check); an arg forces a stage. Delegates to spec/review/check; confirms before heavy stages. | | `/ddaro:commit [--verify] [msg]` | Stage all, classify deletions, confirm flagged, optionally run the project's verify command(s) (new in 0.4.0), commit, push, write context MD | | `/ddaro:merge` | Pre-flight conflict check + size-based review + CI orchestration (new in 0.4.0): polls `gh pr view --json statusCheckRollup`, handles CI_FAIL via a 3-attempt fix loop with `--force-with-lease`, escalates CI_STUCK ("no checks in 60s") separately, idempotency-guarded squash with confirm gate, then sync-main with content-diff preview. | | `/ddaro:status` | In-worktree: local state. In main: auto-delegates to `/ddaro:list`. | diff --git a/commands/ddaro-go.md b/commands/ddaro-go.md new file mode 100644 index 0000000..c0b193b --- /dev/null +++ b/commands/ddaro-go.md @@ -0,0 +1,17 @@ +--- +name: ddaro:go +description: "Conductor entry point - read the worktree's lifecycle stage and run the next step (spec -> review -> implement -> check) automatically, instead of remembering which subcommand to call. Detects state, confirms before heavy stages (review/check), executes the matching spec/review/check section, advances the stage, and points at the next step. The manual /ddaro:spec | review | check stay available for forcing a specific stage." +argument-hint: "[spec|review|check] - no arg = auto-detect + run the next stage; an arg forces that stage" +allowed-tools: [Agent, Bash, Read, Write, Edit, Glob, Grep] +--- + +Read `${CLAUDE_PLUGIN_ROOT}/skills/ddaro/SKILL.md` section "## /ddaro:go [stage]" and execute with `$ARGUMENTS`. + +- Precondition: must be inside a ddaro worktree (reuse the `/ddaro status` cwd detection). In main -> tell the user which worktree to `cd` into; not under ddaro -> suggest `/ddaro:start` or `/ddaro:adopt`. +- Determine the current stage from `.ddaro/lifecycle.json` if present, else infer it (design doc exists? has a `## Review findings` section? are there code changes beyond the doc?). +- If `$1` is `spec` / `review` / `check`, force that stage (manual override / re-run); otherwise run the auto-detected next stage. +- Before a heavy stage (review = 8 agents, check = prism-all), state what it will fire and confirm. The spec stage's `[DECIDE]` items are still asked interactively. +- Execute the corresponding `## /ddaro:spec` / `## /ddaro:review` / `## /ddaro:check` section - do NOT reimplement them. The conductor only sequences them. +- After the stage completes, advance `.ddaro/lifecycle.json` and tell the user the next step (re-run `/ddaro:go`). At the review -> implement boundary, STOP - the human implements, then runs `/ddaro:go` again to reach check. + +This is the auto-transmission over the manual spec/review/check gears. It never touches git history; only `/ddaro:commit` / `/ddaro:merge` do. diff --git a/commands/ddaro.md b/commands/ddaro.md index faa8b92..14b6d6c 100644 --- a/commands/ddaro.md +++ b/commands/ddaro.md @@ -1,14 +1,14 @@ --- name: ddaro -description: "ddaro - worktree-based parallel workflow + lifecycle conductor. Use subcommands via /ddaro:start, /ddaro:adopt, /ddaro:resume, /ddaro:commit, /ddaro:merge, /ddaro:status, /ddaro:list, /ddaro:clear, /ddaro:abandon, /ddaro:config, and the 0.6.0 lifecycle trio /ddaro:spec, /ddaro:review, /ddaro:check. Or /ddaro [args]. Korean triggers: 따로, 병렬로, 분리해서, main 건드리지 마." -argument-hint: " [args] - start | adopt | resume | commit | merge | status | list | clear | abandon | config | spec | review | check" +description: "ddaro - worktree-based parallel workflow + lifecycle conductor. Use subcommands via /ddaro:start, /ddaro:adopt, /ddaro:resume, /ddaro:commit, /ddaro:merge, /ddaro:status, /ddaro:list, /ddaro:clear, /ddaro:abandon, /ddaro:config, the 0.6.0 lifecycle trio /ddaro:spec, /ddaro:review, /ddaro:check, and the 0.6.1 conductor /ddaro:go (auto-runs the next lifecycle stage). Or /ddaro [args]. Korean triggers: 따로, 병렬로, 분리해서, main 건드리지 마." +argument-hint: " [args] - start | adopt | resume | commit | merge | status | list | clear | abandon | config | go | spec | review | check" allowed-tools: [Bash, Read, Write, Edit, Glob, Grep] --- Read `${CLAUDE_PLUGIN_ROOT}/skills/ddaro/SKILL.md` fully, then: - If `$ARGUMENTS` is empty, show a brief overview of all subcommands and recommend `/ddaro:start` for first-time users (or `/ddaro:adopt ` if they already have an existing worktree they want under ddaro). -- If `$ARGUMENTS[0]` matches one of: `start`, `adopt`, `resume`, `commit`, `merge`, `clear`, `status`, `list`, `abandon`, `config`, `spec`, `review`, `check` - execute the matching section in the skill document using the remaining arguments. +- If `$ARGUMENTS[0]` matches one of: `start`, `adopt`, `resume`, `commit`, `merge`, `clear`, `status`, `list`, `abandon`, `config`, `go`, `spec`, `review`, `check` - execute the matching section in the skill document using the remaining arguments. - Legacy aliases: `summary` → `/ddaro:resume --recap-only` (with remaining args passed through). `setting` → `/ddaro:config` (no args, opens menu). Print a one-line "note: renamed in v0.3 — use directly" then execute. - Otherwise, report "unknown subcommand" and list valid ones. diff --git a/skills/ddaro/SKILL.md b/skills/ddaro/SKILL.md index e720f1d..17455c4 100644 --- a/skills/ddaro/SKILL.md +++ b/skills/ddaro/SKILL.md @@ -1443,16 +1443,23 @@ If `language=korean`, all subsequent output is in Korean. --- -## Lifecycle conductor (spec / review / check) *(new in 0.6.0)* +## Lifecycle conductor (go / spec / review / check) *(go new in 0.6.1; spec/review/check in 0.6.0)* -Three orchestration subcommands that fill the FRONT half of the dev cycle (design -> +Orchestration subcommands that fill the FRONT half of the dev cycle (design -> review) before ddaro's existing back half (commit -> CI merge): ``` /ddaro:start -> /ddaro:spec -> /ddaro:review -> [implement] -> /ddaro:check -> /ddaro:commit -> /ddaro:merge (worktree) (design+decide) (prism+triad) (code) (gate) (existing ship path) + \____________________ /ddaro:go drives this whole row ____________________/ + (reads the stage, runs the next step, asks before heavy ones) ``` +`/ddaro:go` (0.6.1) is the single auto-driver: you don't have to remember which of +spec/review/check to call - it reads the worktree's lifecycle stage and runs the next step. +The three named subcommands remain as the manual gears (force/re-run a specific stage). +Auto-transmission over manual; both are first-class. + They are PURE orchestration: each sequences existing building blocks (the `doc-template`, `prism-all`, and `triad` skills) and degrades gracefully to running the steps inline if a preferred skill is absent. None of them touch git history - only `/ddaro:commit` and @@ -1460,6 +1467,59 @@ preferred skill is absent. None of them touch git history - only `/ddaro:commit` that if you want phases/milestones); they encode the lightweight "one doc -> review -> implement -> review" cadence that maps to one ddaro session. +## /ddaro:go [stage] + +The conductor: read the worktree's lifecycle stage and run the next step automatically, so +the operator types ONE thing instead of recalling spec vs review vs check. + +- **Precondition (reuse `/ddaro status` cwd detection):** must be inside a ddaro worktree + (`.git/ddaro-owned` / `.ddaro/OWNED` / LOCK with `adopted=true`). In `config.main_worktree` + -> print "you're in main; cd into the worktree first" + the candidate path(s) from + `/ddaro:list`. Not under ddaro -> suggest `/ddaro:start ` or `/ddaro:adopt `. + Never run a stage from main. +- **Determine the current stage.** Read `/.ddaro/lifecycle.json` + (`{"stage": "spec|review|implement|check|done", "doc": "", "updated": ""}`) if + present. If absent (e.g. an adopted worktree, or a pre-0.6.1 one), INFER it - in order: + 1. No design doc found (no `docs/design/.md`, topic from the LOCK file) -> `spec`. + 2. Doc exists but has no `## Review findings` section -> `review`. + 3. Doc reviewed but the only changes are to the doc itself (no code diff vs `origin/main`) + -> `implement` (human writes code; nothing to run yet). + 4. Code changes exist vs `origin/main` (commits ahead or working-tree edits beyond the + doc) -> `check`. + 5. A check already PASSED (recorded stage `done`, or a `## Review findings` + a clean + prior `/ddaro:check`) -> `done` -> hand off to `/ddaro:commit` + `/ddaro:merge`. + Show the operator the detected stage and the evidence ("doc exists, no findings section -> + stage=review") so a wrong inference is visible and correctable. +- **Forced stage:** if `$1` is `spec` / `review` / `check`, run THAT stage's section + directly (manual override / re-run), skipping detection. Anything else after auto-detect + is unknown-arg. +- **Confirm before heavy stages.** review fans out 8 agents; check fires prism-all + the + ship checklist. Before either, state what it will fire ("review: 8 agents - prism 5 + + triad 3; proceed?") and get a yes. `spec` is cheap - proceed, but still ASK its `[DECIDE]` + items (never silently default a user-owned choice). Always offer "or jump to + spec|review|check" so the operator can override the detected stage in one answer. +- **Execute by delegating, never duplicating.** Run the matching `## /ddaro:spec` / + `## /ddaro:review` / `## /ddaro:check` section verbatim with the resolved arguments (doc + path / diff scope). The conductor adds ZERO review logic of its own - it only picks the + stage, gates cost, and advances state. +- **Advance state + point forward.** After the stage finishes, write + `/.ddaro/lifecycle.json` with the next stage (spec->review, review->implement, + check PASS->done, check BLOCK->stays check) and the date from session context + (`currentDate`, not a `date` shell call). Then tell the operator the next step and that + re-running `/ddaro:go` continues: + - after `spec`: "decisions captured -> `/ddaro:go` runs review". + - after `review`: STOP at the implement boundary - "findings collated; implement now, + then `/ddaro:go` runs check". The conductor cannot write the feature; this gap is the + one inherently human stage. + - after `check` PASS: "gate passed -> `/ddaro:commit` then `/ddaro:merge`". + - after `check` BLOCK: list blockers; stage stays `check`; never auto-proceed. +- `.ddaro/lifecycle.json` lives in the git-ignored `.ddaro/` dir (same as LOCK / CURRENT.md) + - it is local conductor state, never committed. Deleting it just forces re-inference. + +Anti-patterns: running a stage from main; firing review/check without the cost confirm; +re-implementing spec/review/check logic inside `go` instead of delegating; silently +defaulting a `[DECIDE]`; advancing past a BLOCK. + ## /ddaro:spec Scaffold a design/PRD doc and capture locked decisions BEFORE any code is written. @@ -1553,4 +1613,5 @@ What this plugin cannot protect against: - `/.ddaro/LOCK` - branch/topic/created_at/language JSON - `/.ddaro/context/*.md` - per-commit snapshots (crash recovery) - `/.ddaro/CURRENT.md` - running state, overwritten each commit +- `/.ddaro/lifecycle.json` - conductor stage (`/ddaro:go`); `{stage, doc, updated}`, inferred if absent - `/.gitignore` - contains a `.ddaro/` line that keeps the directory out of git (added once by `/ddaro:start`)