prjct-cli 0.11.5 → 0.12.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 (391) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +81 -25
  3. package/bin/dev.js +1 -1
  4. package/bin/generate-views.js +209 -0
  5. package/bin/migrate-to-json.js +742 -0
  6. package/bin/prjct +5 -5
  7. package/bin/serve.js +226 -50
  8. package/core/__tests__/agentic/{memory-system.test.js → memory-system.test.ts} +12 -23
  9. package/core/__tests__/agentic/{plan-mode.test.js → plan-mode.test.ts} +26 -24
  10. package/core/__tests__/agentic/{prompt-builder.test.js → prompt-builder.test.ts} +3 -8
  11. package/core/__tests__/utils/{date-helper.test.js → date-helper.test.ts} +19 -30
  12. package/core/__tests__/utils/{output.test.js → output.test.ts} +12 -24
  13. package/core/agentic/agent-router.ts +137 -0
  14. package/core/agentic/chain-of-thought.ts +228 -0
  15. package/core/agentic/command-executor/command-executor.ts +384 -0
  16. package/core/agentic/command-executor/index.ts +16 -0
  17. package/core/agentic/command-executor/status-signal.ts +38 -0
  18. package/core/agentic/command-executor/types.ts +79 -0
  19. package/core/agentic/command-executor.ts +8 -0
  20. package/core/agentic/{context-builder.js → context-builder.ts} +92 -81
  21. package/core/agentic/context-filter.ts +365 -0
  22. package/core/agentic/ground-truth/index.ts +76 -0
  23. package/core/agentic/ground-truth/types.ts +33 -0
  24. package/core/agentic/ground-truth/utils.ts +48 -0
  25. package/core/agentic/ground-truth/verifiers/analyze.ts +54 -0
  26. package/core/agentic/ground-truth/verifiers/done.ts +75 -0
  27. package/core/agentic/ground-truth/verifiers/feature.ts +70 -0
  28. package/core/agentic/ground-truth/verifiers/index.ts +37 -0
  29. package/core/agentic/ground-truth/verifiers/init.ts +52 -0
  30. package/core/agentic/ground-truth/verifiers/now.ts +57 -0
  31. package/core/agentic/ground-truth/verifiers/ship.ts +85 -0
  32. package/core/agentic/ground-truth/verifiers/spec.ts +45 -0
  33. package/core/agentic/ground-truth/verifiers/sync.ts +47 -0
  34. package/core/agentic/ground-truth/verifiers.ts +6 -0
  35. package/core/agentic/ground-truth.ts +8 -0
  36. package/core/agentic/loop-detector/error-analysis.ts +97 -0
  37. package/core/agentic/loop-detector/hallucination.ts +71 -0
  38. package/core/agentic/loop-detector/index.ts +41 -0
  39. package/core/agentic/loop-detector/loop-detector.ts +222 -0
  40. package/core/agentic/loop-detector/types.ts +66 -0
  41. package/core/agentic/loop-detector.ts +8 -0
  42. package/core/agentic/memory-system/history.ts +53 -0
  43. package/core/agentic/memory-system/index.ts +192 -0
  44. package/core/agentic/memory-system/patterns.ts +156 -0
  45. package/core/agentic/memory-system/semantic-memories.ts +277 -0
  46. package/core/agentic/memory-system/session.ts +21 -0
  47. package/core/agentic/memory-system/types.ts +159 -0
  48. package/core/agentic/memory-system.ts +8 -0
  49. package/core/agentic/parallel-tools.ts +165 -0
  50. package/core/agentic/plan-mode/approval.ts +57 -0
  51. package/core/agentic/plan-mode/constants.ts +44 -0
  52. package/core/agentic/plan-mode/index.ts +28 -0
  53. package/core/agentic/plan-mode/plan-mode.ts +406 -0
  54. package/core/agentic/plan-mode/types.ts +193 -0
  55. package/core/agentic/plan-mode.ts +8 -0
  56. package/core/agentic/prompt-builder.ts +566 -0
  57. package/core/agentic/response-templates.ts +164 -0
  58. package/core/agentic/semantic-compression.ts +273 -0
  59. package/core/agentic/services.ts +206 -0
  60. package/core/agentic/smart-context.ts +476 -0
  61. package/core/agentic/{template-loader.js → template-loader.ts} +27 -16
  62. package/core/agentic/think-blocks.ts +202 -0
  63. package/core/agentic/tool-registry.ts +119 -0
  64. package/core/agentic/validation-rules.ts +313 -0
  65. package/core/agents/index.ts +28 -0
  66. package/core/agents/performance.ts +444 -0
  67. package/core/agents/types.ts +126 -0
  68. package/core/bus/{index.js → index.ts} +57 -61
  69. package/core/command-registry/categories.ts +23 -0
  70. package/core/command-registry/commands.ts +15 -0
  71. package/core/command-registry/core-commands.ts +319 -0
  72. package/core/command-registry/index.ts +158 -0
  73. package/core/command-registry/optional-commands.ts +119 -0
  74. package/core/command-registry/setup-commands.ts +53 -0
  75. package/core/command-registry/types.ts +59 -0
  76. package/core/command-registry.ts +9 -0
  77. package/core/commands/analysis.ts +298 -0
  78. package/core/commands/analytics.ts +288 -0
  79. package/core/commands/base.ts +273 -0
  80. package/core/commands/index.ts +211 -0
  81. package/core/commands/maintenance.ts +226 -0
  82. package/core/commands/planning.ts +311 -0
  83. package/core/commands/setup.ts +309 -0
  84. package/core/commands/shipping.ts +188 -0
  85. package/core/commands/types.ts +183 -0
  86. package/core/commands/workflow.ts +226 -0
  87. package/core/commands.ts +11 -0
  88. package/core/constants/formats.ts +187 -0
  89. package/core/constants/index.ts +7 -0
  90. package/core/{context-sync.js → context-sync.ts} +59 -26
  91. package/core/data/agents-manager.ts +76 -0
  92. package/core/data/analysis-manager.ts +83 -0
  93. package/core/data/base-manager.ts +156 -0
  94. package/core/data/ideas-manager.ts +81 -0
  95. package/core/data/index.ts +32 -0
  96. package/core/data/outcomes-manager.ts +96 -0
  97. package/core/data/project-manager.ts +75 -0
  98. package/core/data/roadmap-manager.ts +118 -0
  99. package/core/data/shipped-manager.ts +65 -0
  100. package/core/data/state-manager.ts +214 -0
  101. package/core/domain/{agent-generator.js → agent-generator.ts} +77 -57
  102. package/core/domain/{agent-loader.js → agent-loader.ts} +65 -56
  103. package/core/domain/{agent-matcher.js → agent-matcher.ts} +51 -24
  104. package/core/domain/{agent-validator.js → agent-validator.ts} +70 -37
  105. package/core/domain/{analyzer.js → analyzer.ts} +91 -85
  106. package/core/domain/{architect-session.js → architect-session.ts} +49 -34
  107. package/core/domain/{architecture-generator.js → architecture-generator.ts} +25 -13
  108. package/core/domain/{context-estimator.js → context-estimator.ts} +57 -36
  109. package/core/domain/{product-standards.js → product-standards.ts} +40 -26
  110. package/core/domain/{smart-cache.js → smart-cache.ts} +39 -30
  111. package/core/domain/{snapshot-manager.js → snapshot-manager.ts} +103 -100
  112. package/core/domain/{task-analyzer.js → task-analyzer.ts} +82 -43
  113. package/core/domain/task-stack/index.ts +19 -0
  114. package/core/domain/task-stack/parser.ts +86 -0
  115. package/core/domain/task-stack/storage.ts +123 -0
  116. package/core/domain/task-stack/task-stack.ts +340 -0
  117. package/core/domain/task-stack/types.ts +51 -0
  118. package/core/domain/task-stack.ts +8 -0
  119. package/core/{index.js → index.ts} +61 -18
  120. package/core/infrastructure/{agent-detector.js → agent-detector.ts} +55 -19
  121. package/core/infrastructure/agents/{claude-agent.js → claude-agent.ts} +61 -21
  122. package/core/infrastructure/{author-detector.js → author-detector.ts} +42 -49
  123. package/core/infrastructure/{capability-installer.js → capability-installer.ts} +51 -27
  124. package/core/infrastructure/{command-installer.js → command-installer/command-installer.ts} +43 -144
  125. package/core/infrastructure/command-installer/global-config.ts +106 -0
  126. package/core/infrastructure/command-installer/index.ts +25 -0
  127. package/core/infrastructure/command-installer/types.ts +41 -0
  128. package/core/infrastructure/command-installer.ts +8 -0
  129. package/core/infrastructure/{config-manager.js → config-manager.ts} +60 -80
  130. package/core/infrastructure/{editors-config.js → editors-config.ts} +33 -31
  131. package/core/infrastructure/legacy-installer-detector/cleanup.ts +216 -0
  132. package/core/infrastructure/legacy-installer-detector/detection.ts +95 -0
  133. package/core/infrastructure/legacy-installer-detector/index.ts +171 -0
  134. package/core/infrastructure/legacy-installer-detector/migration.ts +87 -0
  135. package/core/infrastructure/legacy-installer-detector/types.ts +42 -0
  136. package/core/infrastructure/legacy-installer-detector.ts +7 -0
  137. package/core/infrastructure/migrator/file-operations.ts +125 -0
  138. package/core/infrastructure/migrator/index.ts +288 -0
  139. package/core/infrastructure/migrator/project-scanner.ts +89 -0
  140. package/core/infrastructure/migrator/reports.ts +117 -0
  141. package/core/infrastructure/migrator/types.ts +124 -0
  142. package/core/infrastructure/migrator/validation.ts +94 -0
  143. package/core/infrastructure/migrator/version-migration.ts +117 -0
  144. package/core/infrastructure/migrator.ts +10 -0
  145. package/core/infrastructure/{path-manager.js → path-manager.ts} +51 -91
  146. package/core/infrastructure/session-manager/index.ts +23 -0
  147. package/core/infrastructure/session-manager/migration.ts +88 -0
  148. package/core/infrastructure/session-manager/session-manager.ts +307 -0
  149. package/core/infrastructure/session-manager/types.ts +45 -0
  150. package/core/infrastructure/session-manager.ts +8 -0
  151. package/core/infrastructure/{setup.js → setup.ts} +29 -21
  152. package/core/infrastructure/{update-checker.js → update-checker.ts} +40 -18
  153. package/core/outcomes/analyzer.ts +333 -0
  154. package/core/outcomes/index.ts +34 -0
  155. package/core/outcomes/recorder.ts +194 -0
  156. package/core/outcomes/types.ts +145 -0
  157. package/core/plugin/{hooks.js → hooks.ts} +56 -58
  158. package/core/plugin/{index.js → index.ts} +19 -8
  159. package/core/plugin/{loader.js → loader.ts} +87 -69
  160. package/core/plugin/{registry.js → registry.ts} +49 -45
  161. package/core/plugins/{webhook.js → webhook.ts} +43 -27
  162. package/core/schemas/agents.ts +27 -0
  163. package/core/schemas/analysis.ts +41 -0
  164. package/core/schemas/ideas.ts +83 -0
  165. package/core/schemas/index.ts +73 -0
  166. package/core/schemas/outcomes.ts +22 -0
  167. package/core/schemas/project.ts +26 -0
  168. package/core/schemas/roadmap.ts +90 -0
  169. package/core/schemas/shipped.ts +82 -0
  170. package/core/schemas/state.ts +107 -0
  171. package/core/session/index.ts +17 -0
  172. package/core/session/{metrics.js → metrics.ts} +64 -46
  173. package/core/session/{index.js → session-manager.ts} +51 -117
  174. package/core/session/types.ts +29 -0
  175. package/core/session/utils.ts +57 -0
  176. package/core/state/index.ts +25 -0
  177. package/core/state/manager.ts +376 -0
  178. package/core/state/types.ts +185 -0
  179. package/core/tsconfig.json +22 -0
  180. package/core/types/index.ts +506 -0
  181. package/core/utils/{animations.js → animations.ts} +74 -28
  182. package/core/utils/{branding.js → branding.ts} +29 -4
  183. package/core/utils/{date-helper.js → date-helper.ts} +31 -74
  184. package/core/utils/file-helper.ts +262 -0
  185. package/core/utils/{jsonl-helper.js → jsonl-helper.ts} +71 -107
  186. package/core/utils/{logger.js → logger.ts} +24 -12
  187. package/core/utils/{output.js → output.ts} +25 -13
  188. package/core/utils/{project-capabilities.js → project-capabilities.ts} +31 -18
  189. package/core/utils/{session-helper.js → session-helper.ts} +79 -66
  190. package/core/utils/{version.js → version.ts} +23 -31
  191. package/core/view-generator.ts +536 -0
  192. package/package.json +23 -17
  193. package/packages/shared/.turbo/turbo-build.log +14 -0
  194. package/packages/shared/dist/index.d.ts +8 -613
  195. package/packages/shared/dist/index.d.ts.map +1 -0
  196. package/packages/shared/dist/index.js +4110 -118
  197. package/packages/shared/dist/schemas.d.ts +408 -0
  198. package/packages/shared/dist/schemas.d.ts.map +1 -0
  199. package/packages/shared/dist/types.d.ts +144 -0
  200. package/packages/shared/dist/types.d.ts.map +1 -0
  201. package/packages/shared/dist/unified.d.ts +139 -0
  202. package/packages/shared/dist/unified.d.ts.map +1 -0
  203. package/packages/shared/dist/utils.d.ts +60 -0
  204. package/packages/shared/dist/utils.d.ts.map +1 -0
  205. package/packages/shared/package.json +4 -4
  206. package/packages/shared/src/index.ts +1 -0
  207. package/packages/shared/src/unified.ts +174 -0
  208. package/packages/web/app/api/claude/sessions/route.ts +1 -1
  209. package/packages/web/app/api/claude/status/route.ts +1 -1
  210. package/packages/web/app/api/migrate/route.ts +46 -0
  211. package/packages/web/app/api/projects/[id]/route.ts +1 -1
  212. package/packages/web/app/api/projects/[id]/stats/route.ts +30 -2
  213. package/packages/web/app/api/projects/[id]/status/route.ts +1 -1
  214. package/packages/web/app/api/projects/route.ts +1 -1
  215. package/packages/web/app/api/settings/route.ts +97 -0
  216. package/packages/web/app/api/v2/projects/[id]/unified/route.ts +57 -0
  217. package/packages/web/app/globals.css +38 -0
  218. package/packages/web/app/layout.tsx +10 -2
  219. package/packages/web/app/page.tsx +9 -224
  220. package/packages/web/app/project/[id]/page.tsx +191 -63
  221. package/packages/web/app/project/[id]/stats/loading.tsx +43 -0
  222. package/packages/web/app/project/[id]/stats/page.tsx +204 -163
  223. package/packages/web/app/settings/page.tsx +222 -2
  224. package/packages/web/components/ActivityTimeline/ActivityTimeline.constants.ts +2 -0
  225. package/packages/web/components/ActivityTimeline/ActivityTimeline.tsx +50 -0
  226. package/packages/web/components/ActivityTimeline/ActivityTimeline.types.ts +8 -0
  227. package/packages/web/components/ActivityTimeline/hooks/index.ts +2 -0
  228. package/packages/web/components/ActivityTimeline/hooks/useExpandable.ts +9 -0
  229. package/packages/web/components/ActivityTimeline/hooks/useGroupedEvents.ts +23 -0
  230. package/packages/web/components/ActivityTimeline/index.ts +2 -0
  231. package/packages/web/components/AgentsCard/AgentsCard.tsx +63 -0
  232. package/packages/web/components/AgentsCard/AgentsCard.types.ts +13 -0
  233. package/packages/web/components/AgentsCard/index.ts +2 -0
  234. package/packages/web/components/AppSidebar/AppSidebar.tsx +134 -0
  235. package/packages/web/components/AppSidebar/index.ts +1 -0
  236. package/packages/web/components/BackLink/BackLink.tsx +18 -0
  237. package/packages/web/components/BackLink/BackLink.types.ts +5 -0
  238. package/packages/web/components/BackLink/index.ts +2 -0
  239. package/packages/web/components/BentoCard/BentoCard.constants.ts +16 -0
  240. package/packages/web/components/BentoCard/BentoCard.tsx +47 -0
  241. package/packages/web/components/BentoCard/BentoCard.types.ts +15 -0
  242. package/packages/web/components/BentoCard/index.ts +2 -0
  243. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.constants.ts +9 -0
  244. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.tsx +18 -0
  245. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.types.ts +5 -0
  246. package/packages/web/components/BentoCardSkeleton/index.ts +2 -0
  247. package/packages/web/components/{stats → BentoGrid}/BentoGrid.tsx +4 -8
  248. package/packages/web/components/BentoGrid/BentoGrid.types.ts +4 -0
  249. package/packages/web/components/BentoGrid/index.ts +2 -0
  250. package/packages/web/components/CommandButton/index.ts +1 -0
  251. package/packages/web/components/ConnectionStatus/index.ts +1 -0
  252. package/packages/web/components/DashboardContent/DashboardContent.tsx +254 -0
  253. package/packages/web/components/DashboardContent/index.ts +1 -0
  254. package/packages/web/components/DateGroup/DateGroup.tsx +18 -0
  255. package/packages/web/components/DateGroup/DateGroup.types.ts +6 -0
  256. package/packages/web/components/DateGroup/DateGroup.utils.ts +11 -0
  257. package/packages/web/components/DateGroup/index.ts +2 -0
  258. package/packages/web/components/{stats → EmptyState}/EmptyState.tsx +1 -10
  259. package/packages/web/components/EmptyState/EmptyState.types.ts +10 -0
  260. package/packages/web/components/EmptyState/index.ts +2 -0
  261. package/packages/web/components/EventRow/EventRow.constants.ts +10 -0
  262. package/packages/web/components/EventRow/EventRow.tsx +49 -0
  263. package/packages/web/components/EventRow/EventRow.types.ts +7 -0
  264. package/packages/web/components/EventRow/EventRow.utils.ts +49 -0
  265. package/packages/web/components/EventRow/index.ts +2 -0
  266. package/packages/web/components/ExpandButton/ExpandButton.tsx +18 -0
  267. package/packages/web/components/ExpandButton/ExpandButton.types.ts +6 -0
  268. package/packages/web/components/ExpandButton/index.ts +2 -0
  269. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.tsx +14 -0
  270. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.types.ts +5 -0
  271. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.utils.ts +13 -0
  272. package/packages/web/components/HealthGradientBackground/index.ts +2 -0
  273. package/packages/web/components/HeroSection/HeroSection.tsx +55 -0
  274. package/packages/web/components/HeroSection/HeroSection.types.ts +14 -0
  275. package/packages/web/components/HeroSection/HeroSection.utils.ts +7 -0
  276. package/packages/web/components/HeroSection/hooks/index.ts +2 -0
  277. package/packages/web/components/HeroSection/hooks/useCountUp.ts +45 -0
  278. package/packages/web/components/HeroSection/hooks/useWeeklyActivity.ts +18 -0
  279. package/packages/web/components/HeroSection/index.ts +2 -0
  280. package/packages/web/components/{stats → IdeasCard}/IdeasCard.tsx +3 -14
  281. package/packages/web/components/IdeasCard/IdeasCard.types.ts +9 -0
  282. package/packages/web/components/IdeasCard/index.ts +2 -0
  283. package/packages/web/components/InsightMessage/InsightMessage.tsx +9 -0
  284. package/packages/web/components/InsightMessage/InsightMessage.types.ts +3 -0
  285. package/packages/web/components/InsightMessage/index.ts +2 -0
  286. package/packages/web/components/Logo/index.ts +1 -0
  287. package/packages/web/components/MarkdownContent/index.ts +1 -0
  288. package/packages/web/components/NowCard/NowCard.tsx +93 -0
  289. package/packages/web/components/NowCard/NowCard.types.ts +15 -0
  290. package/packages/web/components/NowCard/index.ts +2 -0
  291. package/packages/web/components/ProgressRing/ProgressRing.constants.ts +20 -0
  292. package/packages/web/components/{stats → ProgressRing}/ProgressRing.tsx +4 -27
  293. package/packages/web/components/ProgressRing/ProgressRing.types.ts +11 -0
  294. package/packages/web/components/ProgressRing/index.ts +2 -0
  295. package/packages/web/components/ProjectAvatar/index.ts +1 -0
  296. package/packages/web/components/Providers/index.ts +1 -0
  297. package/packages/web/components/QueueCard/QueueCard.tsx +72 -0
  298. package/packages/web/components/QueueCard/QueueCard.types.ts +11 -0
  299. package/packages/web/components/QueueCard/QueueCard.utils.ts +12 -0
  300. package/packages/web/components/QueueCard/index.ts +2 -0
  301. package/packages/web/components/{stats → RoadmapCard}/RoadmapCard.tsx +3 -23
  302. package/packages/web/components/RoadmapCard/RoadmapCard.types.ts +15 -0
  303. package/packages/web/components/RoadmapCard/index.ts +2 -0
  304. package/packages/web/components/{stats → ShipsCard}/ShipsCard.tsx +4 -22
  305. package/packages/web/components/ShipsCard/ShipsCard.types.ts +12 -0
  306. package/packages/web/components/ShipsCard/ShipsCard.utils.ts +4 -0
  307. package/packages/web/components/ShipsCard/index.ts +2 -0
  308. package/packages/web/components/{stats → SparklineChart}/SparklineChart.tsx +1 -7
  309. package/packages/web/components/SparklineChart/SparklineChart.types.ts +6 -0
  310. package/packages/web/components/SparklineChart/index.ts +2 -0
  311. package/packages/web/components/StreakCard/StreakCard.constants.ts +2 -0
  312. package/packages/web/components/{stats → StreakCard}/StreakCard.tsx +5 -11
  313. package/packages/web/components/StreakCard/StreakCard.types.ts +4 -0
  314. package/packages/web/components/StreakCard/index.ts +2 -0
  315. package/packages/web/components/TasksCounter/TasksCounter.tsx +14 -0
  316. package/packages/web/components/TasksCounter/TasksCounter.types.ts +3 -0
  317. package/packages/web/components/TasksCounter/index.ts +2 -0
  318. package/packages/web/components/TechStackBadges/index.ts +1 -0
  319. package/packages/web/components/{TerminalTab.tsx → TerminalTabs/TerminalTab.tsx} +11 -0
  320. package/packages/web/components/{TerminalTabs.tsx → TerminalTabs/TerminalTabs.tsx} +29 -28
  321. package/packages/web/components/TerminalTabs/index.ts +1 -0
  322. package/packages/web/components/VelocityBadge/VelocityBadge.tsx +27 -0
  323. package/packages/web/components/VelocityBadge/VelocityBadge.types.ts +3 -0
  324. package/packages/web/components/VelocityBadge/index.ts +2 -0
  325. package/packages/web/components/VelocityCard/VelocityCard.tsx +71 -0
  326. package/packages/web/components/VelocityCard/VelocityCard.types.ts +7 -0
  327. package/packages/web/components/VelocityCard/index.ts +2 -0
  328. package/packages/web/components/WeeklySparkline/WeeklySparkline.tsx +13 -0
  329. package/packages/web/components/WeeklySparkline/WeeklySparkline.types.ts +3 -0
  330. package/packages/web/components/WeeklySparkline/index.ts +2 -0
  331. package/packages/web/components/ui/input.tsx +21 -0
  332. package/packages/web/context/TerminalTabsContext.tsx +46 -1
  333. package/packages/web/hooks/useClaudeTerminal.ts +71 -21
  334. package/packages/web/hooks/useProjectStats.ts +55 -0
  335. package/packages/web/hooks/useProjects.ts +6 -6
  336. package/packages/web/lib/actions/projects.ts +15 -0
  337. package/packages/web/lib/json-loader.ts +630 -0
  338. package/packages/web/lib/services/index.ts +9 -0
  339. package/packages/web/lib/services/migration.server.ts +598 -0
  340. package/packages/web/lib/services/projects.server.ts +52 -0
  341. package/packages/web/lib/services/stats.server.ts +264 -0
  342. package/packages/web/lib/unified-loader.ts +396 -0
  343. package/packages/web/package.json +10 -7
  344. package/packages/web/server.ts +36 -6
  345. package/templates/commands/done.md +76 -32
  346. package/templates/commands/feature.md +121 -47
  347. package/templates/commands/idea.md +81 -8
  348. package/templates/commands/now.md +41 -17
  349. package/templates/commands/ship.md +64 -25
  350. package/templates/commands/sync.md +28 -3
  351. package/core/agentic/agent-router.js +0 -140
  352. package/core/agentic/chain-of-thought.js +0 -578
  353. package/core/agentic/command-executor.js +0 -417
  354. package/core/agentic/context-filter.js +0 -354
  355. package/core/agentic/ground-truth.js +0 -591
  356. package/core/agentic/loop-detector.js +0 -406
  357. package/core/agentic/memory-system.js +0 -845
  358. package/core/agentic/parallel-tools.js +0 -366
  359. package/core/agentic/plan-mode.js +0 -572
  360. package/core/agentic/prompt-builder.js +0 -352
  361. package/core/agentic/response-templates.js +0 -290
  362. package/core/agentic/semantic-compression.js +0 -517
  363. package/core/agentic/think-blocks.js +0 -657
  364. package/core/agentic/tool-registry.js +0 -184
  365. package/core/agentic/validation-rules.js +0 -380
  366. package/core/command-registry.js +0 -698
  367. package/core/commands.js +0 -2237
  368. package/core/domain/task-stack.js +0 -497
  369. package/core/infrastructure/legacy-installer-detector.js +0 -546
  370. package/core/infrastructure/migrator.js +0 -796
  371. package/core/infrastructure/session-manager.js +0 -390
  372. package/core/utils/file-helper.js +0 -329
  373. package/packages/web/app/api/projects/[id]/delete/route.ts +0 -21
  374. package/packages/web/app/api/stats/route.ts +0 -38
  375. package/packages/web/components/AppSidebar.tsx +0 -113
  376. package/packages/web/components/stats/ActivityTimeline.tsx +0 -201
  377. package/packages/web/components/stats/AgentsCard.tsx +0 -56
  378. package/packages/web/components/stats/BentoCard.tsx +0 -88
  379. package/packages/web/components/stats/HeroSection.tsx +0 -172
  380. package/packages/web/components/stats/NowCard.tsx +0 -71
  381. package/packages/web/components/stats/QueueCard.tsx +0 -58
  382. package/packages/web/components/stats/VelocityCard.tsx +0 -60
  383. package/packages/web/components/stats/index.ts +0 -17
  384. package/packages/web/hooks/useStats.ts +0 -28
  385. /package/packages/web/components/{CommandButton.tsx → CommandButton/CommandButton.tsx} +0 -0
  386. /package/packages/web/components/{ConnectionStatus.tsx → ConnectionStatus/ConnectionStatus.tsx} +0 -0
  387. /package/packages/web/components/{Logo.tsx → Logo/Logo.tsx} +0 -0
  388. /package/packages/web/components/{MarkdownContent.tsx → MarkdownContent/MarkdownContent.tsx} +0 -0
  389. /package/packages/web/components/{ProjectAvatar.tsx → ProjectAvatar/ProjectAvatar.tsx} +0 -0
  390. /package/packages/web/components/{providers.tsx → Providers/Providers.tsx} +0 -0
  391. /package/packages/web/components/{TechStackBadges.tsx → TechStackBadges/TechStackBadges.tsx} +0 -0
@@ -12,7 +12,9 @@ import type { IPty } from 'node-pty'
12
12
 
13
13
  const dev = process.env.NODE_ENV !== 'production'
14
14
  const hostname = 'localhost'
15
- const port = parseInt(process.env.PORT || '9472', 10)
15
+ // Dev: 9471, Prod: 9472 (allows running both simultaneously for testing)
16
+ const defaultPort = dev ? 9471 : 9472
17
+ const port = parseInt(process.env.PORT || String(defaultPort), 10)
16
18
 
17
19
  // PTY Sessions stored in server memory
18
20
  interface Session {
@@ -33,8 +35,14 @@ function createSession(sessionId: string, projectDir: string): { pty: IPty; isNe
33
35
  return { pty: existing.pty, isNew: false }
34
36
  }
35
37
 
36
- const shell = process.platform === 'win32' ? 'cmd.exe' : 'bash'
37
- const args = process.platform === 'win32' ? [] : ['-l']
38
+ // Use user's default shell (zsh, bash, etc.) - respects $SHELL env var
39
+ const shell = process.platform === 'win32'
40
+ ? 'cmd.exe'
41
+ : process.env.SHELL || '/bin/zsh'
42
+
43
+ // -l for login shell (loads .zshrc, .bashrc, etc.)
44
+ // -i for interactive shell (enables job control, aliases)
45
+ const args = process.platform === 'win32' ? [] : ['-l', '-i']
38
46
 
39
47
  const ptyProcess = pty.spawn(shell, args, {
40
48
  name: 'xterm-256color',
@@ -44,7 +52,9 @@ function createSession(sessionId: string, projectDir: string): { pty: IPty; isNe
44
52
  env: {
45
53
  ...process.env,
46
54
  TERM: 'xterm-256color',
47
- COLORTERM: 'truecolor'
55
+ COLORTERM: 'truecolor',
56
+ // Ensure shell knows it's interactive
57
+ SHELL: shell
48
58
  }
49
59
  })
50
60
 
@@ -204,10 +214,25 @@ app.prepare().then(() => {
204
214
 
205
215
  const ptyProcess = session.pty
206
216
 
217
+ // Output buffering for smooth terminal rendering
218
+ // Batches PTY output and flushes every 16ms (one animation frame)
219
+ const outputBuffer: string[] = []
220
+ let flushTimer: NodeJS.Timeout | null = null
221
+ const BATCH_MS = 16
222
+
223
+ const flushBuffer = () => {
224
+ if (outputBuffer.length > 0 && ws.readyState === WebSocket.OPEN) {
225
+ ws.send(JSON.stringify({ type: 'output', data: outputBuffer.join('') }))
226
+ outputBuffer.length = 0
227
+ }
228
+ flushTimer = null
229
+ }
230
+
207
231
  // Register data handler FIRST before sending any commands
208
232
  const dataHandler = ptyProcess.onData((data: string) => {
209
- if (ws.readyState === WebSocket.OPEN) {
210
- ws.send(JSON.stringify({ type: 'output', data }))
233
+ outputBuffer.push(data)
234
+ if (!flushTimer) {
235
+ flushTimer = setTimeout(flushBuffer, BATCH_MS)
211
236
  }
212
237
  })
213
238
 
@@ -247,6 +272,11 @@ app.prepare().then(() => {
247
272
 
248
273
  ws.on('close', () => {
249
274
  console.log(`[WS] PTY connection closed: ${sessionId}`)
275
+ // Clear buffer flush timer
276
+ if (flushTimer) {
277
+ clearTimeout(flushTimer)
278
+ flushTimer = null
279
+ }
250
280
  dataHandler.dispose()
251
281
  exitHandler.dispose()
252
282
  })
@@ -2,18 +2,28 @@
2
2
  allowed-tools: [Read, Write, Bash]
3
3
  description: 'Complete current task with session metrics'
4
4
  timestamp-rule: 'GetTimestamp() for all timestamps'
5
+ architecture: 'JSON-first - Write to data/*.json, views are generated'
5
6
  ---
6
7
 
7
8
  # /p:done - Complete Current Task with Session Metrics
8
9
 
10
+ ## Architecture: JSON-First
11
+
12
+ **Source of Truth**: `data/state.json`, `data/queue.json`, `data/metrics.json`
13
+ **Generated Views**: `views/now.md`, `views/next.md` (auto-generated)
14
+
15
+ All writes go to JSON. After writing, views are auto-regenerated.
16
+
9
17
  ## Context Variables
10
18
  - `{projectId}`: From `.prjct/prjct.config.json`
11
19
  - `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
12
- - `{nowPath}`: `{globalPath}/core/now.md`
20
+ - `{dataPath}`: `{globalPath}/data`
21
+ - `{statePath}`: `{dataPath}/state.json`
22
+ - `{queuePath}`: `{dataPath}/queue.json`
23
+ - `{metricsJsonPath}`: `{dataPath}/metrics.json`
13
24
  - `{sessionPath}`: `{globalPath}/sessions/current.json`
14
25
  - `{archiveDir}`: `{globalPath}/sessions/archive`
15
26
  - `{memoryPath}`: `{globalPath}/memory/context.jsonl`
16
- - `{metricsPath}`: `{globalPath}/progress/metrics.md`
17
27
 
18
28
  ## Step 1: Read Config
19
29
 
@@ -26,18 +36,23 @@ IF file not found:
26
36
 
27
37
  ## Step 2: Check Session State
28
38
 
29
- ### Try structured session first
39
+ ### Read state.json (source of truth)
40
+ READ: `{statePath}`
41
+
42
+ IF file exists AND has currentTask:
43
+ EXTRACT: {task} = state.currentTask
44
+ GOTO Step 3 (Session Completion)
45
+
46
+ ### Try structured session (for detailed metrics)
30
47
  READ: `{sessionPath}`
31
48
 
32
49
  IF file exists:
33
50
  PARSE as JSON
34
51
  EXTRACT: {session} object
35
- GOTO Step 3 (Session Completion)
36
-
37
- ### Fallback to legacy now.md
38
- READ: `{nowPath}`
52
+ ELSE:
53
+ CREATE session from state.currentTask data
39
54
 
40
- IF empty OR contains "No current task":
55
+ IF no currentTask in state.json:
41
56
  OUTPUT: "⚠️ No active task to complete. Use /p:now to start one."
42
57
  STOP
43
58
 
@@ -100,48 +115,77 @@ BASH: `mkdir -p {archiveDir}/{yearMonth}`
100
115
  WRITE: `{archiveDir}/{yearMonth}/{session.id}.json`
101
116
  Content: Updated session object from Step 3
102
117
 
103
- ## Step 5: Clear Current Session
118
+ ## Step 5: Clear Current State (JSON)
104
119
 
105
- DELETE: `{sessionPath}`
120
+ ### Clear state.json (SOURCE OF TRUTH)
121
+ READ: `{statePath}`
106
122
 
107
- OR WRITE empty state:
123
+ UPDATE state.json:
124
+ ```json
125
+ {
126
+ "currentTask": null,
127
+ "lastUpdated": "{now}"
128
+ }
129
+ ```
130
+
131
+ WRITE: `{statePath}`
132
+
133
+ ### Clear session.json
108
134
  WRITE: `{sessionPath}`
109
135
  Content:
110
136
  ```json
111
137
  {}
112
138
  ```
113
139
 
114
- ## Step 6: Update Legacy now.md
140
+ ## Step 6: Update Metrics (JSON)
115
141
 
116
- WRITE: `{nowPath}`
117
- Content:
118
- ```markdown
119
- # NOW
142
+ READ: `{metricsJsonPath}` (or create default if not exists)
120
143
 
121
- No current task. Use `/p:now` to set focus.
144
+ ### Update metrics.json
145
+ ```json
146
+ {
147
+ "velocity": {
148
+ "tasksPerDay": {calculated},
149
+ "avgTaskDuration": {calculated}
150
+ },
151
+ "allTime": {
152
+ "totalTasks": {increment by 1},
153
+ "totalTime": {add duration},
154
+ "daysActive": {recalculate}
155
+ },
156
+ "recentTasks": [
157
+ {
158
+ "task": "{session.task}",
159
+ "duration": {duration},
160
+ "completedAt": "{now}",
161
+ "metrics": {
162
+ "filesChanged": {filesChanged},
163
+ "linesAdded": {linesAdded},
164
+ "linesRemoved": {linesRemoved},
165
+ "commits": {commits}
166
+ }
167
+ },
168
+ ...existing recent tasks (keep last 10)
169
+ ],
170
+ "lastUpdated": "{now}"
171
+ }
122
172
  ```
123
173
 
124
- ## Step 7: Log to Memory
174
+ WRITE: `{metricsJsonPath}`
125
175
 
126
- APPEND to: `{memoryPath}`
176
+ ## Step 7: Generate Views
127
177
 
128
- Single line (JSONL format):
129
- ```json
130
- {"timestamp":"{now}","action":"session_completed","sessionId":"{session.id}","task":"{session.task}","duration":{duration},"metrics":{"files":{filesChanged},"added":{linesAdded},"removed":{linesRemoved},"commits":{commits}}}
131
- ```
178
+ BASH: `cd {projectRoot} && npx prjct-generate-views --project={projectId}`
132
179
 
133
- ## Step 8: Update Metrics Summary
180
+ Note: This regenerates views/now.md, views/next.md from JSON automatically.
134
181
 
135
- READ: `{metricsPath}` (create if not exists)
182
+ ## Step 8: Log to Memory
136
183
 
137
- ### Append Daily Entry
138
- GET: {date} = YYYY-MM-DD from {now}
184
+ APPEND to: `{memoryPath}`
139
185
 
140
- INSERT or UPDATE entry for {date}:
141
- ```markdown
142
- ### {date}
143
- - **{session.task}** ({durationFormatted})
144
- - Files: {filesChanged} | +{linesAdded}/-{linesRemoved} | Commits: {commits}
186
+ Single line (JSONL format):
187
+ ```json
188
+ {"timestamp":"{now}","action":"session_completed","sessionId":"{session.id}","task":"{session.task}","duration":{duration},"metrics":{"files":{filesChanged},"added":{linesAdded},"removed":{linesRemoved},"commits":{commits}}}
145
189
  ```
146
190
 
147
191
  ## Output
@@ -2,10 +2,16 @@
2
2
  allowed-tools: [Read, Write, Bash, Task, Glob]
3
3
  description: 'Value analysis + roadmap + task breakdown + auto-start'
4
4
  timestamp-rule: 'GetTimestamp() and GetDate() for ALL timestamps'
5
+ architecture: 'JSON-first - Write to data/*.json, views are generated'
5
6
  ---
6
7
 
7
8
  # /p:feature - Add Feature to Roadmap
8
9
 
10
+ ## Architecture: JSON-First
11
+
12
+ **Source of Truth**: `data/roadmap.json`, `data/queue.json`, `data/state.json`
13
+ **Generated Views**: `views/roadmap.md`, `views/next.md`, `views/now.md` (auto-generated)
14
+
9
15
  ## Agent Delegation (REQUIRED)
10
16
 
11
17
  Before executing any code-related task, delegate to a specialist agent:
@@ -46,9 +52,10 @@ Task(
46
52
  ## Context Variables
47
53
  - `{projectId}`: From `.prjct/prjct.config.json`
48
54
  - `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
49
- - `{roadmapPath}`: `{globalPath}/planning/roadmap.md`
50
- - `{nextPath}`: `{globalPath}/core/next.md`
51
- - `{nowPath}`: `{globalPath}/core/now.md`
55
+ - `{dataPath}`: `{globalPath}/data`
56
+ - `{roadmapPath}`: `{dataPath}/roadmap.json`
57
+ - `{queuePath}`: `{dataPath}/queue.json`
58
+ - `{statePath}`: `{dataPath}/state.json`
52
59
  - `{memoryPath}`: `{globalPath}/memory/context.jsonl`
53
60
  - `{feature}`: User-provided feature description
54
61
 
@@ -142,90 +149,157 @@ For feature "add user authentication":
142
149
 
143
150
  GENERATE: {tasks} = list of task descriptions
144
151
 
145
- ## Step 5: Update Roadmap
152
+ ## Step 5: Update Roadmap (JSON)
146
153
 
147
- READ: `{roadmapPath}` (create if not exists)
154
+ READ: `{roadmapPath}` (or create default if not exists)
148
155
 
149
- ### Format New Entry
156
+ Default structure:
157
+ ```json
158
+ {
159
+ "features": [],
160
+ "backlog": [],
161
+ "lastUpdated": ""
162
+ }
163
+ ```
150
164
 
151
- ```markdown
152
- ## {GetDate()} - {feature}
153
- - Impact: {impact} | Effort: {effort}
154
- - Tasks: {taskCount}
155
- - Status: active
165
+ ### Generate Feature ID
166
+ GENERATE: {featureId} = "feat_" + 8 random alphanumeric chars
167
+ SET: {now} = GetTimestamp()
156
168
 
157
- ### Tasks
158
- 1. [ ] {task1}
159
- 2. [ ] {task2}
160
- ...
169
+ ### Create Feature Entry
170
+ ```json
171
+ {
172
+ "id": "{featureId}",
173
+ "name": "{feature}",
174
+ "impact": "{impact}",
175
+ "effort": "{effort}",
176
+ "status": "active",
177
+ "progress": 0,
178
+ "tasks": [
179
+ {
180
+ "id": "task_{8_random}",
181
+ "description": "{task1}",
182
+ "completed": false,
183
+ "createdAt": "{now}"
184
+ },
185
+ {
186
+ "id": "task_{8_random}",
187
+ "description": "{task2}",
188
+ "completed": false,
189
+ "createdAt": "{now}"
190
+ }
191
+ ...
192
+ ],
193
+ "createdAt": "{now}"
194
+ }
161
195
  ```
162
196
 
163
- INSERT at top (after # Roadmap header)
164
-
165
- ### Archive Old Entries
166
- IF entries older than 30 days exist:
167
- MOVE to: `{globalPath}/planning/archive/roadmap-{yearMonth}.md`
197
+ ### Update roadmap.json
198
+ ```json
199
+ {
200
+ "features": [
201
+ {new feature entry},
202
+ ...existing features
203
+ ],
204
+ "backlog": [...existing],
205
+ "lastUpdated": "{now}"
206
+ }
207
+ ```
168
208
 
169
209
  WRITE: `{roadmapPath}`
170
210
 
171
- ## Step 6: Update Priority Queue
211
+ ## Step 6: Update Priority Queue (JSON)
172
212
 
173
- READ: `{nextPath}` (create if not exists)
213
+ READ: `{queuePath}` (or create default if not exists)
174
214
 
175
- ### Add Tasks to Queue
215
+ Default structure:
216
+ ```json
217
+ {
218
+ "tasks": [],
219
+ "lastUpdated": ""
220
+ }
221
+ ```
176
222
 
223
+ ### Add Tasks to Queue
177
224
  For each task in {tasks}:
178
- APPEND to next.md:
179
- ```markdown
180
- - [ ] {task} (from: {feature})
181
- ```
225
+ ```json
226
+ {
227
+ "id": "task_{8_random}",
228
+ "description": "{task}",
229
+ "priority": "medium",
230
+ "featureId": "{featureId}",
231
+ "completed": false,
232
+ "createdAt": "{now}"
233
+ }
234
+ ```
235
+
236
+ ### Update queue.json
237
+ ```json
238
+ {
239
+ "tasks": [
240
+ ...new tasks,
241
+ ...existing tasks
242
+ ],
243
+ "lastUpdated": "{now}"
244
+ }
245
+ ```
182
246
 
183
- WRITE: `{nextPath}`
247
+ WRITE: `{queuePath}`
184
248
 
185
- ## Step 7: Auto-Start First Task
249
+ ## Step 7: Auto-Start First Task (JSON)
186
250
 
187
- READ: `{nowPath}`
251
+ READ: `{statePath}` (or create default)
188
252
 
189
- IF empty OR contains "No current task":
253
+ IF currentTask is null:
190
254
  ### Start First Task
191
255
  {firstTask} = first item from {tasks}
192
-
193
- WRITE: `{nowPath}`
194
- ```markdown
195
- # NOW
196
-
197
- **{firstTask}**
198
-
199
- Feature: {feature}
200
- Started: {GetTimestamp()}
256
+ GENERATE: {sessionId} = "sess_" + 8 random alphanumeric chars
257
+
258
+ ### Update state.json
259
+ ```json
260
+ {
261
+ "currentTask": {
262
+ "id": "task_{8_random}",
263
+ "description": "{firstTask}",
264
+ "startedAt": "{now}",
265
+ "sessionId": "{sessionId}",
266
+ "featureId": "{featureId}"
267
+ },
268
+ "lastUpdated": "{now}"
269
+ }
201
270
  ```
202
271
 
272
+ WRITE: `{statePath}`
203
273
  {autoStarted} = true
204
274
  ELSE:
205
275
  {autoStarted} = false
206
276
 
207
- ## Step 8: Log to Session
277
+ ## Step 8: Generate Views
278
+
279
+ BASH: `cd {projectRoot} && npx prjct-generate-views --project={projectId}`
280
+
281
+ Note: This regenerates views/roadmap.md, views/next.md, views/now.md from JSON automatically.
282
+
283
+ ## Step 9: Log to Memory
208
284
 
209
285
  GET: {date} = GetDate()
210
286
  EXTRACT: {yearMonth} = YYYY-MM from {date}
211
287
 
212
288
  ENSURE directory:
213
- BASH: `mkdir -p {globalPath}/planning/sessions/{yearMonth}`
289
+ BASH: `mkdir -p {globalPath}/memory/sessions/{yearMonth}`
214
290
 
215
- APPEND to: `{globalPath}/planning/sessions/{yearMonth}/{date}.jsonl`
291
+ APPEND to: `{globalPath}/memory/sessions/{yearMonth}/{date}.jsonl`
216
292
 
217
293
  Single line (JSONL):
218
294
  ```json
219
- {"ts":"{GetTimestamp()}","type":"feature_add","name":"{feature}","tasks":{taskCount},"impact":"{impact}","effort":"{effort}"}
295
+ {"ts":"{now}","type":"feature_add","featureId":"{featureId}","name":"{feature}","tasks":{taskCount},"impact":"{impact}","effort":"{effort}"}
220
296
  ```
221
297
 
222
- ## Step 9: Log to Memory
223
-
224
298
  APPEND to: `{memoryPath}`
225
299
 
226
300
  Single line (JSONL):
227
301
  ```json
228
- {"timestamp":"{GetTimestamp()}","action":"feature_added","feature":"{feature}","tasks":{taskCount}}
302
+ {"timestamp":"{now}","action":"feature_added","featureId":"{featureId}","feature":"{feature}","tasks":{taskCount}}
229
303
  ```
230
304
 
231
305
  ## Output
@@ -1,16 +1,89 @@
1
1
  ---
2
- allowed-tools: [Read, Write, GetTimestamp, GetDate]
2
+ allowed-tools: [Read, Write, Bash, GetTimestamp, GetDate]
3
3
  description: 'Quick idea capture'
4
4
  timestamp-rule: 'GetTimestamp() and GetDate() for timestamps'
5
+ architecture: 'JSON-first - Write to data/ideas.json, views are generated'
5
6
  ---
6
7
 
7
- # /p:idea
8
+ # /p:idea - Quick Idea Capture
8
9
 
9
- ## Flow
10
- 1. Log: `planning/sessions/{YY-MM}/{DD}.jsonl`
11
- `{"ts":"{GetTimestamp()}","type":"idea_add","idea":"{text}"}`
12
- 2. Update: `planning/ideas.md` with {GetDate()}
13
- 3. If actionable → `core/next.md`
10
+ ## Architecture: JSON-First
11
+
12
+ **Source of Truth**: `data/ideas.json`
13
+ **Generated View**: `views/ideas.md` (auto-generated)
14
+
15
+ ## Context Variables
16
+ - `{projectId}`: From `.prjct/prjct.config.json`
17
+ - `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
18
+ - `{dataPath}`: `{globalPath}/data`
19
+ - `{ideasPath}`: `{dataPath}/ideas.json`
20
+ - `{memoryPath}`: `{globalPath}/memory/context.jsonl`
21
+ - `{text}`: User-provided idea text
22
+
23
+ ## Step 1: Read Config
24
+
25
+ READ: `.prjct/prjct.config.json`
26
+ EXTRACT: `projectId`
27
+
28
+ IF file not found:
29
+ OUTPUT: "No prjct project. Run /p:init first."
30
+ STOP
31
+
32
+ ## Step 2: Read Current Ideas
33
+
34
+ READ: `{ideasPath}` (or create default if not exists)
35
+
36
+ Default structure:
37
+ ```json
38
+ {
39
+ "ideas": [],
40
+ "lastUpdated": ""
41
+ }
42
+ ```
43
+
44
+ ## Step 3: Add New Idea (JSON)
45
+
46
+ GENERATE: {ideaId} = "idea_" + 8 random alphanumeric chars
47
+ SET: {now} = GetTimestamp()
48
+
49
+ ### Analyze idea for tags
50
+ Based on {text}, detect tags:
51
+ - If mentions UI/design → add "ui" tag
52
+ - If mentions performance → add "perf" tag
53
+ - If mentions bug/fix → add "bug" tag
54
+ - If mentions API/backend → add "api" tag
55
+
56
+ ### Update ideas.json
57
+ ```json
58
+ {
59
+ "ideas": [
60
+ {
61
+ "id": "{ideaId}",
62
+ "text": "{text}",
63
+ "priority": "medium",
64
+ "status": "pending",
65
+ "tags": [{detected_tags}],
66
+ "createdAt": "{now}"
67
+ },
68
+ ...existing ideas
69
+ ],
70
+ "lastUpdated": "{now}"
71
+ }
72
+ ```
73
+
74
+ WRITE: `{ideasPath}`
75
+
76
+ ## Step 4: Generate Views
77
+
78
+ BASH: `cd {projectRoot} && npx prjct-generate-views --project={projectId}`
79
+
80
+ ## Step 5: Log to Memory
81
+
82
+ APPEND to: `{memoryPath}`
83
+ ```json
84
+ {"timestamp":"{now}","action":"idea_added","ideaId":"{ideaId}","text":"{text}"}
85
+ ```
14
86
 
15
87
  ## Response
16
- `💡 {idea} | Saved | Start: /p:feature "{idea}"`
88
+
89
+ `💡 {text} | Saved | Start: /p:feature "{text}"`
@@ -2,14 +2,23 @@
2
2
  allowed-tools: [Read, Write, Bash]
3
3
  description: 'Set or show current task with session tracking'
4
4
  timestamp-rule: 'GetTimestamp() for ALL timestamps'
5
+ architecture: 'JSON-first - Write to data/*.json, views are generated'
5
6
  ---
6
7
 
7
8
  # /p:now - Current Task with Session Tracking
8
9
 
10
+ ## Architecture: JSON-First
11
+
12
+ **Source of Truth**: `data/state.json`
13
+ **Generated View**: `views/now.md` (auto-generated, do not edit directly)
14
+
15
+ All writes go to JSON. After writing, run `prjct generate-views --project={projectId}` to regenerate MD views.
16
+
9
17
  ## Context Variables
10
18
  - `{projectId}`: From `.prjct/prjct.config.json`
11
19
  - `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
12
- - `{nowPath}`: `{globalPath}/core/now.md`
20
+ - `{dataPath}`: `{globalPath}/data`
21
+ - `{statePath}`: `{dataPath}/state.json`
13
22
  - `{sessionPath}`: `{globalPath}/sessions/current.json`
14
23
  - `{memoryPath}`: `{globalPath}/memory/context.jsonl`
15
24
  - `{task}`: User-provided task (optional)
@@ -25,15 +34,19 @@ IF file not found:
25
34
 
26
35
  ## Step 2: Check Current State
27
36
 
28
- ### Check for active session
29
- READ: `{sessionPath}`
37
+ ### Read state.json (source of truth)
38
+ READ: `{statePath}`
30
39
 
31
40
  IF file exists:
32
41
  PARSE as JSON
33
- EXTRACT: {currentTask}, {status}, {startedAt}, {duration}
42
+ EXTRACT: {currentTask} from state.currentTask
43
+
44
+ ### Check for active session (legacy support)
45
+ READ: `{sessionPath}`
34
46
 
35
- ### Check now.md
36
- READ: `{nowPath}`
47
+ IF file exists:
48
+ PARSE as JSON
49
+ EXTRACT: {session.task}, {session.status}, {session.startedAt}, {session.duration}
37
50
 
38
51
  ## Step 3: Handle Cases
39
52
 
@@ -91,7 +104,25 @@ IF {task} is provided:
91
104
  GENERATE: {sessionId} = "sess_" + 8 random alphanumeric chars
92
105
  SET: {startedAt} = GetTimestamp()
93
106
 
94
- ### Create session JSON
107
+ ### Write state.json (SOURCE OF TRUTH)
108
+ READ: `{statePath}` (or create default if not exists)
109
+
110
+ UPDATE state.json:
111
+ ```json
112
+ {
113
+ "currentTask": {
114
+ "id": "task_{8_random_chars}",
115
+ "description": "{task}",
116
+ "startedAt": "{startedAt}",
117
+ "sessionId": "{sessionId}"
118
+ },
119
+ "lastUpdated": "{startedAt}"
120
+ }
121
+ ```
122
+
123
+ WRITE: `{statePath}`
124
+
125
+ ### Create session JSON (for detailed tracking)
95
126
  WRITE: `{sessionPath}`
96
127
  Content:
97
128
  ```json
@@ -117,17 +148,10 @@ IF {task} is provided:
117
148
  }
118
149
  ```
119
150
 
120
- ### Update now.md (legacy support)
121
- WRITE: `{nowPath}`
122
- Content:
123
- ```markdown
124
- # NOW
125
-
126
- **{task}**
151
+ ### Generate views (auto-regenerate MD from JSON)
152
+ BASH: `cd {projectRoot} && npx prjct-generate-views --project={projectId}`
127
153
 
128
- Started: {startedAt}
129
- Session: {sessionId}
130
- ```
154
+ Note: This regenerates views/now.md from data/state.json automatically.
131
155
 
132
156
  ### Log to memory
133
157
  APPEND to: `{memoryPath}`