JSdotNet/devbook/tree/main/plugins/delivery-run-view
delivery-run-view
/flows 창, 프롬프트 위의 띠, 인라인 도구 행과 상태 표시줄에 딜리버리 실행을 그려 주고, 딜리버리 화면이 이미 기록한 실행 파일을 읽는 읽기 전용 Claude Code 플러그인입니다.
이 mod 소개
delivery-run-view는 편집기 안에 딜리버리 실행을 그리는 읽기 전용 뷰어 플러그인입니다. /flows 창(단계마다 한 행으로 상태, 실행 모드, 에이전트, 모델, effort, 기간, 반복, 위임된 하위 에이전트를 표시), 이 세션의 실행이 열려 있는 동안 프롬프트 위에 표시되는 띠, mcp__delivery-surface-__start_run 및 __update_stage 호출의 인라인 한 줄 렌더링, 흐름과 현재 단계를 보여 주는 상태 표시줄, 메모리에서 시뮬레이션한 flow-code 실행을 재생하는 /flows-demo를 제공합니다. ~/.claude/delivery-surface-dashboard/<slug>-<hash>/runs/ 및 ~/.claude/backlog/<slug>-<hash>/runs/ 아래의 실행 JSON 파일을 폴링하고 CLAUDE_CONFIG_DIR을 따릅니다. function-hook 모듈(hooks/register.tsx)과 타입이 지정된 $.state를 제공하므로 Claude Code 전용이며, 어떤 surface contract 작업에도 답하지 않고 아무것도 쓰지 않으며 의존성도 선언하지 않습니다.
설치
먼저 작성자의 README에서 marketplace와 플러그인 이름을 확인하세요. 저장소 구조에 따라 명령어가 달라질 수 있습니다.
claude plugin marketplace add JSdotNet/devbook claude plugin install delivery-run-view
원문 / README
delivery-run-view
A delivery run drawn inside Claude Code itself — its phases top to bottom, how each one ran, and the phase this session is in — from the run files the surfaces already write.
A viewer, not a surface. It answers none of the surface contract's operations, writes no run file, declares no dependency, and names no engine. Whichever surfaces record a run, this plugin reads what they left on disk and draws it; uninstalling it costs a view, never a capability.
That is also why it is not called delivery-surface-*. Per
plugins/delivery/resources/surface-contract.md, that prefix means an MCP server answering the
contract, and the engine resolves every installed delivery-surface-* server as a place to
record a run. A plugin that only reads would be mistaken for one. It keeps the subsystem's stem,
delivery, and is named for what it shows: a run.
Installation
claude plugin marketplace add JSdotNet/devbook
Then enable delivery-run-view with /plugin. Nothing else is required: the hook module is
loaded by Claude Code itself, and the pane opens on the next session start.
Claude Code only
The plugin is function-hook modules — hooks/hooks.json names ./register.tsx under
modules — and Copilot has no equivalent. So it carries the Claude manifest alone: a plugin
ships the manifest of every host that can load something in it, per
.devbook/arc42/05-building-block-view.md under Plugin Folder, and here that is one host.
It is the mirror of delivery-surface-canvas, which is Copilot's alone.
What it draws
| Where | Shows |
|---|---|
| Pane — /flows, opened on session start | The run top to bottom, one row per phase: its status, how it ran (inline, delegate, fork, gate), the agent, model and effort, the duration, and ↺N when the phase ran more than once. Sub-agents the phase delegated to hang under it. The focused phase opens in place with its output, QA scenarios, links, output tokens, and tool calls. ‹ › steps between runs, and a phase name focuses or unfocuses it |
| Band above the prompt | While this session's run is open: the flow, the stage rail, and the current phase with its mode and agent |
| Inline tool rows | A mcp__*delivery-surface-*__start_run or __update_stage call in the transcript drawn as one line — the flow and its phases, or the phase and its new status — instead of raw JSON |
| Status line | <skillId> · <current stage> while this session's run is open |
| /flows-demo | A simulated flow-code run played in the pane, one phase every four seconds, held in memory only — no run file is written |
Where it reads
Every three seconds it reads the newest run files under the profile, at
~/.claude/delivery-surface-dashboard/<slug>-<hash>/runs/*.json and
~/.claude/backlog/<slug>-<hash>/runs/*.json — CLAUDE_CONFIG_DIR in place of ~/.claude
when set — where <slug> is the checkout's folder name. A worktree with no runs of its own
falls back to the main checkout's, so the pane is never empty in a fresh worktree. The same
run found in both places is shown once, the newer copy winning. This session's runs sort first,
by the sessionIds a run records.
The run file shape is the dashboard's, which the Backlog app writes too. It is not part of the surface contract, so a surface that changes its file shape can break this view without breaking the contract; a run file that does not parse is skipped and read again on the next poll.
Gaps the surface contract does not cover yet
- How a phase ran is not recorded. A run file says what each stage did, never whether it
ran in the main thread, was handed to a sub-agent, or ran as a
context: forkskill. So the mode is inferred and drawn dimmed with a?: a phase with a delegated sub-agent in the run'sinsightsisdelegate, Personal Validation is thegate, and every other phase isinline. A fork is never detected. - Agent, model, and effort per phase are not recorded either, beyond the sub-agents the telemetry hook captured.
The plugin already reads both where a run carries them, so a contract that adds them needs no
change here: a stage's execution { mode | runs, agent, model, effort }, and the resolved
runContext.phases[<flow>][<phase-key>] map, the phase key being the stage name, its slug, or
phase-<slug>. Both are the shape of the
Per-Phase Delivery Config proposal.
The state contract
types/index.d.ts declares the plugin's $.state — runs, selected, focus under
delivery-run-view — and the manifest's types key points at it, which is what
claude plugin validate checks the module's state reads and writes against. The
.claude-plugin/types/ folder tsconfig.json extends is written by the host for type-checking
and is ignored.
