@@ -122,6 +122,11 @@ for (const host of ['.copilot', '.claude', '.codex', path.join('gemini-cli-home'
122122 assert . strictEqual ( receipt . workspaceCleanMode , 'GlobalOnlyWorkspaceCleanModeV1' )
123123}
124124assert . strictEqual ( fs . existsSync ( path . join ( globalHome , '.agents' , 'devcodex' , 'instructions.full.md' ) ) , true )
125+ assert . strictEqual (
126+ fs . existsSync ( path . join ( globalHome , '.agents' , 'devcodex' , 'skills' , 'portfolio.json' ) ) ,
127+ true ,
128+ 'shared Skill runtime must include portfolio.json for installed SkillRoute bootstrap'
129+ )
125130assert . strictEqual ( fs . existsSync ( path . join ( globalHome , '.agents' , 'devcodex' , 'skills' , 'routing' , 'SKILL.md' ) ) , true )
126131assert . strictEqual (
127132 fs . existsSync ( path . join ( globalHome , '.agents' , 'skills' , 'routing' , 'SKILL.md' ) ) ,
@@ -219,6 +224,33 @@ const importedClaudeHook = JSON.parse(runCommand(process.execPath, [installedCla
219224assert . strictEqual ( importedClaudeHook . continue , true )
220225assert . strictEqual ( importedClaudeHook . devcodexCompatibilityBypass , 'grok-imported-claude-hook' )
221226
227+ const installedCodexAdapter = path . join (
228+ globalHome ,
229+ '.codex' ,
230+ 'devcodex' ,
231+ 'runtime' ,
232+ 'hooks' ,
233+ '_runtime' ,
234+ 'lifecycle-host-adapters.cjs'
235+ )
236+ const installedCodexHook = JSON . parse ( runCommand ( process . execPath , [ installedCodexAdapter , 'codex' ] , {
237+ cwd : workspace ,
238+ env : installedEnv ,
239+ shell : false ,
240+ input : JSON . stringify ( {
241+ hookEventName : 'UserPromptSubmit' ,
242+ cwd : workspace ,
243+ prompt : 'routing installed package smoke' ,
244+ session_id : 'installed-package-skill-route'
245+ } )
246+ } ) . stdout )
247+ const installedCodexContext = `${ installedCodexHook . systemMessage || '' } \n${ installedCodexHook . hookSpecificOutput ?. additionalContext || '' } `
248+ assert . match (
249+ installedCodexContext ,
250+ / S k i l l R o u t e B o o t s t r a p V 1 / ,
251+ 'installed Codex hook must expose SkillRoute bootstrap from packed global runtime'
252+ )
253+
222254for ( const host of [ 'copilot' , 'claude' , 'codex' , 'gemini' , 'grok' ] ) {
223255 const installedAdapter = path . join (
224256 globalHome ,
0 commit comments