prjct-cli 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/package.json +1 -1
- package/templates/agentic/agents/uxui.md +210 -0
- package/templates/commands/bug.md +219 -41
- package/templates/commands/feature.md +368 -80
- package/templates/commands/ship.md +139 -12
- package/templates/commands/sync.md +62 -3
- package/templates/commands/test.md +17 -184
- package/templates/mcp-config.json +0 -36
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
|
-
allowed-tools: [Read, Write, Bash, Task, Glob]
|
|
3
|
-
description: '
|
|
2
|
+
allowed-tools: [Read, Write, Bash, Task, Glob, Grep, AskUserQuestion]
|
|
3
|
+
description: '7-phase feature development workflow'
|
|
4
4
|
timestamp-rule: 'GetTimestamp() and GetDate() for ALL timestamps'
|
|
5
5
|
architecture: 'Write-Through (JSON → MD → Events)'
|
|
6
6
|
storage-layer: true
|
|
@@ -9,7 +9,19 @@ claude-context: 'context/next.md'
|
|
|
9
9
|
backend-sync: 'sync/pending.json'
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
-
# /p:feature - Add Feature
|
|
12
|
+
# /p:feature - Add Feature with 7-Phase Workflow
|
|
13
|
+
|
|
14
|
+
## 7-Phase Development Workflow
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
Phase 1: Discovery → Understand the feature
|
|
18
|
+
Phase 2: Exploration → Analyze existing codebase
|
|
19
|
+
Phase 3: Questions → Clarify ambiguities
|
|
20
|
+
Phase 4: Design → Architecture options
|
|
21
|
+
Phase 5: Implementation → Task breakdown + start
|
|
22
|
+
Phase 6: Review → (via /p:done, /p:ship)
|
|
23
|
+
Phase 7: Summary → (via /p:done)
|
|
24
|
+
```
|
|
13
25
|
|
|
14
26
|
## Architecture: Write-Through Pattern
|
|
15
27
|
|
|
@@ -96,71 +108,242 @@ IF no feature description provided:
|
|
|
96
108
|
WAIT for user input
|
|
97
109
|
CONTINUE with user's response as {feature}
|
|
98
110
|
|
|
99
|
-
|
|
111
|
+
---
|
|
100
112
|
|
|
101
|
-
|
|
113
|
+
## PHASE 1: Discovery
|
|
102
114
|
|
|
103
|
-
|
|
104
|
-
Based on feature description, determine:
|
|
115
|
+
OUTPUT: "## Phase 1: Discovery"
|
|
105
116
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
ELSE:
|
|
111
|
-
{impact} = "low"
|
|
117
|
+
### 1.1 Summarize the Feature
|
|
118
|
+
Analyze {feature} and OUTPUT:
|
|
119
|
+
```
|
|
120
|
+
Building: {one-sentence summary}
|
|
112
121
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
122
|
+
Requirements:
|
|
123
|
+
- {requirement 1}
|
|
124
|
+
- {requirement 2}
|
|
125
|
+
- {requirement 3}
|
|
126
|
+
|
|
127
|
+
Success looks like:
|
|
128
|
+
- {success criteria 1}
|
|
129
|
+
- {success criteria 2}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 1.2 Initial Assessment
|
|
133
|
+
Determine scope:
|
|
134
|
+
- IF simple (1-2 files): {scope} = "small"
|
|
135
|
+
- IF medium (3-5 files): {scope} = "medium"
|
|
136
|
+
- IF complex (many files, new patterns): {scope} = "large"
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## PHASE 2: Exploration
|
|
141
|
+
|
|
142
|
+
OUTPUT: "## Phase 2: Codebase Exploration"
|
|
143
|
+
|
|
144
|
+
### 2.1 Find Similar Features
|
|
145
|
+
DELEGATE to Explore agent:
|
|
146
|
+
```
|
|
147
|
+
Task(
|
|
148
|
+
subagent_type: 'Explore',
|
|
149
|
+
prompt: 'Find code similar to "{feature}". Look for:
|
|
150
|
+
- Existing implementations of similar functionality
|
|
151
|
+
- Patterns used in this codebase
|
|
152
|
+
- Key files that would be affected
|
|
153
|
+
Return: file paths, patterns found, relevant code snippets'
|
|
154
|
+
)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 2.2 Trace Dependencies
|
|
158
|
+
BASH: Find imports/dependencies related to the feature area
|
|
159
|
+
|
|
160
|
+
### 2.3 Report Findings
|
|
161
|
+
OUTPUT:
|
|
162
|
+
```
|
|
163
|
+
Found similar:
|
|
164
|
+
- {similar feature 1} in {file path}
|
|
165
|
+
- {similar feature 2} in {file path}
|
|
166
|
+
|
|
167
|
+
Patterns used:
|
|
168
|
+
- {pattern 1}: {where it's used}
|
|
169
|
+
- {pattern 2}: {where it's used}
|
|
170
|
+
|
|
171
|
+
Key files to modify:
|
|
172
|
+
- {file 1}: {what needs to change}
|
|
173
|
+
- {file 2}: {what needs to change}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## PHASE 3: Questions
|
|
179
|
+
|
|
180
|
+
OUTPUT: "## Phase 3: Clarifying Questions"
|
|
181
|
+
|
|
182
|
+
### 3.1 Identify Ambiguities
|
|
183
|
+
Based on discovery and exploration, identify unclear aspects:
|
|
136
184
|
|
|
137
|
-
|
|
185
|
+
IF ambiguities exist:
|
|
186
|
+
USE AskUserQuestion tool:
|
|
187
|
+
```
|
|
188
|
+
- Scope: "Should this include {edge case}?"
|
|
189
|
+
- Tech: "Prefer {option A} or {option B}?"
|
|
190
|
+
- Priority: "Is {sub-feature} required now or later?"
|
|
191
|
+
```
|
|
192
|
+
WAIT for answers
|
|
193
|
+
UPDATE requirements based on answers
|
|
194
|
+
|
|
195
|
+
IF no ambiguities:
|
|
196
|
+
OUTPUT: "Requirements are clear. Proceeding to design."
|
|
138
197
|
|
|
139
|
-
|
|
198
|
+
---
|
|
140
199
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
4.
|
|
146
|
-
|
|
200
|
+
## PHASE 4: Design
|
|
201
|
+
|
|
202
|
+
OUTPUT: "## Phase 4: Architecture Design"
|
|
203
|
+
|
|
204
|
+
### 4.0 UX/UI Analysis (Frontend Features)
|
|
205
|
+
|
|
206
|
+
**CRITICAL**: If feature involves UI/frontend, apply UX/UI agent FIRST.
|
|
207
|
+
|
|
208
|
+
CHECK: Does feature involve frontend/UI?
|
|
209
|
+
- Keywords: page, component, form, button, modal, dashboard, view, screen, UI, interface
|
|
210
|
+
- File types affected: .tsx, .jsx, .vue, .svelte, .swift, .kt, .dart
|
|
211
|
+
|
|
212
|
+
IF frontend feature:
|
|
213
|
+
READ: `{globalPath}/agents/uxui.md`
|
|
214
|
+
|
|
215
|
+
IF agent not found:
|
|
216
|
+
OUTPUT: "⚠️ UX/UI agent not found. Run /p:sync to generate."
|
|
217
|
+
CONTINUE without UX/UI analysis
|
|
218
|
+
|
|
219
|
+
ELSE:
|
|
220
|
+
OUTPUT: "### 4.0 UX/UI Analysis"
|
|
221
|
+
|
|
222
|
+
### Apply UX Checklist (MANDATORY)
|
|
223
|
+
```
|
|
224
|
+
**User Analysis:**
|
|
225
|
+
- Who: {describe the user}
|
|
226
|
+
- Problem: {what pain point this solves}
|
|
227
|
+
- Happy Path: {ideal flow}
|
|
228
|
+
- Edge Cases: {what can go wrong}
|
|
229
|
+
|
|
230
|
+
**UX Requirements:**
|
|
231
|
+
- [ ] User understands action in < 3 seconds
|
|
232
|
+
- [ ] Each action has visual feedback
|
|
233
|
+
- [ ] Errors are clear and recoverable
|
|
234
|
+
- [ ] Keyboard navigation supported
|
|
235
|
+
- [ ] Contrast ratio >= 4.5:1
|
|
236
|
+
- [ ] Touch targets >= 44px (mobile)
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### Ask Aesthetic Direction
|
|
240
|
+
USE AskUserQuestion:
|
|
241
|
+
```
|
|
242
|
+
question: "¿Qué dirección estética para este feature?"
|
|
243
|
+
header: "Aesthetic"
|
|
244
|
+
options:
|
|
245
|
+
- label: "Minimal"
|
|
246
|
+
description: "Clean, professional. Best for B2B, productivity tools"
|
|
247
|
+
- label: "Bold/Maximalist"
|
|
248
|
+
description: "Striking, modern. Best for creative, entertainment"
|
|
249
|
+
- label: "Soft/Organic"
|
|
250
|
+
description: "Friendly, approachable. Best for wellness, lifestyle"
|
|
251
|
+
- label: "Brutalist"
|
|
252
|
+
description: "Raw, technical. Best for dev tools, startups"
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
SET: {aestheticDirection} = user's choice
|
|
256
|
+
|
|
257
|
+
OUTPUT:
|
|
258
|
+
```
|
|
259
|
+
**Aesthetic:** {aestheticDirection}
|
|
260
|
+
|
|
261
|
+
**UI Guidelines Applied:**
|
|
262
|
+
- Typography: Distinctive fonts (avoiding Inter, Roboto, Arial)
|
|
263
|
+
- Color: 60-30-10 framework with personality
|
|
264
|
+
- Animation: Purposeful micro-interactions
|
|
265
|
+
- Layout: Memorable composition (not generic centered)
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### 4.1 Generate Options
|
|
269
|
+
Based on exploration (and UX/UI analysis if frontend), design 2-3 approaches:
|
|
270
|
+
|
|
271
|
+
OUTPUT:
|
|
272
|
+
```
|
|
273
|
+
### Option 1: Minimal Changes
|
|
274
|
+
- Approach: {description}
|
|
275
|
+
- Files: {count} files modified
|
|
276
|
+
- Pros: Fast, low risk
|
|
277
|
+
- Cons: {tradeoff}
|
|
278
|
+
|
|
279
|
+
### Option 2: Clean Architecture
|
|
280
|
+
- Approach: {description}
|
|
281
|
+
- Files: {count} files modified
|
|
282
|
+
- Pros: Maintainable, testable
|
|
283
|
+
- Cons: More work upfront
|
|
284
|
+
|
|
285
|
+
### Option 3: Pragmatic Balance (Recommended)
|
|
286
|
+
- Approach: {description}
|
|
287
|
+
- Files: {count} files modified
|
|
288
|
+
- Pros: Balance of speed and quality
|
|
289
|
+
- Cons: {minor tradeoff}
|
|
290
|
+
```
|
|
147
291
|
|
|
148
|
-
###
|
|
149
|
-
|
|
292
|
+
### 4.2 Get Approval
|
|
293
|
+
USE AskUserQuestion:
|
|
150
294
|
```
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
6. Write auth tests
|
|
295
|
+
question: "Which architecture approach?"
|
|
296
|
+
options:
|
|
297
|
+
- "Option 1: Minimal Changes"
|
|
298
|
+
- "Option 2: Clean Architecture"
|
|
299
|
+
- "Option 3: Pragmatic Balance (Recommended)"
|
|
157
300
|
```
|
|
158
301
|
|
|
302
|
+
SET: {chosenApproach} = user's choice
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## PHASE 5: Implementation
|
|
307
|
+
|
|
308
|
+
OUTPUT: "## Phase 5: Task Breakdown"
|
|
309
|
+
|
|
310
|
+
### 5.1 Generate Tasks
|
|
311
|
+
Based on {chosenApproach}, break into tasks:
|
|
312
|
+
|
|
313
|
+
Rules:
|
|
314
|
+
1. Each task: 30min - 2h
|
|
315
|
+
2. Atomic (one concern each)
|
|
316
|
+
3. Ordered by dependency
|
|
317
|
+
4. Include testing as final task
|
|
318
|
+
|
|
159
319
|
GENERATE: {tasks} = list of task descriptions
|
|
160
320
|
GENERATE: {featureId} = UUID v4
|
|
161
321
|
SET: {now} = GetTimestamp()
|
|
162
322
|
|
|
163
|
-
|
|
323
|
+
### 5.2 Show Task List
|
|
324
|
+
OUTPUT:
|
|
325
|
+
```
|
|
326
|
+
Tasks for {feature}:
|
|
327
|
+
1. {task 1}
|
|
328
|
+
2. {task 2}
|
|
329
|
+
3. {task 3}
|
|
330
|
+
...
|
|
331
|
+
n. Write tests and verify
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### 5.3 Impact Assessment
|
|
335
|
+
IF affects core functionality OR user-facing:
|
|
336
|
+
{impact} = "high"
|
|
337
|
+
ELSE IF affects internal systems:
|
|
338
|
+
{impact} = "medium"
|
|
339
|
+
ELSE:
|
|
340
|
+
{impact} = "low"
|
|
341
|
+
|
|
342
|
+
{effort} = estimate based on task count
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Step 3: Update Storage (SOURCE OF TRUTH)
|
|
164
347
|
|
|
165
348
|
### Update queue.json
|
|
166
349
|
|
|
@@ -192,7 +375,7 @@ APPEND all tasks to `tasks` array
|
|
|
192
375
|
SET: `lastUpdated` = {now}
|
|
193
376
|
WRITE: `{queuePath}`
|
|
194
377
|
|
|
195
|
-
## Step
|
|
378
|
+
## Step 4: Generate Context (FOR CLAUDE)
|
|
196
379
|
|
|
197
380
|
### Generate context/next.md
|
|
198
381
|
|
|
@@ -219,7 +402,7 @@ TRANSFORM to markdown:
|
|
|
219
402
|
|
|
220
403
|
WRITE: `{nextContextPath}`
|
|
221
404
|
|
|
222
|
-
## Step
|
|
405
|
+
## Step 5: Auto-Start First Task
|
|
223
406
|
|
|
224
407
|
READ: `{statePath}`
|
|
225
408
|
|
|
@@ -261,7 +444,7 @@ IF no currentTask:
|
|
|
261
444
|
ELSE:
|
|
262
445
|
{autoStarted} = false
|
|
263
446
|
|
|
264
|
-
## Step
|
|
447
|
+
## Step 6: Queue Sync Events
|
|
265
448
|
|
|
266
449
|
READ: `{syncPath}` or create empty array
|
|
267
450
|
|
|
@@ -316,7 +499,7 @@ IF {autoStarted}:
|
|
|
316
499
|
|
|
317
500
|
WRITE: `{syncPath}`
|
|
318
501
|
|
|
319
|
-
## Step
|
|
502
|
+
## Step 7: Log to Memory
|
|
320
503
|
|
|
321
504
|
APPEND to: `{memoryPath}`
|
|
322
505
|
```json
|
|
@@ -365,43 +548,148 @@ Next:
|
|
|
365
548
|
|
|
366
549
|
## Examples
|
|
367
550
|
|
|
368
|
-
### Example 1:
|
|
369
|
-
Input: `/p:feature add
|
|
551
|
+
### Example 1: Full 7-Phase Workflow
|
|
552
|
+
Input: `/p:feature add user authentication`
|
|
370
553
|
|
|
371
554
|
```
|
|
372
|
-
|
|
555
|
+
## Phase 1: Discovery
|
|
556
|
+
|
|
557
|
+
Building: OAuth2 authentication with JWT tokens
|
|
558
|
+
|
|
559
|
+
Requirements:
|
|
560
|
+
- Support Google and GitHub OAuth
|
|
561
|
+
- Session persistence
|
|
562
|
+
- Secure token handling
|
|
563
|
+
|
|
564
|
+
Success looks like:
|
|
565
|
+
- Users can log in via OAuth
|
|
566
|
+
- Sessions persist across browser refreshes
|
|
567
|
+
|
|
568
|
+
---
|
|
569
|
+
|
|
570
|
+
## Phase 2: Codebase Exploration
|
|
571
|
+
|
|
572
|
+
Found similar:
|
|
573
|
+
- Session middleware in src/middleware/session.ts
|
|
574
|
+
- User model in src/models/user.ts
|
|
575
|
+
|
|
576
|
+
Patterns used:
|
|
577
|
+
- Middleware pattern for auth checks
|
|
578
|
+
- Repository pattern for data access
|
|
373
579
|
|
|
374
|
-
|
|
375
|
-
|
|
580
|
+
Key files to modify:
|
|
581
|
+
- src/routes/auth.ts (new)
|
|
582
|
+
- src/middleware/session.ts (extend)
|
|
583
|
+
- src/models/user.ts (add OAuth fields)
|
|
376
584
|
|
|
377
|
-
|
|
585
|
+
---
|
|
586
|
+
|
|
587
|
+
## Phase 3: Clarifying Questions
|
|
588
|
+
|
|
589
|
+
Which OAuth providers should we support?
|
|
590
|
+
> [User selected: Google and GitHub]
|
|
591
|
+
|
|
592
|
+
Should we support "Remember me" functionality?
|
|
593
|
+
> [User selected: Yes, 30-day tokens]
|
|
594
|
+
|
|
595
|
+
---
|
|
596
|
+
|
|
597
|
+
## Phase 4: Architecture Design
|
|
598
|
+
|
|
599
|
+
### Option 1: Minimal Changes
|
|
600
|
+
- Extend existing session middleware
|
|
601
|
+
- Pros: Fast
|
|
602
|
+
- Cons: Coupling
|
|
603
|
+
|
|
604
|
+
### Option 2: Clean Architecture
|
|
605
|
+
- New AuthService with strategy pattern
|
|
606
|
+
- Pros: Testable, extensible
|
|
607
|
+
- Cons: More files
|
|
608
|
+
|
|
609
|
+
### Option 3: Pragmatic Balance (Recommended)
|
|
610
|
+
- OAuthProvider abstraction, integrate with existing session
|
|
611
|
+
- Pros: Clean boundaries, reuses existing code
|
|
612
|
+
- Cons: None significant
|
|
613
|
+
|
|
614
|
+
Which approach? > [User selected: Option 3]
|
|
615
|
+
|
|
616
|
+
---
|
|
617
|
+
|
|
618
|
+
## Phase 5: Task Breakdown
|
|
619
|
+
|
|
620
|
+
Tasks for user authentication:
|
|
621
|
+
1. Create OAuthProvider interface
|
|
622
|
+
2. Implement GoogleOAuthProvider
|
|
623
|
+
3. Implement GitHubOAuthProvider
|
|
624
|
+
4. Add OAuth routes (/auth/google, /auth/github)
|
|
625
|
+
5. Extend session middleware for OAuth tokens
|
|
626
|
+
6. Add "Remember me" token refresh
|
|
627
|
+
7. Write auth integration tests
|
|
628
|
+
|
|
629
|
+
Impact: high | Effort: 6-8h
|
|
630
|
+
|
|
631
|
+
---
|
|
632
|
+
|
|
633
|
+
✅ Added: add user authentication
|
|
378
634
|
|
|
379
|
-
|
|
380
|
-
1. Setup theme context/state
|
|
381
|
-
2. Add toggle component
|
|
382
|
-
3. Apply theme to components
|
|
635
|
+
🎯 Started: Create OAuthProvider interface
|
|
383
636
|
|
|
384
637
|
Next: /p:done | /p:next
|
|
385
638
|
```
|
|
386
639
|
|
|
387
|
-
### Example 2:
|
|
388
|
-
Input: `/p:feature
|
|
640
|
+
### Example 2: Frontend Feature with UX/UI Analysis
|
|
641
|
+
Input: `/p:feature add dark mode toggle`
|
|
389
642
|
|
|
390
643
|
```
|
|
391
|
-
|
|
644
|
+
## Phase 1: Discovery
|
|
645
|
+
Building: Dark mode toggle in settings
|
|
646
|
+
|
|
647
|
+
## Phase 2: Exploration
|
|
648
|
+
Found: Theme context exists in src/context/theme.tsx
|
|
649
|
+
Pattern: React Context for global state
|
|
650
|
+
|
|
651
|
+
## Phase 3: Questions
|
|
652
|
+
Requirements are clear. Proceeding to design.
|
|
653
|
+
|
|
654
|
+
## Phase 4: Design
|
|
655
|
+
|
|
656
|
+
### 4.0 UX/UI Analysis
|
|
657
|
+
|
|
658
|
+
**User Analysis:**
|
|
659
|
+
- Who: Users who prefer dark interfaces or work in low-light
|
|
660
|
+
- Problem: Eye strain, preference not respected
|
|
661
|
+
- Happy Path: Toggle → Instant switch → Preference saved
|
|
662
|
+
- Edge Cases: System preference, mid-animation toggle
|
|
663
|
+
|
|
664
|
+
**UX Requirements:**
|
|
665
|
+
- [x] User understands action in < 3 seconds (toggle is clear)
|
|
666
|
+
- [x] Each action has visual feedback (instant theme switch)
|
|
667
|
+
- [x] Errors are clear and recoverable (N/A - no error states)
|
|
668
|
+
- [x] Keyboard navigation supported (toggle focusable)
|
|
669
|
+
- [x] Contrast ratio >= 4.5:1 (both themes)
|
|
670
|
+
- [x] Touch targets >= 44px (toggle size)
|
|
671
|
+
|
|
672
|
+
**Aesthetic:** Minimal
|
|
673
|
+
- Typography: System font (matches app)
|
|
674
|
+
- Animation: Smooth 200ms transition
|
|
675
|
+
- Layout: Toggle in settings, icon in header
|
|
676
|
+
|
|
677
|
+
### Architecture
|
|
678
|
+
Recommending: Extend existing theme context
|
|
679
|
+
(Simple feature, only 1 approach needed)
|
|
680
|
+
|
|
681
|
+
## Phase 5: Tasks
|
|
682
|
+
1. Add dark mode colors to theme context
|
|
683
|
+
2. Create toggle component with a11y support
|
|
684
|
+
3. Add smooth transition animation (200ms)
|
|
685
|
+
4. Persist preference to localStorage
|
|
686
|
+
5. Detect system preference as default
|
|
392
687
|
|
|
393
|
-
|
|
394
|
-
Tasks: 6
|
|
688
|
+
---
|
|
395
689
|
|
|
396
|
-
|
|
690
|
+
✅ Added: add dark mode toggle
|
|
397
691
|
|
|
398
|
-
|
|
399
|
-
1. Research auth patterns
|
|
400
|
-
2. Setup auth middleware
|
|
401
|
-
3. Implement login
|
|
402
|
-
4. Implement logout
|
|
403
|
-
5. Add session management
|
|
404
|
-
6. Write auth tests
|
|
692
|
+
🎯 Started: Add dark mode colors to theme context
|
|
405
693
|
|
|
406
694
|
Next: /p:done | /p:next
|
|
407
695
|
```
|