-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathtasks.json
More file actions
1009 lines (1009 loc) · 75.6 KB
/
tasks.json
File metadata and controls
1009 lines (1009 loc) · 75.6 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
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"_frame_metadata": {
"purpose": "Task tracking for the project",
"forClaude": "Check this file to understand what tasks are pending, in progress, or completed. Update task status as you work. Add new tasks when discovered during development. Follow the task recognition rules in CLAUDE.md. IMPORTANT: Include userRequest (original user prompt), detailed description, and acceptanceCriteria for each task.",
"lastUpdated": "2026-01-25",
"generatedBy": "Frame"
},
"project": "Frame",
"version": "2.0",
"lastUpdated": "2026-05-01T00:00:00Z",
"taskSchema": {
"_comment": "This schema shows the expected structure for each task",
"id": "unique-id (task-xxx format)",
"title": "Short actionable title (max 60 chars)",
"description": "Claude's detailed explanation - what, how, which files affected",
"userRequest": "Original user prompt/request - copy verbatim",
"acceptanceCriteria": "When is this task done? Concrete testable criteria",
"notes": "Discussion notes, alternatives considered, dependencies (optional)",
"status": "pending | in_progress | completed",
"priority": "high | medium | low",
"category": "feature | fix | refactor | docs | test",
"context": "Session date and context",
"createdAt": "ISO timestamp",
"updatedAt": "ISO timestamp",
"completedAt": "ISO timestamp | null"
},
"tasks": [
{
"id": "task-discuss-button",
"title": "Discuss button on task cards (LLM-driven field flesh-out)",
"description": "Add a 'Discuss' button to each task card in tasksDashboard. Click flow: terminalManager.createTerminal() opens a fresh terminal so the discussion has clean context, the user's selected AI tool is launched (via aiToolManager), an output sniffer waits for the AI's ready signal (Claude Code's `╭` prompt pattern, with a 5s failsafe timeout), then a templated prompt is injected via terminalManager.sendCommand(). The prompt lists current task fields (marking empty ones) and instructs the AI to discuss them with the user one question at a time, then Edit tasks.json directly with the agreed values — the IPC ADD_TASK path strips userRequest/acceptanceCriteria/notes, so direct file edit is the only persistence route; tasksManager.js's existing fs.watch auto-syncs the UI. Adds an `isDiscussed: boolean` field to the task schema; cards show a 'Discussed with AI' badge when true. If isDiscussed is already true, the template branches: AI recaps the existing fields in 2-3 sentences and asks whether to refine further or close. New terminal's tab title is `Discuss: <task-title>` truncated to ~40 chars. Terminal stays open after the discussion. Files affected: src/renderer/tasksDashboard.js (handler + button + badge render), src/renderer/styles/components/tasks-dashboard.css (button + badge), tasks.json _comment (document isDiscussed). No new IPC, no new dependencies — reuses existing terminalManager, aiToolManager, and fs.watch sync.",
"userRequest": "User said: Peki card üzerine discuss diye bir buton ekleyip AI'ya Discuss diye bir job tanımlatsak ve eğer bu notes, acceptance criteria vs gibi alanlar boşsa AI bunları belirleyene kadar user'la konuşup sonra bunları kaydedeyim mi vs gibi birşey dese ya da farklı bir logic bu mümkün mü? — followed by: discuss butonu yeni bir terminalde açılmalı çünkü yeni bir context başlatmalı — followed by: B methodunu yapalım ama başlamadan önce bir iki konu daha var. Bence tasks.json'daki task formatına isDiscussed diye bir field da eklememiz lazım. Bunu hem card içinde bir label olarak gösterebiliriz (Discussed with AI) şeklinde. Case buysa tabi ki yine de tetiklenebilir ama daha önce discussed ise kullandığımız agent bize daha önceki tartışma özetini döküp tartışmaya devam etmek ister miyiz onu tekrar sormalı.",
"acceptanceCriteria": "Discuss button visible on each task card in tasksDashboard. Click creates a new terminal (not reusing existing), launches the selected AI tool, waits for ready signal (`╭` pattern with 5s failsafe), then injects the context-aware template via existing sendCommand API. Tab title is `Discuss: <task-title>` truncated to ~40 chars. Terminal stays open after the conversation. New `isDiscussed` boolean field persisted on tasks; AI sets it true on save. Card shows 'Discussed with AI' badge when true. Re-clicking on a discussed task triggers the recap-then-confirm template branch (AI summarizes existing fields, asks whether to refine or close). Button disabled with tooltip when no AI tool is selected.",
"notes": "Approach decisions captured during design session: (1) Fresh terminal chosen over injecting into existing active terminal — clean context per discuss session, requested by user. (2) AI-ready detection: output sniffer (B method) chosen over fixed delay (A method) for reliability; 5s failsafe timeout prevents trapping. Pattern map should be extensible per AI tool in aiToolManager (claude vs aider vs others) but v1 only handles Claude Code's `╭`. (3) No separate `discussionSummary` field — existing userRequest/acceptanceCriteria/notes ARE the discussion artifacts; AI reads them on re-discuss and recaps. (4) Backend tasksManager.addTask() does not know about isDiscussed — AI persists it via direct Edit on tasks.json, same path used today for userRequest/acceptanceCriteria/notes. (5) Command Palette integration (task.discuss) discussed but deferred: registry's run() takes no args, would need a secondary task picker; card button covers v1. (6) Considered an in-panel mini chat (separate Anthropic API call) — rejected as overweight; reuses existing terminal + AI tool infra. (7) Template keeps `isDiscussed: true` across subsequent refine sessions; once true, stays true. (8) Related to but distinct from task-claude-detect (pending) — that work would replace the heuristic pattern detection with proper Claude Code state detection.",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-29 - Tasks panel: Discuss button design",
"createdAt": "2026-04-29T18:00:00Z",
"updatedAt": "2026-04-29T18:00:00Z",
"completedAt": null
},
{
"id": "task-pn",
"title": "PROJECT_NOTES.md kurallarini belirle",
"description": "PROJECT_NOTES.md icin guncelleme kurallari ve CLAUDE.md'ye eklenecek detayli talimatlari belirle",
"status": "pending",
"priority": "medium",
"category": "docs",
"context": "Session 2026-01-24 - Frame dokuman sistemi",
"createdAt": "2026-01-24T16:00:00Z",
"updatedAt": "2026-01-24T16:30:00Z",
"completedAt": null
},
{
"id": "task-s5",
"title": "Session-based prompt logging",
"description": "Log prompts only when Claude is active",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "todos.json - shortTerm",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-01-24T16:30:00Z",
"completedAt": null
},
{
"id": "task-m6",
"title": "Claude Code chat sidebar",
"description": "Dedicated UI for Claude Code interactions",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "todos.json - mediumTerm",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-01-24T16:30:00Z",
"completedAt": null
},
{
"id": "task-rm",
"title": "README.md kurallarini belirle",
"description": "README.md icin guncelleme kurallari ve CLAUDE.md'ye eklenecek detayli talimatlari belirle",
"status": "pending",
"priority": "low",
"category": "docs",
"context": "Session 2026-01-24 - Frame dokuman sistemi",
"createdAt": "2026-01-24T16:00:00Z",
"updatedAt": "2026-01-24T16:30:00Z",
"completedAt": null
},
{
"id": "task-struct-desc",
"title": "Improve description parsing in structure script",
"description": "update-structure.js currently parses file descriptions as single letters. Fix extractDescription() to properly extract JSDoc comments and multi-line descriptions.",
"status": "pending",
"priority": "low",
"category": "fix",
"context": "Session 2026-01-25 - Structure auto-update script",
"createdAt": "2026-01-25T00:00:00Z",
"updatedAt": "2026-01-25T00:00:00Z",
"completedAt": null
},
{
"id": "task-struct-graph",
"title": "STRUCTURE.json function call graph",
"description": "Add function call relationships to STRUCTURE.json (e.g., functionA calls functionB). This creates a dependency tree that helps Claude navigate code more efficiently.",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "Session 2026-01-25 - Token efficiency discussion",
"createdAt": "2026-01-25T00:00:00Z",
"updatedAt": "2026-01-25T00:00:00Z",
"completedAt": null
},
{
"id": "task-claude-detect",
"title": "Detect if Claude Code is actually running",
"description": "Currently we track claudeCodeRunning with a simple boolean. Improve detection to actually check if Claude Code is running in terminal (parse terminal output for Claude prompt patterns).",
"status": "pending",
"priority": "low",
"category": "feature",
"context": "Session 2026-01-25 - Task delegation feature",
"createdAt": "2026-01-25T00:00:00Z",
"updatedAt": "2026-01-25T00:00:00Z",
"completedAt": null
},
{
"id": "task-model-router",
"title": "Local proxy for model routing (cost + limit optimization)",
"description": "Build a local HTTP proxy server that Frame starts on launch and injects via ANTHROPIC_BASE_URL when spawning Claude Code. The proxy intercepts API requests, analyzes the message content, and routes to the appropriate model: simple tasks (file reads, searches, short questions) → Haiku, code writing/editing → Sonnet, architecture/complex features → Opus. Routing decision can be made via a fast Haiku classification call or rule-based heuristics (token count, task category from active tasks.json, keywords). Files affected: src/main/modelRouter.js (new), src/main/ptyManager.js (inject env var), src/main/index.js (start proxy on app launch), settings panel for configuration.",
"userRequest": "User said: ben acaba senin içine bir katman koyabilir miyim. basit işleri mesela çok ucuz bir modele gitmeni sağlayabilir miyim? — motivated by both API cost savings and subscription usage limits (hitting weekly limit means 3h wait; routing simple tasks to Haiku preserves credits for complex work).",
"acceptanceCriteria": "Frame starts a local proxy on launch. ANTHROPIC_BASE_URL is set to proxy when Claude Code is spawned. Simple requests are routed to Haiku, complex ones to Sonnet/Opus. Works with both API key and subscription auth. User can configure routing rules or disable in settings.",
"notes": "ANTHROPIC_BASE_URL is the interception point — Claude Code respects this env var. For subscription users the benefit is usage limit preservation, not token cost. Auth forwarding (OAuth tokens for subscription) needs careful handling. Rule-based routing is simpler and more predictable than a learned router. Could use active task category/priority from tasks.json as a routing signal.",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "Session 2026-03-27 - Model routing discussion",
"createdAt": "2026-03-27T00:00:00Z",
"updatedAt": "2026-03-27T00:00:00Z",
"completedAt": null
},
{
"id": "task-s1",
"title": "Click file in tree -> run cat command",
"description": "When user clicks a file in the tree, display its contents in terminal",
"status": "pending",
"priority": "high",
"category": "feature",
"context": "todos.json - shortTerm",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-01-24T23:15:10.001Z",
"completedAt": null
},
{
"id": "task-refactor-panels-css",
"title": "Split panels.css into per-panel files",
"description": "src/renderer/styles/components/panels.css has grown to 4339 lines and now contains styles for every panel (history, tasks, plugins, github, overview, structure map, prompts, spotlight). Split into per-panel files (e.g. tasks-panel.css, github-panel.css, plugins-panel.css, history-panel.css, overview-panel.css, structure-map.css, prompts-panel.css, spotlight.css) and import them from main.css. Shared panel chrome (headers, collapse buttons, common modal patterns) stays in a smaller panels-shared.css.",
"userRequest": "User asked for total LOC of the project on 2026-04-26; in the report panels.css stood out as a 4339-line monolith and the user said: tasklara ekleyebilir misin? — referring to the suggestion of splitting it.",
"acceptanceCriteria": "panels.css is replaced by ~7 panel-scoped CSS files plus a panels-shared.css; main.css imports all of them in a sensible order; no visual regressions in any panel; total CSS line count is roughly the same (no dead code introduced).",
"notes": "Pure structural refactor, zero behavior change. Good candidate to do alongside the microcopy/string-extraction task since both are sweeps across the renderer surface. Should NOT be bundled with feature work.",
"status": "pending",
"priority": "low",
"category": "refactor",
"context": "Session 2026-04-26 - LOC review surfaced panels.css as a monolith",
"createdAt": "2026-04-26T14:30:00Z",
"updatedAt": "2026-04-26T14:30:00Z",
"completedAt": null
},
{
"id": "task-prod-keybinding-remap",
"title": "Custom keybinding remap UI",
"description": "Allow users to remap any registered shortcut from a Settings > Keybindings screen. Persist to a keybindings.json. Conflict detection. Builds on the central action registry from Command Palette.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Settings > Keybindings lists every action; user can record a new keystroke; conflicts are flagged; reset-to-default works; persists across restarts.",
"notes": "Hard requirement for power users (Vim/Emacs-style preferences). Depends on action registry.",
"status": "pending",
"priority": "low",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-empty-states",
"title": "Empty-state design pass",
"description": "Design and implement consistent empty states across the app: no projects, no tasks, no PRs, no plugins, no commits, no terminals. Each empty state should have an illustration/icon, one-line context, and a primary call-to-action.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Every list/panel in the app has a designed empty state with CTA; visual style is consistent; copy is reviewed.",
"notes": "Empty states are where the product's character shows the most.",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-window-restore",
"title": "Window & layout state persistence",
"description": "Restore on launch: window size & position, last opened project, panel visibility (sidebar, github, plugins, history, tasks), terminal grid layout, active terminal, theme. Centralize layout state into a single workspace-state.json managed in main.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Closing and reopening the app brings back the exact prior state; per-project layout memory; works across multi-monitor setups.",
"notes": "Sidebar-hidden state already persists in localStorage but it's fragmented — unify everything.",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-crash-reporting",
"title": "Crash reporting (Sentry / Bugsnag)",
"description": "Integrate a crash reporter in both main and renderer. Capture stack traces, app version, OS, anonymized session id. Opt-in toggle in Settings, transparent privacy notice.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Renderer JS errors and main process uncaught exceptions reach the dashboard; PII scrubbed; user can disable in Settings; first-run prompt asks for consent.",
"notes": "Without this, production bugs are invisible. Sentry's Electron SDK covers both processes.",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-diagnostic-export",
"title": "Diagnostic / log bundle export",
"description": "Help > Export Diagnostics generates a zip with main+renderer logs, app version, OS, settings (sans secrets), recent error events. Pre-attached when the user files a bug.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Single click produces a zip; secrets/tokens scrubbed; bundled file is opened in Finder/Explorer; documented in CONTRIBUTING.",
"notes": "Multiplies bug-report quality from users — fewer 'doesn't work for me' tickets.",
"status": "pending",
"priority": "low",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-brand-audit",
"title": "Brand consistency audit",
"description": "Audit and unify visual identity across: app icon, splash screen, dock badge, tray icon, notification icon, favicon, README hero, frame.cool landing, OG images, social preview. Single brand kit (logo, type, color tokens) consumed by both app and landing.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "All surfaces use the same logo/colors/typography; brand kit lives in one place (e.g. /brand or /assets/brand); landing and app feel like the same product.",
"notes": "Cheap but high-impact; first impression in App Store-style listings depends on it.",
"status": "pending",
"priority": "low",
"category": "docs",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-microcopy",
"title": "Microcopy & tone-of-voice pass",
"description": "Sweep every user-facing string: error messages, empty states, tooltips, button labels, dialog titles. Establish a tone-of-voice guide and rewrite inconsistencies. Centralize strings to ease future i18n.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "All strings reviewed; tone guide documented; obvious inconsistencies fixed; strings extracted to a single module.",
"notes": "String extraction here is the natural prerequisite for i18n.",
"status": "pending",
"priority": "low",
"category": "refactor",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-i18n",
"title": "i18n infrastructure (TR / EN)",
"description": "Set up i18n framework (i18next or similar). Extract all strings to locale files. Ship TR + EN initially. Language selector in Settings; default from OS locale.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Switching language updates all UI without restart; missing keys fall back to EN; new strings added in code automatically appear in default locale file.",
"notes": "Depends on microcopy/string-extraction pass.",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-a11y",
"title": "Accessibility pass (a11y)",
"description": "Keyboard-only navigation through every panel; visible focus rings; ARIA roles/labels; color contrast audit; screen-reader smoke test (VoiceOver). Particularly important since the user base is dev-tool focused — many use keyboard exclusively.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Every interactive element reachable via Tab; visible focus state; AXE audit passes with no critical issues; basic VoiceOver test completes happy path.",
"notes": "Quick wins early (focus rings, ARIA on buttons); deeper screen-reader work later.",
"status": "pending",
"priority": "low",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-detach-window",
"title": "Detach panel / multi-monitor support",
"description": "Allow popping a terminal or panel out into a separate window. Especially valuable for multi-monitor power users running long agents on one screen and editing on another.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Right-click a tab/panel > Detach; new BrowserWindow opens with shared IPC state; closing detaches re-attaches or disposes cleanly; window position remembered per project.",
"notes": "Larger architectural change — needs IPC state sharing across windows. Park for later but useful to have on the list.",
"status": "pending",
"priority": "low",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-account-sync",
"title": "Account & settings sync layer",
"description": "Identity layer (email + magic link or OAuth). Sync settings, project list, keybindings across devices. Foundation for paid tier even if launch is free.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Sign-in flow works; settings sync verified across two devices; signed-out users keep current local-only experience.",
"notes": "Adding identity later costs ~10x more than designing for it now. Even if not exposed in MVP, the abstractions matter.",
"status": "pending",
"priority": "low",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-licensing",
"title": "License / entitlement layer",
"description": "Foundation for free vs pro tiers: feature flags gated by entitlement, license validation hook. No actual paid features yet — just the plumbing.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "isFeatureEnabled(flag) API exists; default 'all free'; entitlement source configurable (local file / remote); covered by tests.",
"notes": "Depends on account/sync. Premature optimization risk — only build when monetization is on the roadmap.",
"status": "pending",
"priority": "low",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-legal",
"title": "Privacy policy, EULA & terms",
"description": "Author Privacy Policy (covers telemetry, crash reports, account data), EULA, Terms of Service. Link from About dialog and frame.cool footer.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Three docs exist in repo and on landing; About dialog links to them; first-run telemetry consent references the privacy doc.",
"notes": "Legal review recommended before paid tier or App Store distribution.",
"status": "pending",
"priority": "low",
"category": "docs",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-e2e",
"title": "E2E test infrastructure (Playwright)",
"description": "Set up Playwright for Electron with a smoke suite: launch app, open project, start AI session, open each panel, create/close terminal, verify no console errors. Run on PRs.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Smoke suite runs locally and in CI; failure blocks PR merge; <2 min runtime; covers happy path of core flows.",
"notes": "Manual QA matrix is unsustainable as panels and AI tools multiply. Even a thin smoke suite catches most regressions.",
"status": "pending",
"priority": "medium",
"category": "test",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-prod-changelog",
"title": "In-app changelog / What's New",
"description": "On version bump, show a 'What's New' modal with the latest release notes. Reachable any time from Help menu. Source from a structured CHANGELOG.md.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim — 2026-04-26 product audit.",
"acceptanceCriteria": "Updating to a new version surfaces release notes once; user can dismiss; reopen via Help; CHANGELOG.md is the single source.",
"notes": "Pairs naturally with auto-update UX polish.",
"status": "pending",
"priority": "low",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T12:00:00Z",
"completedAt": null
},
{
"id": "task-s4",
"title": "Resizable sidebar",
"description": "Allow users to drag and resize the sidebar width",
"status": "in_progress",
"priority": "medium",
"category": "feature",
"context": "todos.json - shortTerm",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-01-24T23:22:41.232Z",
"completedAt": null
},
{
"id": "task-sysprompt",
"title": "System prompt standardization",
"description": "Standardize all system-generated prompts (task delegation, automated commands) to English. Create a centralized prompt template system. frame projesinde oluşturulan içerideki dökümanlarımız, claude md, readme, projectnotes md dosyaları ingilizce olmalı. şu an bu projede bulunan içerik türkçeyse içerik anlamını kaybetmeden ingilizceye çevrilmeli. bundan sonra initialize edilen projelerde bu dosyalarda hazırladığımız direktifler ise ingilizce olarak gelmeli.",
"status": "in_progress",
"priority": "medium",
"category": "feature",
"context": "Session 2026-01-25 - Task delegation feature",
"createdAt": "2026-01-25T00:00:00Z",
"updatedAt": "2026-01-25T22:51:37.595Z",
"completedAt": null
},
{
"id": "task-s3",
"title": "Search in files",
"description": "Basic file search functionality within project",
"status": "in_progress",
"priority": "medium",
"category": "feature",
"context": "todos.json - shortTerm",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-01-24T23:22:23.000Z",
"completedAt": null
},
{
"id": "task-reverse-deps",
"title": "Add reverse dependency analysis to intentIndex",
"description": "Extend update-structure.js to track which modules import each file (reverse dependencies). Currently the 'depends' field only captures outgoing imports. Adding reverse lookups would let the intentIndex surface implicit coupling between differently-named modules — e.g. a React component and the API route it calls. Implementation: after parsing all modules, build a reverse map (file → who imports it) and store it as 'usedBy' per module in STRUCTURE.json.",
"userRequest": "User said: bunu düşünebiliriz evet, istersen tasklara ekleyelim — following a HN comment about implicit coupling not being captured by the current naming-based intentIndex.",
"acceptanceCriteria": "Each module in STRUCTURE.json has a 'usedBy' array listing modules that import it. find-module.js deep search (tier 3) also searches usedBy relationships. Tested on at least one cross-feature dependency case.",
"notes": "Dynamic code and reflection are out of scope — those can't be resolved statically. This only covers explicit import/require coupling. Embeddings were discussed but ruled out due to cost and complexity.",
"status": "in_progress",
"priority": "medium",
"category": "feature",
"context": "Session 2026-03-19 - HN post discussion on intentIndex edge cases",
"createdAt": "2026-03-19T00:00:00Z",
"updatedAt": "2026-04-24T12:50:58.600Z",
"completedAt": null
},
{
"id": "task-prod-autoupdate-ux",
"title": "Update notification UX (sidebar dot + About panel)",
"description": "v1 polish on top of the existing GitHub-Releases update checker (kept untouched). Adds: (1) periodic recheck every 6h while app is open, (2) sidebar header pulsing dot when update available, click opens Settings, (3) About section in Settings with current version, last-checked timestamp, manual 'Check for Updates' button, release notes link (opens GitHub), and 'Dismiss this version' (suppresses sidebar dot for that version), (4) Command Palette 'Check for Updates' entry. Existing terminal-tab bell mechanism preserved as a complementary signal.",
"userRequest": "User said: ya bir de bildirim mekanızması eklemiştik … onu bir inceler misin? — followed by: senin about eklemeni de ekleyelim. yeni versiyon varsa bir de bildirim ışığı gibi bişey ekleyelim mi?",
"acceptanceCriteria": "Sidebar dot appears on update available; click opens Settings; About section shows version + last-checked + status; Check Now triggers manual check; Dismiss persists per version and hides the dot for that version; periodic recheck runs every 6h; Command Palette entry works.",
"notes": "Real auto-update (electron-updater style: download in background + restart-to-install) is a separate larger feature that requires code-signing infra; explicitly out of scope here. The bell in terminal tab bar still opens the GitHub release page directly — kept untouched per user request.",
"status": "completed",
"priority": "low",
"category": "feature",
"context": "Session 2026-04-28 - Telemetry + Settings + Update UX",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-28T17:00:00Z",
"completedAt": "2026-04-28T17:00:00Z"
},
{
"id": "task-prod-telemetry",
"title": "Anonymous launch telemetry (Aptabase)",
"description": "v1: count active users via a single anonymous `app_started` event per launch. Backend gateway is Aptabase (open source, EU region, write-only public key hardcoded as design intends). Default ON (opt-out). User can disable from a new Settings panel; a one-time top-of-app banner explains what's collected. Auto-attached props by Aptabase: app version, OS, anonymous device ID. We send no PII, no file paths, no prompt content, no code.",
"userRequest": "User said: ben pr atıyorum 20 unique clone geliyor … bu 35 kişi kullanıyor anlamına gelmiyor — followed by: bence b yapalım, ne yağtığımızı söyleyelim, settingsten isterse kapatabileceğini söyleyelim. yukarı menüye settings item ı da ekleyelim.",
"acceptanceCriteria": "App sends app_started on launch when enabled; Settings toggle persists state via userSettings + IPC + telemetry.setEnabled; one-time banner shown on first launch and dismissable; Aptabase dashboard shows DAU/MAU/retention; PRIVACY.md documents what's collected.",
"notes": "Approach is opt-out with explicit disclosure (not strict opt-in) so we can see actual user counts; user has full control via Settings. Aptabase EU app key A-EU-5590504973 hardcoded — public identifier with write-only permissions, sector standard. Crash reporting (task-prod-crash-reporting) deliberately stays separate.",
"status": "completed",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-28 - Telemetry v1",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-28T16:00:00Z",
"completedAt": "2026-04-28T16:00:00Z"
},
{
"id": "task-m5",
"title": "Settings panel (v1: minimal)",
"description": "Minimal Settings modal as the home for renderer-side preferences. v1 ships one section (Privacy & Analytics) with the telemetry toggle. Triggered by macOS Frame > Preferences (Cmd+,), Windows/Linux File > Settings (Ctrl+,), and Command Palette `settings.open`. Future settings (theme, AI tool defaults, keybinding remap) plug into the same modal.",
"userRequest": "User said: yukarı menüye settings item ı da ekleyelim. oradan kapatabilsin — captured during 2026-04-28 telemetry conversation.",
"acceptanceCriteria": "Cmd+, opens Settings; toggle persists via userSettings; menu item works on macOS and Windows/Linux; reachable via Command Palette.",
"notes": "Built alongside telemetry because that toggle is the first real setting. Skeleton is in place — adding theme/AI defaults/etc later is a few extra rows in the same modal.",
"status": "completed",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-28 - Settings UI v1",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-04-28T16:00:00Z",
"completedAt": "2026-04-28T16:00:00Z"
},
{
"id": "task-m2",
"title": "Git status integration (file tree decoration)",
"description": "v1: decorate the sidebar file tree with git status colors. New gitStatusManager (main) runs `git status --porcelain=v1 -z` for the active project on a 5s poll, parses output, pushes to renderer via GIT_STATUS_DATA. Renderer maps each file's relative path to a status classification (modified / added / untracked / deleted / renamed / conflict / ignored) and applies a CSS class to the .file-item. Folders containing any changed descendant get a 'git-has-changes' rollup class. Diff viewer, staged-files panel, and stage/discard actions are explicitly out of scope for v1 — they are v2.",
"userRequest": "User said: task m2 çok eklenmesi gerekli bir özellik ya, istersen onları da ekleyelim — 2026-04-28.",
"acceptanceCriteria": "File tree shows colored decorations matching git status; folder rollup works; status refreshes every ~5s; non-git projects render unchanged; switching projects updates the watch target.",
"notes": "Polling chosen over fs.watch for v1 simplicity. Diff viewer + Changes panel deferred to v2. Visual style is colored text only (VSCode pattern), no badges, to keep tree clean. Identical pushes are de-duplicated to avoid renderer churn.",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-28 - Git status integration v1",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-04-28T13:00:00Z",
"completedAt": "2026-04-28T13:00:00Z"
},
{
"id": "task-filetree-search",
"title": "Filter input in file tree (substring match)",
"description": "Search box above the file tree that filters visible items as the user types. Substring (case-insensitive) match against file/folder names. Folders containing matches auto-expand to surface results. Clearing the input restores full visibility. Keyboard navigation (ArrowUp/Down) automatically skips hidden items via offsetParent check. Filter is re-applied automatically when the tree reloads (project switch / refresh).",
"userRequest": "User said: bir de search box koyalım. dosyalarda arama yapılabilsin — 2026-04-28 file tree polish.",
"acceptanceCriteria": "Input above tree filters in real-time; substring match (case-insensitive); folders with matching descendants auto-expand; clearing input restores tree; keyboard nav skips hidden items.",
"notes": "Substring chosen over fuzzy because fuzzy match in a file tree filter occasionally surprises users. A fuzzy 'Quick Open' (Cmd+P style file finder across all files) is a separate future feature.",
"status": "completed",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-28 - File tree polish",
"createdAt": "2026-04-28T10:00:00Z",
"updatedAt": "2026-04-28T11:30:00Z",
"completedAt": "2026-04-28T11:30:00Z"
},
{
"id": "task-filetree-copy-path",
"title": "Right-click → Copy Filepath in file tree",
"description": "Custom HTML context menu that appears on right-click of file or folder items. Single menu item: 'Copy Filepath' which writes the absolute path to the clipboard via Electron's clipboard module. Menu dismisses on outside click, Esc, scroll, window blur, or after action. Auto-clamps to viewport on right/bottom edges.",
"userRequest": "User said: filetree de bir dosyaya sağ tıkladığımda copy filepath olsun mesela, bu güzel bir özellik — 2026-04-28 file tree polish.",
"acceptanceCriteria": "Right-click on any file or folder shows context menu at cursor; 'Copy Filepath' writes absolute path to clipboard; menu closes on outside-click / Esc / after action.",
"notes": "Custom HTML menu (not Electron native Menu.popup) so future items can match Frame's design tokens. Works for both files and folders for consistency.",
"status": "completed",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-28 - File tree polish",
"createdAt": "2026-04-28T10:00:00Z",
"updatedAt": "2026-04-28T11:30:00Z",
"completedAt": "2026-04-28T11:30:00Z"
},
{
"id": "task-prod-onboarding",
"title": "First-run welcome flow with persistent dismiss",
"description": "Single-screen welcome modal shown on every launch unless user opts out via 'Don't show this again' checkbox. Pitches Frame's value prop (terminal-first, AI-native), offers three primary actions (Open Folder / Create New / Clone GitHub), embeds AI tool radio picker synced with sidebar via SET_AI_TOOL IPC, has Close primary button + Skip secondary. Reachable later via Command Palette (help.welcome). Persistence moved from localStorage to userData JSON via new userSettings module + IPC channels because Electron renderer localStorage didn't survive launches in dev. Checkbox state persists immediately on change so Cmd+Q while modal open is still captured.",
"userRequest": "User said: first-run welcome flow u entegre etmeliyiz bence, önemli bir ux iyileştirmesi olur — followed by: ben modali çok beğendim. ilk açılışta her zaman açılsın. dont show this again seçeneği koyalım — followed by: belki bir de close diye bi buton da koyalım modalin alt orta kısmına.",
"acceptanceCriteria": "Modal opens on every launch by default; AI tool radio cards in sync with sidebar selector; checkbox state persisted instantly to userData JSON; Close / Skip / Esc / outside-click all dismiss; Cmd+Q while open still saves; reachable via Command Palette > Show Welcome Screen with flag reset.",
"notes": "Discovered and fixed an Electron localStorage persistence quirk during testing — switched to a generic userSettings IPC pattern that mirrors aiToolManager's userData JSON approach. New IPC channels GET_USER_SETTING / SET_USER_SETTING are reusable for future renderer-side preferences (telemetry consent, theme, etc.).",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-26 / 2026-04-27 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-27T17:00:00Z",
"completedAt": "2026-04-27T17:00:00Z"
},
{
"id": "task-prod-app-loader",
"title": "App boot loader splash",
"description": "Full-screen centered loader shown on app boot until the first WORKSPACE_DATA IPC arrives (or a 10s failsafe). Pulsing brand mark (sparkle ✦) + 'Loading workspace…' caption, fades out with CSS transition then removes itself from DOM. Avoids the brief flash of empty sidebar / unmounted terminal users with many projects experience during initial workspace load. Listener registered before welcomeOverlay's so the loader fades out before the welcome modal can appear behind it.",
"userRequest": "User said: bir ilk açılışta mesela benim artık bir sürü projem olduğu için bir kaç saniye projelerin dolmasını bekliyorum. acaba bu bekleme zamanı için bir loading animasyonu gibi bişey ekleyebilir miyiz? — followed by: sidebarda değil aslında, tam ortada görmek istiyorum.",
"acceptanceCriteria": "Loader visible on boot covering the whole window; fades out within ~280ms once workspace data arrives; never traps user (10s failsafe); welcome modal opens cleanly behind it.",
"notes": "Initially tried a sidebar skeleton placeholder, but user preferred a centered full-screen approach. Z-index 100000 layers above all panels; failsafe handles the unlikely case where WORKSPACE_DATA never arrives.",
"status": "completed",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-27 - Welcome flow polish",
"createdAt": "2026-04-27T16:00:00Z",
"updatedAt": "2026-04-27T17:00:00Z",
"completedAt": "2026-04-27T17:00:00Z"
},
{
"id": "task-prod-shortcuts-cheatsheet",
"title": "In-app keyboard shortcut cheat sheet",
"description": "Cmd+Shift+K overlay listing every registered shortcut grouped by category (AI, Focus, Help, Palette, Panel, Project, Terminal). Reads from commandRegistry so it stays in sync with the Command Palette automatically. Filter input matches title, category, and rendered shortcut. Layout-independent binding (avoids the TR-keyboard issue with Cmd+/).",
"userRequest": "User said: tamam devam edelim — after recommending the cheat sheet as the highest-leverage follow-up to the command palette work.",
"acceptanceCriteria": "Cmd+Shift+K opens overlay; categories visible; searchable; OS-correct symbols (⌘ vs Ctrl); reachable via Command Palette (help.shortcuts entry).",
"notes": "Originally proposed Cmd+/ but on TR-Q keyboards / requires Shift+7, making the combo awkward and our matcher refuses Shift modifier — so binding moved to Cmd+Shift+K (mnemonic: Keyboard, layout-independent on TR/US/UK/DE).",
"status": "completed",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T15:00:00Z",
"completedAt": "2026-04-26T15:00:00Z"
},
{
"id": "task-prod-cmdpalette",
"title": "Command Palette (Cmd+P / Cmd+Shift+P)",
"description": "Universal fuzzy-search palette to trigger every app action: open project, switch terminal, toggle panels, run shortcuts, open settings, switch AI tool, etc. Solves discoverability and the 'I closed a panel and can't reopen it' problem at its root. Implementation: central commandRegistry as single source of truth (id, title, shortcut, run, when), commandPalette modal UI, platform helper for cross-platform shortcut formatting (CmdOrCtrl accelerator -> ⌘⇧P on macOS, Ctrl+Shift+P on Windows/Linux). All existing keyboard shortcuts migrated through the registry.",
"userRequest": "User said: çok güzel öneriler, bence hepsini tasks.json a ekleyelim ve bir yerden bunları eklemeye başlayalım — captured during 2026-04-26 product readiness audit.",
"acceptanceCriteria": "Cmd+P opens palette; all toggleable panels, terminal actions, AI tool switches, project switches are reachable; recent actions surface first; Esc closes; full keyboard navigation; new modules can register commands via a single API.",
"notes": "Plugins panel shortcut moved from Cmd+Shift+P to Cmd+Shift+X (VSCode 'Extensions' convention) to free up Cmd+Shift+P for the palette. Cmd+Shift+G previously double-fired (terminal grid view + GitHub panel) — resolved by binding Cmd+Shift+G only to GitHub panel; grid view is reachable via tab bar and palette. Focus commands (Cmd+E / Cmd+Shift+E) now reveal the corresponding sidebar tab and open the sidebar if hidden.",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-26 - Frame product readiness audit",
"createdAt": "2026-04-26T12:00:00Z",
"updatedAt": "2026-04-26T13:50:00Z",
"completedAt": "2026-04-26T13:50:00Z"
},
{
"id": "task-st",
"title": "STRUCTURE.json kurallarini belirle",
"description": "STRUCTURE.json icin guncelleme kurallari, detayli format (fonksiyon seviyesinde), auto-update script ve pre-commit hook eklendi.",
"status": "completed",
"priority": "medium",
"category": "docs",
"context": "Session 2026-01-25 - Token efficiency protocol",
"createdAt": "2026-01-24T16:00:00Z",
"updatedAt": "2026-01-25T00:00:00Z",
"completedAt": "2026-01-25T00:00:00Z"
},
{
"id": "task-c1",
"title": "IDE layout (sidebar + terminal)",
"description": "3-panel IDE layout with project explorer, terminal, and history",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Initial development",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-01-21T00:00:00Z",
"completedAt": "2026-01-21T00:00:00Z"
},
{
"id": "task-c2",
"title": "File tree explorer",
"description": "Hierarchical, collapsible file tree",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Initial development",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-01-21T00:00:00Z",
"completedAt": "2026-01-21T00:00:00Z"
},
{
"id": "task-c3",
"title": "Prompt history panel",
"description": "Side panel showing command history with timestamps",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Initial development",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-01-21T00:00:00Z",
"completedAt": "2026-01-21T00:00:00Z"
},
{
"id": "task-c4",
"title": "Multi-terminal tabs",
"description": "Support multiple terminal instances in tabs",
"status": "completed",
"priority": "medium",
"category": "feature",
"context": "todos.json - mediumTerm",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-01-21T00:00:00Z",
"completedAt": "2026-01-21T00:00:00Z"
},
{
"id": "task-c5",
"title": "Terminal grid view",
"description": "Side-by-side terminal panels with grid layout (2x1, 2x2, 3x1, 3x2, 3x3)",
"status": "completed",
"priority": "medium",
"category": "feature",
"context": "todos.json - mediumTerm",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-01-21T00:00:00Z",
"completedAt": "2026-01-21T00:00:00Z"
},
{
"id": "task-c6",
"title": "File editor overlay",
"description": "Basic file editing capability within the app",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "todos.json - mediumTerm",
"createdAt": "2026-01-21T00:00:00Z",
"updatedAt": "2026-01-21T00:00:00Z",
"completedAt": "2026-01-21T00:00:00Z"
},
{
"id": "task-design",
"title": "Modern UI tasarimi",
"description": "Claude Desktop benzeri minimalist ve modern tasarim. DM Sans + JetBrains Mono fontlari, warm-neutral renk paleti.",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-01-24 - Kullanici talebi",
"createdAt": "2026-01-24T15:00:00Z",
"updatedAt": "2026-01-24T15:30:00Z",
"completedAt": "2026-01-24T15:30:00Z"
},
{
"id": "task-claude-md",
"title": "CLAUDE.md sablonu ve task sistemi",
"description": "Frame projeleri icin CLAUDE.md sablonu, task tanima kurallari, dokuman guncelleme stratejileri",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-01-24 - Frame dokuman sistemi",
"createdAt": "2026-01-24T15:30:00Z",
"updatedAt": "2026-01-24T16:00:00Z",
"completedAt": "2026-01-24T16:00:00Z"
},
{
"id": "task-tasks-panel",
"title": "Tasks UI paneli",
"description": "Sag tarafta toggle edilebilen tasks paneli. Filtreleme, ekleme, duzenleme, silme, durum degistirme ozellikleri.",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-01-24 - Frame dokuman sistemi",
"createdAt": "2026-01-24T16:00:00Z",
"updatedAt": "2026-01-24T16:30:00Z",
"completedAt": "2026-01-24T16:30:00Z"
},
{
"id": "spec-1.5",
"title": "Project creation — Spec-Driven Development template option",
"description": "Extend the project init flow (current Initialize Frame flow) to offer a template choice: Standard | Spec-Driven Development. Selecting Spec-Driven creates .frame/specs/.gitkeep, copies default templates from src/templates/specs/ to .frame/templates/specs/, and appends a 'Spec-Driven Development' section to AGENTS.md. Existing projects can opt-in via a 'Enable Spec-Driven mode' button in project settings.",
"userRequest": "User said: ben bir projeye başladığımda bir seçenek olarak spec driven dev özelliğimizle başlayabileceğim.",
"acceptanceCriteria": "Project init modal shows template selector. Spec-Driven template creates folders, copies templates, updates AGENTS.md. Opt-in path works for already-initialized projects without disrupting existing structure.",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-29 - Spec-driven dev Slice 1",
"createdAt": "2026-04-29T00:00:00Z",
"updatedAt": "2026-04-30T00:00:00Z",
"completedAt": "2026-04-30T00:00:00Z"
},
{
"id": "spec-1.9",
"title": "AGENTS.md update — teach AI tools the spec workflow",
"description": "Add a 'Spec-Driven Development' section to Frame's default AGENTS.md template. Documents: .frame/specs/ folder convention, expected contents of spec.md / plan.md / tasks.md, how to respond to /spec.new /spec.plan /spec.tasks invocations, exact file output format (path, headers, structure). Format strict enough that Claude / Codex / Gemini can all reliably follow it. Same content reused as the AI-prompt template body in Slice 1.6.",
"userRequest": "Subtask of spec-driven-dev (User-approved 4-slice plan, Session 2026-04-29).",
"acceptanceCriteria": "AGENTS.md template updated. Section is unambiguous (tested by reading it cold). Claude Code follows the format on first attempt without coaching. Codex and Gemini variations validated at least once each.",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-29 - Spec-driven dev Slice 1",
"createdAt": "2026-04-29T00:00:00Z",
"updatedAt": "2026-04-30T00:00:00Z",
"completedAt": "2026-04-30T00:00:00Z"
},
{
"id": "spec-driven-dev",
"title": "Spec-driven development framework (4-slice plan)",
"description": "Build Frame's native spec-driven development feature as a core capability (not plugin). Owns the full lifecycle: spec → plan → tasks → implement, with optional autopilot mode for autonomous Claude Code execution. Sliced into 4 vertical, independently shippable releases: (1) Lifecycle core — data model, panel, /spec.new /spec.plan /spec.tasks, tasks.json sync, default template; (2) Implementation loop — /spec.implement, progress tracking, branch automation, multi-spec switcher; (3) Power features — custom templates, task→spec promotion, GitHub issue import, multi-AI polish; (4) Autopilot mode — --dangerously-skip-permissions UI toggle, autopilot indicator + safety modal, autonomous task loop runner, pause/stop, live activity feed, cost tracking, error recovery. New modules: src/main/specManager.js, src/renderer/specPanel.js, src/templates/specs/. Integrates with existing tasksManager, githubManager, AGENTS.md template, project init flow.",
"userRequest": "User said: dediğin şeyleri onaylıyorum. nihai isteğimi de söyleyeyim, ben bir projeye başladığımda bir seçenek olarak spec driven dev özelliğimizle başlayabileceğim. claude ile konuşurken claude spec leri ve taskları belirleyecek ve yazacak. daha sonra ya da başta github reposunu verdiğimde, ben baya dangerously skip permissions seçeneğini de ui a yedirip, onu seçip claude code un bu yöntemle ben el sürmeden geliştirmesini sağlayacağım",
"acceptanceCriteria": "All 4 slices merged to main, each one demonstrably usable on its own. Slice 1: users can create specs via /spec.new, generate plan + tasks, see them in Specs panel, tasks auto-sync to tasks.json. Slice 2: /spec.implement walks the task list, branch is auto-created per spec, progress visible in panel. Slice 3: custom templates work, tasks can be promoted to specs, GitHub issues importable, all three AI tools (Claude/Codex/Gemini) tested. Slice 4: autopilot toggle gated behind safety modal with explicit per-session opt-in, AUTOPILOT badge visible while active, autonomous loop completes a sample spec end-to-end, pause/stop works, inactivity timeout enforces safety, cost tracking surfaces tokens/min.",
"notes": "Strategic decisions: (1) Core feature, NOT plugin — defines Frame's category. (2) Ship in vertical slices, NOT horizontally — feedback gap is killed, scope creep contained. (3) Slice 4 (autopilot) explicitly LAST — autopilot on bad specs is disastrous, iterate spec quality first. (4) Custom file format (.frame/specs/<slug>/), NOT Spec Kit compatible — full UX control; Spec Kit import shim can come later if real demand surfaces. (5) Per-AI prompt formats — Claude Code, Codex CLI, Gemini CLI each get tailored slash command bodies. Safety constraints for Slice 4: skip-permissions modal must require fresh confirm each session, AUTOPILOT badge always visible, inactivity timeout (~30 min), pause/stop globally accessible, live activity feed mandatory.",
"status": "in_progress",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-29 - Spec-driven dev framework design",
"createdAt": "2026-04-29T00:00:00Z",
"updatedAt": "2026-04-29T00:00:00Z",
"completedAt": null
},
{
"id": "spec-1.8",
"title": "Auto-sync tasks.md → tasks.json with source markers",
"description": "Parser extracts each task from a spec's tasks.md and creates tasks.json entries tagged source: 'spec:<slug>:T<n>'. Existing entries with same source marker are UPDATED (not duplicated) — title/description sync, but status (pending/in_progress/completed) is preserved across re-imports. status.generated_task_ids tracks the linkage. Tasks panel surfaces a 'from spec: <slug>' chip on those rows.",
"userRequest": "Subtask of spec-driven-dev (User-approved 4-slice plan, Session 2026-04-29).",
"acceptanceCriteria": "First /spec.tasks creates tasks.json entries. Re-running on same spec doesn't dupe — updates in place. User-set status not clobbered. Chip visible in Tasks panel. Manual deletion of a task in Tasks panel correctly orphans (warns user) before next /spec.tasks run.",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-29 - Spec-driven dev Slice 1",
"createdAt": "2026-04-29T00:00:00Z",
"updatedAt": "2026-04-30T00:00:00Z",
"completedAt": "2026-04-30T00:00:00Z"
},
{
"id": "spec-1.7",
"title": "Slash commands — /spec.new /spec.plan /spec.tasks",
"description": "Wire the three core slash commands. Each: (1) builds the AI-tool-specific prompt with template content, (2) sends it to active terminal via writeToPTY, (3) on file appearance (detected via specManager watcher), updates status.json phase. /spec.new prompts user for a brief description (modal) before sending. /spec.plan and /spec.tasks read existing spec.md/plan.md as input context. Surfaced in command palette via existing commandRegistry. Failures (no AI response, file didn't appear within timeout) show user-visible error.",
"userRequest": "User said: claude ile konuşurken claude spec leri ve taskları belirleyecek ve yazacak.",
"acceptanceCriteria": "End-to-end with Claude Code: /spec.new 'share button' → modal → spec.md appears. /spec.plan → plan.md appears. /spec.tasks → tasks.md appears. Each command updates status.json phase. Timeout shows error toast, doesn't leave stale state. All 3 commands present in command palette.",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-29 - Spec-driven dev Slice 1",
"createdAt": "2026-04-29T00:00:00Z",
"updatedAt": "2026-04-30T00:00:00Z",
"completedAt": "2026-04-30T00:00:00Z"
},
{
"id": "spec-1.6",
"title": "Default spec templates + per-AI prompt formats",
"description": "Ship src/templates/specs/feature.md and fix.md (templates with sections: Problem, Goal, Constraints, Success Criteria, Out of Scope). Plus prompt-template wrappers per AI tool — claude-code.md, codex.md, gemini.md — that frame the spec template appropriately for each tool's slash-command convention. /spec.new reads the active AI tool and constructs the right prompt body.",
"userRequest": "Subtask of spec-driven-dev (User-approved 4-slice plan, Session 2026-04-29).",
"acceptanceCriteria": "Templates committed, render correctly. /spec.new from a Claude Code session sends Claude-flavored prompt; same command in Codex sends Codex-flavored. Switching AI mid-spec doesn't break the workflow. At least the feature template tested round-trip with Claude Code.",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-29 - Spec-driven dev Slice 1",
"createdAt": "2026-04-29T00:00:00Z",
"updatedAt": "2026-04-30T00:00:00Z",
"completedAt": "2026-04-30T00:00:00Z"
},
{
"id": "spec-1.3",
"title": "src/renderer/specPanel.js — list + detail views",
"description": "New renderer module for the Specs panel. List view: spec rows with title, phase badge (color-coded per phase), progress bar (completed/total tasks from tasks.json), relative updated time. Detail view: tabbed Spec / Plan / Tasks with markdown render via marked, metadata header (slug, phase, AI tool, age). Read-only in Slice 1 — edits route through slash commands. Subscribes to SPEC_DATA push for live updates. Mounts on toolbar tab toggle.",
"userRequest": "Subtask of spec-driven-dev (User-approved 4-slice plan, Session 2026-04-29).",
"acceptanceCriteria": "Panel renders existing specs from .frame/specs/. Phase badges use the 6 status colors. Detail view tabs work, markdown renders. Live updates within 500ms of file change. Empty state visible when no specs exist.",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-29 - Spec-driven dev Slice 1",
"createdAt": "2026-04-29T00:00:00Z",
"updatedAt": "2026-04-29T00:00:00Z",
"completedAt": "2026-04-29T00:00:00Z"
},
{
"id": "spec-1.4",
"title": "Specs tab in terminal toolbar + empty state",
"description": "Add a new 'Specs' button alongside Tasks/Claude/GitHub/Overview in the terminal toolbar (multiTerminalUI.js or wherever toolbar lives). Toggles spec panel. Indicator dot when there is at least one spec in a non-terminal phase (draft/specified/planned/tasks_generated/implementing). First-time empty state: 'Define what you want to build with Spec-Driven Development' + [New Spec] button + [Learn more] link.",
"userRequest": "Subtask of spec-driven-dev (User-approved 4-slice plan, Session 2026-04-29).",
"acceptanceCriteria": "Button visible, click toggles panel, indicator dot logic works, empty state copy approved by user. Keyboard shortcut registered in command registry (Cmd+Shift+S, only if free).",
"status": "completed",
"priority": "medium",
"category": "feature",
"context": "Session 2026-04-29 - Spec-driven dev Slice 1",
"createdAt": "2026-04-29T00:00:00Z",
"updatedAt": "2026-04-29T00:00:00Z",
"completedAt": "2026-04-29T00:00:00Z"
},
{
"id": "spec-1.2",
"title": "src/main/specManager.js — CRUD + watcher + IPC",
"description": "New main-process module, mirroring tasksManager.js patterns. Exports: init(window), listSpecs(), getSpec(slug), createSpec(slug, initialFiles), updateSpecStatus(slug, partial), deleteSpec(slug). File watcher on .frame/specs/**/* with debounce. New IPC channels: LIST_SPECS, GET_SPEC, CREATE_SPEC, UPDATE_SPEC_STATUS, WATCH_SPECS, SPEC_DATA (push). Channels declared in src/shared/ipcChannels.js. Wire init from src/main/index.js initModulesWithWindow.",
"userRequest": "Subtask of spec-driven-dev (User-approved 4-slice plan, Session 2026-04-29).",
"acceptanceCriteria": "Module loads without breaking existing project. Watcher fires SPEC_DATA on file change within 500ms. CRUD functions tested against fixture. Strict adherence to existing tasksManager.js conventions (error handling, IPC patterns, init signature).",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-29 - Spec-driven dev Slice 1",
"createdAt": "2026-04-29T00:00:00Z",
"updatedAt": "2026-04-29T00:00:00Z",
"completedAt": "2026-04-29T00:00:00Z"
},
{
"id": "spec-1.1",
"title": "Spec data model — file layout + status schema",
"description": "Define the on-disk layout: .frame/specs/<slug>/{spec.md, plan.md, tasks.md, status.json}. Design status.json schema: { phase: 'draft' | 'specified' | 'planned' | 'tasks_generated' | 'implementing' | 'done', generated_task_ids: string[], ai_tool: 'claude-code' | 'codex' | 'gemini', created_at, updated_at, last_phase_at }. Document slug naming conventions (kebab-case from title, conflict resolution via -2 suffix). Slice 1 of spec-driven-dev.",
"userRequest": "Subtask of spec-driven-dev (User-approved 4-slice plan, Session 2026-04-29).",
"acceptanceCriteria": "Schema documented in PROJECT_NOTES.md. Sample fixture committed under tests/fixtures/specs/ with one full example. Tiny in-process validator function rejects malformed status.json. Slug generator handles uppercase, special chars, conflicts.",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-29 - Spec-driven dev Slice 1",
"createdAt": "2026-04-29T00:00:00Z",
"updatedAt": "2026-04-29T00:00:00Z",
"completedAt": "2026-04-29T00:00:00Z"
},
{
"id": "task-spec-agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f-T01",
"title": "Add `src/templates/roles/AGENTS.md` starter template with Purpose / Steps / Commands / Notes sections and an inline behavior protocol covering session-start read, first-run capture, follow-up delta-only mode, and capture-only-with-approval.",
"description": "",
"source": "spec:agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f:T01",
"status": "completed",
"priority": "medium",
"category": "feature",
"context": "From spec: agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f",
"createdAt": "2026-04-30T15:56:06.716Z",
"updatedAt": "2026-05-01T14:15:03.484Z",
"completedAt": "2026-05-01T14:15:03.484Z"
},
{
"id": "task-spec-agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f-T02",
"title": "Add `scripts/create-role.js` CLI that validates a kebab-case role name, creates `roles/<name>/`, copies the template into `AGENTS.md`, and creates a `CLAUDE.md → AGENTS.md` symlink; refuse if `roles/<name>/` already exists.",
"description": "",
"source": "spec:agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f:T02",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "From spec: agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f",
"createdAt": "2026-04-30T15:56:06.716Z",
"updatedAt": "2026-04-30T15:56:06.716Z",
"completedAt": null
},
{
"id": "task-spec-agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f-T03",
"title": "Wire `\"role:new\": \"node scripts/create-role.js\"` into the `scripts` block of `package.json`.",
"description": "",
"source": "spec:agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f:T03",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "From spec: agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f",
"createdAt": "2026-04-30T15:56:06.716Z",
"updatedAt": "2026-04-30T15:56:06.716Z",
"completedAt": null
},
{
"id": "task-spec-agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f-T04",
"title": "Add a \"Roles\" section to the project root `AGENTS.md` covering when to create a role, the `npm run role:new <name>` command, the per-role protocol summary, and the capture-with-approval rule; cross-reference that specs/tasks remain for product work.",
"description": "",
"source": "spec:agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f:T04",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "From spec: agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f",
"createdAt": "2026-04-30T15:56:06.716Z",
"updatedAt": "2026-04-30T15:56:06.716Z",
"completedAt": null
},
{
"id": "task-spec-agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f-T05",
"title": "Run `npm run structure` to refresh `STRUCTURE.json` so the new template and CLI land in the intentIndex.",
"description": "",
"source": "spec:agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f:T05",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "From spec: agentlar-iin-roller-tanmlamay-dnyorum-aklmdaki-f",
"createdAt": "2026-04-30T15:56:06.716Z",
"updatedAt": "2026-04-30T15:56:06.716Z",
"completedAt": null
},
{
"id": "spec-2.1",
"title": "Interactive Tasks subview + Specs Dashboard + resizable panel",
"description": "Side-panel Tasks tab now renders the live tasks.json subset (filtered by source: spec:<slug>:*) as an interactive list with hover-revealed Start/Complete/Pause/Reopen actions. Phase auto-advance now considers task statuses (any in_progress/completed → 'implementing'; all completed → 'done'; reopen rewinds). Second fs.watch on tasks.json so flips from the standalone Tasks panel propagate. Full-page Specs Dashboard (card grid + filter chips + 480px detail aside) opened from a Dashboard button in the panel header — symmetric with Tasks Dashboard. Drag handle on panel's left edge (360-1000px, persisted) plus one-tap Expand/Compact toggle (420 ↔ 800).",
"userRequest": "User said: bu spec'in tasklarını nerede göreceğim? bunları bir yerde görmek istiyorum. plus: panel görünümünden dashboarda mı geçirsek + paneli büyütebilelim.",
"acceptanceCriteria": "Done: Tasks tab renders interactive list with X/Y count. Status flips work and auto-advance phase. Dashboard button opens full-page card grid; cards show progress bar, phase badge, AI tool, time. Card click slides in 480px detail aside with same Spec/Plan/Tasks tabs and interactive task list. Side panel resizable via left-edge drag handle (persisted) and Expand toggle. Side panel auto-hides when dashboard opens.",
"notes": "Shipped via PR #72 (commit 670670d).",
"status": "completed",
"priority": "high",
"category": "feature",
"context": "Session 2026-04-30 - Slice 2.1",
"createdAt": "2026-04-30T00:00:00Z",
"updatedAt": "2026-05-01T00:00:00Z",
"completedAt": "2026-05-01T00:00:00Z"
},
{
"id": "spec-2.2",
"title": "/spec.implement loop + outcome.md capture",
"description": "Wire the implementation phase: a 'Run /spec.implement' next-action button (visible when phase is 'tasks_generated' or 'implementing' with pending tasks) sends a prompt that asks Claude to (1) read spec/plan/tasks, (2) take the next pending task, (3) implement it, (4) flip the task to completed in tasks.json via the existing UPDATE_TASK channel, AND (5) — critical — append a 2-3 sentence outcome to .frame/specs/<slug>/outcome.md under heading '## T<n> — <title>'. Outcome captures what was actually done, deviations from plan, files touched, followups. Lives in the same .frame/specs/<slug>/ folder. Per-task, append-only. Plant the capture step as the FINAL instruction in the prompt template so the agent writes while context is fresh.",
"userRequest": "User said: tasklar execute edildiğinde ve tamamlandığında ne yapıldığını da kayıt altına almak istiyorum. yani planda aslında ne yapılacağı var ama task bittikten sonra farklı şeyler olduysa kayıt altına alınabilir mi?",
"acceptanceCriteria": "/spec.implement button visible at the right phase; click sends interpolated prompt to terminal via existing BUILD_SPEC_COMMAND_FILE pipeline; Claude completes one task per click and appends entry to outcome.md; status.json phase auto-advances via task-status driven derivePhase (already shipped). Template enforces brevity (max 3 sentences, no marketing tone). Tested round-trip with at least one task in this codebase's own .frame/specs/.",
"notes": "Outcome capture is the answer to the spec-drift problem we discussed. Lives in /spec.implement template (Slice 2.2), separate Outcome UI tab is Slice 2.3.",
"status": "pending",
"priority": "high",
"category": "feature",
"context": "Session 2026-05-01 - Slice 2 design + outcome capture",
"createdAt": "2026-05-01T00:00:00Z",
"updatedAt": "2026-05-01T00:00:00Z",
"completedAt": null
},
{
"id": "spec-2.3",
"title": "Outcome tab in spec detail (side panel + dashboard)",
"description": "Render outcome.md in a new 'Outcome' tab next to Spec/Plan/Tasks. Same markdown rendering pipeline as the other tabs. Empty state: 'Outcomes capture as tasks complete via /spec.implement'. Tab label shows entry count when present. Available in both the side panel detail view and the dashboard detail aside (same render helper either way).",
"userRequest": "Subtask of outcome capture flow (Slice 2.2 design).",
"acceptanceCriteria": "Outcome tab appears in detail view when outcome.md exists. Renders entries in newest-first order. Each entry shows title, captured date, and the summary paragraph. Live-updates via SPEC_DATA push when /spec.implement appends a new entry.",
"notes": "After 2.2 lands and outcome.md starts being written, this tab gives users the readable surface for it.",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "Session 2026-05-01 - Slice 2",
"createdAt": "2026-05-01T00:00:00Z",
"updatedAt": "2026-05-01T00:00:00Z",
"completedAt": null
},
{
"id": "spec-2.4",
"title": "Branch automation per spec",
"description": "First /spec.implement run for a spec creates a feat/<slug> branch and switches to it (uses existing CREATE_GIT_BRANCH IPC). Subsequent runs assume already on that branch. status.json gets a `branch` field tracking the linkage. UI surface: small branch chip on spec detail header showing the linked branch. Avoid creating branches when one with the same name already exists or when there are uncommitted changes — surface a soft warning instead.",
"userRequest": "Subtask of Slice 2 implementation loop (per meta task spec-driven-dev).",
"acceptanceCriteria": "Fresh /spec.implement on a spec → feat/<slug> branch created and active. status.json.branch reflects it. Re-running /spec.implement on the same spec → no new branch, just continues. Conflict cases (branch exists, dirty tree) handled with a clear modal warning.",
"notes": "Optional add-on; some users may prefer manual branching. Could ship behind a per-project setting if it gets pushback.",
"status": "pending",
"priority": "medium",
"category": "feature",
"context": "Session 2026-05-01 - Slice 2",
"createdAt": "2026-05-01T00:00:00Z",
"updatedAt": "2026-05-01T00:00:00Z",
"completedAt": null
},
{
"id": "spec-2.5",
"title": "Multi-spec switcher (active spec context)",
"description": "When multiple specs are 'implementing' simultaneously, give the user a quick way to switch which spec /spec.implement targets. Likely a small selector chip in the spec panel header showing the 'active spec' for implementation, plus the same indicator in the dashboard. Avoids accidentally implementing a different spec when more than one is in flight.",
"userRequest": "Subtask of Slice 2 implementation loop (per meta task spec-driven-dev).",
"acceptanceCriteria": "When >1 spec is in 'implementing' phase, a switcher appears in panel header with the active spec selected. /spec.implement button always operates on the active one. Switcher persists across reloads.",
"notes": "Lower priority than 2.2/2.3 since most users will work on one spec at a time. Listed for completeness from the meta task plan.",
"status": "pending",
"priority": "low",
"category": "feature",
"context": "Session 2026-05-01 - Slice 2",
"createdAt": "2026-05-01T00:00:00Z",
"updatedAt": "2026-05-01T00:00:00Z",
"completedAt": null
}
],
"metadata": {
"totalCreated": 61,
"totalCompleted": 17
},