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,136 +1,63 @@
1
1
  ---
2
2
  allowed-tools: [Read, Write, Bash]
3
3
  description: 'Complete current task with session metrics'
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:done - Complete Current Task with Session Metrics
6
+ # /p:done - Complete Task
13
7
 
14
- ## Architecture: Write-Through Pattern
8
+ Mark current task as complete with metrics.
15
9
 
10
+ ## Usage
16
11
  ```
17
- User Action → Storage (JSON) → Context (MD) → Sync Events
12
+ /p:done
18
13
  ```
19
14
 
20
- **Source of Truth**: `storage/state.json`
21
- **Claude Context**: `context/now.md` (generated)
22
- **Backend Sync**: `sync/pending.json` (events)
15
+ ## Flow
23
16
 
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
- - `{sessionsPath}`: `{globalPath}/progress/sessions`
17
+ ### Step 1: Validate
18
+ READ: `.prjct/prjct.config.json` → extract `projectId`
19
+ IF missing: "No prjct project. Run /p:init first." → STOP
32
20
 
33
- ## Accuracy Calculation
21
+ SET: `{globalPath}` = `~/.prjct-cli/projects/{projectId}`
34
22
 
35
- When task had an estimate, calculate accuracy:
36
- - `{accuracy}` = 100 - |((actual - estimate) / estimate) * 100|
37
- - Cap accuracy at 100% (can't be more than 100%)
38
- - If actual < estimate: bonus (under-budget)
39
- - If actual > estimate: penalty (over-budget)
40
-
41
- **Example:**
42
- - Estimate: 2h (7200s), Actual: 2h 15m (8100s)
43
- - Accuracy = 100 - |((8100-7200)/7200)*100| = 100 - 12.5 = 87.5%
44
-
45
- ## Step 1: Read Config
46
-
47
- READ: `.prjct/prjct.config.json`
48
- EXTRACT: `projectId`
49
-
50
- IF file not found:
51
- OUTPUT: "No prjct project. Run /p:init first."
23
+ READ: `{globalPath}/storage/state.json`
24
+ IF no `currentTask` OR status != "active":
25
+ OUTPUT: "No active task. Use /p:now to start one."
52
26
  STOP
53
27
 
54
- ## Step 2: Check Current State
28
+ EXTRACT: `{task}` = currentTask.description
29
+ EXTRACT: `{startedAt}` = currentTask.startedAt
30
+ EXTRACT: `{sessionId}` = currentTask.sessionId
31
+ EXTRACT: `{estimate}` = currentTask.estimate (optional)
55
32
 
56
- ### Read state.json (source of truth)
57
- READ: `{statePath}`
33
+ ### Step 2: Calculate Metrics
34
+ GET timestamp: `bun -e "console.log(new Date().toISOString())" 2>/dev/null || node -e "console.log(new Date().toISOString())"`
35
+ SET: `{now}` = result
58
36
 
59
- IF file not found OR no currentTask:
60
- OUTPUT: "⚠️ No active task to complete. Use /p:now to start one."
61
- STOP
62
-
63
- PARSE JSON
64
- EXTRACT: {currentTask}
37
+ CALCULATE: `{duration}` = time between startedAt and now
38
+ FORMAT: as "Xh Ym" or "Xm"
65
39
 
66
- IF {currentTask.status} != "active":
67
- OUTPUT: "⚠️ No active task to complete. Use /p:now to start one."
68
- STOP
40
+ IF estimate exists:
41
+ CALCULATE: `{accuracy}` = 100 - |((actual - estimate) / estimate) * 100|
42
+ CAP at 0-100%
69
43
 
70
- ## Step 3: Calculate Metrics
71
-
72
- SET: {now} = GetTimestamp()
73
- SET: {startedAt} = {currentTask.startedAt}
74
-
75
- ### Calculate Duration
76
- SET: {durationSeconds} = seconds between {startedAt} and {now}
77
- SET: {durationFormatted} = format as "Xh Ym" or "Xm"
78
-
79
- ### Calculate Git Metrics
80
44
  BASH: `git rev-list --count --since="{startedAt}" HEAD 2>/dev/null || echo "0"`
81
- CAPTURE as {commits}
45
+ SET: `{commits}` = result
82
46
 
83
47
  BASH: `git diff --stat HEAD~{commits} 2>/dev/null || git diff --stat`
84
- PARSE output for:
85
- - {filesChanged}: number of files
86
- - {linesAdded}: insertions
87
- - {linesRemoved}: deletions
48
+ EXTRACT: `{filesChanged}`, `{linesAdded}`, `{linesRemoved}`
88
49
 
89
- ### Calculate Accuracy (if estimate exists)
90
- IF {currentTask.estimateSeconds} exists AND > 0:
91
- {accuracy} = 100 - Math.abs(((durationSeconds - estimateSeconds) / estimateSeconds) * 100)
92
- {accuracy} = Math.max(0, Math.min(100, {accuracy})) // Cap between 0-100
93
- {accuracyLabel} = accuracy >= 80 ? "✅" : accuracy >= 50 ? "⚠️" : "❌"
94
- ELSE:
95
- {accuracy} = null
96
- {accuracyLabel} = null
50
+ ### Step 3: Update Storage
51
+ Update `{globalPath}/storage/state.json`:
52
+ - Move currentTask to previousTask with status: "completed"
53
+ - Set currentTask = null
54
+ - Set lastUpdated = {now}
55
+ - Add completedAt, duration, accuracy, metrics
97
56
 
98
- ## Step 4: Update Storage (SOURCE OF TRUTH)
99
-
100
- ### Prepare completed task
101
- ```json
102
- {
103
- "id": "{currentTask.id}",
104
- "description": "{currentTask.description}",
105
- "status": "completed",
106
- "startedAt": "{currentTask.startedAt}",
107
- "completedAt": "{now}",
108
- "sessionId": "{currentTask.sessionId}",
109
- "duration": {durationSeconds},
110
- "estimate": "{currentTask.estimate}",
111
- "estimateSeconds": {currentTask.estimateSeconds},
112
- "accuracy": {accuracy},
113
- "metrics": {
114
- "filesChanged": {filesChanged},
115
- "linesAdded": {linesAdded},
116
- "linesRemoved": {linesRemoved},
117
- "commits": {commits}
118
- }
119
- }
120
- ```
121
-
122
- ### Update state.json
123
- READ: `{statePath}`
124
- SET: state.previousTask = completed task object
125
- SET: state.currentTask = null
126
- SET: state.lastUpdated = {now}
127
- WRITE: `{statePath}`
128
-
129
- ## Step 5: Generate Context (FOR CLAUDE)
130
-
131
- ### Clear now.md
132
- WRITE: `{nowContextPath}`
57
+ WRITE: `{globalPath}/storage/state.json`
133
58
 
59
+ ### Step 4: Generate Context
60
+ WRITE: `{globalPath}/context/now.md`:
134
61
  ```markdown
135
62
  # NOW
136
63
 
@@ -139,179 +66,51 @@ _No active task_
139
66
  Use `/p:now <task>` to start working.
140
67
  ```
141
68
 
142
- ## Step 6: Queue Sync Event (FOR BACKEND)
143
-
144
- READ: `{syncPath}` or create empty array
145
- APPEND event:
146
- ```json
147
- {
148
- "type": "task.completed",
149
- "path": ["state"],
150
- "data": {
151
- "taskId": "{currentTask.id}",
152
- "description": "{currentTask.description}",
153
- "startedAt": "{currentTask.startedAt}",
154
- "completedAt": "{now}",
155
- "duration": {durationSeconds},
156
- "accuracy": {accuracy},
157
- "metrics": {
158
- "filesChanged": {filesChanged},
159
- "linesAdded": {linesAdded},
160
- "linesRemoved": {linesRemoved},
161
- "commits": {commits}
162
- }
163
- },
164
- "timestamp": "{now}",
165
- "projectId": "{projectId}"
166
- }
167
- ```
168
- WRITE: `{syncPath}`
169
-
170
- ## Step 7: Log to Daily Session (for Dashboard Charts)
171
-
172
- GET: {date} = YYYY-MM-DD from {now}
173
- GET: {yearMonth} = YYYY-MM from {now}
174
- SET: {dailySessionPath} = `{sessionsPath}/{yearMonth}/{date}.jsonl`
175
-
176
- BASH: `mkdir -p {sessionsPath}/{yearMonth}`
177
-
178
- APPEND to: `{dailySessionPath}`
179
-
180
- Single line (JSONL format):
69
+ ### Step 5: Log Events
70
+ APPEND to `{globalPath}/sync/pending.json`:
181
71
  ```json
182
- {"ts":"{now}","type":"task_complete","task":"{currentTask.description}","duration":"{durationFormatted}","sessionId":"{currentTask.sessionId}"}
72
+ {"type":"task.completed","data":{...},"timestamp":"{now}"}
183
73
  ```
184
74
 
185
- ## Step 8: Log to Memory (AUDIT TRAIL)
186
-
187
- APPEND to: `{memoryPath}`
188
-
189
- Single line (JSONL format):
190
-
191
- IF {accuracy} exists:
75
+ APPEND to `{globalPath}/memory/events.jsonl`:
192
76
  ```json
193
- {"timestamp":"{now}","action":"task_completed","taskId":"{currentTask.id}","sessionId":"{currentTask.sessionId}","task":"{currentTask.description}","duration":{durationSeconds},"estimate":{estimateSeconds},"accuracy":{accuracy},"metrics":{"files":{filesChanged},"added":{linesAdded},"removed":{linesRemoved},"commits":{commits}}}
77
+ {"timestamp":"{now}","action":"task_completed","task":"{task}","duration":{seconds}}
194
78
  ```
195
79
 
196
- ELSE:
80
+ APPEND to `{globalPath}/progress/sessions/{YYYY-MM}/{date}.jsonl`:
197
81
  ```json
198
- {"timestamp":"{now}","action":"task_completed","taskId":"{currentTask.id}","sessionId":"{currentTask.sessionId}","task":"{currentTask.description}","duration":{durationSeconds},"metrics":{"files":{filesChanged},"added":{linesAdded},"removed":{linesRemoved},"commits":{commits}}}
82
+ {"ts":"{now}","type":"task_complete","task":"{task}","duration":"{duration}"}
199
83
  ```
200
84
 
201
- ## Output
85
+ ### Step 6: Output
202
86
 
203
- SUCCESS (with estimate):
87
+ WITH estimate:
204
88
  ```
205
- ✅ {currentTask.description} ({durationFormatted})
89
+ ✅ {task} ({duration})
206
90
 
207
- Estimate: {estimate} | Actual: {durationFormatted} | {accuracyLabel} Accuracy: {accuracy}%
91
+ Estimate: {estimate} | Actual: {duration} | Accuracy: {accuracy}%
92
+ Files: {filesChanged} | +{linesAdded}/-{linesRemoved} | Commits: {commits}
208
93
 
209
- Session: {currentTask.sessionId}
210
- Files: {filesChanged} | +{linesAdded}/-{linesRemoved}
211
- Commits: {commits}
212
-
213
- Next:
214
- • /p:now - Start next task
215
- • /p:ship - Ship completed work
216
- • /p:progress - View metrics
94
+ Next: /p:now | /p:ship | /p:progress
217
95
  ```
218
96
 
219
- SUCCESS (without estimate):
97
+ WITHOUT estimate:
220
98
  ```
221
- ✅ {currentTask.description} ({durationFormatted})
99
+ ✅ {task} ({duration})
222
100
 
223
- Session: {currentTask.sessionId}
224
- Files: {filesChanged} | +{linesAdded}/-{linesRemoved}
225
- Commits: {commits}
101
+ Files: {filesChanged} | +{linesAdded}/-{linesRemoved} | Commits: {commits}
226
102
 
227
- Next:
228
- • /p:now - Start next task
229
- • /p:ship - Ship completed work
230
- • /p:progress - View metrics
103
+ Next: /p:now | /p:ship | /p:progress
231
104
  ```
232
105
 
233
106
  ## Error Handling
234
107
 
235
108
  | Error | Response | Action |
236
109
  |-------|----------|--------|
237
- | Config not found | "No prjct project" | STOP |
238
- | No current task | "No active task" | STOP |
110
+ | No project | "No prjct project" | STOP |
111
+ | No active task | "No active task" | STOP |
239
112
  | Git fails | Use zeros for metrics | CONTINUE |
240
- | Write fails | Log warning | CONTINUE |
241
-
242
- ## File Structure Reference
243
-
244
- ```
245
- ~/.prjct-cli/projects/{projectId}/
246
- ├── storage/
247
- │ └── state.json # Source of truth
248
- ├── context/
249
- │ └── now.md # Generated (cleared on done)
250
- ├── sync/
251
- │ └── pending.json # Events for backend
252
- ├── progress/
253
- │ └── sessions/{YYYY-MM}/ # Daily session logs
254
- └── memory/
255
- └── events.jsonl # Audit trail
256
- ```
257
113
 
258
- ## Examples
259
-
260
- ### Example 1: Full Session Completion (with estimate)
261
- **State:**
262
- ```json
263
- {
264
- "currentTask": {
265
- "id": "550e8400-e29b-41d4-a716-446655440000",
266
- "description": "implement authentication",
267
- "status": "active",
268
- "startedAt": "2025-12-07T10:00:00.000Z",
269
- "estimate": "2h",
270
- "estimateSeconds": 7200
271
- }
272
- }
273
- ```
274
-
275
- **Git activity:**
276
- - 3 commits
277
- - 5 files changed
278
- - +120/-30 lines
279
- - Actual duration: 2h 15m (8100s)
280
- - Accuracy: 100 - |((8100-7200)/7200)*100| = 87.5%
281
-
282
- **Output:**
283
- ```
284
- ✅ implement authentication (2h 15m)
285
-
286
- Estimate: 2h | Actual: 2h 15m | ✅ Accuracy: 88%
287
-
288
- Session: 550e8400-e29b-41d4-a716-446655440000
289
- Files: 5 | +120/-30
290
- Commits: 3
291
-
292
- Next:
293
- • /p:now - Start next task
294
- • /p:ship - Ship completed work
295
- • /p:progress - View metrics
296
- ```
297
-
298
- ### Example 2: Session Completion (without estimate)
299
- **Output:**
300
- ```
301
- ✅ implement authentication (2h 15m)
302
-
303
- Session: 550e8400-e29b-41d4-a716-446655440000
304
- Files: 5 | +120/-30
305
- Commits: 3
306
-
307
- Next:
308
- • /p:now - Start next task
309
- • /p:ship - Ship completed work
310
- • /p:progress - View metrics
311
- ```
312
-
313
- ### Example 3: No Active Task
314
- **Output:**
315
- ```
316
- ⚠️ No active task to complete. Use /p:now to start one.
317
- ```
114
+ ## References
115
+ - Architecture: `~/.prjct-cli/docs/architecture.md`
116
+ - Validation: `~/.prjct-cli/docs/validation.md`