wogiflow 2.20.1 → 2.22.0

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.
Files changed (255) hide show
  1. package/.claude/commands/wogi-finalize.md +83 -0
  2. package/.claude/rules/_internal/self-maintenance.md +1 -1
  3. package/.claude/settings.json +1 -1
  4. package/lib/commands/login.js +1 -1
  5. package/lib/installer.js +5 -5
  6. package/lib/release-channel.js +1 -1
  7. package/lib/skill-registry.js +3 -3
  8. package/lib/workspace-events.js +1 -1
  9. package/lib/workspace-gates.js +2 -2
  10. package/lib/workspace-intelligence.js +1 -1
  11. package/lib/workspace-routing.js +1 -1
  12. package/lib/workspace.js +16 -17
  13. package/package.json +2 -2
  14. package/scripts/base-workflow-step.js +2 -2
  15. package/scripts/flow-adaptive-learning.js +6 -6
  16. package/scripts/flow-api-index.js +2 -2
  17. package/scripts/flow-architect-pass.js +1 -1
  18. package/scripts/flow-ask.js +1 -1
  19. package/scripts/flow-assumption-detector.js +1 -1
  20. package/scripts/flow-audit-gates.js +38 -12
  21. package/scripts/flow-audit.js +4 -4
  22. package/scripts/flow-auto-context.js +3 -3
  23. package/scripts/flow-background.js +1 -1
  24. package/scripts/flow-best-of-n.js +7 -7
  25. package/scripts/flow-bridge.js +3 -3
  26. package/scripts/flow-bug.js +2 -2
  27. package/scripts/flow-bulk-loop.js +7 -7
  28. package/scripts/flow-cascade-completion.js +2 -2
  29. package/scripts/flow-cascade.js +1 -1
  30. package/scripts/flow-checkpoint.js +2 -2
  31. package/scripts/flow-clarifying-questions.js +2 -2
  32. package/scripts/flow-cli.js +2 -2
  33. package/scripts/flow-code-intelligence.js +4 -4
  34. package/scripts/flow-community-sync.js +6 -6
  35. package/scripts/flow-community.js +1 -1
  36. package/scripts/flow-completion-truth-gate.js +161 -5
  37. package/scripts/flow-complexity.js +1 -1
  38. package/scripts/flow-config-defaults.js +16 -4
  39. package/scripts/flow-config-interactive.js +2 -2
  40. package/scripts/flow-config-loader.js +1 -1
  41. package/scripts/flow-config-migrate.js +5 -6
  42. package/scripts/flow-consistency-check.js +5 -5
  43. package/scripts/flow-context-compact/expander.js +1 -1
  44. package/scripts/flow-context-compact/index.js +2 -2
  45. package/scripts/flow-context-compact/section-extractor.js +3 -3
  46. package/scripts/flow-context-compact/summary-tree.js +1 -1
  47. package/scripts/flow-context-estimator.js +1 -1
  48. package/scripts/flow-context-gatherer.js +6 -6
  49. package/scripts/flow-context-generator.js +6 -6
  50. package/scripts/flow-context-init.js +2 -2
  51. package/scripts/flow-context-manager.js +1 -1
  52. package/scripts/flow-context-manifest.js +1 -1
  53. package/scripts/flow-context-monitor.js +5 -5
  54. package/scripts/flow-context-orchestrator.js +2 -2
  55. package/scripts/flow-context-scoring.js +4 -4
  56. package/scripts/flow-contract-scan.js +1 -1
  57. package/scripts/flow-correct.js +3 -3
  58. package/scripts/flow-damage-control.js +2 -2
  59. package/scripts/flow-deploy-gate.js +2 -2
  60. package/scripts/flow-deploy-history.js +1 -1
  61. package/scripts/flow-diff.js +3 -3
  62. package/scripts/flow-done-gates.js +1 -1
  63. package/scripts/flow-done.js +7 -7
  64. package/scripts/flow-durable-session.js +1 -1
  65. package/scripts/flow-entropy-monitor.js +3 -3
  66. package/scripts/flow-epics.js +5 -5
  67. package/scripts/flow-error-recovery.js +4 -4
  68. package/scripts/flow-eval-judge.js +5 -5
  69. package/scripts/flow-eval.js +7 -7
  70. package/scripts/flow-export-scanner.js +5 -5
  71. package/scripts/flow-extraction-review.js +1 -1
  72. package/scripts/flow-failure-learning.js +9 -9
  73. package/scripts/flow-feature.js +5 -5
  74. package/scripts/flow-figma-confirm.js +1 -1
  75. package/scripts/flow-figma-extract.js +2 -2
  76. package/scripts/flow-figma-index.js +2 -2
  77. package/scripts/flow-figma-match.js +1 -1
  78. package/scripts/flow-figma-mcp-server.js +3 -3
  79. package/scripts/flow-figma-orchestrator.js +1 -1
  80. package/scripts/flow-figma-registry.js +2 -2
  81. package/scripts/flow-function-index.js +2 -2
  82. package/scripts/flow-gate-confidence.js +2 -2
  83. package/scripts/flow-gate-telemetry.js +1 -1
  84. package/scripts/flow-gitignore.js +1 -1
  85. package/scripts/flow-guided-edit.js +3 -3
  86. package/scripts/flow-health.js +95 -8
  87. package/scripts/flow-hooks.js +3 -3
  88. package/scripts/flow-hybrid-detect.js +2 -2
  89. package/scripts/flow-hybrid-interactive.js +1 -1
  90. package/scripts/flow-hybrid-test.js +1 -1
  91. package/scripts/flow-hypothesis-generator.js +4 -4
  92. package/scripts/flow-instruction-richness.js +11 -11
  93. package/scripts/flow-intent-bootstrap.js +1 -1
  94. package/scripts/flow-intent-framing.js +1 -1
  95. package/scripts/flow-item-link.js +2 -2
  96. package/scripts/flow-knowledge-router.js +7 -7
  97. package/scripts/flow-knowledge-sync.js +3 -3
  98. package/scripts/flow-learning-orchestrator.js +1 -1
  99. package/scripts/flow-links.js +2 -2
  100. package/scripts/flow-log-manager.js +2 -2
  101. package/scripts/flow-logic-adversary.js +5 -4
  102. package/scripts/flow-long-input-chunking.js +1 -1
  103. package/scripts/flow-long-input-cli.js +3 -3
  104. package/scripts/flow-long-input.js +18 -18
  105. package/scripts/flow-loop-retry-learning.js +2 -2
  106. package/scripts/flow-lsp.js +4 -4
  107. package/scripts/flow-mcp-docs.js +1 -1
  108. package/scripts/flow-memory-blocks.js +5 -5
  109. package/scripts/flow-memory-compactor.js +3 -3
  110. package/scripts/flow-memory-db.js +4 -4
  111. package/scripts/flow-memory-sync.js +3 -3
  112. package/scripts/flow-metrics.js +2 -2
  113. package/scripts/flow-migrate-igr.js +2 -2
  114. package/scripts/flow-migrate.js +2 -2
  115. package/scripts/flow-model-adapter.js +4 -4
  116. package/scripts/flow-model-caller.js +8 -8
  117. package/scripts/flow-model-config.js +5 -5
  118. package/scripts/flow-model-profile.js +7 -7
  119. package/scripts/flow-model-router.js +5 -5
  120. package/scripts/flow-model-types.js +3 -3
  121. package/scripts/flow-models.js +8 -8
  122. package/scripts/flow-morning.js +1 -1
  123. package/scripts/flow-multi-approach.js +1 -1
  124. package/scripts/flow-orchestrate-context.js +2 -2
  125. package/scripts/flow-orchestrate-llm.js +4 -4
  126. package/scripts/flow-orchestrate-rollback.js +1 -1
  127. package/scripts/flow-orchestrate-state.js +6 -6
  128. package/scripts/flow-orchestrate-templates.js +1 -1
  129. package/scripts/flow-orchestrate-validation.js +2 -2
  130. package/scripts/flow-orchestrate-validator.js +1 -1
  131. package/scripts/flow-orchestrate.js +25 -25
  132. package/scripts/flow-parallel.js +1 -1
  133. package/scripts/flow-pattern-enforcer.js +7 -7
  134. package/scripts/flow-pattern-extractor.js +3 -3
  135. package/scripts/flow-peer-review.js +8 -8
  136. package/scripts/flow-pending.js +1 -1
  137. package/scripts/flow-permissions.js +1 -1
  138. package/scripts/flow-phased-task.js +1 -1
  139. package/scripts/flow-plan.js +1 -1
  140. package/scripts/flow-prd-manager.js +2 -2
  141. package/scripts/flow-product-scanner.js +2 -2
  142. package/scripts/flow-progress-tracker.js +2 -2
  143. package/scripts/flow-progress.js +1 -1
  144. package/scripts/flow-project-analyzer.js +3 -3
  145. package/scripts/flow-prompt-capture.js +2 -2
  146. package/scripts/flow-prompt-composer.js +3 -3
  147. package/scripts/flow-prompt-template.js +4 -4
  148. package/scripts/flow-providers.js +31 -23
  149. package/scripts/flow-queue.js +1 -1
  150. package/scripts/flow-registry-manager.js +4 -4
  151. package/scripts/flow-regression.js +1 -1
  152. package/scripts/flow-response-parser.js +1 -1
  153. package/scripts/flow-resume.js +1 -1
  154. package/scripts/flow-review-passes/index.js +2 -2
  155. package/scripts/flow-review-passes/integration.js +3 -3
  156. package/scripts/flow-review-passes/logic.js +3 -3
  157. package/scripts/flow-review-passes/security.js +2 -2
  158. package/scripts/flow-review-passes/structure.js +1 -1
  159. package/scripts/flow-review.js +11 -11
  160. package/scripts/flow-revision-tracker.js +2 -2
  161. package/scripts/flow-roadmap.js +2 -2
  162. package/scripts/flow-run-trace.js +1 -1
  163. package/scripts/flow-safety.js +3 -3
  164. package/scripts/flow-scanner-base.js +1 -1
  165. package/scripts/flow-scenario-engine.js +7 -7
  166. package/scripts/flow-schema-drift.js +4 -3
  167. package/scripts/flow-section-index.js +2 -2
  168. package/scripts/flow-section-resolver.js +4 -4
  169. package/scripts/flow-semantic-match.js +3 -3
  170. package/scripts/flow-session-end.js +56 -0
  171. package/scripts/flow-session-learning.js +2 -2
  172. package/scripts/flow-setup-hooks.js +1 -1
  173. package/scripts/flow-skill-create.js +3 -3
  174. package/scripts/flow-skill-freshness.js +2 -2
  175. package/scripts/flow-skill-generator.js +6 -6
  176. package/scripts/flow-skill-learn.js +7 -7
  177. package/scripts/flow-skill-matcher.js +2 -2
  178. package/scripts/flow-solution-optimizer.js +1 -1
  179. package/scripts/flow-spec-generator.js +5 -5
  180. package/scripts/flow-spec-verifier.js +2 -2
  181. package/scripts/flow-stack-wizard.js +6 -6
  182. package/scripts/flow-standards-checker.js +8 -8
  183. package/scripts/flow-standards-gate.js +4 -4
  184. package/scripts/flow-standards-learner.js +2 -2
  185. package/scripts/flow-start.js +9 -9
  186. package/scripts/flow-stats-collector.js +2 -2
  187. package/scripts/flow-status.js +1 -1
  188. package/scripts/flow-step-changelog.js +3 -3
  189. package/scripts/flow-step-complexity.js +1 -1
  190. package/scripts/flow-step-coverage.js +3 -3
  191. package/scripts/flow-step-knowledge.js +2 -2
  192. package/scripts/flow-step-pr-tests.js +2 -2
  193. package/scripts/flow-step-regression.js +3 -3
  194. package/scripts/flow-step-review.js +5 -5
  195. package/scripts/flow-story.js +2 -2
  196. package/scripts/flow-strict-adherence.js +2 -2
  197. package/scripts/flow-structure-sensor.js +283 -0
  198. package/scripts/flow-sync-anonymizer.js +3 -3
  199. package/scripts/flow-task-checkpoint.js +2 -2
  200. package/scripts/flow-task-classifier.js +2 -2
  201. package/scripts/flow-task-completion-summary.js +1 -1
  202. package/scripts/flow-task-enforcer.js +5 -5
  203. package/scripts/flow-tech-debt.js +3 -3
  204. package/scripts/flow-template-extractor.js +3 -3
  205. package/scripts/flow-templates.js +1 -1
  206. package/scripts/flow-test-api.js +12 -12
  207. package/scripts/flow-test-discovery.js +9 -9
  208. package/scripts/flow-test-generate.js +5 -5
  209. package/scripts/flow-test-integrity.js +3 -3
  210. package/scripts/flow-test-ui.js +8 -8
  211. package/scripts/flow-testing-deps.js +4 -4
  212. package/scripts/flow-tiered-learning.js +3 -3
  213. package/scripts/flow-todowrite-sync.js +1 -1
  214. package/scripts/flow-trap-zone.js +1 -1
  215. package/scripts/flow-verification-profile.js +9 -9
  216. package/scripts/flow-verify.js +2 -2
  217. package/scripts/flow-version-check.js +2 -2
  218. package/scripts/flow-webmcp-generator.js +3 -3
  219. package/scripts/flow-wiring-verifier.js +13 -13
  220. package/scripts/flow-worker-question-classifier.js +256 -0
  221. package/scripts/flow-workflow-steps.js +3 -3
  222. package/scripts/flow-workflow.js +1 -1
  223. package/scripts/flow-worktree.js +1 -1
  224. package/scripts/hooks/adapters/base-adapter.js +2 -2
  225. package/scripts/hooks/core/commit-log-gate.js +2 -2
  226. package/scripts/hooks/core/component-check.js +3 -3
  227. package/scripts/hooks/core/config-change.js +1 -1
  228. package/scripts/hooks/core/deploy-gate.js +2 -1
  229. package/scripts/hooks/core/git-safety-gate.js +1 -1
  230. package/scripts/hooks/core/instructions-loaded.js +1 -1
  231. package/scripts/hooks/core/loop-check.js +1 -1
  232. package/scripts/hooks/core/manager-boundary-gate.js +3 -2
  233. package/scripts/hooks/core/observation-capture.js +6 -6
  234. package/scripts/hooks/core/phase-gate.js +4 -4
  235. package/scripts/hooks/core/pre-compact.js +1 -1
  236. package/scripts/hooks/core/pre-tool-orchestrator.js +1 -1
  237. package/scripts/hooks/core/routing-gate.js +2 -84
  238. package/scripts/hooks/core/session-context.js +1 -1
  239. package/scripts/hooks/core/session-end.js +3 -3
  240. package/scripts/hooks/core/session-history.js +1 -1
  241. package/scripts/hooks/core/setup-handler.js +1 -1
  242. package/scripts/hooks/core/task-boundary-reset.js +2 -4
  243. package/scripts/hooks/core/task-completed.js +13 -7
  244. package/scripts/hooks/core/task-created.js +1 -1
  245. package/scripts/hooks/core/worktree-lifecycle.js +1 -1
  246. package/scripts/hooks/entry/claude-code/permission-denied.js +4 -2
  247. package/scripts/hooks/entry/claude-code/stop.js +60 -0
  248. package/scripts/hooks/entry/claude-code/user-prompt-submit.js +1 -1
  249. package/scripts/hooks/git/post-commit.js +1 -1
  250. package/scripts/postinstall.js +7 -7
  251. package/scripts/preuninstall.js +5 -5
  252. package/scripts/registries/component-registry.js +2 -2
  253. package/scripts/registries/contract-scanner.js +11 -11
  254. package/scripts/registries/schema-registry.js +5 -5
  255. package/scripts/registries/service-registry.js +9 -9
@@ -14,7 +14,7 @@
14
14
  const fs = require('node:fs');
15
15
  const path = require('node:path');
16
16
  const readline = require('node:readline/promises');
17
- const { getProjectRoot, colors: c, readJson, PATHS } = require('./flow-utils');
17
+ const { colors: c, readJson, PATHS } = require('./flow-utils');
18
18
 
19
19
  const DECISIONS_PATH = path.join(PATHS.workflow, 'state', 'figma-decisions.json');
20
20
 
@@ -12,7 +12,7 @@
12
12
  */
13
13
 
14
14
  const fs = require('node:fs');
15
- const path = require('node:path');
15
+ const _path = require('node:path');
16
16
 
17
17
  // ============================================================
18
18
  // Figma Node Parser
@@ -162,7 +162,7 @@ class FigmaExtractor {
162
162
  classifyNodeType(node) {
163
163
  const type = node.type;
164
164
  const childCount = node.children?.length || 0;
165
- const name = (node.name || '').toLowerCase();
165
+ const _name = (node.name || '').toLowerCase();
166
166
 
167
167
  // Explicit component types from Figma
168
168
  if (type === 'COMPONENT' || type === 'INSTANCE') {
@@ -16,7 +16,7 @@
16
16
 
17
17
  const fs = require('node:fs');
18
18
  const path = require('node:path');
19
- const { getProjectRoot, readJson, PATHS } = require('./flow-utils');
19
+ const { readJson, PATHS } = require('./flow-utils');
20
20
  const { success: printSuccess, error: printError, info: printInfo } = require('./flow-output');
21
21
 
22
22
  const REGISTRY_PATH = path.join(PATHS.workflow, 'state', 'component-registry.json');
@@ -427,7 +427,7 @@ class ComponentScanner {
427
427
 
428
428
  return component;
429
429
 
430
- } catch (err) {
430
+ } catch (_err) {
431
431
  console.log(` ⚠️ Babel parse error: ${component.name}`);
432
432
  return this.parseReactWithRegex(content, component);
433
433
  }
@@ -14,7 +14,7 @@
14
14
 
15
15
  const fs = require('node:fs');
16
16
  const path = require('node:path');
17
- const { getProjectRoot, safeJsonParse, safeJsonParseString, PATHS } = require('./flow-utils')
17
+ const { safeJsonParse, safeJsonParseString, PATHS } = require('./flow-utils')
18
18
  const { error } = require('./flow-output');;
19
19
 
20
20
  const REGISTRY_PATH = path.join(PATHS.workflow, 'state', 'component-registry.json');
@@ -23,7 +23,7 @@
23
23
  */
24
24
 
25
25
  const http = require('node:http');
26
- const fs = require('node:fs');
26
+ const _fs = require('node:fs');
27
27
  const path = require('node:path');
28
28
  const readline = require('node:readline');
29
29
 
@@ -31,7 +31,7 @@ const { ComponentScanner } = require('./flow-figma-index');
31
31
  const { FigmaExtractor } = require('./flow-figma-extract');
32
32
  const { SimilarityMatcher, MATCH_CONFIG } = require('./flow-figma-match');
33
33
  const { CodeGenerator } = require('./flow-figma-generate');
34
- const { getProjectRoot, readJson, PATHS } = require('./flow-utils');
34
+ const { readJson, PATHS } = require('./flow-utils');
35
35
 
36
36
  const REGISTRY_PATH = path.join(PATHS.workflow, 'state', 'component-registry.json');
37
37
 
@@ -135,7 +135,7 @@ class FigmaAnalyzerMCP {
135
135
  }
136
136
  }
137
137
 
138
- async analyzeScreen(figmaData, threshold) {
138
+ async analyzeScreen(figmaData, _threshold) {
139
139
  // Extract components from Figma data
140
140
  const extractor = new FigmaExtractor();
141
141
  const extracted = extractor.parse(figmaData);
@@ -20,7 +20,7 @@
20
20
 
21
21
  const fs = require('node:fs');
22
22
  const path = require('node:path');
23
- const { getProjectRoot, writeJson, readJson, PATHS } = require('./flow-utils');
23
+ const { writeJson, readJson, PATHS } = require('./flow-utils');
24
24
  const { FigmaExtractor } = require('./flow-figma-extract');
25
25
  const { FigmaComponentRegistry } = require('./flow-figma-registry');
26
26
  const { FigmaStateAnalyzer } = require('./flow-figma-state-analyzer');
@@ -15,8 +15,8 @@
15
15
 
16
16
  const fs = require('node:fs');
17
17
  const path = require('node:path');
18
- const { getProjectRoot, readJson, writeJson, PATHS } = require('./flow-utils');
19
- const { SimilarityMatcher, MATCH_CONFIG } = require('./flow-figma-match');
18
+ const { readJson, writeJson, PATHS } = require('./flow-utils');
19
+ const { SimilarityMatcher } = require('./flow-figma-match');
20
20
 
21
21
  const REGISTRY_PATH = path.join(PATHS.state, 'figma-component-registry.json');
22
22
 
@@ -15,11 +15,11 @@
15
15
 
16
16
  const fs = require('node:fs');
17
17
  const path = require('node:path');
18
- const { getProjectRoot, getConfig, color, success, warn, error, safeJsonParse, PATHS } = require('./flow-utils');
18
+ const { color, success, warn, error, safeJsonParse, PATHS } = require('./flow-utils');
19
19
  const {
20
20
  findSimilarItems,
21
21
  generateAIDecisionPrompt,
22
- generateContextBlock,
22
+ generateContextBlock: _generateContextBlock,
23
23
  getMatchConfig
24
24
  } = require('./flow-semantic-match');
25
25
  const { BaseScanner, PROJECT_ROOT } = require('./flow-scanner-base');
@@ -523,7 +523,7 @@ const VALID_DECISIONS = ['auto-apply', 'approved', 'blocked'];
523
523
  * @param {Object} params - Decision parameters
524
524
  * @throws {Error} If decision is not a valid type
525
525
  */
526
- function recordDecision({ analysisId, decision, outcome }) {
526
+ function recordDecision({ _analysisId, decision, outcome }) {
527
527
  // Validate decision type to prevent silent failures
528
528
  if (!VALID_DECISIONS.includes(decision)) {
529
529
  throw new Error(`Invalid decision type: ${decision}. Must be one of: ${VALID_DECISIONS.join(', ')}`);
@@ -774,7 +774,7 @@ Examples:
774
774
  let content;
775
775
  try {
776
776
  content = fs.readFileSync(filePath, 'utf8');
777
- } catch (err) {
777
+ } catch (_err) {
778
778
  error('Failed to read file');
779
779
  process.exit(1);
780
780
  }
@@ -46,7 +46,7 @@ const path = require('node:path');
46
46
  const crypto = require('node:crypto');
47
47
 
48
48
  const { PATHS } = require('./flow-paths');
49
- const { ensureDir, fileExists, safeJsonParse } = require('./flow-io');
49
+ const { ensureDir, fileExists } = require('./flow-io');
50
50
  const { success, warn, info, color } = require('./flow-output');
51
51
 
52
52
  // ============================================================
@@ -109,7 +109,7 @@ function readGitignore() {
109
109
  const gitignorePath = path.join(PROJECT_ROOT, '.gitignore');
110
110
  try {
111
111
  return fs.readFileSync(gitignorePath, 'utf-8');
112
- } catch (err) {
112
+ } catch (_err) {
113
113
  return '';
114
114
  }
115
115
  }
@@ -25,11 +25,11 @@ const path = require('node:path');
25
25
  const {
26
26
  execSync } = require('node:child_process');
27
27
  const {
28
- getProjectRoot,
28
+ getProjectRoot: _getProjectRoot,
29
29
  getConfig,
30
30
  PATHS,
31
- readFile,
32
- writeFile,
31
+ readFile: _readFile,
32
+ writeFile: _writeFile,
33
33
  writeJson,
34
34
  readJson
35
35
  } = require('./flow-utils')
@@ -35,7 +35,7 @@ const {
35
35
  getFdCommand,
36
36
  getConfig
37
37
  } = require('./flow-utils')
38
- const { color, printSection, printHeader, success, warn, error, info } = require('./flow-output');;
38
+ const { color, printSection, printHeader, success, warn, error } = require('./flow-output');;
39
39
 
40
40
  const { execSync, execFileSync } = require('node:child_process');
41
41
 
@@ -268,7 +268,7 @@ function main() {
268
268
  success(`WogiFlow version: ${pkg.version}`);
269
269
  }
270
270
  }
271
- } catch (err) {
271
+ } catch (_err) {
272
272
  // Non-critical — skip silently
273
273
  }
274
274
 
@@ -582,7 +582,7 @@ function main() {
582
582
  warn(`Strict mode: NOT CONFIGURED (add enforcement section to config.json)`);
583
583
  warnings++;
584
584
  }
585
- } catch (err) {
585
+ } catch (_err) {
586
586
  warn(`Could not parse config.json for strict mode check`);
587
587
  warnings++;
588
588
  }
@@ -659,7 +659,7 @@ function main() {
659
659
  console.log(` ${color('yellow', '○')} respectGitignore: not set`);
660
660
  }
661
661
 
662
- } catch (err) {
662
+ } catch (_err) {
663
663
  warn(`Could not parse settings.local.json`);
664
664
  warnings++;
665
665
  }
@@ -773,7 +773,7 @@ function main() {
773
773
  console.log(` ${color('dim', "→ Run 'flow bridge sync' to regenerate CLAUDE.md from template")}`);
774
774
  issues++;
775
775
  }
776
- } catch (err) {
776
+ } catch (_err) {
777
777
  // Already warned about CLAUDE.md read failure above
778
778
  }
779
779
  }
@@ -801,6 +801,36 @@ function main() {
801
801
  warnings += mcp.duplicates.length;
802
802
  }
803
803
 
804
+ // Check anti-deferral rule compliance (decisions.md:75)
805
+ console.log('');
806
+ printSection('Checking anti-deferral rule compliance...');
807
+ const deferralViolations = checkAntiDeferralCompliance();
808
+ if (deferralViolations.length === 0) {
809
+ success('No anti-deferral violations in ready.json');
810
+ } else {
811
+ for (const v of deferralViolations) {
812
+ warn(`${v.id} (${v.list}): "${v.note.substring(0, 80)}..."`);
813
+ }
814
+ warn(`${deferralViolations.length} task(s) in "ready/in-progress" with deferral language — move to "blocked" with dependsOn`);
815
+ warn(`Rule: .workflow/state/decisions.md §Review-Findings Anti-Deferral`);
816
+ warnings += deferralViolations.length;
817
+ }
818
+
819
+ // Completion-claim honesty scan (2026-04-16 honesty-infrastructure)
820
+ console.log('');
821
+ printSection('Checking completion-claim honesty...');
822
+ const honestyHits = checkCompletionClaimHonesty();
823
+ if (honestyHits.length === 0) {
824
+ success('No claim-vs-state contradictions in ready.json');
825
+ } else {
826
+ for (const h of honestyHits) {
827
+ warn(`${h.id} (${h.class === 'A' ? 'status-mismatch' : 'negation-vs-evidence'}): "${h.snippet}"`);
828
+ }
829
+ warn(`${honestyHits.length} contradiction(s): free-text claim disagrees with structured state`);
830
+ warn(`Gate: scripts/flow-completion-truth-gate.js → scanForClaimContradictions`);
831
+ warnings += honestyHits.length;
832
+ }
833
+
804
834
  // Check .gitignore sync
805
835
  console.log('');
806
836
  printSection('Checking .gitignore sync...');
@@ -817,7 +847,7 @@ function main() {
817
847
  warn(`Run: node scripts/flow-gitignore.js sync`);
818
848
  warnings += gitignoreHealth.missing.length;
819
849
  }
820
- } catch (err) {
850
+ } catch (_err) {
821
851
  console.log(` ${color('yellow', '○')} Gitignore check unavailable`);
822
852
  }
823
853
 
@@ -1217,7 +1247,7 @@ function deepAudit(flags = {}) {
1217
1247
  for (const feature of features) {
1218
1248
  const scriptExists = fileExists(path.join(PROJECT_ROOT, feature.script));
1219
1249
  const folderExists = dirExists(path.join(WORKFLOW_DIR, feature.folder.replace('/', '')));
1220
- const skillExists = fileExists(path.join(PROJECT_ROOT, feature.skill));
1250
+ const _skillExists = fileExists(path.join(PROJECT_ROOT, feature.skill));
1221
1251
 
1222
1252
  if (scriptExists && folderExists) {
1223
1253
  success(`${feature.name}: script + folder`);
@@ -1303,4 +1333,61 @@ if (require.main === module) {
1303
1333
  run();
1304
1334
  }
1305
1335
 
1306
- module.exports = { checkMcpScopes, normalizeMcpConfig };
1336
+ /**
1337
+ * Detect anti-deferral rule violations in ready.json.
1338
+ * A task carrying "defer/deferred" language in blockedNote while in the ready
1339
+ * or inProgress arrays contradicts the decisions.md:75 anti-deferral rule,
1340
+ * which requires such tasks to be moved to `blocked` with a concrete `dependsOn`.
1341
+ * @returns {Array<{id: string, list: string, note: string}>}
1342
+ */
1343
+ function checkAntiDeferralCompliance() {
1344
+ const violations = [];
1345
+ try {
1346
+ const ready = safeJsonParse(PATHS.ready, {});
1347
+ const check = (list, arr) => {
1348
+ for (const task of arr || []) {
1349
+ const note = task.blockedNote || task.deferReason || '';
1350
+ if (/\b(deferred?|defer)\b/i.test(note)) {
1351
+ violations.push({ id: task.id, list, note });
1352
+ }
1353
+ }
1354
+ };
1355
+ check('ready', ready.ready);
1356
+ check('inProgress', ready.inProgress);
1357
+ } catch (_err) {
1358
+ // If ready.json is unreadable, other checks will flag it separately.
1359
+ }
1360
+ return violations;
1361
+ }
1362
+
1363
+ /**
1364
+ * Check completion-claim honesty across ready.json. Uses
1365
+ * flow-completion-truth-gate.scanForClaimContradictions to detect:
1366
+ * Class A — done-word in notes/result while status is partial
1367
+ * Class B — "0 outages"-style negation while hotfixes[] is non-empty
1368
+ * Returns flattened list of {id, class, field, snippet} for health-report display.
1369
+ * @returns {Array<{id: string, class: 'A'|'B', field: string, snippet: string}>}
1370
+ */
1371
+ function checkCompletionClaimHonesty() {
1372
+ const hits = [];
1373
+ try {
1374
+ const { scanForClaimContradictions } = require('./flow-completion-truth-gate');
1375
+ const ready = safeJsonParse(PATHS.ready, {});
1376
+ const toScan = []
1377
+ .concat(Array.isArray(ready.inProgress) ? ready.inProgress : [])
1378
+ .concat(Array.isArray(ready.recentlyCompleted) ? ready.recentlyCompleted : []);
1379
+ for (const task of toScan) {
1380
+ if (!task || typeof task !== 'object') continue;
1381
+ const res = scanForClaimContradictions(task);
1382
+ if (!res.scanned) continue;
1383
+ for (const c of res.contradictions) {
1384
+ hits.push({ id: task.id, class: c.class, field: c.field, snippet: c.snippet });
1385
+ }
1386
+ }
1387
+ } catch (_err) {
1388
+ // Non-critical; other checks remain.
1389
+ }
1390
+ return hits;
1391
+ }
1392
+
1393
+ module.exports = { checkMcpScopes, normalizeMcpConfig, checkAntiDeferralCompliance, checkCompletionClaimHonesty };
@@ -17,12 +17,12 @@
17
17
  const fs = require('node:fs');
18
18
  const path = require('node:path');
19
19
  const {
20
- getProjectRoot,
20
+ getProjectRoot: _getProjectRoot,
21
21
  getConfig, PATHS
22
22
  } = require('./flow-utils')
23
23
  const { color, success, warn, error } = require('./flow-output');;
24
24
 
25
- const { getAdapter, getAllAdapters, getAvailableAdapters } = require('./hooks/adapters');
25
+ const { getAdapter, getAllAdapters } = require('./hooks/adapters');
26
26
  const { readJson, safeJsonParse } = require('./flow-io');
27
27
 
28
28
  /**
@@ -45,7 +45,7 @@ function getInstalledVersion() {
45
45
 
46
46
  return 'unknown';
47
47
  }
48
- const HOOK_MARKER = '// WOGI_FLOW_MANAGED_HOOKS';
48
+ const _HOOK_MARKER = '// WOGI_FLOW_MANAGED_HOOKS';
49
49
 
50
50
  // ============================================================
51
51
  // Configuration
@@ -48,7 +48,7 @@ async function fetchJSON(url, timeout = 3000) {
48
48
  res.on('end', () => {
49
49
  try {
50
50
  resolve(JSON.parse(data));
51
- } catch (err) {
51
+ } catch (_err) {
52
52
  reject(new Error('Invalid JSON response'));
53
53
  }
54
54
  });
@@ -95,7 +95,7 @@ async function detectAll() {
95
95
  return results;
96
96
  }
97
97
 
98
- async function testConnection(endpoint, model) {
98
+ async function testConnection(endpoint, _model) {
99
99
  const isOllama = endpoint.includes('11434');
100
100
 
101
101
  try {
@@ -14,7 +14,7 @@ const readline = require('node:readline/promises');
14
14
  const http = require('node:http');
15
15
  const { HttpClient } = require('./flow-http-client');
16
16
  const { URL, URLSearchParams } = require('node:url');
17
- const { getProjectRoot, colors, safeJsonParse, PATHS } = require('./flow-utils');
17
+ const { colors, safeJsonParse, PATHS } = require('./flow-utils');
18
18
  const { error: errorMsg } = require('./flow-output');
19
19
 
20
20
  // Import model registry for smart model selection
@@ -9,7 +9,7 @@
9
9
  const fs = require('node:fs');
10
10
  const path = require('node:path');
11
11
  const { spawnSync } = require('node:child_process');
12
- const { getProjectRoot, getConfig, error, success, PATHS } = require('./flow-utils');
12
+ const { getConfig, error, success, PATHS } = require('./flow-utils');
13
13
 
14
14
  const TESTS = [];
15
15
  let passed = 0;
@@ -27,7 +27,7 @@ const {
27
27
  let adaptiveLearning;
28
28
  try {
29
29
  adaptiveLearning = require('./flow-adaptive-learning');
30
- } catch (err) {
30
+ } catch (_err) {
31
31
  // Module not available - will use local error categories
32
32
  adaptiveLearning = null;
33
33
  }
@@ -36,7 +36,7 @@ try {
36
36
  let errorRecovery;
37
37
  try {
38
38
  errorRecovery = require('./flow-error-recovery');
39
- } catch (err) {
39
+ } catch (_err) {
40
40
  errorRecovery = null;
41
41
  }
42
42
 
@@ -372,7 +372,7 @@ function generateHypotheses(errorText, context = {}, maxCount = 5) {
372
372
  * @param {Object} context - Test context
373
373
  * @returns {Object} Test result
374
374
  */
375
- async function testHypothesis(hypothesis, context) {
375
+ async function testHypothesis(hypothesis, _context) {
376
376
  // This is a placeholder for actual test implementations
377
377
  // In practice, each test strategy would have specific logic
378
378
  const testStrategies = {
@@ -484,7 +484,7 @@ function saveHypothesisTree(tree, sessionId) {
484
484
  function loadHypothesisTree() {
485
485
  try {
486
486
  return readJson(HYPOTHESIS_STATE_PATH);
487
- } catch (err) {
487
+ } catch (_err) {
488
488
  return null;
489
489
  }
490
490
  }
@@ -30,7 +30,7 @@ function warn(msg) {
30
30
  let lspModule = null;
31
31
  try {
32
32
  lspModule = require('./flow-lsp');
33
- } catch (err) {
33
+ } catch (_err) {
34
34
  // LSP module not available, will use fallback
35
35
  }
36
36
 
@@ -60,7 +60,7 @@ function loadModelRegistry() {
60
60
  warn('[instruction-richness] Registry unavailable — using fallback defaults');
61
61
  }
62
62
  return registryCache;
63
- } catch (err) {
63
+ } catch (_err) {
64
64
  warn('[instruction-richness] Could not load model registry — using fallback defaults');
65
65
  registryCache = null;
66
66
  return null;
@@ -272,7 +272,7 @@ function loadProjectContext(projectRoot) {
272
272
  if (fs.existsSync(contextPath)) {
273
273
  try {
274
274
  context += fs.readFileSync(contextPath, 'utf-8');
275
- } catch (err) {
275
+ } catch (_err) {
276
276
  // File may have been deleted/modified between check and read
277
277
  }
278
278
  }
@@ -286,7 +286,7 @@ function loadProjectContext(projectRoot) {
286
286
  if (summaryMatch) {
287
287
  context += '\n\n### Project Summary\n' + summaryMatch[0];
288
288
  }
289
- } catch (err) {
289
+ } catch (_err) {
290
290
  // File may have been deleted/modified between check and read
291
291
  }
292
292
  }
@@ -308,7 +308,7 @@ function loadPatterns(projectRoot) {
308
308
  let content;
309
309
  try {
310
310
  content = fs.readFileSync(decisionsPath, 'utf-8');
311
- } catch (err) {
311
+ } catch (_err) {
312
312
  // File may have been deleted/modified between check and read
313
313
  return null;
314
314
  }
@@ -427,7 +427,7 @@ function loadRelevantTypes(projectRoot, filePath, options = {}) {
427
427
  * @returns {Promise<string|null>} Formatted type information
428
428
  */
429
429
  async function loadRelevantTypesWithLSP(projectRoot, filePath, options = {}) {
430
- const { getConfig, PATHS } = require('./flow-utils');
430
+ const { getConfig } = require('./flow-utils');
431
431
  const config = getConfig();
432
432
 
433
433
  // Check if LSP is enabled
@@ -451,7 +451,7 @@ async function loadRelevantTypesWithLSP(projectRoot, filePath, options = {}) {
451
451
  let content;
452
452
  try {
453
453
  content = fs.readFileSync(absPath, 'utf-8');
454
- } catch (err) {
454
+ } catch (_err) {
455
455
  // File may have been deleted/modified between check and read
456
456
  return loadRelevantTypes(projectRoot, filePath, options);
457
457
  }
@@ -464,7 +464,7 @@ async function loadRelevantTypesWithLSP(projectRoot, filePath, options = {}) {
464
464
  if (typeInfo) {
465
465
  types.push(`// ${id.name}\n${typeInfo}`);
466
466
  }
467
- } catch (err) {
467
+ } catch (_err) {
468
468
  // Skip individual errors
469
469
  }
470
470
  }
@@ -482,7 +482,7 @@ async function loadRelevantTypesWithLSP(projectRoot, filePath, options = {}) {
482
482
  }
483
483
 
484
484
  return types.length > 0 ? types.join('\n\n') : null;
485
- } catch (err) {
485
+ } catch (_err) {
486
486
  // Fallback to regex-based loading on any error
487
487
  return loadRelevantTypes(projectRoot, filePath, options);
488
488
  }
@@ -545,12 +545,12 @@ function extractIdentifiersForLSP(content, keywords = []) {
545
545
  /**
546
546
  * Finds related code files (similar components, hooks, etc.)
547
547
  */
548
- function loadRelatedCode(projectRoot, filePath, stepType) {
548
+ function loadRelatedCode(projectRoot, filePath, _stepType) {
549
549
  if (!filePath) return null;
550
550
 
551
551
  const related = [];
552
552
  const dir = path.dirname(filePath);
553
- const ext = path.extname(filePath);
553
+ const _ext = path.extname(filePath);
554
554
 
555
555
  // Find siblings or similar files
556
556
  const searchDirs = [dir, path.join(dir, '..'), path.join(dir, '..', '..')];
@@ -39,7 +39,7 @@ const path = require('node:path');
39
39
 
40
40
  const { PATHS } = require('./flow-paths');
41
41
  const { fileExists, safeJsonParse, ensureDir } = require('./flow-io');
42
- const { info, success, warn, error, color } = require('./flow-output');
42
+ const { info, warn, color } = require('./flow-output');
43
43
  const { detectTrapZones } = require('./flow-trap-zone');
44
44
  const gateTelemetry = require('./flow-gate-telemetry');
45
45
 
@@ -39,7 +39,7 @@ const path = require('node:path');
39
39
  const { PATHS } = require('./flow-paths');
40
40
  const { fileExists, ensureDir, readFile } = require('./flow-io');
41
41
  const { getConfig } = require('./flow-config-loader');
42
- const { color, info, warn, error, success } = require('./flow-output');
42
+ const { color, warn, error } = require('./flow-output');
43
43
 
44
44
  const gateTelemetry = require('./flow-gate-telemetry');
45
45
 
@@ -18,11 +18,11 @@
18
18
  */
19
19
 
20
20
  const {
21
- color,
21
+ color: _color,
22
22
  success,
23
23
  warn,
24
24
  error,
25
- info,
25
+ info: _info,
26
26
  parseFlags
27
27
  } = require('./flow-utils');
28
28
 
@@ -24,15 +24,15 @@ const path = require('node:path');
24
24
  const {
25
25
  getConfig,
26
26
  PATHS,
27
- STATE_DIR,
28
- colors,
27
+ STATE_DIR: _STATE_DIR,
28
+ colors: _colors,
29
29
  color,
30
30
  success,
31
- warn,
31
+ warn: _warn,
32
32
  error,
33
- readFile,
34
- writeFile,
35
- fileExists,
33
+ readFile: _readFile,
34
+ writeFile: _writeFile,
35
+ fileExists: _fileExists,
36
36
  printHeader,
37
37
  getTodayDate
38
38
  } = require('./flow-utils');
@@ -280,7 +280,7 @@ async function storeSkillLearning(correction, route, context) {
280
280
  };
281
281
  }
282
282
 
283
- async function storeProjectDecision(correction, route, context) {
283
+ async function storeProjectDecision(correction, _route, context) {
284
284
  const decisionsPath = PATHS.decisions;
285
285
 
286
286
  let content = '';
@@ -23,10 +23,10 @@ const {
23
23
  PATHS,
24
24
  PROJECT_ROOT,
25
25
  fileExists,
26
- dirExists,
26
+ dirExists: _dirExists,
27
27
  parseFlags,
28
28
  outputJson,
29
- getConfig,
29
+ getConfig: _getConfig,
30
30
  isPathWithinProject,
31
31
  safeJsonParse,
32
32
  writeJson,
@@ -461,7 +461,7 @@ function printStatus(driftStatus) {
461
461
  * @param {string[]} categories - Categories to regenerate
462
462
  * @returns {Promise<Object>} New sync state or null if failed
463
463
  */
464
- async function regenerateKnowledgeFiles(categories = ['stack', 'architecture', 'testing']) {
464
+ async function regenerateKnowledgeFiles(_categories = ['stack', 'architecture', 'testing']) {
465
465
  info('Regenerating knowledge files...');
466
466
 
467
467
  const { spawn } = require('node:child_process');
@@ -23,7 +23,7 @@
23
23
  * - flow-standards-learner.js — Standards violation learning
24
24
  */
25
25
 
26
- const fs = require('node:fs');
26
+ const _fs = require('node:fs');
27
27
  const { PATHS } = require('./flow-paths');
28
28
  const { acquireLock, readFile, writeFile, fileExists } = require('./flow-io');
29
29
 
@@ -25,7 +25,7 @@ const path = require('node:path');
25
25
  const https = require('node:https');
26
26
  const http = require('node:http');
27
27
  const dns = require('dns');
28
- const { getProjectRoot, colors: c, readJson, PATHS, getTodayDate } = require('./flow-utils');
28
+ const { colors: c, readJson, PATHS } = require('./flow-utils');
29
29
  const { success: printSuccess } = require('./flow-output');
30
30
 
31
31
  const LINKS_PATH = path.join(PATHS.workflow, 'links.yaml');
@@ -485,7 +485,7 @@ function removeLink(name) {
485
485
  * Get all linked context for LLM prompts
486
486
  */
487
487
  function getLinkedContext(linkNames = null) {
488
- const links = loadLinks();
488
+ const _links = loadLinks();
489
489
  let context = '';
490
490
 
491
491
  const processLink = (name) => {
@@ -20,7 +20,7 @@ const {
20
20
  PATHS,
21
21
  WORKFLOW_DIR,
22
22
  STATE_DIR,
23
- colors,
23
+ colors: _colors,
24
24
  color,
25
25
  warn,
26
26
  success,
@@ -228,7 +228,7 @@ Archived entries from request-log.md.
228
228
  /**
229
229
  * Update running summary of archived entries
230
230
  */
231
- function updateSummary(archivedEntries, archiveDate) {
231
+ function updateSummary(archivedEntries, _archiveDate) {
232
232
  let summary;
233
233
 
234
234
  if (fileExists(SUMMARY_PATH)) {