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
@@ -1,546 +0,0 @@
1
- const fs = require('fs').promises
2
- const path = require('path')
3
- const os = require('os')
4
- const { execSync } = require('child_process')
5
-
6
- /**
7
- * Legacy Installer Detector
8
- *
9
- * Detects and cleans up legacy curl-based installations from ~/.prjct-cli/
10
- * These were installed via curl install.sh before v0.8.2 (npm migration)
11
- *
12
- * What it does:
13
- * 1. Detects ~/.prjct-cli/ directory (legacy curl install location)
14
- * 2. Checks if it's a git repository (legacy indicator)
15
- * 3. Backs up global projects data to new npm location
16
- * 4. Removes legacy installation files
17
- * 5. Preserves user data (projects/ directory)
18
- * 6. Cleans up legacy PATH entries and symlinks
19
- *
20
- * @version 0.8.8
21
- */
22
-
23
- // Colors
24
- const CYAN = '\x1b[36m'
25
- const GREEN = '\x1b[32m'
26
- const YELLOW = '\x1b[33m'
27
- const RED = '\x1b[31m'
28
- const DIM = '\x1b[2m'
29
- const NC = '\x1b[0m'
30
-
31
- class LegacyInstallerDetector {
32
- constructor() {
33
- this.legacyInstallDir = path.join(os.homedir(), '.prjct-cli')
34
- this.npmGlobalProjectsDir = path.join(os.homedir(), '.prjct-cli', 'projects')
35
- this.isWindows = process.platform === 'win32'
36
- }
37
-
38
- /**
39
- * Check if legacy curl installation exists
40
- * @returns {Promise<boolean>}
41
- */
42
- async hasLegacyInstallation() {
43
- try {
44
- const stat = await fs.stat(this.legacyInstallDir)
45
- if (!stat.isDirectory()) return false
46
-
47
- // Check for .git directory (indicates curl install)
48
- try {
49
- await fs.access(path.join(this.legacyInstallDir, '.git'))
50
- return true // Definitely a git clone from curl install
51
- } catch {
52
- // No .git, check for other legacy indicators
53
- const entries = await fs.readdir(this.legacyInstallDir)
54
-
55
- // Legacy has: bin/, core/, templates/, scripts/, package.json
56
- const legacyFiles = ['bin', 'core', 'templates', 'scripts', 'package.json']
57
- const hasLegacyFiles = legacyFiles.every(file => entries.includes(file))
58
-
59
- if (hasLegacyFiles) {
60
- return true // Has legacy structure
61
- }
62
-
63
- // Only has projects/ and config/ = already migrated
64
- const onlyDataDirs = entries.every(entry => ['projects', 'config'].includes(entry))
65
- return !onlyDataDirs
66
- }
67
- } catch {
68
- return false
69
- }
70
- }
71
-
72
- /**
73
- * Get npm global installation path
74
- * @returns {string}
75
- */
76
- getNpmGlobalPath() {
77
- try {
78
- const npmRoot = execSync('npm root -g', { encoding: 'utf8' }).trim()
79
- return path.join(npmRoot, 'prjct-cli')
80
- } catch {
81
- // Fallback to common locations
82
- const nodePath = process.execPath
83
- const nodeDir = path.dirname(path.dirname(nodePath))
84
- return path.join(nodeDir, 'lib', 'node_modules', 'prjct-cli')
85
- }
86
- }
87
-
88
- /**
89
- * Check if user has npm global installation
90
- * @returns {Promise<boolean>}
91
- */
92
- async hasNpmInstallation() {
93
- try {
94
- execSync('npm list -g prjct-cli', { stdio: 'ignore' })
95
- return true
96
- } catch {
97
- return false
98
- }
99
- }
100
-
101
- /**
102
- * Get version of legacy installation
103
- * @returns {Promise<string|null>}
104
- */
105
- async getLegacyVersion() {
106
- try {
107
- const packageJsonPath = path.join(this.legacyInstallDir, 'package.json')
108
- const content = await fs.readFile(packageJsonPath, 'utf8')
109
- const pkg = JSON.parse(content)
110
- return pkg.version || 'unknown'
111
- } catch {
112
- return null
113
- }
114
- }
115
-
116
- /**
117
- * Migrate projects data from legacy location to npm location
118
- * Only migrates if projects/ directory exists in legacy location
119
- * @returns {Promise<{success: boolean, projectsMigrated: number, message: string}>}
120
- */
121
- async migrateProjectsData() {
122
- const result = {
123
- success: false,
124
- projectsMigrated: 0,
125
- message: ''
126
- }
127
-
128
- try {
129
- const legacyProjectsDir = path.join(this.legacyInstallDir, 'projects')
130
-
131
- // Check if legacy projects directory exists
132
- try {
133
- await fs.access(legacyProjectsDir)
134
- } catch {
135
- result.success = true
136
- result.message = 'No projects data to migrate'
137
- return result
138
- }
139
-
140
- // Ensure npm global projects directory exists
141
- await fs.mkdir(this.npmGlobalProjectsDir, { recursive: true })
142
-
143
- // Read all project directories
144
- const projectDirs = await fs.readdir(legacyProjectsDir, { withFileTypes: true })
145
-
146
- for (const entry of projectDirs) {
147
- if (!entry.isDirectory()) continue
148
-
149
- const legacyProjectPath = path.join(legacyProjectsDir, entry.name)
150
- const npmProjectPath = path.join(this.npmGlobalProjectsDir, entry.name)
151
-
152
- // Check if project already exists in npm location
153
- try {
154
- await fs.access(npmProjectPath)
155
- // Already exists, skip
156
- continue
157
- } catch {
158
- // Doesn't exist, copy it
159
- await this.copyDirectory(legacyProjectPath, npmProjectPath)
160
- result.projectsMigrated++
161
- }
162
- }
163
-
164
- result.success = true
165
- result.message = result.projectsMigrated > 0
166
- ? `Migrated ${result.projectsMigrated} project(s) to npm global location`
167
- : 'All projects already in npm location'
168
-
169
- return result
170
- } catch (error) {
171
- result.message = `Migration failed: ${error.message}`
172
- return result
173
- }
174
- }
175
-
176
- /**
177
- * Copy directory recursively
178
- * @private
179
- */
180
- async copyDirectory(source, destination) {
181
- await fs.mkdir(destination, { recursive: true })
182
-
183
- const entries = await fs.readdir(source, { withFileTypes: true })
184
-
185
- for (const entry of entries) {
186
- const sourcePath = path.join(source, entry.name)
187
- const destPath = path.join(destination, entry.name)
188
-
189
- if (entry.isDirectory()) {
190
- await this.copyDirectory(sourcePath, destPath)
191
- } else {
192
- await fs.copyFile(sourcePath, destPath)
193
- }
194
- }
195
- }
196
-
197
- /**
198
- * Remove legacy installation files (keep projects data)
199
- * @returns {Promise<{success: boolean, message: string}>}
200
- */
201
- async cleanupLegacyInstallation() {
202
- const result = {
203
- success: false,
204
- message: ''
205
- }
206
-
207
- try {
208
- // Directories to remove (everything except projects and config)
209
- const dirsToRemove = ['bin', 'core', 'templates', 'scripts', 'node_modules', '.git', '__tests__', 'website', 'docs', '.github']
210
- const filesToRemove = [
211
- 'package.json',
212
- 'package-lock.json',
213
- 'README.md',
214
- 'LICENSE',
215
- 'CHANGELOG.md',
216
- 'CLAUDE.md',
217
- 'CONTRIBUTING.md',
218
- 'MIGRATION.md',
219
- 'TESTING.md',
220
- '.gitignore',
221
- '.eslintrc.js',
222
- '.prettierrc',
223
- 'vitest.config.js',
224
- 'vitest.workspace.js'
225
- ]
226
-
227
- let removedItems = 0
228
-
229
- // Remove directories
230
- for (const dir of dirsToRemove) {
231
- const dirPath = path.join(this.legacyInstallDir, dir)
232
- try {
233
- await fs.rm(dirPath, { recursive: true, force: true })
234
- removedItems++
235
- } catch {
236
- // Directory doesn't exist, skip
237
- }
238
- }
239
-
240
- // Remove files
241
- for (const file of filesToRemove) {
242
- const filePath = path.join(this.legacyInstallDir, file)
243
- try {
244
- await fs.unlink(filePath)
245
- removedItems++
246
- } catch {
247
- // File doesn't exist, skip
248
- }
249
- }
250
-
251
- result.success = true
252
- result.message = `Removed ${removedItems} legacy installation items`
253
- return result
254
- } catch (error) {
255
- result.message = `Cleanup failed: ${error.message}`
256
- return result
257
- }
258
- }
259
-
260
- /**
261
- * Get platform-specific shell config files
262
- * @returns {string[]}
263
- */
264
- getShellConfigFiles() {
265
- if (this.isWindows) {
266
- // Windows PowerShell profiles
267
- const profilePaths = []
268
-
269
- // PowerShell 7+ profile
270
- if (process.env.USERPROFILE) {
271
- profilePaths.push(
272
- path.join(process.env.USERPROFILE, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1'),
273
- path.join(process.env.USERPROFILE, 'Documents', 'WindowsPowerShell', 'Microsoft.PowerShell_profile.ps1')
274
- )
275
- }
276
-
277
- return profilePaths
278
- } else {
279
- // Unix/Linux/macOS shell configs
280
- return [
281
- path.join(os.homedir(), '.zshrc'),
282
- path.join(os.homedir(), '.bashrc'),
283
- path.join(os.homedir(), '.profile'),
284
- path.join(os.homedir(), '.bash_profile')
285
- ]
286
- }
287
- }
288
-
289
- /**
290
- * Clean up legacy PATH entries from shell config files
291
- * @returns {Promise<{success: boolean, message: string, filesModified: number}>}
292
- */
293
- async cleanupLegacyPATH() {
294
- const result = {
295
- success: false,
296
- message: '',
297
- filesModified: 0
298
- }
299
-
300
- try {
301
- const shellConfigs = this.getShellConfigFiles()
302
-
303
- for (const configFile of shellConfigs) {
304
- try {
305
- const content = await fs.readFile(configFile, 'utf8')
306
-
307
- // Check if file contains legacy PATH entry
308
- if (!content.includes('.prjct-cli/bin')) {
309
- continue
310
- }
311
-
312
- // Remove lines containing .prjct-cli/bin
313
- const lines = content.split('\n')
314
- const filteredLines = lines.filter(line => {
315
- return !line.includes('.prjct-cli/bin') && !line.includes('# prjct/cli')
316
- })
317
-
318
- // Remove consecutive empty lines
319
- const cleanedLines = []
320
- for (let i = 0; i < filteredLines.length; i++) {
321
- const line = filteredLines[i]
322
- const prevLine = filteredLines[i - 1]
323
-
324
- // Skip if both current and previous lines are empty
325
- if (line.trim() === '' && prevLine && prevLine.trim() === '') {
326
- continue
327
- }
328
-
329
- cleanedLines.push(line)
330
- }
331
-
332
- // Write back
333
- await fs.writeFile(configFile, cleanedLines.join('\n'), 'utf8')
334
- result.filesModified++
335
- } catch {
336
- // File doesn't exist or can't read, skip
337
- }
338
- }
339
-
340
- result.success = true
341
- result.message = result.filesModified > 0
342
- ? `Cleaned PATH from ${result.filesModified} shell config(s)`
343
- : 'No legacy PATH entries found'
344
-
345
- return result
346
- } catch (error) {
347
- result.message = `PATH cleanup failed: ${error.message}`
348
- return result
349
- }
350
- }
351
-
352
- /**
353
- * Clean up legacy symlinks
354
- * @returns {Promise<{success: boolean, message: string}>}
355
- */
356
- async cleanupLegacySymlinks() {
357
- const result = {
358
- success: false,
359
- message: ''
360
- }
361
-
362
- // Skip on Windows (no .local/bin)
363
- if (this.isWindows) {
364
- result.success = true
365
- result.message = 'No symlinks on Windows'
366
- return result
367
- }
368
-
369
- try {
370
- const symlinkPath = path.join(os.homedir(), '.local', 'bin', 'prjct')
371
-
372
- try {
373
- const stat = await fs.lstat(symlinkPath)
374
-
375
- if (stat.isSymbolicLink()) {
376
- const target = await fs.readlink(symlinkPath)
377
-
378
- // Only remove if it points to legacy location
379
- if (target.includes('.prjct-cli')) {
380
- await fs.unlink(symlinkPath)
381
- result.success = true
382
- result.message = 'Removed legacy symlink'
383
- return result
384
- }
385
- }
386
- } catch {
387
- // Symlink doesn't exist
388
- }
389
-
390
- result.success = true
391
- result.message = 'No legacy symlinks found'
392
- return result
393
- } catch (error) {
394
- result.message = `Symlink cleanup failed: ${error.message}`
395
- return result
396
- }
397
- }
398
-
399
- /**
400
- * Perform complete legacy cleanup
401
- * @param {Object} options
402
- * @param {boolean} options.verbose - Show detailed output
403
- * @returns {Promise<Object>}
404
- */
405
- async performCleanup(options = {}) {
406
- const { verbose = true } = options
407
-
408
- const report = {
409
- success: false,
410
- legacyVersion: null,
411
- hasNpm: false,
412
- steps: {
413
- projectsMigrated: 0,
414
- installationCleaned: false,
415
- pathCleaned: false,
416
- symlinksCleaned: false
417
- },
418
- messages: []
419
- }
420
-
421
- try {
422
- // Check prerequisites
423
- const hasLegacy = await this.hasLegacyInstallation()
424
-
425
- if (!hasLegacy) {
426
- report.success = true
427
- report.messages.push('No legacy installation found')
428
- return report
429
- }
430
-
431
- report.legacyVersion = await this.getLegacyVersion()
432
- report.hasNpm = await this.hasNpmInstallation()
433
-
434
- if (verbose) {
435
- console.log('')
436
- console.log(`${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}`)
437
- console.log(`${YELLOW}⚠️ Legacy curl installation detected${NC}`)
438
- console.log(`${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}`)
439
- console.log('')
440
- console.log(` ${DIM}Version: ${report.legacyVersion || 'unknown'}${NC}`)
441
- console.log(` ${DIM}Location: ~/.prjct-cli/${NC}`)
442
- console.log('')
443
-
444
- if (!report.hasNpm) {
445
- console.log(`${RED}❌ npm global installation not found${NC}`)
446
- console.log('')
447
- console.log(`${CYAN}Install prjct-cli via npm first:${NC}`)
448
- console.log(` ${GREEN}npm install -g prjct-cli${NC}`)
449
- console.log('')
450
- return report
451
- }
452
-
453
- console.log(`${CYAN}🔄 Migrating to npm installation...${NC}`)
454
- console.log('')
455
- }
456
-
457
- // Step 1: Migrate projects data
458
- if (verbose) console.log(` ${DIM}Migrating projects data...${NC}`)
459
- const projectsMigration = await this.migrateProjectsData()
460
- report.steps.projectsMigrated = projectsMigration.projectsMigrated
461
- report.messages.push(projectsMigration.message)
462
- if (verbose) {
463
- if (projectsMigration.success) {
464
- console.log(` ${GREEN}✓${NC} ${projectsMigration.message}`)
465
- } else {
466
- console.log(` ${RED}✗${NC} ${projectsMigration.message}`)
467
- }
468
- }
469
-
470
- // Step 2: Clean legacy installation
471
- if (verbose) console.log(` ${DIM}Removing legacy files...${NC}`)
472
- const installCleanup = await this.cleanupLegacyInstallation()
473
- report.steps.installationCleaned = installCleanup.success
474
- report.messages.push(installCleanup.message)
475
- if (verbose) {
476
- if (installCleanup.success) {
477
- console.log(` ${GREEN}✓${NC} ${installCleanup.message}`)
478
- } else {
479
- console.log(` ${RED}✗${NC} ${installCleanup.message}`)
480
- }
481
- }
482
-
483
- // Step 3: Clean PATH entries
484
- if (verbose) console.log(` ${DIM}Cleaning shell PATH...${NC}`)
485
- const pathCleanup = await this.cleanupLegacyPATH()
486
- report.steps.pathCleaned = pathCleanup.success
487
- report.messages.push(pathCleanup.message)
488
- if (verbose) {
489
- if (pathCleanup.success) {
490
- console.log(` ${GREEN}✓${NC} ${pathCleanup.message}`)
491
- } else {
492
- console.log(` ${RED}✗${NC} ${pathCleanup.message}`)
493
- }
494
- }
495
-
496
- // Step 4: Clean symlinks
497
- if (verbose) console.log(` ${DIM}Cleaning symlinks...${NC}`)
498
- const symlinkCleanup = await this.cleanupLegacySymlinks()
499
- report.steps.symlinksCleaned = symlinkCleanup.success
500
- report.messages.push(symlinkCleanup.message)
501
- if (verbose) {
502
- if (symlinkCleanup.success) {
503
- console.log(` ${GREEN}✓${NC} ${symlinkCleanup.message}`)
504
- } else {
505
- console.log(` ${RED}✗${NC} ${symlinkCleanup.message}`)
506
- }
507
- }
508
-
509
- if (verbose) {
510
- console.log('')
511
- console.log(`${GREEN}✨ Migration complete!${NC}`)
512
- console.log('')
513
- console.log(`${DIM}Next steps:${NC}`)
514
- if (pathCleanup.filesModified > 0) {
515
- console.log(` ${CYAN}1. Reload your shell:${NC}`)
516
- console.log(` source ~/.zshrc ${DIM}(or ~/.bashrc)${NC}`)
517
- console.log('')
518
- }
519
- console.log(` ${CYAN}${pathCleanup.filesModified > 0 ? '2' : '1'}. Verify installation:${NC}`)
520
- console.log(` which prjct ${DIM}(should show npm path)${NC}`)
521
- console.log(` prjct --version`)
522
- console.log('')
523
- console.log(`${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}`)
524
- console.log('')
525
- }
526
-
527
- report.success = true
528
- return report
529
- } catch (error) {
530
- report.messages.push(`Cleanup failed: ${error.message}`)
531
- return report
532
- }
533
- }
534
-
535
- /**
536
- * Quick check - silent, returns true if cleanup needed
537
- * @returns {Promise<boolean>}
538
- */
539
- async needsCleanup() {
540
- const hasLegacy = await this.hasLegacyInstallation()
541
- const hasNpm = await this.hasNpmInstallation()
542
- return hasLegacy && hasNpm
543
- }
544
- }
545
-
546
- module.exports = new LegacyInstallerDetector()