wogiflow 2.4.2 → 2.4.4
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-start.md +124 -0
- package/.claude/docs/claude-code-compatibility.md +51 -0
- package/.claude/docs/explore-agents.md +11 -0
- package/.claude/settings.json +12 -1
- package/.workflow/models/registry.json +1 -1
- package/bin/flow +11 -1
- package/lib/workspace-contracts.js +599 -0
- package/lib/workspace-intelligence.js +600 -0
- package/lib/workspace-messages.js +441 -0
- package/lib/workspace-routing.js +485 -0
- package/lib/workspace-sync.js +339 -0
- package/lib/workspace.js +1073 -0
- package/package.json +4 -4
- package/scripts/MEMORY-ARCHITECTURE.md +1 -1
- package/scripts/base-workflow-step.js +136 -0
- package/scripts/flow-adaptive-learning.js +8 -9
- package/scripts/flow-aggregate.js +11 -6
- package/scripts/flow-api-index.js +4 -6
- package/scripts/flow-assumption-detector.js +0 -2
- package/scripts/flow-audit.js +15 -2
- package/scripts/flow-auto-context.js +8 -12
- package/scripts/flow-auto-learn.js +49 -49
- package/scripts/flow-background.js +5 -6
- package/scripts/flow-bridge-state.js +8 -10
- package/scripts/flow-bulk-loop.js +1 -3
- package/scripts/flow-bulk-orchestrator.js +1 -3
- package/scripts/flow-cascade-completion.js +0 -2
- package/scripts/flow-cascade.js +4 -4
- package/scripts/flow-checkpoint.js +10 -13
- package/scripts/flow-code-intelligence.js +10 -12
- package/scripts/flow-community-sync.js +4 -4
- package/scripts/flow-community.js +12 -20
- package/scripts/flow-config-defaults.js +28 -2
- package/scripts/flow-config-interactive.js +9 -5
- package/scripts/flow-config-loader.js +49 -92
- package/scripts/flow-config-substitution.js +0 -2
- package/scripts/flow-context-estimator.js +4 -4
- package/scripts/flow-context-init.js +10 -12
- package/scripts/flow-context-manager.js +0 -2
- package/scripts/flow-context-scoring.js +2 -2
- package/scripts/flow-contract-scan.js +6 -9
- package/scripts/flow-correct.js +29 -27
- package/scripts/flow-correction-detector.js +5 -1
- package/scripts/flow-damage-control.js +47 -54
- package/scripts/flow-decisions-merge.js +4 -14
- package/scripts/flow-diff.js +5 -8
- package/scripts/flow-done-gates.js +786 -0
- package/scripts/flow-done-report.js +123 -0
- package/scripts/flow-done.js +71 -717
- package/scripts/flow-entropy-monitor.js +1 -3
- package/scripts/flow-eval-calibration.js +257 -0
- package/scripts/flow-eval-judge.js +10 -1
- package/scripts/flow-eval.js +14 -5
- package/scripts/flow-extraction-review.js +1 -0
- package/scripts/flow-failure-categories.js +0 -2
- package/scripts/flow-figma-confirm.js +5 -9
- package/scripts/flow-figma-generate.js +8 -10
- package/scripts/flow-figma-index.js +8 -10
- package/scripts/flow-figma-match.js +3 -5
- package/scripts/flow-figma-mcp-server.js +2 -4
- package/scripts/flow-figma-orchestrator.js +2 -3
- package/scripts/flow-figma-registry.js +2 -3
- package/scripts/flow-framework-resolver.js +0 -2
- package/scripts/flow-function-index.js +4 -6
- package/scripts/flow-gate-confidence.js +2 -2
- package/scripts/flow-gitignore.js +0 -2
- package/scripts/flow-guided-edit.js +5 -6
- package/scripts/flow-health.js +5 -6
- package/scripts/flow-hook-errors.js +6 -0
- package/scripts/flow-hook-status.js +263 -0
- package/scripts/flow-hooks.js +17 -29
- package/scripts/flow-http-client.js +9 -8
- package/scripts/flow-hybrid-interactive.js +7 -12
- package/scripts/flow-hybrid-test.js +12 -13
- package/scripts/flow-instruction-richness.js +1 -1
- package/scripts/flow-io.js +21 -4
- package/scripts/flow-knowledge-router.js +9 -3
- package/scripts/flow-learning-orchestrator.js +318 -13
- package/scripts/flow-links.js +5 -7
- package/scripts/flow-long-input-association.js +275 -0
- package/scripts/flow-long-input-chunking.js +1 -0
- package/scripts/flow-long-input-cli.js +0 -2
- package/scripts/flow-long-input-complexity.js +0 -2
- package/scripts/flow-long-input-constants.js +0 -2
- package/scripts/flow-long-input-contradictions.js +351 -0
- package/scripts/flow-long-input-detection.js +0 -2
- package/scripts/flow-long-input-passes.js +885 -0
- package/scripts/flow-long-input-stories.js +1 -1
- package/scripts/flow-long-input-voice.js +0 -2
- package/scripts/flow-long-input.js +425 -3005
- package/scripts/flow-loop-retry-learning.js +2 -3
- package/scripts/flow-lsp.js +3 -3
- package/scripts/flow-mcp-docs.js +3 -4
- package/scripts/flow-memory-db.js +6 -8
- package/scripts/flow-memory-sync.js +18 -11
- package/scripts/flow-metrics.js +1 -2
- package/scripts/flow-model-adapter.js +2 -3
- package/scripts/flow-model-config.js +72 -104
- package/scripts/flow-model-router.js +2 -2
- package/scripts/flow-model-types.js +0 -2
- package/scripts/flow-multi-approach.js +5 -6
- package/scripts/flow-orchestrate-context.js +3 -7
- package/scripts/flow-orchestrate-rollback.js +3 -8
- package/scripts/flow-orchestrate-state.js +8 -14
- package/scripts/flow-orchestrate-templates.js +2 -6
- package/scripts/flow-orchestrate-validator.js +5 -9
- package/scripts/flow-orchestrate.js +126 -103
- package/scripts/flow-output.js +0 -2
- package/scripts/flow-parallel.js +1 -1
- package/scripts/flow-paths.js +23 -2
- package/scripts/flow-pattern-enforcer.js +30 -28
- package/scripts/flow-pattern-extractor.js +3 -4
- package/scripts/flow-pending.js +0 -2
- package/scripts/flow-permissions.js +2 -3
- package/scripts/flow-plugin-registry.js +10 -12
- package/scripts/flow-prd-manager.js +1 -1
- package/scripts/flow-progress.js +7 -9
- package/scripts/flow-prompt-composer.js +3 -3
- package/scripts/flow-prompt-template.js +2 -2
- package/scripts/flow-providers.js +7 -4
- package/scripts/flow-registry-manager.js +7 -12
- package/scripts/flow-regression.js +9 -11
- package/scripts/flow-roadmap.js +2 -2
- package/scripts/flow-run-trace.js +16 -15
- package/scripts/flow-safety.js +2 -5
- package/scripts/flow-scanner-base.js +5 -7
- package/scripts/flow-scenario-engine.js +1 -5
- package/scripts/flow-security.js +29 -0
- package/scripts/flow-session-end.js +32 -41
- package/scripts/flow-session-learning.js +53 -49
- package/scripts/flow-setup-hooks.js +2 -3
- package/scripts/flow-skill-create.js +7 -12
- package/scripts/flow-skill-generator.js +12 -16
- package/scripts/flow-skill-learn.js +17 -8
- package/scripts/flow-skill-matcher.js +1 -2
- package/scripts/flow-spec-generator.js +2 -4
- package/scripts/flow-stack-wizard.js +5 -7
- package/scripts/flow-standards-learner.js +35 -16
- package/scripts/flow-start.js +2 -0
- package/scripts/flow-stats-collector.js +2 -2
- package/scripts/flow-status.js +10 -10
- package/scripts/flow-statusline-setup.js +2 -2
- package/scripts/flow-step-changelog.js +2 -3
- package/scripts/flow-step-comments.js +66 -81
- package/scripts/flow-step-complexity.js +50 -70
- package/scripts/flow-step-coverage.js +3 -5
- package/scripts/flow-step-knowledge.js +2 -3
- package/scripts/flow-step-pr-tests.js +64 -74
- package/scripts/flow-step-regression.js +3 -5
- package/scripts/flow-step-review.js +86 -103
- package/scripts/flow-step-security.js +111 -121
- package/scripts/flow-step-silent-failures.js +56 -83
- package/scripts/flow-step-simplifier.js +52 -70
- package/scripts/flow-story.js +4 -7
- package/scripts/flow-strict-adherence.js +3 -4
- package/scripts/flow-task-checkpoint.js +36 -5
- package/scripts/flow-task-enforcer.js +2 -24
- package/scripts/flow-tech-debt.js +1 -1
- package/scripts/flow-template-extractor.js +1 -0
- package/scripts/flow-templates.js +11 -13
- package/scripts/flow-test-api.js +9 -13
- package/scripts/flow-test-discovery.js +1 -1
- package/scripts/flow-test-generate.js +5 -9
- package/scripts/flow-test-integrity.js +3 -7
- package/scripts/flow-test-ui.js +5 -9
- package/scripts/flow-testing-deps.js +1 -3
- package/scripts/flow-tiered-learning.js +4 -4
- package/scripts/flow-todowrite-sync.js +1 -1
- package/scripts/flow-tokens.js +0 -2
- package/scripts/flow-verification-profile.js +6 -10
- package/scripts/flow-verify.js +12 -16
- package/scripts/flow-version-check.js +4 -12
- package/scripts/flow-webmcp-generator.js +3 -5
- package/scripts/flow-workflow-steps.js +0 -2
- package/scripts/flow-workflow.js +9 -11
- package/scripts/hooks/adapters/claude-code.js +31 -0
- package/scripts/hooks/core/config-change.js +1 -0
- package/scripts/hooks/core/extension-registry.js +0 -2
- package/scripts/hooks/core/instructions-loaded.js +1 -1
- package/scripts/hooks/core/observation-capture.js +5 -5
- package/scripts/hooks/core/phase-gate.js +5 -0
- package/scripts/hooks/core/post-compact.js +1 -12
- package/scripts/hooks/core/research-gate.js +2 -12
- package/scripts/hooks/core/routing-gate.js +6 -0
- package/scripts/hooks/core/task-completed.js +12 -0
- package/scripts/hooks/core/task-created.js +83 -0
- package/scripts/hooks/core/worktree-lifecycle.js +1 -1
- package/scripts/hooks/entry/claude-code/config-change.js +6 -29
- package/scripts/hooks/entry/claude-code/instructions-loaded.js +5 -30
- package/scripts/hooks/entry/claude-code/post-compact.js +4 -31
- package/scripts/hooks/entry/claude-code/post-tool-use.js +121 -172
- package/scripts/hooks/entry/claude-code/pre-tool-use.js +260 -361
- package/scripts/hooks/entry/claude-code/session-end.js +4 -28
- package/scripts/hooks/entry/claude-code/session-start.js +205 -243
- package/scripts/hooks/entry/claude-code/setup.js +8 -49
- package/scripts/hooks/entry/claude-code/stop.js +40 -72
- package/scripts/hooks/entry/claude-code/task-completed.js +4 -28
- package/scripts/hooks/entry/claude-code/task-created.js +15 -0
- package/scripts/hooks/entry/claude-code/user-prompt-submit.js +113 -195
- package/scripts/hooks/entry/claude-code/worktree-create.js +6 -25
- package/scripts/hooks/entry/claude-code/worktree-remove.js +6 -25
- package/scripts/hooks/entry/shared/hook-runner.js +99 -0
- package/scripts/hooks/entry/shared/read-stdin.js +0 -2
- package/scripts/postinstall.js +2 -0
- package/scripts/registries/api-registry.js +0 -2
- package/scripts/registries/component-registry.js +5 -9
- package/scripts/registries/contract-scanner.js +2 -9
- package/scripts/registries/function-registry.js +0 -2
- package/scripts/registries/schema-registry.js +14 -18
- package/scripts/registries/service-registry.js +23 -27
|
@@ -11,35 +11,8 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
const { handlePostCompact } = require('../../core/post-compact');
|
|
14
|
-
const {
|
|
15
|
-
const { readHookInput } = require('../shared/read-stdin');
|
|
14
|
+
const { runHook } = require('../shared/hook-runner');
|
|
16
15
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
// Consume stdin (required by hook protocol, even if we don't use the input)
|
|
22
|
-
await readHookInput();
|
|
23
|
-
|
|
24
|
-
// Handle post-compaction state recovery
|
|
25
|
-
const result = handlePostCompact();
|
|
26
|
-
|
|
27
|
-
// Transform to Claude Code format via adapter
|
|
28
|
-
const output = claudeCodeAdapter.transformResult('PostCompact', result);
|
|
29
|
-
|
|
30
|
-
process.stdout.write(JSON.stringify(output));
|
|
31
|
-
process.exit(0);
|
|
32
|
-
} catch (err) {
|
|
33
|
-
// Never block on post-compact errors — fail open
|
|
34
|
-
try {
|
|
35
|
-
const { logHookError } = require('../../../flow-hook-errors');
|
|
36
|
-
logHookError('PostCompact', err, { failMode: 'open', operation: 'post-compaction-recovery' });
|
|
37
|
-
} catch (logErr) {
|
|
38
|
-
console.error(`[WogiFlow] PostCompact hook error: ${err.message}`);
|
|
39
|
-
}
|
|
40
|
-
process.stdout.write(JSON.stringify({ continue: true }));
|
|
41
|
-
process.exit(0);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
main();
|
|
16
|
+
runHook('PostCompact', async () => {
|
|
17
|
+
return handlePostCompact();
|
|
18
|
+
}, { failMode: 'warn', useStdoutWrite: true });
|
|
@@ -11,10 +11,8 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
const { runValidation } = require('../../core/validation');
|
|
14
|
-
const { claudeCodeAdapter } = require('../../adapters/claude-code');
|
|
15
14
|
const { captureObservation } = require('../../core/observation-capture');
|
|
16
|
-
const {
|
|
17
|
-
const { logHookError } = require('../../../flow-hook-errors');
|
|
15
|
+
const { runHook } = require('../shared/hook-runner');
|
|
18
16
|
|
|
19
17
|
function extractErrorMessage(toolResponse) {
|
|
20
18
|
if (!toolResponse) return 'unknown error';
|
|
@@ -27,199 +25,150 @@ function extractErrorMessage(toolResponse) {
|
|
|
27
25
|
return 'tool execution failed';
|
|
28
26
|
}
|
|
29
27
|
|
|
30
|
-
async
|
|
28
|
+
runHook('PostToolUse', async ({ parsedInput }) => {
|
|
31
29
|
const startTime = Date.now();
|
|
32
30
|
|
|
31
|
+
const toolName = parsedInput.toolName;
|
|
32
|
+
const toolInput = parsedInput.toolInput || {};
|
|
33
|
+
const toolResponse = parsedInput.toolResponse;
|
|
34
|
+
const filePath = toolInput.file_path;
|
|
35
|
+
|
|
36
|
+
// Detect tool failure for rejected-approach tagging
|
|
37
|
+
const toolFailed = !!(
|
|
38
|
+
toolResponse?.error ||
|
|
39
|
+
toolResponse?.isError ||
|
|
40
|
+
(typeof toolResponse === 'string' && toolResponse.toLowerCase().startsWith('error:'))
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
// CAPTURE OBSERVATION FOR ALL TOOLS (non-blocking)
|
|
33
44
|
try {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
45
|
+
await captureObservation({
|
|
46
|
+
sessionId: parsedInput.sessionId,
|
|
47
|
+
toolName,
|
|
48
|
+
toolInput,
|
|
49
|
+
toolResponse,
|
|
50
|
+
duration: Date.now() - startTime,
|
|
51
|
+
explorationStatus: toolFailed ? 'rejected' : undefined,
|
|
52
|
+
rejectionReason: toolFailed ? extractErrorMessage(toolResponse) : undefined
|
|
53
|
+
});
|
|
54
|
+
} catch (err) {
|
|
55
|
+
if (process.env.DEBUG) {
|
|
56
|
+
console.error(`[observation-capture] ${err.message}`);
|
|
40
57
|
}
|
|
58
|
+
}
|
|
41
59
|
|
|
42
|
-
|
|
60
|
+
// v6.0: Detect task entering inProgress via ready.json edit
|
|
61
|
+
if ((toolName === 'Edit' || toolName === 'Write') && filePath && filePath.endsWith('ready.json') && !toolFailed) {
|
|
62
|
+
try {
|
|
63
|
+
const { safeJsonParse } = require('../../../flow-utils');
|
|
64
|
+
const readyData = safeJsonParse(filePath, null);
|
|
65
|
+
if (readyData && Array.isArray(readyData.inProgress) && readyData.inProgress.length > 0) {
|
|
66
|
+
const task = readyData.inProgress[0];
|
|
67
|
+
const taskId = task && task.id;
|
|
68
|
+
if (!taskId) throw new Error('inProgress entry missing id');
|
|
69
|
+
const taskTitle = task.title || taskId;
|
|
70
|
+
|
|
71
|
+
const { loadDurableSession, createDurableSession } = require('../../../flow-durable-session');
|
|
72
|
+
const existing = loadDurableSession();
|
|
73
|
+
if (!existing || existing.taskId !== taskId) {
|
|
74
|
+
const criteria = task.acceptanceCriteria || task.scenarios || [];
|
|
75
|
+
const steps = Array.isArray(criteria) ? criteria : [];
|
|
76
|
+
const sessionSteps = steps.length > 0 ? steps : [taskTitle];
|
|
77
|
+
createDurableSession(taskId, 'task', sessionSteps);
|
|
78
|
+
|
|
79
|
+
try {
|
|
80
|
+
const { trackTaskStart } = require('../../../flow-session-state');
|
|
81
|
+
trackTaskStart(taskId, taskTitle);
|
|
82
|
+
} catch (err) {
|
|
83
|
+
if (process.env.DEBUG) console.error(`[post-tool-use] trackTaskStart: ${err.message}`);
|
|
84
|
+
}
|
|
43
85
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
86
|
+
try {
|
|
87
|
+
const { setCurrentTask } = require('../../../flow-memory-blocks');
|
|
88
|
+
setCurrentTask(taskId, taskTitle);
|
|
89
|
+
} catch (err) {
|
|
90
|
+
if (process.env.DEBUG) console.error(`[post-tool-use] setCurrentTask: ${err.message}`);
|
|
91
|
+
}
|
|
48
92
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
93
|
+
// v7.0: Initialize task checkpoint with criteria for PostCompact recovery
|
|
94
|
+
try {
|
|
95
|
+
const { saveCheckpoint } = require('../../../flow-task-checkpoint');
|
|
96
|
+
const criteriaList = (task.acceptanceCriteria || task.scenarios || [])
|
|
97
|
+
.map((c, i) => ({
|
|
98
|
+
id: `ac-${i + 1}`,
|
|
99
|
+
text: typeof c === 'string' ? c : (c.description || c.title || `Criterion ${i + 1}`),
|
|
100
|
+
done: false
|
|
101
|
+
}));
|
|
102
|
+
await saveCheckpoint({
|
|
103
|
+
taskId,
|
|
104
|
+
taskTitle,
|
|
105
|
+
currentPhase: 'coding',
|
|
106
|
+
criteria: criteriaList,
|
|
107
|
+
changedFiles: []
|
|
108
|
+
});
|
|
109
|
+
} catch (err) {
|
|
110
|
+
if (process.env.DEBUG) console.error(`[post-tool-use] Checkpoint init: ${err.message}`);
|
|
111
|
+
}
|
|
57
112
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
toolResponse,
|
|
64
|
-
duration: Date.now() - startTime,
|
|
65
|
-
explorationStatus: toolFailed ? 'rejected' : undefined,
|
|
66
|
-
rejectionReason: toolFailed ? extractErrorMessage(toolResponse) : undefined
|
|
67
|
-
});
|
|
113
|
+
if (process.env.DEBUG) {
|
|
114
|
+
console.error(`[post-tool-use] Initialized durable session for ${taskId} (prompt-path bridge)`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
68
118
|
} catch (err) {
|
|
69
|
-
// Non-blocking - observation capture should never fail the hook
|
|
70
119
|
if (process.env.DEBUG) {
|
|
71
|
-
console.error(`[
|
|
120
|
+
console.error(`[post-tool-use] Durable session bridge: ${err.message}`);
|
|
72
121
|
}
|
|
73
122
|
}
|
|
123
|
+
}
|
|
74
124
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if ((toolName === 'Edit' || toolName === 'Write') && filePath && filePath.endsWith('ready.json') && !toolFailed) {
|
|
125
|
+
// Auto registry scan after successful git commit (fire-and-forget)
|
|
126
|
+
if (toolName === 'Bash' && toolInput.command && !toolFailed) {
|
|
127
|
+
const { isGitCommit } = require('../../core/commit-log-gate');
|
|
128
|
+
if (isGitCommit(toolInput.command)) {
|
|
80
129
|
try {
|
|
81
|
-
const
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const taskTitle = task.title || taskId;
|
|
89
|
-
|
|
90
|
-
// Check if durable session already exists for this task
|
|
91
|
-
const { loadDurableSession, createDurableSession } = require('../../../flow-durable-session');
|
|
92
|
-
const existing = loadDurableSession();
|
|
93
|
-
if (!existing || existing.taskId !== taskId) {
|
|
94
|
-
// Initialize durable session
|
|
95
|
-
const criteria = task.acceptanceCriteria || task.scenarios || [];
|
|
96
|
-
const steps = Array.isArray(criteria) ? criteria : [];
|
|
97
|
-
const sessionSteps = steps.length > 0 ? steps : [taskTitle];
|
|
98
|
-
createDurableSession(taskId, 'task', sessionSteps);
|
|
99
|
-
|
|
100
|
-
// Initialize session state tracking
|
|
101
|
-
try {
|
|
102
|
-
const { trackTaskStart } = require('../../../flow-session-state');
|
|
103
|
-
trackTaskStart(taskId, taskTitle);
|
|
104
|
-
} catch (err) {
|
|
105
|
-
if (process.env.DEBUG) console.error(`[post-tool-use] trackTaskStart: ${err.message}`);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// Initialize memory blocks
|
|
109
|
-
try {
|
|
110
|
-
const { setCurrentTask } = require('../../../flow-memory-blocks');
|
|
111
|
-
setCurrentTask(taskId, taskTitle);
|
|
112
|
-
} catch (err) {
|
|
113
|
-
if (process.env.DEBUG) console.error(`[post-tool-use] setCurrentTask: ${err.message}`);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// v7.0: Initialize task checkpoint with criteria for PostCompact recovery
|
|
117
|
-
try {
|
|
118
|
-
const { saveCheckpoint } = require('../../../flow-task-checkpoint');
|
|
119
|
-
const criteriaList = (task.acceptanceCriteria || task.scenarios || [])
|
|
120
|
-
.map((c, i) => ({
|
|
121
|
-
id: `ac-${i + 1}`,
|
|
122
|
-
text: typeof c === 'string' ? c : (c.description || c.title || `Criterion ${i + 1}`),
|
|
123
|
-
done: false
|
|
124
|
-
}));
|
|
125
|
-
await saveCheckpoint({
|
|
126
|
-
taskId,
|
|
127
|
-
taskTitle,
|
|
128
|
-
currentPhase: 'coding',
|
|
129
|
-
criteria: criteriaList,
|
|
130
|
-
changedFiles: []
|
|
131
|
-
});
|
|
132
|
-
} catch (err) {
|
|
133
|
-
if (process.env.DEBUG) console.error(`[post-tool-use] Checkpoint init: ${err.message}`);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
if (process.env.DEBUG) {
|
|
137
|
-
console.error(`[post-tool-use] Initialized durable session for ${taskId} (prompt-path bridge)`);
|
|
138
|
-
}
|
|
130
|
+
const { RegistryManager } = require('../../../flow-registry-manager');
|
|
131
|
+
const manager = new RegistryManager();
|
|
132
|
+
manager.loadPlugins();
|
|
133
|
+
manager.activatePlugins();
|
|
134
|
+
manager.scanAll().catch((err) => {
|
|
135
|
+
if (process.env.DEBUG) {
|
|
136
|
+
console.error(`[post-tool-use] Auto registry scan failed: ${err.message}`);
|
|
139
137
|
}
|
|
140
|
-
}
|
|
138
|
+
});
|
|
141
139
|
} catch (err) {
|
|
142
|
-
// Non-blocking — durable session init should never fail the hook
|
|
143
140
|
if (process.env.DEBUG) {
|
|
144
|
-
console.error(`[post-tool-use]
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Auto registry scan after successful git commit (fire-and-forget)
|
|
150
|
-
// v7.0: Mechanical enforcement — AI no longer needs to remember to run registry scan.
|
|
151
|
-
// Runs after every commit, regardless of task level (L3 included).
|
|
152
|
-
if (toolName === 'Bash' && toolInput.command && !toolFailed) {
|
|
153
|
-
const { isGitCommit } = require('../../core/commit-log-gate');
|
|
154
|
-
if (isGitCommit(toolInput.command)) {
|
|
155
|
-
try {
|
|
156
|
-
const { RegistryManager } = require('../../../flow-registry-manager');
|
|
157
|
-
const manager = new RegistryManager();
|
|
158
|
-
manager.loadPlugins();
|
|
159
|
-
manager.activatePlugins();
|
|
160
|
-
manager.scanAll().catch((err) => {
|
|
161
|
-
if (process.env.DEBUG) {
|
|
162
|
-
console.error(`[post-tool-use] Auto registry scan failed: ${err.message}`);
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
} catch (err) {
|
|
166
|
-
// Non-blocking — registry manager may not be available
|
|
167
|
-
if (process.env.DEBUG) {
|
|
168
|
-
console.error(`[post-tool-use] Registry manager load error: ${err.message}`);
|
|
169
|
-
}
|
|
141
|
+
console.error(`[post-tool-use] Registry manager load error: ${err.message}`);
|
|
170
142
|
}
|
|
171
143
|
}
|
|
172
144
|
}
|
|
145
|
+
}
|
|
173
146
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
147
|
+
// Only run validation for Edit/Write
|
|
148
|
+
if (toolName !== 'Edit' && toolName !== 'Write') {
|
|
149
|
+
return { __raw: true, continue: true };
|
|
150
|
+
}
|
|
180
151
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
return;
|
|
186
|
-
}
|
|
152
|
+
// Skip if tool failed
|
|
153
|
+
if (toolResponse && toolResponse.error) {
|
|
154
|
+
return { __raw: true, continue: true };
|
|
155
|
+
}
|
|
187
156
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
// Non-blocking — checkpoint may not exist yet (no active task)
|
|
197
|
-
if (process.env.DEBUG) {
|
|
198
|
-
console.error(`[post-tool-use] File tracking: ${err.message}`);
|
|
199
|
-
}
|
|
157
|
+
// v7.0: Track changed files in task checkpoint
|
|
158
|
+
if (filePath && !filePath.includes('.workflow/') && !filePath.includes('.claude/')) {
|
|
159
|
+
try {
|
|
160
|
+
const { trackChangedFile } = require('../../../flow-task-checkpoint');
|
|
161
|
+
trackChangedFile(filePath);
|
|
162
|
+
} catch (err) {
|
|
163
|
+
if (process.env.DEBUG) {
|
|
164
|
+
console.error(`[post-tool-use] File tracking: ${err.message}`);
|
|
200
165
|
}
|
|
201
166
|
}
|
|
202
|
-
|
|
203
|
-
// Run validation
|
|
204
|
-
const coreResult = await runValidation({
|
|
205
|
-
filePath,
|
|
206
|
-
timeout: 30000
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
// Transform to Claude Code format
|
|
210
|
-
const output = claudeCodeAdapter.transformResult('PostToolUse', coreResult);
|
|
211
|
-
|
|
212
|
-
// Output JSON
|
|
213
|
-
console.log(JSON.stringify(output));
|
|
214
|
-
process.exit(0);
|
|
215
|
-
} catch (err) {
|
|
216
|
-
// Non-blocking error — log with unified handler, allow through
|
|
217
|
-
logHookError('PostToolUse', err, { failMode: 'open', operation: 'post-tool-processing' });
|
|
218
|
-
console.log(JSON.stringify({ continue: true }));
|
|
219
|
-
process.exit(0);
|
|
220
167
|
}
|
|
221
|
-
}
|
|
222
168
|
|
|
223
|
-
//
|
|
224
|
-
|
|
225
|
-
|
|
169
|
+
// Run validation
|
|
170
|
+
return await runValidation({
|
|
171
|
+
filePath,
|
|
172
|
+
timeout: 30000
|
|
173
|
+
});
|
|
174
|
+
}, { failMode: 'warn' });
|