@@ -305,6 +305,20 @@ function assertCodexAdapterState(root) {
305305 )
306306}
307307
308+ function assertCodexPreCompactHookConfig ( hooks ) {
309+ const preCompactEntries = hooks . hooks ?. PreCompact || [ ]
310+ assert . ok ( Array . isArray ( preCompactEntries ) && preCompactEntries . length > 0 , 'missing Codex hook event: PreCompact' )
311+ const commands = JSON . stringify ( preCompactEntries )
312+ assert . ok (
313+ commands . includes ( 'lifecycle.cjs' ) && ( commands . includes ( '.codex' ) || commands . includes ( 'codex' ) ) ,
314+ 'unexpected hook command for PreCompact'
315+ )
316+ assert . ok (
317+ commands . includes ( 'manual|auto' ) ,
318+ 'Codex PreCompact hook must match manual and auto compaction triggers'
319+ )
320+ }
321+
308322function assertClaudeMergeState ( root , { claudeMdManaged } ) {
309323 const settings = readJson ( root , '.claude/settings.json' )
310324 const mcp = readJson ( root , '.mcp.json' )
@@ -1036,6 +1050,10 @@ function testCodexInitBootstrapsWorkspaceNamespaceData() {
10361050 fs . rmSync ( root , { recursive : true , force : true } )
10371051}
10381052
1053+ function testCodexPreCompactAdapterSmoke ( ) {
1054+ assertCodexPreCompactHookConfig ( JSON . parse ( fs . readFileSync ( path . join ( ROOT , 'codex' , 'hooks.json' ) , 'utf8' ) ) )
1055+ }
1056+
10391057function testCodexInitBacksUpManagedFiles ( ) {
10401058 const root = createTempRoot ( 'devcodex-cli-codex-init-' )
10411059 writeFile ( root , 'package.json' , '{ "name": "tmp-codex-init" }\n' )
@@ -1633,4 +1651,9 @@ function main() {
16331651 process . stdout . write ( 'cli behavior test passed\n' )
16341652}
16351653
1636- main ( )
1654+ if ( process . argv . includes ( '--codex-precompact-smoke' ) ) {
1655+ testCodexPreCompactAdapterSmoke ( )
1656+ process . stdout . write ( 'cli Codex PreCompact adapter smoke passed\n' )
1657+ } else {
1658+ main ( )
1659+ }
0 commit comments