prjct-cli 0.11.4 → 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 (385) hide show
  1. package/CHANGELOG.md +72 -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 +246 -54
  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.ts +405 -0
  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} +99 -89
  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} +35 -18
  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} +62 -23
  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 +203 -403
  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/BentoGrid/BentoGrid.tsx +18 -0
  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/EmptyState/EmptyState.tsx +58 -0
  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/IdeasCard/IdeasCard.tsx +48 -0
  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/ProgressRing/ProgressRing.tsx +51 -0
  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/RoadmapCard/RoadmapCard.tsx +77 -0
  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/ShipsCard/ShipsCard.tsx +52 -0
  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/SparklineChart/SparklineChart.tsx +38 -0
  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/StreakCard/StreakCard.tsx +53 -0
  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/components/ui/tooltip.tsx +2 -2
  333. package/packages/web/context/TerminalTabsContext.tsx +46 -1
  334. package/packages/web/hooks/useClaudeTerminal.ts +71 -21
  335. package/packages/web/hooks/useProjectStats.ts +55 -0
  336. package/packages/web/hooks/useProjects.ts +6 -6
  337. package/packages/web/lib/actions/projects.ts +15 -0
  338. package/packages/web/lib/json-loader.ts +630 -0
  339. package/packages/web/lib/services/index.ts +9 -0
  340. package/packages/web/lib/services/migration.server.ts +598 -0
  341. package/packages/web/lib/services/projects.server.ts +52 -0
  342. package/packages/web/lib/services/stats.server.ts +264 -0
  343. package/packages/web/lib/unified-loader.ts +396 -0
  344. package/packages/web/next-env.d.ts +1 -1
  345. package/packages/web/package.json +10 -6
  346. package/packages/web/server.ts +36 -6
  347. package/templates/commands/done.md +76 -32
  348. package/templates/commands/feature.md +121 -47
  349. package/templates/commands/idea.md +81 -8
  350. package/templates/commands/now.md +41 -17
  351. package/templates/commands/ship.md +64 -25
  352. package/templates/commands/sync.md +28 -3
  353. package/core/agentic/agent-router.js +0 -128
  354. package/core/agentic/chain-of-thought.js +0 -578
  355. package/core/agentic/command-executor.js +0 -421
  356. package/core/agentic/context-filter.js +0 -354
  357. package/core/agentic/ground-truth.js +0 -591
  358. package/core/agentic/loop-detector.js +0 -406
  359. package/core/agentic/memory-system.js +0 -850
  360. package/core/agentic/parallel-tools.js +0 -366
  361. package/core/agentic/plan-mode.js +0 -572
  362. package/core/agentic/prompt-builder.js +0 -338
  363. package/core/agentic/response-templates.js +0 -290
  364. package/core/agentic/semantic-compression.js +0 -517
  365. package/core/agentic/think-blocks.js +0 -657
  366. package/core/agentic/tool-registry.js +0 -184
  367. package/core/agentic/validation-rules.js +0 -380
  368. package/core/command-registry.js +0 -698
  369. package/core/commands.js +0 -2237
  370. package/core/domain/task-stack.js +0 -497
  371. package/core/infrastructure/legacy-installer-detector.js +0 -546
  372. package/core/infrastructure/migrator.js +0 -799
  373. package/core/infrastructure/session-manager.js +0 -390
  374. package/core/utils/file-helper.js +0 -329
  375. package/packages/web/app/api/projects/[id]/delete/route.ts +0 -21
  376. package/packages/web/app/api/stats/route.ts +0 -38
  377. package/packages/web/components/AppSidebar.tsx +0 -113
  378. package/packages/web/hooks/useStats.ts +0 -28
  379. /package/packages/web/components/{CommandButton.tsx → CommandButton/CommandButton.tsx} +0 -0
  380. /package/packages/web/components/{ConnectionStatus.tsx → ConnectionStatus/ConnectionStatus.tsx} +0 -0
  381. /package/packages/web/components/{Logo.tsx → Logo/Logo.tsx} +0 -0
  382. /package/packages/web/components/{MarkdownContent.tsx → MarkdownContent/MarkdownContent.tsx} +0 -0
  383. /package/packages/web/components/{ProjectAvatar.tsx → ProjectAvatar/ProjectAvatar.tsx} +0 -0
  384. /package/packages/web/components/{providers.tsx → Providers/Providers.tsx} +0 -0
  385. /package/packages/web/components/{TechStackBadges.tsx → TechStackBadges/TechStackBadges.tsx} +0 -0
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Agentic Commands Handler for prjct CLI
3
+ *
4
+ * 100% AGENTIC - Claude decides everything based on templates.
5
+ * ZERO if/else business logic.
6
+ *
7
+ * All commands use the agentic execution engine.
8
+ * Templates define what Claude should do.
9
+ *
10
+ * MIGRATED COMMANDS (18 total):
11
+ * - Sprint 1 (9 CRITICAL): init, analyze, sync, feature, bug, now, done, next, ship
12
+ * - Sprint 2 (4 IMPORTANT): context, recap, stuck, design
13
+ * - Sprint 3 (5 OPTIONAL): cleanup, progress, roadmap, status, build
14
+ *
15
+ * PENDING (3 total):
16
+ * - Sprint 4 (3 SETUP): start, setup, migrateAll
17
+ */
18
+
19
+ import { WorkflowCommands } from './workflow'
20
+ import { PlanningCommands } from './planning'
21
+ import { ShippingCommands } from './shipping'
22
+ import { AnalyticsCommands } from './analytics'
23
+ import { MaintenanceCommands } from './maintenance'
24
+ import { AnalysisCommands } from './analysis'
25
+ import { SetupCommands } from './setup'
26
+
27
+ import type {
28
+ CommandResult,
29
+ AgentInfo,
30
+ Author,
31
+ DesignOptions,
32
+ CleanupOptions,
33
+ SetupOptions,
34
+ MigrateOptions,
35
+ AnalyzeOptions
36
+ } from './types'
37
+
38
+ /**
39
+ * PrjctCommands - Combined class with all commands
40
+ * Uses mixins pattern to combine all command groups
41
+ */
42
+ class PrjctCommands {
43
+ // Instances of each command group
44
+ private workflow: WorkflowCommands
45
+ private planning: PlanningCommands
46
+ private shipping: ShippingCommands
47
+ private analytics: AnalyticsCommands
48
+ private maintenance: MaintenanceCommands
49
+ private analysis: AnalysisCommands
50
+ private setupCmds: SetupCommands
51
+
52
+ // Shared state
53
+ agent: unknown
54
+ agentInfo: AgentInfo | null
55
+ currentAuthor: Author | null
56
+ prjctDir: string
57
+
58
+ constructor() {
59
+ this.workflow = new WorkflowCommands()
60
+ this.planning = new PlanningCommands()
61
+ this.shipping = new ShippingCommands()
62
+ this.analytics = new AnalyticsCommands()
63
+ this.maintenance = new MaintenanceCommands()
64
+ this.analysis = new AnalysisCommands()
65
+ this.setupCmds = new SetupCommands()
66
+
67
+ this.agent = null
68
+ this.agentInfo = null
69
+ this.currentAuthor = null
70
+ this.prjctDir = '.prjct'
71
+ }
72
+
73
+ // ========== Workflow Commands ==========
74
+
75
+ async now(task: string | null = null, projectPath: string = process.cwd()): Promise<CommandResult> {
76
+ return this.workflow.now(task, projectPath)
77
+ }
78
+
79
+ async done(projectPath: string = process.cwd()): Promise<CommandResult> {
80
+ return this.workflow.done(projectPath)
81
+ }
82
+
83
+ async next(projectPath: string = process.cwd()): Promise<CommandResult> {
84
+ return this.workflow.next(projectPath)
85
+ }
86
+
87
+ async build(taskOrNumber: string, projectPath: string = process.cwd()): Promise<CommandResult> {
88
+ return this.workflow.build(taskOrNumber, projectPath)
89
+ }
90
+
91
+ // ========== Planning Commands ==========
92
+
93
+ async init(idea: string | null = null, projectPath: string = process.cwd()): Promise<CommandResult> {
94
+ return this.planning.init(idea, projectPath)
95
+ }
96
+
97
+ async feature(description: string, projectPath: string = process.cwd()): Promise<CommandResult> {
98
+ return this.planning.feature(description, projectPath)
99
+ }
100
+
101
+ async bug(description: string, projectPath: string = process.cwd()): Promise<CommandResult> {
102
+ return this.planning.bug(description, projectPath)
103
+ }
104
+
105
+ async architect(action: string = 'execute', projectPath: string = process.cwd()): Promise<CommandResult> {
106
+ return this.planning.architect(action, projectPath)
107
+ }
108
+
109
+ // ========== Shipping Commands ==========
110
+
111
+ async ship(feature: string | null, projectPath: string = process.cwd()): Promise<CommandResult> {
112
+ return this.shipping.ship(feature, projectPath)
113
+ }
114
+
115
+ // ========== Analytics Commands ==========
116
+
117
+ async context(projectPath: string = process.cwd()): Promise<CommandResult> {
118
+ return this.analytics.context(projectPath)
119
+ }
120
+
121
+ async recap(projectPath: string = process.cwd()): Promise<CommandResult> {
122
+ return this.analytics.recap(projectPath)
123
+ }
124
+
125
+ async stuck(issue: string, projectPath: string = process.cwd()): Promise<CommandResult> {
126
+ return this.analytics.stuck(issue, projectPath)
127
+ }
128
+
129
+ async progress(period: string = 'week', projectPath: string = process.cwd()): Promise<CommandResult> {
130
+ return this.analytics.progress(period, projectPath)
131
+ }
132
+
133
+ async roadmap(projectPath: string = process.cwd()): Promise<CommandResult> {
134
+ return this.analytics.roadmap(projectPath)
135
+ }
136
+
137
+ async status(projectPath: string = process.cwd()): Promise<CommandResult> {
138
+ return this.analytics.status(projectPath)
139
+ }
140
+
141
+ // ========== Maintenance Commands ==========
142
+
143
+ async cleanup(options: CleanupOptions = {}, projectPath: string = process.cwd()): Promise<CommandResult> {
144
+ return this.maintenance.cleanup(options, projectPath)
145
+ }
146
+
147
+ async design(target: string | null = null, options: DesignOptions = {}, projectPath: string = process.cwd()): Promise<CommandResult> {
148
+ return this.maintenance.design(target, options, projectPath)
149
+ }
150
+
151
+ // ========== Analysis Commands ==========
152
+
153
+ async analyze(options: AnalyzeOptions = {}, projectPath: string = process.cwd()): Promise<CommandResult> {
154
+ return this.analysis.analyze(options, projectPath)
155
+ }
156
+
157
+ async sync(projectPath: string = process.cwd()): Promise<CommandResult> {
158
+ return this.analysis.sync(projectPath)
159
+ }
160
+
161
+ // ========== Setup Commands ==========
162
+
163
+ async start(): Promise<CommandResult> {
164
+ return this.setupCmds.start()
165
+ }
166
+
167
+ async setup(options: SetupOptions = {}): Promise<CommandResult> {
168
+ return this.setupCmds.setup(options)
169
+ }
170
+
171
+ async migrateAll(options: MigrateOptions = {}): Promise<CommandResult> {
172
+ return this.setupCmds.migrateAll(options)
173
+ }
174
+
175
+ async installStatusLine(): Promise<{ success: boolean; error?: string }> {
176
+ return this.setupCmds.installStatusLine()
177
+ }
178
+
179
+ showAsciiArt(): void {
180
+ return this.setupCmds.showAsciiArt()
181
+ }
182
+
183
+ // ========== Delegated Base Methods ==========
184
+
185
+ async initializeAgent(): Promise<unknown> {
186
+ return this.workflow.initializeAgent()
187
+ }
188
+
189
+ async ensureProjectInit(projectPath: string): Promise<CommandResult> {
190
+ return this.workflow.ensureProjectInit(projectPath)
191
+ }
192
+
193
+ async ensureAuthor(): Promise<Author> {
194
+ return this.workflow.ensureAuthor()
195
+ }
196
+
197
+ async getGlobalProjectPath(projectPath: string): Promise<string> {
198
+ return this.workflow.getGlobalProjectPath(projectPath)
199
+ }
200
+
201
+ async logToMemory(projectPath: string, action: string, data: Record<string, unknown>): Promise<void> {
202
+ return this.workflow.logToMemory(projectPath, action, data)
203
+ }
204
+ }
205
+
206
+ // Export both class and singleton instance
207
+ const instance = new PrjctCommands()
208
+
209
+ export default instance
210
+ export { PrjctCommands }
211
+ export * from './types'
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Maintenance Commands: cleanup, design
3
+ * Analysis commands moved to analysis.ts
4
+ */
5
+
6
+ import path from 'path'
7
+
8
+ import type { CommandResult, CleanupOptions, DesignOptions, Context } from './types'
9
+ import {
10
+ PrjctCommandsBase,
11
+ contextBuilder,
12
+ toolRegistry,
13
+ pathManager,
14
+ configManager,
15
+ fileHelper,
16
+ jsonlHelper,
17
+ dateHelper,
18
+ out
19
+ } from './base'
20
+
21
+ export class MaintenanceCommands extends PrjctCommandsBase {
22
+ /**
23
+ * Memory cleanup helper
24
+ */
25
+ async _cleanupMemory(projectPath: string): Promise<{ success: boolean; results: { rotated: string[]; totalSize: number; freedSpace: number } }> {
26
+ const projectId = await configManager.getProjectId(projectPath)
27
+
28
+ const results = { rotated: [] as string[], totalSize: 0, freedSpace: 0 }
29
+ const jsonlFiles = [
30
+ pathManager.getFilePath(projectId!, 'memory', 'context.jsonl'),
31
+ pathManager.getFilePath(projectId!, 'progress', 'shipped.md'),
32
+ pathManager.getFilePath(projectId!, 'planning', 'ideas.md'),
33
+ ]
34
+
35
+ for (const filePath of jsonlFiles) {
36
+ try {
37
+ const sizeMB = await jsonlHelper.getFileSizeMB(filePath)
38
+ if (sizeMB > 0) {
39
+ results.totalSize += sizeMB
40
+ const rotated = await jsonlHelper.rotateJsonLinesIfNeeded(filePath, 10)
41
+ if (rotated) {
42
+ results.rotated.push(path.basename(filePath))
43
+ results.freedSpace += sizeMB
44
+ }
45
+ }
46
+ } catch {
47
+ // skip
48
+ }
49
+ }
50
+
51
+ return { success: true, results }
52
+ }
53
+
54
+ /**
55
+ * Internal cleanup helper for memory during normal cleanup
56
+ */
57
+ async _cleanupMemoryInternal(projectPath: string): Promise<void> {
58
+ const projectId = await configManager.getProjectId(projectPath)
59
+ const memoryPath = pathManager.getFilePath(projectId!, 'memory', 'context.jsonl')
60
+ await jsonlHelper.rotateJsonLinesIfNeeded(memoryPath, 10)
61
+ }
62
+
63
+ /**
64
+ * /p:cleanup - Clean temp files and old entries
65
+ */
66
+ async cleanup(_options: CleanupOptions = {}, projectPath: string = process.cwd()): Promise<CommandResult> {
67
+ try {
68
+ const initResult = await this.ensureProjectInit(projectPath)
69
+ if (!initResult.success) return initResult
70
+
71
+ const isMemoryMode = _options.memory === true || _options.type === 'memory'
72
+
73
+ if (isMemoryMode) {
74
+ out.spin('cleaning memory...')
75
+ const result = await this._cleanupMemory(projectPath)
76
+ out.done('memory cleaned')
77
+ return result
78
+ }
79
+
80
+ out.spin('cleaning up...')
81
+
82
+ const context = await contextBuilder.build(projectPath) as Context
83
+ const projectId = await configManager.getProjectId(projectPath)
84
+
85
+ const cleaned: string[] = []
86
+
87
+ const memoryPath = pathManager.getFilePath(projectId!, 'memory', 'context.jsonl')
88
+ try {
89
+ const entries = await jsonlHelper.readJsonLines(memoryPath)
90
+
91
+ if (entries.length > 100) {
92
+ const kept = entries.slice(-100)
93
+ await jsonlHelper.writeJsonLines(memoryPath, kept)
94
+ cleaned.push(`Memory: ${entries.length - 100} old entries removed`)
95
+ } else {
96
+ cleaned.push('Memory: No cleanup needed')
97
+ }
98
+ } catch {
99
+ cleaned.push('Memory: No file found')
100
+ }
101
+
102
+ const ideasPath = context.paths.ideas
103
+ try {
104
+ const ideasContent = (await toolRegistry.get('Read')!(ideasPath)) as string
105
+ const sections = ideasContent.split('##').filter((s) => s.trim())
106
+
107
+ const nonEmpty = sections.filter((section) => {
108
+ const lines = section
109
+ .trim()
110
+ .split('\n')
111
+ .filter((l) => l.trim())
112
+ return lines.length > 1
113
+ })
114
+
115
+ if (sections.length !== nonEmpty.length) {
116
+ const newContent =
117
+ '# IDEAS 💡\n\n## Brain Dump\n\n' +
118
+ nonEmpty
119
+ .slice(1)
120
+ .map((s) => '## ' + s.trim())
121
+ .join('\n\n')
122
+ await toolRegistry.get('Write')!(ideasPath, newContent)
123
+ cleaned.push(`Ideas: ${sections.length - nonEmpty.length} empty sections removed`)
124
+ } else {
125
+ cleaned.push('Ideas: No cleanup needed')
126
+ }
127
+ } catch {
128
+ cleaned.push('Ideas: No file found')
129
+ }
130
+
131
+ const nextPath = context.paths.next
132
+ try {
133
+ const nextContent = (await toolRegistry.get('Read')!(nextPath)) as string
134
+ const completedTasks = (nextContent.match(/\[x\]/gi) || []).length
135
+
136
+ if (completedTasks > 0) {
137
+ cleaned.push(
138
+ `Queue: ${completedTasks} completed tasks found (not removed - use /p:done to clear)`
139
+ )
140
+ } else {
141
+ cleaned.push('Queue: No completed tasks')
142
+ }
143
+ } catch {
144
+ cleaned.push('Queue: No file found')
145
+ }
146
+
147
+ await this._cleanupMemoryInternal(projectPath)
148
+
149
+ await this.logToMemory(projectPath, 'cleanup_performed', {
150
+ items: cleaned.length,
151
+ timestamp: dateHelper.getTimestamp(),
152
+ })
153
+
154
+ out.done(`${cleaned.length} items cleaned`)
155
+ return { success: true, cleaned }
156
+ } catch (error) {
157
+ out.fail((error as Error).message)
158
+ return { success: false, error: (error as Error).message }
159
+ }
160
+ }
161
+
162
+ /**
163
+ * /p:design - Design system architecture, APIs, and components
164
+ */
165
+ async design(target: string | null = null, options: DesignOptions = {}, projectPath: string = process.cwd()): Promise<CommandResult> {
166
+ try {
167
+ const initResult = await this.ensureProjectInit(projectPath)
168
+ if (!initResult.success) return initResult
169
+
170
+ const designType = options.type || 'architecture'
171
+ const validTypes = ['architecture', 'api', 'component', 'database', 'flow']
172
+
173
+ if (!validTypes.includes(designType)) {
174
+ out.fail(`invalid type: ${designType}`)
175
+ return { success: false, error: 'Invalid design type' }
176
+ }
177
+
178
+ const designTarget = target || 'system'
179
+ out.spin(`designing ${designType}...`)
180
+
181
+ const projectId = await configManager.getProjectId(projectPath)
182
+ const designsPath = path.join(
183
+ pathManager.getGlobalProjectPath(projectId!),
184
+ 'planning',
185
+ 'designs'
186
+ )
187
+ await fileHelper.ensureDir(designsPath)
188
+
189
+ let designContent = ''
190
+
191
+ switch (designType) {
192
+ case 'architecture':
193
+ designContent = `# Architecture Design: ${designTarget}\n\n*Use templates/design/architecture.md for full design*\n`
194
+ break
195
+ case 'api':
196
+ designContent = `# API Design: ${designTarget}\n\n*Use templates/design/api.md for full design*\n`
197
+ break
198
+ case 'component':
199
+ designContent = `# Component Design: ${designTarget}\n\n*Use templates/design/component.md for full design*\n`
200
+ break
201
+ case 'database':
202
+ designContent = `# Database Design: ${designTarget}\n\n*Use templates/design/database.md for full design*\n`
203
+ break
204
+ case 'flow':
205
+ designContent = `# Flow Design: ${designTarget}\n\n*Use templates/design/flow.md for full design*\n`
206
+ break
207
+ }
208
+
209
+ const designFileName = `${designType}-${designTarget.toLowerCase().replace(/\s+/g, '-')}.md`
210
+ const designFilePath = path.join(designsPath, designFileName)
211
+ await fileHelper.writeFile(designFilePath, designContent)
212
+
213
+ await this.logToMemory(projectPath, 'design_created', {
214
+ type: designType,
215
+ target: designTarget,
216
+ timestamp: dateHelper.getTimestamp(),
217
+ })
218
+
219
+ out.done(`${designType} design created`)
220
+ return { success: true, designPath: designFilePath, type: designType, target: designTarget }
221
+ } catch (error) {
222
+ out.fail((error as Error).message)
223
+ return { success: false, error: (error as Error).message }
224
+ }
225
+ }
226
+ }