Skip to content

目标

实现 Canonical content digest 计算和 Vitest adapter,为 TDD cycle evidence 提供内容指纹和测试执行能力。

实现要点

  1. Canonical Digest (src/flowrun/digest.ts)

    • computeWorkspaceDigest(root: string, options: DigestOptions): VersionedDigest
    • 接受 repo-relative paths,按 UTF-8 字节序排序
    • 纳入:文件类型(含可执行位)、原始字节、删除标记
    • 拒绝:逃逸 worktree 的 symlink
    • 忽略:.git/node_modules/coverage/dist/、policy 声明的 generated artifacts
    • Tracked 和 policy 范围内 untracked 文件均纳入
    • 算法版本:sha256-content-v1
  2. Vitest Adapter (src/flowrun/adapter.ts)

    • executeRedCheck(policy: TddRunnerPolicy, selector: string): TddCommandEvidence
    • 以 argv 数组调用进程(不拼接 shell 参数)
    • selector 通过受限语法校验(禁止 |;&$() 等)
    • 分类逻辑:
      • 成功启动 + 收集测试 + assertion 失败 → failureKind: "assertion"(算 RED)
      • 成功启动 + 目标代码不存在 → failureKind: "missing-behavior"(算 RED)
      • config/transform/dep 错误 → failureKind: "infrastructure"(不算 RED)
      • 零测试收集 → failureKind: "infrastructure"(不算 RED)
      • timeout → failureKind: "timeout"(不算 RED)
    • 返回完整 TddCommandEvidence:exitCode, failureKind, testsCollected, testsFailed, durationMs, changedFiles, outputs
  3. Test fixtures (test/flowrun/fixtures/simple-vitest/)

    • 最小 Vitest 项目:package.json, vitest.config.ts, src/sum.ts, test/sum.test.ts
    • npm test 执行并产出预期 pass/fail 结果

验收标准

  • [ ] Digest 忽略/纳入规则测试通过(含 symlink 拒绝)
  • [ ] Adapter RED 分类测试:assertion→RED, infra→不 RED
  • [ ] Selector 语法校验拒绝危险字符
  • [ ] fixture repo 测试可复现

Worktree

  • 路径: .worktree/tdd-c1-digest-adapter/
  • 分支: feat/tdd-c1-digest-adapter