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
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
const fs = require('node:fs');
|
|
15
15
|
const path = require('node:path');
|
|
16
16
|
const readline = require('node:readline/promises');
|
|
17
|
-
const {
|
|
17
|
+
const { colors: c, readJson, PATHS } = require('./flow-utils');
|
|
18
18
|
|
|
19
19
|
const DECISIONS_PATH = path.join(PATHS.workflow, 'state', 'figma-decisions.json');
|
|
20
20
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
14
|
const fs = require('node:fs');
|
|
15
|
-
const
|
|
15
|
+
const _path = require('node:path');
|
|
16
16
|
|
|
17
17
|
// ============================================================
|
|
18
18
|
// Figma Node Parser
|
|
@@ -162,7 +162,7 @@ class FigmaExtractor {
|
|
|
162
162
|
classifyNodeType(node) {
|
|
163
163
|
const type = node.type;
|
|
164
164
|
const childCount = node.children?.length || 0;
|
|
165
|
-
const
|
|
165
|
+
const _name = (node.name || '').toLowerCase();
|
|
166
166
|
|
|
167
167
|
// Explicit component types from Figma
|
|
168
168
|
if (type === 'COMPONENT' || type === 'INSTANCE') {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
|
|
17
17
|
const fs = require('node:fs');
|
|
18
18
|
const path = require('node:path');
|
|
19
|
-
const {
|
|
19
|
+
const { readJson, PATHS } = require('./flow-utils');
|
|
20
20
|
const { success: printSuccess, error: printError, info: printInfo } = require('./flow-output');
|
|
21
21
|
|
|
22
22
|
const REGISTRY_PATH = path.join(PATHS.workflow, 'state', 'component-registry.json');
|
|
@@ -427,7 +427,7 @@ class ComponentScanner {
|
|
|
427
427
|
|
|
428
428
|
return component;
|
|
429
429
|
|
|
430
|
-
} catch (
|
|
430
|
+
} catch (_err) {
|
|
431
431
|
console.log(` ⚠️ Babel parse error: ${component.name}`);
|
|
432
432
|
return this.parseReactWithRegex(content, component);
|
|
433
433
|
}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
const fs = require('node:fs');
|
|
16
16
|
const path = require('node:path');
|
|
17
|
-
const {
|
|
17
|
+
const { safeJsonParse, safeJsonParseString, PATHS } = require('./flow-utils')
|
|
18
18
|
const { error } = require('./flow-output');;
|
|
19
19
|
|
|
20
20
|
const REGISTRY_PATH = path.join(PATHS.workflow, 'state', 'component-registry.json');
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
25
|
const http = require('node:http');
|
|
26
|
-
const
|
|
26
|
+
const _fs = require('node:fs');
|
|
27
27
|
const path = require('node:path');
|
|
28
28
|
const readline = require('node:readline');
|
|
29
29
|
|
|
@@ -31,7 +31,7 @@ const { ComponentScanner } = require('./flow-figma-index');
|
|
|
31
31
|
const { FigmaExtractor } = require('./flow-figma-extract');
|
|
32
32
|
const { SimilarityMatcher, MATCH_CONFIG } = require('./flow-figma-match');
|
|
33
33
|
const { CodeGenerator } = require('./flow-figma-generate');
|
|
34
|
-
const {
|
|
34
|
+
const { readJson, PATHS } = require('./flow-utils');
|
|
35
35
|
|
|
36
36
|
const REGISTRY_PATH = path.join(PATHS.workflow, 'state', 'component-registry.json');
|
|
37
37
|
|
|
@@ -135,7 +135,7 @@ class FigmaAnalyzerMCP {
|
|
|
135
135
|
}
|
|
136
136
|
}
|
|
137
137
|
|
|
138
|
-
async analyzeScreen(figmaData,
|
|
138
|
+
async analyzeScreen(figmaData, _threshold) {
|
|
139
139
|
// Extract components from Figma data
|
|
140
140
|
const extractor = new FigmaExtractor();
|
|
141
141
|
const extracted = extractor.parse(figmaData);
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
const fs = require('node:fs');
|
|
22
22
|
const path = require('node:path');
|
|
23
|
-
const {
|
|
23
|
+
const { writeJson, readJson, PATHS } = require('./flow-utils');
|
|
24
24
|
const { FigmaExtractor } = require('./flow-figma-extract');
|
|
25
25
|
const { FigmaComponentRegistry } = require('./flow-figma-registry');
|
|
26
26
|
const { FigmaStateAnalyzer } = require('./flow-figma-state-analyzer');
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
|
|
16
16
|
const fs = require('node:fs');
|
|
17
17
|
const path = require('node:path');
|
|
18
|
-
const {
|
|
19
|
-
const { SimilarityMatcher
|
|
18
|
+
const { readJson, writeJson, PATHS } = require('./flow-utils');
|
|
19
|
+
const { SimilarityMatcher } = require('./flow-figma-match');
|
|
20
20
|
|
|
21
21
|
const REGISTRY_PATH = path.join(PATHS.state, 'figma-component-registry.json');
|
|
22
22
|
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
|
|
16
16
|
const fs = require('node:fs');
|
|
17
17
|
const path = require('node:path');
|
|
18
|
-
const {
|
|
18
|
+
const { color, success, warn, error, safeJsonParse, PATHS } = require('./flow-utils');
|
|
19
19
|
const {
|
|
20
20
|
findSimilarItems,
|
|
21
21
|
generateAIDecisionPrompt,
|
|
22
|
-
generateContextBlock,
|
|
22
|
+
generateContextBlock: _generateContextBlock,
|
|
23
23
|
getMatchConfig
|
|
24
24
|
} = require('./flow-semantic-match');
|
|
25
25
|
const { BaseScanner, PROJECT_ROOT } = require('./flow-scanner-base');
|
|
@@ -523,7 +523,7 @@ const VALID_DECISIONS = ['auto-apply', 'approved', 'blocked'];
|
|
|
523
523
|
* @param {Object} params - Decision parameters
|
|
524
524
|
* @throws {Error} If decision is not a valid type
|
|
525
525
|
*/
|
|
526
|
-
function recordDecision({
|
|
526
|
+
function recordDecision({ _analysisId, decision, outcome }) {
|
|
527
527
|
// Validate decision type to prevent silent failures
|
|
528
528
|
if (!VALID_DECISIONS.includes(decision)) {
|
|
529
529
|
throw new Error(`Invalid decision type: ${decision}. Must be one of: ${VALID_DECISIONS.join(', ')}`);
|
|
@@ -774,7 +774,7 @@ Examples:
|
|
|
774
774
|
let content;
|
|
775
775
|
try {
|
|
776
776
|
content = fs.readFileSync(filePath, 'utf8');
|
|
777
|
-
} catch (
|
|
777
|
+
} catch (_err) {
|
|
778
778
|
error('Failed to read file');
|
|
779
779
|
process.exit(1);
|
|
780
780
|
}
|
|
@@ -46,7 +46,7 @@ const path = require('node:path');
|
|
|
46
46
|
const crypto = require('node:crypto');
|
|
47
47
|
|
|
48
48
|
const { PATHS } = require('./flow-paths');
|
|
49
|
-
const { ensureDir, fileExists
|
|
49
|
+
const { ensureDir, fileExists } = require('./flow-io');
|
|
50
50
|
const { success, warn, info, color } = require('./flow-output');
|
|
51
51
|
|
|
52
52
|
// ============================================================
|
|
@@ -25,11 +25,11 @@ const path = require('node:path');
|
|
|
25
25
|
const {
|
|
26
26
|
execSync } = require('node:child_process');
|
|
27
27
|
const {
|
|
28
|
-
getProjectRoot,
|
|
28
|
+
getProjectRoot: _getProjectRoot,
|
|
29
29
|
getConfig,
|
|
30
30
|
PATHS,
|
|
31
|
-
readFile,
|
|
32
|
-
writeFile,
|
|
31
|
+
readFile: _readFile,
|
|
32
|
+
writeFile: _writeFile,
|
|
33
33
|
writeJson,
|
|
34
34
|
readJson
|
|
35
35
|
} = require('./flow-utils')
|
package/scripts/flow-health.js
CHANGED
|
@@ -35,7 +35,7 @@ const {
|
|
|
35
35
|
getFdCommand,
|
|
36
36
|
getConfig
|
|
37
37
|
} = require('./flow-utils')
|
|
38
|
-
const { color, printSection, printHeader, success, warn, error
|
|
38
|
+
const { color, printSection, printHeader, success, warn, error } = require('./flow-output');;
|
|
39
39
|
|
|
40
40
|
const { execSync, execFileSync } = require('node:child_process');
|
|
41
41
|
|
|
@@ -268,7 +268,7 @@ function main() {
|
|
|
268
268
|
success(`WogiFlow version: ${pkg.version}`);
|
|
269
269
|
}
|
|
270
270
|
}
|
|
271
|
-
} catch (
|
|
271
|
+
} catch (_err) {
|
|
272
272
|
// Non-critical — skip silently
|
|
273
273
|
}
|
|
274
274
|
|
|
@@ -582,7 +582,7 @@ function main() {
|
|
|
582
582
|
warn(`Strict mode: NOT CONFIGURED (add enforcement section to config.json)`);
|
|
583
583
|
warnings++;
|
|
584
584
|
}
|
|
585
|
-
} catch (
|
|
585
|
+
} catch (_err) {
|
|
586
586
|
warn(`Could not parse config.json for strict mode check`);
|
|
587
587
|
warnings++;
|
|
588
588
|
}
|
|
@@ -659,7 +659,7 @@ function main() {
|
|
|
659
659
|
console.log(` ${color('yellow', '○')} respectGitignore: not set`);
|
|
660
660
|
}
|
|
661
661
|
|
|
662
|
-
} catch (
|
|
662
|
+
} catch (_err) {
|
|
663
663
|
warn(`Could not parse settings.local.json`);
|
|
664
664
|
warnings++;
|
|
665
665
|
}
|
|
@@ -773,7 +773,7 @@ function main() {
|
|
|
773
773
|
console.log(` ${color('dim', "→ Run 'flow bridge sync' to regenerate CLAUDE.md from template")}`);
|
|
774
774
|
issues++;
|
|
775
775
|
}
|
|
776
|
-
} catch (
|
|
776
|
+
} catch (_err) {
|
|
777
777
|
// Already warned about CLAUDE.md read failure above
|
|
778
778
|
}
|
|
779
779
|
}
|
|
@@ -801,6 +801,36 @@ function main() {
|
|
|
801
801
|
warnings += mcp.duplicates.length;
|
|
802
802
|
}
|
|
803
803
|
|
|
804
|
+
// Check anti-deferral rule compliance (decisions.md:75)
|
|
805
|
+
console.log('');
|
|
806
|
+
printSection('Checking anti-deferral rule compliance...');
|
|
807
|
+
const deferralViolations = checkAntiDeferralCompliance();
|
|
808
|
+
if (deferralViolations.length === 0) {
|
|
809
|
+
success('No anti-deferral violations in ready.json');
|
|
810
|
+
} else {
|
|
811
|
+
for (const v of deferralViolations) {
|
|
812
|
+
warn(`${v.id} (${v.list}): "${v.note.substring(0, 80)}..."`);
|
|
813
|
+
}
|
|
814
|
+
warn(`${deferralViolations.length} task(s) in "ready/in-progress" with deferral language — move to "blocked" with dependsOn`);
|
|
815
|
+
warn(`Rule: .workflow/state/decisions.md §Review-Findings Anti-Deferral`);
|
|
816
|
+
warnings += deferralViolations.length;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
// Completion-claim honesty scan (2026-04-16 honesty-infrastructure)
|
|
820
|
+
console.log('');
|
|
821
|
+
printSection('Checking completion-claim honesty...');
|
|
822
|
+
const honestyHits = checkCompletionClaimHonesty();
|
|
823
|
+
if (honestyHits.length === 0) {
|
|
824
|
+
success('No claim-vs-state contradictions in ready.json');
|
|
825
|
+
} else {
|
|
826
|
+
for (const h of honestyHits) {
|
|
827
|
+
warn(`${h.id} (${h.class === 'A' ? 'status-mismatch' : 'negation-vs-evidence'}): "${h.snippet}"`);
|
|
828
|
+
}
|
|
829
|
+
warn(`${honestyHits.length} contradiction(s): free-text claim disagrees with structured state`);
|
|
830
|
+
warn(`Gate: scripts/flow-completion-truth-gate.js → scanForClaimContradictions`);
|
|
831
|
+
warnings += honestyHits.length;
|
|
832
|
+
}
|
|
833
|
+
|
|
804
834
|
// Check .gitignore sync
|
|
805
835
|
console.log('');
|
|
806
836
|
printSection('Checking .gitignore sync...');
|
|
@@ -817,7 +847,7 @@ function main() {
|
|
|
817
847
|
warn(`Run: node scripts/flow-gitignore.js sync`);
|
|
818
848
|
warnings += gitignoreHealth.missing.length;
|
|
819
849
|
}
|
|
820
|
-
} catch (
|
|
850
|
+
} catch (_err) {
|
|
821
851
|
console.log(` ${color('yellow', '○')} Gitignore check unavailable`);
|
|
822
852
|
}
|
|
823
853
|
|
|
@@ -1217,7 +1247,7 @@ function deepAudit(flags = {}) {
|
|
|
1217
1247
|
for (const feature of features) {
|
|
1218
1248
|
const scriptExists = fileExists(path.join(PROJECT_ROOT, feature.script));
|
|
1219
1249
|
const folderExists = dirExists(path.join(WORKFLOW_DIR, feature.folder.replace('/', '')));
|
|
1220
|
-
const
|
|
1250
|
+
const _skillExists = fileExists(path.join(PROJECT_ROOT, feature.skill));
|
|
1221
1251
|
|
|
1222
1252
|
if (scriptExists && folderExists) {
|
|
1223
1253
|
success(`${feature.name}: script + folder`);
|
|
@@ -1303,4 +1333,61 @@ if (require.main === module) {
|
|
|
1303
1333
|
run();
|
|
1304
1334
|
}
|
|
1305
1335
|
|
|
1306
|
-
|
|
1336
|
+
/**
|
|
1337
|
+
* Detect anti-deferral rule violations in ready.json.
|
|
1338
|
+
* A task carrying "defer/deferred" language in blockedNote while in the ready
|
|
1339
|
+
* or inProgress arrays contradicts the decisions.md:75 anti-deferral rule,
|
|
1340
|
+
* which requires such tasks to be moved to `blocked` with a concrete `dependsOn`.
|
|
1341
|
+
* @returns {Array<{id: string, list: string, note: string}>}
|
|
1342
|
+
*/
|
|
1343
|
+
function checkAntiDeferralCompliance() {
|
|
1344
|
+
const violations = [];
|
|
1345
|
+
try {
|
|
1346
|
+
const ready = safeJsonParse(PATHS.ready, {});
|
|
1347
|
+
const check = (list, arr) => {
|
|
1348
|
+
for (const task of arr || []) {
|
|
1349
|
+
const note = task.blockedNote || task.deferReason || '';
|
|
1350
|
+
if (/\b(deferred?|defer)\b/i.test(note)) {
|
|
1351
|
+
violations.push({ id: task.id, list, note });
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
};
|
|
1355
|
+
check('ready', ready.ready);
|
|
1356
|
+
check('inProgress', ready.inProgress);
|
|
1357
|
+
} catch (_err) {
|
|
1358
|
+
// If ready.json is unreadable, other checks will flag it separately.
|
|
1359
|
+
}
|
|
1360
|
+
return violations;
|
|
1361
|
+
}
|
|
1362
|
+
|
|
1363
|
+
/**
|
|
1364
|
+
* Check completion-claim honesty across ready.json. Uses
|
|
1365
|
+
* flow-completion-truth-gate.scanForClaimContradictions to detect:
|
|
1366
|
+
* Class A — done-word in notes/result while status is partial
|
|
1367
|
+
* Class B — "0 outages"-style negation while hotfixes[] is non-empty
|
|
1368
|
+
* Returns flattened list of {id, class, field, snippet} for health-report display.
|
|
1369
|
+
* @returns {Array<{id: string, class: 'A'|'B', field: string, snippet: string}>}
|
|
1370
|
+
*/
|
|
1371
|
+
function checkCompletionClaimHonesty() {
|
|
1372
|
+
const hits = [];
|
|
1373
|
+
try {
|
|
1374
|
+
const { scanForClaimContradictions } = require('./flow-completion-truth-gate');
|
|
1375
|
+
const ready = safeJsonParse(PATHS.ready, {});
|
|
1376
|
+
const toScan = []
|
|
1377
|
+
.concat(Array.isArray(ready.inProgress) ? ready.inProgress : [])
|
|
1378
|
+
.concat(Array.isArray(ready.recentlyCompleted) ? ready.recentlyCompleted : []);
|
|
1379
|
+
for (const task of toScan) {
|
|
1380
|
+
if (!task || typeof task !== 'object') continue;
|
|
1381
|
+
const res = scanForClaimContradictions(task);
|
|
1382
|
+
if (!res.scanned) continue;
|
|
1383
|
+
for (const c of res.contradictions) {
|
|
1384
|
+
hits.push({ id: task.id, class: c.class, field: c.field, snippet: c.snippet });
|
|
1385
|
+
}
|
|
1386
|
+
}
|
|
1387
|
+
} catch (_err) {
|
|
1388
|
+
// Non-critical; other checks remain.
|
|
1389
|
+
}
|
|
1390
|
+
return hits;
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
module.exports = { checkMcpScopes, normalizeMcpConfig, checkAntiDeferralCompliance, checkCompletionClaimHonesty };
|
package/scripts/flow-hooks.js
CHANGED
|
@@ -17,12 +17,12 @@
|
|
|
17
17
|
const fs = require('node:fs');
|
|
18
18
|
const path = require('node:path');
|
|
19
19
|
const {
|
|
20
|
-
getProjectRoot,
|
|
20
|
+
getProjectRoot: _getProjectRoot,
|
|
21
21
|
getConfig, PATHS
|
|
22
22
|
} = require('./flow-utils')
|
|
23
23
|
const { color, success, warn, error } = require('./flow-output');;
|
|
24
24
|
|
|
25
|
-
const { getAdapter, getAllAdapters
|
|
25
|
+
const { getAdapter, getAllAdapters } = require('./hooks/adapters');
|
|
26
26
|
const { readJson, safeJsonParse } = require('./flow-io');
|
|
27
27
|
|
|
28
28
|
/**
|
|
@@ -45,7 +45,7 @@ function getInstalledVersion() {
|
|
|
45
45
|
|
|
46
46
|
return 'unknown';
|
|
47
47
|
}
|
|
48
|
-
const
|
|
48
|
+
const _HOOK_MARKER = '// WOGI_FLOW_MANAGED_HOOKS';
|
|
49
49
|
|
|
50
50
|
// ============================================================
|
|
51
51
|
// Configuration
|
|
@@ -48,7 +48,7 @@ async function fetchJSON(url, timeout = 3000) {
|
|
|
48
48
|
res.on('end', () => {
|
|
49
49
|
try {
|
|
50
50
|
resolve(JSON.parse(data));
|
|
51
|
-
} catch (
|
|
51
|
+
} catch (_err) {
|
|
52
52
|
reject(new Error('Invalid JSON response'));
|
|
53
53
|
}
|
|
54
54
|
});
|
|
@@ -95,7 +95,7 @@ async function detectAll() {
|
|
|
95
95
|
return results;
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
async function testConnection(endpoint,
|
|
98
|
+
async function testConnection(endpoint, _model) {
|
|
99
99
|
const isOllama = endpoint.includes('11434');
|
|
100
100
|
|
|
101
101
|
try {
|
|
@@ -14,7 +14,7 @@ const readline = require('node:readline/promises');
|
|
|
14
14
|
const http = require('node:http');
|
|
15
15
|
const { HttpClient } = require('./flow-http-client');
|
|
16
16
|
const { URL, URLSearchParams } = require('node:url');
|
|
17
|
-
const {
|
|
17
|
+
const { colors, safeJsonParse, PATHS } = require('./flow-utils');
|
|
18
18
|
const { error: errorMsg } = require('./flow-output');
|
|
19
19
|
|
|
20
20
|
// Import model registry for smart model selection
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
const fs = require('node:fs');
|
|
10
10
|
const path = require('node:path');
|
|
11
11
|
const { spawnSync } = require('node:child_process');
|
|
12
|
-
const {
|
|
12
|
+
const { getConfig, error, success, PATHS } = require('./flow-utils');
|
|
13
13
|
|
|
14
14
|
const TESTS = [];
|
|
15
15
|
let passed = 0;
|
|
@@ -27,7 +27,7 @@ const {
|
|
|
27
27
|
let adaptiveLearning;
|
|
28
28
|
try {
|
|
29
29
|
adaptiveLearning = require('./flow-adaptive-learning');
|
|
30
|
-
} catch (
|
|
30
|
+
} catch (_err) {
|
|
31
31
|
// Module not available - will use local error categories
|
|
32
32
|
adaptiveLearning = null;
|
|
33
33
|
}
|
|
@@ -36,7 +36,7 @@ try {
|
|
|
36
36
|
let errorRecovery;
|
|
37
37
|
try {
|
|
38
38
|
errorRecovery = require('./flow-error-recovery');
|
|
39
|
-
} catch (
|
|
39
|
+
} catch (_err) {
|
|
40
40
|
errorRecovery = null;
|
|
41
41
|
}
|
|
42
42
|
|
|
@@ -372,7 +372,7 @@ function generateHypotheses(errorText, context = {}, maxCount = 5) {
|
|
|
372
372
|
* @param {Object} context - Test context
|
|
373
373
|
* @returns {Object} Test result
|
|
374
374
|
*/
|
|
375
|
-
async function testHypothesis(hypothesis,
|
|
375
|
+
async function testHypothesis(hypothesis, _context) {
|
|
376
376
|
// This is a placeholder for actual test implementations
|
|
377
377
|
// In practice, each test strategy would have specific logic
|
|
378
378
|
const testStrategies = {
|
|
@@ -484,7 +484,7 @@ function saveHypothesisTree(tree, sessionId) {
|
|
|
484
484
|
function loadHypothesisTree() {
|
|
485
485
|
try {
|
|
486
486
|
return readJson(HYPOTHESIS_STATE_PATH);
|
|
487
|
-
} catch (
|
|
487
|
+
} catch (_err) {
|
|
488
488
|
return null;
|
|
489
489
|
}
|
|
490
490
|
}
|
|
@@ -30,7 +30,7 @@ function warn(msg) {
|
|
|
30
30
|
let lspModule = null;
|
|
31
31
|
try {
|
|
32
32
|
lspModule = require('./flow-lsp');
|
|
33
|
-
} catch (
|
|
33
|
+
} catch (_err) {
|
|
34
34
|
// LSP module not available, will use fallback
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -60,7 +60,7 @@ function loadModelRegistry() {
|
|
|
60
60
|
warn('[instruction-richness] Registry unavailable — using fallback defaults');
|
|
61
61
|
}
|
|
62
62
|
return registryCache;
|
|
63
|
-
} catch (
|
|
63
|
+
} catch (_err) {
|
|
64
64
|
warn('[instruction-richness] Could not load model registry — using fallback defaults');
|
|
65
65
|
registryCache = null;
|
|
66
66
|
return null;
|
|
@@ -272,7 +272,7 @@ function loadProjectContext(projectRoot) {
|
|
|
272
272
|
if (fs.existsSync(contextPath)) {
|
|
273
273
|
try {
|
|
274
274
|
context += fs.readFileSync(contextPath, 'utf-8');
|
|
275
|
-
} catch (
|
|
275
|
+
} catch (_err) {
|
|
276
276
|
// File may have been deleted/modified between check and read
|
|
277
277
|
}
|
|
278
278
|
}
|
|
@@ -286,7 +286,7 @@ function loadProjectContext(projectRoot) {
|
|
|
286
286
|
if (summaryMatch) {
|
|
287
287
|
context += '\n\n### Project Summary\n' + summaryMatch[0];
|
|
288
288
|
}
|
|
289
|
-
} catch (
|
|
289
|
+
} catch (_err) {
|
|
290
290
|
// File may have been deleted/modified between check and read
|
|
291
291
|
}
|
|
292
292
|
}
|
|
@@ -308,7 +308,7 @@ function loadPatterns(projectRoot) {
|
|
|
308
308
|
let content;
|
|
309
309
|
try {
|
|
310
310
|
content = fs.readFileSync(decisionsPath, 'utf-8');
|
|
311
|
-
} catch (
|
|
311
|
+
} catch (_err) {
|
|
312
312
|
// File may have been deleted/modified between check and read
|
|
313
313
|
return null;
|
|
314
314
|
}
|
|
@@ -427,7 +427,7 @@ function loadRelevantTypes(projectRoot, filePath, options = {}) {
|
|
|
427
427
|
* @returns {Promise<string|null>} Formatted type information
|
|
428
428
|
*/
|
|
429
429
|
async function loadRelevantTypesWithLSP(projectRoot, filePath, options = {}) {
|
|
430
|
-
const { getConfig
|
|
430
|
+
const { getConfig } = require('./flow-utils');
|
|
431
431
|
const config = getConfig();
|
|
432
432
|
|
|
433
433
|
// Check if LSP is enabled
|
|
@@ -451,7 +451,7 @@ async function loadRelevantTypesWithLSP(projectRoot, filePath, options = {}) {
|
|
|
451
451
|
let content;
|
|
452
452
|
try {
|
|
453
453
|
content = fs.readFileSync(absPath, 'utf-8');
|
|
454
|
-
} catch (
|
|
454
|
+
} catch (_err) {
|
|
455
455
|
// File may have been deleted/modified between check and read
|
|
456
456
|
return loadRelevantTypes(projectRoot, filePath, options);
|
|
457
457
|
}
|
|
@@ -464,7 +464,7 @@ async function loadRelevantTypesWithLSP(projectRoot, filePath, options = {}) {
|
|
|
464
464
|
if (typeInfo) {
|
|
465
465
|
types.push(`// ${id.name}\n${typeInfo}`);
|
|
466
466
|
}
|
|
467
|
-
} catch (
|
|
467
|
+
} catch (_err) {
|
|
468
468
|
// Skip individual errors
|
|
469
469
|
}
|
|
470
470
|
}
|
|
@@ -482,7 +482,7 @@ async function loadRelevantTypesWithLSP(projectRoot, filePath, options = {}) {
|
|
|
482
482
|
}
|
|
483
483
|
|
|
484
484
|
return types.length > 0 ? types.join('\n\n') : null;
|
|
485
|
-
} catch (
|
|
485
|
+
} catch (_err) {
|
|
486
486
|
// Fallback to regex-based loading on any error
|
|
487
487
|
return loadRelevantTypes(projectRoot, filePath, options);
|
|
488
488
|
}
|
|
@@ -545,12 +545,12 @@ function extractIdentifiersForLSP(content, keywords = []) {
|
|
|
545
545
|
/**
|
|
546
546
|
* Finds related code files (similar components, hooks, etc.)
|
|
547
547
|
*/
|
|
548
|
-
function loadRelatedCode(projectRoot, filePath,
|
|
548
|
+
function loadRelatedCode(projectRoot, filePath, _stepType) {
|
|
549
549
|
if (!filePath) return null;
|
|
550
550
|
|
|
551
551
|
const related = [];
|
|
552
552
|
const dir = path.dirname(filePath);
|
|
553
|
-
const
|
|
553
|
+
const _ext = path.extname(filePath);
|
|
554
554
|
|
|
555
555
|
// Find siblings or similar files
|
|
556
556
|
const searchDirs = [dir, path.join(dir, '..'), path.join(dir, '..', '..')];
|
|
@@ -39,7 +39,7 @@ const path = require('node:path');
|
|
|
39
39
|
|
|
40
40
|
const { PATHS } = require('./flow-paths');
|
|
41
41
|
const { fileExists, safeJsonParse, ensureDir } = require('./flow-io');
|
|
42
|
-
const { info,
|
|
42
|
+
const { info, warn, color } = require('./flow-output');
|
|
43
43
|
const { detectTrapZones } = require('./flow-trap-zone');
|
|
44
44
|
const gateTelemetry = require('./flow-gate-telemetry');
|
|
45
45
|
|
|
@@ -39,7 +39,7 @@ const path = require('node:path');
|
|
|
39
39
|
const { PATHS } = require('./flow-paths');
|
|
40
40
|
const { fileExists, ensureDir, readFile } = require('./flow-io');
|
|
41
41
|
const { getConfig } = require('./flow-config-loader');
|
|
42
|
-
const { color,
|
|
42
|
+
const { color, warn, error } = require('./flow-output');
|
|
43
43
|
|
|
44
44
|
const gateTelemetry = require('./flow-gate-telemetry');
|
|
45
45
|
|
|
@@ -24,15 +24,15 @@ const path = require('node:path');
|
|
|
24
24
|
const {
|
|
25
25
|
getConfig,
|
|
26
26
|
PATHS,
|
|
27
|
-
STATE_DIR,
|
|
28
|
-
colors,
|
|
27
|
+
STATE_DIR: _STATE_DIR,
|
|
28
|
+
colors: _colors,
|
|
29
29
|
color,
|
|
30
30
|
success,
|
|
31
|
-
warn,
|
|
31
|
+
warn: _warn,
|
|
32
32
|
error,
|
|
33
|
-
readFile,
|
|
34
|
-
writeFile,
|
|
35
|
-
fileExists,
|
|
33
|
+
readFile: _readFile,
|
|
34
|
+
writeFile: _writeFile,
|
|
35
|
+
fileExists: _fileExists,
|
|
36
36
|
printHeader,
|
|
37
37
|
getTodayDate
|
|
38
38
|
} = require('./flow-utils');
|
|
@@ -280,7 +280,7 @@ async function storeSkillLearning(correction, route, context) {
|
|
|
280
280
|
};
|
|
281
281
|
}
|
|
282
282
|
|
|
283
|
-
async function storeProjectDecision(correction,
|
|
283
|
+
async function storeProjectDecision(correction, _route, context) {
|
|
284
284
|
const decisionsPath = PATHS.decisions;
|
|
285
285
|
|
|
286
286
|
let content = '';
|
|
@@ -23,10 +23,10 @@ const {
|
|
|
23
23
|
PATHS,
|
|
24
24
|
PROJECT_ROOT,
|
|
25
25
|
fileExists,
|
|
26
|
-
dirExists,
|
|
26
|
+
dirExists: _dirExists,
|
|
27
27
|
parseFlags,
|
|
28
28
|
outputJson,
|
|
29
|
-
getConfig,
|
|
29
|
+
getConfig: _getConfig,
|
|
30
30
|
isPathWithinProject,
|
|
31
31
|
safeJsonParse,
|
|
32
32
|
writeJson,
|
|
@@ -461,7 +461,7 @@ function printStatus(driftStatus) {
|
|
|
461
461
|
* @param {string[]} categories - Categories to regenerate
|
|
462
462
|
* @returns {Promise<Object>} New sync state or null if failed
|
|
463
463
|
*/
|
|
464
|
-
async function regenerateKnowledgeFiles(
|
|
464
|
+
async function regenerateKnowledgeFiles(_categories = ['stack', 'architecture', 'testing']) {
|
|
465
465
|
info('Regenerating knowledge files...');
|
|
466
466
|
|
|
467
467
|
const { spawn } = require('node:child_process');
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* - flow-standards-learner.js — Standards violation learning
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
-
const
|
|
26
|
+
const _fs = require('node:fs');
|
|
27
27
|
const { PATHS } = require('./flow-paths');
|
|
28
28
|
const { acquireLock, readFile, writeFile, fileExists } = require('./flow-io');
|
|
29
29
|
|
package/scripts/flow-links.js
CHANGED
|
@@ -25,7 +25,7 @@ const path = require('node:path');
|
|
|
25
25
|
const https = require('node:https');
|
|
26
26
|
const http = require('node:http');
|
|
27
27
|
const dns = require('dns');
|
|
28
|
-
const {
|
|
28
|
+
const { colors: c, readJson, PATHS } = require('./flow-utils');
|
|
29
29
|
const { success: printSuccess } = require('./flow-output');
|
|
30
30
|
|
|
31
31
|
const LINKS_PATH = path.join(PATHS.workflow, 'links.yaml');
|
|
@@ -485,7 +485,7 @@ function removeLink(name) {
|
|
|
485
485
|
* Get all linked context for LLM prompts
|
|
486
486
|
*/
|
|
487
487
|
function getLinkedContext(linkNames = null) {
|
|
488
|
-
const
|
|
488
|
+
const _links = loadLinks();
|
|
489
489
|
let context = '';
|
|
490
490
|
|
|
491
491
|
const processLink = (name) => {
|
|
@@ -20,7 +20,7 @@ const {
|
|
|
20
20
|
PATHS,
|
|
21
21
|
WORKFLOW_DIR,
|
|
22
22
|
STATE_DIR,
|
|
23
|
-
colors,
|
|
23
|
+
colors: _colors,
|
|
24
24
|
color,
|
|
25
25
|
warn,
|
|
26
26
|
success,
|
|
@@ -228,7 +228,7 @@ Archived entries from request-log.md.
|
|
|
228
228
|
/**
|
|
229
229
|
* Update running summary of archived entries
|
|
230
230
|
*/
|
|
231
|
-
function updateSummary(archivedEntries,
|
|
231
|
+
function updateSummary(archivedEntries, _archiveDate) {
|
|
232
232
|
let summary;
|
|
233
233
|
|
|
234
234
|
if (fileExists(SUMMARY_PATH)) {
|