← Back to Projects
Creator

CMK Dashboard

A local developer dashboard that turns a Jira ticket into a fully orchestrated Claude Code agent run: plan generation with a review gate, then an autonomous implement → test → verify loop, streamed live over SSE.

Overview

Driving an AI coding agent through a real ticket end-to-end normally means babysitting a terminal. CMK Dashboard turns that into a managed session: point it at a Jira ticket (or start standalone), and it fetches the ticket context, generates an implementation plan, and then runs a Claude Code agent through a 5-stage loop — fetch/refine context, plan, implement & test, verify & replan, done — with every stage transition, tool call and test result streamed to the UI as it happens. Each session gets its own git worktree and branch, so the agent's work never touches the active checkout, and sessions can be stopped and resumed without losing context, since resuming reuses the same Claude session ID and worktree.

Architecture

A React 18 / Vite frontend talks to an Express backend over REST and Server-Sent Events. The backend's orchestrator is a LangGraph finite-state machine with interrupt support: the 5 stages are graph nodes, and the plan-review gate is a server-side pause the graph itself enforces, not a UI-level lock. Each stage spawns the claude CLI as a subprocess with --output-format stream-json, giving the agent full Claude Code tool access (Bash, Read, Edit, Write) rather than re-implementing a tool loop against the API directly. SSE events are buffered in memory during a run and flushed to PostgreSQL (via Prisma) on completion or interrupt, so the full conversation thread can be reconstructed on reload. OAuth-based connectors (e.g. SAP Jira) register MCP servers into the local Claude config so the agent has authenticated access to external services during a run.

React 18ViteTailwind CSSExpress.jsNode.js (ESM)LangGraphClaude Code CLIPostgreSQL 16Prisma 6Server-Sent EventsDocker Compose

Notable design decisions

Gates are server-side graph interrupts, not UI state

The plan-review gate pauses execution inside the LangGraph FSM itself. The UI just reflects that paused state rather than being the thing enforcing the pause, so the gate holds even if the browser tab is closed and reopened.

Claude runs as a CLI subprocess, not via the SDK

Spawning claude directly gives the agent its full native tool access (Bash, file edits, etc.) for free, instead of reimplementing a tool-use loop and each tool by hand against the API.

Per-session worktree isolation

Every session gets its own git worktree and branch, so an agent mid-implementation never collides with whatever is checked out in the main working copy — and the isolated path is one click away to copy.

Buffer, then flush, event persistence

SSE events are kept in memory while a run is live, for low-latency streaming, and only written to PostgreSQL on completion or interrupt — durable history without a database write on every streamed token.