目标
实现 Canonical content digest 计算和 Vitest adapter,为 TDD cycle evidence 提供内容指纹和测试执行能力。
实现要点
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
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
Test fixtures (
test/flowrun/fixtures/simple-vitest/)- 最小 Vitest 项目:
package.json,vitest.config.ts,src/sum.ts,test/sum.test.ts - 可
npm test执行并产出预期 pass/fail 结果
- 最小 Vitest 项目:
验收标准
- [ ] Digest 忽略/纳入规则测试通过(含 symlink 拒绝)
- [ ] Adapter RED 分类测试:assertion→RED, infra→不 RED
- [ ] Selector 语法校验拒绝危险字符
- [ ] fixture repo 测试可复现
Worktree
- 路径:
.worktree/tdd-c1-digest-adapter/ - 分支:
feat/tdd-c1-digest-adapter