feat(cli): display timestamp in /chat list (#4733)

Co-authored-by: Jacob Richman <jacob314@gmail.com>
This commit is contained in:
Thomas Burnham 2025-07-24 00:48:52 -04:00 committed by GitHub
parent 107ce8afa3
commit b1e0fb157b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 32 additions and 1 deletions

View File

@ -131,11 +131,34 @@ describe('chatCommand', () => {
const content = result?.content ?? ''; const content = result?.content ?? '';
expect(result?.type).toBe('message'); expect(result?.type).toBe('message');
expect(content).toContain('List of saved conversations:'); 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 index1 = content.indexOf('- \u001b[36mtest1\u001b[0m');
const index2 = content.indexOf('- \u001b[36mtest2\u001b[0m'); const index2 = content.indexOf('- \u001b[36mtest2\u001b[0m');
expect(index1).toBeGreaterThanOrEqual(0); expect(index1).toBeGreaterThanOrEqual(0);
expect(index2).toBeGreaterThan(index1); 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', () => { describe('save subcommand', () => {
let saveCommand: SlashCommand; let saveCommand: SlashCommand;

View File

@ -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'; let message = 'List of saved conversations:\n\n';
for (const chat of chatDetails) { 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`; message += `\n\u001b[90mNote: Newest last, oldest first\u001b[0m`;
return { return {