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
@@ -18,9 +18,9 @@ const { spawnSync } = require('node:child_process');
18
18
  const {
19
19
  PATHS,
20
20
  fileExists,
21
- getConfig,
21
+ getConfig: _getConfig,
22
22
  safeJsonParse,
23
- readFile,
23
+ readFile: _readFile,
24
24
  writeJson,
25
25
  validateTaskId,
26
26
  color, error, success } = require('./flow-utils');
@@ -30,7 +30,7 @@ const {
30
30
  // ============================================================
31
31
 
32
32
  /** Glob patterns for discovering test files */
33
- const TEST_FILE_PATTERNS = [
33
+ const _TEST_FILE_PATTERNS = [
34
34
  '**/*.test.js', '**/*.test.ts', '**/*.test.jsx', '**/*.test.tsx',
35
35
  '**/*.spec.js', '**/*.spec.ts', '**/*.spec.jsx', '**/*.spec.tsx',
36
36
  '**/__tests__/**/*.js', '**/__tests__/**/*.ts',
@@ -107,7 +107,7 @@ function findTestFiles(dir, baseDir, skipSet) {
107
107
  let entries;
108
108
  try {
109
109
  entries = fs.readdirSync(dir, { withFileTypes: true });
110
- } catch (err) {
110
+ } catch (_err) {
111
111
  return results;
112
112
  }
113
113
 
@@ -435,7 +435,7 @@ function discoverTests(projectRoot, options = {}) {
435
435
  let content;
436
436
  try {
437
437
  content = fs.readFileSync(fullPath, 'utf-8');
438
- } catch (err) {
438
+ } catch (_err) {
439
439
  continue;
440
440
  }
441
441
 
@@ -751,7 +751,7 @@ function generateDiscoveryReport(taskId, discoveryResults, gateResults) {
751
751
  if (!fs.existsSync(verificationsDir)) {
752
752
  fs.mkdirSync(verificationsDir, { recursive: true });
753
753
  }
754
- } catch (err) {
754
+ } catch (_err) {
755
755
  // Fall back — directory might already exist
756
756
  }
757
757
 
@@ -824,7 +824,7 @@ function runTestDiscoveryGate(taskId, projectRoot) {
824
824
  try {
825
825
  const vp = require('./flow-verification-profile');
826
826
  profile = vp.loadProfile();
827
- } catch (err) {
827
+ } catch (_err) {
828
828
  // flow-verification-profile not available — use defaults
829
829
  }
830
830
  const passToPass = runPassToPass(projectRoot, profile);
@@ -841,7 +841,7 @@ function runTestDiscoveryGate(taskId, projectRoot) {
841
841
  let reportPath = null;
842
842
  try {
843
843
  reportPath = generateDiscoveryReport(taskId, discovered, gateResults);
844
- } catch (err) {
844
+ } catch (_err) {
845
845
  // Report generation failure should not block the gate
846
846
  }
847
847
 
@@ -923,7 +923,7 @@ function loadTaskCriteria(taskId) {
923
923
  }
924
924
  }
925
925
  }
926
- } catch (err) {
926
+ } catch (_err) {
927
927
  // Spec file not found — that's fine
928
928
  }
929
929
  }
@@ -18,7 +18,7 @@
18
18
 
19
19
  const fs = require('node:fs');
20
20
  const path = require('node:path');
21
- const { getProjectRoot, safeJsonParse, PATHS } = require('./flow-utils');
21
+ const { safeJsonParse, PATHS } = require('./flow-utils');
22
22
  const { getConfig } = require('./flow-config-loader');
23
23
 
24
24
  // ============================================================
@@ -101,7 +101,7 @@ function parseSpecCriteria(specPath) {
101
101
  let content;
102
102
  try {
103
103
  content = fs.readFileSync(specPath, 'utf-8');
104
- } catch (err) {
104
+ } catch (_err) {
105
105
  return [];
106
106
  }
107
107
 
@@ -211,13 +211,13 @@ function detectTestConventions(projectRoot) {
211
211
 
212
212
  // Check for describe blocks
213
213
  result.hasDescribeBlocks = /describe\s*\(/.test(sampleContent);
214
- } catch (err) {
214
+ } catch (_err) {
215
215
  // sample read failure — keep defaults
216
216
  }
217
217
 
218
218
  break; // Found test files, stop searching
219
219
  }
220
- } catch (err) {
220
+ } catch (_err) {
221
221
  // dir scan failure — try next
222
222
  }
223
223
  }
@@ -245,7 +245,7 @@ function findTestFiles(dir, depth) {
245
245
  results.push(path.join(dir, entry.name));
246
246
  }
247
247
  }
248
- } catch (err) {
248
+ } catch (_err) {
249
249
  // Read error — skip
250
250
  }
251
251
 
@@ -26,11 +26,11 @@
26
26
 
27
27
  const fs = require('node:fs');
28
28
  const path = require('node:path');
29
- const { getProjectRoot, PATHS, ensureDir, safeJsonParse } = require('./flow-utils');
29
+ const { PATHS, ensureDir, safeJsonParse } = require('./flow-utils');
30
30
  const { getConfig } = require('./flow-config-loader');
31
31
  const { loadProfile } = require('./flow-verification-profile');
32
32
  const { parseAPIMap, executeAPITest, startAPIServer, stopAPIServer } = require('./flow-test-api');
33
- const { startDevServer, stopDevServer, assertDataInTree, flattenTreeToText } = require('./flow-test-ui');
33
+ const { startDevServer, stopDevServer, flattenTreeToText } = require('./flow-test-ui');
34
34
 
35
35
  // ============================================================
36
36
  // Constants
@@ -578,7 +578,7 @@ function writeIntegrityReport(taskId, results) {
578
578
 
579
579
  try {
580
580
  fs.writeFileSync(reportPath, JSON.stringify(results, null, 2), 'utf-8');
581
- } catch (err) {
581
+ } catch (_err) {
582
582
  // Report save failure is non-fatal
583
583
  }
584
584
 
@@ -35,7 +35,7 @@ const fs = require('node:fs');
35
35
  const path = require('node:path');
36
36
  const http = require('node:http');
37
37
  const https = require('node:https');
38
- const { getProjectRoot, PATHS } = require('./flow-paths');
38
+ const { PATHS } = require('./flow-paths');
39
39
  const { getConfig } = require('./flow-config-loader');
40
40
  const { ensureDir } = require('./flow-io');
41
41
  const { loadProfile } = require('./flow-verification-profile');
@@ -177,14 +177,14 @@ function killProcess(proc) {
177
177
  if (proc.pid) {
178
178
  try {
179
179
  process.kill(-proc.pid, 'SIGTERM');
180
- } catch (err) {
180
+ } catch (_err) {
181
181
  // Fallback to direct kill if process group kill fails
182
182
  proc.kill('SIGTERM');
183
183
  }
184
184
  } else {
185
185
  proc.kill('SIGTERM');
186
186
  }
187
- } catch (err) {
187
+ } catch (_err) {
188
188
  // Process may already be dead
189
189
  }
190
190
  }
@@ -382,11 +382,11 @@ function loadTestFlows(taskId) {
382
382
  const content = fs.readFileSync(specPath, 'utf-8');
383
383
  const tests = parseTestFile(content);
384
384
  flows.push(...tests);
385
- } catch (err) {
385
+ } catch (_err) {
386
386
  // Skip unreadable spec files
387
387
  }
388
388
  }
389
- } catch (err) {
389
+ } catch (_err) {
390
390
  // Test directory read failure
391
391
  }
392
392
 
@@ -424,8 +424,8 @@ function parseTestFile(content) {
424
424
  const surrounding = content.slice(surroundingStart, surroundingEnd);
425
425
 
426
426
  // Extract from Given/When/Then comments
427
- const givenMatch = surrounding.match(/\/\/\s*Given:\s*(.+)/);
428
- const whenMatch = surrounding.match(/\/\/\s*When:\s*(.+)/);
427
+ const _givenMatch = surrounding.match(/\/\/\s*Given:\s*(.+)/);
428
+ const _whenMatch = surrounding.match(/\/\/\s*When:\s*(.+)/);
429
429
  const thenMatch = surrounding.match(/\/\/\s*Then:\s*(.+)/);
430
430
 
431
431
  if (thenMatch) {
@@ -513,7 +513,7 @@ function saveReport(report) {
513
513
 
514
514
  try {
515
515
  fs.writeFileSync(reportPath, JSON.stringify(report, null, 2), 'utf-8');
516
- } catch (err) {
516
+ } catch (_err) {
517
517
  // Report save failure is non-fatal — caller handles
518
518
  }
519
519
 
@@ -26,7 +26,7 @@
26
26
  const { execSync } = require('node:child_process');
27
27
  const path = require('node:path');
28
28
  const fs = require('node:fs');
29
- const { getProjectRoot, PATHS } = require('./flow-utils');
29
+ const { getProjectRoot } = require('./flow-utils');
30
30
 
31
31
  // ============================================================
32
32
  // Dependency Definitions
@@ -77,7 +77,7 @@ function isPackageInstalled(packageName, projectRoot) {
77
77
  const nodeModulesPath = path.join(root, 'node_modules', ...packageName.split('/'));
78
78
  try {
79
79
  return fs.existsSync(nodeModulesPath);
80
- } catch (err) {
80
+ } catch (_err) {
81
81
  return false;
82
82
  }
83
83
  }
@@ -157,7 +157,7 @@ function installDeps(mode, projectRoot) {
157
157
  try {
158
158
  execSync(installCmd, { cwd: root, stdio: 'pipe', timeout: 120000 });
159
159
  installed.push(...status.missing);
160
- } catch (err) {
160
+ } catch (_err) {
161
161
  failed.push(...status.missing);
162
162
  return {
163
163
  success: false,
@@ -175,7 +175,7 @@ function installDeps(mode, projectRoot) {
175
175
  commands.push(cmd);
176
176
  try {
177
177
  execSync(cmd, { cwd: root, stdio: 'pipe', timeout: 300000 });
178
- } catch (err) {
178
+ } catch (_err) {
179
179
  // postInstall failures are non-fatal but worth noting
180
180
  return {
181
181
  success: true,
@@ -18,7 +18,7 @@
18
18
  const fs = require('node:fs');
19
19
  const path = require('node:path');
20
20
  const {
21
- PROJECT_ROOT,
21
+ PROJECT_ROOT: _PROJECT_ROOT,
22
22
  parseFlags,
23
23
  outputJson,
24
24
  color,
@@ -92,8 +92,8 @@ const DEFAULT_TIERED_LEARNING_CONFIG = {
92
92
  // ============================================================
93
93
 
94
94
  const PATTERNS_PATH = path.join(PATHS.state, 'learning-patterns.json');
95
- const DECISIONS_PATH = PATHS.decisions;
96
- const FEEDBACK_PATH = PATHS.feedbackPatterns;
95
+ const _DECISIONS_PATH = PATHS.decisions;
96
+ const _FEEDBACK_PATH = PATHS.feedbackPatterns;
97
97
 
98
98
  // ============================================================
99
99
  // Configuration
@@ -16,7 +16,7 @@
16
16
 
17
17
  const fs = require('node:fs');
18
18
  const path = require('node:path');
19
- const { getProjectRoot, safeJsonParse, PATHS } = require('./flow-utils');
19
+ const { getProjectRoot, safeJsonParse } = require('./flow-utils');
20
20
 
21
21
  // ============================================================================
22
22
  // Constants
@@ -42,7 +42,7 @@ const path = require('node:path');
42
42
 
43
43
  const { PATHS } = require('./flow-paths');
44
44
  const { fileExists, dirExists } = require('./flow-io');
45
- const { info, success, warn, color } = require('./flow-output');
45
+ const { color } = require('./flow-output');
46
46
 
47
47
  // ============================================================
48
48
  // Constants
@@ -23,7 +23,7 @@
23
23
  const fs = require('node:fs');
24
24
  const path = require('node:path');
25
25
  const { spawnSync } = require('node:child_process');
26
- const { getProjectRoot, PATHS, ensureDir, safeJsonParse } = require('./flow-utils');
26
+ const { PATHS, ensureDir, safeJsonParse } = require('./flow-utils');
27
27
  const { getConfig } = require('./flow-config-loader');
28
28
 
29
29
  // ============================================================
@@ -124,7 +124,7 @@ const FRAMEWORK_PORTS = {
124
124
  function existsInProject(relativePath) {
125
125
  try {
126
126
  return fs.existsSync(path.join(PATHS.root, relativePath));
127
- } catch (err) {
127
+ } catch (_err) {
128
128
  return false;
129
129
  }
130
130
  }
@@ -146,7 +146,7 @@ function readPackageJson() {
146
146
  function readProjectFile(relativePath) {
147
147
  try {
148
148
  return fs.readFileSync(path.join(PATHS.root, relativePath), 'utf-8');
149
- } catch (err) {
149
+ } catch (_err) {
150
150
  return null;
151
151
  }
152
152
  }
@@ -403,7 +403,7 @@ function detectDocker() {
403
403
  timeout: DOCKER_TIMEOUT_MS
404
404
  });
405
405
  result.available = dockerResult.status === 0;
406
- } catch (err) {
406
+ } catch (_err) {
407
407
  result.available = false;
408
408
  }
409
409
 
@@ -567,11 +567,11 @@ function detectFixtures() {
567
567
  try {
568
568
  const entries = fs.readdirSync(fullPath).slice(0, 20);
569
569
  result.files.push(...entries.map(e => `${fixtureDir}/${e}`));
570
- } catch (err) {
570
+ } catch (_err) {
571
571
  // Skip unreadable directories
572
572
  }
573
573
  }
574
- } catch (err) {
574
+ } catch (_err) {
575
575
  // Path doesn't exist — continue
576
576
  }
577
577
  }
@@ -621,12 +621,12 @@ function detectCI() {
621
621
  }
622
622
  }
623
623
  }
624
- } catch (err) {
624
+ } catch (_err) {
625
625
  // Skip
626
626
  }
627
627
  return result;
628
628
  }
629
- } catch (err) {
629
+ } catch (_err) {
630
630
  // Not found
631
631
  }
632
632
  } else if (ci.file) {
@@ -702,7 +702,7 @@ function detectLanguage() {
702
702
  */
703
703
  function buildVerificationStrategy(profile) {
704
704
  const config = getConfig();
705
- const testingConfig = config.testing || {};
705
+ const _testingConfig = config.testing || {};
706
706
 
707
707
  // Tier 0: Static Analysis (always available)
708
708
  const tier0Tools = [];
@@ -22,7 +22,7 @@
22
22
  const fs = require('node:fs');
23
23
  const path = require('node:path');
24
24
  const { spawn, execSync } = require('node:child_process');
25
- const { getProjectRoot, getConfig, colors: c, readJson, PATHS } = require('./flow-utils');
25
+ const { getConfig, colors: c, readJson, PATHS } = require('./flow-utils');
26
26
  const { success: printSuccess, error: printError } = require('./flow-output');
27
27
  const { recordCommandResult } = require('./flow-metrics');
28
28
  const { detectPackageManager, getExecCommand, getRunPrefix } = require('./flow-script-resolver');
@@ -113,7 +113,7 @@ class GateResult {
113
113
  function buildDefaultGates() {
114
114
  const pm = detectPackageManager();
115
115
  const exec = getExecCommand(pm);
116
- const run = getRunPrefix(pm);
116
+ const _run = getRunPrefix(pm);
117
117
  // For test/build: npm uses 'npm test'/'npm run build', others use 'pnpm test'/'pnpm build'
118
118
  const pmCmd = pm;
119
119
 
@@ -36,7 +36,7 @@ function getClaudeCodeVersion() {
36
36
  }).trim();
37
37
  const match = output.match(/(\d+\.\d+\.\d+)/);
38
38
  return match ? match[1] : null;
39
- } catch (err) {
39
+ } catch (_err) {
40
40
  return null;
41
41
  }
42
42
  }
@@ -160,7 +160,7 @@ function fetchLatestNpmVersion() {
160
160
  ).trim();
161
161
  const match = output.match(/^(\d+\.\d+\.\d+)$/);
162
162
  return match ? match[1] : null;
163
- } catch (err) {
163
+ } catch (_err) {
164
164
  return null;
165
165
  }
166
166
  }
@@ -15,9 +15,9 @@
15
15
 
16
16
  const fs = require('node:fs');
17
17
  const path = require('node:path');
18
- const crypto = require('node:crypto');
19
- const { getProjectRoot, getConfig, color, success, warn, error, PATHS } = require('./flow-utils');
20
- const { readJson, writeJson, ensureDir, fileExists } = require('./flow-utils');
18
+ const _crypto = require('node:crypto');
19
+ const { color, success, warn, error, PATHS } = require('./flow-utils');
20
+ const { readJson, ensureDir, fileExists } = require('./flow-utils');
21
21
  const { BaseScanner, PROJECT_ROOT } = require('./flow-scanner-base');
22
22
 
23
23
  const WEBMCP_DIR = path.join(PATHS.workflow, 'webmcp');
@@ -27,10 +27,10 @@ const {
27
27
  PROJECT_ROOT,
28
28
  fileExists,
29
29
  readFile,
30
- success,
31
- warn,
32
- error,
33
- info,
30
+ success: _success,
31
+ warn: _warn,
32
+ error: _error,
33
+ info: _info,
34
34
  color,
35
35
  getFdCommand
36
36
  } = require('./flow-utils');
@@ -111,7 +111,7 @@ function extractExportName(filePath) {
111
111
  */
112
112
  function findImports(filePath) {
113
113
  const relativePath = path.relative(PROJECT_ROOT, filePath);
114
- const dirPath = path.dirname(relativePath);
114
+ const _dirPath = path.dirname(relativePath);
115
115
  const filename = path.basename(filePath, path.extname(filePath));
116
116
  const exportNames = extractExportName(filePath);
117
117
 
@@ -159,7 +159,7 @@ function findImports(filePath) {
159
159
  imports.push(normalizedFile);
160
160
  }
161
161
  }
162
- } catch (err) {
162
+ } catch (_err) {
163
163
  // grep returns non-zero if no matches, ignore
164
164
  }
165
165
  }
@@ -369,7 +369,7 @@ function findFileByName(filename) {
369
369
  if (files.length > 0) {
370
370
  return files[0]; // Return first match
371
371
  }
372
- } catch (err) {
372
+ } catch (_err) {
373
373
  // Ignore errors (find/fd returns non-zero if no matches on some systems)
374
374
  }
375
375
  }
@@ -519,7 +519,7 @@ function getRemovedLines(files) {
519
519
  encoding: 'utf-8',
520
520
  stdio: ['pipe', 'pipe', 'pipe']
521
521
  });
522
- } catch (err) {
522
+ } catch (_err) {
523
523
  // No staged changes for this file
524
524
  }
525
525
 
@@ -534,7 +534,7 @@ function getRemovedLines(files) {
534
534
  if (removed.length > 0) {
535
535
  removedByFile[file] = removed;
536
536
  }
537
- } catch (err) {
537
+ } catch (_err) {
538
538
  // File may not have changes or not be tracked
539
539
  }
540
540
  }
@@ -545,7 +545,7 @@ function getRemovedLines(files) {
545
545
  /**
546
546
  * Extract identifiers from removed lines that could be referenced elsewhere
547
547
  */
548
- function extractRemovedIdentifiers(removedLines, sourceFile) {
548
+ function extractRemovedIdentifiers(removedLines, _sourceFile) {
549
549
  const identifiers = new Set();
550
550
 
551
551
  for (const line of removedLines) {
@@ -630,7 +630,7 @@ function findReferences(identifier, excludeFile) {
630
630
  line: line.substring(colonIdx + 1).trim()
631
631
  });
632
632
  }
633
- } catch (err) {
633
+ } catch (_err) {
634
634
  // grep returns non-zero if no matches
635
635
  }
636
636
 
@@ -692,7 +692,7 @@ function verifyRemovalImpact(modifiedFiles) {
692
692
  if (currentContent.includes(identifier)) {
693
693
  stillExists = true;
694
694
  }
695
- } catch (err) {
695
+ } catch (_err) {
696
696
  // If we can't read the file, assume it was deleted entirely
697
697
  }
698
698
 
@@ -835,7 +835,7 @@ if (require.main === module) {
835
835
  cwd: PROJECT_ROOT, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe']
836
836
  }).trim().split('\n').filter(Boolean);
837
837
  files = [...new Set([...staged, ...unstaged])];
838
- } catch (err) {
838
+ } catch (_err) {
839
839
  console.error('Could not get modified files from git');
840
840
  process.exit(1);
841
841
  }