prjct-cli 0.11.5 → 0.12.1

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 +190 -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 +600 -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 +58 -8
  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
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Shipping Commands: ship and related helpers
3
+ */
4
+
5
+ import path from 'path'
6
+
7
+ import memorySystem from '../agentic/memory-system'
8
+ import type { CommandResult, Context } from './types'
9
+ import {
10
+ PrjctCommandsBase,
11
+ contextBuilder,
12
+ toolRegistry,
13
+ configManager,
14
+ fileHelper,
15
+ dateHelper,
16
+ out
17
+ } from './base'
18
+
19
+ export class ShippingCommands extends PrjctCommandsBase {
20
+ /**
21
+ * /p:ship - Ship feature with complete automated workflow
22
+ */
23
+ async ship(feature: string | null, projectPath: string = process.cwd()): Promise<CommandResult> {
24
+ try {
25
+ const initResult = await this.ensureProjectInit(projectPath)
26
+ if (!initResult.success) return initResult
27
+
28
+ let featureName = feature
29
+ if (!featureName) {
30
+ const context = await contextBuilder.build(projectPath) as Context
31
+ const nowContent = await toolRegistry.get('Read')!(context.paths.now) as string
32
+ if (nowContent && nowContent.includes('**')) {
33
+ const match = nowContent.match(/\*\*(.+?)\*\*/)
34
+ featureName = match ? match[1] : 'current work'
35
+ } else {
36
+ featureName = 'current work'
37
+ }
38
+ }
39
+
40
+ out.spin(`shipping ${featureName}...`)
41
+
42
+ const lintResult = await this._runLint(projectPath)
43
+
44
+ out.spin('running tests...')
45
+ const testResult = await this._runTests(projectPath)
46
+
47
+ out.spin('updating version...')
48
+ const newVersion = await this._bumpVersion(projectPath)
49
+ await this._updateChangelog(featureName, newVersion, projectPath)
50
+
51
+ out.spin('committing...')
52
+ const commitResult = await this._createShipCommit(featureName, projectPath)
53
+
54
+ if (commitResult.success) {
55
+ out.spin('pushing...')
56
+ await this._gitPush(projectPath)
57
+ }
58
+
59
+ const context = await contextBuilder.build(projectPath) as Context
60
+ const shippedContent =
61
+ (await toolRegistry.get('Read')!(context.paths.shipped) as string) || '# SHIPPED 🚀\n\n'
62
+ const shippedEntry = `\n## ${featureName}\n\nShipped: ${new Date().toLocaleString()}\nVersion: ${newVersion}\n`
63
+ await toolRegistry.get('Write')!(context.paths.shipped, shippedContent + shippedEntry)
64
+
65
+ await this.logToMemory(projectPath, 'feature_shipped', {
66
+ feature: featureName,
67
+ version: newVersion,
68
+ timestamp: dateHelper.getTimestamp(),
69
+ })
70
+
71
+ const config = await configManager.readConfig(projectPath)
72
+ const projectId = config!.projectId
73
+
74
+ await memorySystem.learnDecision(projectId, 'commit_footer', 'prjct', 'ship')
75
+
76
+ if (testResult.success) {
77
+ await memorySystem.recordDecision(projectId, 'test_before_ship', 'true', 'ship')
78
+ }
79
+
80
+ const isQuickShip = !lintResult.success || !testResult.success
81
+ if (isQuickShip) {
82
+ await memorySystem.recordWorkflow(projectId, 'quick_ship', {
83
+ description: 'Ship without full checks',
84
+ feature_type: featureName.toLowerCase().includes('doc') ? 'docs' : 'other'
85
+ })
86
+ }
87
+
88
+ out.done(`v${newVersion} shipped`)
89
+
90
+ return { success: true, feature: featureName, version: newVersion }
91
+ } catch (error) {
92
+ out.fail((error as Error).message)
93
+ return { success: false, error: (error as Error).message }
94
+ }
95
+ }
96
+
97
+ /**
98
+ * Run lint checks
99
+ */
100
+ async _runLint(_projectPath: string): Promise<{ success: boolean; message: string }> {
101
+ try {
102
+ const result = await toolRegistry.get('Bash')!('npm run lint 2>&1 || true') as { stdout: string; stderr: string }
103
+ return { success: !result.stderr.includes('error'), message: 'passed' }
104
+ } catch {
105
+ return { success: false, message: 'no lint script (skipped)' }
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Run tests
111
+ */
112
+ async _runTests(_projectPath: string): Promise<{ success: boolean; message: string }> {
113
+ try {
114
+ const result = await toolRegistry.get('Bash')!(
115
+ 'npm test -- --passWithNoTests 2>&1 || true'
116
+ ) as { stdout: string; stderr: string }
117
+ return { success: !result.stderr.includes('FAIL'), message: 'passed' }
118
+ } catch {
119
+ return { success: false, message: 'no test script (skipped)' }
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Bump version
125
+ */
126
+ async _bumpVersion(projectPath: string): Promise<string> {
127
+ try {
128
+ const pkgPath = path.join(projectPath, 'package.json')
129
+ const pkg = await fileHelper.readJson<{ version?: string }>(pkgPath, { version: '0.0.0' })
130
+ const oldVersion = pkg?.version || '0.0.0'
131
+ const [major, minor, patch] = oldVersion.split('.').map(Number)
132
+ const newVersion = `${major}.${minor}.${patch + 1}`
133
+ if (pkg) {
134
+ pkg.version = newVersion
135
+ await fileHelper.writeJson(pkgPath, pkg)
136
+ }
137
+ return newVersion
138
+ } catch {
139
+ return '0.0.1'
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Update CHANGELOG
145
+ */
146
+ async _updateChangelog(feature: string, version: string, projectPath: string): Promise<void> {
147
+ try {
148
+ const changelogPath = path.join(projectPath, 'CHANGELOG.md')
149
+ const changelog = await fileHelper.readFile(changelogPath, '# Changelog\n\n')
150
+
151
+ const entry = `## [${version}] - ${dateHelper.formatDate(new Date())}\n\n### Added\n- ${feature}\n\n`
152
+ const updated = changelog.replace('# Changelog\n\n', `# Changelog\n\n${entry}`)
153
+
154
+ await fileHelper.writeFile(changelogPath, updated)
155
+ } catch {
156
+ console.error(' Warning: Could not update CHANGELOG')
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Create git commit for ship
162
+ */
163
+ async _createShipCommit(feature: string, _projectPath: string): Promise<{ success: boolean; message: string }> {
164
+ try {
165
+ await toolRegistry.get('Bash')!('git add .')
166
+
167
+ const commitMsg = `feat: ${feature}\n\n🤖 Generated with [p/](https://www.prjct.app/)\nDesigned for [Claude](https://www.anthropic.com/claude)`
168
+
169
+ await toolRegistry.get('Bash')!(`git commit -m "${commitMsg.replace(/"/g, '\\"')}"`)
170
+
171
+ return { success: true, message: 'Committed' }
172
+ } catch {
173
+ return { success: false, message: 'No changes to commit' }
174
+ }
175
+ }
176
+
177
+ /**
178
+ * Push to remote
179
+ */
180
+ async _gitPush(_projectPath: string): Promise<{ success: boolean; message: string }> {
181
+ try {
182
+ await toolRegistry.get('Bash')!('git push')
183
+ return { success: true, message: 'Pushed to remote' }
184
+ } catch {
185
+ return { success: false, message: 'Push failed (no remote or auth issue)' }
186
+ }
187
+ }
188
+ }
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Type definitions for Commands module
3
+ *
4
+ * Re-exports common types from core/types and defines command-specific types.
5
+ */
6
+
7
+ // Re-export commonly used types from core/types
8
+ export type {
9
+ ContextPaths as Paths,
10
+ ProjectContext as Context,
11
+ CommandParams,
12
+ CommandResult as BaseCommandResult,
13
+ } from '../types'
14
+
15
+ /**
16
+ * Command execution result with optional extra data.
17
+ * Extends BaseCommandResult with command-specific fields.
18
+ */
19
+ export interface CommandResult {
20
+ success: boolean
21
+ message?: string
22
+ error?: string
23
+ /** Duration of command execution */
24
+ duration?: string
25
+ /** Task that was affected */
26
+ task?: string
27
+ /** Feature that was affected */
28
+ feature?: string
29
+ /** Files that were modified */
30
+ filesModified?: string[]
31
+ }
32
+
33
+ // Agent types
34
+ export interface AgentInfo {
35
+ isSupported: boolean
36
+ type: string
37
+ }
38
+
39
+ export interface Author {
40
+ name: string | null
41
+ email: string | null
42
+ github?: string | null
43
+ }
44
+
45
+ export interface AgentAssignmentResult {
46
+ agent: { name: string; domain?: string } | null
47
+ routing: {
48
+ confidence: number
49
+ reason: string
50
+ availableAgents?: string[]
51
+ }
52
+ _agenticNote?: string
53
+ }
54
+
55
+ // Analysis types
56
+ export interface ComplexityResult {
57
+ level: 'low' | 'medium' | 'high'
58
+ hours: number
59
+ type: string
60
+ }
61
+
62
+ export interface HealthResult {
63
+ score: number
64
+ message: string
65
+ }
66
+
67
+ /**
68
+ * Options for the design command.
69
+ */
70
+ export interface DesignOptions {
71
+ /** Type of design (e.g., 'system', 'component', 'api') */
72
+ type?: 'system' | 'component' | 'api' | 'database'
73
+ /** Output format */
74
+ format?: 'markdown' | 'mermaid'
75
+ }
76
+
77
+ /**
78
+ * Options for the cleanup command.
79
+ */
80
+ export interface CleanupOptions {
81
+ /** Clean up memory/history */
82
+ memory?: boolean
83
+ /** Type of cleanup */
84
+ type?: 'all' | 'memory' | 'sessions' | 'cache'
85
+ /** Dry run without making changes */
86
+ dryRun?: boolean
87
+ }
88
+
89
+ /**
90
+ * Options for the setup command.
91
+ */
92
+ export interface SetupOptions {
93
+ /** Force re-setup even if already configured */
94
+ force?: boolean
95
+ /** Skip interactive prompts */
96
+ nonInteractive?: boolean
97
+ }
98
+
99
+ /**
100
+ * Options for the migrate-all command.
101
+ */
102
+ export interface MigrateOptions {
103
+ /** Perform deep scan for legacy installations */
104
+ deepScan?: boolean
105
+ /** Remove legacy installations after migration */
106
+ removeLegacy?: boolean
107
+ /** Dry run without making changes */
108
+ dryRun?: boolean
109
+ }
110
+
111
+ /**
112
+ * Options for the analyze command.
113
+ */
114
+ export interface AnalyzeOptions {
115
+ /** Force re-analysis even if cached */
116
+ force?: boolean
117
+ /** Analysis depth */
118
+ depth?: 'quick' | 'normal' | 'deep'
119
+ }
120
+
121
+ /**
122
+ * Result from project migration.
123
+ */
124
+ export interface MigrationResult {
125
+ success: boolean
126
+ projectId: string | null
127
+ filesCopied?: number
128
+ layerCounts: LayerCounts
129
+ config: MigrationConfig | null
130
+ author: Author | null
131
+ issues: string[]
132
+ dryRun: boolean
133
+ legacyRemoved?: boolean
134
+ legacyCleaned?: boolean
135
+ }
136
+
137
+ export interface LayerCounts {
138
+ core: number
139
+ progress: number
140
+ planning: number
141
+ analysis: number
142
+ memory: number
143
+ other: number
144
+ }
145
+
146
+ export interface MigrationConfig {
147
+ projectId: string
148
+ version: string
149
+ migratedAt: string
150
+ }
151
+
152
+ // Type-safe command method names (for dynamic invocation)
153
+ export type CommandMethodName =
154
+ | 'now' | 'done' | 'next' | 'build'
155
+ | 'init' | 'feature' | 'bug' | 'architect'
156
+ | 'ship'
157
+ | 'context' | 'recap' | 'stuck' | 'progress' | 'roadmap' | 'status'
158
+ | 'cleanup' | 'design'
159
+ | 'analyze' | 'sync'
160
+ | 'start' | 'setup' | 'migrateAll'
161
+
162
+ // Function signature for standard command methods
163
+ export type StandardCommandFn = (param: string | null, projectPath?: string) => Promise<CommandResult>
164
+
165
+ /**
166
+ * Global configuration for prjct.
167
+ */
168
+ export interface GlobalConfig {
169
+ projectId: string
170
+ projectPath?: string
171
+ authors: AuthorEntry[]
172
+ version: string
173
+ created?: string
174
+ lastSync: string
175
+ }
176
+
177
+ export interface AuthorEntry {
178
+ name: string
179
+ email: string
180
+ github: string
181
+ firstContribution?: string
182
+ lastActivity?: string
183
+ }
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Workflow Commands: now, done, next, build
3
+ * Core task management
4
+ */
5
+
6
+ import type { CommandResult, Context } from './types'
7
+ import {
8
+ PrjctCommandsBase,
9
+ contextBuilder,
10
+ toolRegistry,
11
+ dateHelper,
12
+ out
13
+ } from './base'
14
+
15
+ export class WorkflowCommands extends PrjctCommandsBase {
16
+ /**
17
+ * /p:now - Set or show current task
18
+ */
19
+ async now(task: string | null = null, projectPath: string = process.cwd()): Promise<CommandResult> {
20
+ try {
21
+ const initResult = await this.ensureProjectInit(projectPath)
22
+ if (!initResult.success) return initResult
23
+
24
+ const context = await contextBuilder.build(projectPath, { task }) as Context
25
+
26
+ if (task) {
27
+ const agentResult = await this._assignAgentForTask(task, projectPath, context)
28
+ const agent = agentResult.agent?.name || 'generalist'
29
+ const confidence = agentResult.routing?.confidence || 0.5
30
+
31
+ const nowContent = `# NOW\n\n**${task}**\n\nStarted: ${new Date().toLocaleString()}\nAgent: ${agent} (${Math.round(confidence * 100)}% confidence)\n`
32
+ await toolRegistry.get('Write')!(context.paths.now, nowContent)
33
+
34
+ out.done(`${task} [${agent}]`)
35
+
36
+ await this.logToMemory(projectPath, 'task_started', {
37
+ task,
38
+ agent,
39
+ confidence,
40
+ timestamp: dateHelper.getTimestamp(),
41
+ })
42
+ return { success: true, task, agent }
43
+ } else {
44
+ const nowContent = await toolRegistry.get('Read')!(context.paths.now) as string
45
+
46
+ if (!nowContent || nowContent.includes('No current task')) {
47
+ out.warn('no active task')
48
+ return { success: true, message: 'No active task' }
49
+ }
50
+
51
+ const taskMatch = nowContent.match(/\*\*(.+?)\*\*/)
52
+ const agentMatch = nowContent.match(/Agent: ([^\s(]+)/)
53
+ const currentTask = taskMatch ? taskMatch[1] : 'unknown'
54
+ const currentAgent = agentMatch ? agentMatch[1] : ''
55
+ out.done(`working on: ${currentTask}${currentAgent ? ` [${currentAgent}]` : ''}`)
56
+ return { success: true, content: nowContent }
57
+ }
58
+ } catch (error) {
59
+ out.fail((error as Error).message)
60
+ return { success: false, error: (error as Error).message }
61
+ }
62
+ }
63
+
64
+ /**
65
+ * /p:done - Complete current task
66
+ */
67
+ async done(projectPath: string = process.cwd()): Promise<CommandResult> {
68
+ try {
69
+ const initResult = await this.ensureProjectInit(projectPath)
70
+ if (!initResult.success) return initResult
71
+
72
+ const context = await contextBuilder.build(projectPath) as Context
73
+ const nowContent = await toolRegistry.get('Read')!(context.paths.now) as string
74
+
75
+ if (!nowContent || nowContent.includes('No current task') || nowContent.trim() === '# NOW') {
76
+ out.warn('no active task')
77
+ return { success: true, message: 'No active task to complete' }
78
+ }
79
+
80
+ const taskMatch = nowContent.match(/\*\*(.+?)\*\*/)
81
+ const task = taskMatch ? taskMatch[1] : 'task'
82
+
83
+ const startedMatch = nowContent.match(/Started: (.+)/)
84
+ let duration = ''
85
+ if (startedMatch) {
86
+ const started = new Date(startedMatch[1])
87
+ duration = dateHelper.calculateDuration(started)
88
+ }
89
+
90
+ const emptyNow = '# NOW\n\nNo current task. Use `/p:now` to set focus.\n'
91
+ await toolRegistry.get('Write')!(context.paths.now, emptyNow)
92
+
93
+ out.done(`${task}${duration ? ` (${duration})` : ''}`)
94
+
95
+ await this.logToMemory(projectPath, 'task_completed', {
96
+ task,
97
+ duration,
98
+ timestamp: dateHelper.getTimestamp(),
99
+ })
100
+ return { success: true, task, duration }
101
+ } catch (error) {
102
+ out.fail((error as Error).message)
103
+ return { success: false, error: (error as Error).message }
104
+ }
105
+ }
106
+
107
+ /**
108
+ * /p:next - Show priority queue
109
+ */
110
+ async next(projectPath: string = process.cwd()): Promise<CommandResult> {
111
+ try {
112
+ const initResult = await this.ensureProjectInit(projectPath)
113
+ if (!initResult.success) return initResult
114
+
115
+ const context = await contextBuilder.build(projectPath) as Context
116
+ const nextContent = await toolRegistry.get('Read')!(context.paths.next) as string
117
+
118
+ if (!nextContent || nextContent.trim() === '# NEXT\n\n## Priority Queue') {
119
+ out.warn('queue empty')
120
+ return { success: true, message: 'Queue is empty' }
121
+ }
122
+
123
+ const taskCount = (nextContent.match(/^- \[/gm) || []).length
124
+ out.done(`${taskCount} task${taskCount !== 1 ? 's' : ''} queued`)
125
+
126
+ return { success: true, content: nextContent }
127
+ } catch (error) {
128
+ out.fail((error as Error).message)
129
+ return { success: false, error: (error as Error).message }
130
+ }
131
+ }
132
+
133
+ /**
134
+ * /p:build - Start task with agent assignment
135
+ */
136
+ async build(taskOrNumber: string, projectPath: string = process.cwd()): Promise<CommandResult> {
137
+ try {
138
+ const initResult = await this.ensureProjectInit(projectPath)
139
+ if (!initResult.success) return initResult
140
+
141
+ const context = await contextBuilder.build(projectPath, { task: taskOrNumber }) as Context
142
+
143
+ const nowContent = await toolRegistry.get('Read')!(context.paths.now) as string
144
+ if (nowContent && !nowContent.includes('No current task')) {
145
+ console.log('⚠️ Already working on a task!')
146
+ console.log(' Complete it with /p:done first\n')
147
+ const taskMatch = nowContent.match(/\*\*(.+?)\*\*/)
148
+ const currentTask = taskMatch ? taskMatch[1] : 'current task'
149
+ console.log(` Current: ${currentTask}`)
150
+ return { success: false, message: 'Task already active' }
151
+ }
152
+
153
+ let task = taskOrNumber
154
+
155
+ if (!isNaN(Number(taskOrNumber))) {
156
+ const nextContent = await toolRegistry.get('Read')!(context.paths.next) as string
157
+ const tasks = nextContent
158
+ .split('\n')
159
+ .filter((line) => line.trim().match(/^\d+\./) || line.includes('[ ]'))
160
+
161
+ const index = parseInt(taskOrNumber) - 1
162
+ if (index >= 0 && index < tasks.length) {
163
+ task = tasks[index].replace(/^\d+\.\s*\[.\]\s*/, '').trim()
164
+ console.log(`📋 Selected from queue: ${task}\n`)
165
+ } else {
166
+ console.log(`❌ Invalid task number. Queue has ${tasks.length} tasks.`)
167
+ console.log(' Use /p:next to see queue')
168
+ return { success: false, error: 'Invalid task number' }
169
+ }
170
+ }
171
+
172
+ if (!task) {
173
+ console.log('❌ Task description required')
174
+ console.log('Usage: /p:build "task description"')
175
+ console.log(' or: /p:build 1 (select from queue)')
176
+ return { success: false, error: 'Task required' }
177
+ }
178
+
179
+ console.log(`🏗️ Building: ${task}\n`)
180
+
181
+ const complexity = this._detectComplexity(task)
182
+ const estimate = complexity.hours
183
+
184
+ console.log('📊 Analysis:')
185
+ console.log(` Complexity: ${complexity.level}`)
186
+ console.log(` Estimated: ${estimate}h`)
187
+ console.log(` Type: ${complexity.type}\n`)
188
+
189
+ const agentResult = await this._assignAgentForTask(task, projectPath, context)
190
+ const agent = agentResult.agent?.name || 'generalist'
191
+ const confidence = agentResult.routing?.confidence || 0.5
192
+ console.log(`🤖 Agent: ${agent} (${Math.round(confidence * 100)}% confidence)\n`)
193
+
194
+ const nowContentNew = `# NOW
195
+
196
+ **${task}**
197
+
198
+ Started: ${new Date().toLocaleString()}
199
+ Estimated: ${estimate}h
200
+ Complexity: ${complexity.level}
201
+ Agent: ${agent} (${Math.round(confidence * 100)}% confidence)
202
+ `
203
+ await toolRegistry.get('Write')!(context.paths.now, nowContentNew)
204
+
205
+ console.log('✅ Task started!\n')
206
+ console.log('💡 Next steps:')
207
+ console.log('• Start coding')
208
+ console.log('• /p:done → Mark complete')
209
+ console.log('• /p:stuck → Get help if needed')
210
+
211
+ await this.logToMemory(projectPath, 'task_built', {
212
+ task,
213
+ complexity: complexity.level,
214
+ estimate,
215
+ agent,
216
+ confidence,
217
+ timestamp: dateHelper.getTimestamp(),
218
+ })
219
+
220
+ return { success: true, task, complexity, estimate, agent }
221
+ } catch (error) {
222
+ console.error('❌ Error:', (error as Error).message)
223
+ return { success: false, error: (error as Error).message }
224
+ }
225
+ }
226
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Agentic Commands Handler for prjct CLI
3
+ *
4
+ * Re-exports from modular commands/ directory.
5
+ * See commands/index.ts for implementation.
6
+ */
7
+
8
+ import instance, { PrjctCommands } from './commands/index'
9
+
10
+ export default instance
11
+ export { PrjctCommands }