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
@@ -1,421 +0,0 @@
1
- /**
2
- * Command Executor
3
- * 100% AGENTIC - Claude decides agent assignment via Task tool
4
- *
5
- * NO if/else logic for agent selection here.
6
- * Claude reads templates/agentic/agent-routing.md and delegates via Task tool.
7
- *
8
- * JS only:
9
- * - Loads templates
10
- * - Builds context
11
- * - Returns prompt for Claude
12
- *
13
- * Claude:
14
- * - Reads agent-routing.md
15
- * - Decides best agent for task
16
- * - Delegates via Task(subagent_type='general-purpose', prompt='Read: path/to/agent.md...')
17
- *
18
- * Source: Claude Code, Devin, Augment Code patterns
19
- */
20
-
21
- const fs = require('fs')
22
- const path = require('path')
23
- const os = require('os')
24
- const templateLoader = require('./template-loader')
25
- const contextBuilder = require('./context-builder')
26
- const promptBuilder = require('./prompt-builder')
27
- const toolRegistry = require('./tool-registry')
28
- // REMOVED: MandatoryAgentRouter, ContextFilter, ContextEstimator
29
- // Agent assignment is 100% agentic - Claude decides via templates
30
- const { validate, formatError } = require('./validation-rules')
31
- const loopDetector = require('./loop-detector')
32
- const chainOfThought = require('./chain-of-thought')
33
- const semanticCompression = require('./semantic-compression')
34
- const responseTemplates = require('./response-templates')
35
- const memorySystem = require('./memory-system')
36
- const groundTruth = require('./ground-truth')
37
- const thinkBlocks = require('./think-blocks')
38
- const parallelTools = require('./parallel-tools')
39
- const planMode = require('./plan-mode')
40
-
41
- // Running file for status line integration
42
- const RUNNING_FILE = path.join(os.homedir(), '.prjct-cli', '.running')
43
- // P3.5, P3.6, P3.7: DELEGATED TO CLAUDE CODE
44
- // - semantic-search → Claude Code has Grep/Glob with semantic understanding
45
- // - code-intelligence → Claude Code has native LSP integration
46
- // - browser-preview → Claude Code can use Bash directly
47
-
48
- class CommandExecutor {
49
- constructor() {
50
- // 100% AGENTIC: No agent router here
51
- // Claude decides agent assignment via templates and Task tool
52
- }
53
-
54
- /**
55
- * Signal that a command is running (for status line)
56
- */
57
- signalStart(commandName) {
58
- try {
59
- const dir = path.dirname(RUNNING_FILE)
60
- if (!fs.existsSync(dir)) {
61
- fs.mkdirSync(dir, { recursive: true })
62
- }
63
- fs.writeFileSync(RUNNING_FILE, `/p:${commandName}`)
64
- } catch {
65
- // Silently ignore - status line is optional
66
- }
67
- }
68
-
69
- /**
70
- * Signal that command has finished (for status line)
71
- */
72
- signalEnd() {
73
- try {
74
- if (fs.existsSync(RUNNING_FILE)) {
75
- fs.unlinkSync(RUNNING_FILE)
76
- }
77
- } catch {
78
- // Silently ignore - status line is optional
79
- }
80
- }
81
-
82
- /**
83
- * Execute command with MANDATORY agent assignment
84
- */
85
- async execute(commandName, params, projectPath) {
86
- // Signal start for status line
87
- this.signalStart(commandName)
88
-
89
- // Context for loop detection
90
- const loopContext = params.task || params.description || ''
91
-
92
- // Check if we're in a loop BEFORE attempting
93
- if (loopDetector.shouldEscalate(commandName, loopContext)) {
94
- const escalation = loopDetector.getEscalationInfo(commandName, loopContext)
95
- this.signalEnd()
96
- return {
97
- success: false,
98
- error: escalation.message,
99
- escalation,
100
- isLoopDetected: true,
101
- suggestion: escalation.suggestion
102
- }
103
- }
104
-
105
- try {
106
- // 1. Load template
107
- const template = await templateLoader.load(commandName)
108
-
109
- // 2. Build METADATA context only (lazy loading - no file reads yet)
110
- const metadataContext = await contextBuilder.build(projectPath, params)
111
-
112
- // 2.5. VALIDATE: Pre-flight checks with specific errors
113
- const validation = await validate(commandName, metadataContext)
114
- if (!validation.valid) {
115
- this.signalEnd()
116
- return {
117
- success: false,
118
- error: formatError(validation),
119
- validation,
120
- isValidationError: true
121
- }
122
- }
123
-
124
- // 2.55. P3.4 PLAN MODE: Check if command requires planning
125
- const requiresPlanning = planMode.requiresPlanning(commandName)
126
- const isDestructive = planMode.isDestructive(commandName)
127
- const isInPlanningMode = planMode.isInPlanningMode(metadataContext.projectId)
128
-
129
- // Start planning mode if required and not already in it
130
- let activePlan = null
131
- if (requiresPlanning && !isInPlanningMode && !params.skipPlanning) {
132
- activePlan = planMode.startPlanning(metadataContext.projectId, commandName, params)
133
- } else if (isInPlanningMode) {
134
- activePlan = planMode.getActivePlan(metadataContext.projectId)
135
- }
136
-
137
- // 2.6. GROUND TRUTH: Verify actual state before critical operations
138
- let groundTruthResult = null
139
- if (groundTruth.requiresVerification(commandName)) {
140
- const preState = await contextBuilder.loadStateForCommand(metadataContext, commandName)
141
- groundTruthResult = await groundTruth.verify(commandName, metadataContext, preState)
142
-
143
- // Log warnings but don't block (user can override)
144
- if (!groundTruthResult.verified && groundTruthResult.warnings.length > 0) {
145
- console.log(groundTruth.formatWarnings(groundTruthResult))
146
- }
147
- }
148
-
149
- // 2.7. THINK BLOCKS (P3.1): Dynamic reasoning based on triggers
150
- // ANTI-HALLUCINATION FIX: Load state BEFORE using it (was undefined)
151
- let thinkBlock = null
152
- const preThinkState = groundTruthResult?.actual || await contextBuilder.loadStateForCommand(metadataContext, commandName)
153
- const thinkTrigger = thinkBlocks.detectTrigger(commandName, metadataContext, preThinkState)
154
- if (thinkTrigger) {
155
- thinkBlock = await thinkBlocks.generate(thinkTrigger, commandName, metadataContext, preThinkState)
156
-
157
- // Log think block if in debug mode
158
- if (process.env.PRJCT_DEBUG === 'true') {
159
- console.log(thinkBlocks.format(thinkBlock, true))
160
- }
161
- }
162
-
163
- // 2.8. CHAIN OF THOUGHT: Reasoning for critical commands
164
- let reasoning = null
165
- if (chainOfThought.requiresReasoning(commandName)) {
166
- // Load state for reasoning
167
- const reasoningState = await contextBuilder.loadStateForCommand(metadataContext, commandName)
168
- reasoning = await chainOfThought.reason(commandName, metadataContext, reasoningState)
169
-
170
- // If reasoning shows critical issues, warn but continue
171
- if (reasoning.reasoning && !reasoning.reasoning.allPassed) {
172
- console.log('⚠️ Chain of Thought detected issues:')
173
- console.log(chainOfThought.formatPlan(reasoning))
174
- }
175
- }
176
-
177
- // 3. AGENTIC: Claude decides agent assignment via templates
178
- // NO if/else logic here - templates instruct Claude to use Task tool
179
- // See templates/agentic/agent-routing.md for routing rules
180
- let context = metadataContext
181
-
182
- // Provide agent info to context so Claude can delegate
183
- context = {
184
- ...context,
185
- agentsPath: path.join(os.homedir(), '.prjct-cli', 'projects', metadataContext.projectId || '', 'agents'),
186
- agentRoutingPath: path.join(__dirname, '..', '..', 'templates', 'agentic', 'agent-routing.md'),
187
- // Flag: Claude must delegate to subagent via Task tool
188
- agenticDelegation: true
189
- }
190
-
191
- // 6. Load state with filtered context
192
- const rawState = await contextBuilder.loadState(context)
193
-
194
- // 6.5. SEMANTIC COMPRESSION: Compress state for reduced token usage
195
- const compressedState = {}
196
- for (const [key, content] of Object.entries(rawState)) {
197
- if (content) {
198
- const compressed = semanticCompression.compress(content, key)
199
- compressedState[key] = {
200
- raw: content,
201
- summary: compressed.summary,
202
- compressed
203
- }
204
- } else {
205
- compressedState[key] = { raw: null, summary: 'Empty', compressed: null }
206
- }
207
- }
208
-
209
- // Use compressed summaries for prompt, keep raw for tool execution
210
- const state = {
211
- ...rawState,
212
- _compressed: compressedState,
213
- _compressionMetrics: semanticCompression.getMetrics()
214
- }
215
-
216
- // 7. MEMORY: Load learned patterns AND relevant memories for this command
217
- let learnedPatterns = null
218
- let relevantMemories = null
219
- if (context.projectId) {
220
- learnedPatterns = {
221
- commit_footer: await memorySystem.getSmartDecision(context.projectId, 'commit_footer'),
222
- branch_naming: await memorySystem.getSmartDecision(context.projectId, 'branch_naming'),
223
- test_before_ship: await memorySystem.getSmartDecision(context.projectId, 'test_before_ship'),
224
- preferred_agent: await memorySystem.getSmartDecision(context.projectId, `preferred_agent_${commandName}`)
225
- }
226
-
227
- // P3.3: Get relevant memories for context
228
- relevantMemories = await memorySystem.getRelevantMemories(
229
- context.projectId,
230
- { commandName, params },
231
- 5 // Top 5 relevant memories
232
- )
233
- }
234
-
235
- // 9. Build prompt - NO agent assignment here, Claude decides via templates
236
- const planInfo = {
237
- isPlanning: requiresPlanning || isInPlanningMode,
238
- requiresApproval: isDestructive && !params.approved,
239
- active: activePlan,
240
- allowedTools: planMode.getAllowedTools(
241
- isInPlanningMode,
242
- template.frontmatter['allowed-tools'] || []
243
- )
244
- }
245
- // Agent is null - Claude assigns via Task tool using agent-routing.md
246
- const prompt = promptBuilder.build(template, context, state, null, learnedPatterns, thinkBlock, relevantMemories, planInfo)
247
-
248
- // Log agentic mode
249
- console.log(`🤖 Agentic delegation enabled - Claude will assign agent via Task tool`)
250
-
251
- // Record successful attempt
252
- loopDetector.recordSuccess(commandName, loopContext)
253
-
254
- // Signal end for status line
255
- this.signalEnd()
256
-
257
- return {
258
- success: true,
259
- template,
260
- context,
261
- state,
262
- prompt,
263
- // AGENTIC: No pre-assigned agent - Claude delegates via Task tool
264
- agenticDelegation: true,
265
- agentsPath: context.agentsPath,
266
- agentRoutingPath: context.agentRoutingPath,
267
- reasoning, // Chain of thought results
268
- thinkBlock, // Think blocks (P3.1)
269
- groundTruth: groundTruthResult, // Ground truth verification (P1.3)
270
- compressionMetrics: state._compressionMetrics,
271
- learnedPatterns, // Memory system patterns
272
- relevantMemories, // P3.3: Semantic memories
273
- // Response formatter helper
274
- formatResponse: (data) => responseTemplates.format(commandName, data),
275
- // Think block formatter helper
276
- formatThinkBlock: (verbose) => thinkBlocks.format(thinkBlock, verbose),
277
- // P3.2: Parallel tools helper
278
- parallel: {
279
- execute: (toolCalls) => parallelTools.execute(toolCalls),
280
- readAll: (paths) => parallelTools.readAll(paths),
281
- canParallelize: (tools) => parallelTools.canParallelize(tools),
282
- getMetrics: () => parallelTools.getMetrics()
283
- },
284
- // P3.3: Memory system helpers
285
- memory: {
286
- create: (memory) => memorySystem.createMemory(context.projectId, memory),
287
- autoRemember: (type, value, ctx) => memorySystem.autoRemember(context.projectId, type, value, ctx),
288
- search: (query) => memorySystem.searchMemories(context.projectId, query),
289
- findByTags: (tags) => memorySystem.findByTags(context.projectId, tags),
290
- getStats: () => memorySystem.getMemoryStats(context.projectId)
291
- },
292
- // P3.4: Plan Mode helpers
293
- plan: {
294
- active: activePlan,
295
- isPlanning: requiresPlanning || isInPlanningMode,
296
- isDestructive,
297
- requiresApproval: isDestructive && !params.approved,
298
- // Planning phase methods
299
- recordInfo: (info) => planMode.recordGatheredInfo(context.projectId, info),
300
- setAnalysis: (analysis) => planMode.setAnalysis(context.projectId, analysis),
301
- propose: (plan) => planMode.proposePlan(context.projectId, plan),
302
- // Approval methods
303
- approve: (feedback) => planMode.approvePlan(context.projectId, feedback),
304
- reject: (reason) => planMode.rejectPlan(context.projectId, reason),
305
- getApprovalPrompt: () => planMode.generateApprovalPrompt(commandName, context),
306
- // Execution methods
307
- startExecution: () => planMode.startExecution(context.projectId),
308
- getNextStep: () => planMode.getNextStep(context.projectId),
309
- completeStep: (result) => planMode.completeStep(context.projectId, result),
310
- failStep: (error) => planMode.failStep(context.projectId, error),
311
- abort: (reason) => planMode.abortPlan(context.projectId, reason),
312
- // Status
313
- getStatus: () => planMode.formatStatus(context.projectId),
314
- getAllowedTools: () => planMode.getAllowedTools(
315
- isInPlanningMode,
316
- template.frontmatter['allowed-tools'] || []
317
- )
318
- }
319
- // P3.5, P3.6: DELEGATED TO CLAUDE CODE
320
- // Use Claude Code's native tools instead:
321
- // - Grep for semantic search
322
- // - Glob for file patterns
323
- // - Native LSP for code intelligence
324
- }
325
- } catch (error) {
326
- // Signal end for status line
327
- this.signalEnd()
328
-
329
- // Record failed attempt for loop detection
330
- const attemptInfo = loopDetector.recordAttempt(commandName, loopContext, {
331
- success: false,
332
- error: error.message
333
- })
334
-
335
- // Check if we should escalate after this failure
336
- if (attemptInfo.shouldEscalate) {
337
- const escalation = loopDetector.getEscalationInfo(commandName, loopContext)
338
- return {
339
- success: false,
340
- error: escalation.message,
341
- escalation,
342
- isLoopDetected: true,
343
- suggestion: escalation.suggestion
344
- }
345
- }
346
-
347
- return {
348
- success: false,
349
- error: error.message,
350
- attemptNumber: attemptInfo.attemptNumber,
351
- isLooping: attemptInfo.isLooping
352
- }
353
- }
354
- }
355
-
356
- // REMOVED: isTaskCommand() and shouldUseAgent()
357
- // Agent assignment is now 100% agentic - Claude decides via templates
358
- // See templates/agentic/agent-routing.md
359
-
360
- /**
361
- * Execute tool with permission check
362
- * @param {string} toolName - Tool name
363
- * @param {Array} args - Tool arguments
364
- * @param {string[]} allowedTools - Allowed tools for this command
365
- * @returns {Promise<any>}
366
- */
367
- async executeTool(toolName, args, allowedTools) {
368
- // Check if tool is allowed
369
- if (!toolRegistry.isAllowed(toolName, allowedTools)) {
370
- throw new Error(`Tool ${toolName} not allowed for this command`)
371
- }
372
-
373
- // Get tool function
374
- const tool = toolRegistry.get(toolName)
375
-
376
- // Execute tool
377
- return await tool(...args)
378
- }
379
-
380
- /**
381
- * Simple execution for direct tool access
382
- * Used by legacy commands during migration
383
- * @param {string} commandName - Command name
384
- * @param {Function} executionFn - Function that uses tools
385
- * @param {string} projectPath - Project path
386
- * @returns {Promise<Object>}
387
- */
388
- async executeSimple(commandName, executionFn, projectPath) {
389
- try {
390
- // Load template to get allowed tools
391
- const template = await templateLoader.load(commandName)
392
- const allowedTools = template.frontmatter['allowed-tools'] || []
393
-
394
- // Build context
395
- const context = await contextBuilder.build(projectPath)
396
-
397
- // Create tools proxy that checks permissions
398
- const tools = {
399
- read: async (filePath) => this.executeTool('Read', [filePath], allowedTools),
400
- write: async (filePath, content) =>
401
- this.executeTool('Write', [filePath, content], allowedTools),
402
- bash: async (command) => this.executeTool('Bash', [command], allowedTools),
403
- }
404
-
405
- // Execute user function with tools
406
- const result = await executionFn(tools, context)
407
-
408
- return {
409
- success: true,
410
- result,
411
- }
412
- } catch (error) {
413
- return {
414
- success: false,
415
- error: error.message,
416
- }
417
- }
418
- }
419
- }
420
-
421
- module.exports = new CommandExecutor()