-
hire() now checks system_agents (source_kind='template') before provisioning a new company agent: if the role has a shared template row, skip copying agent.md and instead let AgentManager.getAgentConfig()/PromptBuilder.build() resolve the prompt from the shared legacy_path at call time, with per-company context assembled from a new company-context.md. Roles without a template row (including the 6 ids that exist in both system/agents/ and system/templates/, e.g. evolver-youtube-crawler) fall back to the existing full-copy behavior unchanged. - server/services/graph-service.js (new): lookupSharedAgentMd(), upsertOrgGraphNode() - server/services/company-service.js: hire() reference-mode branch, _provisionReferenceAgent() - server/src/core/agent-manager.js: getAgentConfig() resolves prompt/companyContextPath - server/src/core/prompt-builder.js: build() concatenates company-context.md - unit + integration tests covering all 6 acceptance criteria from docs/todo/system-design/27-p1-virtual-reference.md §6, including a regression test against the real idearun:evolver-youtube-crawler naming-collision case Full regression suite (587 tests) passes; independent adversarial review found 0 blocking/major issues. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
-
Adds server/services/graph-db.js (new data/graph.sqlite: system_agents, org_graph_nodes, org_graph_edges) and graph-seed-service.js, which scans system/agents/, system/templates/, and data/companies/*/company.json into seed rows without touching company-service.js's existing hire/copy path. Real repo data diverged from the design doc's original estimates (8 not 10 global agents; 39 not 34 template dirs; system/agents/ and system/templates/ turn out to share 6 ids describing the "same" agent from two different files) — documented in docs/todo/system-design/27-graph-agent-architecture.md section 7 for P1/P2 to resolve. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
-
Implements the §P2 acceptance gate from plan-migration.md: a single POST /api/devloop/projects/:pid/run?only=todo-be drives the L1 inner loop (Coder → Tester → fail → Coder → Tester → pass), with the second Coder pass demonstrably reflecting on the first failure. Mock protocol — stateful sequences: - packages/acp-core/protocol/ClaudeCliProtocol.js * Mock fixtures now support `sequence: [{chunks,result,files}, ...]`. Each protocol.connect() + sendPrompt() consumes the next variant; sticks on the last entry after exhausted. * Static `ClaudeCliProtocol.resetMockState()` clears counters between test runs. Fixtures: - fixtures/devloop-mock/devloop-architect.json — units.json now has status:pending + retries:0 + retry_budget per unit, plus units/{todo-be,todo-db,todo-fe}/spec.json so Tester has acceptance criteria to read. - fixtures/devloop-mock/devloop-coder.json — sequence: implement (with intentional missing 400 branch) → retry (reflective fix, coder.log attempt:2 has last_failure/last_cause/this_fix/rationale). - fixtures/devloop-mock/devloop-tester.json — sequence: fail (1/3 failure with hint pointing at missing body validation) → pass (3/3). LoopController: - server/src/core/devloop/loop-controller.js — adds: * runUnit(pid, unitId, opts) — drives the L1 loop via unit-registry FSM (pending → coding → testing → failed → coding → testing → passed/blocked). Calls Coder then Tester per attempt; on failure, builds a retry context summarizing prior coder.log + tester failures and feeds it into the next Coder prompt. * _buildRetryContext + _findLatestTesterResult helpers. * callAgent now rewrites units.json.project_id to the real pid after mock writes (so unit-registry validation passes). Route: - server/routes/devloop.js — adds POST /projects/:pid/run?only=<unitId>. Without ?only, returns 501 (full project run lands in P3). Acceptance: - scripts/phase2-verify.js — 6 steps: 1. POST /projects (PM + Architect) 2. POST /run?only=todo-be returns ok=true, attempts=2, final=passed 3. FSM trail matches expected 6-step transition sequence 4. coder.log second entry has all 4 reflection fields 5. runs/ has ≥2 result.json with first.ok=false, last.ok=true 6. sandbox cross-unit + prd writes blocked by ToolSandboxError Tests (5 new cases): - server/tests/devloop/run-unit.test.js (4) — FSM trail, coder.log reflection, runs/ result chain, sandbox enforcement. - server/tests/devloop/routes.test.js (+3) — POST /run validation, full P2 loop, 404 on unknown unit. Results: - phase0-verify: 8/8 - phase0-test-call: 7/7 - phase1-verify: 7/7 - phase2-verify: 6/6 - vitest devloop+acp-core: 181/181 (was 174 → +7) Specs: - docs/prd/newfunction/_spec/plan-migration.md · P2 验收 - docs/prd/newfunction/_spec/loops-l1.md (retryWithReflection) - docs/prd/newfunction/_spec/agents-coder.md - docs/prd/newfunction/_spec/agents-tester.md Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> -
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> -
Final P0 deliverables to make the system bootable in mock mode and pass `scripts/phase0-verify.js` + `scripts/phase0-test-call.js` end-to-end. ClaudeCliProtocol (mock mode): - LEMONBOSS_CLAUDE_MODE=mock or { mock: true } in constructor enables mock mode. connect() becomes a no-op; sendPrompt reads fixtures from fixtures/devloop-mock/{agentName}.json and emits scripted session_update chunks + session/result(mock=true). Falls back to default.json. Agent registry: - 6 entries added to system/templates/_registry.json (devloop-pm, devloop-architect, devloop-coder, devloop-tester, devloop-integrator, devloop-triager). - Per-agent dirs system/templates/devloop-{role}/ with: * prompt.md — auto-extracted from agents-{role}.html §2.2 * config.json — cli.toolPolicy.allowedTools + sandbox.writeAllowList Tooling: - scripts/extract-agent-prompts.js — regex-extracts §2.2 system prompts from 6 agent HTML pages to system/templates/devloop-{role}/prompt.md. - server/src/tools/devloop/index.js — central export (tools Map, bashHooks, dispatch). - server/src/core/devloop/loop-controller.js (P0 skeleton) — exposes createProject (sandbox alloc + git init + first commit + timeline) and commitAfterAgent (per-agent kind-routed git commit + timeline event). Mock fixtures: - fixtures/devloop-mock/default.json + devloop-pm.json Acceptance scripts: - scripts/phase0-verify.js — 8 static checks (35 tools loadable, 6 agents registered, prompt+config wired, bash guard exported, services require, fixtures present, git-vault interface, loop-controller). - scripts/phase0-test-call.js — 7 end-to-end steps under mock mode (createProject → CLI connect → sendPrompt chunks → no-op commit returns null → real write commits → git log ≥2 → timeline has both events). vitest.config.js: include packages/**/*.test.js so the mock smoke test runs in the suite. Results: - 162/162 devloop + acp-core tests pass (up from 159). - phase0-verify: 8/8. - phase0-test-call: 7/7. Specs: docs/prd/newfunction/_spec/plan-migration.md · Quick-Start step 7 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>
-
1. Evolver agent.md: Added token budget rules - No re-reading unchanged files between iterations - Use head/grep instead of cat for large files - Concise output only (scores + diff summary, no full SKILL.md) - Cap at 5 iterations per session (was 10) - Early stop if score change < 2 points for 2 consecutive rounds 2. agent-chat.js: System prompt size guards - MAX_PROMPT_FILE_SIZE = 15KB per file (auto-truncate with warning) - MAX_TOTAL_PROMPT_SIZE = 100KB total (safety net) - Prevents runaway files from inflating context ever again
-
When a task completes and triggers a callback to the parent agent, previously it always created a new convId (callback-{taskId}), spawning a fresh CLI process with full system prompt re-injection. Now it checks the sessions pool for an existing connected session of the target agent and reuses its convId. This avoids creating a new CLI process and saves the system prompt overhead (~30K tokens for master). Falls back to creating new session if no active one exists. -
Layer 1 (P0): Per-agent session mutex - heartbeat-service.js: skip heartbeat if previous session still active (30min safety valve) - agent-chat.js: reject concurrent /chat requests for same agentId with different convId (429) Multi-turn conversations on same convId still work normally Layer 2 (P1): Advisory file lock utility - server/utils/file-lock.js: O_EXCL-based .lock file mechanism Auto-cleanup stale locks, graceful degradation on timeout Root cause: HeartbeatService creates new convId per heartbeat, spawning independent Claude CLI processes that concurrently write config.json and SKILL.md, causing rollbacks and FRAUDULENT scores.
-
- New template: content-selector with skills, train data (hunt/digest/evolve) - youtube-crawler: add workspace archive, digest_v2, evolve_v2, mock data - Update agent todo/plan/SKILL files for digester, evolver, hunter, innovator, master - Update server/routes/agent-chat.js - Update .gitignore: exclude runtime data (memory, sqlite, __pycache__, temp files)
-
…day window, skip old files
-
…writes (4KB/1s), remove messages.log fallback in loadHistory
-
…to prevent EADDRINUSE
-
1. Workspace page: left file tree + right detail/editor panel - File info: name, path, size, created/modified timestamps - Three view modes: Code / Preview / Edit with save - HTML files auto-open in Preview tab (sandboxed iframe) 2. Backend APIs: - GET/PUT /:companyId/workspace/files (list + content + save) - PUT /:companyId/files/content (company file save) 3. Navbar: removed Skills/Jobs/Pipeline, added Workspace 4. All nav links open in new tabs (target=_blank)
-
- Added inline editing for template description and type fields - Implemented Delete Template functionality (removes both file system and registry entry) - Added confirmation safeguards for the destructive delete action
-
Architecture fix for long-running tool execution: 1. ClaudeCliProtocol: Two-tier idle timeout - Chat mode: 45s (detect API hang/silent rate limit) - Tool execution mode: 5min (Bash long tasks like pip install) - Automatically switches on tool_use_start / content_block_stop events 2. Provision API: POST /templates/:templateId/provision - Runs shell commands directly via child_process.exec - Bypasses Claude ACP entirely (no idle timeout issue) - 10min per-command timeout, security blocklist - Frontend button with prompt for custom commands 3. Template UI: Added 🔧 安装依赖 button (teal)
-
Fixed 4 hidden bugs where path.join(DATA_ROOT, "system", ...) was used instead of direct path.resolve to root-level system/: - agent-chat.js: billing log scan (line 804) and agent list scan (line 909) - company-service.js: TEMPLATES_DIR and GLOBAL_AGENTS_DIR constants - heartbeat-service.js: system agents scan directory These were missed because they used path.join with a variable (DATA_ROOT) rather than the literal string "data/system" that sed caught.
-
- Moved data/system/ → system/ (agents, templates, skills, data, workspace) - Updated all server route/service path references - Updated all script path references - Updated all documentation references - Restructured .gitignore for cleaner system/ vs data/ boundary system/ = platform-shared assets (system agents, template library) data/ = tenant-specific company instance data
-
…aruncreate skill paths - Upload skill files to .claude/skills/ (Claude Code ACP reads from here) - Add conversation type filter (user/callback/task/train) to AgentChat - Parse messages.log for richer conversation history display - Fix idearuncreate template & company agent skill directory structure - Add adm-zip dependency for ZIP extraction - Add fs/path top-level requires in company.js
-
- Add TaskTimeline.vue: two-pane dashboard with task list + message timeline - Add task-service.js: aggregate cross-agent conversations into task tree - 4-strategy parent-child inference (explicit meta, time-overlap, conv→tpl, master→T) - Read messages.log for full tool call details (not just history.json) - Add tasks.js API routes: GET /api/tasks, GET /api/tasks/:taskId/timeline - Mount /api/tasks in agent-server.js - Add 'Task Logs' nav entry in AppNav.vue after Templates - Support taskId in URL (/tasks/:taskId?) for sharing/bookmarking - Add --parent flag to CLI task dispatch for explicit parentTaskId - Auto-detect parentTaskId in task/dispatch from sender's active task - Add --instructions flag to template train CLI command - Update master tools.md with new parameters
-
…ictly enforce empty shell company creation
-
…th time-based multi-dimension token tracking charts
-
…en costs across agents
-
- Updated `GET /api/agent/:agentId/info` to include heartbeat and cron configurations. - Added `PUT /api/agent/:agentId/heartbeat` to update config.json and toggle service heartbeat on the fly. - Added `PUT /api/agent/:agentId/cron` to update cron.json list. - Updated AgentChat.vue detail panel UI to include interactive heartbeat toggles and a cron job management list.
-
- Updated `POST /api/company/create` to create an empty shell without bootstrapping CXO/HR automatically. - Updated `master/agent.md` instructions so Master Agent handles all Template library hirings. - Renamed 'MasterBot' navigation link to 'System Agents'. - Updated AgentChat sidebar to only show System Agents when accessed via the System Agents link.
-
- GET /api/company/templates/:id/logs scans system agent conversations - Logs stored in system agents (agent-creator/innovator), NOT in template dir - Template directories stay clean for copying - Collapsible log cards with status, time, message count, and output summary - Auto-poll during generate/train actions (10s/15s intervals)
-
- POST /api/company/templates: scaffold new template via AgentScaffold - POST /api/company/templates/:id/generate: trigger agent-creator to write definitions - POST /api/company/templates/:id/train: trigger innovator FDE training pipeline - PUT /api/company/templates/:id/files/content: save template file content - TemplateAgents.vue: create form, action buttons, editable preview, status banner