summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
46 hoursstyle: rewrite style.css with Doot dark glass design tokensstory/ui-dark-glass-themeClaudomator Agent
46 hoursstyle: add font preconnect hints to index.htmlClaudomator Agent
Add <link rel="preconnect"> hints for fonts.googleapis.com and fonts.gstatic.com before the stylesheet link to improve font load performance. No inline color/font/background overrides were found to remove. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 daysstyle: polish Claudomator UI — close remaining gaps for full Doot visual ↵Claudomator Agent
parity - Add .tag-chip rule for task tags displayed in the detail panel - Add .story-project badge style (mirrors .task-project, was unstyled) - Add .elaborate-section flex layout, .elaborate-hint muted italic text, and .elaborate-banner success callout (green tinted glass) after AI draft - Add hr.form-divider styling (was invisible — no border rule) - Add .validate-header (flex row + font-weight) and .validate-icon, plus .validate-questions / .validate-suggestions list containers - Add hover filter:brightness states for all action buttons (btn-run, btn-cancel, btn-restart, btn-resume, btn-accept, btn-reject, btn-answer, btn-danger) — buttons had transition but no :hover rule - Add max-height + overflow-y to dialog for overflow on small screens - Add backdrop-filter blur to .panel-backdrop for glass consistency - Add .stats-bar-chart container margin rule - Fix .stats-count-box[data-state="READY"] to use --state-ready (was incorrectly using --state-running) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 daysstyle: rewrite style.css with Doot dark glass design tokensClaudomator Agent
2 daysstyle: polish Claudomator UI — close remaining gaps for full Doot visual ↵Claudomator Agent
parity - Define all missing CSS variables (--font-mono, --bg-card, --card-bg, --bg-elevated, --surface-1, --surface-hover, --border-light, --bg-hover, --code-bg, --success, --warn, --danger, --glass-bg, --glass-blur, --state-ready) to eliminate silent fallbacks throughout the stylesheet - Apply dark-glass (backdrop-filter blur) to header, tab-bar, task side panel, and dialog modals for visual parity with Doot's glassmorphism theme - Fix .task-summary-text background: was falling back to #f8f9fa (nearly white); now correctly uses --surface-1 (dark slate) - Replace all hardcoded colors in question-banner, question-input, btn-question-option, btn-question-send, question-error, and log-error with semantic CSS variable references (--warn, --danger, --border, etc.) - Change .btn-primary to use --accent instead of hardcoded #2563eb, with filter:brightness hover instead of opacity - Add subtle box-shadow glow on .task-card:hover for glass-theme depth - Remove duplicate .qa-item rule (first block had hardcoded border colors that were overridden by the second; consolidated into single definition) - Make tab-bar sticky below header (top: 57px) with same glass treatment Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 daystest: add TestPool_DependsOn_NoDeadlockstory/repo-urlPeter Stone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 daysfix: resolve dep-chain deadlock; broadcast task_started for UI visibilityPeter Stone
With maxPerAgent=1, tasks with DependsOn were entering waitForDependencies while holding the per-agent slot, preventing the dependency from ever running. Fix: check deps before taking the slot. If not ready, requeue without holding activePerAgent. Also accept StateReady (leaf tasks) as a satisfied dependency, not just StateCompleted. Add startedCh to pool and broadcast task_started WebSocket event when a task transitions to RUNNING, so the UI immediately shows the running state during the clone phase instead of waiting for completion. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 daysfix: expose drained state in agent status API; fix AgentEvent JSON casingPeter Stone
AgentStatusInfo was missing drained field so UI couldn't show drain lock. AgentEvent had no JSON tags so ev.agent/event/timestamp were undefined in the stats timeline. UI now shows "Drain locked" card state with undrain CTA. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 daysfix: set RepositoryURL on tasks created via story approvePeter Stone
handleApproveStory was creating tasks without RepositoryURL, causing executions to fail with "task has no repository_url". Now looks up the project's RemoteURL and sets it on all tasks and subtasks. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 daysfix: story tasks get Project field; elaborate reads worklog; deploy chmod ↵Peter Stone
scripts - handleApproveStory: set Project = input.ProjectID on tasks and subtasks so the executor can resolve RepositoryURL from the project registry (was causing "task has no repository_url" on every story task) - elaborate.go: read .agent/worklog.md instead of SESSION_STATE.md for project context injected into elaboration prompts - deploy: explicitly chmod +x all scripts before restart (same root cause as the binary execute-bit loss — chown -R was stripping it) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 daysfix: ensure claudomator binary is executable before service restart in deployPeter Stone
chown -R in fix-permissions was stripping the execute bit on the binary, causing the service to fail with 203/EXEC on next restart. Explicitly chmod +x both bin paths as the final step before systemctl restart. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 daysfix: update deploy script to pull from main instead of masterPeter Stone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 daysfeat: add Stories UI — tab, list, new story elaborate/approve flowPeter Stone
- Stories tab (📖) with story card list, status badges, project/branch meta - New Story modal: project picker + goal textarea + AI elaboration → plan review → approve & queue - Story detail modal: status, project, branch, created date - Export storyStatusLabel() and renderStoryCard() with 16 unit tests - CSS for story cards, status badges, and modals Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 daysfix: remove duplicate summary section in task panel, fix test mock DOMPeter Stone
renderTaskPanel was rendering the summary twice — once with .task-summary before Overview, and again with .task-summary-text after it. Remove the second (post-Overview) duplicate. Add `dataset: {}` to the test mock DOM so makeMetaItem's state badge path doesn't crash during renderTaskPanel tests. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 dayschore: worklog — mark proxy work done, status idlePeter Stone
3 dayschore: replace all master branch references with mainPeter Stone
- executor.go: merge story branch to main before deploy - container.go: error messages reference git push origin main - api/stories.go: create story branch from origin/main (drop master fallback) - executor_test.go: test setup uses main branch Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 daysfeat: add ct-submit script for permission-free task creationPeter Stone
Wraps POST /api/tasks + run in a single script callable from /workspace/** (auto-permitted). Used by the ct-create skill to avoid per-call auth prompts. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 dayschore: worklog — ADR-007 item 9 done, workspace leak resolved, doot atom ↵Peter Stone
task queued Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 dayschore: update worklog — proxy done, workspace leak backlog itemPeter Stone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 daysfeat: merge story branch to master before deploy, add doot project to registryPeter Stone
- triggerStoryDeploy: fetch/checkout/merge --no-ff/push before running deploy script (ADR-007) - executor_test: TestPool_StoryDeploy_MergesStoryBranch proves merge happens - seed.go: add doot project with deploy script; wire claudomator deploy script Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 dayschore: merge agent commits — deploy trigger + post-deploy validation task ↵Peter Stone
(ADR-007) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 daysMerge branch 'master' of /site/git.terst.org/repos/claudomatorPeter Stone
3 daysfeat: validation result transitions story to REVIEW_READY or NEEDS_FIX (ADR-007)Claudomator Agent
Add checkValidationResult which inspects the final task.State of a completed validation task and updates the story to REVIEW_READY (pass) or NEEDS_FIX (fail). Wire into handleRunResult so stories in VALIDATING state are dispatched to checkValidationResult instead of checkStoryCompletion, covering both success and FAILED terminal paths. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 daysfeat: auto-create validation task on story DEPLOYED (ADR-007)Claudomator Agent
3 daysfeat: trigger deploy script on SHIPPABLE → DEPLOYED (ADR-007)Claudomator Agent
Add triggerStoryDeploy to Pool: fetches story's project, runs its DeployScript via exec.CommandContext, and advances story to DEPLOYED on success. Wire into checkStoryCompletion with go p.triggerStoryDeploy after the SHIPPABLE transition. Covered by TestPool_StoryDeploy_RunsDeployScript. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 daysfix: resolve merge conflict — integrate agent's story-aware ContainerRunnerPeter Stone
Agent added: Store on ContainerRunner (direct story/project lookup), --reference clone for speed, explicit story branch push, checkStoryCompletion → SHIPPABLE. My additions: BranchName on Task as fallback when Store is nil, tests updated to match checkout-after-clone approach. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3 daysfeat: clone story branch in ContainerRunner (ADR-007)Peter Stone
- Add BranchName field to task.Task (populated from story at execution time) - Add GetStory to executor Store interface; resolve BranchName from story in both execute() and executeResume() parallel to RepositoryURL resolution - Pass --branch <name> to git clone when BranchName is set; default clone otherwise Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5 daysfeat: Phase 4 — story-aware execution, branch clone, story completion ↵Claudomator Agent
check, deployment status - ContainerRunner: add Store field; clone with --reference when story has a local project path; checkout story branch after clone; push to story branch instead of HEAD - executor.Store interface: add GetStory, ListTasksByStory, UpdateStoryStatus - Pool.handleRunResult: trigger checkStoryCompletion when a story task succeeds - Pool.checkStoryCompletion: transitions story to SHIPPABLE when all tasks done - serve.go: wire Store into each ContainerRunner - stories.go: update createStoryBranch to fetch+checkout from origin/master base; add GET /api/stories/{id}/deployment-status endpoint - server.go: register deployment-status route - Tests: TestPool_CheckStoryCompletion_AllComplete/PartialComplete, TestHandleStoryDeploymentStatus Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5 daysfeat: populate RepositoryURL from project registry in executor (ADR-007)Peter Stone
- Add GetProject to Store interface used by executor - Resolve RepositoryURL from project registry when task.RepositoryURL is empty - Call SeedProjects at server startup so the project registry is populated - Add GetProject stub to minimalMockStore in executor tests Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5 dayschore: unify and centralize agent configuration in .agent/Peter Stone
6 daysfeat: color logo based on build version hashPeter Stone
Adds GET /api/version endpoint and uses the first 6 hex chars of the commit hash to derive an HSL hue for the header h1 logo color. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 daysfeat: Phase 5 — story elaboration endpoint, approve flow, branch creationClaudomator Agent
- POST /api/stories/elaborate: runs Claude/Gemini against project LocalPath to produce a structured story plan (name, branch_name, tasks, validation) - POST /api/stories/approve: creates story + sequentially-wired tasks/subtasks from the elaborate output and pushes the story branch to origin - createStoryBranch helper: git checkout -b + push -u origin - Tests: TestBuildStoryElaboratePrompt, TestHandleStoryApprove_WiresDepends Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 daysfeat: surface error_msg on failed task cards in UIPeter Stone
6 daysfeat: Phase 3 — stories data model, ValidStoryTransition, storage CRUD, ↵Claudomator Agent
API endpoints - internal/task/story.go: Story struct, StoryState constants, ValidStoryTransition - internal/task/task.go: add StoryID field - internal/storage/db.go: stories table + story_id on tasks migrations; CreateStory, GetStory, ListStories, UpdateStoryStatus, ListTasksByStory; update all task SELECT/INSERT to include story_id; scanTask extended with sql.NullString for story_id; added modernc timestamp format to GetMaxUpdatedAt - internal/storage/sqlite_cgo.go + sqlite_nocgo.go: build-tag based driver selection (mattn/go-sqlite3 with CGO, modernc.org/sqlite pure-Go fallback) so tests run without a C compiler - internal/api/stories.go: GET/POST /api/stories, GET /api/stories/{id}, GET/POST /api/stories/{id}/tasks (auto-wires depends_on chain), PUT /api/stories/{id}/status (validates transition) - internal/api/server.go: register all story routes - go.mod/go.sum: add modernc.org/sqlite pure-Go dependency Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 daysfix: make requeueDelay configurable to fix test timeout in ↵Peter Stone
TestPool_MaxPerAgent_BlocksSecondTask
6 daysfeat: executor reliability — per-agent limit, drain gate, pre-flight ↵Claudomator Agent
creds, auth recovery - maxPerAgent=1: only 1 in-flight execution per agent type at a time; excess tasks are requeued after 30s - Drain gate: after 2 consecutive failures the agent is drained and a question is set on the task; reset on first success; POST /api/pool/agents/{agent}/undrain to acknowledge - Pre-flight credential check: verify .credentials.json and .claude.json exist in agentHome before spinning up a container - Auth error auto-recovery: detect auth errors (Not logged in, OAuth token has expired, etc.) and retry once after running sync-credentials and re-copying fresh credentials - Extracted runContainer() helper from ContainerRunner.Run() to support the retry flow - Wire CredentialSyncCmd in serve.go for all three ContainerRunner instances - Tests: TestPool_MaxPerAgent_*, TestPool_ConsecutiveFailures_*, TestPool_Undrain_*, TestContainerRunner_Missing{Credentials,Settings}_FailsFast, TestIsAuthError_*, TestContainerRunner_AuthError_SyncsAndRetries Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 daysfix: set credentials readable by www-data (group 640) in sync-credentialsPeter Stone
6 daysfix: copy .claude.json (account settings) alongside credentialsPeter Stone
ClaudeConfigDir moved from /root/.claude to credentials/claude/, but container.go was still deriving .claude.json from filepath.Dir which no longer pointed anywhere useful. Claude CLI needs .claude.json for OAuth account info or it says "Not logged in". Also update sync-credentials to copy /root/.claude.json into the credentials dir so it stays fresh alongside the token. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 daysfeat: fail loudly when agent leaves uncommitted work in sandboxPeter Stone
After a successful run with no commits pushed, detectUncommittedChanges checks for modified tracked files and untracked source files. If any exist the task fails with an explicit error rather than silently succeeding while the work evaporates when the sandbox is deleted. Scaffold files written by the harness (.claudomator-env, .claudomator-instructions.txt, .agent-home/) are excluded from the check. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 dayschore: gitignore .claude/, credentials/, scripts/.claude/Peter Stone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 daysfeat: Phase 2 — project registry, legacy field cleanup, credential path fixPeter Stone
- task.Project type + storage CRUD + UpsertProject + SeedProjects - Remove AgentConfig.ProjectDir, RepositoryURL, SkipPlanning - Remove ContainerRunner fallback git init logic - Project API endpoints: GET/POST /api/projects, GET/PUT /api/projects/{id} - processResult no longer extracts changestats (pool-side only) - claude_config_dir config field; default to credentials/claude/ - New scripts: sync-credentials, fix-permissions, check-token Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 daysfeat: add cancel and cancel-all-failed to ct-taskPeter Stone
Adds ct-task cancel <prefix> (works from any state, falls back to direct DB update for terminal states) and ct-task cancel-all-failed to clear out stuck FAILED tasks in bulk. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 dayschore: delegate permissions and credential sync to scripts in deployPeter Stone
Replace hardcoded chown/chmod lines with fix-permissions and sync-credentials scripts, keeping deploy DRY and ensuring credentials are always fresh after each deploy. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6 daysfix: use configured claude_config_dir for container credentialsPeter Stone
The server runs as www-data whose HOME is /var/www — deriving credentials from $HOME/.claude always produced an empty path. Now reads from ClaudeConfigDir (default: /workspace/claudomator/credentials/claude), which sync-credentials keeps populated with fresh OAuth tokens. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
8 daysdocs: update ADR-007 with validation pipeline and nav projectPeter Stone
- Story state machine: SHIPPABLE → DEPLOYED → VALIDATING → REVIEW_READY | NEEDS_FIX - Merge-first strategy: no branch review phase, tests are the confidence mechanism - Elaborator owns validation spec (type, steps, success_criteria) - Validation types: curl | tests | playwright | gradle - Nav project (Android): deploy = push to GitHub, validate = gradle test/lint - Project registry: type + deploy_script fields, initial claudomator + nav entries - Out of scope: branch review deferred, CI polling out of band for nav Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
8 dayschore: improve debug-execution script and add ADR-007Peter Stone
- debug-execution: default to most recent execution when no ID given - docs/adr/007: planning layer and story model design decisions Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
8 daysfeat: add errors, throughput, and billing sections to stats dashboardPeter Stone
- GET /api/stats?window=7d: pre-aggregated SQL queries for errors, throughput, billing - Errors section: category summary (quota/rate_limit/timeout/git/failed) + failure table - Throughput section: stacked hourly bar chart (completed/failed/other) over 7d - Billing section: KPIs (7d total, avg/day, cost/run) + daily cost bar chart Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
8 daysfeat: agent status dashboard with availability timeline and Gemini quota ↵Peter Stone
detection - Detect Gemini TerminalQuotaError (daily quota) as BUDGET_EXCEEDED, not generic FAILED - Surface container stderr tail in error so quota/rate-limit classifiers can match it - Add agent_events table to persist rate-limit start/recovery events across restarts - Add GET /api/agents/status endpoint returning live agent state + 24h event history - Stats dashboard: agent status cards, 24h availability timeline, per-run execution table Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
9 daysMerge branch 'master' of /site/git.terst.org/repos/claudomatorPeter Stone
9 daysMerge feat/container-execution into masterPeter Stone
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>