-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprd.json
More file actions
921 lines (921 loc) · 37.1 KB
/
prd.json
File metadata and controls
921 lines (921 loc) · 37.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
{
"project": "TmuxNeovimSimulator",
"branchName": "ralph/full-terminal-simulator",
"description": "Build a fully functional tmux and Neovim simulator for the web. Every shortcut works exactly like real tmux/neovim. Complete terminal emulation with proper state management, visual feedback, and educational learning platform.",
"userStories": [
{
"id": "US-001",
"title": "Core Terminal State Architecture",
"description": "As a developer, I need a robust state management system that properly models tmux sessions/windows/panes and vim buffers with all their properties.",
"acceptanceCriteria": [
"Create src/lib/simulator/types.ts with complete type definitions for: TmuxState (sessions, windows, panes, copy-mode, prefix-state), VimState (buffers, registers, marks, macros, visual-selection, operator-pending, count-prefix, search-state, jumplist, changelist)",
"Each TmuxPane has: id, dimensions (width/height/x/y), content buffer (array of lines), cursor position, title, isZoomed, scrollback history",
"Each VimBuffer has: id, filename, content (lines), cursorLine, cursorCol, mode, modified, readonly, marks (local), folds, syntax highlighting state",
"VimState includes: pendingOperator, pendingCount, pendingRegister, lastCommand (for dot repeat), searchPattern, searchDirection, globalMarks, namedRegisters (a-z, 0-9, \", +, *), recordingMacro, macros (a-z)",
"Create src/lib/simulator/constants.ts with all default values and configuration",
"Typecheck passes"
],
"priority": 1,
"passes": true,
"notes": "Foundation for entire simulator. Must be comprehensive."
},
{
"id": "US-002",
"title": "Vim Motion Engine - Basic Motions",
"description": "As a user, I want all basic vim motions (h/j/k/l, w/b/e/W/B/E, 0/^/$, gg/G, {/}, f/F/t/T, ;/,) to work exactly like real vim.",
"acceptanceCriteria": [
"Create src/lib/simulator/vim/motions.ts with motion functions",
"h/j/k/l move cursor by character/line with proper boundary checking",
"w moves to start of next word, W to next WORD (whitespace-delimited)",
"b moves to start of previous word, B to previous WORD",
"e moves to end of current/next word, E to end of WORD",
"0 goes to column 0, ^ to first non-whitespace, $ to end of line",
"gg goes to first line (or line N with count), G to last line (or line N)",
"{ and } move by paragraph (blank line separated)",
"f{char} finds next char on line, F finds previous, t/T stops before char",
"; repeats last f/F/t/T, comma reverses direction",
"All motions respect count prefix (e.g., 5j moves down 5 lines)",
"Typecheck passes"
],
"priority": 2,
"passes": true,
"notes": ""
},
{
"id": "US-003",
"title": "Vim Motion Engine - Advanced Motions",
"description": "As a user, I want advanced motions (%, [[/]], go-to-line, search motions, marks) to work.",
"acceptanceCriteria": [
"% jumps to matching bracket/paren/brace (implement bracket matching)",
"[[ and ]] jump to previous/next function start (lines starting with { or function/class keyword)",
"[] and ][ jump to previous/next function end",
"H/M/L move to top/middle/bottom of visible screen",
"Ctrl-d/Ctrl-u scroll half page down/up and move cursor",
"Ctrl-f/Ctrl-b scroll full page down/up",
"n/N repeat search forward/backward",
"'a jumps to mark a (line), `a jumps to exact position",
"'' jumps to previous position (jumplist)",
"Ctrl-o/Ctrl-i navigate jumplist backward/forward",
"gi goes to last insert position and enters insert mode",
"gd goes to local declaration (find first occurrence of word under cursor)",
"* and # search for word under cursor forward/backward",
"Typecheck passes"
],
"priority": 3,
"passes": true,
"notes": ""
},
{
"id": "US-004",
"title": "Vim Operators - Delete/Yank/Change",
"description": "As a user, I want operators (d, y, c) to combine with any motion or text object.",
"acceptanceCriteria": [
"Create src/lib/simulator/vim/operators.ts",
"d{motion} deletes text covered by motion and stores in register",
"dd deletes entire line, D deletes to end of line",
"y{motion} yanks text without deleting, yy yanks line, Y yanks line",
"c{motion} deletes and enters insert mode, cc changes line, C changes to end",
"Operators work with counts: d3w deletes 3 words, 3dd deletes 3 lines",
"s substitutes character (delete + insert), S substitutes line",
"x deletes character under cursor, X deletes character before cursor",
"All deleted/yanked text goes to \" register and numbered registers rotate",
"Named registers work: \"ayw yanks word to register a",
"Uppercase register appends: \"Ayw appends to register a",
"Typecheck passes"
],
"priority": 4,
"passes": true,
"notes": ""
},
{
"id": "US-005",
"title": "Vim Text Objects",
"description": "As a user, I want text objects (iw, aw, i\", a\", i(, a(, etc.) to work with operators.",
"acceptanceCriteria": [
"Create src/lib/simulator/vim/textObjects.ts",
"iw/aw for inner/a word (aw includes trailing space)",
"iW/aW for inner/a WORD",
"is/as for inner/a sentence",
"ip/ap for inner/a paragraph",
"i\"/a\" for inner/a double-quoted string",
"i'/a' for inner/a single-quoted string",
"i`/a` for inner/a backtick string",
"i(/a( or ib/ab for inner/a parentheses block",
"i[/a[ for inner/a bracket block",
"i{/a{ or iB/aB for inner/a brace block",
"i</a< for inner/a angle bracket block",
"it/at for inner/a tag block (HTML/XML)",
"Text objects work with all operators: ciw, dap, yi\", etc.",
"Typecheck passes"
],
"priority": 5,
"passes": true,
"notes": ""
},
{
"id": "US-006",
"title": "Vim Insert Mode",
"description": "As a user, I want insert mode to work with all entry points and special keys.",
"acceptanceCriteria": [
"i enters insert before cursor, a after cursor",
"I enters insert at first non-whitespace, A at end of line",
"o opens new line below and enters insert, O opens above",
"gi goes to last insert position and enters insert",
"gI enters insert at column 0",
"Escape exits insert mode (cursor moves left one if not at start)",
"Ctrl-[ also exits insert mode",
"Backspace deletes character before cursor, joins lines if at start",
"Enter creates new line with proper auto-indent",
"Tab inserts tab or spaces based on settings",
"Ctrl-w deletes word before cursor",
"Ctrl-u deletes to start of line",
"Ctrl-t/Ctrl-d indent/dedent current line",
"Ctrl-n/Ctrl-p trigger completion (show message in simulator)",
"Ctrl-r{register} inserts register contents",
"Typecheck passes"
],
"priority": 6,
"passes": true,
"notes": ""
},
{
"id": "US-007",
"title": "Vim Visual Mode",
"description": "As a user, I want visual mode (character, line, block) to work for selection and operations.",
"acceptanceCriteria": [
"v enters character-wise visual mode",
"V enters line-wise visual mode",
"Ctrl-v enters block-wise visual mode",
"All motions extend selection in visual mode",
"o swaps cursor to other end of selection",
"O in block mode moves to other corner",
"gv reselects last visual selection",
"Operators on visual selection: d/y/c delete/yank/change selection",
">/< indent/dedent selected lines",
"~ toggles case of selection",
"u/U lowercase/uppercase selection",
"J joins selected lines",
"Escape cancels visual mode",
"Visual selection is highlighted in UI",
"Typecheck passes"
],
"priority": 7,
"passes": true,
"notes": ""
},
{
"id": "US-008",
"title": "Vim Command Mode",
"description": "As a user, I want ex commands (:w, :q, :s, etc.) to work.",
"acceptanceCriteria": [
"Create src/lib/simulator/vim/commands.ts",
": enters command mode, Escape cancels",
":w simulates write (set modified=false, show message)",
":q simulates quit (show message, don't actually close)",
":wq/:x write and quit",
":q! force quit without save",
":e {file} simulates opening file (create new buffer)",
":{number} goes to line number",
":s/old/new/ substitutes on current line",
":s/old/new/g substitutes all on current line",
":%s/old/new/g substitutes in entire file",
":'<,'>s/old/new/g substitutes in visual selection",
":noh clears search highlighting",
":set shows current settings, :set {option} toggles",
":sp/:vs split horizontal/vertical (integrate with tmux panes)",
"Command history with up/down arrows",
"Tab completion for commands",
"Typecheck passes"
],
"priority": 8,
"passes": true,
"notes": ""
},
{
"id": "US-009",
"title": "Vim Search and Replace",
"description": "As a user, I want / and ? search with highlighting and n/N navigation.",
"acceptanceCriteria": [
"/ enters forward search mode, ? enters backward search",
"Typing pattern updates search in real-time (incremental search)",
"Enter confirms search and jumps to first match",
"Escape cancels search",
"n goes to next match, N to previous",
"All matches are highlighted in buffer",
"Current match has different highlight color",
"Search wraps around file (shows message when wrapping)",
"* searches for word under cursor forward, # backward",
"g* and g# search partial word matches",
"Search pattern stored for n/N repetition",
":noh clears search highlighting",
"Regex patterns work: \\d, \\w, [a-z], etc.",
"Typecheck passes"
],
"priority": 9,
"passes": true,
"notes": ""
},
{
"id": "US-010",
"title": "Vim Registers and Marks",
"description": "As a user, I want registers (a-z, 0-9, \", +, *) and marks (a-z, A-Z) to work.",
"acceptanceCriteria": [
"Create src/lib/simulator/vim/registers.ts",
"\" register is default for yank/delete",
"Numbered registers 0-9: 0 has last yank, 1-9 rotate deletes",
"Named registers a-z: \"ayw yanks to a, \"ap pastes from a",
"Uppercase A-Z appends to register",
"+ and * are clipboard registers (simulate with browser clipboard API)",
"p/P paste from \" register, or specified register",
"Create src/lib/simulator/vim/marks.ts",
"m{a-z} sets local mark, m{A-Z} sets global mark",
"'{mark} jumps to line of mark, `{mark} jumps to exact position",
"'. jumps to last change, `. jumps to exact position of last change",
"'\" jumps to position when last exited buffer",
"'' jumps to previous position",
":marks shows all marks",
":delmarks {mark} deletes mark",
"Typecheck passes"
],
"priority": 10,
"passes": true,
"notes": ""
},
{
"id": "US-011",
"title": "Vim Macros",
"description": "As a user, I want to record and play macros (q{a-z}...q, @{a-z}).",
"acceptanceCriteria": [
"Create src/lib/simulator/vim/macros.ts",
"q{a-z} starts recording to register, q stops recording",
"Status bar shows 'recording @a' while recording",
"All keystrokes are recorded (motions, operators, insert text, commands)",
"@{a-z} plays macro from register",
"@@ repeats last played macro",
"{count}@{a-z} plays macro count times",
"Macros can call other macros",
"Macro execution stops on error",
"Recorded macro stored in register (viewable with :registers)",
"Typecheck passes"
],
"priority": 11,
"passes": true,
"notes": ""
},
{
"id": "US-012",
"title": "Vim Undo/Redo with History Tree",
"description": "As a user, I want full undo/redo with branching history.",
"acceptanceCriteria": [
"Create src/lib/simulator/vim/undo.ts",
"u undoes last change, Ctrl-r redoes",
"Undo tree maintains branches (not just linear)",
"Each change creates new undo state with timestamp",
"g- goes to older state, g+ goes to newer state",
":earlier {time} goes to state from {time} ago",
":later {time} goes to state {time} forward",
":undolist shows undo tree",
"Changes are grouped sensibly (all inserts until Esc = one change)",
". (dot) repeats last change",
"U undoes all changes on current line (line undo)",
"Typecheck passes"
],
"priority": 12,
"passes": true,
"notes": ""
},
{
"id": "US-013",
"title": "Vim Folding",
"description": "As a user, I want code folding to work.",
"acceptanceCriteria": [
"Create src/lib/simulator/vim/folding.ts",
"za toggles fold under cursor",
"zo opens fold, zc closes fold",
"zO opens all folds under cursor recursively",
"zC closes all folds under cursor recursively",
"zR opens all folds in file",
"zM closes all folds in file",
"zm increases fold level, zr decreases",
"zj/zk move to next/previous fold",
"[z moves to start of open fold, ]z to end",
"Folds based on indent level (simulated)",
"Folded lines show fold indicator with line count",
"Typecheck passes"
],
"priority": 13,
"passes": true,
"notes": ""
},
{
"id": "US-014",
"title": "Vim Leader Key System",
"description": "As a user, I want Space as leader key with all leader mappings working.",
"acceptanceCriteria": [
"Create src/lib/simulator/vim/leader.ts",
"Space activates leader mode with timeout (2 seconds)",
"Leader mode shows 'LEADER' in status bar",
"All Space+key sequences trigger appropriate action",
"Space Space - show 'Find files' action",
"Space / - show 'Grep search' action",
"Space e - toggle file explorer panel",
"Space ff/fg/fr/fc/fb - show file finding actions",
"Space gb/gl/gs/gd/gg - show git actions",
"Space sb/sg/sw/sh/sk - show search actions",
"Space tf/tb - show terminal actions",
"Space bd - delete current buffer",
"Space u* - show toggle options (us, uw, ul, ud, etc.)",
"Space ca - show code action message",
"Space vv - show format code message",
"Two-key sequences work: Space g b for git branches",
"Typecheck passes"
],
"priority": 14,
"passes": true,
"notes": ""
},
{
"id": "US-015",
"title": "Vim g-prefix Commands",
"description": "As a user, I want g-prefix commands (gd, gf, gq, etc.) to work.",
"acceptanceCriteria": [
"Create src/lib/simulator/vim/gCommands.ts",
"gg goes to first line",
"gd goes to local definition (first occurrence of word)",
"gD goes to global definition (first occurrence in file)",
"gf goes to file under cursor (show message)",
"gF goes to file:line under cursor",
"gq{motion} formats text (join lines, wrap at textwidth)",
"gw{motion} formats without moving cursor",
"gU{motion} uppercase, gu{motion} lowercase",
"g~ toggles case of motion",
"gv reselects last visual selection",
"gi goes to last insert position",
"gI inserts at column 0",
"gJ joins lines without space",
"g; goes to older change position, g, to newer",
"ga shows ASCII value of character under cursor",
"g8 shows UTF-8 bytes of character",
"Typecheck passes"
],
"priority": 15,
"passes": true,
"notes": ""
},
{
"id": "US-016",
"title": "Vim z-prefix Commands",
"description": "As a user, I want z-prefix commands for scrolling and folding.",
"acceptanceCriteria": [
"zz centers current line on screen",
"zt scrolls current line to top of screen",
"zb scrolls current line to bottom of screen",
"z<Enter> like zt but also moves to first non-blank",
"z- like zb but also moves to first non-blank",
"z. like zz but also moves to first non-blank",
"zH scrolls screen half width left",
"zL scrolls screen half width right",
"zs scrolls screen to put cursor at start",
"ze scrolls screen to put cursor at end",
"Folding commands (za, zo, zc, etc.) already in folding story",
"Typecheck passes"
],
"priority": 16,
"passes": true,
"notes": ""
},
{
"id": "US-017",
"title": "Tmux Core State and Sessions",
"description": "As a user, I want tmux sessions with multiple windows to work.",
"acceptanceCriteria": [
"Create src/lib/simulator/tmux/state.ts",
"Session state: id, name, windows[], activeWindowId, createdAt, lastAttached",
"Window state: id, name, panes[], activePaneId, index, layout",
"Ctrl-a $ renames current session (show prompt)",
"Ctrl-a s lists sessions (show session picker)",
"Ctrl-a ( goes to previous session",
"Ctrl-a ) goes to next session",
"Ctrl-a L switches to last session",
"Ctrl-a d detaches (show detach message)",
":new-session creates new session",
"Status bar shows current session name",
"Typecheck passes"
],
"priority": 17,
"passes": true,
"notes": ""
},
{
"id": "US-018",
"title": "Tmux Window Management",
"description": "As a user, I want complete tmux window management.",
"acceptanceCriteria": [
"Create src/lib/simulator/tmux/windows.ts",
"Ctrl-a c creates new window",
"Ctrl-a & kills current window (with confirmation)",
"Ctrl-a , renames current window (show prompt)",
"Ctrl-a . moves window (show prompt for target index)",
"Ctrl-a w shows window list picker",
"Ctrl-a 0-9 switches to window by number",
"Ctrl-a n goes to next window",
"Ctrl-a p goes to previous window",
"Ctrl-a l goes to last active window",
"Ctrl-a ' prompts for window index",
"Ctrl-a f finds window by name",
"Window indicator in status bar shows all windows with active highlighted",
"Window numbers update when windows are reordered",
"Typecheck passes"
],
"priority": 18,
"passes": true,
"notes": ""
},
{
"id": "US-019",
"title": "Tmux Pane Splitting and Layout",
"description": "As a user, I want pane splitting with proper layout management.",
"acceptanceCriteria": [
"Create src/lib/simulator/tmux/panes.ts",
"Ctrl-a - splits horizontally (top/bottom)",
"Ctrl-a _ splits vertically (left/right)",
"Ctrl-a | also splits vertically",
"Split creates new pane with 50% of current pane size",
"Each pane has independent vim buffer",
"Panes render with visible borders between them",
"Active pane has highlighted border",
"Pane dimensions stored as percentages for responsive layout",
"Minimum pane size enforced (prevent too-small panes)",
"Typecheck passes"
],
"priority": 19,
"passes": true,
"notes": ""
},
{
"id": "US-020",
"title": "Tmux Pane Navigation",
"description": "As a user, I want all pane navigation commands to work.",
"acceptanceCriteria": [
"Ctrl-a h moves to pane on left",
"Ctrl-a j moves to pane below",
"Ctrl-a k moves to pane above",
"Ctrl-a l moves to pane on right",
"Ctrl-a o moves to next pane (cycles)",
"Ctrl-a ; moves to last active pane",
"Ctrl-a q shows pane numbers briefly (2 seconds)",
"While pane numbers showing, pressing number switches to that pane",
"Ctrl-a { swaps with previous pane",
"Ctrl-a } swaps with next pane",
"Ctrl-a ! breaks pane out to new window",
"Pane navigation is spatial (h goes to actual left pane based on geometry)",
"Typecheck passes"
],
"priority": 20,
"passes": true,
"notes": ""
},
{
"id": "US-021",
"title": "Tmux Pane Resizing",
"description": "As a user, I want pane resizing with all resize commands.",
"acceptanceCriteria": [
"Ctrl-a H resizes pane left (reduces width or moves split left)",
"Ctrl-a J resizes pane down",
"Ctrl-a K resizes pane up",
"Ctrl-a L resizes pane right",
"Resize moves split border by fixed amount (e.g., 5% or 20px)",
"Repeated resize commands accumulate",
"Resize respects minimum pane size",
"Ctrl-a z toggles zoom (pane fills entire window)",
"Zoomed pane shows zoom indicator",
"Ctrl-a Space cycles through preset layouts (even-horizontal, even-vertical, main-horizontal, main-vertical, tiled)",
"Typecheck passes"
],
"priority": 21,
"passes": true,
"notes": ""
},
{
"id": "US-022",
"title": "Tmux Copy Mode",
"description": "As a user, I want copy mode with vim-style navigation and selection.",
"acceptanceCriteria": [
"Create src/lib/simulator/tmux/copyMode.ts",
"Ctrl-a [ or Ctrl-a Enter enters copy mode",
"Copy mode shows 'COPY' in status bar",
"All vim motions work in copy mode (h/j/k/l, w/b/e, 0/$, etc.)",
"v starts character-wise selection, V starts line-wise",
"Ctrl-v starts block selection",
"y yanks selection to tmux buffer and exits copy mode",
"Enter also yanks and exits",
"q exits copy mode without copying",
"Escape also exits copy mode",
"/ and ? search within scrollback",
"n/N navigate search matches",
"Selection is visually highlighted",
"Scrollback buffer maintains history of pane output",
"Typecheck passes"
],
"priority": 22,
"passes": true,
"notes": ""
},
{
"id": "US-023",
"title": "Tmux Paste Buffers",
"description": "As a user, I want paste buffer management.",
"acceptanceCriteria": [
"Ctrl-a ] pastes from top buffer",
"Ctrl-a = shows buffer list for selection",
"Ctrl-a # lists paste buffers with preview",
"Ctrl-a - deletes top buffer",
"Multiple buffers stack (new yanks push to top)",
"Buffer list shows buffer number, size, and preview",
"Selecting buffer pastes it into active pane",
"Buffers persist across panes and windows",
"Typecheck passes"
],
"priority": 23,
"passes": true,
"notes": ""
},
{
"id": "US-024",
"title": "Tmux Command Mode",
"description": "As a user, I want tmux command mode (:) to work.",
"acceptanceCriteria": [
"Ctrl-a : enters tmux command mode",
"Shows command prompt at bottom of screen",
"Tab completion for command names",
":new-window creates window",
":split-window splits pane",
":select-pane -L/-R/-U/-D navigates panes",
":resize-pane -L/-R/-U/-D resizes",
":swap-pane swaps panes",
":kill-pane closes pane",
":list-keys shows keybindings",
":show-options shows current options",
"Command history with up/down arrows",
"Escape cancels command input",
"Typecheck passes"
],
"priority": 24,
"passes": true,
"notes": ""
},
{
"id": "US-025",
"title": "Tmux Mouse Support",
"description": "As a user, I want mouse interactions to work when mouse mode is enabled.",
"acceptanceCriteria": [
"Ctrl-a m toggles mouse mode",
"Mouse mode shows indicator in status bar",
"Click on pane selects it",
"Click on window in status bar switches to it",
"Drag pane border to resize",
"Scroll wheel scrolls pane (enters copy mode)",
"Click in copy mode positions cursor",
"Drag in copy mode creates selection",
"Middle-click pastes buffer",
"Right-click shows context menu (optional)",
"Mouse mode off: all clicks passed to application",
"Typecheck passes"
],
"priority": 25,
"passes": true,
"notes": ""
},
{
"id": "US-026",
"title": "Terminal UI - Vim Buffer Rendering",
"description": "As a user, I want the vim buffer display to look like real neovim.",
"acceptanceCriteria": [
"Update src/components/Terminal.tsx for proper rendering",
"Line numbers with proper width (adjust for large files)",
"Current line highlighted with subtle background",
"Cursor renders as block (normal), line (insert), or underline (replace)",
"Cursor blinks in insert mode",
"Visual selection highlighted with distinct color",
"Search matches highlighted",
"Current search match has different highlight",
"Syntax highlighting for JavaScript/TypeScript (keywords, strings, comments, numbers)",
"Status line shows: mode, filename, modified flag, line:col, file percentage",
"Command line area for : / ? commands",
"Messages appear in command line area",
"Typecheck passes",
"Verify in browser using dev-browser skill"
],
"priority": 26,
"passes": true,
"notes": ""
},
{
"id": "US-027",
"title": "Terminal UI - Tmux Chrome",
"description": "As a user, I want tmux window chrome (borders, status bar) to render correctly.",
"acceptanceCriteria": [
"Pane borders render between all panes",
"Active pane border has highlight color",
"Zoomed pane indicator when zoomed",
"Status bar at bottom shows: session name, window list, clock, indicators",
"Window list shows all windows with active highlighted",
"Clock updates in real-time",
"Prefix indicator shows when prefix is active",
"Copy mode indicator when in copy mode",
"Mouse mode indicator when mouse mode on",
"Pane titles shown at top of pane (optional)",
"Status bar style matches tmux aesthetic (green default)",
"Typecheck passes",
"Verify in browser using dev-browser skill"
],
"priority": 27,
"passes": true,
"notes": ""
},
{
"id": "US-028",
"title": "Terminal UI - Pane Layout Engine",
"description": "As a user, I want panes to lay out correctly when split.",
"acceptanceCriteria": [
"Create src/lib/simulator/layout.ts",
"Horizontal split divides pane into top/bottom",
"Vertical split divides pane into left/right",
"Panes resize proportionally when container resizes",
"Complex layouts work: multiple splits create grid",
"Layout algorithm handles arbitrary nesting",
"Minimum pane dimensions enforced",
"Pane borders exactly 1 character wide",
"No gaps or overlaps between panes",
"Layout recalculates on window resize",
"Typecheck passes",
"Verify in browser using dev-browser skill"
],
"priority": 28,
"passes": true,
"notes": ""
},
{
"id": "US-029",
"title": "Keyboard Input System",
"description": "As a user, I want all keyboard input to be captured correctly.",
"acceptanceCriteria": [
"Update src/components/KeyboardHandler.tsx",
"Terminal div is focusable and auto-focuses",
"Clicking terminal focuses it",
"All printable characters captured",
"Modifier keys detected: Ctrl, Shift, Alt, Meta",
"Special keys: Escape, Tab, Enter, Backspace, Delete, Arrow keys",
"Function keys F1-F12 captured",
"Key repeat works correctly",
"Ctrl-c and Ctrl-v still work for system clipboard",
"Other Ctrl combinations captured for vim/tmux",
"Key events don't bubble to cause browser actions",
"Focus indicator visible when terminal focused",
"Typecheck passes"
],
"priority": 29,
"passes": true,
"notes": ""
},
{
"id": "US-030",
"title": "Key Sequence Display",
"description": "As a user, I want to see what keys I'm pressing for learning.",
"acceptanceCriteria": [
"Update src/components/KeyboardVisualizer.tsx",
"Show last 5 keystrokes with timestamps",
"Keys styled to look like keyboard keys",
"Modifier keys shown: Ctrl+a, Shift+G, etc.",
"Special keys show names: Esc, Tab, Enter, Space",
"Pending operator shows: d-, y-, c-",
"Leader key shows: <Space>-",
"Tmux prefix shows: <Prefix>-",
"Fade out old keys after 3 seconds",
"Current sequence highlighted",
"Typecheck passes",
"Verify in browser using dev-browser skill"
],
"priority": 30,
"passes": true,
"notes": ""
},
{
"id": "US-031",
"title": "File Explorer Panel",
"description": "As a user, I want a Neo-tree style file explorer.",
"acceptanceCriteria": [
"Create src/components/FileExplorer.tsx",
"F9 or Space e toggles file explorer panel",
"Panel slides in from left side",
"Shows file tree with folder icons",
"Folders expandable/collapsible",
"Current file highlighted",
"Enter opens file in buffer",
"a creates new file, A creates directory",
"d deletes file (with confirmation)",
"r renames file",
"y copies filename, Y copies path",
"x cuts, p pastes",
"H toggles hidden files",
"/ searches in tree",
"q closes panel",
"Navigation with j/k",
"Typecheck passes",
"Verify in browser using dev-browser skill"
],
"priority": 31,
"passes": true,
"notes": ""
},
{
"id": "US-032",
"title": "Simulated File System",
"description": "As a user, I want a simulated file system for the demo.",
"acceptanceCriteria": [
"Create src/lib/simulator/filesystem.ts",
"In-memory file system with directory structure",
"Pre-populated with sample project files",
"Files have content (sample code in various languages)",
"Directories: src/, tests/, docs/, config/",
"Sample files: main.ts, utils.ts, types.ts, README.md, package.json",
"File operations update in-memory state",
"New files can be created",
"Files can be renamed, deleted",
"Content persisted in session (not localStorage for now)",
"Typecheck passes"
],
"priority": 32,
"passes": true,
"notes": ""
},
{
"id": "US-033",
"title": "Multiple Buffer Support",
"description": "As a user, I want to work with multiple buffers.",
"acceptanceCriteria": [
":e {file} opens file in new buffer",
":ls lists all open buffers",
":b {number} switches to buffer by number",
":b {name} switches to buffer by name (partial match)",
":bn goes to next buffer",
":bp goes to previous buffer",
":bd closes current buffer",
":bd! force closes without save",
"Ctrl-6 or Ctrl-^ toggles between last two buffers",
"Space , shows buffer picker",
"Modified buffers show indicator",
"Buffer list shows in status or picker",
"Closing last buffer opens empty buffer",
"Typecheck passes"
],
"priority": 33,
"passes": true,
"notes": "Buffer commands implemented in vim/commands.ts"
},
{
"id": "US-034",
"title": "Command Palette / Picker UI",
"description": "As a user, I want a fuzzy picker for files, buffers, commands.",
"acceptanceCriteria": [
"Create src/components/Picker.tsx",
"Picker appears as modal overlay",
"Fuzzy search input at top",
"List of items with highlighting of matched characters",
"j/k or arrows navigate list",
"Enter selects item",
"Escape closes picker",
"Preview pane shows file content (optional)",
"Different modes: files, buffers, commands, git branches",
"Space Space opens file picker",
"Space / opens grep picker (search input)",
"Space : opens command picker",
"Typecheck passes",
"Verify in browser using dev-browser skill"
],
"priority": 34,
"passes": true,
"notes": ""
},
{
"id": "US-035",
"title": "Lesson System Integration",
"description": "As a user, I want lessons that validate my keystrokes against the simulator.",
"acceptanceCriteria": [
"Update lesson system to work with new simulator",
"Lessons can specify expected state changes, not just keystrokes",
"validateState function checks simulator state",
"Step can require: cursor position, mode, buffer content, pane count",
"Success feedback shows when step completed",
"Progress bar tracks lesson completion",
"Skip button moves to next step",
"Reset button restores initial state for current lesson",
"Lessons work in both tmux and vim contexts",
"Typecheck passes",
"Verify in browser using dev-browser skill"
],
"priority": 35,
"passes": true,
"notes": ""
},
{
"id": "US-036",
"title": "Practice Mode - Free Typing",
"description": "As a user, I want a practice mode to freely use the simulator.",
"acceptanceCriteria": [
"Update /practice page",
"Full simulator without lesson constraints",
"Sample code files pre-loaded",
"Shortcut reference panel toggle",
"Key visualizer always visible",
"Can create splits, windows, sessions",
"All vim and tmux commands work",
"No validation or step tracking",
"Reset button clears to default state",
"Typecheck passes",
"Verify in browser using dev-browser skill"
],
"priority": 36,
"passes": true,
"notes": ""
},
{
"id": "US-037",
"title": "Reference Page with Search",
"description": "As a user, I want a searchable reference of all shortcuts.",
"acceptanceCriteria": [
"Update /reference page",
"All 349+ shortcuts listed and categorized",
"Search input filters shortcuts",
"Categories: tmux, vim-motions, vim-operators, vim-commands, leader-keys",
"Each shortcut shows: keys, description, context (tmux/vim)",
"Click on shortcut shows more detail",
"Keyboard-navigable list",
"Typecheck passes",
"Verify in browser using dev-browser skill"
],
"priority": 37,
"passes": true,
"notes": ""
},
{
"id": "US-038",
"title": "Comprehensive Test Suite",
"description": "As a developer, I want tests for all simulator functionality.",
"acceptanceCriteria": [
"Create src/lib/simulator/__tests__/motions.test.ts",
"Create src/lib/simulator/__tests__/operators.test.ts",
"Create src/lib/simulator/__tests__/textObjects.test.ts",
"Create src/lib/simulator/__tests__/tmux.test.ts",
"Test all vim motions with edge cases",
"Test all operators with motions and text objects",
"Test tmux pane/window operations",
"Test mode transitions",
"Test undo/redo",
"Test registers and marks",
"Tests pass",
"Typecheck passes"
],
"priority": 38,
"passes": true,
"notes": ""
},
{
"id": "US-039",
"title": "Performance Optimization",
"description": "As a user, I want the simulator to be fast and responsive.",
"acceptanceCriteria": [
"Key input to visual update < 16ms (60fps)",
"Large file (1000+ lines) renders smoothly",
"Virtual scrolling for long files",
"Memoized components prevent unnecessary rerenders",
"State updates are minimal and targeted",
"No layout thrashing during pane resize",
"Debounced search input",
"Typecheck passes"
],
"priority": 39,
"passes": true,
"notes": ""
},
{
"id": "US-040",
"title": "Mobile Responsive Layout",
"description": "As a user, I want basic usability on tablet/mobile.",
"acceptanceCriteria": [
"Terminal scales to fit screen width",
"Touch to focus terminal",
"On-screen keyboard triggers for insert mode",
"Panes stack vertically on narrow screens",
"Status bars remain visible",
"Minimum touch target sizes met",
"Lesson panel collapses on small screens",
"Typecheck passes",
"Verify in browser using dev-browser skill"
],
"priority": 40,
"passes": true,
"notes": ""
}
]
}