@praxisflux/gates 0.6.4 → 0.6.5

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@praxisflux/gates",
3
- "version": "0.6.4",
3
+ "version": "0.6.5",
4
4
  "description": "praxisflux gate checks as a zero-dependency CLI (spec-bridge, wiki-freshness, course) — status can't exceed proven artifacts",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -119,6 +119,25 @@ export function checkBridge(root) {
119
119
  warnings.push(
120
120
  `[spec-bridge] ${task.id} is "${task.status}" but ${task.specDir} already derives "${derived.status}" — run the spec-bridge sync skill to catch the board up.`
121
121
  );
122
+ } else if (
123
+ // Strict-mode near-miss: the status is honest ("ok"), every checkbox is checked, and
124
+ // the ONLY thing between this task and Done-eligible is the analysis requirement.
125
+ // Without this notice the state is silent — Done is out of reach and nothing says so
126
+ // until someone thinks to run `state`. Warn (the warn channel), never block.
127
+ v === "ok" &&
128
+ derived.analysis?.required &&
129
+ derived.status !== STATUS.DONE_ELIGIBLE &&
130
+ derived.tasksTotal > 0 &&
131
+ derived.tasksDone === derived.tasksTotal &&
132
+ existsSync(join(root, task.specDir, "plan.md"))
133
+ ) {
134
+ const a = derived.analysis;
135
+ warnings.push(
136
+ `[spec-bridge] ${task.id}: all ${derived.tasksTotal} spec tasks checked; Done blocked by strict mode: ` +
137
+ (!a.present
138
+ ? "analysis.md missing — run /speckit.analyze and save its report as " + `${task.specDir}/analysis.md`
139
+ : `unresolved CRITICAL finding(s) in analysis.md: ${a.criticals.join(" | ")}`)
140
+ );
122
141
  }
123
142
  }
124
143
  return { links, problems, warnings };