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,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 }