@xulthekl/team-flow 0.31.0 → 0.32.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/always/phase-guard.md +1 -1
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -2
- package/.cursor-plugin/marketplace.json +2 -2
- package/.cursor-plugin/plugin.json +2 -2
- package/.github/plugin/marketplace.json +2 -2
- package/AGENTS.md +3 -3
- package/CHANGELOG.md +69 -0
- package/GEMINI.md +1 -1
- package/HANDOFF.md +1 -1
- package/INSTALL.md +1 -1
- package/README.md +2 -2
- package/agents/contract-builder.md +6 -1
- package/docs/README_en.md +1 -1
- package/docs/solutions/INDEX.md +2 -0
- package/docs/solutions/cross-phase/2026-08-01-no-summary.md +17 -0
- package/docs/solutions/cross-phase/2026-08-03-no-summary.md +17 -0
- package/gemini-extension.json +2 -2
- package/hooks/pre-tool-use-guard +43 -2
- package/hooks/session-start +2 -2
- package/llms.txt +1 -1
- package/package.json +6 -2
- package/plugin.json +1 -1
- package/scripts/guard/checks/test-gate-exemptions.mjs +53 -0
- package/scripts/guard/checks/test-matrix-complete.mjs +54 -30
- package/scripts/guard/checks/test-matrix-ready.mjs +60 -0
- package/scripts/guard/checks/tests-passing.mjs +112 -24
- package/scripts/guard/guard.mjs +11 -2
- package/scripts/lib/cmd-doctor.mjs +43 -1
- package/scripts/lib/cmd-execution.mjs +24 -1
- package/scripts/lib/cmd-state.mjs +28 -5
- package/scripts/lib/cmd-validate.mjs +42 -0
- package/scripts/lib/cmd-version.mjs +26 -21
- package/scripts/lib/execution-plan.mjs +23 -0
- package/scripts/lib/state-loader.mjs +16 -2
- package/scripts/lib/test-record.mjs +212 -0
- package/scripts/team-flow.mjs +3 -0
- package/skills/contract-builder/SKILL.md +9 -10
- package/skills/release-archivist/SKILL.md +16 -9
- package/skills/session-handoff/SKILL.md +1 -0
- package/skills/workflow-start/SKILL.md +5 -3
- package/skills/workflow-start/references/routing-rules.md +10 -6
- package/tests/e2e.test.mjs +0 -266
- package/tests/lib/cmd-audit.test.mjs +0 -202
- package/tests/lib/cmd-checkpoint.test.mjs +0 -98
- package/tests/lib/cmd-config.test.mjs +0 -101
- package/tests/lib/cmd-doctor.test.mjs +0 -450
- package/tests/lib/cmd-execution.test.mjs +0 -647
- package/tests/lib/cmd-handoff.test.mjs +0 -137
- package/tests/lib/cmd-inject.test.mjs +0 -218
- package/tests/lib/cmd-install-workbuddy.test.mjs +0 -113
- package/tests/lib/cmd-install-zcode.test.mjs +0 -42
- package/tests/lib/cmd-isolate.test.mjs +0 -68
- package/tests/lib/cmd-list.test.mjs +0 -127
- package/tests/lib/cmd-runtime.test.mjs +0 -83
- package/tests/lib/cmd-state-missing.test.mjs +0 -65
- package/tests/lib/cmd-state.test.mjs +0 -365
- package/tests/lib/cmd-sync-paths.test.mjs +0 -84
- package/tests/lib/cmd-validate-paths.test.mjs +0 -90
- package/tests/lib/config-loader.test.mjs +0 -175
- package/tests/lib/ensure-branch.test.mjs +0 -110
- package/tests/lib/execution-control-plane.test.mjs +0 -168
- package/tests/lib/execution-plan.test.mjs +0 -474
- package/tests/lib/guard-compound-captured.test.mjs +0 -92
- package/tests/lib/guard-specs-merged.test.mjs +0 -110
- package/tests/lib/guard-tests-passing.test.mjs +0 -114
- package/tests/lib/guard-transitions.test.mjs +0 -262
- package/tests/lib/guard.test.mjs +0 -613
- package/tests/lib/hash.test.mjs +0 -138
- package/tests/lib/infer-workflow.test.mjs +0 -161
- package/tests/lib/install-git-hooks.test.mjs +0 -20
- package/tests/lib/marketplace-release-docs.test.mjs +0 -31
- package/tests/lib/minimality-discipline.test.mjs +0 -37
- package/tests/lib/model-profiles-docs.test.mjs +0 -33
- package/tests/lib/node20-compatibility.test.mjs +0 -73
- package/tests/lib/node20-test-entry.test.mjs +0 -17
- package/tests/lib/platform-runtime-distribution.test.mjs +0 -157
- package/tests/lib/raw-mode-smoke.test.mjs +0 -42
- package/tests/lib/sdd-overlay.test.mjs +0 -118
- package/tests/lib/solutions-capture.test.mjs +0 -108
- package/tests/lib/solutions-index-gen.test.mjs +0 -147
- package/tests/lib/solutions-inject.test.mjs +0 -115
- package/tests/lib/solutions-promote.test.mjs +0 -200
- package/tests/lib/spec-paths.test.mjs +0 -80
- package/tests/lib/state-loader.test.mjs +0 -251
- package/tests/lib/token-baseline.test.mjs +0 -72
- package/tests/lib/token-rules.test.mjs +0 -94
- package/tests/lib/verify-marketplace-release.test.mjs +0 -128
- package/tests/tsconfig.json +0 -12
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "team-flow",
|
|
3
|
-
"description": "Unified workflow plugin: team-flow + compound-engineering core subset + architecture-design + prototype + workflow-orchestrator + workflow-bootstrap + e2e + session-handoff + workflow-feedback.
|
|
3
|
+
"description": "Unified workflow plugin: team-flow + compound-engineering core subset + architecture-design + prototype + workflow-orchestrator + workflow-bootstrap + e2e + session-handoff + workflow-feedback. 24 skills + 15 agents, one install.",
|
|
4
4
|
"owner": {
|
|
5
5
|
"name": "LT",
|
|
6
6
|
"url": "https://github.com/LT"
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"plugins": [
|
|
9
9
|
{
|
|
10
10
|
"name": "team-flow",
|
|
11
|
-
"description": "8-state spec workflow + compound global compounding + architecture-design (4A/DDD) + local HTML prototype + product-level orchestration + bootstrap + e2e + session handoff + workflow feedback.
|
|
12
|
-
"version": "0.
|
|
11
|
+
"description": "8-state spec workflow + compound global compounding + architecture-design (4A/DDD) + local HTML prototype + product-level orchestration + bootstrap + e2e + session handoff + workflow feedback. 24 skills + 15 agents with embedded TDD, SDD, code review, debugging, delta spec sync, and design-system-driven prototyping.",
|
|
12
|
+
"version": "0.32.2",
|
|
13
13
|
"source": "./",
|
|
14
14
|
"author": {
|
|
15
15
|
"name": "LT",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "team-flow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.2",
|
|
4
4
|
"description": "Unified workflow plugin: team-flow (spec-driven dev: TDD/SDD/code-review/debugging) + compound-engineering core subset (brainstorm/plan/compound/strategy/ideate/proof, global compounding) + architecture-design (4A+DDD incremental design & global compounding) + prototype (local HTML prototype, zero external deps) + e2e (Playwright E2E, AC-driven) + workflow-orchestrator (product-level workflow orchestration) + workflow-bootstrap (existing project onboarding) + session-handoff (context transfer) + workflow-feedback (issue tracking). 24 skills + 15 agents, one install.",
|
|
5
5
|
"source": "./",
|
|
6
6
|
"author": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "team-flow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.2",
|
|
4
4
|
"description": "Spec-first workflow that bridges OpenSpec-style planning and Superpowers-style execution discipline.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "MageByte",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"interface": {
|
|
27
27
|
"displayName": "team-flow",
|
|
28
28
|
"shortDescription": "Spec-first workflow with guarded execution.",
|
|
29
|
-
"longDescription": "A self-contained Codex workflow plugin with
|
|
29
|
+
"longDescription": "A self-contained Codex workflow plugin with 24 skills for intent exploration, planning artifacts, execution contracts, TDD execution, review gates, systematic debugging, closure, and delta spec sync.",
|
|
30
30
|
"developerName": "MageByte",
|
|
31
31
|
"category": "Developer Tools",
|
|
32
32
|
"composerIcon": "./assets/icon.svg",
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
},
|
|
6
6
|
"metadata": {
|
|
7
7
|
"description": "Unified workflow plugin marketplace for Cursor (team-flow: team-flow + compound + architecture-design + prototype).",
|
|
8
|
-
"version": "0.
|
|
8
|
+
"version": "0.32.2"
|
|
9
9
|
},
|
|
10
10
|
"plugins": [
|
|
11
11
|
{
|
|
12
12
|
"name": "team-flow",
|
|
13
13
|
"source": ".",
|
|
14
|
-
"description": "Unified workflow plugin: team-flow + compound-engineering core subset + architecture-design + prototype.
|
|
14
|
+
"description": "Unified workflow plugin: team-flow + compound-engineering core subset + architecture-design + prototype. 24 skills + 15 agents."
|
|
15
15
|
}
|
|
16
16
|
]
|
|
17
17
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "team-flow",
|
|
3
3
|
"displayName": "team-flow",
|
|
4
|
-
"description": "Unified workflow plugin: team-flow (spec-driven dev: TDD/SDD/code-review/debugging) + compound-engineering core subset (brainstorm/plan/compound/strategy/ideate/proof, global compounding) + architecture-design (4A+DDD incremental design & global compounding) + prototype (local HTML prototype, zero external deps) + e2e (Playwright E2E, AC-driven) + workflow-orchestrator (product-level workflow orchestration) + workflow-bootstrap (existing project onboarding) + session-handoff (context transfer) + workflow-feedback (issue tracking).
|
|
5
|
-
"version": "0.
|
|
4
|
+
"description": "Unified workflow plugin: team-flow (spec-driven dev: TDD/SDD/code-review/debugging) + compound-engineering core subset (brainstorm/plan/compound/strategy/ideate/proof, global compounding) + architecture-design (4A+DDD incremental design & global compounding) + prototype (local HTML prototype, zero external deps) + e2e (Playwright E2E, AC-driven) + workflow-orchestrator (product-level workflow orchestration) + workflow-bootstrap (existing project onboarding) + session-handoff (context transfer) + workflow-feedback (issue tracking). 24 skills + 15 agents, one install.",
|
|
5
|
+
"version": "0.32.2",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "LT",
|
|
8
8
|
"url": "https://github.com/LT"
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "Unified workflow plugins and skills for AI coding agents (team-flow: team-flow + compound + architecture-design + prototype).",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.32.2"
|
|
10
10
|
},
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
13
13
|
"name": "team-flow",
|
|
14
14
|
"description": "Unified workflow with planning artifacts, execution contracts, TDD, review gates, systematic debugging, delta spec sync, architecture-design, and local HTML prototyping.",
|
|
15
|
-
"version": "0.
|
|
15
|
+
"version": "0.32.2",
|
|
16
16
|
"source": ".",
|
|
17
17
|
"author": {
|
|
18
18
|
"name": "LT",
|
package/AGENTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# AGENTS.md · team-flow
|
|
2
2
|
|
|
3
|
-
> team-flow 统一插件 = **team-flow**(spec 驱动开发)+ **compound-engineering 核心子集**(全局复利)+ **architecture-design**(4A+DDD 增量设计)+ **prototype**(本地 HTML 原型)+ **e2e**(AC 驱动 Playwright E2E)+ **workflow-orchestrator**(产品级编排)+ **workflow-bootstrap**(既有项目接入)。一次安装,七套能力协同(
|
|
3
|
+
> team-flow 统一插件 = **team-flow**(spec 驱动开发)+ **compound-engineering 核心子集**(全局复利)+ **architecture-design**(4A+DDD 增量设计)+ **prototype**(本地 HTML 原型)+ **e2e**(AC 驱动 Playwright E2E)+ **workflow-orchestrator**(产品级编排)+ **workflow-bootstrap**(既有项目接入)。一次安装,七套能力协同(24 skills + 15 agents),支持 9 安装面(Claude Code, Cursor, OpenAI Codex CLI/App, GitHub Copilot CLI, Gemini CLI, OpenCode, WorkBuddy, Trae, ima-copilot)。
|
|
4
4
|
|
|
5
5
|
## What This Is
|
|
6
6
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
### 身份与依赖关系
|
|
14
14
|
|
|
15
|
-
- **team-flow**(本插件):Claude Code / Cursor 等宿主的插件实体(`plugin.json` name = `team-flow`),包含
|
|
15
|
+
- **team-flow**(本插件):Claude Code / Cursor 等宿主的插件实体(`plugin.json` name = `team-flow`),包含 24 个 skills + 15 个 agents + hooks + templates
|
|
16
16
|
- **@xulthekl/team-flow**(npm 底座包):team-flow 的 CLI 工具层(`package.json` name = `@xulthekl/team-flow`,bin = `tf` / `team-flow`),提供状态机、校验、复利 CLI 等运行时能力
|
|
17
17
|
- 关系:team-flow 插件 **包含** @xulthekl/team-flow npm 包作为底座(同一仓库、同一版本)。skills 中的 `tf ...` 调用的是已全局安装的 @xulthekl/team-flow CLI,版本由 session-start hook 自动同步
|
|
18
18
|
- 历史身份(已废弃):`spec-superflow`(npm 包名,0.11.0 后停止发布)/ `ssf`(CLI 前缀)/ `.spec-superflow.yaml`(状态文件)—— 详见设计增强方案 v0.9 §27
|
|
@@ -33,7 +33,7 @@ node --test tests/e2e.test.mjs --test-name-pattern="parseDeltaSpec"
|
|
|
33
33
|
npm run validate
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
## 能力概览(九套合一,
|
|
36
|
+
## 能力概览(九套合一,24 skills)
|
|
37
37
|
|
|
38
38
|
### 1. team-flow(底座,9 skills)
|
|
39
39
|
spec 驱动开发过程。8 态变更机:`exploring → specifying → bridging → approved-for-build → executing → closing`(另有 `debugging` 侧路径 + `abandoned` 终态)。
|
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,75 @@ The format loosely follows Keep a Changelog.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.32.2] - 2026-08-03
|
|
10
|
+
|
|
11
|
+
### Fixed(C1 死锁链修复三件套,设计见工作区级文档 team-flow-workspace/docs/plan/v0.32.2-hook-and-gate-fix.md)
|
|
12
|
+
|
|
13
|
+
#### pre-tool-use-guard 路径化(P1-44,死锁环1)
|
|
14
|
+
- **hooks/pre-tool-use-guard**:新增产物区豁免——Write/Edit/MultiEdit 目标在活动 change 目录内(architecture/、specs/、proposal/design/tasks、contract、test-matrix、reviews 等工作流产物)→ 全状态放行;change 目录外(实现代码)→ 维持状态门禁(仅 approved-for-build/executing/debugging)。修复 exploring/specifying/bridging 阶段产物写入被一刀切拦截、LLM 被迫 Bash 绕过(写入彻底脱管)的死锁
|
|
15
|
+
- `.team-flow.yaml` 本身恒受状态门禁(state 禁写红线保留)
|
|
16
|
+
- macOS symlink 归一化(/private/var ↔ /var 双侧对齐),防物理/逻辑路径前缀失配
|
|
17
|
+
|
|
18
|
+
#### exploring→specifying 门禁时序(P3-10,死锁环2)
|
|
19
|
+
- **scripts/guard/guard.mjs**:`exploring:specifying` 移除 `artifacts-exist` 维度(四件规划产物由 spec-writer 在 specifying 阶段生成,转换前要求属鸡生蛋死锁);产物齐全性由 `specifying:bridging` 独家负责(该维度本就挂着,单一责任人)
|
|
20
|
+
|
|
21
|
+
#### hooks 版本同步(P2-40,发版中断根治)
|
|
22
|
+
- **scripts/lib/cmd-version.mjs**:hooks/session-start 纳入自动同步——头部注释行 pattern 后缀改通配(根因:旧 pattern 写死 `: conditional injection` 措辞,hook 注释演进后失配,v0.27.2~v0.32.1 四次发版中断)+ PLUGIN_VERSION 变量首次纳入同步
|
|
23
|
+
- 顺带修复:major 版本号硬编码为 0 的缺陷(v1.0.0 里程碑会静默写成 0.x.y)——解构补 major + 全部 replacement 改 %MAJOR% 占位 + 全部 pattern 首段泛化(`0\.` → `\d+`,支持 1.x 匹配)
|
|
24
|
+
|
|
25
|
+
### Tests
|
|
26
|
+
- tests/lib/hook-pre-tool-use.test.mjs:路径化判定 9 场景矩阵(产物区放行/代码区拦截/构建态/禁写红线/无 change/非 Write 工具/相对路径)
|
|
27
|
+
- tests/lib/cmd-version-hooks.test.mjs:hooks 双位置同步 + 幂等 + pattern 防腐化 3 例
|
|
28
|
+
- guard.test.mjs / guard-dimensions.test.mjs:artifacts-exist 断言迁移至 specifying→bridging + exploring→specifying 新语义断言
|
|
29
|
+
- 全量回归:lib 498/498 + Tier1 e2e 68/68 + check-versions ✅
|
|
30
|
+
|
|
31
|
+
## [0.32.1] - 2026-08-03
|
|
32
|
+
|
|
33
|
+
> 版本号说明:0.32.0 因 `.npmignore` 缺失 `/tests/` 排除项,误将 61.8M e2e 基线归档打入 tarball(72MB),发布后 30 分钟内撤回;npm 版本号一经发布不可复用,故以 **0.32.1** 重发(内容完全一致 + 打包修复)。
|
|
34
|
+
|
|
35
|
+
### Added(设计增强方案 v0.13 §47-§53 测试门禁硬化——C1-domain-policy 事件修复)
|
|
36
|
+
|
|
37
|
+
#### 豁免键修正(v0.13 §48)
|
|
38
|
+
- **scripts/lib/state-loader.mjs**:BUILTIN_DEFAULTS 新增 `test_matrix_skip_reason` / `test_evidence_path`;`schema_version` 不进 defaults(字段缺失 = 存量信号);writeState 条件序列化 `schema_version`
|
|
39
|
+
- **scripts/lib/cmd-state.mjs**:init 分支仅在 change 创建(状态文件尚不存在)时打戳 `schema_version: 1`(rebuild/set 不追加);SETTABLE_FIELDS 移除 `test_result`、新增 `test_matrix_skip_reason`;`test_result`/`schema_version` 手工 set 被拒并给引导
|
|
40
|
+
- **scripts/guard/checks/test-gate-exemptions.mjs**:新建共享豁免判定模块(legacy/skip 语义唯一真相源,防三个测试门禁漂移)
|
|
41
|
+
- **scripts/guard/checks/test-matrix-complete.mjs**:重写——legacy/skip 双豁免;删除内容型豁免(contract 无 `## Test Matrix` 段即 PASS)与"无 contract → PASS";删除 hash null 短路;skip 必附理由
|
|
42
|
+
|
|
43
|
+
#### 门禁前移(v0.13 §49)
|
|
44
|
+
- **scripts/guard/checks/test-matrix-ready.mjs**:新建入口维度(矩阵存在非空 + contract 声明段 OR 显式 skip 附理由;legacy 豁免)
|
|
45
|
+
- **scripts/guard/guard.mjs**:full `approved-for-build:executing` 新增 `test-matrix-ready`(hotfix/tweak 沿用 §45.3 豁免不挂)
|
|
46
|
+
|
|
47
|
+
#### tests-passing 证据程序化(v0.13 §50,BUG-A 政策修正)
|
|
48
|
+
- **scripts/lib/test-record.mjs**:新建 `tf test record` 命令——maven-surefire(控制台汇总行 + XML 报告目录)/jest(--json)/pytest 解析器 + auto 识别;结构化 `test_result`(recorded-by=tf-test-record)+ 证据落盘 `.superpowers/test-evidence/`;fail 结果 exit 1;无手工自述通道
|
|
49
|
+
- **scripts/guard/checks/tests-passing.mjs**:重写——非存量 change 只认程序化结构化记录 + 证据文件存在性;dp_6_result 去证据化(BUG-A 通道仅存量保留);total=0 空真拒绝;skip 必附理由
|
|
50
|
+
- **scripts/team-flow.mjs**:注册 `test` 命令 + HELP
|
|
51
|
+
|
|
52
|
+
#### review 硬化 + 巡检扩展(v0.13 §51-§52)
|
|
53
|
+
- **scripts/lib/execution-plan.mjs**:validateReviewRange 禁止 base==head(空 diff review 非法,C1 现场 6 个 receipt 全为空 diff);receipt 新增可选 `tests` 统计字段(非负整数校验)
|
|
54
|
+
- **scripts/lib/cmd-execution.mjs**:review 新增 `--tests-total/--tests-passed/--tests-failed`(须同时提供)
|
|
55
|
+
- **scripts/lib/cmd-doctor.mjs**:新增 checkChangeTestGates 巡检(skip_reason 配对 + arch_review_report/test_evidence_path 引用完整性)
|
|
56
|
+
- **scripts/lib/cmd-validate.mjs**:test-matrix 双向互锁(契约段↔矩阵文件,非存量非 skip 时 ERROR)+ hash 漂移警告
|
|
57
|
+
|
|
58
|
+
### Changed(SOP 硬化批次,v0.13 §52)
|
|
59
|
+
- **agents/contract-builder.md**:skills 补 test-strategy 预加载(修复矩阵生成者的预加载断点)+ test-matrix.md 所有权声明
|
|
60
|
+
- **skills/contract-builder/SKILL.md**:Test Matrix Generation 升 MUST(full workflow)+ skip 必附理由
|
|
61
|
+
- **skills/release-archivist/SKILL.md**:Step 1 零测试条款(0 tests ≠ PASS)+ tf test record 程序化记录;Step 2b 矩阵缺失对非存量 change FAIL(删除静默 SKIP);dp_6 去证据化说明
|
|
62
|
+
- **skills/workflow-start/SKILL.md**:build-executor 返回验证补测试文件检查(SDD/full);contract-builder 路由声明矩阵必产;入口门禁前移引导
|
|
63
|
+
- **skills/workflow-start/references/routing-rules.md**:Route to glaf4-tests 归位(触发主体 = contract-builder;可选的是工具选择,矩阵生成本身强制)
|
|
64
|
+
- **skills/session-handoff/SKILL.md**:Guardrail #6 报告生成纪律(LLM 重构报告必须现场核对,C1 报告 10+ 处失真教训)
|
|
65
|
+
|
|
66
|
+
### Fixed(P3 审查横展修复)
|
|
67
|
+
- **skills/workflow-start/SKILL.md**:路由优先级块修正 v0.30.0 引入的存量矛盾——删除"hotfix/tweak 架构设计可跳过(自动写 skipped)"例外句(与 Fast-Path 5 处"不豁免"条款及 v0.9 §26 冲突,且无对应代码行为);skill-reviewer F-1
|
|
68
|
+
- **skills/release-archivist/SKILL.md** + **skills/contract-builder/SKILL.md**:Lightweight Closure / Hotfix Mode 补非存量 change tests-passing 门禁指引(skip+reason 或 tf test record),修复轻量收尾必然撞门禁的断点;skill-reviewer W-0
|
|
69
|
+
- **agents/contract-builder.md**:DON'T 列表终态标记条款反向措辞修正;skill-reviewer W-2
|
|
70
|
+
- **计数同步**:12 处 manifest/文档的 skill 计数修正为 24 skills(v0.31.0 新增 test-strategy 时漏更的遗留债);plugin-validator
|
|
71
|
+
|
|
72
|
+
### Tests
|
|
73
|
+
- tests/lib/schema-version.test.mjs(打戳语义 5 例)、test-record.test.mjs(解析器 9 例 + CLI 6 例)、review-hardening.test.mjs(base==head 拒绝 + 统计字段 4 例)
|
|
74
|
+
- tests/e2e/deterministic/guard-dimensions.test.mjs:test-matrix-complete 重写为 v0.13 六步判定(9 例)+ test-matrix-ready 新 describe(6 例)+ tests-passing 程序化/skip/负向用例
|
|
75
|
+
- tests/lib/cmd-state.test.mjs:test_result/schema_version 拒设用例 + skip_reason 可设用例;tests/lib/guard.test.mjs:closing 前置夹具适配(legacy 夹具直写 yaml 模拟旧 CLI)
|
|
76
|
+
- 全量回归:lib 486/486 + Tier1 e2e 67/67
|
|
77
|
+
|
|
9
78
|
## [0.31.0] - 2026-08-01
|
|
10
79
|
|
|
11
80
|
### Added(设计增强方案 v0.12 §40-§46 测试矩阵驱动开发 + 测试复利闭环)
|
package/GEMINI.md
CHANGED
|
@@ -8,7 +8,7 @@ The workflow is self-contained and does not require OpenSpec or Superpowers at r
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
<!-- team-flow-phase-guard-start -->
|
|
11
|
-
# team-flow v0.
|
|
11
|
+
# team-flow v0.32.2 | 阶段: {{state}} | 工作流: {{workflow}}
|
|
12
12
|
当前阶段允许的操作由 workflow-start 路由规则定义。
|
|
13
13
|
禁止跨越 DP gate 进入下一阶段。变更范围以 execution-contract.md 的 Intent Lock 为准。
|
|
14
14
|
<!-- team-flow-phase-guard-end -->
|
package/HANDOFF.md
CHANGED
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
| **e2e**(端到端测试) | 整个 skill | 1 |
|
|
24
24
|
| **session-handoff**(session 交接) | 整个 skill | 1 |
|
|
25
25
|
| **workflow-feedback**(反馈闭环) | 整个 skill | 1 |
|
|
26
|
-
| **合计** | | **
|
|
26
|
+
| **合计** | | **24 skills + 15 agents** |
|
|
27
27
|
|
|
28
28
|
- 零运行时外部依赖(team-flow 底座自包含)。
|
|
29
29
|
- prototype 额外**零外部依赖、可离线**(自包含 HTML + 页面内 Tweaks 控件,无 CDN)。
|
package/INSTALL.md
CHANGED
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# team-flow
|
|
2
2
|
|
|
3
|
-
> 当前版本:`v0.
|
|
3
|
+
> 当前版本:`v0.32.2`
|
|
4
4
|
|
|
5
5
|
> 统一插件:**team-flow**(spec 驱动开发)+ **compound-engineering 核心子集**(全局复利)+ **architecture-design**(4A+DDD 增量设计)+ **prototype**(本地 HTML 原型)+ **e2e**(AC 驱动 E2E)+ **workflow-orchestrator**(产品级编排)+ **workflow-bootstrap**(既有项目接入)。一次安装,七套能力协同。
|
|
6
6
|
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
git clone <your-repo> && <cli> plugin install ./team-flow
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
> 不同宿主 CLI 的安装子命令略有差异(如 Claude Code 为 `/plugin add`,Cursor 为 `plugin install`)。以宿主文档为准;本插件提供单一 `plugin.json`,一次安装即加载全部
|
|
37
|
+
> 不同宿主 CLI 的安装子命令略有差异(如 Claude Code 为 `/plugin add`,Cursor 为 `plugin install`)。以宿主文档为准;本插件提供单一 `plugin.json`,一次安装即加载全部 24 个 skills。
|
|
38
38
|
|
|
39
39
|
## 配置(插件层扩展字段)
|
|
40
40
|
|
|
@@ -28,6 +28,9 @@ color: magenta
|
|
|
28
28
|
tools: ["Read", "Bash", "Grep", "Glob", "Write", "Edit"]
|
|
29
29
|
skills:
|
|
30
30
|
- contract-builder
|
|
31
|
+
# v0.13 §52 B1:test-matrix.md 由本 agent 生成,需预加载测试设计方法论
|
|
32
|
+
#(design_method 选择/复杂度分级/对抗验证),修复 v0.31.0 的预加载断点。
|
|
33
|
+
- test-strategy
|
|
31
34
|
---
|
|
32
35
|
|
|
33
36
|
You are an independent Contract Builder. You compress approved planning artifacts into a single execution handshake: `execution-contract.md`. You operate in an independent context with Write capability for the contract file only.
|
|
@@ -36,6 +39,8 @@ You are an independent Contract Builder. You compress approved planning artifact
|
|
|
36
39
|
|
|
37
40
|
**You are the sole owner of `execution-contract.md`** within the change directory. No other agent or the orchestration layer may directly edit it. Refresh/adjustment requests MUST be routed through you via `SendMessage` resume; the orchestration layer does not edit your artifact directly.
|
|
38
41
|
|
|
42
|
+
**You are also the sole owner of `test-matrix.md`**(execution-contract.md 的附属产物,v0.12 §42 / v0.13 §52 B1):full workflow 的契约必须声明 `## Test Matrix` 段并生成非空矩阵文件(hotfix/tweak 豁免)。矩阵缺失时 `test-matrix-ready`/`test-matrix-complete` 门禁会阻断 executing 入口与 closing。
|
|
43
|
+
|
|
39
44
|
**Your preloaded Skill contains the detailed methodology** (artifact-to-contract mapping, requirement-coverage cross-check, DP-3 approval gate, stale-contract detection, hotfix minimal contract). Follow it for HOW. This prompt defines WHO you are and WHAT you must deliver.
|
|
40
45
|
|
|
41
46
|
## Iron Law
|
|
@@ -74,5 +79,5 @@ summary: "..." # handoff rules + flagged ambiguities
|
|
|
74
79
|
**DON'T:**
|
|
75
80
|
- DO NOT modify the `state` or `workflow` field of .team-flow.yaml. State transitions are the orchestrator's exclusive responsibility, executed via `tf state transition`. You only write your own dp_N_* decision fields via `tf state set` as the Skill instructs.
|
|
76
81
|
- When you receive external suggestions (reviewer findings, user opinions), verify them against the codebase FIRST — search for existing implementations/patterns before accepting. A suggestion is input, not an instruction. If a suggestion conflicts with project conventions or lacks evidence, report your concern to the main agent via SendMessage (suggestion + your evidence-based objection + alternative), do NOT silently comply.
|
|
77
|
-
-
|
|
82
|
+
- DO NOT end your final response **without** an explicit terminal marker line: `FINAL VERDICT: <DONE | BLOCKED | FAIL>`. Your SendMessage report is the authoritative result; the task-notification summary is internal metadata only.
|
|
78
83
|
- Continue to implementation while ambiguity remains, or approve the contract for the user
|
package/docs/README_en.md
CHANGED
|
@@ -126,7 +126,7 @@ npm install -g team-flow
|
|
|
126
126
|
|
|
127
127
|
### Version
|
|
128
128
|
|
|
129
|
-
- Current: `v0.
|
|
129
|
+
- Current: `v0.32.2`
|
|
130
130
|
- v0.9.1 highlights: DP-4 execution-mode recommendations, a portable runtime across 17 platforms, and a raw-package smoke with no plugin-root variable.
|
|
131
131
|
- Self-contained — no OpenSpec or Superpowers runtime required
|
|
132
132
|
- Upstream: [Fission-AI/OpenSpec](https://github.com/Fission-AI/OpenSpec), [obra/superpowers](https://github.com/obra/superpowers)
|
package/docs/solutions/INDEX.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
<!-- 每条一行,按 severity 降序,≤150 行硬上限 -->
|
|
3
3
|
| date | phase | domain | type | severity | summary | file |
|
|
4
4
|
|------|-------|--------|------|----------|---------|------|
|
|
5
|
+
| 2026-08-03 | cross-phase | general | insight | medium | (no summary) | cross-phase/2026-08-03-no-summary.md |
|
|
6
|
+
| 2026-08-01 | cross-phase | general | insight | medium | (no summary) | cross-phase/2026-08-01-no-summary.md |
|
|
5
7
|
| 2026-07-31 | cross-phase | general | insight | medium | (no summary) | cross-phase/2026-07-31-no-summary.md |
|
|
6
8
|
| 2026-07-30 | cross-phase | general | insight | medium | (no summary) | cross-phase/2026-07-30-no-summary.md |
|
|
7
9
|
| 2026-07-29 | cross-phase | general | insight | medium | (no summary) | cross-phase/2026-07-29-no-summary.md |
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "team-flow",
|
|
3
|
-
"description": "Unified workflow plugin: team-flow (spec-driven dev) + compound-engineering core subset + architecture-design (4A/DDD) + prototype (local HTML).
|
|
4
|
-
"version": "0.
|
|
3
|
+
"description": "Unified workflow plugin: team-flow (spec-driven dev) + compound-engineering core subset + architecture-design (4A/DDD) + prototype (local HTML). 24 skills, one install.",
|
|
4
|
+
"version": "0.32.2",
|
|
5
5
|
"contextFileName": "GEMINI.md"
|
|
6
6
|
}
|
package/hooks/pre-tool-use-guard
CHANGED
|
@@ -5,12 +5,21 @@
|
|
|
5
5
|
# ----------------------------------------------------------------------------
|
|
6
6
|
# Purpose
|
|
7
7
|
# ----------------------------------------------------------------------------
|
|
8
|
-
# Blocks Write/Edit/MultiEdit
|
|
8
|
+
# Blocks Write/Edit/MultiEdit IMPLEMENTATION edits unless the active
|
|
9
9
|
# team-flow change is in a state that permits building. This enforces the
|
|
10
10
|
# state-machine rule that "no implementation is allowed" outside the
|
|
11
11
|
# build-permitted states (exploring / specifying / bridging must finish and be
|
|
12
12
|
# approved before any code is written).
|
|
13
13
|
#
|
|
14
|
+
# v0.32.2 (P1-44): path-based artifact-zone exemption. The workflow itself
|
|
15
|
+
# REQUIRES artifact writes during non-build states (architecture/*.md while
|
|
16
|
+
# exploring, proposal/specs/design/tasks while specifying, contract/matrix
|
|
17
|
+
# while bridging). The original state-only gate blocked those too, forcing
|
|
18
|
+
# LLMs to bypass via Bash writes (which are not gated at all). Now writes
|
|
19
|
+
# INSIDE the active change directory (artifact zone) are allowed; only writes
|
|
20
|
+
# OUTSIDE it (implementation code) remain state-gated. `.team-flow.yaml`
|
|
21
|
+
# itself stays state-gated even inside the change dir (state 禁写红线).
|
|
22
|
+
#
|
|
14
23
|
# ----------------------------------------------------------------------------
|
|
15
24
|
# Guard logic
|
|
16
25
|
# ----------------------------------------------------------------------------
|
|
@@ -19,6 +28,9 @@
|
|
|
19
28
|
# - Not found -> ALLOW (no active team-flow change in scope).
|
|
20
29
|
# 2. Read the current workflow state from the `state:` line of the yaml.
|
|
21
30
|
# 3. For Write/Edit/MultiEdit only:
|
|
31
|
+
# 3a. Target path inside the change directory (artifact zone) AND not
|
|
32
|
+
# `.team-flow.yaml` -> ALLOW (workflow artifacts are state-agnostic).
|
|
33
|
+
# 3b. Otherwise by state:
|
|
22
34
|
# - state in {approved-for-build, executing, debugging} -> ALLOW
|
|
23
35
|
# - any other state (exploring/specifying/bridging/closing/abandoned/
|
|
24
36
|
# unknown) -> BLOCK with an explanatory reason.
|
|
@@ -101,13 +113,42 @@ state="$(grep -E '^[[:space:]]*state:[[:space:]]*' "$yaml" 2>/dev/null \
|
|
|
101
113
|
# Could not determine state -> defensive allow (never block on parse failure).
|
|
102
114
|
[ -n "$state" ] || allow
|
|
103
115
|
|
|
116
|
+
# --- v0.32.2 (P1-44): artifact-zone exemption ------------------------------
|
|
117
|
+
# Writes targeting the active change directory itself are workflow artifacts
|
|
118
|
+
# (architecture/, specs/, proposal/design/tasks, contract, test-matrix,
|
|
119
|
+
# reviews, learnings...) — required by the workflow in EVERY state, so they
|
|
120
|
+
# are exempt from the build-state gate. Only writes outside the change dir
|
|
121
|
+
# (implementation code) are gated. `.team-flow.yaml` remains gated (state 禁写).
|
|
122
|
+
file_path="$(printf '%s' "$INPUT" \
|
|
123
|
+
| grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' \
|
|
124
|
+
| head -1 \
|
|
125
|
+
| sed 's/.*:"//; s/"$//')"
|
|
126
|
+
# Relative target -> absolutize against $PWD for a stable prefix comparison.
|
|
127
|
+
case "$file_path" in
|
|
128
|
+
''|/*) : ;;
|
|
129
|
+
*) file_path="$PWD/$file_path" ;;
|
|
130
|
+
esac
|
|
131
|
+
if [ -n "$file_path" ] && [ "${file_path##*/}" != ".team-flow.yaml" ]; then
|
|
132
|
+
case "$file_path" in
|
|
133
|
+
"$dir"/*) allow ;; # artifact zone: inside the change directory
|
|
134
|
+
esac
|
|
135
|
+
# macOS symlink normalization: /var,/tmp are symlinks to /private/var,/private/tmp.
|
|
136
|
+
# $PWD may be physical (child-process chdir) while file_path is logical, or vice
|
|
137
|
+
# versa — strip the /private prefix on both sides before comparing.
|
|
138
|
+
norm_dir="${dir#/private}"
|
|
139
|
+
norm_fp="${file_path#/private}"
|
|
140
|
+
case "$norm_fp" in
|
|
141
|
+
"$norm_dir"/*) allow ;;
|
|
142
|
+
esac
|
|
143
|
+
fi
|
|
144
|
+
|
|
104
145
|
# --- decision --------------------------------------------------------------
|
|
105
146
|
case "$state" in
|
|
106
147
|
approved-for-build|executing|debugging)
|
|
107
148
|
allow
|
|
108
149
|
;;
|
|
109
150
|
*)
|
|
110
|
-
reason="team-flow guard: implementation edits (Write/Edit/MultiEdit) are blocked while the change is in state '$state'.
|
|
151
|
+
reason="team-flow guard: implementation edits (Write/Edit/MultiEdit) OUTSIDE the change directory are blocked while the change is in state '$state'. Code edits are only allowed in states: approved-for-build, executing, debugging. Artifact writes inside the change directory are always permitted (v0.32.2). Advance the workflow to an approved build state first (see docs/state-machine.md or /team-flow:workflow-start). If no change is actually active, remove or fix the stray .team-flow.yaml."
|
|
111
152
|
# Escape backslashes and double quotes for safe JSON string embedding.
|
|
112
153
|
reason_esc="$(printf '%s' "$reason" | sed 's/\\/\\\\/g; s/"/\\"/g')"
|
|
113
154
|
printf '{"decision":"block","reason":"%s"}\n' "$reason_esc"
|
package/hooks/session-start
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
|
-
# v0.
|
|
2
|
+
# v0.32.2: auto-sync CLI version with plugin version
|
|
3
3
|
set -e
|
|
4
4
|
|
|
5
5
|
# ═══════════════════════════════════════════════════════════════
|
|
6
6
|
# Plugin version (update this when releasing new versions)
|
|
7
7
|
# ═══════════════════════════════════════════════════════════════
|
|
8
|
-
PLUGIN_VERSION="0.
|
|
8
|
+
PLUGIN_VERSION="0.32.2"
|
|
9
9
|
|
|
10
10
|
# ═══════════════════════════════════════════════════════════════
|
|
11
11
|
# Step 1: Auto-sync CLI version with plugin version
|
package/llms.txt
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Overview
|
|
4
4
|
spec-superflow is a self-contained workflow integration plugin for Claude Code, Cursor, OpenAI Codex CLI/App, GitHub Copilot CLI, Gemini CLI, OpenCode, WorkBuddy, and Trae. It merges spec-driven planning artifacts (proposal, specs, design, tasks) with disciplined execution guardrails (TDD, review gates, controlled handoff) into one unified workflow.
|
|
5
5
|
|
|
6
|
-
Current version: v0.
|
|
6
|
+
Current version: v0.32.2.
|
|
7
7
|
|
|
8
8
|
## Key Documents
|
|
9
9
|
- README.md: Chinese homepage with full usage guide and FAQ
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xulthekl/team-flow",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Unified plugin (
|
|
3
|
+
"version": "0.32.2",
|
|
4
|
+
"description": "Unified plugin (24 skills + 15 agents) integrating team-flow, compound-engineering, architecture-design, prototype, design-system, workflow-orchestrator, workflow-bootstrap, e2e, session-handoff, workflow-feedback for multi-agent coding tools.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"bin": {
|
|
@@ -13,6 +13,10 @@
|
|
|
13
13
|
"build": "tsc",
|
|
14
14
|
"test": "node --test tests/e2e.test.mjs tests/lib/*.test.mjs",
|
|
15
15
|
"test:raw-mode": "node --test tests/lib/raw-mode-smoke.test.mjs",
|
|
16
|
+
"test:e2e": "node --test tests/e2e/deterministic/*.test.mjs",
|
|
17
|
+
"test:e2e:baseline": "node tests/e2e/scripts/make-baseline.mjs",
|
|
18
|
+
"test:e2e:plugin-sync": "node tests/e2e/scripts/plugin-sync.mjs",
|
|
19
|
+
"test:e2e:llm": "TF_E2E_LLM=1 node --test --test-concurrency=1 tests/e2e/workflow/*.test.mjs",
|
|
16
20
|
"validate": "node scripts/validate-artifacts",
|
|
17
21
|
"version": "node scripts/team-flow.mjs version $npm_new_version && node scripts/check-version-consistency.mjs && git add -A",
|
|
18
22
|
"check-versions": "node scripts/check-version-consistency.mjs",
|
package/plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "team-flow",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.2",
|
|
4
4
|
"description": "Unified workflow plugin: team-flow (spec-driven dev: TDD/SDD/code-review/debugging) + compound-engineering core subset (brainstorm/plan/compound/strategy/ideate/proof, global compounding) + architecture-design (4A+DDD incremental design & global compounding) + prototype (local HTML prototype, zero external deps) + e2e (Playwright E2E, AC-driven) + workflow-orchestrator (product-level workflow orchestration) + workflow-bootstrap (existing project onboarding) + session-handoff (context transfer) + workflow-feedback (issue tracking). 24 skills + 15 agents, one install.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "LT"
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// scripts/guard/checks/test-gate-exemptions.mjs — shared exemption logic for v0.13 test gates
|
|
2
|
+
//
|
|
3
|
+
// v0.13 §48/§49(设计增强方案 v0.13,C1-domain-policy 事件修复):
|
|
4
|
+
// test-matrix-complete / test-matrix-ready / tests-passing 三个测试门禁共享同一套
|
|
5
|
+
// legacy/skip 豁免语义,抽取到本模块作为唯一真相源,防止三处判定漂移。
|
|
6
|
+
//
|
|
7
|
+
// 豁免键修正背景(RC-1):v0.12 §45.3 的"存量兼容"豁免以 contract 内容为键
|
|
8
|
+
//(无 '## Test Matrix' 段即放行),无法区分"真存量"与"新 change 漏生成矩阵",
|
|
9
|
+
// 导致 v0.31.0 发布当天 C1-domain-policy 零测试通过全部门禁。v0.13 将豁免键改为
|
|
10
|
+
// state 初始化版本标记(schema_version),内容型豁免整体删除。
|
|
11
|
+
import fs from 'node:fs';
|
|
12
|
+
import path from 'node:path';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* v0.13 §48.1:legacy = v0.32.0 之前创建的 change(状态文件无 schema_version 打戳)。
|
|
16
|
+
* 打戳只发生在 `tf state init` 创建 change 时;rebuild/doctor/set 一律不追加,
|
|
17
|
+
* 因此"字段缺失"是可靠的存量信号,不会被新 CLI 重写状态文件而污染。
|
|
18
|
+
*/
|
|
19
|
+
export function isLegacyChange(state) {
|
|
20
|
+
return state?.schema_version == null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** v0.13 §48.2:显式 skip 必须附理由(可审计豁免)。 */
|
|
24
|
+
export function hasExplicitSkip(state) {
|
|
25
|
+
return state?.test_matrix_skipped === 'true'
|
|
26
|
+
&& typeof state?.test_matrix_skip_reason === 'string'
|
|
27
|
+
&& state.test_matrix_skip_reason.trim().length > 0;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** skip 已置但理由缺失 → 门禁拒绝并引导补理由。 */
|
|
31
|
+
export function skipMissingReason(state) {
|
|
32
|
+
return state?.test_matrix_skipped === 'true' && !hasExplicitSkip(state);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export const SKIP_REASON_HINT =
|
|
36
|
+
"test_matrix_skipped=true requires test_matrix_skip_reason — record it: "
|
|
37
|
+
+ "tf state set <dir> test_matrix_skip_reason '<why this change needs no test matrix>'";
|
|
38
|
+
|
|
39
|
+
/** contract 是否声明 '## Test Matrix' 段(不存在时 exists=false)。 */
|
|
40
|
+
export function contractDeclaresTestMatrix(changeDir) {
|
|
41
|
+
const contractPath = path.join(changeDir, 'execution-contract.md');
|
|
42
|
+
if (!fs.existsSync(contractPath)) return { exists: false, declares: false };
|
|
43
|
+
const contract = fs.readFileSync(contractPath, 'utf-8');
|
|
44
|
+
return { exists: true, declares: contract.includes('## Test Matrix') };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** test-matrix.md 存在性与非空性。 */
|
|
48
|
+
export function readTestMatrixFile(changeDir) {
|
|
49
|
+
const matrixPath = path.join(changeDir, 'test-matrix.md');
|
|
50
|
+
if (!fs.existsSync(matrixPath)) return { exists: false, empty: true };
|
|
51
|
+
const content = fs.readFileSync(matrixPath, 'utf-8');
|
|
52
|
+
return { exists: true, empty: content.trim().length === 0 };
|
|
53
|
+
}
|