diff --git a/packages/cli/src/ui/commands/chatCommand.test.ts b/packages/cli/src/ui/commands/chatCommand.test.ts index 5318c330..0c98239a 100644 --- a/packages/cli/src/ui/commands/chatCommand.test.ts +++ b/packages/cli/src/ui/commands/chatCommand.test.ts @@ -131,11 +131,34 @@ describe('chatCommand', () => { const content = result?.content ?? ''; expect(result?.type).toBe('message'); expect(content).toContain('List of saved conversations:'); + const isoDate = date + .toISOString() + .match(/(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})/); + const formattedDate = isoDate ? `${isoDate[1]} ${isoDate[2]}` : ''; + expect(content).toContain(formattedDate); const index1 = content.indexOf('- \u001b[36mtest1\u001b[0m'); const index2 = content.indexOf('- \u001b[36mtest2\u001b[0m'); expect(index1).toBeGreaterThanOrEqual(0); expect(index2).toBeGreaterThan(index1); }); + + it('should handle invalid date formats gracefully', async () => { + const fakeFiles = ['checkpoint-baddate.json']; + const badDate = { + toISOString: () => 'an-invalid-date-string', + } as Date; + + mockFs.readdir.mockResolvedValue(fakeFiles); + mockFs.stat.mockResolvedValue({ mtime: badDate } as Stats); + + const result = (await listCommand?.action?.( + mockContext, + '', + )) as MessageActionReturn; + + const content = result?.content ?? ''; + expect(content).toContain('(saved on Invalid Date)'); + }); }); describe('save subcommand', () => { let saveCommand: SlashCommand; diff --git a/packages/cli/src/ui/commands/chatCommand.ts b/packages/cli/src/ui/commands/chatCommand.ts index 2f669481..739097e3 100644 --- a/packages/cli/src/ui/commands/chatCommand.ts +++ b/packages/cli/src/ui/commands/chatCommand.ts @@ -70,9 +70,17 @@ const listCommand: SlashCommand = { }; } + const maxNameLength = Math.max( + ...chatDetails.map((chat) => chat.name.length), + ); + let message = 'List of saved conversations:\n\n'; for (const chat of chatDetails) { - message += ` - \u001b[36m${chat.name}\u001b[0m\n`; + const paddedName = chat.name.padEnd(maxNameLength, ' '); + const isoString = chat.mtime.toISOString(); + const match = isoString.match(/(\d{4}-\d{2}-\d{2})T(\d{2}:\d{2}:\d{2})/); + const formattedDate = match ? `${match[1]} ${match[2]}` : 'Invalid Date'; + message += ` - \u001b[36m${paddedName}\u001b[0m \u001b[90m(saved on ${formattedDate})\u001b[0m\n`; } message += `\n\u001b[90mNote: Newest last, oldest first\u001b[0m`; return {