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,29 +1,31 @@
1
- const fs = require('fs').promises
2
- const path = require('path')
3
- const os = require('os')
4
-
5
1
  /**
6
- * CommandInstaller - Installs prjct commands to Claude (Code + Desktop)
7
- *
8
- * 100% Claude-focused architecture
9
- * Handles installation and synchronization of /p:* commands
10
- * to Claude's native slash command system
11
- *
12
- * @version 0.5.0
2
+ * CommandInstaller Class
3
+ * Installs prjct commands to Claude (Code + Desktop)
13
4
  */
14
- class CommandInstaller {
5
+
6
+ import fs from 'fs/promises'
7
+ import path from 'path'
8
+ import os from 'os'
9
+ import type { InstallResult, UninstallResult, CheckResult, SyncResult, GlobalConfigResult } from './types'
10
+ import { installGlobalConfig } from './global-config'
11
+
12
+ export class CommandInstaller {
13
+ homeDir: string
14
+ claudeCommandsPath: string
15
+ claudeConfigPath: string
16
+ templatesDir: string
17
+
15
18
  constructor() {
16
19
  this.homeDir = os.homedir()
17
20
  this.claudeCommandsPath = path.join(this.homeDir, '.claude', 'commands', 'p')
18
21
  this.claudeConfigPath = path.join(this.homeDir, '.claude')
19
- this.templatesDir = path.join(__dirname, '..', '..', 'templates', 'commands')
22
+ this.templatesDir = path.join(__dirname, '..', '..', '..', 'templates', 'commands')
20
23
  }
21
24
 
22
25
  /**
23
26
  * Detect if Claude is installed
24
- * @returns {Promise<boolean>} True if Claude directory exists
25
27
  */
26
- async detectClaude() {
28
+ async detectClaude(): Promise<boolean> {
27
29
  try {
28
30
  await fs.access(this.claudeConfigPath)
29
31
  return true
@@ -34,13 +36,12 @@ class CommandInstaller {
34
36
 
35
37
  /**
36
38
  * Get list of command files to install
37
- * @returns {Promise<string[]>} Array of command filenames
38
39
  */
39
- async getCommandFiles() {
40
+ async getCommandFiles(): Promise<string[]> {
40
41
  try {
41
42
  const files = await fs.readdir(this.templatesDir)
42
43
  return files.filter((f) => f.endsWith('.md'))
43
- } catch (error) {
44
+ } catch {
44
45
  // Fallback to core commands if template directory not accessible
45
46
  return [
46
47
  'init.md',
@@ -68,9 +69,8 @@ class CommandInstaller {
68
69
 
69
70
  /**
70
71
  * Install commands to Claude
71
- * @returns {Promise<Object>} Installation results
72
72
  */
73
- async installCommands() {
73
+ async installCommands(): Promise<InstallResult> {
74
74
  const claudeDetected = await this.detectClaude()
75
75
 
76
76
  if (!claudeDetected) {
@@ -85,8 +85,8 @@ class CommandInstaller {
85
85
  await fs.mkdir(this.claudeCommandsPath, { recursive: true })
86
86
 
87
87
  const commandFiles = await this.getCommandFiles()
88
- const installed = []
89
- const errors = []
88
+ const installed: string[] = []
89
+ const errors: Array<{ file: string; error: string }> = []
90
90
 
91
91
  for (const file of commandFiles) {
92
92
  try {
@@ -98,7 +98,7 @@ class CommandInstaller {
98
98
 
99
99
  installed.push(file.replace('.md', ''))
100
100
  } catch (error) {
101
- errors.push({ file, error: error.message })
101
+ errors.push({ file, error: (error as Error).message })
102
102
  }
103
103
  }
104
104
 
@@ -111,20 +111,19 @@ class CommandInstaller {
111
111
  } catch (error) {
112
112
  return {
113
113
  success: false,
114
- error: error.message,
114
+ error: (error as Error).message,
115
115
  }
116
116
  }
117
117
  }
118
118
 
119
119
  /**
120
120
  * Uninstall commands from Claude
121
- * @returns {Promise<Object>} Uninstallation results
122
121
  */
123
- async uninstallCommands() {
122
+ async uninstallCommands(): Promise<UninstallResult> {
124
123
  try {
125
124
  const commandFiles = await this.getCommandFiles()
126
- const uninstalled = []
127
- const errors = []
125
+ const uninstalled: string[] = []
126
+ const errors: Array<{ file: string; error: string }> = []
128
127
 
129
128
  for (const file of commandFiles) {
130
129
  try {
@@ -132,8 +131,8 @@ class CommandInstaller {
132
131
  await fs.unlink(filePath)
133
132
  uninstalled.push(file.replace('.md', ''))
134
133
  } catch (error) {
135
- if (error.code !== 'ENOENT') {
136
- errors.push({ file, error: error.message })
134
+ if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {
135
+ errors.push({ file, error: (error as Error).message })
137
136
  }
138
137
  }
139
138
  }
@@ -153,16 +152,15 @@ class CommandInstaller {
153
152
  } catch (error) {
154
153
  return {
155
154
  success: false,
156
- error: error.message,
155
+ error: (error as Error).message,
157
156
  }
158
157
  }
159
158
  }
160
159
 
161
160
  /**
162
161
  * Check if commands are already installed
163
- * @returns {Promise<Object>} Installation status
164
162
  */
165
- async checkInstallation() {
163
+ async checkInstallation(): Promise<CheckResult> {
166
164
  const claudeDetected = await this.detectClaude()
167
165
 
168
166
  if (!claudeDetected) {
@@ -196,13 +194,12 @@ class CommandInstaller {
196
194
 
197
195
  /**
198
196
  * Update commands (reinstall with latest templates)
199
- * @returns {Promise<Object>} Update results
200
197
  */
201
- async updateCommands() {
198
+ async updateCommands(): Promise<InstallResult> {
202
199
  // Simply reinstall - will overwrite with latest templates
203
200
  console.log('🔄 Updating commands with latest templates...')
204
201
  const result = await this.installCommands()
205
- if (result.success) {
202
+ if (result.success && result.installed) {
206
203
  console.log(`✅ Updated ${result.installed.length} commands`)
207
204
  }
208
205
  return result
@@ -210,26 +207,22 @@ class CommandInstaller {
210
207
 
211
208
  /**
212
209
  * Install to all detected editors (alias for installCommands)
213
- * @returns {Promise<Object>} Installation results
214
210
  */
215
- async installToAll() {
211
+ async installToAll(): Promise<InstallResult> {
216
212
  return await this.installCommands()
217
213
  }
218
214
 
219
215
  /**
220
216
  * Get installation path for Claude commands
221
- * @returns {string} Path to Claude commands directory
222
217
  */
223
- getInstallPath() {
218
+ getInstallPath(): string {
224
219
  return this.claudeCommandsPath
225
220
  }
226
221
 
227
222
  /**
228
223
  * Verify command template exists
229
- * @param {string} commandName - Command name (without .md extension)
230
- * @returns {Promise<boolean>} True if template exists
231
224
  */
232
- async verifyTemplate(commandName) {
225
+ async verifyTemplate(commandName: string): Promise<boolean> {
233
226
  try {
234
227
  const templatePath = path.join(this.templatesDir, `${commandName}.md`)
235
228
  await fs.access(templatePath)
@@ -241,9 +234,8 @@ class CommandInstaller {
241
234
 
242
235
  /**
243
236
  * Sync commands - intelligent update that detects and removes orphans
244
- * @returns {Promise<Object>} Sync results with added, updated, removed counts
245
237
  */
246
- async syncCommands() {
238
+ async syncCommands(): Promise<SyncResult> {
247
239
  const claudeDetected = await this.detectClaude()
248
240
 
249
241
  if (!claudeDetected) {
@@ -262,7 +254,7 @@ class CommandInstaller {
262
254
 
263
255
  // Get current state
264
256
  const templateFiles = await this.getCommandFiles()
265
- let installedFiles = []
257
+ let installedFiles: string[] = []
266
258
 
267
259
  try {
268
260
  installedFiles = await fs.readdir(this.claudeCommandsPath)
@@ -272,7 +264,7 @@ class CommandInstaller {
272
264
  installedFiles = []
273
265
  }
274
266
 
275
- const results = {
267
+ const results: SyncResult = {
276
268
  success: true,
277
269
  added: 0,
278
270
  updated: 0,
@@ -299,7 +291,7 @@ class CommandInstaller {
299
291
  results.updated++
300
292
  }
301
293
  } catch (error) {
302
- results.errors.push({ file, error: error.message })
294
+ results.errors!.push({ file, error: (error as Error).message })
303
295
  }
304
296
  }
305
297
 
@@ -311,7 +303,7 @@ class CommandInstaller {
311
303
  } catch (error) {
312
304
  return {
313
305
  success: false,
314
- error: error.message,
306
+ error: (error as Error).message,
315
307
  added: 0,
316
308
  updated: 0,
317
309
  removed: 0,
@@ -321,101 +313,8 @@ class CommandInstaller {
321
313
 
322
314
  /**
323
315
  * Install or update global CLAUDE.md configuration
324
- * @returns {Promise<Object>} Result with success status and action taken
325
316
  */
326
- async installGlobalConfig() {
327
- const claudeDetected = await this.detectClaude()
328
-
329
- if (!claudeDetected) {
330
- return {
331
- success: false,
332
- error: 'Claude not detected',
333
- action: 'skipped',
334
- }
335
- }
336
-
337
- try {
338
- // Ensure ~/.claude directory exists
339
- const claudeDir = path.join(require('os').homedir(), '.claude')
340
- await fs.mkdir(claudeDir, { recursive: true })
341
-
342
- const globalConfigPath = path.join(claudeDir, 'CLAUDE.md')
343
- const templatePath = path.join(__dirname, '../../templates/global/CLAUDE.md')
344
-
345
- // Read template content
346
- const templateContent = await fs.readFile(templatePath, 'utf-8')
347
-
348
- // Check if global config already exists
349
- let existingContent = ''
350
- let fileExists = false
351
-
352
- try {
353
- existingContent = await fs.readFile(globalConfigPath, 'utf-8')
354
- fileExists = true
355
- } catch {
356
- // File doesn't exist, will create new
357
- fileExists = false
358
- }
359
-
360
- if (!fileExists) {
361
- // Create new file with full template
362
- await fs.writeFile(globalConfigPath, templateContent, 'utf-8')
363
- return {
364
- success: true,
365
- action: 'created',
366
- path: globalConfigPath,
367
- }
368
- } else {
369
- // File exists - perform intelligent merge
370
- const startMarker = '<!-- prjct:start - DO NOT REMOVE THIS MARKER -->'
371
- const endMarker = '<!-- prjct:end - DO NOT REMOVE THIS MARKER -->'
372
-
373
- // Check if markers exist in existing file
374
- const hasMarkers =
375
- existingContent.includes(startMarker) && existingContent.includes(endMarker)
376
-
377
- if (!hasMarkers) {
378
- // No markers - append prjct section at the end
379
- const updatedContent = existingContent + '\n\n' + templateContent
380
- await fs.writeFile(globalConfigPath, updatedContent, 'utf-8')
381
- return {
382
- success: true,
383
- action: 'appended',
384
- path: globalConfigPath,
385
- }
386
- } else {
387
- // Markers exist - replace content between markers
388
- const beforeMarker = existingContent.substring(
389
- 0,
390
- existingContent.indexOf(startMarker)
391
- )
392
- const afterMarker = existingContent.substring(
393
- existingContent.indexOf(endMarker) + endMarker.length
394
- )
395
-
396
- // Extract prjct section from template
397
- const prjctSection = templateContent.substring(
398
- templateContent.indexOf(startMarker),
399
- templateContent.indexOf(endMarker) + endMarker.length
400
- )
401
-
402
- const updatedContent = beforeMarker + prjctSection + afterMarker
403
- await fs.writeFile(globalConfigPath, updatedContent, 'utf-8')
404
- return {
405
- success: true,
406
- action: 'updated',
407
- path: globalConfigPath,
408
- }
409
- }
410
- }
411
- } catch (error) {
412
- return {
413
- success: false,
414
- error: error.message,
415
- action: 'failed',
416
- }
417
- }
317
+ async installGlobalConfig(): Promise<GlobalConfigResult> {
318
+ return installGlobalConfig(this.claudeConfigPath, () => this.detectClaude())
418
319
  }
419
320
  }
420
-
421
- module.exports = new CommandInstaller()
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Global Config Operations
3
+ * Install/update global CLAUDE.md configuration
4
+ */
5
+
6
+ import fs from 'fs/promises'
7
+ import path from 'path'
8
+ import os from 'os'
9
+ import type { GlobalConfigResult } from './types'
10
+
11
+ /**
12
+ * Install or update global CLAUDE.md configuration
13
+ */
14
+ export async function installGlobalConfig(
15
+ claudeConfigPath: string,
16
+ detectClaude: () => Promise<boolean>
17
+ ): Promise<GlobalConfigResult> {
18
+ const claudeDetected = await detectClaude()
19
+
20
+ if (!claudeDetected) {
21
+ return {
22
+ success: false,
23
+ error: 'Claude not detected',
24
+ action: 'skipped',
25
+ }
26
+ }
27
+
28
+ try {
29
+ // Ensure ~/.claude directory exists
30
+ const claudeDir = path.join(os.homedir(), '.claude')
31
+ await fs.mkdir(claudeDir, { recursive: true })
32
+
33
+ const globalConfigPath = path.join(claudeDir, 'CLAUDE.md')
34
+ const templatePath = path.join(__dirname, '../../../templates/global/CLAUDE.md')
35
+
36
+ // Read template content
37
+ const templateContent = await fs.readFile(templatePath, 'utf-8')
38
+
39
+ // Check if global config already exists
40
+ let existingContent = ''
41
+ let fileExists = false
42
+
43
+ try {
44
+ existingContent = await fs.readFile(globalConfigPath, 'utf-8')
45
+ fileExists = true
46
+ } catch {
47
+ // File doesn't exist, will create new
48
+ fileExists = false
49
+ }
50
+
51
+ if (!fileExists) {
52
+ // Create new file with full template
53
+ await fs.writeFile(globalConfigPath, templateContent, 'utf-8')
54
+ return {
55
+ success: true,
56
+ action: 'created',
57
+ path: globalConfigPath,
58
+ }
59
+ } else {
60
+ // File exists - perform intelligent merge
61
+ const startMarker = '<!-- prjct:start - DO NOT REMOVE THIS MARKER -->'
62
+ const endMarker = '<!-- prjct:end - DO NOT REMOVE THIS MARKER -->'
63
+
64
+ // Check if markers exist in existing file
65
+ const hasMarkers =
66
+ existingContent.includes(startMarker) && existingContent.includes(endMarker)
67
+
68
+ if (!hasMarkers) {
69
+ // No markers - append prjct section at the end
70
+ const updatedContent = existingContent + '\n\n' + templateContent
71
+ await fs.writeFile(globalConfigPath, updatedContent, 'utf-8')
72
+ return {
73
+ success: true,
74
+ action: 'appended',
75
+ path: globalConfigPath,
76
+ }
77
+ } else {
78
+ // Markers exist - replace content between markers
79
+ const beforeMarker = existingContent.substring(0, existingContent.indexOf(startMarker))
80
+ const afterMarker = existingContent.substring(
81
+ existingContent.indexOf(endMarker) + endMarker.length
82
+ )
83
+
84
+ // Extract prjct section from template
85
+ const prjctSection = templateContent.substring(
86
+ templateContent.indexOf(startMarker),
87
+ templateContent.indexOf(endMarker) + endMarker.length
88
+ )
89
+
90
+ const updatedContent = beforeMarker + prjctSection + afterMarker
91
+ await fs.writeFile(globalConfigPath, updatedContent, 'utf-8')
92
+ return {
93
+ success: true,
94
+ action: 'updated',
95
+ path: globalConfigPath,
96
+ }
97
+ }
98
+ }
99
+ } catch (error) {
100
+ return {
101
+ success: false,
102
+ error: (error as Error).message,
103
+ action: 'failed',
104
+ }
105
+ }
106
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * CommandInstaller - Installs prjct commands to Claude (Code + Desktop)
3
+ *
4
+ * 100% Claude-focused architecture
5
+ * Handles installation and synchronization of /p:* commands
6
+ * to Claude's native slash command system
7
+ *
8
+ * @version 0.5.0
9
+ */
10
+
11
+ export type {
12
+ InstallResult,
13
+ UninstallResult,
14
+ CheckResult,
15
+ SyncResult,
16
+ GlobalConfigResult,
17
+ } from './types'
18
+
19
+ export { installGlobalConfig } from './global-config'
20
+ export { CommandInstaller } from './command-installer'
21
+
22
+ import { CommandInstaller } from './command-installer'
23
+
24
+ const commandInstaller = new CommandInstaller()
25
+ export default commandInstaller
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Command Installer Types
3
+ */
4
+
5
+ export interface InstallResult {
6
+ success: boolean
7
+ installed?: string[]
8
+ errors?: Array<{ file: string; error: string }>
9
+ path?: string
10
+ error?: string
11
+ }
12
+
13
+ export interface UninstallResult {
14
+ success: boolean
15
+ uninstalled?: string[]
16
+ errors?: Array<{ file: string; error: string }>
17
+ error?: string
18
+ }
19
+
20
+ export interface CheckResult {
21
+ installed: boolean
22
+ claudeDetected: boolean
23
+ commands?: string[]
24
+ path?: string
25
+ }
26
+
27
+ export interface SyncResult {
28
+ success: boolean
29
+ added: number
30
+ updated: number
31
+ removed: number
32
+ errors?: Array<{ file: string; error: string }>
33
+ error?: string
34
+ }
35
+
36
+ export interface GlobalConfigResult {
37
+ success: boolean
38
+ action: string
39
+ path?: string
40
+ error?: string
41
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * CommandInstaller
3
+ * Re-exports from command-installer/index.ts for backwards compatibility.
4
+ */
5
+
6
+ import commandInstaller from './command-installer/index'
7
+ export * from './command-installer/index'
8
+ export default commandInstaller