wogiflow 1.0.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/.workflow/agents/reviewer.md +81 -0
- package/.workflow/agents/security.md +94 -0
- package/.workflow/agents/story-writer.md +58 -0
- package/.workflow/bridges/base-bridge.js +395 -0
- package/.workflow/bridges/claude-bridge.js +434 -0
- package/.workflow/bridges/index.js +130 -0
- package/.workflow/lib/assumption-detector.js +481 -0
- package/.workflow/lib/config-substitution.js +371 -0
- package/.workflow/lib/failure-categories.js +478 -0
- package/.workflow/state/app-map.md.template +15 -0
- package/.workflow/state/architecture.md.template +24 -0
- package/.workflow/state/component-index.json.template +5 -0
- package/.workflow/state/decisions.md.template +15 -0
- package/.workflow/state/feedback-patterns.md.template +9 -0
- package/.workflow/state/knowledge-sync.json.template +6 -0
- package/.workflow/state/progress.md.template +14 -0
- package/.workflow/state/ready.json.template +7 -0
- package/.workflow/state/request-log.md.template +14 -0
- package/.workflow/state/session-state.json.template +11 -0
- package/.workflow/state/stack.md.template +33 -0
- package/.workflow/state/testing.md.template +36 -0
- package/.workflow/templates/claude-md.hbs +257 -0
- package/.workflow/templates/correction-report.md +67 -0
- package/.workflow/templates/gemini-md.hbs +52 -0
- package/README.md +1802 -0
- package/bin/flow +205 -0
- package/lib/index.js +33 -0
- package/lib/installer.js +467 -0
- package/lib/release-channel.js +269 -0
- package/lib/skill-registry.js +526 -0
- package/lib/upgrader.js +401 -0
- package/lib/utils.js +305 -0
- package/package.json +64 -0
- package/scripts/flow +985 -0
- package/scripts/flow-adaptive-learning.js +1259 -0
- package/scripts/flow-aggregate.js +488 -0
- package/scripts/flow-archive +133 -0
- package/scripts/flow-auto-context.js +1015 -0
- package/scripts/flow-auto-learn.js +615 -0
- package/scripts/flow-bridge.js +223 -0
- package/scripts/flow-browser-suggest.js +316 -0
- package/scripts/flow-bug.js +247 -0
- package/scripts/flow-cascade.js +711 -0
- package/scripts/flow-changelog +85 -0
- package/scripts/flow-checkpoint.js +483 -0
- package/scripts/flow-cli.js +403 -0
- package/scripts/flow-code-intelligence.js +760 -0
- package/scripts/flow-complexity.js +502 -0
- package/scripts/flow-config-set.js +152 -0
- package/scripts/flow-constants.js +157 -0
- package/scripts/flow-context +152 -0
- package/scripts/flow-context-init.js +482 -0
- package/scripts/flow-context-monitor.js +384 -0
- package/scripts/flow-context-scoring.js +886 -0
- package/scripts/flow-correct.js +458 -0
- package/scripts/flow-damage-control.js +985 -0
- package/scripts/flow-deps +101 -0
- package/scripts/flow-diff.js +700 -0
- package/scripts/flow-done +151 -0
- package/scripts/flow-done.js +489 -0
- package/scripts/flow-durable-session.js +1541 -0
- package/scripts/flow-entropy-monitor.js +345 -0
- package/scripts/flow-export-profile +349 -0
- package/scripts/flow-export-scanner.js +1046 -0
- package/scripts/flow-figma-confirm.js +400 -0
- package/scripts/flow-figma-extract.js +496 -0
- package/scripts/flow-figma-generate.js +683 -0
- package/scripts/flow-figma-index.js +909 -0
- package/scripts/flow-figma-match.js +617 -0
- package/scripts/flow-figma-mcp-server.js +518 -0
- package/scripts/flow-figma-pipeline.js +414 -0
- package/scripts/flow-file-ops.js +301 -0
- package/scripts/flow-gate-confidence.js +825 -0
- package/scripts/flow-guided-edit.js +659 -0
- package/scripts/flow-health +185 -0
- package/scripts/flow-health.js +413 -0
- package/scripts/flow-hooks.js +556 -0
- package/scripts/flow-http-client.js +249 -0
- package/scripts/flow-hybrid-detect.js +167 -0
- package/scripts/flow-hybrid-interactive.js +591 -0
- package/scripts/flow-hybrid-test.js +152 -0
- package/scripts/flow-import-profile +439 -0
- package/scripts/flow-init +253 -0
- package/scripts/flow-instruction-richness.js +827 -0
- package/scripts/flow-jira-integration.js +579 -0
- package/scripts/flow-knowledge-router.js +522 -0
- package/scripts/flow-knowledge-sync.js +589 -0
- package/scripts/flow-linear-integration.js +631 -0
- package/scripts/flow-links.js +774 -0
- package/scripts/flow-log-manager.js +559 -0
- package/scripts/flow-loop-enforcer.js +1246 -0
- package/scripts/flow-loop-retry-learning.js +630 -0
- package/scripts/flow-lsp.js +923 -0
- package/scripts/flow-map-index +348 -0
- package/scripts/flow-map-sync +201 -0
- package/scripts/flow-memory-blocks.js +668 -0
- package/scripts/flow-memory-compactor.js +350 -0
- package/scripts/flow-memory-db.js +1110 -0
- package/scripts/flow-memory-sync.js +484 -0
- package/scripts/flow-metrics.js +353 -0
- package/scripts/flow-migrate-ids.js +370 -0
- package/scripts/flow-model-adapter.js +802 -0
- package/scripts/flow-model-router.js +884 -0
- package/scripts/flow-models.js +1231 -0
- package/scripts/flow-morning.js +517 -0
- package/scripts/flow-multi-approach.js +660 -0
- package/scripts/flow-new-feature +86 -0
- package/scripts/flow-onboard +1042 -0
- package/scripts/flow-orchestrate-llm.js +459 -0
- package/scripts/flow-orchestrate.js +3592 -0
- package/scripts/flow-output.js +123 -0
- package/scripts/flow-parallel-detector.js +399 -0
- package/scripts/flow-parallel-dispatch.js +987 -0
- package/scripts/flow-parallel.js +428 -0
- package/scripts/flow-pattern-enforcer.js +600 -0
- package/scripts/flow-prd-manager.js +282 -0
- package/scripts/flow-progress.js +323 -0
- package/scripts/flow-project-analyzer.js +975 -0
- package/scripts/flow-prompt-composer.js +487 -0
- package/scripts/flow-providers.js +1381 -0
- package/scripts/flow-queue.js +308 -0
- package/scripts/flow-ready +82 -0
- package/scripts/flow-ready.js +189 -0
- package/scripts/flow-regression.js +396 -0
- package/scripts/flow-response-parser.js +450 -0
- package/scripts/flow-resume.js +284 -0
- package/scripts/flow-rules-sync.js +439 -0
- package/scripts/flow-run-trace.js +718 -0
- package/scripts/flow-safety.js +587 -0
- package/scripts/flow-search +104 -0
- package/scripts/flow-security.js +481 -0
- package/scripts/flow-session-end +106 -0
- package/scripts/flow-session-end.js +437 -0
- package/scripts/flow-session-state.js +671 -0
- package/scripts/flow-setup-hooks +216 -0
- package/scripts/flow-setup-hooks.js +377 -0
- package/scripts/flow-skill-create.js +329 -0
- package/scripts/flow-skill-creator.js +572 -0
- package/scripts/flow-skill-generator.js +1046 -0
- package/scripts/flow-skill-learn.js +880 -0
- package/scripts/flow-skill-matcher.js +578 -0
- package/scripts/flow-spec-generator.js +820 -0
- package/scripts/flow-stack-wizard.js +895 -0
- package/scripts/flow-standup +162 -0
- package/scripts/flow-start +74 -0
- package/scripts/flow-start.js +235 -0
- package/scripts/flow-status +110 -0
- package/scripts/flow-status.js +301 -0
- package/scripts/flow-step-browser.js +83 -0
- package/scripts/flow-step-changelog.js +217 -0
- package/scripts/flow-step-comments.js +306 -0
- package/scripts/flow-step-complexity.js +234 -0
- package/scripts/flow-step-coverage.js +218 -0
- package/scripts/flow-step-knowledge.js +193 -0
- package/scripts/flow-step-pr-tests.js +364 -0
- package/scripts/flow-step-regression.js +89 -0
- package/scripts/flow-step-review.js +516 -0
- package/scripts/flow-step-security.js +162 -0
- package/scripts/flow-step-silent-failures.js +290 -0
- package/scripts/flow-step-simplifier.js +346 -0
- package/scripts/flow-story +105 -0
- package/scripts/flow-story.js +500 -0
- package/scripts/flow-suspend.js +252 -0
- package/scripts/flow-sync-daemon.js +654 -0
- package/scripts/flow-task-analyzer.js +606 -0
- package/scripts/flow-team-dashboard.js +748 -0
- package/scripts/flow-team-sync.js +752 -0
- package/scripts/flow-team.js +977 -0
- package/scripts/flow-tech-options.js +528 -0
- package/scripts/flow-templates.js +812 -0
- package/scripts/flow-tiered-learning.js +728 -0
- package/scripts/flow-trace +204 -0
- package/scripts/flow-transcript-chunking.js +1106 -0
- package/scripts/flow-transcript-digest.js +7918 -0
- package/scripts/flow-transcript-language.js +465 -0
- package/scripts/flow-transcript-parsing.js +1085 -0
- package/scripts/flow-transcript-stories.js +2194 -0
- package/scripts/flow-update-map +224 -0
- package/scripts/flow-utils.js +2242 -0
- package/scripts/flow-verification.js +644 -0
- package/scripts/flow-verify.js +1177 -0
- package/scripts/flow-voice-input.js +638 -0
- package/scripts/flow-watch +168 -0
- package/scripts/flow-workflow-steps.js +521 -0
- package/scripts/flow-workflow.js +1029 -0
- package/scripts/flow-worktree.js +489 -0
- package/scripts/hooks/adapters/base-adapter.js +102 -0
- package/scripts/hooks/adapters/claude-code.js +359 -0
- package/scripts/hooks/adapters/index.js +79 -0
- package/scripts/hooks/core/component-check.js +341 -0
- package/scripts/hooks/core/index.js +35 -0
- package/scripts/hooks/core/loop-check.js +241 -0
- package/scripts/hooks/core/session-context.js +294 -0
- package/scripts/hooks/core/task-gate.js +177 -0
- package/scripts/hooks/core/validation.js +230 -0
- package/scripts/hooks/entry/claude-code/post-tool-use.js +65 -0
- package/scripts/hooks/entry/claude-code/pre-tool-use.js +89 -0
- package/scripts/hooks/entry/claude-code/session-end.js +87 -0
- package/scripts/hooks/entry/claude-code/session-start.js +46 -0
- package/scripts/hooks/entry/claude-code/stop.js +43 -0
- package/scripts/postinstall.js +139 -0
- package/templates/browser-test-flow.json +56 -0
- package/templates/bug-report.md +43 -0
- package/templates/component-detail.md +42 -0
- package/templates/component.stories.tsx +49 -0
- package/templates/context/constraints.md +83 -0
- package/templates/context/conventions.md +177 -0
- package/templates/context/stack.md +60 -0
- package/templates/correction-report.md +90 -0
- package/templates/feature-proposal.md +35 -0
- package/templates/hybrid/_base.md +254 -0
- package/templates/hybrid/_patterns.md +45 -0
- package/templates/hybrid/create-component.md +127 -0
- package/templates/hybrid/create-file.md +56 -0
- package/templates/hybrid/create-hook.md +145 -0
- package/templates/hybrid/create-service.md +70 -0
- package/templates/hybrid/fix-bug.md +33 -0
- package/templates/hybrid/modify-file.md +55 -0
- package/templates/story.md +68 -0
- package/templates/task.json +56 -0
- package/templates/trace.md +69 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Wogi Flow - Claude Code Adapter
|
|
5
|
+
*
|
|
6
|
+
* Transforms core hook results to Claude Code's hook format.
|
|
7
|
+
* Handles SessionStart, PreToolUse, PostToolUse, Stop, SessionEnd.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const { BaseAdapter } = require('./base-adapter');
|
|
13
|
+
|
|
14
|
+
// Import from parent scripts directory
|
|
15
|
+
const { PATHS } = require('../../flow-utils');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Claude Code Hook Events
|
|
19
|
+
*/
|
|
20
|
+
const CLAUDE_CODE_EVENTS = [
|
|
21
|
+
'SessionStart',
|
|
22
|
+
'PreToolUse',
|
|
23
|
+
'PostToolUse',
|
|
24
|
+
'Stop',
|
|
25
|
+
'SubagentStop',
|
|
26
|
+
'SessionEnd',
|
|
27
|
+
'Notification',
|
|
28
|
+
'UserPromptSubmit'
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Claude Code Adapter
|
|
33
|
+
*/
|
|
34
|
+
class ClaudeCodeAdapter extends BaseAdapter {
|
|
35
|
+
constructor() {
|
|
36
|
+
super('claude-code');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Get Claude Code's settings path
|
|
41
|
+
*/
|
|
42
|
+
getConfigPath() {
|
|
43
|
+
return path.join(PATHS.claude, 'settings.json');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Get local settings path (not committed)
|
|
48
|
+
*/
|
|
49
|
+
getLocalConfigPath() {
|
|
50
|
+
return path.join(PATHS.claude, 'settings.local.json');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get supported events
|
|
55
|
+
*/
|
|
56
|
+
getSupportedEvents() {
|
|
57
|
+
return CLAUDE_CODE_EVENTS;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Check if Claude Code is likely available
|
|
62
|
+
*/
|
|
63
|
+
isAvailable() {
|
|
64
|
+
// Check if .claude directory exists
|
|
65
|
+
return fs.existsSync(PATHS.claude);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Parse Claude Code hook input
|
|
70
|
+
*/
|
|
71
|
+
parseInput(input) {
|
|
72
|
+
return {
|
|
73
|
+
sessionId: input.session_id,
|
|
74
|
+
transcriptPath: input.transcript_path,
|
|
75
|
+
cwd: input.cwd,
|
|
76
|
+
permissionMode: input.permission_mode,
|
|
77
|
+
hookEvent: input.hook_event_name,
|
|
78
|
+
toolName: input.tool_name,
|
|
79
|
+
toolInput: input.tool_input,
|
|
80
|
+
toolUseId: input.tool_use_id,
|
|
81
|
+
toolResponse: input.tool_response,
|
|
82
|
+
prompt: input.prompt,
|
|
83
|
+
source: input.source,
|
|
84
|
+
reason: input.reason
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Transform core result to Claude Code format
|
|
90
|
+
*/
|
|
91
|
+
transformResult(event, coreResult) {
|
|
92
|
+
switch (event) {
|
|
93
|
+
case 'SessionStart':
|
|
94
|
+
return this.transformSessionStart(coreResult);
|
|
95
|
+
case 'PreToolUse':
|
|
96
|
+
return this.transformPreToolUse(coreResult);
|
|
97
|
+
case 'PostToolUse':
|
|
98
|
+
return this.transformPostToolUse(coreResult);
|
|
99
|
+
case 'Stop':
|
|
100
|
+
case 'SubagentStop':
|
|
101
|
+
return this.transformStop(coreResult);
|
|
102
|
+
case 'SessionEnd':
|
|
103
|
+
return this.transformSessionEnd(coreResult);
|
|
104
|
+
default:
|
|
105
|
+
return { continue: true };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Transform SessionStart result
|
|
111
|
+
*/
|
|
112
|
+
transformSessionStart(coreResult) {
|
|
113
|
+
if (!coreResult.enabled || !coreResult.context) {
|
|
114
|
+
return { continue: true };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Format context for injection
|
|
118
|
+
const { formatContextForInjection } = require('../core/session-context');
|
|
119
|
+
const contextText = formatContextForInjection(coreResult);
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
continue: true,
|
|
123
|
+
hookSpecificOutput: {
|
|
124
|
+
hookEventName: 'SessionStart',
|
|
125
|
+
additionalContext: contextText
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Transform PreToolUse result (task gating, component check)
|
|
132
|
+
*/
|
|
133
|
+
transformPreToolUse(coreResult) {
|
|
134
|
+
// Blocked - deny permission
|
|
135
|
+
if (coreResult.blocked) {
|
|
136
|
+
return {
|
|
137
|
+
continue: true,
|
|
138
|
+
hookSpecificOutput: {
|
|
139
|
+
hookEventName: 'PreToolUse',
|
|
140
|
+
permissionDecision: 'deny',
|
|
141
|
+
permissionDecisionReason: coreResult.message || 'Action blocked by Wogi Flow'
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Warning - allow but show message
|
|
147
|
+
if (coreResult.warning && coreResult.message) {
|
|
148
|
+
return {
|
|
149
|
+
continue: true,
|
|
150
|
+
systemMessage: coreResult.message,
|
|
151
|
+
hookSpecificOutput: {
|
|
152
|
+
hookEventName: 'PreToolUse',
|
|
153
|
+
permissionDecision: 'allow'
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Allowed
|
|
159
|
+
return {
|
|
160
|
+
continue: true,
|
|
161
|
+
hookSpecificOutput: {
|
|
162
|
+
hookEventName: 'PreToolUse',
|
|
163
|
+
permissionDecision: 'allow'
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Transform PostToolUse result (validation)
|
|
170
|
+
*/
|
|
171
|
+
transformPostToolUse(coreResult) {
|
|
172
|
+
// If validation was skipped or passed
|
|
173
|
+
if (coreResult.skipped || coreResult.passed) {
|
|
174
|
+
const message = coreResult.summary || (coreResult.passed ? 'Validation passed' : null);
|
|
175
|
+
return {
|
|
176
|
+
continue: true,
|
|
177
|
+
...(message && { systemMessage: message })
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Validation failed
|
|
182
|
+
return {
|
|
183
|
+
continue: true,
|
|
184
|
+
systemMessage: coreResult.summary || 'Validation failed',
|
|
185
|
+
hookSpecificOutput: {
|
|
186
|
+
hookEventName: 'PostToolUse',
|
|
187
|
+
decision: coreResult.blocked ? 'block' : undefined,
|
|
188
|
+
reason: coreResult.message
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Transform Stop result (loop enforcement + task queue continuation)
|
|
195
|
+
*/
|
|
196
|
+
transformStop(coreResult) {
|
|
197
|
+
// Can exit
|
|
198
|
+
if (coreResult.canExit) {
|
|
199
|
+
return {
|
|
200
|
+
continue: false, // Allow stop
|
|
201
|
+
...(coreResult.message && { systemMessage: coreResult.message })
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Continue to next task in queue (not blocked, just continue)
|
|
206
|
+
if (coreResult.continueToNext) {
|
|
207
|
+
const nextTaskMsg = `
|
|
208
|
+
✓ Task complete!
|
|
209
|
+
|
|
210
|
+
**Continuing to next task in queue:** ${coreResult.nextTaskId}
|
|
211
|
+
(${coreResult.remaining} task(s) remaining)
|
|
212
|
+
|
|
213
|
+
Run: /wogi-start ${coreResult.nextTaskId}`;
|
|
214
|
+
|
|
215
|
+
return {
|
|
216
|
+
continue: true, // Force continue to next task
|
|
217
|
+
systemMessage: nextTaskMsg,
|
|
218
|
+
hookSpecificOutput: {
|
|
219
|
+
hookEventName: 'Stop',
|
|
220
|
+
decision: 'continue_queue',
|
|
221
|
+
nextTaskId: coreResult.nextTaskId,
|
|
222
|
+
remaining: coreResult.remaining
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Prompt before continuing to next task (pauseBetweenTasks: true)
|
|
228
|
+
if (coreResult.shouldPrompt) {
|
|
229
|
+
return {
|
|
230
|
+
continue: true,
|
|
231
|
+
systemMessage: coreResult.message,
|
|
232
|
+
hookSpecificOutput: {
|
|
233
|
+
hookEventName: 'Stop',
|
|
234
|
+
decision: 'prompt_continue',
|
|
235
|
+
nextTaskId: coreResult.nextTaskId
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Block exit - criteria not complete
|
|
241
|
+
return {
|
|
242
|
+
continue: true, // Force continue
|
|
243
|
+
stopReason: coreResult.message || 'Acceptance criteria not complete',
|
|
244
|
+
hookSpecificOutput: {
|
|
245
|
+
hookEventName: 'Stop',
|
|
246
|
+
decision: 'block',
|
|
247
|
+
reason: coreResult.message
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Transform SessionEnd result (auto-logging)
|
|
254
|
+
*/
|
|
255
|
+
transformSessionEnd(coreResult) {
|
|
256
|
+
// SessionEnd doesn't block, just provides info
|
|
257
|
+
return {
|
|
258
|
+
continue: true,
|
|
259
|
+
...(coreResult.warning && { systemMessage: coreResult.warning }),
|
|
260
|
+
...(coreResult.logged && { systemMessage: `Logged as ${coreResult.requestId}` })
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Generate Claude Code hook configuration
|
|
266
|
+
*/
|
|
267
|
+
generateConfig(rules, projectRoot) {
|
|
268
|
+
const scriptsDir = path.join(projectRoot, 'scripts', 'hooks', 'entry', 'claude-code');
|
|
269
|
+
const hooks = {};
|
|
270
|
+
|
|
271
|
+
// SessionStart hook
|
|
272
|
+
if (rules.sessionContext?.enabled !== false) {
|
|
273
|
+
hooks.SessionStart = [{
|
|
274
|
+
hooks: [{
|
|
275
|
+
type: 'command',
|
|
276
|
+
command: `node "${path.join(scriptsDir, 'session-start.js')}"`,
|
|
277
|
+
timeout: 10
|
|
278
|
+
}]
|
|
279
|
+
}];
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// PreToolUse hooks for Edit/Write
|
|
283
|
+
const preToolUseMatchers = [];
|
|
284
|
+
|
|
285
|
+
if (rules.taskGating?.enabled !== false) {
|
|
286
|
+
preToolUseMatchers.push({
|
|
287
|
+
matcher: 'Edit|Write',
|
|
288
|
+
hooks: [{
|
|
289
|
+
type: 'command',
|
|
290
|
+
command: `node "${path.join(scriptsDir, 'pre-tool-use.js')}"`,
|
|
291
|
+
timeout: 5
|
|
292
|
+
}]
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (preToolUseMatchers.length > 0) {
|
|
297
|
+
hooks.PreToolUse = preToolUseMatchers;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// PostToolUse hooks for validation
|
|
301
|
+
if (rules.validation?.enabled !== false) {
|
|
302
|
+
hooks.PostToolUse = [{
|
|
303
|
+
matcher: 'Edit|Write',
|
|
304
|
+
hooks: [{
|
|
305
|
+
type: 'command',
|
|
306
|
+
command: `node "${path.join(scriptsDir, 'post-tool-use.js')}"`,
|
|
307
|
+
timeout: 60
|
|
308
|
+
}]
|
|
309
|
+
}];
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// Stop hook for loop enforcement
|
|
313
|
+
if (rules.loopEnforcement?.enabled !== false) {
|
|
314
|
+
hooks.Stop = [{
|
|
315
|
+
hooks: [{
|
|
316
|
+
type: 'command',
|
|
317
|
+
command: `node "${path.join(scriptsDir, 'stop.js')}"`,
|
|
318
|
+
timeout: 5
|
|
319
|
+
}]
|
|
320
|
+
}];
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// SessionEnd hook for auto-logging
|
|
324
|
+
if (rules.autoLogging?.enabled !== false) {
|
|
325
|
+
hooks.SessionEnd = [{
|
|
326
|
+
hooks: [{
|
|
327
|
+
type: 'command',
|
|
328
|
+
command: `node "${path.join(scriptsDir, 'session-end.js')}"`,
|
|
329
|
+
timeout: 10
|
|
330
|
+
}]
|
|
331
|
+
}];
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
return { hooks };
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/**
|
|
338
|
+
* Get install instructions
|
|
339
|
+
*/
|
|
340
|
+
getInstallInstructions() {
|
|
341
|
+
return `Claude Code hooks will be installed to ${this.getLocalConfigPath()}
|
|
342
|
+
|
|
343
|
+
To use:
|
|
344
|
+
1. Run: ./scripts/flow hooks setup
|
|
345
|
+
2. Hooks are automatically loaded by Claude Code
|
|
346
|
+
|
|
347
|
+
To remove:
|
|
348
|
+
- Run: ./scripts/flow hooks remove`;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Export singleton instance
|
|
353
|
+
const claudeCodeAdapter = new ClaudeCodeAdapter();
|
|
354
|
+
|
|
355
|
+
module.exports = {
|
|
356
|
+
ClaudeCodeAdapter,
|
|
357
|
+
claudeCodeAdapter,
|
|
358
|
+
CLAUDE_CODE_EVENTS
|
|
359
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Wogi Flow - Adapters Index
|
|
5
|
+
*
|
|
6
|
+
* Registry of all CLI adapters.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const { BaseAdapter, CoreResultSchema } = require('./base-adapter');
|
|
10
|
+
const { ClaudeCodeAdapter, claudeCodeAdapter, CLAUDE_CODE_EVENTS } = require('./claude-code');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Adapter registry
|
|
14
|
+
*/
|
|
15
|
+
const adapters = {
|
|
16
|
+
'claude-code': claudeCodeAdapter
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Get adapter by name
|
|
21
|
+
* @param {string} name - Adapter name
|
|
22
|
+
* @returns {BaseAdapter|null}
|
|
23
|
+
*/
|
|
24
|
+
function getAdapter(name) {
|
|
25
|
+
return adapters[name] || null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Get all available adapters
|
|
30
|
+
* @returns {Object} Map of adapter name to instance
|
|
31
|
+
*/
|
|
32
|
+
function getAllAdapters() {
|
|
33
|
+
return { ...adapters };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Get adapters that are available (CLI installed)
|
|
38
|
+
* @returns {Object} Map of available adapters
|
|
39
|
+
*/
|
|
40
|
+
function getAvailableAdapters() {
|
|
41
|
+
const available = {};
|
|
42
|
+
for (const [name, adapter] of Object.entries(adapters)) {
|
|
43
|
+
if (adapter.isAvailable()) {
|
|
44
|
+
available[name] = adapter;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return available;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Register a new adapter
|
|
52
|
+
* @param {string} name - Adapter name
|
|
53
|
+
* @param {BaseAdapter} adapter - Adapter instance
|
|
54
|
+
*/
|
|
55
|
+
function registerAdapter(name, adapter) {
|
|
56
|
+
if (!(adapter instanceof BaseAdapter)) {
|
|
57
|
+
throw new Error('Adapter must extend BaseAdapter');
|
|
58
|
+
}
|
|
59
|
+
adapters[name] = adapter;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
module.exports = {
|
|
63
|
+
// Classes
|
|
64
|
+
BaseAdapter,
|
|
65
|
+
ClaudeCodeAdapter,
|
|
66
|
+
CoreResultSchema,
|
|
67
|
+
|
|
68
|
+
// Instances
|
|
69
|
+
claudeCodeAdapter,
|
|
70
|
+
|
|
71
|
+
// Constants
|
|
72
|
+
CLAUDE_CODE_EVENTS,
|
|
73
|
+
|
|
74
|
+
// Functions
|
|
75
|
+
getAdapter,
|
|
76
|
+
getAllAdapters,
|
|
77
|
+
getAvailableAdapters,
|
|
78
|
+
registerAdapter
|
|
79
|
+
};
|