@@ -61,7 +61,15 @@ async function convertAndAssertListed(api, tmpHome, source, target, params = {},
6161}
6262
6363module . exports = async function testSessionConvertDerived ( ctx ) {
64- const { api, tmpHome, sessionId, sessionPath } = ctx ;
64+ const {
65+ api,
66+ tmpHome,
67+ sessionId,
68+ sessionPath,
69+ daudeSessionPath,
70+ claudeSessionId,
71+ claudeSessionPath
72+ } = ctx ;
6573
6674 const beforeHash = sha256File ( sessionPath ) ;
6775
@@ -97,6 +105,34 @@ module.exports = async function testSessionConvertDerived(ctx) {
97105 const afterHash = sha256File ( sessionPath ) ;
98106 assert ( afterHash === beforeHash , 'source codex session should remain unchanged after conversions' ) ;
99107
108+ if ( daudeSessionPath ) {
109+ const beforeDaudeHash = sha256File ( daudeSessionPath ) ;
110+ const { outPath : daudeDerivedClaudePath } = await convertAndAssertListed ( api , tmpHome , 'codex' , 'claude' , {
111+ filePath : daudeSessionPath ,
112+ maxMessages : 'all'
113+ } ) ;
114+ const daudeDetail = await api ( 'session-detail' , { source : 'claude' , filePath : daudeDerivedClaudePath , maxMessages : 20 } ) ;
115+ const daudeTexts = ( daudeDetail . messages || [ ] ) . map ( ( m ) => m . text ) ;
116+ assert ( daudeTexts . length === 2 , 'daude derived claude session should keep message count' ) ;
117+ assert ( daudeTexts [ 0 ] === 'daude code quick start 222' , 'daude derived claude user text mismatch' ) ;
118+ assert ( daudeTexts [ 1 ] === 'sharing daude-code bootstrap' , 'daude derived claude assistant text mismatch' ) ;
119+ assert ( sha256File ( daudeSessionPath ) === beforeDaudeHash , 'daude source session should remain unchanged after conversion' ) ;
120+ }
121+
122+ if ( claudeSessionId && claudeSessionPath ) {
123+ const beforeClaudeHash = sha256File ( claudeSessionPath ) ;
124+ const { outPath : claudeDerivedCodexPath } = await convertAndAssertListed ( api , tmpHome , 'claude' , 'codex' , {
125+ sessionId : claudeSessionId ,
126+ maxMessages : 'all'
127+ } ) ;
128+ const detail = await api ( 'session-detail' , { source : 'codex' , filePath : claudeDerivedCodexPath , maxMessages : 50 } ) ;
129+ const texts = ( detail . messages || [ ] ) . map ( ( m ) => m . text ) ;
130+ assert ( texts . length === 2 , 'claude derived codex session should keep message count' ) ;
131+ assert ( texts [ 0 ] === 'hello from claude code session' , 'claude derived codex user text mismatch' ) ;
132+ assert ( texts [ 1 ] === 'initialized project' , 'claude derived codex assistant text mismatch' ) ;
133+ assert ( sha256File ( claudeSessionPath ) === beforeClaudeHash , 'claude source session should remain unchanged after conversion' ) ;
134+ }
135+
100136 const invalidSame = await api ( 'convert-session' , { source : 'codex' , target : 'codex' , sessionId, maxMessages : 'all' } ) ;
101137 assert ( invalidSame . error , 'convert-session should reject same source/target' ) ;
102138 const invalidTarget = await api ( 'convert-session' , { source : 'codex' , target : 'gemini' , sessionId, maxMessages : 'all' } ) ;
0 commit comments