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.
Files changed (210) hide show
  1. package/.claude/commands/wogi-start.md +124 -0
  2. package/.claude/docs/claude-code-compatibility.md +51 -0
  3. package/.claude/docs/explore-agents.md +11 -0
  4. package/.claude/settings.json +12 -1
  5. package/.workflow/models/registry.json +1 -1
  6. package/bin/flow +11 -1
  7. package/lib/workspace-contracts.js +599 -0
  8. package/lib/workspace-intelligence.js +600 -0
  9. package/lib/workspace-messages.js +441 -0
  10. package/lib/workspace-routing.js +485 -0
  11. package/lib/workspace-sync.js +339 -0
  12. package/lib/workspace.js +1073 -0
  13. package/package.json +4 -4
  14. package/scripts/MEMORY-ARCHITECTURE.md +1 -1
  15. package/scripts/base-workflow-step.js +136 -0
  16. package/scripts/flow-adaptive-learning.js +8 -9
  17. package/scripts/flow-aggregate.js +11 -6
  18. package/scripts/flow-api-index.js +4 -6
  19. package/scripts/flow-assumption-detector.js +0 -2
  20. package/scripts/flow-audit.js +15 -2
  21. package/scripts/flow-auto-context.js +8 -12
  22. package/scripts/flow-auto-learn.js +49 -49
  23. package/scripts/flow-background.js +5 -6
  24. package/scripts/flow-bridge-state.js +8 -10
  25. package/scripts/flow-bulk-loop.js +1 -3
  26. package/scripts/flow-bulk-orchestrator.js +1 -3
  27. package/scripts/flow-cascade-completion.js +0 -2
  28. package/scripts/flow-cascade.js +4 -4
  29. package/scripts/flow-checkpoint.js +10 -13
  30. package/scripts/flow-code-intelligence.js +10 -12
  31. package/scripts/flow-community-sync.js +4 -4
  32. package/scripts/flow-community.js +12 -20
  33. package/scripts/flow-config-defaults.js +28 -2
  34. package/scripts/flow-config-interactive.js +9 -5
  35. package/scripts/flow-config-loader.js +49 -92
  36. package/scripts/flow-config-substitution.js +0 -2
  37. package/scripts/flow-context-estimator.js +4 -4
  38. package/scripts/flow-context-init.js +10 -12
  39. package/scripts/flow-context-manager.js +0 -2
  40. package/scripts/flow-context-scoring.js +2 -2
  41. package/scripts/flow-contract-scan.js +6 -9
  42. package/scripts/flow-correct.js +29 -27
  43. package/scripts/flow-correction-detector.js +5 -1
  44. package/scripts/flow-damage-control.js +47 -54
  45. package/scripts/flow-decisions-merge.js +4 -14
  46. package/scripts/flow-diff.js +5 -8
  47. package/scripts/flow-done-gates.js +786 -0
  48. package/scripts/flow-done-report.js +123 -0
  49. package/scripts/flow-done.js +71 -717
  50. package/scripts/flow-entropy-monitor.js +1 -3
  51. package/scripts/flow-eval-calibration.js +257 -0
  52. package/scripts/flow-eval-judge.js +10 -1
  53. package/scripts/flow-eval.js +14 -5
  54. package/scripts/flow-extraction-review.js +1 -0
  55. package/scripts/flow-failure-categories.js +0 -2
  56. package/scripts/flow-figma-confirm.js +5 -9
  57. package/scripts/flow-figma-generate.js +8 -10
  58. package/scripts/flow-figma-index.js +8 -10
  59. package/scripts/flow-figma-match.js +3 -5
  60. package/scripts/flow-figma-mcp-server.js +2 -4
  61. package/scripts/flow-figma-orchestrator.js +2 -3
  62. package/scripts/flow-figma-registry.js +2 -3
  63. package/scripts/flow-framework-resolver.js +0 -2
  64. package/scripts/flow-function-index.js +4 -6
  65. package/scripts/flow-gate-confidence.js +2 -2
  66. package/scripts/flow-gitignore.js +0 -2
  67. package/scripts/flow-guided-edit.js +5 -6
  68. package/scripts/flow-health.js +5 -6
  69. package/scripts/flow-hook-errors.js +6 -0
  70. package/scripts/flow-hook-status.js +263 -0
  71. package/scripts/flow-hooks.js +17 -29
  72. package/scripts/flow-http-client.js +9 -8
  73. package/scripts/flow-hybrid-interactive.js +7 -12
  74. package/scripts/flow-hybrid-test.js +12 -13
  75. package/scripts/flow-instruction-richness.js +1 -1
  76. package/scripts/flow-io.js +21 -4
  77. package/scripts/flow-knowledge-router.js +9 -3
  78. package/scripts/flow-learning-orchestrator.js +318 -13
  79. package/scripts/flow-links.js +5 -7
  80. package/scripts/flow-long-input-association.js +275 -0
  81. package/scripts/flow-long-input-chunking.js +1 -0
  82. package/scripts/flow-long-input-cli.js +0 -2
  83. package/scripts/flow-long-input-complexity.js +0 -2
  84. package/scripts/flow-long-input-constants.js +0 -2
  85. package/scripts/flow-long-input-contradictions.js +351 -0
  86. package/scripts/flow-long-input-detection.js +0 -2
  87. package/scripts/flow-long-input-passes.js +885 -0
  88. package/scripts/flow-long-input-stories.js +1 -1
  89. package/scripts/flow-long-input-voice.js +0 -2
  90. package/scripts/flow-long-input.js +425 -3005
  91. package/scripts/flow-loop-retry-learning.js +2 -3
  92. package/scripts/flow-lsp.js +3 -3
  93. package/scripts/flow-mcp-docs.js +3 -4
  94. package/scripts/flow-memory-db.js +6 -8
  95. package/scripts/flow-memory-sync.js +18 -11
  96. package/scripts/flow-metrics.js +1 -2
  97. package/scripts/flow-model-adapter.js +2 -3
  98. package/scripts/flow-model-config.js +72 -104
  99. package/scripts/flow-model-router.js +2 -2
  100. package/scripts/flow-model-types.js +0 -2
  101. package/scripts/flow-multi-approach.js +5 -6
  102. package/scripts/flow-orchestrate-context.js +3 -7
  103. package/scripts/flow-orchestrate-rollback.js +3 -8
  104. package/scripts/flow-orchestrate-state.js +8 -14
  105. package/scripts/flow-orchestrate-templates.js +2 -6
  106. package/scripts/flow-orchestrate-validator.js +5 -9
  107. package/scripts/flow-orchestrate.js +126 -103
  108. package/scripts/flow-output.js +0 -2
  109. package/scripts/flow-parallel.js +1 -1
  110. package/scripts/flow-paths.js +23 -2
  111. package/scripts/flow-pattern-enforcer.js +30 -28
  112. package/scripts/flow-pattern-extractor.js +3 -4
  113. package/scripts/flow-pending.js +0 -2
  114. package/scripts/flow-permissions.js +2 -3
  115. package/scripts/flow-plugin-registry.js +10 -12
  116. package/scripts/flow-prd-manager.js +1 -1
  117. package/scripts/flow-progress.js +7 -9
  118. package/scripts/flow-prompt-composer.js +3 -3
  119. package/scripts/flow-prompt-template.js +2 -2
  120. package/scripts/flow-providers.js +7 -4
  121. package/scripts/flow-registry-manager.js +7 -12
  122. package/scripts/flow-regression.js +9 -11
  123. package/scripts/flow-roadmap.js +2 -2
  124. package/scripts/flow-run-trace.js +16 -15
  125. package/scripts/flow-safety.js +2 -5
  126. package/scripts/flow-scanner-base.js +5 -7
  127. package/scripts/flow-scenario-engine.js +1 -5
  128. package/scripts/flow-security.js +29 -0
  129. package/scripts/flow-session-end.js +32 -41
  130. package/scripts/flow-session-learning.js +53 -49
  131. package/scripts/flow-setup-hooks.js +2 -3
  132. package/scripts/flow-skill-create.js +7 -12
  133. package/scripts/flow-skill-generator.js +12 -16
  134. package/scripts/flow-skill-learn.js +17 -8
  135. package/scripts/flow-skill-matcher.js +1 -2
  136. package/scripts/flow-spec-generator.js +2 -4
  137. package/scripts/flow-stack-wizard.js +5 -7
  138. package/scripts/flow-standards-learner.js +35 -16
  139. package/scripts/flow-start.js +2 -0
  140. package/scripts/flow-stats-collector.js +2 -2
  141. package/scripts/flow-status.js +10 -10
  142. package/scripts/flow-statusline-setup.js +2 -2
  143. package/scripts/flow-step-changelog.js +2 -3
  144. package/scripts/flow-step-comments.js +66 -81
  145. package/scripts/flow-step-complexity.js +50 -70
  146. package/scripts/flow-step-coverage.js +3 -5
  147. package/scripts/flow-step-knowledge.js +2 -3
  148. package/scripts/flow-step-pr-tests.js +64 -74
  149. package/scripts/flow-step-regression.js +3 -5
  150. package/scripts/flow-step-review.js +86 -103
  151. package/scripts/flow-step-security.js +111 -121
  152. package/scripts/flow-step-silent-failures.js +56 -83
  153. package/scripts/flow-step-simplifier.js +52 -70
  154. package/scripts/flow-story.js +4 -7
  155. package/scripts/flow-strict-adherence.js +3 -4
  156. package/scripts/flow-task-checkpoint.js +36 -5
  157. package/scripts/flow-task-enforcer.js +2 -24
  158. package/scripts/flow-tech-debt.js +1 -1
  159. package/scripts/flow-template-extractor.js +1 -0
  160. package/scripts/flow-templates.js +11 -13
  161. package/scripts/flow-test-api.js +9 -13
  162. package/scripts/flow-test-discovery.js +1 -1
  163. package/scripts/flow-test-generate.js +5 -9
  164. package/scripts/flow-test-integrity.js +3 -7
  165. package/scripts/flow-test-ui.js +5 -9
  166. package/scripts/flow-testing-deps.js +1 -3
  167. package/scripts/flow-tiered-learning.js +4 -4
  168. package/scripts/flow-todowrite-sync.js +1 -1
  169. package/scripts/flow-tokens.js +0 -2
  170. package/scripts/flow-verification-profile.js +6 -10
  171. package/scripts/flow-verify.js +12 -16
  172. package/scripts/flow-version-check.js +4 -12
  173. package/scripts/flow-webmcp-generator.js +3 -5
  174. package/scripts/flow-workflow-steps.js +0 -2
  175. package/scripts/flow-workflow.js +9 -11
  176. package/scripts/hooks/adapters/claude-code.js +31 -0
  177. package/scripts/hooks/core/config-change.js +1 -0
  178. package/scripts/hooks/core/extension-registry.js +0 -2
  179. package/scripts/hooks/core/instructions-loaded.js +1 -1
  180. package/scripts/hooks/core/observation-capture.js +5 -5
  181. package/scripts/hooks/core/phase-gate.js +5 -0
  182. package/scripts/hooks/core/post-compact.js +1 -12
  183. package/scripts/hooks/core/research-gate.js +2 -12
  184. package/scripts/hooks/core/routing-gate.js +6 -0
  185. package/scripts/hooks/core/task-completed.js +12 -0
  186. package/scripts/hooks/core/task-created.js +83 -0
  187. package/scripts/hooks/core/worktree-lifecycle.js +1 -1
  188. package/scripts/hooks/entry/claude-code/config-change.js +6 -29
  189. package/scripts/hooks/entry/claude-code/instructions-loaded.js +5 -30
  190. package/scripts/hooks/entry/claude-code/post-compact.js +4 -31
  191. package/scripts/hooks/entry/claude-code/post-tool-use.js +121 -172
  192. package/scripts/hooks/entry/claude-code/pre-tool-use.js +260 -361
  193. package/scripts/hooks/entry/claude-code/session-end.js +4 -28
  194. package/scripts/hooks/entry/claude-code/session-start.js +205 -243
  195. package/scripts/hooks/entry/claude-code/setup.js +8 -49
  196. package/scripts/hooks/entry/claude-code/stop.js +40 -72
  197. package/scripts/hooks/entry/claude-code/task-completed.js +4 -28
  198. package/scripts/hooks/entry/claude-code/task-created.js +15 -0
  199. package/scripts/hooks/entry/claude-code/user-prompt-submit.js +113 -195
  200. package/scripts/hooks/entry/claude-code/worktree-create.js +6 -25
  201. package/scripts/hooks/entry/claude-code/worktree-remove.js +6 -25
  202. package/scripts/hooks/entry/shared/hook-runner.js +99 -0
  203. package/scripts/hooks/entry/shared/read-stdin.js +0 -2
  204. package/scripts/postinstall.js +2 -0
  205. package/scripts/registries/api-registry.js +0 -2
  206. package/scripts/registries/component-registry.js +5 -9
  207. package/scripts/registries/contract-scanner.js +2 -9
  208. package/scripts/registries/function-registry.js +0 -2
  209. package/scripts/registries/schema-registry.js +14 -18
  210. 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 { claudeCodeAdapter } = require('../../adapters/claude-code');
15
- const { readHookInput } = require('../shared/read-stdin');
14
+ const { runHook } = require('../shared/hook-runner');
16
15
 
17
- process.stdin.setEncoding('utf8');
18
-
19
- async function main() {
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 { readHookInput } = require('../shared/read-stdin');
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 function main() {
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
- // Read input from stdin
35
- const { input: rawInput } = await readHookInput();
36
- if (!rawInput) {
37
- console.log(JSON.stringify({ continue: true }));
38
- process.exit(0);
39
- return;
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
- const parsedInput = claudeCodeAdapter.parseInput(rawInput);
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
- const toolName = parsedInput.toolName;
45
- const toolInput = parsedInput.toolInput || {};
46
- const toolResponse = parsedInput.toolResponse;
47
- const filePath = toolInput.file_path;
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
- // CAPTURE OBSERVATION FOR ALL TOOLS (non-blocking)
50
- // This runs before validation so we capture even if validation fails
51
- // Detect tool failure for rejected-approach tagging
52
- const toolFailed = !!(
53
- toolResponse?.error ||
54
- toolResponse?.isError ||
55
- (typeof toolResponse === 'string' && toolResponse.toLowerCase().startsWith('error:'))
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
- try {
59
- await captureObservation({
60
- sessionId: parsedInput.sessionId,
61
- toolName,
62
- toolInput,
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(`[observation-capture] ${err.message}`);
120
+ console.error(`[post-tool-use] Durable session bridge: ${err.message}`);
72
121
  }
73
122
  }
123
+ }
74
124
 
75
- // v6.0: Detect task entering inProgress via ready.json edit
76
- // The /wogi-start skill (prompt-level) edits ready.json manually but never
77
- // calls flow-start.js, so durable session, session state, and memory blocks
78
- // are never initialized. This bridge detects the edit and initializes them.
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 fs = require('node:fs');
82
- const { safeJsonParse } = require('../../../flow-utils');
83
- const readyData = safeJsonParse(filePath, null);
84
- if (readyData && Array.isArray(readyData.inProgress) && readyData.inProgress.length > 0) {
85
- const task = readyData.inProgress[0];
86
- const taskId = task && task.id;
87
- if (!taskId) throw new Error('inProgress entry missing id');
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] Durable session bridge: ${err.message}`);
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
- // Only run validation for Edit/Write
175
- if (toolName !== 'Edit' && toolName !== 'Write') {
176
- console.log(JSON.stringify({ continue: true }));
177
- process.exit(0);
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
- // Skip if tool failed
182
- if (toolResponse && toolResponse.error) {
183
- console.log(JSON.stringify({ continue: true }));
184
- process.exit(0);
185
- return;
186
- }
152
+ // Skip if tool failed
153
+ if (toolResponse && toolResponse.error) {
154
+ return { __raw: true, continue: true };
155
+ }
187
156
 
188
- // v7.0: Track changed files in task checkpoint (continuous state persistence)
189
- // This ensures the PostCompact hook can restore the changed files list
190
- // after auto-compaction, making /wogi-pre-compact redundant for file tracking.
191
- if (filePath && !filePath.includes('.workflow/') && !filePath.includes('.claude/')) {
192
- try {
193
- const { trackChangedFile } = require('../../../flow-task-checkpoint');
194
- trackChangedFile(filePath);
195
- } catch (err) {
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
- // Handle stdin properly
224
- process.stdin.setEncoding('utf8');
225
- main();
169
+ // Run validation
170
+ return await runValidation({
171
+ filePath,
172
+ timeout: 30000
173
+ });
174
+ }, { failMode: 'warn' });