-
Implements the §P1 acceptance gate from plan-migration.md: a single POST /api/devloop/projects produces a runnable todo-demo project with multi-page PRD/SDD sites, units.json, integration spec, agent-state, and history snapshots — all via mock agents (no real Claude CLI cost). Code additions: - packages/acp-core/protocol/ClaudeCliProtocol.js * mock mode now emits an extra `mock/files` acp_event when the fixture contains a files[] array. LoopController applies it to the project root, letting mock agents produce real outputs. - server/src/core/devloop/loop-controller.js (now ~280 lines) * callAgent(pid, agentName, prompt, opts) — single-agent invocation: reads system/templates/{agent}/prompt.md, runs mock protocol, applies fixture files[], timeline-logs, auto-commits. * runDocsPhase(pid, requirement) — orchestrates PM → Architect with `docs.complete` timeline marker. * getProjectState(pid) — returns project.json + units + prd_rev/sdd_rev + timeline tail for the GET /state endpoint. - server/routes/devloop.js (new) * POST /api/devloop/projects — createProject + runDocsPhase * GET /api/devloop/projects * GET /api/devloop/projects/:pid/state - server/index.js / server/agent-server.js — mount /api/devloop. Mock fixtures (drive the full acceptance file tree): - fixtures/devloop-mock/devloop-pm.json * 14 files: prd/{index,reading-guide,product/*,feature/*,flow/*,prototype/*}.html, prd/assets/{shell.css,shell.js,search-index.json}, agent-state/{pm.json,pm-todo.json}, history/prd-rev-001.html. - fixtures/devloop-mock/devloop-architect.json * 13 files: sdd/{index,mvcp/*}.html, sdd/assets/*, units.json (3 units, DAG), integration/spec.json, agent-state/{architect.json,architect-todo.json}, history/sdd-rev-001.html. Acceptance: - scripts/phase1-verify.js — spins ephemeral express app, POSTs the todo-demo project, asserts 23 expected paths exist + 3 units with l2_rounds/l2_budget + git ≥4 commits + timeline events. Tests (12 new cases): - server/tests/devloop/loop-controller.test.js (7) — callAgent + runDocsPhase + state. - server/tests/devloop/routes.test.js (5) — POST validation, full POST, GET state, 404 on unknown pid. Results: - phase0-verify: 8/8 - phase0-test-call: 7/7 - phase1-verify: 7/7 - vitest devloop+acp-core: 174/174 (was 162 → +12) Specs: docs/prd/newfunction/_spec/plan-migration.md · P1 Docs MVP Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> -
Adds the DevLoop Agent tool layer (CommonJS) under server/src/tools/devloop: - _errors.js / _sandbox.js — shared infra (3 error classes + path allow-list w/ {unitId}) - tool-registry.js — loadAllTools / dispatch / listToolNames / getDevLoopTools - persistence-tools.js (5) — write_todolist · update_todo_item · update_runtime_state · timeline_append · record_memory - doc-tools.js (12) — bootstrap_prd_site · bootstrap_sdd_site · write_chapter · write_mvcp_page · archive_doc · diff_html · diff_units · echo_diff · update_search_index · validate_prd_site · validate_sdd_consistency · hash_contract - coder-tools.js (3) — contract_bridge · sandbox_check · append_coder_log (retry fields required) - tester-tools.js (5) — parse_vitest · hint_builder · bug_open · bug_transition · bug_list - integrator-tools.js (6) — port_picker · spawn_units · health_wait · run_case · parse_placeholder · collect_stderr - triager-tools.js (4) — extract_evidence · category_classifier · diff_contract_vs_impl · find_similar_bug - bash-json-guard.js — preExecute hook blocking inline JSON in Bash (CLAUDE.md L91-99) Total: 35 callable devloop tools. Tests: 88 cases across 9 files, all passing; combined with P0.0 services suite the project now has 159 green tests. Specs: - docs/prd/newfunction/_spec/arch-tool-registry.md - docs/prd/newfunction/_spec/agents-{pm,architect,coder,tester,integrator,triager}.md Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> -
First concrete code commit for DevLoop. Implements all 7 services that P0.A tools will depend on, per plan-migration P0.0. Services (server/services/devloop/, ~900 lines): - path-resolver.js foundation — resolveProjectRoot + 12 derived paths; sandbox + linked-new mode support; sensitive path blacklist (with /tmp + os.tmpdir() exemptions); ~/.devloop/linked-projects.json registry - doc-store.js PRD/SDD multi-file site IO + cheerio validateHTML + validateUnitsSchema + canonical-JSON hashContract + automatic history/ archival - unit-registry.js FSM (M-2: pending→coding→testing→passed/failed/blocked); l2GateOpen; diffUnits (added/changed/removed); reset semantics for L2 + L3 - bug-tracker.js bugs.ndjson append-only + dedupKey + P-9 transition state machine + list/stats/history aggregation - timeline-logger.js M-13 ProcessTimeline — append/read/tail; summary truncate to 280; payload oversize → ref form - changelog-writer.js M-15 — append/read/latest for prd/sdd/units revs - sse-broker.js per-pid pub/sub + 25s heartbeat + stream.log replay via Last-Event-ID; emit returns monotonic id - git-vault.js spawn-git wrapper — init/commit/tag/log/diff/status/ resetWorkingTree/revert/archive; per-pid mutex; nothing-to-commit returns {skipped:true} not throw Tests (server/tests/devloop/, 71 passing): - path-resolver.test.js (17 cases) — sensitive path · sandbox alloc · linked-new - doc-store.test.js (12 cases) — validateHTML · validateUnitsSchema · hashContract - unit-registry.test.js (15 cases) — FSM transitions · l2GateOpen · diffUnits - bug-tracker.test.js (10 cases) — open dedup · transition · list filter · history - timeline-logger.test.js (9 cases) — append/read/tail · summary truncate · oversize - git-vault.test.js (8 cases) — init idempotent · commit · tag · status · archive vitest config (`globals: true`) means tests use describe/it/expect globally, no `require('vitest')` needed (and would fail under vitest 4). Dep added: cheerio@^1.0.0 (used by docStore.validateHTML; HTML parsing). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
-
- Agent as Micro-Container: each agent lives in data/agents/{id}/ with full encapsulation - Persona vs Capability split: agent.md (identity) + .claude/skills/main_skill/SKILL.md (workflow) - Conversations co-located: data/agents/{id}/conversations/ replaces global dir - Meta Skills renamed: meta_hunt, meta_digest, meta_creator, meta_evolving, meta_benchmark, meta_research - Dynamic Hot-Reload: AgentManager.getAgentConfig() falls back to filesystem scan - Parallel Sub-Agent orchestration via Promise.all with multi-terminal UI - Removed SQLite dependency, global skills/ directory, and legacy conversations/ - Full architecture docs: 18-local-filesystem-first-agent-encapsulation.md