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
@@ -20,11 +20,11 @@
20
20
  * flow providers configure <type> # Configure a provider
21
21
  */
22
22
 
23
- const fs = require('node:fs');
24
- const path = require('node:path');
23
+ const _fs = require('node:fs');
24
+ const _path = require('node:path');
25
25
  const https = require('node:https');
26
26
  const http = require('node:http');
27
- const { getProjectRoot, getConfig, colors: c, estimateTokens, PATHS } = require('./flow-utils');
27
+ const { getConfig, colors: c, estimateTokens } = require('./flow-utils');
28
28
  const { success: printSuccess, error: printError } = require('./flow-output');
29
29
 
30
30
  /**
@@ -64,6 +64,7 @@ const MODEL_CAPABILITIES = {
64
64
  'gemma2': { codeQuality: 'high', instructionFollowing: 'high', contextWindow: 8192 },
65
65
 
66
66
  // Cloud models - Full capability
67
+ 'claude-opus-4-7': { codeQuality: 'excellent', instructionFollowing: 'excellent', contextWindow: 1000000, costTier: 'premium' },
67
68
  'claude-opus-4-6': { codeQuality: 'excellent', instructionFollowing: 'excellent', contextWindow: 200000, costTier: 'premium' },
68
69
  'claude-opus-4-5': { codeQuality: 'excellent', instructionFollowing: 'excellent', contextWindow: 200000, costTier: 'premium' },
69
70
  'claude-sonnet-4-6': { codeQuality: 'excellent', instructionFollowing: 'excellent', contextWindow: 200000, costTier: 'standard' },
@@ -74,6 +75,7 @@ const MODEL_CAPABILITIES = {
74
75
 
75
76
  // Cloud models - Executor tier (cheaper/faster)
76
77
  'gpt-4o-mini': { codeQuality: 'high', instructionFollowing: 'high', contextWindow: 128000, costTier: 'cheap' },
78
+ 'claude-haiku-4-5': { codeQuality: 'high', instructionFollowing: 'excellent', contextWindow: 200000, costTier: 'cheap' },
77
79
  'claude-3-haiku': { codeQuality: 'high', instructionFollowing: 'high', contextWindow: 200000, costTier: 'cheap' },
78
80
  'claude-3-5-haiku': { codeQuality: 'high', instructionFollowing: 'excellent', contextWindow: 200000, costTier: 'cheap' },
79
81
  'gemini-flash': { codeQuality: 'high', instructionFollowing: 'high', contextWindow: 1000000, costTier: 'cheap' },
@@ -197,8 +199,13 @@ class BaseProvider {
197
199
  this.name = 'base';
198
200
  }
199
201
 
200
- async complete(prompt, options = {}) {
201
- throw new Error('Not implemented');
202
+ /**
203
+ * Abstract — every concrete provider subclass (AnthropicProvider,
204
+ * OpenAIProvider, OllamaProvider, etc.) must override this.
205
+ */
206
+ // eslint-disable-next-line no-unused-vars
207
+ async complete(prompt, _options = {}) {
208
+ throw new Error(`Provider ${this.name}: complete() not implemented — override in subclass`);
202
209
  }
203
210
 
204
211
  async test() {
@@ -235,8 +242,8 @@ class OllamaProvider extends BaseProvider {
235
242
  prompt,
236
243
  stream: false,
237
244
  options: {
238
- temperature: options.temperature || this.config.temperature || 0.7,
239
- num_predict: options.maxTokens || this.config.maxTokens || 4096
245
+ temperature: options.temperature ?? this.config.temperature ?? 0.7,
246
+ num_predict: options.maxTokens ?? this.config.maxTokens ?? 4096
240
247
  }
241
248
  };
242
249
 
@@ -323,7 +330,7 @@ class OllamaProvider extends BaseProvider {
323
330
  headers: {
324
331
  'Content-Type': 'application/json'
325
332
  },
326
- timeout: this.config.timeout || 120000
333
+ timeout: this.config.timeout ?? 120000
327
334
  };
328
335
 
329
336
  const req = http.request(options, (res) => {
@@ -365,8 +372,8 @@ class LMStudioProvider extends BaseProvider {
365
372
  const body = {
366
373
  model: options.model || this.config.model || 'local-model',
367
374
  messages: [{ role: 'user', content: prompt }],
368
- temperature: options.temperature || this.config.temperature || 0.7,
369
- max_tokens: options.maxTokens || this.config.maxTokens || 4096
375
+ temperature: options.temperature ?? this.config.temperature ?? 0.7,
376
+ max_tokens: options.maxTokens ?? this.config.maxTokens ?? 4096
370
377
  };
371
378
 
372
379
  const response = await this._request(url, body);
@@ -391,7 +398,7 @@ class LMStudioProvider extends BaseProvider {
391
398
  headers: {
392
399
  'Content-Type': 'application/json'
393
400
  },
394
- timeout: this.config.timeout || 120000
401
+ timeout: this.config.timeout ?? 120000
395
402
  };
396
403
 
397
404
  const req = http.request(options, (res) => {
@@ -462,7 +469,7 @@ class AnthropicProvider extends BaseProvider {
462
469
 
463
470
  const body = {
464
471
  model: options.model || this.config.model || DEFAULT_CONFIGS.anthropic.model,
465
- max_tokens: options.maxTokens || this.config.maxTokens || 4096,
472
+ max_tokens: options.maxTokens ?? this.config.maxTokens ?? 4096,
466
473
  messages: [{ role: 'user', content: prompt }]
467
474
  };
468
475
 
@@ -499,7 +506,7 @@ class AnthropicProvider extends BaseProvider {
499
506
  'x-api-key': this.apiKey,
500
507
  'anthropic-version': '2023-06-01'
501
508
  },
502
- timeout: this.config.timeout || 60000
509
+ timeout: this.config.timeout ?? 60000
503
510
  };
504
511
 
505
512
  const req = https.request(options, (res) => {
@@ -549,8 +556,8 @@ class OpenAIProvider extends BaseProvider {
549
556
  const body = {
550
557
  model: options.model || this.config.model || DEFAULT_CONFIGS.openai.model,
551
558
  messages,
552
- temperature: options.temperature || this.config.temperature || 0.7,
553
- max_tokens: options.maxTokens || this.config.maxTokens || 4096
559
+ temperature: options.temperature ?? this.config.temperature ?? 0.7,
560
+ max_tokens: options.maxTokens ?? this.config.maxTokens ?? 4096
554
561
  };
555
562
 
556
563
  const response = await this._request(url, body);
@@ -601,7 +608,7 @@ class OpenAIProvider extends BaseProvider {
601
608
  'Content-Type': 'application/json',
602
609
  'Authorization': `Bearer ${this.apiKey}`
603
610
  },
604
- timeout: this.config.timeout || 60000
611
+ timeout: this.config.timeout ?? 60000
605
612
  };
606
613
 
607
614
  const req = https.request(options, (res) => {
@@ -652,8 +659,8 @@ class GoogleProvider extends BaseProvider {
652
659
  parts: [{ text: prompt }]
653
660
  }],
654
661
  generationConfig: {
655
- temperature: options.temperature || this.config.temperature || 0.7,
656
- maxOutputTokens: options.maxTokens || this.config.maxTokens || 4096
662
+ temperature: options.temperature ?? this.config.temperature ?? 0.7,
663
+ maxOutputTokens: options.maxTokens ?? this.config.maxTokens ?? 4096
657
664
  }
658
665
  };
659
666
 
@@ -714,7 +721,7 @@ class GoogleProvider extends BaseProvider {
714
721
  'Content-Type': 'application/json',
715
722
  ...additionalHeaders
716
723
  },
717
- timeout: this.config.timeout || 60000
724
+ timeout: this.config.timeout ?? 60000
718
725
  };
719
726
 
720
727
  const req = https.request(options, (res) => {
@@ -929,11 +936,12 @@ async function detectProviders() {
929
936
  local: false,
930
937
  cost: 'paid',
931
938
  models: [
939
+ { id: 'claude-opus-4-7', name: 'Claude Opus 4.7 (latest)', recommended: true },
932
940
  { id: 'claude-opus-4-6', name: 'Claude Opus 4.6' },
933
- { id: 'claude-3-5-haiku-20241022', name: 'Claude 3.5 Haiku (Best for executor)', recommended: true },
934
- { id: 'claude-sonnet-4-6-20250819', name: 'Claude Sonnet 4.6' },
935
- { id: 'claude-sonnet-4-20250514', name: 'Claude Sonnet 4' },
936
- { id: 'claude-3-5-sonnet-20241022', name: 'Claude 3.5 Sonnet' }
941
+ { id: 'claude-haiku-4-5-20251001', name: 'Claude Haiku 4.5 (Best for executor)' },
942
+ { id: 'claude-sonnet-4-6', name: 'Claude Sonnet 4.6' },
943
+ { id: 'claude-3-5-haiku-20241022', name: 'Claude 3.5 Haiku' },
944
+ { id: 'claude-sonnet-4-5-20250929', name: 'Claude Sonnet 4.5' }
937
945
  ]
938
946
  });
939
947
  }
@@ -14,7 +14,7 @@
14
14
  * flow queue advance - Manually advance to next task
15
15
  */
16
16
 
17
- const fs = require('node:fs');
17
+ const _fs = require('node:fs');
18
18
  const path = require('node:path');
19
19
  const {
20
20
  PATHS,
@@ -16,7 +16,7 @@
16
16
 
17
17
  const fs = require('node:fs');
18
18
  const path = require('node:path');
19
- const { getProjectRoot, getConfig, safeJsonParse, color, success, warn, error, info, PATHS } = require('./flow-utils');
19
+ const { getConfig, safeJsonParse, color, success, warn, error, info, PATHS } = require('./flow-utils');
20
20
 
21
21
  const MANIFEST_PATH = path.join(PATHS.state, 'registry-manifest.json');
22
22
  const REGISTRIES_DIR = path.join(__dirname, 'registries');
@@ -55,7 +55,7 @@ class RegistryPlugin {
55
55
  * @param {Object} stack - Output from detectStack()
56
56
  * @returns {boolean} True if plugin should activate
57
57
  */
58
- activateWhen(stack) {
58
+ activateWhen(_stack) {
59
59
  return true;
60
60
  }
61
61
 
@@ -264,7 +264,7 @@ class RegistryManager {
264
264
  try {
265
265
  const { detectStack } = require('./flow-context-init');
266
266
  this.stack = detectStack(PATHS.root);
267
- } catch (err) {
267
+ } catch (_err) {
268
268
  this.stack = null;
269
269
  }
270
270
 
@@ -439,7 +439,7 @@ function printStatus(manager) {
439
439
  console.log(` Generated: ${manifest.generatedAt || 'unknown'}`);
440
440
  console.log(` Version: ${manifest.version || 'unknown'}`);
441
441
  console.log(` Registries: ${(manifest.registries || []).length}`);
442
- } catch (err) {
442
+ } catch (_err) {
443
443
  console.log(` Manifest: ${color('red', 'error reading')}`);
444
444
  }
445
445
  } else {
@@ -17,7 +17,7 @@
17
17
  const fs = require('node:fs');
18
18
  const path = require('node:path');
19
19
  const { execFileSync } = require('node:child_process');
20
- const { getProjectRoot, colors, getConfig, safeJsonParse, PATHS } = require('./flow-utils');
20
+ const { colors, getConfig, safeJsonParse, PATHS } = require('./flow-utils');
21
21
  const { getExecParts, getCommand } = require('./flow-script-resolver');
22
22
 
23
23
  const READY_PATH = PATHS.ready;
@@ -190,7 +190,7 @@ function removePreambles(content) {
190
190
  * @param {string} expectedLanguage - Expected language (optional)
191
191
  * @returns {string} - Clean code
192
192
  */
193
- function cleanCodeBlock(response, expectedLanguage = null) {
193
+ function cleanCodeBlock(response, _expectedLanguage = null) {
194
194
  if (!response) return '';
195
195
 
196
196
  let content = response;
@@ -230,7 +230,7 @@ function main() {
230
230
  console.log(`Reason: ${result.reason}`);
231
231
 
232
232
  // Show helpful info based on condition type
233
- const status = getSuspensionStatus();
233
+ const _status = getSuspensionStatus();
234
234
  switch (result.reason) {
235
235
  case 'waiting-for-time':
236
236
  console.log(`Resume at: ${result.resumeAt}`);
@@ -14,8 +14,8 @@
14
14
  * 4. Integration (Sonnet, conditional) - Breaking changes, contracts
15
15
  */
16
16
 
17
- const path = require('node:path');
18
- const { getConfig, readJson, writeJson, PATHS, success, warn, error, info } = require('../flow-utils');
17
+ const _path = require('node:path');
18
+ const { getConfig, warn, error, info } = require('../flow-utils');
19
19
 
20
20
  // Import pass modules
21
21
  const structurePass = require('./structure');
@@ -17,7 +17,7 @@
17
17
  */
18
18
 
19
19
  const path = require('node:path');
20
- const { readFile, PATHS, getConfig } = require('../flow-utils');
20
+ const { } = require('../flow-utils');
21
21
 
22
22
  /**
23
23
  * API contract patterns
@@ -90,7 +90,7 @@ const BREAKING_CHANGE_PATTERNS = [
90
90
  /**
91
91
  * Import/export mismatch patterns
92
92
  */
93
- const IMPORT_EXPORT_PATTERNS = [
93
+ const _IMPORT_EXPORT_PATTERNS = [
94
94
  {
95
95
  pattern: /import\s+\{([^}]+)\}\s+from\s+['"]([^'"]+)['"]/g,
96
96
  type: 'named-import'
@@ -351,7 +351,7 @@ function checkCrossModuleIssues(file) {
351
351
  * @param {Object} context - Review context with project files
352
352
  * @returns {Object[]} Array of disconnected module warnings
353
353
  */
354
- function checkDisconnectedModules(files, context = {}) {
354
+ function checkDisconnectedModules(files, _context = {}) {
355
355
  const issues = [];
356
356
 
357
357
  // Build a map of all exports in the changed files
@@ -15,8 +15,8 @@
15
15
  * - Algorithm complexity hints
16
16
  */
17
17
 
18
- const path = require('node:path');
19
- const { readFile, PATHS, getConfig } = require('../flow-utils');
18
+ const _path = require('node:path');
19
+ const { } = require('../flow-utils');
20
20
 
21
21
  /**
22
22
  * Error handling patterns to check
@@ -188,7 +188,7 @@ const EDGE_CASE_PATTERNS = [
188
188
  * @param {Object} context - Review context
189
189
  * @returns {Object[]} Array of issues
190
190
  */
191
- function checkFileLogic(file, context) {
191
+ function checkFileLogic(file, _context) {
192
192
  const issues = [];
193
193
  const content = file.content || '';
194
194
  const isTestFile = /\.(test|spec)\.[tj]sx?$/.test(file.path);
@@ -17,7 +17,7 @@
17
17
  */
18
18
 
19
19
  const path = require('node:path');
20
- const { readFile, PATHS, getConfig } = require('../flow-utils');
20
+ const { } = require('../flow-utils');
21
21
  const { CREDENTIAL_SCAN_PATTERNS } = require('../flow-security');
22
22
 
23
23
  /**
@@ -359,7 +359,7 @@ async function run(context) {
359
359
  };
360
360
 
361
361
  // Focus on files flagged by previous passes
362
- const priorityFiles = [
362
+ const _priorityFiles = [
363
363
  ...(previousResults.structure?.filesToExamine || []),
364
364
  ...(previousResults.logic?.filesToExamine || [])
365
365
  ];
@@ -301,7 +301,7 @@ async function run(context) {
301
301
 
302
302
  // Load project-specific patterns
303
303
  const projectPatterns = loadProjectPatterns();
304
- const allContentPatterns = [...CONTENT_ANTI_PATTERNS, ...projectPatterns];
304
+ const _allContentPatterns = [...CONTENT_ANTI_PATTERNS, ...projectPatterns];
305
305
 
306
306
  // Check each file
307
307
  for (const file of files) {
@@ -12,21 +12,21 @@ const {
12
12
  const fs = require('node:fs');
13
13
  const path = require('node:path');
14
14
  const {
15
- PATHS,
16
- fileExists,
15
+ PATHS: _PATHS,
16
+ fileExists: _fileExists,
17
17
  getConfig,
18
18
  isPathWithinProject
19
19
  } = require('./flow-utils')
20
- const { color, success, warn, error, info } = require('./flow-output');;
20
+ const { color, success, warn, error } = require('./flow-output');;
21
21
 
22
22
  // v3.1 spec verification
23
- const { verifySpecDeliverables, formatVerificationResults } = require('./flow-spec-verifier');
23
+ const { verifySpecDeliverables } = require('./flow-spec-verifier');
24
24
 
25
25
  // v3.1 multi-pass review system
26
26
  let multiPassReview;
27
27
  try {
28
28
  multiPassReview = require('./flow-review-passes');
29
- } catch (err) {
29
+ } catch (_err) {
30
30
  multiPassReview = null;
31
31
  }
32
32
 
@@ -34,7 +34,7 @@ try {
34
34
  let standardsChecker;
35
35
  try {
36
36
  standardsChecker = require('./flow-standards-checker');
37
- } catch (err) {
37
+ } catch (_err) {
38
38
  standardsChecker = null;
39
39
  }
40
40
 
@@ -42,7 +42,7 @@ try {
42
42
  let solutionOptimizer;
43
43
  try {
44
44
  solutionOptimizer = require('./flow-solution-optimizer');
45
- } catch (err) {
45
+ } catch (_err) {
46
46
  solutionOptimizer = null;
47
47
  }
48
48
 
@@ -50,7 +50,7 @@ try {
50
50
  let standardsGate;
51
51
  try {
52
52
  standardsGate = require('./flow-standards-gate');
53
- } catch (err) {
53
+ } catch (_err) {
54
54
  standardsGate = null;
55
55
  }
56
56
 
@@ -315,7 +315,7 @@ function runVerificationGates(files, options = {}) {
315
315
  try {
316
316
  execFileSync('npm', ['run', 'lint'], { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
317
317
  results.gates.push({ name: 'Lint', passed: true });
318
- } catch (err) {
318
+ } catch (_err) {
319
319
  results.gates.push({ name: 'Lint', passed: false, details: 'Lint errors found' });
320
320
  results.allPassed = false;
321
321
  }
@@ -326,7 +326,7 @@ function runVerificationGates(files, options = {}) {
326
326
  try {
327
327
  execFileSync('npm', ['run', 'typecheck'], { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
328
328
  results.gates.push({ name: 'TypeCheck', passed: true });
329
- } catch (err) {
329
+ } catch (_err) {
330
330
  results.gates.push({ name: 'TypeCheck', passed: false, details: 'Type errors found' });
331
331
  results.allPassed = false;
332
332
  }
@@ -337,7 +337,7 @@ function runVerificationGates(files, options = {}) {
337
337
  try {
338
338
  execFileSync('npm', ['test'], { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
339
339
  results.gates.push({ name: 'Tests', passed: true });
340
- } catch (err) {
340
+ } catch (_err) {
341
341
  results.gates.push({ name: 'Tests', passed: false, details: 'Test failures' });
342
342
  results.allPassed = false;
343
343
  }
@@ -17,8 +17,8 @@ const path = require('node:path');
17
17
  const {
18
18
  getConfig,
19
19
  PATHS,
20
- readJson,
21
- fileExists,
20
+ readJson: _readJson,
21
+ fileExists: _fileExists,
22
22
  getTodayDate
23
23
  } = require('./flow-utils');
24
24
  const { recordRevision, loadStats } = require('./flow-stats-collector');
@@ -23,12 +23,12 @@ const {
23
23
  fileExists,
24
24
  safeJsonParse,
25
25
  parseFlags,
26
- getConfig,
26
+ getConfig: _getConfig,
27
27
  isPathWithinProject,
28
28
  escapeRegex,
29
29
  getTodayDate
30
30
  } = require('./flow-utils');
31
- const { success, warn, error, info, printHeader } = require('./flow-output');
31
+ const { success, warn, error } = require('./flow-output');
32
32
 
33
33
  // Phase headers constant (used by add and move)
34
34
  const PHASE_HEADERS = {
@@ -20,7 +20,7 @@ const fs = require('node:fs');
20
20
  const path = require('node:path');
21
21
  const { readJson, safeJsonParse, safeJsonParseString } = require('./flow-io');
22
22
  const crypto = require('node:crypto');
23
- const { getProjectRoot, colors: c, PATHS } = require('./flow-utils');
23
+ const { colors: c, PATHS } = require('./flow-utils');
24
24
  const { success: printSuccess } = require('./flow-output');
25
25
 
26
26
  const RUNS_DIR = PATHS.runs;
@@ -17,9 +17,9 @@
17
17
  * flow safety status # Show current limits and permissions
18
18
  */
19
19
 
20
- const fs = require('node:fs');
20
+ const _fs = require('node:fs');
21
21
  const path = require('node:path');
22
- const { getProjectRoot, getConfig, colors: c, PATHS } = require('./flow-utils');
22
+ const { getConfig, colors: c, PATHS } = require('./flow-utils');
23
23
  const { success: printSuccess, error: printError } = require('./flow-output');
24
24
 
25
25
  /**
@@ -201,7 +201,7 @@ class SafetyGuard {
201
201
  /**
202
202
  * Check if file access is allowed
203
203
  */
204
- checkFilePermission(filePath, operation = 'read') {
204
+ checkFilePermission(filePath, _operation = 'read') {
205
205
  if (!this.enabled) return true;
206
206
 
207
207
  const permissions = this.config.permissions?.files || {};
@@ -14,7 +14,7 @@
14
14
 
15
15
  const fs = require('node:fs');
16
16
  const path = require('node:path');
17
- const { getProjectRoot, getConfig, color, success, warn, error, PATHS } = require('./flow-utils');
17
+ const { getConfig, PATHS } = require('./flow-utils');
18
18
 
19
19
  // ============================================================
20
20
  // Base Scanner Class
@@ -19,12 +19,12 @@
19
19
  const fs = require('node:fs');
20
20
  const path = require('node:path');
21
21
  const crypto = require('node:crypto');
22
- const { getProjectRoot, safeJsonParseString, PATHS } = require('./flow-utils');
22
+ const { safeJsonParseString } = require('./flow-utils');
23
23
 
24
24
  let verificationProfile;
25
25
  try {
26
26
  verificationProfile = require('./flow-verification-profile');
27
- } catch (err) {
27
+ } catch (_err) {
28
28
  verificationProfile = null;
29
29
  }
30
30
 
@@ -241,13 +241,13 @@ async function executeStep(step, baseUrl, context, options = {}) {
241
241
  if (contentType.includes('application/json')) {
242
242
  try {
243
243
  body = await response.json();
244
- } catch (err) {
244
+ } catch (_err) {
245
245
  body = null;
246
246
  }
247
247
  } else {
248
248
  try {
249
249
  body = await response.text();
250
- } catch (err) {
250
+ } catch (_err) {
251
251
  body = null;
252
252
  }
253
253
  }
@@ -378,7 +378,7 @@ function runAssertion(assertion, stepResult, context) {
378
378
  try {
379
379
  const regex = new RegExp(assertion.expected);
380
380
  passed = regex.test(actualStr);
381
- } catch (err) {
381
+ } catch (_err) {
382
382
  return {
383
383
  passed: false,
384
384
  type,
@@ -652,7 +652,7 @@ function resolveBaseUrl(scenario) {
652
652
  if (profile && profile.api && profile.api.baseUrl) {
653
653
  return profile.api.baseUrl;
654
654
  }
655
- } catch (err) {
655
+ } catch (_err) {
656
656
  // Fall through to default
657
657
  }
658
658
  }
@@ -679,7 +679,7 @@ function applyIsolationStrategy(scenario) {
679
679
  return { ...scenario, teardown: { strategy: 'none' } };
680
680
  }
681
681
  // Tier 2 (database) and Tier 3 (reverse DELETE) use default teardown
682
- } catch (err) {
682
+ } catch (_err) {
683
683
  // Non-fatal — use existing teardown config
684
684
  }
685
685
  return scenario;
@@ -22,6 +22,7 @@
22
22
  const fs = require('node:fs');
23
23
  const path = require('node:path');
24
24
  const { execFileSync } = require('node:child_process');
25
+ const { safeJsonParse } = require('./flow-io');
25
26
 
26
27
  // ============================================================
27
28
  // Constants
@@ -68,7 +69,7 @@ function getRegisteredSchemaFiles() {
68
69
  // Try schema-index.json first (structured data)
69
70
  try {
70
71
  if (fs.existsSync(SCHEMA_INDEX_PATH)) {
71
- const index = JSON.parse(fs.readFileSync(SCHEMA_INDEX_PATH, 'utf-8'));
72
+ const index = safeJsonParse(SCHEMA_INDEX_PATH, {});
72
73
  if (index.models) {
73
74
  for (const model of index.models) {
74
75
  if (model.file) {
@@ -554,7 +555,7 @@ function runSchemaDriftGate(changedFiles, opts = {}) {
554
555
  let enabled = true;
555
556
  try {
556
557
  if (fs.existsSync(CONFIG_PATH)) {
557
- const config = JSON.parse(fs.readFileSync(CONFIG_PATH, 'utf-8'));
558
+ const config = safeJsonParse(CONFIG_PATH, {});
558
559
  enabled = config.enforcement?.schemaDrift?.enabled ?? config.schemaDrift?.enabled ?? true;
559
560
  }
560
561
  } catch (_err) {
@@ -641,7 +642,7 @@ function scanCrossRepoConsumers(driftEntries, workspaceRoot) {
641
642
  try {
642
643
  const configPath = path.join(workspaceRoot, 'wogi-workspace.json');
643
644
  if (!fs.existsSync(configPath)) return results;
644
- config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
645
+ config = safeJsonParse(configPath, {});
645
646
  } catch (_err) {
646
647
  return results;
647
648
  }
@@ -25,7 +25,7 @@ const path = require('node:path');
25
25
  const crypto = require('node:crypto');
26
26
  const {
27
27
  PATHS,
28
- PROJECT_ROOT,
28
+ PROJECT_ROOT: _PROJECT_ROOT,
29
29
  readFile,
30
30
  writeFile,
31
31
  fileExists,
@@ -40,7 +40,7 @@ const {
40
40
  } = require('./flow-utils');
41
41
 
42
42
  // Re-use existing section parser from flow-rules-sync
43
- const { parseMarkdownSections, slugify } = require('./flow-rules-sync');
43
+ const { slugify } = require('./flow-rules-sync');
44
44
 
45
45
  // ============================================================
46
46
  // Configuration
@@ -25,9 +25,9 @@
25
25
  */
26
26
 
27
27
  const {
28
- PATHS,
29
- fileExists,
30
- readFile,
28
+ PATHS: _PATHS,
29
+ fileExists: _fileExists,
30
+ readFile: _readFile,
31
31
  info,
32
32
  warn
33
33
  } = require('./flow-utils');
@@ -45,7 +45,7 @@ const {
45
45
  searchSectionsByPins: dbSearchSectionsByPins,
46
46
  searchSectionsBySimilarity,
47
47
  getSectionById: dbGetSectionById,
48
- getSectionsBySource,
48
+ getSectionsBySource: _getSectionsBySource,
49
49
  getSectionStats
50
50
  } = require('./flow-memory-db');
51
51
 
@@ -13,9 +13,9 @@
13
13
  * - AI-as-judge for candidates above 50% combined score
14
14
  */
15
15
 
16
- const fs = require('node:fs');
17
- const path = require('node:path');
18
- const { getConfig, PATHS, color } = require('./flow-utils');
16
+ const _fs = require('node:fs');
17
+ const _path = require('node:path');
18
+ const { getConfig } = require('./flow-utils');
19
19
 
20
20
  // ============================================================
21
21
  // Configuration