prjct-cli 0.18.2 → 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.
Files changed (246) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/CLAUDE.md +74 -211
  3. package/core/agentic/prompt-builder.ts +3 -7
  4. package/core/command-registry/optional-commands.ts +0 -20
  5. package/core/infrastructure/command-installer/command-installer.ts +8 -1
  6. package/core/infrastructure/command-installer/global-config.ts +31 -1
  7. package/core/infrastructure/command-installer/index.ts +1 -1
  8. package/core/infrastructure/setup.ts +3 -0
  9. package/package.json +3 -17
  10. package/templates/agentic/agents/uxui.md +210 -0
  11. package/templates/commands/bug.md +219 -41
  12. package/templates/commands/done.md +57 -258
  13. package/templates/commands/feature.md +368 -80
  14. package/templates/commands/now.md +72 -277
  15. package/templates/commands/ship.md +167 -246
  16. package/templates/commands/sync.md +62 -3
  17. package/templates/commands/test.md +160 -20
  18. package/templates/global/CLAUDE.md +40 -205
  19. package/templates/global/docs/agents.md +88 -0
  20. package/templates/global/docs/architecture.md +103 -0
  21. package/templates/global/docs/commands.md +98 -0
  22. package/templates/global/docs/validation.md +95 -0
  23. package/bin/dev.js +0 -216
  24. package/bin/serve.js +0 -361
  25. package/packages/web/README.md +0 -36
  26. package/packages/web/app/api/claude/sessions/route.ts +0 -44
  27. package/packages/web/app/api/claude/status/route.ts +0 -34
  28. package/packages/web/app/api/projects/[id]/icon/route.ts +0 -33
  29. package/packages/web/app/api/projects/[id]/momentum/route.ts +0 -257
  30. package/packages/web/app/api/projects/[id]/route.ts +0 -29
  31. package/packages/web/app/api/projects/[id]/stats/route.ts +0 -41
  32. package/packages/web/app/api/projects/[id]/status/route.ts +0 -21
  33. package/packages/web/app/api/projects/route.ts +0 -16
  34. package/packages/web/app/api/sessions/current/route.ts +0 -132
  35. package/packages/web/app/api/sessions/history/route.ts +0 -204
  36. package/packages/web/app/error.tsx +0 -34
  37. package/packages/web/app/favicon.ico +0 -0
  38. package/packages/web/app/globals.css +0 -198
  39. package/packages/web/app/layout.tsx +0 -53
  40. package/packages/web/app/loading.tsx +0 -7
  41. package/packages/web/app/not-found.tsx +0 -25
  42. package/packages/web/app/page.tsx +0 -12
  43. package/packages/web/app/project/[id]/code/layout.tsx +0 -18
  44. package/packages/web/app/project/[id]/code/page.tsx +0 -408
  45. package/packages/web/app/project/[id]/error.tsx +0 -41
  46. package/packages/web/app/project/[id]/loading.tsx +0 -9
  47. package/packages/web/app/project/[id]/not-found.tsx +0 -27
  48. package/packages/web/app/project/[id]/page.tsx +0 -384
  49. package/packages/web/app/project/[id]/reports/page.tsx +0 -59
  50. package/packages/web/app/project/[id]/reports/print/page.tsx +0 -58
  51. package/packages/web/app/sessions/page.tsx +0 -165
  52. package/packages/web/app/settings/page.tsx +0 -151
  53. package/packages/web/components/ActivityTimeline/ActivityTimeline.constants.ts +0 -2
  54. package/packages/web/components/ActivityTimeline/ActivityTimeline.tsx +0 -49
  55. package/packages/web/components/ActivityTimeline/ActivityTimeline.types.ts +0 -8
  56. package/packages/web/components/ActivityTimeline/hooks/index.ts +0 -2
  57. package/packages/web/components/ActivityTimeline/hooks/useExpandable.ts +0 -9
  58. package/packages/web/components/ActivityTimeline/hooks/useGroupedEvents.ts +0 -23
  59. package/packages/web/components/ActivityTimeline/index.ts +0 -2
  60. package/packages/web/components/AgentsCard/AgentsCard.tsx +0 -93
  61. package/packages/web/components/AgentsCard/AgentsCard.types.ts +0 -14
  62. package/packages/web/components/AgentsCard/index.ts +0 -2
  63. package/packages/web/components/AppSidebar/AppSidebar.tsx +0 -316
  64. package/packages/web/components/AppSidebar/index.ts +0 -1
  65. package/packages/web/components/BackLink/BackLink.tsx +0 -18
  66. package/packages/web/components/BackLink/BackLink.types.ts +0 -5
  67. package/packages/web/components/BackLink/index.ts +0 -2
  68. package/packages/web/components/BentoCard/BentoCard.constants.ts +0 -16
  69. package/packages/web/components/BentoCard/BentoCard.tsx +0 -48
  70. package/packages/web/components/BentoCard/BentoCard.types.ts +0 -15
  71. package/packages/web/components/BentoCard/index.ts +0 -2
  72. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.constants.ts +0 -9
  73. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.tsx +0 -18
  74. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.types.ts +0 -5
  75. package/packages/web/components/BentoCardSkeleton/index.ts +0 -2
  76. package/packages/web/components/BentoGrid/BentoGrid.tsx +0 -18
  77. package/packages/web/components/BentoGrid/BentoGrid.types.ts +0 -4
  78. package/packages/web/components/BentoGrid/index.ts +0 -2
  79. package/packages/web/components/BlockersCard/BlockersCard.tsx +0 -75
  80. package/packages/web/components/BlockersCard/BlockersCard.types.ts +0 -12
  81. package/packages/web/components/BlockersCard/index.ts +0 -2
  82. package/packages/web/components/CommandBar/CommandBar.tsx +0 -67
  83. package/packages/web/components/CommandBar/index.ts +0 -1
  84. package/packages/web/components/CommandButton/CommandButton.tsx +0 -46
  85. package/packages/web/components/CommandButton/index.ts +0 -1
  86. package/packages/web/components/ConnectionStatus/ConnectionStatus.tsx +0 -29
  87. package/packages/web/components/ConnectionStatus/index.ts +0 -1
  88. package/packages/web/components/DashboardContent/DashboardContent.tsx +0 -284
  89. package/packages/web/components/DashboardContent/index.ts +0 -1
  90. package/packages/web/components/DateGroup/DateGroup.tsx +0 -18
  91. package/packages/web/components/DateGroup/DateGroup.types.ts +0 -6
  92. package/packages/web/components/DateGroup/DateGroup.utils.ts +0 -11
  93. package/packages/web/components/DateGroup/index.ts +0 -2
  94. package/packages/web/components/EmptyState/EmptyState.tsx +0 -76
  95. package/packages/web/components/EmptyState/EmptyState.types.ts +0 -11
  96. package/packages/web/components/EmptyState/index.ts +0 -2
  97. package/packages/web/components/EventRow/EventRow.constants.ts +0 -10
  98. package/packages/web/components/EventRow/EventRow.tsx +0 -49
  99. package/packages/web/components/EventRow/EventRow.types.ts +0 -7
  100. package/packages/web/components/EventRow/EventRow.utils.ts +0 -49
  101. package/packages/web/components/EventRow/index.ts +0 -2
  102. package/packages/web/components/ExpandButton/ExpandButton.tsx +0 -18
  103. package/packages/web/components/ExpandButton/ExpandButton.types.ts +0 -6
  104. package/packages/web/components/ExpandButton/index.ts +0 -2
  105. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.tsx +0 -14
  106. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.types.ts +0 -5
  107. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.utils.ts +0 -13
  108. package/packages/web/components/HealthGradientBackground/index.ts +0 -2
  109. package/packages/web/components/HeroSection/HeroSection.tsx +0 -92
  110. package/packages/web/components/HeroSection/HeroSection.types.ts +0 -14
  111. package/packages/web/components/HeroSection/HeroSection.utils.ts +0 -11
  112. package/packages/web/components/HeroSection/hooks/index.ts +0 -2
  113. package/packages/web/components/HeroSection/hooks/useCountUp.ts +0 -45
  114. package/packages/web/components/HeroSection/hooks/useWeeklyActivity.ts +0 -18
  115. package/packages/web/components/HeroSection/index.ts +0 -2
  116. package/packages/web/components/IdeasCard/IdeasCard.tsx +0 -115
  117. package/packages/web/components/IdeasCard/IdeasCard.types.ts +0 -10
  118. package/packages/web/components/IdeasCard/index.ts +0 -2
  119. package/packages/web/components/InsightMessage/InsightMessage.tsx +0 -9
  120. package/packages/web/components/InsightMessage/InsightMessage.types.ts +0 -3
  121. package/packages/web/components/InsightMessage/index.ts +0 -2
  122. package/packages/web/components/Logo/Logo.tsx +0 -65
  123. package/packages/web/components/Logo/index.ts +0 -1
  124. package/packages/web/components/MarkdownContent/MarkdownContent.tsx +0 -123
  125. package/packages/web/components/MarkdownContent/index.ts +0 -1
  126. package/packages/web/components/MasonryGrid/MasonryGrid.tsx +0 -18
  127. package/packages/web/components/MasonryGrid/index.ts +0 -1
  128. package/packages/web/components/MomentumWidget/MomentumWidget.tsx +0 -119
  129. package/packages/web/components/MomentumWidget/MomentumWidget.types.ts +0 -16
  130. package/packages/web/components/MomentumWidget/index.ts +0 -2
  131. package/packages/web/components/NowCard/NowCard.tsx +0 -118
  132. package/packages/web/components/NowCard/NowCard.types.ts +0 -16
  133. package/packages/web/components/NowCard/index.ts +0 -2
  134. package/packages/web/components/PageHeader/PageHeader.tsx +0 -24
  135. package/packages/web/components/PageHeader/index.ts +0 -1
  136. package/packages/web/components/ProgressRing/ProgressRing.constants.ts +0 -20
  137. package/packages/web/components/ProgressRing/ProgressRing.tsx +0 -51
  138. package/packages/web/components/ProgressRing/ProgressRing.types.ts +0 -11
  139. package/packages/web/components/ProgressRing/index.ts +0 -2
  140. package/packages/web/components/ProjectAvatar/ProjectAvatar.tsx +0 -54
  141. package/packages/web/components/ProjectAvatar/index.ts +0 -1
  142. package/packages/web/components/ProjectColorDot/ProjectColorDot.tsx +0 -37
  143. package/packages/web/components/ProjectColorDot/index.ts +0 -1
  144. package/packages/web/components/ProjectSelectorModal/ProjectSelectorModal.tsx +0 -104
  145. package/packages/web/components/ProjectSelectorModal/index.ts +0 -1
  146. package/packages/web/components/Providers/Providers.tsx +0 -48
  147. package/packages/web/components/Providers/index.ts +0 -1
  148. package/packages/web/components/QueueCard/QueueCard.tsx +0 -125
  149. package/packages/web/components/QueueCard/QueueCard.types.ts +0 -12
  150. package/packages/web/components/QueueCard/QueueCard.utils.ts +0 -12
  151. package/packages/web/components/QueueCard/index.ts +0 -2
  152. package/packages/web/components/RecoverCard/RecoverCard.tsx +0 -72
  153. package/packages/web/components/RecoverCard/RecoverCard.types.ts +0 -16
  154. package/packages/web/components/RecoverCard/index.ts +0 -2
  155. package/packages/web/components/RoadmapCard/RoadmapCard.tsx +0 -145
  156. package/packages/web/components/RoadmapCard/RoadmapCard.types.ts +0 -16
  157. package/packages/web/components/RoadmapCard/index.ts +0 -2
  158. package/packages/web/components/ShipsCard/ShipsCard.tsx +0 -95
  159. package/packages/web/components/ShipsCard/ShipsCard.types.ts +0 -14
  160. package/packages/web/components/ShipsCard/ShipsCard.utils.ts +0 -4
  161. package/packages/web/components/ShipsCard/index.ts +0 -2
  162. package/packages/web/components/SparklineChart/SparklineChart.tsx +0 -40
  163. package/packages/web/components/SparklineChart/SparklineChart.types.ts +0 -6
  164. package/packages/web/components/SparklineChart/index.ts +0 -2
  165. package/packages/web/components/StatsMasonry/StatsMasonry.tsx +0 -95
  166. package/packages/web/components/StatsMasonry/index.ts +0 -1
  167. package/packages/web/components/StreakCard/StreakCard.constants.ts +0 -2
  168. package/packages/web/components/StreakCard/StreakCard.tsx +0 -55
  169. package/packages/web/components/StreakCard/StreakCard.types.ts +0 -4
  170. package/packages/web/components/StreakCard/index.ts +0 -2
  171. package/packages/web/components/TasksCounter/TasksCounter.tsx +0 -14
  172. package/packages/web/components/TasksCounter/TasksCounter.types.ts +0 -3
  173. package/packages/web/components/TasksCounter/index.ts +0 -2
  174. package/packages/web/components/TechStackBadges/TechStackBadges.tsx +0 -28
  175. package/packages/web/components/TechStackBadges/index.ts +0 -1
  176. package/packages/web/components/TerminalDock/DockToggleTab.tsx +0 -29
  177. package/packages/web/components/TerminalDock/TerminalDock.tsx +0 -386
  178. package/packages/web/components/TerminalDock/TerminalDockTab.tsx +0 -130
  179. package/packages/web/components/TerminalDock/TerminalTabBar.tsx +0 -142
  180. package/packages/web/components/TerminalDock/index.ts +0 -2
  181. package/packages/web/components/TerminalTabs/TerminalTab.tsx +0 -95
  182. package/packages/web/components/TerminalTabs/TerminalTabs.tsx +0 -211
  183. package/packages/web/components/TerminalTabs/index.ts +0 -1
  184. package/packages/web/components/VelocityBadge/VelocityBadge.tsx +0 -32
  185. package/packages/web/components/VelocityBadge/VelocityBadge.types.ts +0 -3
  186. package/packages/web/components/VelocityBadge/index.ts +0 -2
  187. package/packages/web/components/VelocityCard/VelocityCard.tsx +0 -73
  188. package/packages/web/components/VelocityCard/VelocityCard.types.ts +0 -7
  189. package/packages/web/components/VelocityCard/index.ts +0 -2
  190. package/packages/web/components/WeeklyReports/PrintableReport.tsx +0 -259
  191. package/packages/web/components/WeeklyReports/ReportPreviewCard.tsx +0 -187
  192. package/packages/web/components/WeeklyReports/WeekCalendar.tsx +0 -288
  193. package/packages/web/components/WeeklyReports/WeeklyReports.tsx +0 -149
  194. package/packages/web/components/WeeklyReports/index.ts +0 -4
  195. package/packages/web/components/WeeklySparkline/WeeklySparkline.tsx +0 -25
  196. package/packages/web/components/WeeklySparkline/WeeklySparkline.types.ts +0 -4
  197. package/packages/web/components/WeeklySparkline/index.ts +0 -2
  198. package/packages/web/components/charts/SessionsChart.tsx +0 -175
  199. package/packages/web/components/ui/alert-dialog.tsx +0 -157
  200. package/packages/web/components/ui/badge.tsx +0 -46
  201. package/packages/web/components/ui/button.tsx +0 -60
  202. package/packages/web/components/ui/card.tsx +0 -92
  203. package/packages/web/components/ui/chart.tsx +0 -385
  204. package/packages/web/components/ui/dialog.tsx +0 -143
  205. package/packages/web/components/ui/drawer.tsx +0 -135
  206. package/packages/web/components/ui/dropdown-menu.tsx +0 -257
  207. package/packages/web/components/ui/input.tsx +0 -21
  208. package/packages/web/components/ui/scroll-area.tsx +0 -58
  209. package/packages/web/components/ui/select.tsx +0 -187
  210. package/packages/web/components/ui/sheet.tsx +0 -139
  211. package/packages/web/components/ui/tabs.tsx +0 -66
  212. package/packages/web/components/ui/tooltip.tsx +0 -61
  213. package/packages/web/components.json +0 -22
  214. package/packages/web/context/GlobalTerminalContext.tsx +0 -538
  215. package/packages/web/context/TerminalContext.tsx +0 -45
  216. package/packages/web/context/TerminalTabsContext.tsx +0 -181
  217. package/packages/web/eslint.config.mjs +0 -18
  218. package/packages/web/hooks/useClaudeTerminal.ts +0 -425
  219. package/packages/web/hooks/useProjectStats.ts +0 -93
  220. package/packages/web/hooks/useProjects.ts +0 -73
  221. package/packages/web/lib/actions/projects.ts +0 -15
  222. package/packages/web/lib/commands.ts +0 -81
  223. package/packages/web/lib/format.ts +0 -23
  224. package/packages/web/lib/generate-week-report.ts +0 -285
  225. package/packages/web/lib/parse-prjct-files.ts +0 -1123
  226. package/packages/web/lib/project-colors.ts +0 -58
  227. package/packages/web/lib/projects.ts +0 -506
  228. package/packages/web/lib/pty.ts +0 -101
  229. package/packages/web/lib/query-config.ts +0 -44
  230. package/packages/web/lib/services/index.ts +0 -9
  231. package/packages/web/lib/services/projects.server.ts +0 -66
  232. package/packages/web/lib/services/stats.server.ts +0 -562
  233. package/packages/web/lib/unified-loader.ts +0 -396
  234. package/packages/web/lib/utils.ts +0 -6
  235. package/packages/web/next-env.d.ts +0 -6
  236. package/packages/web/next.config.ts +0 -7
  237. package/packages/web/package.json +0 -57
  238. package/packages/web/postcss.config.mjs +0 -7
  239. package/packages/web/public/file.svg +0 -1
  240. package/packages/web/public/globe.svg +0 -1
  241. package/packages/web/public/next.svg +0 -1
  242. package/packages/web/public/vercel.svg +0 -1
  243. package/packages/web/public/window.svg +0 -1
  244. package/packages/web/server.ts +0 -312
  245. package/packages/web/tsconfig.json +0 -34
  246. package/templates/commands/serve.md +0 -121
@@ -1,267 +1,126 @@
1
1
  ---
2
2
  allowed-tools: [Read, Write, Bash]
3
3
  description: 'Set or show current task with session tracking'
4
- timestamp-rule: 'GetTimestamp() for ALL timestamps'
5
- architecture: 'Write-Through (JSON → MD → Events)'
6
- storage-layer: true
7
- source-of-truth: 'storage/state.json'
8
- claude-context: 'context/now.md'
9
- backend-sync: 'sync/pending.json'
10
4
  ---
11
5
 
12
- # /p:now - Current Task with Session Tracking
6
+ # /p:now - Current Task
13
7
 
14
- ## Architecture: Write-Through Pattern
8
+ Start a new task or show current task status.
15
9
 
10
+ ## Usage
16
11
  ```
17
- User Action → Storage (JSON) → Context (MD) → Sync Events
12
+ /p:now [task] [estimate]
18
13
  ```
14
+ - `task`: Description of what you're working on
15
+ - `estimate`: Time estimate (e.g., "2h", "30m", "1d")
19
16
 
20
- **Source of Truth**: `storage/state.json`
21
- **Claude Context**: `context/now.md` (generated)
22
- **Backend Sync**: `sync/pending.json` (events)
23
-
24
- ## Context Variables
25
- - `{projectId}`: From `.prjct/prjct.config.json`
26
- - `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
27
- - `{statePath}`: `{globalPath}/storage/state.json`
28
- - `{nowContextPath}`: `{globalPath}/context/now.md`
29
- - `{syncPath}`: `{globalPath}/sync/pending.json`
30
- - `{memoryPath}`: `{globalPath}/memory/events.jsonl`
31
- - `{task}`: User-provided task (optional)
32
- - `{estimate}`: User-provided time estimate (optional, e.g., "2h", "30m", "1d")
33
-
34
- ## Estimate Format
35
-
36
- Estimates use simple duration format:
37
- - `30m` - 30 minutes
38
- - `2h` - 2 hours
39
- - `1d` - 1 day (8 hours)
40
- - `2h30m` - 2 hours 30 minutes
41
-
42
- If no estimate provided, gently remind:
43
- ```
44
- 💡 Tip: Add estimate next time with /p:now "task" 2h
45
- ```
46
-
47
- ## Agent Detection (Optional)
48
-
49
- When starting a task, auto-detect the best agent based on keywords:
50
-
51
- | Keywords | Agent | Domain |
52
- |----------|-------|--------|
53
- | UI, frontend, React, component, CSS, style | `fe` | Frontend |
54
- | API, backend, database, server, endpoint | `be` | Backend |
55
- | design, UX, layout, wireframe | `ux` | UX Design |
56
- | test, QA, bug, coverage, spec | `qa` | Testing |
57
- | docs, README, documentation | `docs` | Documentation |
58
- | (default) | `general` | General |
17
+ ## Flow
59
18
 
60
- **Usage**: Agent is logged for analytics but doesn't affect workflow.
19
+ ### Step 1: Validate
20
+ READ: `.prjct/prjct.config.json` → extract `projectId`
21
+ IF missing: "No prjct project. Run /p:init first." → STOP
61
22
 
62
- ## Step 0: Detect Abandoned Sessions (BEFORE anything else)
23
+ SET: `{globalPath}` = `~/.prjct-cli/projects/{projectId}`
63
24
 
64
- READ: `{statePath}` (`storage/state.json`)
25
+ READ: `{globalPath}/storage/state.json`
65
26
 
66
- IF file exists AND has `currentTask`:
67
- SET: {existingTask} = currentTask object
68
- SET: {lastActivity} = existingTask.startedAt or last timeline entry
69
- SET: {hoursAgo} = hours between {lastActivity} and now
27
+ ### Step 2: Handle Cases
70
28
 
71
- IF {hoursAgo} >= 8: // Session considered abandoned after 8 hours
72
- OUTPUT:
73
- ```
74
- ⚠️ Found abandoned session from {hoursAgo}h ago
75
-
76
- Task: {existingTask.description}
77
- Session: {existingTask.sessionId}
78
- Started: {existingTask.startedAt}
79
-
80
- Options:
81
- 1. Resume previous task → /p:resume
82
- 2. Close previous as partial → /p:recover close
83
- 3. View full context → /p:recover
84
-
85
- Choose an option before starting a new task.
86
- ```
87
- STOP
88
-
89
- ## Step 1: Read Config
90
-
91
- READ: `.prjct/prjct.config.json`
92
- EXTRACT: `projectId`
93
-
94
- IF file not found:
95
- OUTPUT: "No prjct project. Run /p:init first."
96
- STOP
97
-
98
- ## Step 2: Check Current State
99
-
100
- ### Read state.json (source of truth)
101
- READ: `{statePath}`
102
-
103
- IF file exists:
104
- PARSE JSON
105
- EXTRACT: {currentTask}, {pausedTask} if present
106
-
107
- ## Step 3: Handle Cases
108
-
109
- ### Case A: No task provided - Show current
110
- IF {task} is empty OR not provided:
111
- IF {currentTask} exists AND {currentTask.status} == "active":
112
- CALCULATE: {elapsed} = time since {currentTask.startedAt}
29
+ **Case A: No task provided - Show current**
30
+ IF task not provided:
31
+ IF currentTask exists AND status == "active":
32
+ CALCULATE elapsed time
113
33
  OUTPUT:
114
34
  ```
115
35
  🎯 {currentTask.description}
116
36
 
117
- Session: {currentTask.sessionId}
118
- Started: {currentTask.startedAt} ({elapsed} ago)
119
- Status: active
37
+ Session: {sessionId}
38
+ Started: {elapsed} ago
120
39
 
121
40
  /p:done to complete | /p:pause to pause
122
41
  ```
123
42
  STOP
124
- ELSE IF {pausedTask} exists:
125
- OUTPUT:
126
- ```
127
- ⏸️ Paused: {pausedTask.description}
128
-
129
- Duration so far: {pausedTask.duration}
130
-
131
- /p:resume to continue | /p:done to complete
132
- ```
133
- STOP
134
43
  ELSE:
135
44
  OUTPUT: "No current task. Use /p:now <task> to start one."
136
45
  STOP
137
46
 
138
- ### Case B: Task provided - Create/Update session
139
- IF {task} is provided:
140
-
141
- ## Check for existing active task
142
- IF {currentTask} exists AND {currentTask.status} == "active":
143
- IF {currentTask.description} != {task}:
144
- OUTPUT:
145
- ```
146
- ⚠️ Already working on: {currentTask.description}
147
-
148
- Options:
149
- • /p:done - Complete current task first
150
- /p:pause - Pause and switch
151
- /p:now (same task) - Continue current
152
- ```
153
- STOP
154
-
155
- ## If same task, just continue
156
- IF {currentTask} AND {currentTask.description} == {task}:
157
- OUTPUT: "🎯 Continuing: {task}"
158
- STOP
47
+ **Case B: Task provided - Check conflicts**
48
+ IF currentTask exists AND status == "active" AND description != task:
49
+ OUTPUT:
50
+ ```
51
+ ⚠️ Already working on: {currentTask.description}
52
+
53
+ Options:
54
+ • /p:done - Complete current task first
55
+ /p:pause - Pause and switch
56
+ ```
57
+ STOP
58
+
59
+ **Case C: Same task - Continue**
60
+ IF currentTask.description == task:
61
+ OUTPUT: "🎯 Continuing: {task}"
62
+ STOP
63
+
64
+ ### Step 3: Create New Task
65
+ GET timestamp: `bun -e "console.log(new Date().toISOString())" 2>/dev/null || node -e "console.log(new Date().toISOString())"`
66
+ GET uuid: `bun -e "console.log(crypto.randomUUID())" 2>/dev/null || node -e "console.log(require('crypto').randomUUID())"`
159
67
 
160
- ## Create new task
161
- GENERATE: {taskId} = UUID v4
162
- GENERATE: {sessionId} = UUID v4
163
- SET: {startedAt} = GetTimestamp()
68
+ SET: `{taskId}` = uuid
69
+ SET: `{sessionId}` = uuid (different call)
70
+ SET: `{startedAt}` = timestamp
164
71
 
165
- ## Step 4: Write to Storage (SOURCE OF TRUTH)
72
+ IF estimate provided:
73
+ PARSE to seconds (30m=1800, 2h=7200, 1d=28800)
166
74
 
167
- ### Prepare task object
168
- ```json
169
- {
75
+ ### Step 4: Update Storage
76
+ WRITE to `{globalPath}/storage/state.json`:
77
+ ```json
78
+ {
79
+ "currentTask": {
170
80
  "id": "{taskId}",
171
81
  "description": "{task}",
172
82
  "status": "active",
173
83
  "startedAt": "{startedAt}",
174
84
  "sessionId": "{sessionId}",
175
- "estimate": "{estimate OR null}",
176
- "estimateSeconds": {estimateInSeconds OR null}
177
- }
178
- ```
179
-
180
- ### Write state.json
181
- READ existing `{statePath}` or create empty object
182
- SET: state.currentTask = new task object
183
- SET: state.lastUpdated = {startedAt}
184
- WRITE: `{statePath}`
185
-
186
- ## Step 5: Generate Context (FOR CLAUDE)
187
-
188
- WRITE: `{nowContextPath}`
189
-
190
- IF {estimate} provided:
191
- ```markdown
192
- # NOW
193
-
194
- **{task}**
195
-
196
- Started: {startedAt}
197
- Session: {sessionId}
198
- Estimate: {estimate}
199
- ```
200
-
201
- ELSE (no estimate):
202
- ```markdown
203
- # NOW
204
-
205
- **{task}**
206
-
207
- Started: {startedAt}
208
- Session: {sessionId}
209
- ```
210
-
211
- ## Step 6: Queue Sync Event (FOR BACKEND)
212
-
213
- READ: `{syncPath}` or create empty array
214
- APPEND event:
215
- ```json
216
- {
217
- "type": "task.started",
218
- "path": ["state"],
219
- "data": {
220
- "taskId": "{taskId}",
221
- "description": "{task}",
222
- "startedAt": "{startedAt}",
223
- "sessionId": "{sessionId}"
224
- },
225
- "timestamp": "{startedAt}",
226
- "projectId": "{projectId}"
227
- }
228
- ```
229
- WRITE: `{syncPath}`
85
+ "estimate": "{estimate}",
86
+ "estimateSeconds": {estimateSeconds}
87
+ },
88
+ "lastUpdated": "{startedAt}"
89
+ }
90
+ ```
230
91
 
231
- ## Step 7: Log to Memory (AUDIT TRAIL)
92
+ ### Step 5: Generate Context
93
+ WRITE: `{globalPath}/context/now.md`:
94
+ ```markdown
95
+ # NOW
232
96
 
233
- APPEND to: `{memoryPath}`
234
- Single line (JSONL):
97
+ **{task}**
235
98
 
236
- IF {estimate} provided:
237
- ```json
238
- {"timestamp":"{startedAt}","action":"task_started","taskId":"{taskId}","sessionId":"{sessionId}","task":"{task}","estimate":"{estimate}","estimateSeconds":{estimateInSeconds}}
239
- ```
99
+ Started: {startedAt}
100
+ Session: {sessionId}
101
+ ```
240
102
 
241
- ELSE:
242
- ```json
243
- {"timestamp":"{startedAt}","action":"task_started","taskId":"{taskId}","sessionId":"{sessionId}","task":"{task}"}
244
- ```
103
+ ### Step 6: Log Events
104
+ APPEND to `{globalPath}/sync/pending.json`
105
+ APPEND to `{globalPath}/memory/events.jsonl`
245
106
 
246
- ## Output
107
+ ### Step 7: Output
247
108
 
248
- SUCCESS (new task with estimate):
109
+ WITH estimate:
249
110
  ```
250
111
  🎯 {task}
251
112
 
252
113
  Session: {sessionId}
253
- Started: now
254
114
  Estimate: {estimate}
255
115
 
256
116
  /p:done when finished | /p:pause to take a break
257
117
  ```
258
118
 
259
- SUCCESS (new task without estimate):
119
+ WITHOUT estimate:
260
120
  ```
261
121
  🎯 {task}
262
122
 
263
123
  Session: {sessionId}
264
- Started: now
265
124
 
266
125
  💡 Tip: Add estimate next time with /p:now "task" 2h
267
126
 
@@ -276,70 +135,6 @@ Started: now
276
135
  | Active task exists | Show options | STOP |
277
136
  | Write fails | "Failed to create session" | STOP |
278
137
 
279
- ## File Structure Reference
280
-
281
- ```
282
- ~/.prjct-cli/projects/{projectId}/
283
- ├── storage/
284
- │ └── state.json # Source of truth (current + paused tasks)
285
- ├── context/
286
- │ └── now.md # Generated for Claude
287
- ├── sync/
288
- │ └── pending.json # Events for backend
289
- └── memory/
290
- └── events.jsonl # Audit trail
291
- ```
292
-
293
- ## Examples
294
-
295
- ### Example 1: Show Current Task
296
- ```
297
- User: /p:now
298
- Output:
299
- 🎯 Implement user authentication
300
-
301
- Session: 550e8400-e29b-41d4-a716-446655440000
302
- Started: 2 hours ago
303
- Status: active
304
-
305
- /p:done to complete | /p:pause to pause
306
- ```
307
-
308
- ### Example 2: Start New Task (without estimate)
309
- ```
310
- User: /p:now "Add login form"
311
- Output:
312
- 🎯 Add login form
313
-
314
- Session: 7c9e6679-7425-40de-944b-e07fc1f90ae7
315
- Started: now
316
-
317
- 💡 Tip: Add estimate next time with /p:now "task" 2h
318
-
319
- /p:done when finished | /p:pause to take a break
320
- ```
321
-
322
- ### Example 3: Start New Task (with estimate)
323
- ```
324
- User: /p:now "Add login form" 2h
325
- Output:
326
- 🎯 Add login form
327
-
328
- Session: 7c9e6679-7425-40de-944b-e07fc1f90ae7
329
- Started: now
330
- Estimate: 2h
331
-
332
- /p:done when finished | /p:pause to take a break
333
- ```
334
-
335
- ### Example 4: Task Conflict
336
- ```
337
- User: /p:now "Something else"
338
- Output:
339
- ⚠️ Already working on: Add login form
340
-
341
- Options:
342
- • /p:done - Complete current task first
343
- • /p:pause - Pause and switch
344
- • /p:now (same task) - Continue current
345
- ```
138
+ ## References
139
+ - Architecture: `~/.prjct-cli/docs/architecture.md`
140
+ - Commands: `~/.prjct-cli/docs/commands.md`