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.
- package/.claude/commands/wogi-finalize.md +83 -0
- package/.claude/rules/_internal/self-maintenance.md +1 -1
- package/.claude/settings.json +1 -1
- package/lib/commands/login.js +1 -1
- package/lib/installer.js +5 -5
- package/lib/release-channel.js +1 -1
- package/lib/skill-registry.js +3 -3
- package/lib/workspace-events.js +1 -1
- package/lib/workspace-gates.js +2 -2
- package/lib/workspace-intelligence.js +1 -1
- package/lib/workspace-routing.js +1 -1
- package/lib/workspace.js +16 -17
- package/package.json +2 -2
- package/scripts/base-workflow-step.js +2 -2
- package/scripts/flow-adaptive-learning.js +6 -6
- package/scripts/flow-api-index.js +2 -2
- package/scripts/flow-architect-pass.js +1 -1
- package/scripts/flow-ask.js +1 -1
- package/scripts/flow-assumption-detector.js +1 -1
- package/scripts/flow-audit-gates.js +38 -12
- package/scripts/flow-audit.js +4 -4
- package/scripts/flow-auto-context.js +3 -3
- package/scripts/flow-background.js +1 -1
- package/scripts/flow-best-of-n.js +7 -7
- package/scripts/flow-bridge.js +3 -3
- package/scripts/flow-bug.js +2 -2
- package/scripts/flow-bulk-loop.js +7 -7
- package/scripts/flow-cascade-completion.js +2 -2
- package/scripts/flow-cascade.js +1 -1
- package/scripts/flow-checkpoint.js +2 -2
- package/scripts/flow-clarifying-questions.js +2 -2
- package/scripts/flow-cli.js +2 -2
- package/scripts/flow-code-intelligence.js +4 -4
- package/scripts/flow-community-sync.js +6 -6
- package/scripts/flow-community.js +1 -1
- package/scripts/flow-completion-truth-gate.js +161 -5
- package/scripts/flow-complexity.js +1 -1
- package/scripts/flow-config-defaults.js +16 -4
- package/scripts/flow-config-interactive.js +2 -2
- package/scripts/flow-config-loader.js +1 -1
- package/scripts/flow-config-migrate.js +5 -6
- package/scripts/flow-consistency-check.js +5 -5
- package/scripts/flow-context-compact/expander.js +1 -1
- package/scripts/flow-context-compact/index.js +2 -2
- package/scripts/flow-context-compact/section-extractor.js +3 -3
- package/scripts/flow-context-compact/summary-tree.js +1 -1
- package/scripts/flow-context-estimator.js +1 -1
- package/scripts/flow-context-gatherer.js +6 -6
- package/scripts/flow-context-generator.js +6 -6
- package/scripts/flow-context-init.js +2 -2
- package/scripts/flow-context-manager.js +1 -1
- package/scripts/flow-context-manifest.js +1 -1
- package/scripts/flow-context-monitor.js +5 -5
- package/scripts/flow-context-orchestrator.js +2 -2
- package/scripts/flow-context-scoring.js +4 -4
- package/scripts/flow-contract-scan.js +1 -1
- package/scripts/flow-correct.js +3 -3
- package/scripts/flow-damage-control.js +2 -2
- package/scripts/flow-deploy-gate.js +2 -2
- package/scripts/flow-deploy-history.js +1 -1
- package/scripts/flow-diff.js +3 -3
- package/scripts/flow-done-gates.js +1 -1
- package/scripts/flow-done.js +7 -7
- package/scripts/flow-durable-session.js +1 -1
- package/scripts/flow-entropy-monitor.js +3 -3
- package/scripts/flow-epics.js +5 -5
- package/scripts/flow-error-recovery.js +4 -4
- package/scripts/flow-eval-judge.js +5 -5
- package/scripts/flow-eval.js +7 -7
- package/scripts/flow-export-scanner.js +5 -5
- package/scripts/flow-extraction-review.js +1 -1
- package/scripts/flow-failure-learning.js +9 -9
- package/scripts/flow-feature.js +5 -5
- package/scripts/flow-figma-confirm.js +1 -1
- package/scripts/flow-figma-extract.js +2 -2
- package/scripts/flow-figma-index.js +2 -2
- package/scripts/flow-figma-match.js +1 -1
- package/scripts/flow-figma-mcp-server.js +3 -3
- package/scripts/flow-figma-orchestrator.js +1 -1
- package/scripts/flow-figma-registry.js +2 -2
- package/scripts/flow-function-index.js +2 -2
- package/scripts/flow-gate-confidence.js +2 -2
- package/scripts/flow-gate-telemetry.js +1 -1
- package/scripts/flow-gitignore.js +1 -1
- package/scripts/flow-guided-edit.js +3 -3
- package/scripts/flow-health.js +95 -8
- package/scripts/flow-hooks.js +3 -3
- package/scripts/flow-hybrid-detect.js +2 -2
- package/scripts/flow-hybrid-interactive.js +1 -1
- package/scripts/flow-hybrid-test.js +1 -1
- package/scripts/flow-hypothesis-generator.js +4 -4
- package/scripts/flow-instruction-richness.js +11 -11
- package/scripts/flow-intent-bootstrap.js +1 -1
- package/scripts/flow-intent-framing.js +1 -1
- package/scripts/flow-item-link.js +2 -2
- package/scripts/flow-knowledge-router.js +7 -7
- package/scripts/flow-knowledge-sync.js +3 -3
- package/scripts/flow-learning-orchestrator.js +1 -1
- package/scripts/flow-links.js +2 -2
- package/scripts/flow-log-manager.js +2 -2
- package/scripts/flow-logic-adversary.js +5 -4
- package/scripts/flow-long-input-chunking.js +1 -1
- package/scripts/flow-long-input-cli.js +3 -3
- package/scripts/flow-long-input.js +18 -18
- package/scripts/flow-loop-retry-learning.js +2 -2
- package/scripts/flow-lsp.js +4 -4
- package/scripts/flow-mcp-docs.js +1 -1
- package/scripts/flow-memory-blocks.js +5 -5
- package/scripts/flow-memory-compactor.js +3 -3
- package/scripts/flow-memory-db.js +4 -4
- package/scripts/flow-memory-sync.js +3 -3
- package/scripts/flow-metrics.js +2 -2
- package/scripts/flow-migrate-igr.js +2 -2
- package/scripts/flow-migrate.js +2 -2
- package/scripts/flow-model-adapter.js +4 -4
- package/scripts/flow-model-caller.js +8 -8
- package/scripts/flow-model-config.js +5 -5
- package/scripts/flow-model-profile.js +7 -7
- package/scripts/flow-model-router.js +5 -5
- package/scripts/flow-model-types.js +3 -3
- package/scripts/flow-models.js +8 -8
- package/scripts/flow-morning.js +1 -1
- package/scripts/flow-multi-approach.js +1 -1
- package/scripts/flow-orchestrate-context.js +2 -2
- package/scripts/flow-orchestrate-llm.js +4 -4
- package/scripts/flow-orchestrate-rollback.js +1 -1
- package/scripts/flow-orchestrate-state.js +6 -6
- package/scripts/flow-orchestrate-templates.js +1 -1
- package/scripts/flow-orchestrate-validation.js +2 -2
- package/scripts/flow-orchestrate-validator.js +1 -1
- package/scripts/flow-orchestrate.js +25 -25
- package/scripts/flow-parallel.js +1 -1
- package/scripts/flow-pattern-enforcer.js +7 -7
- package/scripts/flow-pattern-extractor.js +3 -3
- package/scripts/flow-peer-review.js +8 -8
- package/scripts/flow-pending.js +1 -1
- package/scripts/flow-permissions.js +1 -1
- package/scripts/flow-phased-task.js +1 -1
- package/scripts/flow-plan.js +1 -1
- package/scripts/flow-prd-manager.js +2 -2
- package/scripts/flow-product-scanner.js +2 -2
- package/scripts/flow-progress-tracker.js +2 -2
- package/scripts/flow-progress.js +1 -1
- package/scripts/flow-project-analyzer.js +3 -3
- package/scripts/flow-prompt-capture.js +2 -2
- package/scripts/flow-prompt-composer.js +3 -3
- package/scripts/flow-prompt-template.js +4 -4
- package/scripts/flow-providers.js +31 -23
- package/scripts/flow-queue.js +1 -1
- package/scripts/flow-registry-manager.js +4 -4
- package/scripts/flow-regression.js +1 -1
- package/scripts/flow-response-parser.js +1 -1
- package/scripts/flow-resume.js +1 -1
- package/scripts/flow-review-passes/index.js +2 -2
- package/scripts/flow-review-passes/integration.js +3 -3
- package/scripts/flow-review-passes/logic.js +3 -3
- package/scripts/flow-review-passes/security.js +2 -2
- package/scripts/flow-review-passes/structure.js +1 -1
- package/scripts/flow-review.js +11 -11
- package/scripts/flow-revision-tracker.js +2 -2
- package/scripts/flow-roadmap.js +2 -2
- package/scripts/flow-run-trace.js +1 -1
- package/scripts/flow-safety.js +3 -3
- package/scripts/flow-scanner-base.js +1 -1
- package/scripts/flow-scenario-engine.js +7 -7
- package/scripts/flow-schema-drift.js +4 -3
- package/scripts/flow-section-index.js +2 -2
- package/scripts/flow-section-resolver.js +4 -4
- package/scripts/flow-semantic-match.js +3 -3
- package/scripts/flow-session-end.js +56 -0
- package/scripts/flow-session-learning.js +2 -2
- package/scripts/flow-setup-hooks.js +1 -1
- package/scripts/flow-skill-create.js +3 -3
- package/scripts/flow-skill-freshness.js +2 -2
- package/scripts/flow-skill-generator.js +6 -6
- package/scripts/flow-skill-learn.js +7 -7
- package/scripts/flow-skill-matcher.js +2 -2
- package/scripts/flow-solution-optimizer.js +1 -1
- package/scripts/flow-spec-generator.js +5 -5
- package/scripts/flow-spec-verifier.js +2 -2
- package/scripts/flow-stack-wizard.js +6 -6
- package/scripts/flow-standards-checker.js +8 -8
- package/scripts/flow-standards-gate.js +4 -4
- package/scripts/flow-standards-learner.js +2 -2
- package/scripts/flow-start.js +9 -9
- package/scripts/flow-stats-collector.js +2 -2
- package/scripts/flow-status.js +1 -1
- package/scripts/flow-step-changelog.js +3 -3
- package/scripts/flow-step-complexity.js +1 -1
- package/scripts/flow-step-coverage.js +3 -3
- package/scripts/flow-step-knowledge.js +2 -2
- package/scripts/flow-step-pr-tests.js +2 -2
- package/scripts/flow-step-regression.js +3 -3
- package/scripts/flow-step-review.js +5 -5
- package/scripts/flow-story.js +2 -2
- package/scripts/flow-strict-adherence.js +2 -2
- package/scripts/flow-structure-sensor.js +283 -0
- package/scripts/flow-sync-anonymizer.js +3 -3
- package/scripts/flow-task-checkpoint.js +2 -2
- package/scripts/flow-task-classifier.js +2 -2
- package/scripts/flow-task-completion-summary.js +1 -1
- package/scripts/flow-task-enforcer.js +5 -5
- package/scripts/flow-tech-debt.js +3 -3
- package/scripts/flow-template-extractor.js +3 -3
- package/scripts/flow-templates.js +1 -1
- package/scripts/flow-test-api.js +12 -12
- package/scripts/flow-test-discovery.js +9 -9
- package/scripts/flow-test-generate.js +5 -5
- package/scripts/flow-test-integrity.js +3 -3
- package/scripts/flow-test-ui.js +8 -8
- package/scripts/flow-testing-deps.js +4 -4
- package/scripts/flow-tiered-learning.js +3 -3
- package/scripts/flow-todowrite-sync.js +1 -1
- package/scripts/flow-trap-zone.js +1 -1
- package/scripts/flow-verification-profile.js +9 -9
- package/scripts/flow-verify.js +2 -2
- package/scripts/flow-version-check.js +2 -2
- package/scripts/flow-webmcp-generator.js +3 -3
- package/scripts/flow-wiring-verifier.js +13 -13
- package/scripts/flow-worker-question-classifier.js +256 -0
- package/scripts/flow-workflow-steps.js +3 -3
- package/scripts/flow-workflow.js +1 -1
- package/scripts/flow-worktree.js +1 -1
- package/scripts/hooks/adapters/base-adapter.js +2 -2
- package/scripts/hooks/core/commit-log-gate.js +2 -2
- package/scripts/hooks/core/component-check.js +3 -3
- package/scripts/hooks/core/config-change.js +1 -1
- package/scripts/hooks/core/deploy-gate.js +2 -1
- package/scripts/hooks/core/git-safety-gate.js +1 -1
- package/scripts/hooks/core/instructions-loaded.js +1 -1
- package/scripts/hooks/core/loop-check.js +1 -1
- package/scripts/hooks/core/manager-boundary-gate.js +3 -2
- package/scripts/hooks/core/observation-capture.js +6 -6
- package/scripts/hooks/core/phase-gate.js +4 -4
- package/scripts/hooks/core/pre-compact.js +1 -1
- package/scripts/hooks/core/pre-tool-orchestrator.js +1 -1
- package/scripts/hooks/core/routing-gate.js +2 -84
- package/scripts/hooks/core/session-context.js +1 -1
- package/scripts/hooks/core/session-end.js +3 -3
- package/scripts/hooks/core/session-history.js +1 -1
- package/scripts/hooks/core/setup-handler.js +1 -1
- package/scripts/hooks/core/task-boundary-reset.js +2 -4
- package/scripts/hooks/core/task-completed.js +13 -7
- package/scripts/hooks/core/task-created.js +1 -1
- package/scripts/hooks/core/worktree-lifecycle.js +1 -1
- package/scripts/hooks/entry/claude-code/permission-denied.js +4 -2
- package/scripts/hooks/entry/claude-code/stop.js +60 -0
- package/scripts/hooks/entry/claude-code/user-prompt-submit.js +1 -1
- package/scripts/hooks/git/post-commit.js +1 -1
- package/scripts/postinstall.js +7 -7
- package/scripts/preuninstall.js +5 -5
- package/scripts/registries/component-registry.js +2 -2
- package/scripts/registries/contract-scanner.js +11 -11
- package/scripts/registries/schema-registry.js +5 -5
- 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
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 {
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 {
|
|
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,
|
|
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 (
|
|
581
|
+
} catch (_err) {
|
|
582
582
|
// Report save failure is non-fatal
|
|
583
583
|
}
|
|
584
584
|
|
package/scripts/flow-test-ui.js
CHANGED
|
@@ -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 {
|
|
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 (
|
|
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 (
|
|
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 (
|
|
385
|
+
} catch (_err) {
|
|
386
386
|
// Skip unreadable spec files
|
|
387
387
|
}
|
|
388
388
|
}
|
|
389
|
-
} catch (
|
|
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
|
|
428
|
-
const
|
|
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 (
|
|
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
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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
|
|
96
|
-
const
|
|
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
|
|
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 {
|
|
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 {
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
570
|
+
} catch (_err) {
|
|
571
571
|
// Skip unreadable directories
|
|
572
572
|
}
|
|
573
573
|
}
|
|
574
|
-
} catch (
|
|
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 (
|
|
624
|
+
} catch (_err) {
|
|
625
625
|
// Skip
|
|
626
626
|
}
|
|
627
627
|
return result;
|
|
628
628
|
}
|
|
629
|
-
} catch (
|
|
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
|
|
705
|
+
const _testingConfig = config.testing || {};
|
|
706
706
|
|
|
707
707
|
// Tier 0: Static Analysis (always available)
|
|
708
708
|
const tier0Tools = [];
|
package/scripts/flow-verify.js
CHANGED
|
@@ -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 {
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|
|
19
|
-
const {
|
|
20
|
-
const { readJson,
|
|
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
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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,
|
|
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 (
|
|
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 (
|
|
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 (
|
|
838
|
+
} catch (_err) {
|
|
839
839
|
console.error('Could not get modified files from git');
|
|
840
840
|
process.exit(1);
|
|
841
841
|
}
|