@@ -70,6 +70,11 @@ describe("cli --help", () => {
7070 expect ( stdout ) . toContain ( "Usage:" ) ;
7171 expect ( stdout ) . toContain ( "Analysis:" ) ;
7272 } ) ;
73+
74+ test ( "documents list --reverse" , async ( ) => {
75+ const { stdout } = await runCli ( "--help" ) ;
76+ expect ( stdout ) . toContain ( "list --reverse" ) ;
77+ } ) ;
7378} ) ;
7479
7580describe ( "cli init" , ( ) => {
@@ -156,6 +161,127 @@ describe("cli list", () => {
156161 expect ( stdout ) . toContain ( "Total:" ) ;
157162 expect ( stdout ) . toContain ( "session(s)" ) ;
158163 } ) ;
164+
165+ test ( "--reverse reorders the table oldest-first, footer count unchanged" , async ( ) => {
166+ const idA = "aaaa1111-0000-0000-0000-000000000000" ;
167+ const idB = "bbbb2222-0000-0000-0000-000000000000" ;
168+ writeSession ( idA , [
169+ makeStoredEvent ( { t : 1000 , event : "SessionStart" , sid : idA } ) ,
170+ makeStoredEvent ( { t : 2000 , event : "SessionEnd" , sid : idA } ) ,
171+ ] ) ;
172+ writeSession ( idB , [
173+ makeStoredEvent ( { t : 50000 , event : "SessionStart" , sid : idB } ) ,
174+ makeStoredEvent ( { t : 60000 , event : "SessionEnd" , sid : idB } ) ,
175+ ] ) ;
176+
177+ const reversed = await runCli ( "list" , "--reverse" ) ;
178+ expect ( reversed . exitCode ) . toBe ( 0 ) ;
179+ expect ( reversed . stdout . indexOf ( "aaaa1111" ) ) . toBeGreaterThanOrEqual ( 0 ) ;
180+ expect ( reversed . stdout . indexOf ( "bbbb2222" ) ) . toBeGreaterThanOrEqual ( 0 ) ;
181+ expect ( reversed . stdout . indexOf ( "aaaa1111" ) ) . toBeLessThan ( reversed . stdout . indexOf ( "bbbb2222" ) ) ;
182+ expect ( reversed . stdout ) . toContain ( "Total:" ) ;
183+ expect ( reversed . stdout ) . toContain ( "across 2 session(s)" ) ;
184+
185+ // Mirror image: without --reverse, newest (B) comes first.
186+ const forward = await runCli ( "list" ) ;
187+ expect ( forward . stdout . indexOf ( "bbbb2222" ) ) . toBeLessThan ( forward . stdout . indexOf ( "aaaa1111" ) ) ;
188+ } ) ;
189+
190+ test ( "--json --reverse reverses the JSON array (oldest first)" , async ( ) => {
191+ const idA = "aaaa1111-0000-0000-0000-000000000000" ;
192+ const idB = "bbbb2222-0000-0000-0000-000000000000" ;
193+ writeSession ( idA , [
194+ makeStoredEvent ( { t : 1000 , event : "SessionStart" , sid : idA } ) ,
195+ makeStoredEvent ( { t : 2000 , event : "SessionEnd" , sid : idA } ) ,
196+ ] ) ;
197+ writeSession ( idB , [
198+ makeStoredEvent ( { t : 50000 , event : "SessionStart" , sid : idB } ) ,
199+ makeStoredEvent ( { t : 60000 , event : "SessionEnd" , sid : idB } ) ,
200+ ] ) ;
201+
202+ const { exitCode, stdout } = await runCli ( "list" , "--json" , "--reverse" ) ;
203+ expect ( exitCode ) . toBe ( 0 ) ;
204+ const parsed = JSON . parse ( stdout ) ;
205+ expect ( parsed ) . toHaveLength ( 2 ) ;
206+ expect ( parsed [ 0 ] . session_id ) . toBe ( idA ) ;
207+ expect ( parsed [ parsed . length - 1 ] . session_id ) . toBe ( idB ) ;
208+
209+ // Cross-check: exact reverse of the plain --json order.
210+ const forward = await runCli ( "list" , "--json" ) ;
211+ const forwardParsed = JSON . parse ( forward . stdout ) ;
212+ expect ( parsed ) . toEqual ( [ ...forwardParsed ] . reverse ( ) ) ;
213+ } ) ;
214+
215+ test ( "no --reverse flag is byte-identical to today (newest-first)" , async ( ) => {
216+ const idA = "aaaa1111-0000-0000-0000-000000000000" ;
217+ const idB = "bbbb2222-0000-0000-0000-000000000000" ;
218+ writeSession ( idA , [
219+ makeStoredEvent ( { t : 1000 , event : "SessionStart" , sid : idA } ) ,
220+ makeStoredEvent ( { t : 2000 , event : "SessionEnd" , sid : idA } ) ,
221+ ] ) ;
222+ writeSession ( idB , [
223+ makeStoredEvent ( { t : 50000 , event : "SessionStart" , sid : idB } ) ,
224+ makeStoredEvent ( { t : 60000 , event : "SessionEnd" , sid : idB } ) ,
225+ ] ) ;
226+
227+ const { exitCode, stdout } = await runCli ( "list" ) ;
228+ expect ( exitCode ) . toBe ( 0 ) ;
229+ expect ( stdout . indexOf ( "bbbb2222" ) ) . toBeLessThan ( stdout . indexOf ( "aaaa1111" ) ) ;
230+ } ) ;
231+
232+ test ( "empty session list with --reverse still prints 'No sessions found.'" , async ( ) => {
233+ const { exitCode, stdout } = await runCli ( "list" , "--reverse" ) ;
234+ expect ( exitCode ) . toBe ( 0 ) ;
235+ expect ( stdout . trim ( ) ) . toBe ( "No sessions found." ) ;
236+ } ) ;
237+
238+ test ( "empty session list with --json --reverse prints an empty JSON array" , async ( ) => {
239+ const { exitCode, stdout } = await runCli ( "list" , "--json" , "--reverse" ) ;
240+ expect ( exitCode ) . toBe ( 0 ) ;
241+ expect ( JSON . parse ( stdout ) ) . toEqual ( [ ] ) ;
242+ } ) ;
243+
244+ test ( "--reverse with a single session is a no-op (same output as forward)" , async ( ) => {
245+ const id = "cccc3333-0000-0000-0000-000000000000" ;
246+ writeSession ( id , [
247+ makeStoredEvent ( { t : 1000 , event : "SessionStart" , sid : id } ) ,
248+ makeStoredEvent ( { t : 2000 , event : "SessionEnd" , sid : id } ) ,
249+ ] ) ;
250+
251+ const forward = await runCli ( "list" ) ;
252+ const reversed = await runCli ( "list" , "--reverse" ) ;
253+ expect ( reversed . exitCode ) . toBe ( 0 ) ;
254+ expect ( reversed . stdout ) . toBe ( forward . stdout ) ;
255+ } ) ;
256+
257+ test ( "--reverse fully reverses three sessions, not just the endpoints" , async ( ) => {
258+ const idOldest = "aaaa1111-0000-0000-0000-000000000000" ;
259+ const idMiddle = "bbbb2222-0000-0000-0000-000000000000" ;
260+ const idNewest = "cccc3333-0000-0000-0000-000000000000" ;
261+ writeSession ( idOldest , [
262+ makeStoredEvent ( { t : 1000 , event : "SessionStart" , sid : idOldest } ) ,
263+ makeStoredEvent ( { t : 2000 , event : "SessionEnd" , sid : idOldest } ) ,
264+ ] ) ;
265+ writeSession ( idMiddle , [
266+ makeStoredEvent ( { t : 30000 , event : "SessionStart" , sid : idMiddle } ) ,
267+ makeStoredEvent ( { t : 40000 , event : "SessionEnd" , sid : idMiddle } ) ,
268+ ] ) ;
269+ writeSession ( idNewest , [
270+ makeStoredEvent ( { t : 50000 , event : "SessionStart" , sid : idNewest } ) ,
271+ makeStoredEvent ( { t : 60000 , event : "SessionEnd" , sid : idNewest } ) ,
272+ ] ) ;
273+
274+ const { exitCode, stdout } = await runCli ( "list" , "--json" , "--reverse" ) ;
275+ expect ( exitCode ) . toBe ( 0 ) ;
276+ const parsed = JSON . parse ( stdout ) as Array < { session_id : string } > ;
277+ expect ( parsed . map ( ( s ) => s . session_id ) ) . toEqual ( [ idOldest , idMiddle , idNewest ] ) ;
278+ } ) ;
279+
280+ test ( "--reverse with an unknown flag still rejects the unknown flag" , async ( ) => {
281+ const { exitCode, stderr } = await runCli ( "list" , "--reverse" , "--bogus" ) ;
282+ expect ( exitCode ) . toBe ( 1 ) ;
283+ expect ( stderr ) . toContain ( "Unknown flag --bogus" ) ;
284+ } ) ;
159285} ) ;
160286
161287describe ( "cli session resolution" , ( ) => {
0 commit comments