Skip to content

Commit 2f47c49

Browse files
feat: migrate CLEO hooks to CAAMP 1.9.1 canonical 16-event taxonomy (T160)
Hook system migrated from 8 internal `on`-prefix events to CAAMP's 16-event canonical taxonomy (SessionStart, PreToolUse, PostToolUse, SubagentStart, PreCompact, Notification, ConfigChange, etc.). Types (hooks/types.ts): - ProviderHookEvent now aliases CAAMP CanonicalHookEvent - New payload types: SubagentStartPayload, SubagentStopPayload, PreCompactPayload, PostCompactPayload, NotificationPayload, ConfigChangePayload, PermissionRequestPayload - CAAMP normalizer APIs re-exported: toNative, toCanonical, supportsHook, buildHookMatrix, HOOK_CATEGORIES - CLEO_TO_CAAMP_HOOK_MAP updated to canonical names Registry (hooks/registry.ts): - LEGACY_EVENT_MAP for backward compat (onSessionStart → SessionStart) - Deprecation warnings on legacy event names - DEFAULT_HOOK_CONFIG covers all 21 events (16 canonical + 5 internal) Handlers: all 6 handler files register on canonical names Dispatch sites: sessions, task-work, store/json, cli.ts, mcp/index.ts Adapters: claude-code + opencode use CAAMP toNative/toCanonical Schemas: payload-schemas.ts keyed on canonical names with new schemas 4912 tests pass, 0 failures. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 7c959ab commit 2f47c49

25 files changed

Lines changed: 523 additions & 692 deletions

File tree

.claude/scheduled_tasks.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"sessionId":"103a7009-066d-4634-8d38-3543bdfe7e18","pid":1027949,"acquiredAt":1774333332431}

.cleo/brain.db

24 KB
Binary file not shown.

.cleo/logs/cleo.2026-03-18.1.log

Lines changed: 0 additions & 490 deletions
This file was deleted.

.cleo/tasks.db

84 KB
Binary file not shown.

AGENTS.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<!-- CAAMP:START -->
2-
@~/.agents/AGENTS.md
3-
@.cleo/project-context.json
4-
@.cleo/memory-bridge.md
2+
@AGENTS.md
53
<!-- CAAMP:END -->
64

75
# CLEO Agent Code Quality Rules (MANDATORY)

packages/adapters/src/providers/claude-code/adapter.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,11 @@ export class ClaudeCodeAdapter implements CLEOProviderAdapter {
4343
capabilities: AdapterCapabilities = {
4444
supportsHooks: true,
4545
supportedHookEvents: [
46-
'onSessionStart',
47-
'onSessionEnd',
48-
'onToolStart',
49-
'onToolComplete',
50-
'onError',
46+
'SessionStart',
47+
'SessionEnd',
48+
'PreToolUse',
49+
'PostToolUse',
50+
'PostToolUseFailure',
5151
],
5252
supportsSpawn: true,
5353
supportsInstall: true,

packages/adapters/src/providers/claude-code/hooks.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
/**
22
* Claude Code Hook Provider
33
*
4-
* Maps Claude Code's native hook events to CAAMP hook events.
4+
* Maps Claude Code's native hook events to CAAMP canonical hook events.
55
* Claude Code uses: SessionStart, PostToolUse, UserPromptSubmit, Stop
6-
* CAAMP defines: onSessionStart, onToolComplete, onPromptSubmit, onSessionEnd
6+
* CAAMP canonical: SessionStart, PostToolUse, PromptSubmit, SessionEnd
77
*
88
* @task T5240
99
* @task T144
@@ -15,13 +15,18 @@ import { join } from 'node:path';
1515
import type { AdapterHookProvider } from '@cleocode/contracts';
1616

1717
/**
18-
* Mapping from Claude Code native event names to CAAMP event names.
18+
* Mapping from Claude Code native event names to CAAMP canonical event names.
1919
*/
2020
const CLAUDE_CODE_EVENT_MAP: Record<string, string> = {
21-
SessionStart: 'onSessionStart',
22-
PostToolUse: 'onToolComplete',
23-
UserPromptSubmit: 'onPromptSubmit',
24-
Stop: 'onSessionEnd',
21+
SessionStart: 'SessionStart',
22+
PostToolUse: 'PostToolUse',
23+
UserPromptSubmit: 'PromptSubmit',
24+
Stop: 'SessionEnd',
25+
PreToolUse: 'PreToolUse',
26+
PostToolUseFailure: 'PostToolUseFailure',
27+
Notification: 'Notification',
28+
SubagentStart: 'SubagentStart',
29+
SubagentStop: 'SubagentStop',
2530
};
2631

2732
/**

packages/adapters/src/providers/opencode/adapter.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ export class OpenCodeAdapter implements CLEOProviderAdapter {
3838
capabilities: AdapterCapabilities = {
3939
supportsHooks: true,
4040
supportedHookEvents: [
41-
'onSessionStart',
42-
'onSessionEnd',
43-
'onToolStart',
44-
'onToolComplete',
45-
'onError',
46-
'onPromptSubmit',
41+
'SessionStart',
42+
'SessionEnd',
43+
'PreToolUse',
44+
'PostToolUse',
45+
'PostToolUseFailure',
46+
'PromptSubmit',
4747
],
4848
supportsSpawn: true,
4949
supportsInstall: true,

packages/adapters/src/providers/opencode/hooks.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,35 @@
11
/**
22
* OpenCode Hook Provider
33
*
4-
* Maps OpenCode's native hook events to CAAMP hook events.
5-
* OpenCode supports 6 of 8 CAAMP events through its agent/hook system.
4+
* Maps OpenCode's native hook events to CAAMP canonical hook events.
5+
* OpenCode supports 6 of the canonical events through its agent/hook system.
66
*
77
* OpenCode event mapping:
8-
* - session.start -> onSessionStart
9-
* - session.end -> onSessionEnd
10-
* - tool.start -> onToolStart
11-
* - tool.complete -> onToolComplete
12-
* - error -> onError
13-
* - prompt.submit -> onPromptSubmit
8+
* - session.start -> SessionStart
9+
* - session.end -> SessionEnd
10+
* - tool.start -> PreToolUse
11+
* - tool.complete -> PostToolUse
12+
* - error -> PostToolUseFailure
13+
* - prompt.submit -> PromptSubmit
1414
*
1515
* @task T5240
1616
*/
1717

1818
import type { AdapterHookProvider } from '@cleocode/contracts';
1919

2020
/**
21-
* Mapping from OpenCode native event names to CAAMP event names.
21+
* Mapping from OpenCode native event names to CAAMP canonical event names.
2222
*
2323
* OpenCode uses dot-delimited event names (e.g. "session.start")
24-
* while CAAMP uses camelCase (e.g. "onSessionStart").
24+
* while CAAMP canonical names are PascalCase (e.g. "SessionStart").
2525
*/
2626
const OPENCODE_EVENT_MAP: Record<string, string> = {
27-
'session.start': 'onSessionStart',
28-
'session.end': 'onSessionEnd',
29-
'tool.start': 'onToolStart',
30-
'tool.complete': 'onToolComplete',
31-
error: 'onError',
32-
'prompt.submit': 'onPromptSubmit',
27+
'session.start': 'SessionStart',
28+
'session.end': 'SessionEnd',
29+
'tool.start': 'PreToolUse',
30+
'tool.complete': 'PostToolUse',
31+
error: 'PostToolUseFailure',
32+
'prompt.submit': 'PromptSubmit',
3333
};
3434

3535
/**

packages/cleo/src/dispatch/adapters/cli.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ export async function dispatchFromCli(
144144
const projectRoot = getProjectRoot();
145145
const dispatchStart = Date.now();
146146

147-
// Dispatch onPromptSubmit hook (best-effort, fire-and-forget)
147+
// Dispatch PromptSubmit hook (best-effort, fire-and-forget)
148148
hooks
149-
.dispatch('onPromptSubmit', projectRoot, {
149+
.dispatch('PromptSubmit', projectRoot, {
150150
timestamp: new Date().toISOString(),
151151
gateway,
152152
domain,
@@ -166,9 +166,9 @@ export async function dispatchFromCli(
166166
requestId: randomUUID(),
167167
});
168168

169-
// Dispatch onResponseComplete hook (best-effort, fire-and-forget)
169+
// Dispatch ResponseComplete hook (best-effort, fire-and-forget)
170170
hooks
171-
.dispatch('onResponseComplete', projectRoot, {
171+
.dispatch('ResponseComplete', projectRoot, {
172172
timestamp: new Date().toISOString(),
173173
gateway,
174174
domain,
@@ -253,9 +253,9 @@ export async function dispatchRaw(
253253
const projectRoot = getProjectRoot();
254254
const dispatchStart = Date.now();
255255

256-
// Dispatch onPromptSubmit hook (best-effort, fire-and-forget)
256+
// Dispatch PromptSubmit hook (best-effort, fire-and-forget)
257257
hooks
258-
.dispatch('onPromptSubmit', projectRoot, {
258+
.dispatch('PromptSubmit', projectRoot, {
259259
timestamp: new Date().toISOString(),
260260
gateway,
261261
domain,
@@ -275,9 +275,9 @@ export async function dispatchRaw(
275275
requestId: randomUUID(),
276276
});
277277

278-
// Dispatch onResponseComplete hook (best-effort, fire-and-forget)
278+
// Dispatch ResponseComplete hook (best-effort, fire-and-forget)
279279
hooks
280-
.dispatch('onResponseComplete', projectRoot, {
280+
.dispatch('ResponseComplete', projectRoot, {
281281
timestamp: new Date().toISOString(),
282282
gateway,
283283
domain,

0 commit comments

Comments
 (0)