@cleocode/adapters 2026.10.8 → 2026.10.9-rc.ci.676

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 (32) hide show
  1. package/dist/heavy-command-hook.js +13 -12
  2. package/dist/heavy-command-hook.js.map +1 -1
  3. package/dist/index.js +60 -133
  4. package/dist/index.js.map +2 -2
  5. package/dist/project-hook-delivery.d.ts +6 -0
  6. package/dist/project-hook-delivery.d.ts.map +1 -0
  7. package/dist/project-hook-delivery.js +527 -0
  8. package/dist/project-hook-delivery.js.map +6 -0
  9. package/dist/project-hook-native.d.ts +7 -0
  10. package/dist/project-hook-native.d.ts.map +1 -0
  11. package/dist/project-hook-native.js +84 -0
  12. package/dist/project-hook-native.js.map +6 -0
  13. package/dist/providers/claude-code/hooks.d.ts.map +1 -1
  14. package/dist/providers/codex/hooks.d.ts +5 -4
  15. package/dist/providers/codex/hooks.d.ts.map +1 -1
  16. package/dist/providers/cursor/hooks.d.ts.map +1 -1
  17. package/dist/providers/gemini-cli/hooks.d.ts.map +1 -1
  18. package/dist/providers/opencode/hooks.d.ts.map +1 -1
  19. package/dist/providers/pi/hooks.d.ts.map +1 -1
  20. package/dist/providers/shared/heavy-command-hook-install.d.ts +2 -1
  21. package/dist/providers/shared/heavy-command-hook-install.d.ts.map +1 -1
  22. package/package.json +14 -5
  23. package/src/__tests__/project-hook-delivery.test.ts +319 -0
  24. package/src/project-hook-delivery.ts +532 -0
  25. package/src/project-hook-native.ts +128 -0
  26. package/src/providers/claude-code/hooks.ts +2 -30
  27. package/src/providers/codex/hooks.ts +7 -9
  28. package/src/providers/cursor/hooks.ts +2 -22
  29. package/src/providers/gemini-cli/hooks.ts +2 -12
  30. package/src/providers/opencode/hooks.ts +2 -22
  31. package/src/providers/pi/hooks.ts +2 -26
  32. package/src/providers/shared/heavy-command-hook-install.ts +21 -10
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/project-hook-native.ts"],
4
+ "mappings": "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",
5
+ "names": ["line"]
6
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/claude-code/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI/D,4EAA4E;AAC5E,eAAO,MAAM,wBAAwB,yCAAyC,CAAC;AAE/E,yFAAyF;AACzF,eAAO,MAAM,2BAA2B,2FAC8C,CAAC;AAEvF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,6LACkJ,CAAC;AA4GzL;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,sBAAuB,YAAW,mBAAmB;IAChE,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD,+DAA+D;IAC/D,OAAO,CAAC,UAAU,CAAuB;IAEzC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B5D;;;;;;;;;;OAUG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5C,gFAAgF;IAChF,OAAO,CAAC,aAAa,CAAuB;IAE5C;;;;;;;;;;OAUG;IACH,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC;;;;;OAKG;YACW,cAAc;IAmB5B;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;;;OAIG;IACH,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B;;;;;;;;OAQG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;;OAUG;IACG,2BAA2B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAStD;;;;;;;;;;OAUG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IASnD;;;;;;;;;;OAUG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAW9D;;;;;;;;;;;;;;;;OAgBG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA4FpF"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/claude-code/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI/D,4EAA4E;AAC5E,eAAO,MAAM,wBAAwB,yCAAyC,CAAC;AAE/E,yFAAyF;AACzF,eAAO,MAAM,2BAA2B,2FAC8C,CAAC;AAEvF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,6LACkJ,CAAC;AA+EzL;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,sBAAuB,YAAW,mBAAmB;IAChE,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD,+DAA+D;IAC/D,OAAO,CAAC,UAAU,CAAuB;IAEzC;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B5D;;;;;;;;;;OAUG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5C,gFAAgF;IAChF,OAAO,CAAC,aAAa,CAAuB;IAE5C;;;;;;;;;;OAUG;IACH,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAIjC;;;;;OAKG;YACW,cAAc;IAmB5B;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;;;OAIG;IACH,aAAa,IAAI,MAAM,GAAG,IAAI;IAI9B;;;;;;;;OAQG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;;OAUG;IACG,2BAA2B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAStD;;;;;;;;;;OAUG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IASnD;;;;;;;;;;OAUG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAW9D;;;;;;;;;;;;;;;;OAgBG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA4FpF"}
@@ -2,12 +2,13 @@
2
2
  * Codex CLI Hook Provider
3
3
  *
4
4
  * Maps Codex CLI's native hook events to CAAMP canonical hook events.
5
- * Codex CLI supports 3 canonical events through its hook system.
5
+ * Capabilities and fallback maps are generated from the CAAMP registry.
6
6
  *
7
7
  * Codex CLI event mapping:
8
8
  * - SessionStart -> SessionStart
9
9
  * - PromptSubmit -> UserPromptSubmit
10
10
  * - ResponseComplete -> Stop
11
+ * - PreToolUse -> PreToolUse
11
12
  *
12
13
  * @task T162
13
14
  * @epic T134
@@ -17,7 +18,7 @@ import type { AdapterHookProvider } from '@cleocode/contracts';
17
18
  * Hook provider for Codex CLI.
18
19
  *
19
20
  * Codex CLI registers hooks via its configuration system at
20
- * ~/.codex/. Hook handlers are shell commands or script paths that
21
+ * the project-local .codex/hooks.json. Hook handlers are shell commands or script paths that
21
22
  * execute when the corresponding event fires.
22
23
  *
23
24
  * Since hooks are registered through the config system (managed by
@@ -25,9 +26,9 @@ import type { AdapterHookProvider } from '@cleocode/contracts';
25
26
  * track registration state without performing filesystem operations.
26
27
  *
27
28
  * @remarks
28
- * Codex CLI has a minimal hook surface with only 3 canonical events.
29
+ * Codex supports PreToolUse; version certification remains separate from installation.
29
30
  * Registration state is tracked in-memory because Codex CLI manages
30
- * hooks through its own configuration system at `~/.codex/`.
31
+ * hooks through its own configuration system. Native project and hook trust are separate.
31
32
  *
32
33
  * @task T162
33
34
  * @epic T134
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAY/D;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,iBAAkB,YAAW,mBAAmB;IAC3D,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;OAMG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD;;;;;;;;;;OAUG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;;OAGG;IACH,YAAY,IAAI,OAAO;IAIvB;;;OAGG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;;;OAWG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGrF"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAQ/D;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,iBAAkB,YAAW,mBAAmB;IAC3D,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;OAMG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD;;;;;;;;;;OAUG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;;OAGG;IACH,YAAY,IAAI,OAAO;IAIvB;;;OAGG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;;;OAWG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGrF"}
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/cursor/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAqC/D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD;;;;;;;;;;;;OAYG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;;;;;;;OAQG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;OASG;IACG,2BAA2B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAStD;;;;;;;;;;OAUG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IASnD;;;;;;;;;OASG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAU/D"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/cursor/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAgB/D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;;;;;;;;OAaG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD;;;;;;;;;;;;OAYG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;;;;;;;OAQG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;OASG;IACG,2BAA2B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAStD;;;;;;;;;;OAUG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IASnD;;;;;;;;;OASG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAU/D"}
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini-cli/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAmB/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,qBAAsB,YAAW,mBAAmB;IAC/D,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;OAMG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD;;;;;;;;;;OAUG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;;OAGG;IACH,YAAY,IAAI,OAAO;IAIvB;;;OAGG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;;;OAWG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGrF"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini-cli/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAQ/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,qBAAsB,YAAW,mBAAmB;IAC/D,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;OAMG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD;;;;;;;;;;OAUG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;;OAGG;IACH,YAAY,IAAI,OAAO;IAIvB;;;OAGG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;;;OAWG;IACG,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGrF"}
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/opencode/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAuC/D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,oBAAqB,YAAW,mBAAmB;IAC9D,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD;;;;;;;;;;;;OAYG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;;;;;;;OAQG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;;OAUG;IACG,2BAA2B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAStD;;;;;;;;;;OAUG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IASnD;;;;;;;;;OASG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAU/D"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/opencode/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAkB/D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,oBAAqB,YAAW,mBAAmB;IAC9D,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;;;;;;OAWG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD;;;;;;;;;;;;OAYG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;;;;;;;OAQG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;;OAUG;IACG,2BAA2B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAStD;;;;;;;;;;OAUG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IASnD;;;;;;;;;OASG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAU/D"}
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/pi/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AA2C/D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,cAAe,YAAW,mBAAmB;IACxD,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD;;;;;;;;;;;;OAYG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;;;;;;;OAQG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;OASG;IACG,2BAA2B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAStD;;;;;;;;;OASG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IASnD;;;;;;;;;OASG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAU/D"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/providers/pi/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAkB/D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,cAAe,YAAW,mBAAmB;IACxD,kEAAkE;IAClE,OAAO,CAAC,UAAU,CAAS;IAE3B;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAItD;;;;;;;;;;;;OAYG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7D;;;;;;;OAOG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;;;;;;;OAQG;IACH,WAAW,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAI/C;;;;;;;;;OASG;IACG,2BAA2B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAStD;;;;;;;;;OASG;IACG,kBAAkB,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IASnD;;;;;;;;;OASG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAU/D"}
@@ -193,9 +193,10 @@ export declare const OPENCODE_PLUGIN_FILE = ".opencode/plugins/cleo-heavy-comman
193
193
  * @param projectDir - the project root.
194
194
  * @param relPath - the file, relative to the project (forward slashes).
195
195
  * @param marker - the block's first line.
196
+ * @param env - Git discovery environment; existing callers retain the process environment.
196
197
  * @returns whether a block was added.
197
198
  */
198
- export declare function excludeHookFileFromGit(projectDir: string, relPath: string, marker?: string): boolean;
199
+ export declare function excludeHookFileFromGit(projectDir: string, relPath: string, marker?: string, env?: NodeJS.ProcessEnv): boolean;
199
200
  /**
200
201
  * Remove the block {@link excludeHookFileFromGit} added for this project's
201
202
  * file, and only that: the exact path line and the CLEO marker right above it.
@@ -1 +1 @@
1
- {"version":3,"file":"heavy-command-hook-install.d.ts","sourceRoot":"","sources":["../../../src/providers/shared/heavy-command-hook-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAgBH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAGhE,oEAAoE;AACpE,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAE/D,iFAAiF;AACjF,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD,kDAAkD;AAClD,eAAO,MAAM,6BAA6B,0BAA0B,CAAC;AAErE;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,EA+B5C,CAAC;AAEH;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAehG;;;;;GAKG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,iDAAiD;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;gBACS,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAKzC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa/D;AASD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,OAAO,CAEnF;AAED;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,QAOjC,CAAC;AAEH,mFAAmF;AACnF,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AAEjE;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,GAAE,MAAgD,GACpD,MAAM,CAkBR;AAqDD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,CAIjF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMjG;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEhG;AAED,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAOxD;AAsDD;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC5C,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,aAAa,GAAG,OAAO,EACjC,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CA4B9B;AAED,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,0BAA0B,CAAC;AAE3D;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQ/F;AAED,+DAA+D;AAC/D,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAO7D;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,aAAa,GAAG,OAAO,EACjC,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,mBAAmB,CAAC,CA4B9B;AAED,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,gCAAgC,CAAC;AAEnE,yGAAyG;AACzG,eAAO,MAAM,6BAA6B,sFAC2C,CAAC;AAEtF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,gFAC0C,CAAC;AAEhF,4DAA4D;AAC5D,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAEpD,oDAAoD;AACpD,eAAO,MAAM,oBAAoB,4CAAuD,CAAC;AA6BzF;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAiC,GACxC,OAAO,CAYT;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAYrF;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAIjF;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzE;AAED;;;;;;;GAOG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,qCAAqC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;OAGG;gBACS,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;CAKtC;AA8BD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,UAAO,GAAG,MAAM,GAAG,IAAI,CAmBzF;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAgBvE;AAsBD;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CA0BtE;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAO3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGhF;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAuB9B;AAED;;;;;;;;GAQG;AACH,wBAAsB,8BAA8B,CAClD,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,mBAAmB,CAAC,CAoB9B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gCAAgC,IAAI,MAAM,CAmDzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,oBAAoB,GACzB,mBAAmB,CAkBrB"}
1
+ {"version":3,"file":"heavy-command-hook-install.d.ts","sourceRoot":"","sources":["../../../src/providers/shared/heavy-command-hook-install.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cleocode/adapters",
3
- "version": "2026.10.8",
3
+ "version": "2026.10.9-rc.ci.676",
4
4
  "description": "Unified provider adapters for CLEO (Claude Code, OpenCode, Cursor)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -13,15 +13,23 @@
13
13
  "./heavy-command-hook": {
14
14
  "types": "./dist/heavy-command-hook.d.ts",
15
15
  "import": "./dist/heavy-command-hook.js"
16
+ },
17
+ "./project-hook-delivery": {
18
+ "types": "./dist/project-hook-delivery.d.ts",
19
+ "import": "./dist/project-hook-delivery.js"
20
+ },
21
+ "./project-hook-native": {
22
+ "types": "./dist/project-hook-native.d.ts",
23
+ "import": "./dist/project-hook-native.js"
16
24
  }
17
25
  },
18
26
  "dependencies": {
19
27
  "@ai-sdk/anthropic": "^3.0.69",
20
28
  "@ai-sdk/openai": "^2.0.53",
21
29
  "ai": "^6.0.168",
22
- "@cleocode/caamp": "2026.10.8",
23
- "@cleocode/contracts": "2026.10.8",
24
- "@cleocode/paths": "2026.10.8"
30
+ "@cleocode/caamp": "2026.10.9-rc.ci.676",
31
+ "@cleocode/contracts": "2026.10.9-rc.ci.676",
32
+ "@cleocode/paths": "2026.10.9-rc.ci.676"
25
33
  },
26
34
  "license": "MIT",
27
35
  "engines": {
@@ -34,7 +42,8 @@
34
42
  "devDependencies": {
35
43
  "@types/node": "^24.3.0",
36
44
  "vitest": "^4.1.4",
37
- "@cleocode/playbooks": "2026.10.8"
45
+ "@cleocode/core": "2026.10.9-rc.ci.676",
46
+ "@cleocode/playbooks": "2026.10.9-rc.ci.676"
38
47
  },
39
48
  "repository": {
40
49
  "type": "git",
@@ -0,0 +1,319 @@
1
+ /** Project-local activation delivery, ownership and hash-guarded removal. */
2
+ import { execFileSync, spawnSync } from 'node:child_process';
3
+ import { createHash } from 'node:crypto';
4
+ import { mkdir, mkdtemp, readFile, rm, symlink, writeFile } from 'node:fs/promises';
5
+ import { tmpdir } from 'node:os';
6
+ import { join } from 'node:path';
7
+ import {
8
+ type ProjectHookDeliveryOptions,
9
+ ProjectHookDeliveryReceiptSchema,
10
+ } from '@cleocode/contracts/project-hook-delivery.js';
11
+ import { createProjectHookDeliveryServices } from '@cleocode/core/hooks/project-state';
12
+ import { afterEach, describe, expect, it, vi } from 'vitest';
13
+ import {
14
+ hasUnsupportedProjectHookDelivery,
15
+ syncProjectHookProviders,
16
+ } from '../project-hook-delivery.js';
17
+
18
+ const dirs: string[] = [];
19
+ afterEach(async () => {
20
+ await Promise.all(dirs.splice(0).map((path) => rm(path, { recursive: true, force: true })));
21
+ });
22
+ async function options(): Promise<ProjectHookDeliveryOptions> {
23
+ const root = await mkdtemp(join(tmpdir(), 'cleo-project-delivery-'));
24
+ dirs.push(root);
25
+ execFileSync('git', ['init', '--quiet', root]);
26
+ await mkdir(join(root, '.codex'));
27
+ return {
28
+ services: createProjectHookDeliveryServices(),
29
+ projectRoot: root,
30
+ stateDir: join(root, '.git/cleo-project-hooks'),
31
+ providers: ['codex'],
32
+ events: ['PreToolUse'],
33
+ enabled: true,
34
+ dryRun: false,
35
+ };
36
+ }
37
+ describe('project hook delivery', () => {
38
+ it('discovers the checkout through injected SDK services despite ambient Git overrides', async () => {
39
+ const opts = await options();
40
+ vi.stubEnv('GIT_DIR', '/nonexistent/foreign-repository');
41
+ vi.stubEnv('GIT_WORK_TREE', '/nonexistent/foreign-checkout');
42
+ try {
43
+ const services = createProjectHookDeliveryServices();
44
+ const result = await syncProjectHookProviders({
45
+ ...opts,
46
+ services,
47
+ });
48
+ expect(result[0]?.state).toBe('installed');
49
+ expect(
50
+ execFileSync('git', ['-C', opts.projectRoot, 'check-ignore', '.codex/hooks.json'], {
51
+ encoding: 'utf8',
52
+ env: services.gitEnvironment,
53
+ }).trim(),
54
+ ).toBe('.codex/hooks.json');
55
+ expect(process.env.GIT_DIR).toBe('/nonexistent/foreign-repository');
56
+ } finally {
57
+ vi.unstubAllEnvs();
58
+ }
59
+ });
60
+ it('does nothing while disabled and dry-run creates no config or receipt', async () => {
61
+ const opts = await options();
62
+ expect((await syncProjectHookProviders({ ...opts, enabled: false }))[0]?.state).toBe(
63
+ 'disabled',
64
+ );
65
+ expect((await syncProjectHookProviders({ ...opts, dryRun: true }))[0]?.state).toBe('planned');
66
+ await expect(readFile(join(opts.projectRoot, '.codex/hooks.json'))).rejects.toThrow();
67
+ await expect(readFile(join(opts.stateDir, 'provider-codex.json'))).rejects.toThrow();
68
+ });
69
+ it('rejects provider traversal and non-Git state paths before creating locks', async () => {
70
+ const opts = await options();
71
+ const traversal = (
72
+ await syncProjectHookProviders({ ...opts, providers: ['x/../../../outside'] })
73
+ )[0];
74
+ expect(traversal?.diagnostics).toContain('HOOK_PROVIDER_INVALID');
75
+ const wrong = (
76
+ await syncProjectHookProviders({ ...opts, stateDir: join(opts.projectRoot, 'foreign') })
77
+ )[0];
78
+ expect(wrong?.diagnostics).toContain('HOOK_STATE_DIRECTORY_INVALID');
79
+ await expect(readFile(join(opts.projectRoot, 'foreign/provider-codex.json'))).rejects.toThrow();
80
+ await symlink(join(opts.projectRoot, '.codex'), opts.stateDir);
81
+ const symlinked = (await syncProjectHookProviders(opts))[0];
82
+ expect(symlinked?.diagnostics).toContain('HOOK_STATE_DIRECTORY_INVALID');
83
+ await expect(readFile(join(opts.projectRoot, '.codex/provider-codex.json'))).rejects.toThrow();
84
+ });
85
+ it('preserves foreign rules and heavy entry through repeated sync and rollback', async () => {
86
+ const opts = await options();
87
+ const file = join(opts.projectRoot, '.codex/hooks.json');
88
+ const heavy = '{"hooks":[{"type":"command","command":"budget # cleo-hook"}]}';
89
+ await writeFile(file, '{// team comment\n"hooks":{"PreToolUse":[' + heavy + ']}}\n');
90
+ expect((await syncProjectHookProviders(opts))[0]?.state).toBe('installed');
91
+ expect((await syncProjectHookProviders(opts))[0]?.state).toBe('current');
92
+ expect(await readFile(file, 'utf8')).toContain(heavy);
93
+ await syncProjectHookProviders({ ...opts, enabled: false, rollback: true });
94
+ const body = await readFile(file, 'utf8');
95
+ expect(body).toContain('// team comment');
96
+ expect(body).toContain(heavy);
97
+ expect(body).not.toContain('# cleo-project-hook:v1');
98
+ });
99
+ it('warns and allows native invocation when CLEO is absent or lacks the protocol', async () => {
100
+ const opts = await options();
101
+ await syncProjectHookProviders(opts);
102
+ const receipt = ProjectHookDeliveryReceiptSchema.parse(
103
+ JSON.parse(await readFile(join(opts.stateDir, 'provider-codex.json'), 'utf8')),
104
+ );
105
+ const cmd = receipt.entries[0]?.command;
106
+ expect(cmd).toBeDefined();
107
+ if (!cmd) throw new Error('missing generated command');
108
+ const unavailable = spawnSync('/bin/sh', ['-c', cmd], {
109
+ env: { PATH: '/nonexistent' },
110
+ encoding: 'utf8',
111
+ stdio: ['pipe', 'pipe', 'pipe'],
112
+ });
113
+ expect(unavailable.status).toBe(0);
114
+ expect(unavailable.stdout).toBe('');
115
+ expect(unavailable.stderr).toContain('operation allowed');
116
+ const bin = join(opts.projectRoot, 'bin');
117
+ await mkdir(bin);
118
+ await writeFile(
119
+ join(bin, 'cleo'),
120
+ '#!/bin/sh\nprintf "%s\\n" "old unsupported CLI"\nexit 1\n',
121
+ { mode: 0o755 },
122
+ );
123
+ expect(
124
+ execFileSync('/bin/sh', ['-c', cmd], {
125
+ env: { PATH: bin },
126
+ encoding: 'utf8',
127
+ stdio: ['pipe', 'pipe', 'pipe'],
128
+ }),
129
+ ).toBe('');
130
+ });
131
+ it('refreshes a historical same-command entry without dropping its binding', async () => {
132
+ const opts = await options();
133
+ await syncProjectHookProviders(opts);
134
+ const file = join(opts.projectRoot, '.codex/hooks.json');
135
+ const receiptPath = join(opts.stateDir, 'provider-codex.json');
136
+ const receipt = ProjectHookDeliveryReceiptSchema.parse(
137
+ JSON.parse(await readFile(receiptPath, 'utf8')),
138
+ );
139
+ const command = receipt.entries[0]?.command;
140
+ if (!command) throw new Error('missing generated command');
141
+ const legacy = { matcher: '', hooks: [{ type: 'command', command }] };
142
+ const foreign = { hooks: [{ type: 'command', command: 'team migration gate' }] };
143
+ await writeFile(file, JSON.stringify({ hooks: { PreToolUse: [foreign, legacy] } }));
144
+ receipt.entries[0] = {
145
+ event: 'PreToolUse',
146
+ command,
147
+ hash: createHash('sha256').update(JSON.stringify(legacy)).digest('hex'),
148
+ };
149
+ await writeFile(receiptPath, JSON.stringify(receipt));
150
+ const refreshed = (await syncProjectHookProviders(opts))[0];
151
+ expect(refreshed?.state, JSON.stringify(refreshed)).toBe('installed');
152
+ expect(JSON.parse(await readFile(file, 'utf8'))).toEqual({
153
+ hooks: {
154
+ PreToolUse: [foreign, { matcher: '', hooks: [{ type: 'command', command, timeout: 130 }] }],
155
+ },
156
+ });
157
+ expect((await syncProjectHookProviders(opts))[0]?.state).toBe('current');
158
+ });
159
+ it('preserves tracked provider configuration despite an inherited alternate empty index', async () => {
160
+ const opts = await options();
161
+ const file = join(opts.projectRoot, '.codex/hooks.json');
162
+ const body = '{"hooks":{"PreToolUse":[]}}\n';
163
+ await writeFile(file, body);
164
+ execFileSync('git', ['-C', opts.projectRoot, 'add', '--', '.codex/hooks.json']);
165
+ const index = join(opts.projectRoot, '.git/alternate-index');
166
+ execFileSync('git', ['-C', opts.projectRoot, 'read-tree', '--empty'], {
167
+ env: { ...process.env, GIT_INDEX_FILE: index },
168
+ });
169
+ vi.stubEnv('GIT_INDEX_FILE', index);
170
+ try {
171
+ const result = (await syncProjectHookProviders(opts))[0];
172
+ expect(result?.diagnostics).toContain('HOOK_CONFIG_TRACKED_REVIEW_REQUIRED');
173
+ expect(await readFile(file, 'utf8')).toBe(body);
174
+ } finally {
175
+ vi.unstubAllEnvs();
176
+ }
177
+ });
178
+ it('refuses a customized managed entry even with its original marker', async () => {
179
+ const opts = await options();
180
+ await syncProjectHookProviders(opts);
181
+ const file = join(opts.projectRoot, '.codex/hooks.json');
182
+ const edited = (await readFile(file, 'utf8')).replace(
183
+ '--event PreToolUse',
184
+ '--event SessionStart',
185
+ );
186
+ await writeFile(file, edited);
187
+ expect((await syncProjectHookProviders(opts))[0]?.state).toBe('conflict');
188
+ await syncProjectHookProviders({ ...opts, rollback: true });
189
+ expect(await readFile(file, 'utf8')).toBe(edited);
190
+ });
191
+ it('never writes through a provider directory symlink outside the checkout', async () => {
192
+ const opts = await options();
193
+ const outside = await mkdtemp(join(tmpdir(), 'cleo-hook-outside-'));
194
+ dirs.push(outside);
195
+ await rm(join(opts.projectRoot, '.codex'), { recursive: true });
196
+ await symlink(outside, join(opts.projectRoot, '.codex'));
197
+ expect((await syncProjectHookProviders(opts))[0]?.state).toBe('conflict');
198
+ await expect(readFile(join(outside, 'hooks.json'))).rejects.toThrow();
199
+ });
200
+ it('delivers OpenCode as an auto-discovered JavaScript plugin with guarded removal', async () => {
201
+ const opts = await options();
202
+ const openCode = { ...opts, providers: ['opencode'] };
203
+ const result = (await syncProjectHookProviders(openCode))[0];
204
+ expect(result?.state).toBe('installed');
205
+ expect(result?.configPath).toBe(
206
+ join(opts.projectRoot, '.opencode/plugins/cleo-project-hooks.js'),
207
+ );
208
+ const file = join(opts.projectRoot, '.opencode/plugins/cleo-project-hooks.js');
209
+ const body = await readFile(file, 'utf8');
210
+ expect(body).toContain('"tool.execute.before"');
211
+ expect(body).toContain('timeout:130000');
212
+ expect(
213
+ (await syncProjectHookProviders({ ...openCode, enabled: false, rollback: true }))[0]?.state,
214
+ ).toBe('disabled');
215
+ await expect(readFile(file)).rejects.toThrow();
216
+ });
217
+ it('reports Kimi project-local support unavailable without writing global hooks', async () => {
218
+ const opts = await options();
219
+ const result = (await syncProjectHookProviders({ ...opts, providers: ['kimi'] }))[0];
220
+ expect(result).toMatchObject({
221
+ state: 'unsupported',
222
+ nativeTrust: 'unverified',
223
+ provenance: 'unknown',
224
+ });
225
+ });
226
+ it('reports unsupported plugin bindings without creating a no-op plugin or claiming mixed delivery complete', async () => {
227
+ const opts = await options();
228
+ const sole = await syncProjectHookProviders({
229
+ ...opts,
230
+ providers: ['opencode'],
231
+ events: ['SessionStart'],
232
+ });
233
+ expect(sole[0]?.state).toBe('unsupported');
234
+ await expect(
235
+ readFile(join(opts.projectRoot, '.opencode/plugins/cleo-project-hooks.js')),
236
+ ).rejects.toThrow();
237
+ await expect(readFile(join(opts.stateDir, 'provider-opencode.json'))).rejects.toThrow();
238
+ const mixed = await syncProjectHookProviders({
239
+ ...opts,
240
+ providers: ['opencode'],
241
+ events: ['PreToolUse', 'SessionStart'],
242
+ });
243
+ expect(mixed[0]?.state).toBe('installed');
244
+ expect(hasUnsupportedProjectHookDelivery(mixed)).toBe(true);
245
+ expect(
246
+ await readFile(join(opts.projectRoot, '.opencode/plugins/cleo-project-hooks.js'), 'utf8'),
247
+ ).toContain('"tool.execute.before"');
248
+ });
249
+ it('preserves a plugin changed by another writer during owned rollback', async () => {
250
+ const opts = await options();
251
+ const openCode = { ...opts, providers: ['opencode'] };
252
+ await syncProjectHookProviders(openCode);
253
+ const file = join(opts.projectRoot, '.opencode/plugins/cleo-project-hooks.js');
254
+ const foreign = '// developer changed this plugin during inspection\n';
255
+ const originalRead = opts.services.readTextFile;
256
+ let changed = false;
257
+ const services = {
258
+ ...opts.services,
259
+ async readTextFile(path: string, maxBytes: number): Promise<string> {
260
+ const result = await originalRead(path, maxBytes);
261
+ if (path === file && !changed) {
262
+ changed = true;
263
+ await writeFile(file, foreign);
264
+ }
265
+ return result;
266
+ },
267
+ };
268
+ const result = (await syncProjectHookProviders({ ...openCode, services, rollback: true }))[0];
269
+ expect(result?.diagnostics).toContain('HOOK_CONFIG_CONCURRENT_EDIT');
270
+ expect(await readFile(file, 'utf8')).toBe(foreign);
271
+ });
272
+ it('refuses a corrupt receipt rather than resetting management authority', async () => {
273
+ const opts = await options();
274
+ await mkdir(opts.stateDir);
275
+ await writeFile(join(opts.stateDir, 'provider-codex.json'), '{ corrupt');
276
+ const result = (await syncProjectHookProviders(opts))[0];
277
+ expect(result?.state).toBe('conflict');
278
+ expect(result?.diagnostics).toContain('HOOK_RECEIPT_INVALID');
279
+ await expect(readFile(join(opts.projectRoot, '.codex/hooks.json'))).rejects.toThrow();
280
+ });
281
+ it('preserves a foreign hook even when a schema-valid receipt claims it', async () => {
282
+ const opts = await options();
283
+ const file = join(opts.projectRoot, '.codex/hooks.json');
284
+ const foreign = {
285
+ matcher: '',
286
+ hooks: [{ type: 'command', command: 'project migration check' }],
287
+ };
288
+ const body = JSON.stringify({ hooks: { PreToolUse: [foreign] } });
289
+ await writeFile(file, body);
290
+ await mkdir(opts.stateDir);
291
+ await writeFile(
292
+ join(opts.stateDir, 'provider-codex.json'),
293
+ JSON.stringify({
294
+ schemaVersion: 1,
295
+ provider: 'codex',
296
+ configPath: file,
297
+ entries: [
298
+ {
299
+ event: 'PreToolUse',
300
+ command: 'project migration check',
301
+ hash: createHash('sha256').update(JSON.stringify(foreign)).digest('hex'),
302
+ },
303
+ ],
304
+ recordedAt: new Date().toISOString(),
305
+ }),
306
+ );
307
+ const result = (await syncProjectHookProviders({ ...opts, rollback: true }))[0];
308
+ expect(result?.diagnostics).toContain('HOOK_RECEIPT_OWNERSHIP_INVALID');
309
+ expect(await readFile(file, 'utf8')).toBe(body);
310
+ });
311
+ it('keeps the existing heavy-hook classifier eligible without altering its generated entry', async () => {
312
+ const opts = await options();
313
+ await syncProjectHookProviders(opts);
314
+ const { codexHooksSharedReason } = await import(
315
+ '../providers/shared/heavy-command-hook-install.js'
316
+ );
317
+ expect(codexHooksSharedReason(opts.projectRoot, false)).toBeNull();
318
+ });
319
+ });