• DevLoop 本质是 loop workflow(L1/L2/L3 三层嵌套,PM→Architect→Coder→Tester→
    Integrator→Triager 六个固定角色),已被 27 号系列的 graph workflow(org graph +
    work graph,graph-engine.js)严格覆盖——loop 只是 graph 的一个退化形状。
    用户评估 27 号总纲原计划的 P6(DevLoop 收编)后拍板:不做迁移,直接整体退役。
    
    决策记录、评估过程、退役范围与保留项详见 docs/done/system-design/52-devloop-retirement.md。
    
    删除:
    - 后端:routes/devloop.js、src/core/devloop/、services/devloop/ 下除
      path-resolver.js/doc-store.js 外的全部文件、src/tools/devloop/、
      server/public/devloop-status.html、两个 server 入口的 /api/devloop 挂载
    - 前端:views/DevLoop*.vue(4)、components/devloop/(12)、router 里的 4 条路由
    - system/agents/devloop-{pm,architect,coder,tester,integrator,triager}/(6 个本体)
      + _registry.json 对应条目
    - server/tests/devloop/(21 个测试文件)+ 1 处跨文件断言(route-auth-gate.test.js)
    - fixtures/devloop-mock/ 下 DevLoop 专属 fixture + fixtures/devloop-mock-scenarios/
    - 8 个 DevLoop 专属人工验证脚本(phase1-5-verify.js 等)→ 归档
    - package.json 的 spec:extract/spec:check、scripts/git-hooks/pre-commit
      (唯一职责是校验已归档的 docs/prd/newfunction)
    
    保留(仍被 27 号系列现役代码依赖,文件顶部已加说明):
    - server/services/devloop/path-resolver.js(graph-engine.js 项目根分配用)
    - server/services/devloop/doc-store.js(hashContract 被 graph-engine.js/
      goal-contract.js 复用)
    - fixtures/devloop-mock/ 目录本身(graph-engine 真实链路测试共用这批 fixture)
    
    归档到 docs/_archive/devloop-prd-2026-09-17/:docs/prd/ 整站、build-manifest.json、
    5 个 PRD 抽取脚本、8 个人工验证脚本。
    
    顺带修正:work-graph-skeletons.test.js 的占位符不再依赖已删除的 devloop-* 本体;
    CLAUDE.md/docs/README.md 全面同步;no-dead-path-references.test.js 揪出的两处
    死链接(brace-expansion 写法、历史路径未加归档说明)已修。
    
    全量 vitest(1403 passed,3 条与本次改动无关的既有失败)、web:build、真实
    server 启动(含 graph-seed 自愈:自动清理了库里残留的 devloop-* system_agents 行)
    均已验证。
    
    Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
    Claude-Session: https://claude.ai/code/session_01JnCKUFSGvdz4SY7BvYWdMU
    yibo authored
     
    Browse File »

  • 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>
    yibo authored
     
    Browse File »