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
@@ -39,13 +39,13 @@
39
39
  * node scripts/flow-logic-adversary.js rubric
40
40
  */
41
41
 
42
- const fs = require('node:fs');
42
+ const _fs = require('node:fs');
43
43
  const path = require('node:path');
44
44
 
45
45
  const { PATHS } = require('./flow-paths');
46
46
  const { fileExists, safeJsonParse, readFile } = require('./flow-io');
47
47
  const { getConfig } = require('./flow-config-loader');
48
- const { warn, info, success, error, color } = require('./flow-output');
48
+ const { info, error, color } = require('./flow-output');
49
49
  const gateTelemetry = require('./flow-gate-telemetry');
50
50
 
51
51
  // ============================================================
@@ -446,10 +446,11 @@ function shouldIterate(verdict, round) {
446
446
  */
447
447
  // CL-008 fix (2026-04-13): pairing table moved to config so model IDs stay
448
448
  // current as new versions release. Defaults preserved as fallback.
449
+ // Updated 2026-04-16: Opus 4.7 is the new top tier; sonnet/haiku adversary upgraded.
449
450
  const DEFAULT_MODEL_PAIRING = {
450
451
  opus: 'claude-sonnet-4-6',
451
- sonnet: 'claude-opus-4-6',
452
- haiku: 'claude-opus-4-6',
452
+ sonnet: 'claude-opus-4-7',
453
+ haiku: 'claude-opus-4-7',
453
454
  };
454
455
 
455
456
  function selectAdversaryModel(architectModel) {
@@ -12,7 +12,7 @@
12
12
  const fs = require('node:fs');
13
13
  const path = require('node:path');
14
14
  const { readJson } = require('./flow-io');
15
- const { PATHS } = require('./flow-utils');
15
+ const { } = require('./flow-utils');
16
16
 
17
17
  // Core functions are injected via init() to avoid circular dependencies
18
18
  let digestCore = null;
@@ -34,9 +34,9 @@ async function main() {
34
34
  const longInput = require('./flow-long-input');
35
35
  const {
36
36
  // Core session
37
- getStatus, createSession, countWords, loadActiveDigest, saveActiveDigest,
38
- updatePhase, saveTopics, loadTopics, loadStatementMap, loadOrphans,
39
- loadClarifications, saveClarifications,
37
+ getStatus, createSession, countWords, loadActiveDigest: _loadActiveDigest, saveActiveDigest: _saveActiveDigest,
38
+ updatePhase: _updatePhase, saveTopics, loadTopics, loadStatementMap, loadOrphans,
39
+ loadClarifications, saveClarifications: _saveClarifications,
40
40
  // Detection
41
41
  detectLargeInput, analyzeInput, classifyContentTypes, shouldExcludeContent,
42
42
  // Parsing - subtitles
@@ -29,7 +29,7 @@
29
29
  const fs = require('node:fs');
30
30
  const path = require('node:path');
31
31
  const { estimateTokens, generateHashId, getConfig, safeJsonParse, PATHS } = require('./flow-utils');
32
- const { success: printSuccess, warn: printWarn } = require('./flow-output');
32
+ const { } = require('./flow-output');
33
33
 
34
34
  // Import extracted sub-modules
35
35
  const transcriptParsing = require('./flow-long-input-parsing');
@@ -51,37 +51,37 @@ const {
51
51
 
52
52
  // Destructure parsing functions
53
53
  const {
54
- parseVTT, parseSRT, parseSubtitle, mergeCues, formatCuesAsText, getSubtitleStats,
55
- parseZoom, parseTeams, parseMeeting, mergeMeetingEntries, formatMeetingAsText, getMeetingStats
54
+ parseVTT: _parseVTT, parseSRT: _parseSRT, parseSubtitle: _parseSubtitle, mergeCues: _mergeCues, formatCuesAsText: _formatCuesAsText, getSubtitleStats: _getSubtitleStats,
55
+ parseZoom: _parseZoom, parseTeams: _parseTeams, parseMeeting: _parseMeeting, mergeMeetingEntries: _mergeMeetingEntries, formatMeetingAsText: _formatMeetingAsText, getMeetingStats
56
56
  } = transcriptParsing;
57
57
 
58
58
  // Destructure chunking functions
59
59
  const {
60
- loadDurableSessions, listDurableSessions, getDurableSession, switchDurableSession,
61
- archiveDurableSession, deleteDurableSession, generateRecoverySummaryForSession,
62
- getTimeSince, needsChunking, planChunks, getChunkingStatus
60
+ loadDurableSessions: _loadDurableSessions, listDurableSessions: _listDurableSessions, getDurableSession: _getDurableSession, switchDurableSession: _switchDurableSession,
61
+ archiveDurableSession: _archiveDurableSession, deleteDurableSession: _deleteDurableSession, generateRecoverySummaryForSession: _generateRecoverySummaryForSession,
62
+ getTimeSince: _getTimeSince, needsChunking: _needsChunking, planChunks: _planChunks, getChunkingStatus
63
63
  } = transcriptChunking;
64
64
 
65
65
  const { listSupportedLanguages } = transcriptLanguage;
66
66
 
67
67
  // Destructure story functions
68
68
  const {
69
- generateStoryFromTopic, generateAllStories, saveStory, loadStory, loadAllStories,
70
- formatStoryAsMarkdown, getPresentationStatus, getNextStory, getCurrentStory,
71
- approveCurrentStory, rejectCurrentStory, skipCurrentStory, formatStorySummary,
72
- formatActionsPrompt, getCompletionSummary, resetPresentation,
73
- startEditSession, editUserStory, editCriterion, addCriterion, removeCriterion,
74
- getEditChanges, commitEditSession, cancelEditSession, getEditHistory, listEditableStories,
75
- previewExport, exportApprovedStories, finalizeDigestion
69
+ generateStoryFromTopic: _generateStoryFromTopic, generateAllStories: _generateAllStories, saveStory: _saveStory, loadStory: _loadStory, loadAllStories: _loadAllStories,
70
+ formatStoryAsMarkdown: _formatStoryAsMarkdown, getPresentationStatus: _getPresentationStatus, getNextStory: _getNextStory, getCurrentStory: _getCurrentStory,
71
+ approveCurrentStory: _approveCurrentStory, rejectCurrentStory: _rejectCurrentStory, skipCurrentStory: _skipCurrentStory, formatStorySummary: _formatStorySummary,
72
+ formatActionsPrompt: _formatActionsPrompt, getCompletionSummary: _getCompletionSummary, resetPresentation: _resetPresentation,
73
+ startEditSession: _startEditSession, editUserStory: _editUserStory, editCriterion: _editCriterion, addCriterion: _addCriterion, removeCriterion: _removeCriterion,
74
+ getEditChanges: _getEditChanges, commitEditSession: _commitEditSession, cancelEditSession: _cancelEditSession, getEditHistory: _getEditHistory, listEditableStories: _listEditableStories,
75
+ previewExport: _previewExport, exportApprovedStories: _exportApprovedStories, finalizeDigestion
76
76
  } = transcriptStories;
77
77
 
78
78
  // Destructure constants
79
79
  const {
80
- FILLER_PATTERNS, REQUIREMENT_PATTERNS, SEMANTIC_EXPANSIONS,
81
- CORRECTION_PATTERNS, ADDITIVE_PATTERNS,
80
+ FILLER_PATTERNS: _FILLER_PATTERNS, REQUIREMENT_PATTERNS, SEMANTIC_EXPANSIONS: _SEMANTIC_EXPANSIONS,
81
+ CORRECTION_PATTERNS: _CORRECTION_PATTERNS, ADDITIVE_PATTERNS: _ADDITIVE_PATTERNS,
82
82
  ENTITY_PATTERNS, VAGUE_PATTERNS, QUESTION_TEMPLATES,
83
83
  DETAIL_PATTERNS, QUESTION_TEMPLATES_BY_LANGUAGE, FOLLOWUP_TRIGGERS,
84
- UI_PATTERNS, DATA_PATTERNS, INTERACTION_PATTERNS, COMPLEXITY_LEVELS
84
+ UI_PATTERNS: _UI_PATTERNS, DATA_PATTERNS: _DATA_PATTERNS, INTERACTION_PATTERNS: _INTERACTION_PATTERNS, COMPLEXITY_LEVELS
85
85
  } = longInputConstants;
86
86
 
87
87
  // Destructure voice functions
@@ -124,14 +124,14 @@ const {
124
124
 
125
125
  // Destructure passes functions
126
126
  const {
127
- extractKeyPhrase, createTopicFromOrphans, ensureGeneralTopic,
127
+ extractKeyPhrase: _extractKeyPhrase, createTopicFromOrphans, ensureGeneralTopic,
128
128
  saveOrphans, loadOrphans, runPass2, runPass3, runPass4,
129
129
  runFullPipeline, quickProcess, generateQuickSummary
130
130
  } = longInputPasses;
131
131
 
132
132
  // Paths - temp processing files go to .workflow/tmp/, cleaned up after completion
133
133
  const TMP_DIR = path.join(process.cwd(), '.workflow', 'tmp', 'long-input');
134
- const STATE_DIR = TMP_DIR; // Alias for backward compatibility during migration
134
+ const _STATE_DIR = TMP_DIR; // Alias for backward compatibility during migration
135
135
  const ACTIVE_DIGEST_FILE = path.join(TMP_DIR, 'active-digest.json');
136
136
 
137
137
  // ============================================
@@ -15,7 +15,7 @@
15
15
 
16
16
  const fs = require('node:fs');
17
17
  const path = require('node:path');
18
- const { getConfig, getProjectRoot, colors, readJson, info, success, PATHS, getTodayDate } = require('./flow-utils');
18
+ const { getConfig, colors, readJson, info, success, PATHS, getTodayDate } = require('./flow-utils');
19
19
  const { FailureCategory, detectCategory } = require('./flow-failure-categories');
20
20
 
21
21
  const LEARNING_LOG_PATH = path.join(PATHS.state, 'adaptive-learning.json');
@@ -279,7 +279,7 @@ function generateLearning(rootCause, session) {
279
279
  * @param {string} taskId - Task ID
280
280
  * @returns {boolean}
281
281
  */
282
- function isDuplicateLearning(rootCause, taskId) {
282
+ function isDuplicateLearning(rootCause, _taskId) {
283
283
  if (!fs.existsSync(LEARNING_LOG_PATH)) {
284
284
  return false;
285
285
  }
@@ -102,7 +102,7 @@ class LSPClient {
102
102
  if (result.status === 0) {
103
103
  return result.stdout.trim() || loc;
104
104
  }
105
- } catch (err) {
105
+ } catch (_err) {
106
106
  // Try next location
107
107
  }
108
108
 
@@ -112,7 +112,7 @@ class LSPClient {
112
112
  if (result.status === 0) {
113
113
  return loc;
114
114
  }
115
- } catch (err) {
115
+ } catch (_err) {
116
116
  // Try next location
117
117
  }
118
118
  }
@@ -579,7 +579,7 @@ class LSPClient {
579
579
  try {
580
580
  await this._send('shutdown', null);
581
581
  this._notify('exit', null);
582
- } catch (err) {
582
+ } catch (_err) {
583
583
  // Ignore errors during shutdown
584
584
  }
585
585
 
@@ -686,7 +686,7 @@ async function getTypesForPositions(filePath, positions) {
686
686
  const key = pos.name || `${pos.line}:${pos.character}`;
687
687
  types[key] = extractTypeFromHover(content);
688
688
  }
689
- } catch (err) {
689
+ } catch (_err) {
690
690
  // Skip individual errors
691
691
  }
692
692
  }
@@ -17,7 +17,7 @@
17
17
  const fs = require('node:fs');
18
18
  const path = require('node:path');
19
19
  const {
20
- getProjectRoot,
20
+ getProjectRoot: _getProjectRoot,
21
21
  safeJsonParse,
22
22
  fileExists,
23
23
  PATHS
@@ -15,15 +15,15 @@
15
15
  const fs = require('node:fs');
16
16
  const path = require('node:path');
17
17
  const {
18
- getConfig,
18
+ getConfig: _getConfig,
19
19
  PATHS,
20
- STATE_DIR,
21
- colors,
22
- color,
20
+ STATE_DIR: _STATE_DIR,
21
+ colors: _colors,
22
+ color: _color,
23
23
  warn,
24
24
  success,
25
25
  error,
26
- readFile,
26
+ readFile: _readFile,
27
27
  writeFile,
28
28
  fileExists,
29
29
  printHeader,
@@ -16,10 +16,10 @@
16
16
  * Part of v1.8.0 - Automatic Memory Management
17
17
  */
18
18
 
19
- const fs = require('node:fs');
20
- const path = require('node:path');
19
+ const _fs = require('node:fs');
20
+ const _path = require('node:path');
21
21
  const memoryDb = require('./flow-memory-db');
22
- const { getConfig, PROJECT_ROOT } = require('./flow-config-loader');
22
+ const { getConfig } = require('./flow-config-loader');
23
23
  const { color } = require('./flow-output');
24
24
 
25
25
  // ============================================================
@@ -54,7 +54,7 @@ const DEFAULTS = {
54
54
  // Configuration
55
55
  // ============================================================
56
56
 
57
- const { getProjectRoot, PATHS } = require('./flow-paths');
57
+ const { PATHS } = require('./flow-paths');
58
58
  const MEMORY_DIR = path.join(PATHS.workflow, 'memory');
59
59
  const DB_PATH = path.join(MEMORY_DIR, 'local.db');
60
60
 
@@ -69,7 +69,7 @@ try {
69
69
  const flowUtils = require('./flow-utils');
70
70
  safeJsonParseString = flowUtils.safeJsonParseString;
71
71
  getConfig = flowUtils.getConfig;
72
- } catch (err) {
72
+ } catch (_err) {
73
73
  // Fallback if flow-utils not available (e.g., in MCP server context)
74
74
  safeJsonParseString = null;
75
75
  getConfig = null;
@@ -2326,7 +2326,7 @@ async function generateSectionEmbeddings() {
2326
2326
  } else {
2327
2327
  results.skipped++;
2328
2328
  }
2329
- } catch (err) {
2329
+ } catch (_err) {
2330
2330
  results.failed++;
2331
2331
  }
2332
2332
  }
@@ -2349,7 +2349,7 @@ function getMemoryLevel() {
2349
2349
  if (!getConfig) return 'off';
2350
2350
  const config = getConfig();
2351
2351
  return config.memory?.level || 'off';
2352
- } catch (err) {
2352
+ } catch (_err) {
2353
2353
  return 'off';
2354
2354
  }
2355
2355
  }
@@ -18,9 +18,9 @@
18
18
  */
19
19
 
20
20
  const fs = require('node:fs');
21
- const path = require('node:path');
21
+ const _path = require('node:path');
22
22
  const memoryDb = require('./flow-memory-db');
23
- const { getConfig, PROJECT_ROOT } = require('./flow-config-loader');
23
+ const { getConfig } = require('./flow-config-loader');
24
24
  const { color } = require('./flow-output');
25
25
  const { PATHS } = require('./flow-utils');
26
26
 
@@ -29,7 +29,7 @@ let _syncDecisionsToRules = null;
29
29
  function syncDecisionsToRules() {
30
30
  if (!_syncDecisionsToRules) {
31
31
  _syncDecisionsToRules = require('./flow-rules-sync').syncDecisionsToRules;
32
- const { PATHS } = require('./flow-utils');
32
+ const { } = require('./flow-utils');
33
33
  }
34
34
  return _syncDecisionsToRules();
35
35
  }
@@ -18,8 +18,8 @@
18
18
 
19
19
  const fs = require('node:fs');
20
20
  const path = require('node:path');
21
- const { getProjectRoot, getConfig, PATHS, colors, showHelp: showHelpGeneric, readJson } = require('./flow-utils');
22
- const { success, error: errorMsg } = require('./flow-output');
21
+ const { getConfig, PATHS, colors, showHelp: showHelpGeneric, readJson } = require('./flow-utils');
22
+ const { success } = require('./flow-output');
23
23
 
24
24
  const METRICS_PATH = PATHS.commandMetrics;
25
25
 
@@ -29,8 +29,8 @@ const fs = require('node:fs');
29
29
  const path = require('node:path');
30
30
 
31
31
  const { PATHS } = require('./flow-paths');
32
- const { fileExists, ensureDir, safeJsonParse } = require('./flow-io');
33
- const { color, info, success, warn, error } = require('./flow-output');
32
+ const { fileExists, safeJsonParse } = require('./flow-io');
33
+ const { color, info, success, error } = require('./flow-output');
34
34
 
35
35
  const REQUIRED_INTENT_ARTIFACTS = [
36
36
  'product.md',
@@ -18,12 +18,12 @@ const {
18
18
  PATHS,
19
19
  PROJECT_ROOT,
20
20
  WORKFLOW_DIR,
21
- fileExists,
21
+ fileExists: _fileExists,
22
22
  dirExists,
23
23
  parseFlags,
24
24
  outputJson,
25
25
  checkSpecMigration,
26
- SPEC_FILE_MAP,
26
+ SPEC_FILE_MAP: _SPEC_FILE_MAP,
27
27
  getTodayDate
28
28
  } = require('./flow-utils')
29
29
  const { printHeader, printSection, color, success, warn, error, info } = require('./flow-output');;
@@ -27,7 +27,7 @@
27
27
 
28
28
  const fs = require('node:fs');
29
29
  const path = require('node:path');
30
- const { getProjectRoot, getConfig, PATHS, colors, readJson, getTodayDate } = require('./flow-utils');
30
+ const { getConfig, PATHS, colors, readJson, getTodayDate } = require('./flow-utils');
31
31
 
32
32
  const ADAPTERS_DIR = PATHS.modelAdapters;
33
33
  const MODEL_STATS_PATH = PATHS.modelStatsLegacy;
@@ -40,9 +40,9 @@ const MODEL_STATS_PATH = PATHS.modelStatsLegacy;
40
40
  * Known model patterns for identification
41
41
  */
42
42
  const MODEL_PATTERNS = {
43
- 'claude-opus': ['claude-opus', 'opus', 'claude-3-opus', 'claude-opus-4', 'claude-opus-4-5', 'claude-opus-4-6', 'opus-4.5', 'opus-4.6'],
43
+ 'claude-opus': ['claude-opus', 'opus', 'claude-3-opus', 'claude-opus-4', 'claude-opus-4-5', 'claude-opus-4-6', 'claude-opus-4-7', 'opus-4.5', 'opus-4.6', 'opus-4.7'],
44
44
  'claude-sonnet': ['claude-sonnet', 'sonnet', 'claude-3-sonnet', 'claude-sonnet-4', 'claude-sonnet-4-5', 'claude-sonnet-4-6', 'sonnet-4.5', 'sonnet-4.6'],
45
- 'claude-haiku': ['claude-haiku', 'haiku', 'claude-3-haiku'],
45
+ 'claude-haiku': ['claude-haiku', 'haiku', 'claude-3-haiku', 'claude-haiku-4-5', 'haiku-4.5'],
46
46
  'gpt-4': ['gpt-4', 'gpt-4-turbo', 'gpt-4o'],
47
47
  'gpt-3.5': ['gpt-3.5', 'gpt-3.5-turbo'],
48
48
  'ollama-nemotron': ['nemotron', 'nvidia-nemotron'],
@@ -141,7 +141,7 @@ function getAdapterPath(modelName) {
141
141
  function safeReadFile(filePath) {
142
142
  try {
143
143
  return fs.readFileSync(filePath, 'utf-8');
144
- } catch (err) {
144
+ } catch (_err) {
145
145
  // File may have been deleted/moved between existsSync and readFileSync (TOCTOU)
146
146
  return null;
147
147
  }
@@ -11,13 +11,13 @@
11
11
  * const response = await callModel('openai:gpt-4o', prompt);
12
12
  */
13
13
 
14
- const path = require('node:path');
14
+ const _path = require('node:path');
15
15
  const {
16
- PATHS,
16
+ PATHS: _PATHS,
17
17
  getConfig,
18
- getConfigValue,
19
- color,
20
- warn,
18
+ getConfigValue: _getConfigValue,
19
+ color: _color,
20
+ warn: _warn,
21
21
  error
22
22
  } = require('./flow-utils');
23
23
 
@@ -37,8 +37,8 @@ const PROVIDERS = {
37
37
  name: 'Anthropic',
38
38
  apiBase: 'https://api.anthropic.com/v1',
39
39
  envKey: 'ANTHROPIC_API_KEY',
40
- models: ['claude-opus-4-6', 'claude-sonnet-4-6', 'claude-sonnet-4-5-20250929', 'claude-3-5-haiku-latest', 'claude-3-opus-latest'],
41
- defaultModel: 'claude-3-5-haiku-latest'
40
+ models: ['claude-opus-4-7', 'claude-opus-4-6', 'claude-sonnet-4-6', 'claude-sonnet-4-5-20250929', 'claude-haiku-4-5-20251001', 'claude-3-5-haiku-latest', 'claude-3-opus-latest'],
41
+ defaultModel: 'claude-haiku-4-5-20251001'
42
42
  },
43
43
  google: {
44
44
  name: 'Google',
@@ -352,7 +352,7 @@ function isModelCallingAvailable() {
352
352
  /**
353
353
  * Format manual mode prompt for copy-paste
354
354
  */
355
- function formatManualPrompt(prompt, context) {
355
+ function formatManualPrompt(prompt, _context) {
356
356
  return `
357
357
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
358
358
  📋 Copy this prompt to another AI model:
@@ -31,7 +31,7 @@
31
31
 
32
32
  const fs = require('node:fs');
33
33
  const path = require('node:path');
34
- const { getProjectRoot, safeJsonParse, safeJsonParseString, colors: c, error, success, PATHS } = require('./flow-utils');
34
+ const { safeJsonParse, safeJsonParseString, colors: c, error, success, PATHS } = require('./flow-utils');
35
35
 
36
36
  const CONFIG_PATH = path.join(PATHS.workflow, 'config.json');
37
37
  const ENV_PATH = path.join(PATHS.root, '.env');
@@ -62,8 +62,8 @@ const KNOWN_PROVIDERS = {
62
62
  envKey: 'ANTHROPIC_API_KEY',
63
63
  endpoint: 'https://api.anthropic.com/v1',
64
64
  testEndpoint: '/messages',
65
- models: ['claude-opus-4-6', 'claude-sonnet-4-5-20250929', 'claude-3-5-haiku-20241022', 'claude-opus-4-5-20251101'],
66
- defaultModel: 'claude-sonnet-4-20250514'
65
+ models: ['claude-opus-4-7', 'claude-opus-4-6', 'claude-sonnet-4-6', 'claude-sonnet-4-5-20250929', 'claude-haiku-4-5-20251001', 'claude-3-5-haiku-20241022', 'claude-opus-4-5-20251101'],
66
+ defaultModel: 'claude-opus-4-7'
67
67
  },
68
68
  local: {
69
69
  displayName: 'Local LLM',
@@ -277,7 +277,7 @@ function updateEnvFile(keyName, keyValue) {
277
277
 
278
278
  try {
279
279
  envContent = fs.readFileSync(ENV_PATH, 'utf-8');
280
- } catch (err) {
280
+ } catch (_err) {
281
281
  if (process.env.DEBUG) {
282
282
  console.log(`[model-config] .env doesn't exist, will create`);
283
283
  }
@@ -387,7 +387,7 @@ async function testLocalProvider(endpoint) {
387
387
  message: `Connected to Ollama. Found ${models.length} models.`,
388
388
  models
389
389
  });
390
- } catch (err) {
390
+ } catch (_err) {
391
391
  resolve({ success: false, message: 'Invalid response from local LLM' });
392
392
  }
393
393
  });
@@ -28,7 +28,7 @@ const fs = require('node:fs');
28
28
  const path = require('node:path');
29
29
  const {
30
30
  PATHS,
31
- PROJECT_ROOT,
31
+ PROJECT_ROOT: _PROJECT_ROOT,
32
32
  readFile,
33
33
  writeFile,
34
34
  fileExists,
@@ -39,18 +39,18 @@ const {
39
39
  error,
40
40
  parseFlags,
41
41
  outputJson,
42
- safeJsonParse,
42
+ safeJsonParse: _safeJsonParse,
43
43
  getTodayDate
44
44
  } = require('./flow-utils');
45
45
 
46
- const { getSectionsByPins, readIndex } = require('./flow-section-index');
46
+ const { getSectionsByPins } = require('./flow-section-index');
47
47
 
48
48
  // ============================================================
49
49
  // Configuration
50
50
  // ============================================================
51
51
 
52
52
  const PROFILES_DIR = path.join(PATHS.state, 'model-profiles');
53
- const TEMPLATE_PATH = path.join(PROFILES_DIR, '_template.md');
53
+ const _TEMPLATE_PATH = path.join(PROFILES_DIR, '_template.md');
54
54
 
55
55
  // Default profile settings
56
56
  const DEFAULT_SETTINGS = {
@@ -297,7 +297,7 @@ function getModelProfile(modelId, taskType = null) {
297
297
  if (Array.isArray(sections)) {
298
298
  profile._pinSections = sections.filter(s => s && typeof s === 'object');
299
299
  }
300
- } catch (err) {
300
+ } catch (_err) {
301
301
  // PIN lookup optional, continue without it
302
302
  }
303
303
  }
@@ -539,7 +539,7 @@ function getInstructionRichness(modelId, taskType, tokenBudget = 8192) {
539
539
  * @param {string} taskDescription - Task description for additional matching
540
540
  * @returns {Object} - Context recommendation
541
541
  */
542
- function getContextRecommendation(modelId, taskType, taskDescription = '') {
542
+ function getContextRecommendation(modelId, taskType, _taskDescription = '') {
543
543
  const richness = getInstructionRichness(modelId, taskType);
544
544
 
545
545
  const recommendation = {
@@ -591,7 +591,7 @@ function getContextRecommendation(modelId, taskType, taskDescription = '') {
591
591
  // Try to load sections by PIN
592
592
  try {
593
593
  recommendation.sections = getSectionsByPins(recommendation.pins);
594
- } catch (err) {
594
+ } catch (_err) {
595
595
  // PIN lookup optional
596
596
  }
597
597
 
@@ -18,15 +18,15 @@
18
18
 
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,
25
- info,
25
+ info: _info,
26
26
  warn,
27
27
  error,
28
28
  safeJsonParse,
29
- getConfig,
29
+ getConfig: _getConfig,
30
30
  printHeader,
31
31
  printSection,
32
32
  estimateTokens, PATHS
@@ -42,7 +42,7 @@ let instructionRichness = null;
42
42
  try {
43
43
  contextGatherer = require('./flow-context-gatherer');
44
44
  instructionRichness = require('./flow-instruction-richness');
45
- } catch (err) {
45
+ } catch (_err) {
46
46
  // Smart Context modules not available
47
47
  }
48
48
 
@@ -1126,7 +1126,7 @@ module.exports = {
1126
1126
  getAgentModel: (() => {
1127
1127
  try {
1128
1128
  return require('./flow-prompt-template').getAgentModel;
1129
- } catch (err) {
1129
+ } catch (_err) {
1130
1130
  // Fallback if prompt template module not available
1131
1131
  return () => 'sonnet';
1132
1132
  }
@@ -54,7 +54,7 @@ function clearCapabilitiesCache() {
54
54
  /**
55
55
  * Load a single capability file for a model.
56
56
  * Exported as public API for plugin/extension use.
57
- * @param {string} modelKey - Model key (e.g., "claude-opus-4-6")
57
+ * @param {string} modelKey - Model key (e.g., "claude-opus-4-7")
58
58
  * @returns {Object|null} Capability data or null if not found
59
59
  */
60
60
  function loadCapability(modelKey) {
@@ -92,7 +92,7 @@ function loadAllCapabilities() {
92
92
  try {
93
93
  const stat = fs.lstatSync(path.join(CAPABILITIES_DIR, entry));
94
94
  if (!stat.isFile()) continue;
95
- } catch (err) {
95
+ } catch (_err) {
96
96
  continue;
97
97
  }
98
98
  const modelKey = entry.replace(/\.json$/, '');
@@ -101,7 +101,7 @@ function loadAllCapabilities() {
101
101
  capabilities[modelKey] = capData;
102
102
  }
103
103
  }
104
- } catch (err) {
104
+ } catch (_err) {
105
105
  warn(`Failed to read capabilities directory`);
106
106
  }
107
107
 
@@ -18,10 +18,10 @@
18
18
  * flow models providers List available providers
19
19
  */
20
20
 
21
- const fs = require('node:fs');
22
- const path = require('node:path');
21
+ const _fs = require('node:fs');
22
+ const _path = require('node:path');
23
23
  const {
24
- PROJECT_ROOT,
24
+ PROJECT_ROOT: _PROJECT_ROOT,
25
25
  parseFlags,
26
26
  outputJson,
27
27
  color,
@@ -30,8 +30,8 @@ const {
30
30
  warn,
31
31
  getConfig,
32
32
  fileExists,
33
- dirExists,
34
- safeJsonParse,
33
+ dirExists: _dirExists,
34
+ safeJsonParse: _safeJsonParse,
35
35
  printHeader,
36
36
  printSection,
37
37
  showHelp: showHelpGeneric
@@ -39,9 +39,9 @@ const {
39
39
 
40
40
  // Shared model registry/stats (extracted to break circular dep)
41
41
  const {
42
- MODELS_DIR,
42
+ MODELS_DIR: _MODELS_DIR,
43
43
  REGISTRY_PATH,
44
- STATS_PATH,
44
+ STATS_PATH: _STATS_PATH,
45
45
  loadRegistry,
46
46
  loadStats,
47
47
  saveStats
@@ -506,7 +506,7 @@ function recordTaskExecution(modelId, taskData) {
506
506
  /**
507
507
  * Get cost analysis
508
508
  */
509
- function getCostAnalysis(options = {}) {
509
+ function getCostAnalysis(_options = {}) {
510
510
  const stats = loadStats();
511
511
  const registry = loadRegistry();
512
512
 
@@ -13,7 +13,7 @@
13
13
 
14
14
  const fs = require('node:fs');
15
15
  const path = require('node:path');
16
- const { execSync, execFileSync } = require('node:child_process');
16
+ const { execFileSync } = require('node:child_process');
17
17
  const {
18
18
  PATHS,
19
19
  PROJECT_ROOT,
@@ -27,7 +27,7 @@
27
27
 
28
28
  const fs = require('node:fs');
29
29
  const path = require('node:path');
30
- const { getProjectRoot, getConfig, PATHS, colors, writeJson, ensureDir, readJson, safeJsonParse } = require('./flow-utils');
30
+ const { getConfig, PATHS, colors, writeJson, ensureDir, readJson, safeJsonParse } = require('./flow-utils');
31
31
  const { success, error: errorMsg } = require('./flow-output');
32
32
 
33
33
  const APPROACHES_DIR = path.join(PATHS.state, 'approaches');
@@ -15,7 +15,7 @@
15
15
 
16
16
  const fs = require('node:fs');
17
17
  const path = require('node:path');
18
- const { getProjectRoot, colors, getConfig, PATHS } = require('./flow-utils');
18
+ const { colors, getConfig, PATHS } = require('./flow-utils');
19
19
  const {
20
20
  buildExportMap,
21
21
  loadCachedExportMap,
@@ -308,7 +308,7 @@ class ProjectContextGenerator {
308
308
  };
309
309
  }
310
310
  }
311
- } catch (err) {
311
+ } catch (_err) {
312
312
  // Ignore scan errors
313
313
  }
314
314