Open
Conversation
Three-panel layout with dark minimal aesthetic (#ffcc00 accent): - Base components: Button, Card, Input, Badge, Avatar, Tooltip - Layout: Sidebar, MessageList, MessageDetail - Theme: Inter + JetBrains Mono fonts, semantic color tokens - Stack: React 19, Vite 7, Tailwind CSS v4, TypeScript 🤖 Claude
Shape/Map/Ship workspaces with tiling layout per spec: - Shape: specs list + chat + preview tiles - Map: library tree + detail + observations tray - Ship: active runs + logs + history timeline - Keyboard nav (1/2/3 to switch workspaces) - Branding: always lowercase "mill" 🤖 Claude
.NET 10 API with endpoints for mill CLI integration:
- /api/project - project config
- /api/library/{category} - personas, standards, concepts, design
- /api/spec/drafts, /issues, /start, /message - spec workflow
- /api/run - active runs management
- /api/history - shipping history
🤖 Claude
- Add API client (src/lib/api.ts) with typed endpoints - Add React hooks for data fetching (useSpecs, useLibrary, etc.) - Shape workspace fetches drafts/issues from API - Replace "Save Draft" with auto-save + revert button - Add loading/error states and refresh button - Update AGENTS.md: Tauri focus, structure with api/ and workbench/ 🤖 Claude
- Add IIssueProvider interface and factory for multi-provider support
- Implement GithubProvider (gh CLI) and GitlabProvider (glab CLI)
- Auto-detect provider from git remote URL
- Add GET /api/spec/issues/{number} endpoint for issue details
- Expose detected provider in GET /api/project response
- Update Shape workspace to fetch and render issue details in preview
🤖 Claude
Introduces a Runtime interface that decouples the UI from execution: - Runtime interface with start/send/abort/subscribe/status methods - RunStatus, RunEvent, RunHandle types for event-driven updates - MockRuntime for development with simulated tool calls and output - TauriRuntime and ApiRuntime stubs for future backends - useRuntime() and useRun() hooks for component consumption - Provider pattern with auto-detection (Tauri/API/mock) 🤖 Claude
Replaces inline "Start Run" button with a floating action bar: - Play, Edit, External Link, and More actions - Positioned at bottom center with backdrop blur - Opens GitHub issue in browser via external link 🤖 Claude
- Replace static mock data with live runtime events - Add LiveRun interface for event-driven state - Add Demo button to start simulated runs - Wire up Abort button to runtime.abort() - Auto-scroll logs as events arrive - Show starting/running spinner states 🤖 Claude
- Widen nav from icon-only (56px) to labeled (144px) - Show workspace names and keyboard shortcuts inline - Remove tooltip dependency for cleaner UX 🤖 Claude
- Add Markdig package for GFM-compatible markdown rendering - Add MarkdownService with advanced extensions (tables, task lists, etc.) - Add bodyHtml field to IssueDetail model - Inject MarkdownService into GitHub and GitLab providers 🤖 Claude
- Add TopBar component with project badge, workspace tabs, and status area - Switch layout from flex-row (sidebar) to flex-col (top bar) - Left-align tabs next to project for natural reading flow - Move shortcuts to tooltips instead of visible labels - Render issue body as HTML using bodyHtml from API - Rename Preview tile to Spec 🤖 Claude
Content is self-explanatory; headers were redundant clutter. 🤖 Claude
- Remove generic notification bell from top bar - Add observations indicator with Lightbulb icon (primary color) - Show count when openObservations > 0 - Clicking navigates to Map workspace 🤖 Claude
Server-side: - IssueCacheService uses `gh api` with If-None-Match headers - 304 responses use cached data (free for rate limit) - ?refresh=true query param bypasses cache - MillService routes GitHub requests through cache Client-side: - API client supports refresh parameter on issues endpoints - useSpecs hook passes forceRefresh to refetch - Refresh button triggers cache bypass 🤖 Claude
Fresh cache (< 2 min) now returns instantly without calling gh api. Fixes slow workspace switching caused by ~1s gh CLI latency per call. 🤖 Claude
- Add category color system (blue/emerald/violet/pink) - Apply colors to library tree icons and observation badges - Redesign observation cards: category badge, confidence bar, parsed title/detail - Sort observations by confidence, highlight top pick - Hover-reveal actions, compact source info - Document color system in AGENTS.md 🤖 Claude
- Extract inputVariants, selectTriggerVariants, selectItemVariants to variants.ts - Add keyboard handling to Tile (Enter/Space, tabIndex, focus ring) - Add ARIA attributes to Tile (role="region", aria-label) - Add ARIA attributes to ConfidenceBar (role="meter", aria-valuenow/min/max) 🤖 Claude
- Add commandVariants, commandInputVariants, commandGroupVariants, commandItemVariants - Update Command components to use centralized variants - Fix unused parameter warning in tauri.ts 🤖 Claude
- Add dialogOverlayVariants, dialogContentVariants - Update Dialog components to use centralized variants - Fix unused parameter warning in pty.ts 🤖 Claude
- Extract LibraryTree to map/library-tree.tsx - Extract ItemDetail to map/item-detail.tsx - Extract ObservationsTray to map/observations-tray.tsx - Move shared utils (categoryMeta, categoryColors, mocks) to map/utils.ts - Re-export all from map/index.tsx 🤖 Claude
- Add accordionContentVariants with animation classes - Update AccordionContent to use centralized variant 🤖 Claude
- Document CVA usage pattern - Add example for responsive variants using Tailwind composition 🤖 Claude
Add onMouseDown handlers as fallback for selection when CommandItem is wrapped in ContextMenuTrigger, which can intercept click events. 🤖 Claude
- Remove tauri.ts runtime, add Photino detection via window.external - Add ApiRuntime for non-interactive tasks (observations, warmup) - Add TaskRequest/TaskResult types for structured API responses - Document desktop architecture and Claude runtime modes in AGENTS.md 🤖 Claude
cmdk v1.0+ sets data-disabled="false" on non-disabled items. The selector data-[disabled] matches any value, blocking all clicks. Fixed by using data-[disabled='true'] to only match disabled items. 🤖 Claude
Move files from api/Mill.Api/ to api/ root for simpler layout. 🤖 Claude
- Change spec/prompts → shape/prompts - Change spec/templates → shape/templates - Change run/prompts → ship/prompts - Add ground/prompts and ground/templates to installer 🤖 Claude
- Copy prompts/templates to binaryDir instead of dataPath (app looks there) - Add FindRepoRoot() to traverse up and find repo by shape/prompts marker - Skip missing source directories in CopyDirectory() to avoid errors 🤖 Claude
- Add viewingJobId state to jobs store - Jobs View button now navigates to source workspace and selects item - Shape workspace auto-selects draft when viewing validation result - Consolidate relevance button: one icon, context-aware behavior 🤖 Claude
- Create reusable ActionDialog for modals with bottom-centered actions - Add hideCloseButton prop to DialogContent - Refactor ValidationResultDialog to use ActionDialog - Wider layout (max-w-2xl), 2-column grid for findings, scrollable - Actions: refine, delete cached result, close 🤖 Claude
Cross-platform PTY implementation for embedded Claude Code sessions:
- PtyManager: session lifecycle via Pty.Net package
- SSE streaming for PTY output (bypasses broken Photino SendWebMessage on macOS)
- HTTP endpoints: /api/pty/start, /api/pty/{id}/stream, input, resize, kill
- Terminal component with xterm.js, fit addon, debounced resize
- Shape workspace integration with "Refine interactively" action
🤖 Claude
- Fix race condition where early PTY output was lost before terminal init - Defer session start until terminal reports actual dimensions via onResize - Add write buffering with retry (16ms batching) to reduce TUI flickering - Handle --system-prompt-file via shell substitution (avoids escaping/length limits) - Use PowerShell on Windows, /bin/sh on Unix for prompt injection - Clean up temp prompt files when session ends - Register PTY endpoints in API-only mode for dev workflow - Add vite proxy config to forward /api to backend - Fix dev.sh to kill existing process and wait for port release - Document shell command conventions in AGENTS.md 🤖 Claude
- Buffer SSE events before handler registration, flush on connect - Use ref for session start guard (sync) to prevent duplicate sessions - Track dimensions to skip redundant resize events - Add debug logging for terminal writes and screen control sequences 🤖 Claude
- Add visibility change handler to refresh xterm on app-switch - Defer buffer flush with requestAnimationFrame for cleaner initial render - Handle clear sequences immediately to avoid stale content - Increase resize debounce to 250ms for focus changes - Remove verbose per-event/per-output logging from backend - Clean up frontend debug logging 🤖 Claude
- Add POST /api/spec/issues/{number}/close endpoint
- Implement CloseIssue in GitHub/GitLab providers via CLI
- Add RunCommandWithResult to CliProviderBase for capturing stderr/exit codes
- Add confirmation dialog in Shape workspace with loading state
- Optimistic UI: hide issue immediately, restore on failure
- Fix API request helper to handle empty responses and extract error messages
🤖 Claude
- Replace SpecChat with NewSpecInput showing centered empty state and terminal icon - Add initialPrompt prop to InteractiveTerminal for passing user's description - Unify new spec and refine flows through same terminal component - Remove unused sessionId state and ChatMessage import 🤖 Claude
…jection - Add POST /api/pty/spec-session accepting semantic params (mode, issueNumber, draftId, initialPrompt) - Backend fetches issue content from IssueService and injects full spec body, labels, GitHub URL - Add startSpecSession() in frontend that calls the new endpoint - Simplify InteractiveTerminal to use server-side command building - Remove manual command arg construction from frontend 🤖 Claude
- Show draft/issue title in terminal header instead of generic "Interactive Session" - Combine stop/close buttons into single close button - Fix spec-session endpoint to omit `--` when no initial prompt provided - Rename "Published Specs" to "Active Specs" in sidebar 🤖 Claude
Replace generic "New Spec" placeholder with clearer two-path UI: - Point users to select existing specs for refinement - Or draft new spec from scratch with "What needs specifying?" prompt 🤖 Claude
Remove aria-selected styles from CommandItem - cmdk auto-selects first item internally, but we only want visual selection when user actually selects via selectedId state. 🤖 Claude
InteractiveTerminal now exposes requestClose() via ref that shows a confirmation dialog when session is active. This protects users from accidentally losing terminal sessions when clicking "+ New", "Refine interactively", or the X button. 🤖 Claude
Add end-to-end implementation for the "Ship this" feature: - ShipRun job type with signal-based loop orchestration (MILL_VERIFY, MILL_DONE, MILL_REJECTED, MILL_ABORT) - History persistence to .mill/ship/history.json with run details - PR creation via gh/glab CLI on successful verification - Ship workspace now shows real active runs from jobs store - Shape workspace "Ship this" button creates ShipRun jobs 🤖 Claude
- Add ObservationService for CRUD + extraction logic - Add ObservationExtraction job type on Llm queue - Spawn extraction job after ship run completion - Add API endpoints: list, accept, dismiss, ban observations - Wire observations-tray to real API, remove mock data - Store observations in .mill/ground/observations.json - Support confidence boosting when reinforced by multiple runs - Add banlist to prevent re-suggesting rejected terms - Fix missing history writes for failed/unknown signal paths - Add SemaphoreSlim lock to prevent history.json corruption 🤖 Claude
- Show View button for running ShipRun jobs in Jobs panel - Auto-select job in Ship workspace when navigating from Jobs 🤖 Claude
- Add 60-minute run-level timeout as primary safety net - Remove per-iteration timeouts (run-level + user cancel is sufficient) - Make LlmOptions.TimeoutMs nullable to support no-timeout execution - Update loop-iterate prompt to include `done` summaries in signals - Parse JSON metadata from MILL_CONTINUE/MILL_VERIFY signals - Display iteration history with summaries in Ship workspace UI 🤖 Claude
Replace stale "just now" with live mm:ss counter that updates every second. Shows running duration in both run list and detail views. 🤖 Claude
…visibility - Add 60-minute run-level timeout as safety net (no per-iteration timeout) - Add OnStderr callback to LlmOptions for real-time CLI output parsing - Track completed iterations during ShipRun with JobIteration record - Broadcast job-iteration events via SSE for live UI updates - Display completed slices in Ship workspace as iterations finish - Add pulsing activity indicator during work/verify phases 🤖 Claude
Add --strict-mcp-config flag to prevent loading MCP servers (like playwriter) which cause massive slowdowns for ship runs. MCP startup overhead was causing 40+ minute delays for trivial tasks. 🤖 Claude
Log raw CLI output when work signal is UNKNOWN to help diagnose why Claude's response wasn't recognized. Shows last 200-500 chars of output. 🤖 Claude
Prompts were moved from run/prompts/ to ship/prompts/ during workspace reorganization. CLI now references correct paths for loop-iterate, loop-verify-criterion, run-autopick, and sweep-analyze prompts. 🤖 Claude
Previous logic only went one level up from the binary, but the binary is nested deep (cli/bin/Debug/net10.0/osx-arm64/). Now traverses up until shape/prompts is found, matching Installer.FindRepoRoot() logic. 🤖 Claude
🤖 Claude
🤖 Claude
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #22
Summary
Created .mill/ship/test-marker.txt containing 'ship works' to verify the ship execution loop works end-to-end
Verification
Loop Contract test command outputs PASS - file exists and contains expected content