prjct-cli 0.11.5 → 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 (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 +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/{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 +598 -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 +36 -6
  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,572 +0,0 @@
1
- /**
2
- * Plan Mode System
3
- *
4
- * P3.4: Plan Mode + Approval Flow
5
- * Separates planning from execution for better user confidence.
6
- *
7
- * Pattern from: Devin AI, Windsurf, Kiro
8
- *
9
- * ```
10
- * // Planning Mode:
11
- * // 1. Gather information (read-only tools)
12
- * // 2. Analyze and understand codebase
13
- * // 3. Ask clarifying questions
14
- * // 4. Generate plan with <suggest_plan/>
15
- * // 5. Wait for user approval
16
- *
17
- * // Execution Mode:
18
- * // 1. Execute approved plan
19
- * // 2. Show progress
20
- * // 3. User can pause/abort
21
- * ```
22
- */
23
-
24
- /**
25
- * Commands that require planning mode
26
- */
27
- const PLAN_REQUIRED_COMMANDS = [
28
- 'feature', // New features need planning
29
- 'spec', // Specs are planning by definition
30
- 'design', // Architecture needs planning
31
- 'refactor', // Refactoring needs impact analysis
32
- 'migrate' // Migrations are high-risk
33
- ]
34
-
35
- /**
36
- * Commands that are destructive and need approval
37
- */
38
- const DESTRUCTIVE_COMMANDS = [
39
- 'ship', // Commits and pushes
40
- 'cleanup', // Deletes files/code
41
- 'git', // Git operations
42
- 'migrate' // Database/schema changes
43
- ]
44
-
45
- /**
46
- * Read-only tools allowed in planning mode
47
- */
48
- const PLANNING_TOOLS = [
49
- 'Read',
50
- 'Glob',
51
- 'Grep',
52
- 'GetTimestamp',
53
- 'GetDate',
54
- 'GetDateTime'
55
- ]
56
-
57
- /**
58
- * Plan status enum
59
- */
60
- const PLAN_STATUS = {
61
- GATHERING: 'gathering', // Collecting information
62
- ANALYZING: 'analyzing', // Understanding context
63
- PROPOSING: 'proposing', // Generating plan
64
- PENDING_APPROVAL: 'pending', // Waiting for user
65
- APPROVED: 'approved', // User approved
66
- REJECTED: 'rejected', // User rejected
67
- EXECUTING: 'executing', // Running the plan
68
- COMPLETED: 'completed', // Done
69
- ABORTED: 'aborted' // User stopped mid-execution
70
- }
71
-
72
- class PlanMode {
73
- constructor() {
74
- this.activePlans = new Map() // projectId -> plan state
75
- }
76
-
77
- /**
78
- * Check if command requires planning mode
79
- * @param {string} commandName
80
- * @returns {boolean}
81
- */
82
- requiresPlanning(commandName) {
83
- return PLAN_REQUIRED_COMMANDS.includes(commandName)
84
- }
85
-
86
- /**
87
- * Check if command is destructive and needs approval
88
- * @param {string} commandName
89
- * @returns {boolean}
90
- */
91
- isDestructive(commandName) {
92
- return DESTRUCTIVE_COMMANDS.includes(commandName)
93
- }
94
-
95
- /**
96
- * Check if tool is allowed in planning mode
97
- * @param {string} toolName
98
- * @returns {boolean}
99
- */
100
- isToolAllowedInPlanning(toolName) {
101
- return PLANNING_TOOLS.includes(toolName)
102
- }
103
-
104
- /**
105
- * Get allowed tools for current mode
106
- * @param {boolean} inPlanningMode
107
- * @param {string[]} templateTools - Tools from template
108
- * @returns {string[]}
109
- */
110
- getAllowedTools(inPlanningMode, templateTools) {
111
- if (!inPlanningMode) {
112
- return templateTools
113
- }
114
- // In planning mode, only allow read-only tools
115
- return templateTools.filter(tool => PLANNING_TOOLS.includes(tool))
116
- }
117
-
118
- /**
119
- * Start planning mode for a command
120
- * @param {string} projectId
121
- * @param {string} commandName
122
- * @param {Object} params
123
- * @returns {Object} Plan state
124
- */
125
- startPlanning(projectId, commandName, params) {
126
- const plan = {
127
- id: `plan_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
128
- projectId,
129
- command: commandName,
130
- params,
131
- status: PLAN_STATUS.GATHERING,
132
- startedAt: new Date().toISOString(),
133
- gatheredInfo: [],
134
- analysis: null,
135
- proposedPlan: null,
136
- userFeedback: null,
137
- approvedAt: null,
138
- executionStartedAt: null,
139
- completedAt: null,
140
- steps: [],
141
- currentStep: 0
142
- }
143
-
144
- this.activePlans.set(projectId, plan)
145
- return plan
146
- }
147
-
148
- /**
149
- * Get active plan for project
150
- * @param {string} projectId
151
- * @returns {Object|null}
152
- */
153
- getActivePlan(projectId) {
154
- return this.activePlans.get(projectId) || null
155
- }
156
-
157
- /**
158
- * Check if project is in planning mode
159
- * @param {string} projectId
160
- * @returns {boolean}
161
- */
162
- isInPlanningMode(projectId) {
163
- const plan = this.getActivePlan(projectId)
164
- if (!plan) return false
165
- return [
166
- PLAN_STATUS.GATHERING,
167
- PLAN_STATUS.ANALYZING,
168
- PLAN_STATUS.PROPOSING,
169
- PLAN_STATUS.PENDING_APPROVAL
170
- ].includes(plan.status)
171
- }
172
-
173
- /**
174
- * Record gathered information
175
- * @param {string} projectId
176
- * @param {Object} info - { type, source, data }
177
- */
178
- recordGatheredInfo(projectId, info) {
179
- const plan = this.getActivePlan(projectId)
180
- if (!plan) return
181
-
182
- plan.gatheredInfo.push({
183
- ...info,
184
- gatheredAt: new Date().toISOString()
185
- })
186
- }
187
-
188
- /**
189
- * Update plan status
190
- * @param {string} projectId
191
- * @param {string} status
192
- */
193
- updateStatus(projectId, status) {
194
- const plan = this.getActivePlan(projectId)
195
- if (!plan) return
196
-
197
- plan.status = status
198
-
199
- // Track timestamps for key transitions
200
- if (status === PLAN_STATUS.APPROVED) {
201
- plan.approvedAt = new Date().toISOString()
202
- } else if (status === PLAN_STATUS.EXECUTING) {
203
- plan.executionStartedAt = new Date().toISOString()
204
- } else if (status === PLAN_STATUS.COMPLETED || status === PLAN_STATUS.ABORTED) {
205
- plan.completedAt = new Date().toISOString()
206
- }
207
- }
208
-
209
- /**
210
- * Set analysis results
211
- * @param {string} projectId
212
- * @param {Object} analysis
213
- */
214
- setAnalysis(projectId, analysis) {
215
- const plan = this.getActivePlan(projectId)
216
- if (!plan) return
217
-
218
- plan.analysis = analysis
219
- plan.status = PLAN_STATUS.ANALYZING
220
- }
221
-
222
- /**
223
- * Propose a plan for user approval
224
- * @param {string} projectId
225
- * @param {Object} proposedPlan
226
- * @returns {Object} Formatted plan for display
227
- */
228
- proposePlan(projectId, proposedPlan) {
229
- const plan = this.getActivePlan(projectId)
230
- if (!plan) return null
231
-
232
- plan.proposedPlan = proposedPlan
233
- plan.status = PLAN_STATUS.PENDING_APPROVAL
234
-
235
- return this.formatPlanForApproval(plan)
236
- }
237
-
238
- /**
239
- * Format plan for user approval display
240
- * @param {Object} plan
241
- * @returns {Object}
242
- */
243
- formatPlanForApproval(plan) {
244
- const proposed = plan.proposedPlan
245
-
246
- return {
247
- summary: proposed.summary || `Plan for: ${plan.command}`,
248
- approach: proposed.approach,
249
- steps: proposed.steps || [],
250
- risks: proposed.risks || [],
251
- alternatives: proposed.alternatives || [],
252
- estimatedTime: proposed.estimatedTime,
253
- affectedFiles: proposed.affectedFiles || [],
254
- requiresConfirmation: true,
255
- planId: plan.id
256
- }
257
- }
258
-
259
- /**
260
- * User approves the plan
261
- * @param {string} projectId
262
- * @param {string} feedback - Optional user feedback
263
- * @returns {Object} Approved plan ready for execution
264
- */
265
- approvePlan(projectId, feedback = null) {
266
- const plan = this.getActivePlan(projectId)
267
- if (!plan || plan.status !== PLAN_STATUS.PENDING_APPROVAL) {
268
- return null
269
- }
270
-
271
- plan.userFeedback = feedback
272
- plan.status = PLAN_STATUS.APPROVED
273
- plan.approvedAt = new Date().toISOString()
274
-
275
- // Convert proposed plan to executable steps
276
- plan.steps = (plan.proposedPlan.steps || []).map((step, index) => ({
277
- index,
278
- description: step.description || step,
279
- status: 'pending',
280
- tool: step.tool,
281
- args: step.args
282
- }))
283
-
284
- return {
285
- approved: true,
286
- planId: plan.id,
287
- steps: plan.steps,
288
- message: `Plan approved. ${plan.steps.length} steps to execute.`
289
- }
290
- }
291
-
292
- /**
293
- * User rejects the plan
294
- * @param {string} projectId
295
- * @param {string} reason
296
- * @returns {Object}
297
- */
298
- rejectPlan(projectId, reason = null) {
299
- const plan = this.getActivePlan(projectId)
300
- if (!plan) return null
301
-
302
- plan.status = PLAN_STATUS.REJECTED
303
- plan.userFeedback = reason
304
- plan.completedAt = new Date().toISOString()
305
-
306
- // Clear active plan
307
- this.activePlans.delete(projectId)
308
-
309
- return {
310
- rejected: true,
311
- planId: plan.id,
312
- reason,
313
- message: 'Plan rejected. No changes made.'
314
- }
315
- }
316
-
317
- /**
318
- * Start executing approved plan
319
- * @param {string} projectId
320
- * @returns {Object} First step to execute
321
- */
322
- startExecution(projectId) {
323
- const plan = this.getActivePlan(projectId)
324
- if (!plan || plan.status !== PLAN_STATUS.APPROVED) {
325
- return null
326
- }
327
-
328
- plan.status = PLAN_STATUS.EXECUTING
329
- plan.executionStartedAt = new Date().toISOString()
330
- plan.currentStep = 0
331
-
332
- return this.getNextStep(projectId)
333
- }
334
-
335
- /**
336
- * Get next step to execute
337
- * @param {string} projectId
338
- * @returns {Object|null}
339
- */
340
- getNextStep(projectId) {
341
- const plan = this.getActivePlan(projectId)
342
- if (!plan || plan.status !== PLAN_STATUS.EXECUTING) {
343
- return null
344
- }
345
-
346
- const step = plan.steps[plan.currentStep]
347
- if (!step) {
348
- // All steps complete
349
- this.completePlan(projectId)
350
- return null
351
- }
352
-
353
- return {
354
- stepNumber: plan.currentStep + 1,
355
- totalSteps: plan.steps.length,
356
- step,
357
- progress: Math.round((plan.currentStep / plan.steps.length) * 100)
358
- }
359
- }
360
-
361
- /**
362
- * Mark current step as complete
363
- * @param {string} projectId
364
- * @param {Object} result - Step execution result
365
- * @returns {Object} Next step or completion status
366
- */
367
- completeStep(projectId, result = {}) {
368
- const plan = this.getActivePlan(projectId)
369
- if (!plan || plan.status !== PLAN_STATUS.EXECUTING) {
370
- return null
371
- }
372
-
373
- // Update current step
374
- plan.steps[plan.currentStep].status = 'completed'
375
- plan.steps[plan.currentStep].result = result
376
- plan.steps[plan.currentStep].completedAt = new Date().toISOString()
377
-
378
- // Move to next step
379
- plan.currentStep++
380
-
381
- return this.getNextStep(projectId)
382
- }
383
-
384
- /**
385
- * Mark step as failed
386
- * @param {string} projectId
387
- * @param {string} error
388
- * @returns {Object}
389
- */
390
- failStep(projectId, error) {
391
- const plan = this.getActivePlan(projectId)
392
- if (!plan) return null
393
-
394
- plan.steps[plan.currentStep].status = 'failed'
395
- plan.steps[plan.currentStep].error = error
396
-
397
- return {
398
- failed: true,
399
- step: plan.currentStep + 1,
400
- error,
401
- options: ['retry', 'skip', 'abort']
402
- }
403
- }
404
-
405
- /**
406
- * Complete the plan
407
- * @param {string} projectId
408
- * @returns {Object} Completion summary
409
- */
410
- completePlan(projectId) {
411
- const plan = this.getActivePlan(projectId)
412
- if (!plan) return null
413
-
414
- plan.status = PLAN_STATUS.COMPLETED
415
- plan.completedAt = new Date().toISOString()
416
-
417
- const summary = {
418
- planId: plan.id,
419
- command: plan.command,
420
- totalSteps: plan.steps.length,
421
- completedSteps: plan.steps.filter(s => s.status === 'completed').length,
422
- failedSteps: plan.steps.filter(s => s.status === 'failed').length,
423
- duration: this._calculateDuration(plan.executionStartedAt, plan.completedAt)
424
- }
425
-
426
- // Clear active plan
427
- this.activePlans.delete(projectId)
428
-
429
- return summary
430
- }
431
-
432
- /**
433
- * Abort plan execution
434
- * @param {string} projectId
435
- * @param {string} reason
436
- * @returns {Object}
437
- */
438
- abortPlan(projectId, reason = 'User requested') {
439
- const plan = this.getActivePlan(projectId)
440
- if (!plan) return null
441
-
442
- plan.status = PLAN_STATUS.ABORTED
443
- plan.completedAt = new Date().toISOString()
444
- plan.abortReason = reason
445
-
446
- const summary = {
447
- aborted: true,
448
- planId: plan.id,
449
- reason,
450
- completedSteps: plan.steps.filter(s => s.status === 'completed').length,
451
- totalSteps: plan.steps.length
452
- }
453
-
454
- // Clear active plan
455
- this.activePlans.delete(projectId)
456
-
457
- return summary
458
- }
459
-
460
- /**
461
- * Generate approval prompt for destructive commands
462
- * @param {string} commandName
463
- * @param {Object} context
464
- * @returns {Object}
465
- */
466
- generateApprovalPrompt(commandName, context) {
467
- const prompts = {
468
- ship: {
469
- title: 'Ship Confirmation',
470
- message: 'Ready to commit and push changes?',
471
- details: [
472
- `Branch: ${context.branch || 'current'}`,
473
- `Files: ${context.changedFiles?.length || 0} changed`,
474
- `Commit: "${context.commitMessage || 'No message'}"`
475
- ],
476
- options: [
477
- { key: 'y', label: 'Yes, ship it', action: 'approve' },
478
- { key: 'n', label: 'No, cancel', action: 'reject' },
479
- { key: 'e', label: 'Edit message', action: 'edit' }
480
- ]
481
- },
482
- cleanup: {
483
- title: 'Cleanup Confirmation',
484
- message: 'This will delete files/code. Continue?',
485
- details: [
486
- `Files to delete: ${context.filesToDelete?.length || 0}`,
487
- `Code to remove: ${context.linesOfCode || 0} lines`
488
- ],
489
- options: [
490
- { key: 'y', label: 'Yes, cleanup', action: 'approve' },
491
- { key: 'n', label: 'No, cancel', action: 'reject' },
492
- { key: 'l', label: 'List files first', action: 'list' }
493
- ]
494
- },
495
- git: {
496
- title: 'Git Operation Confirmation',
497
- message: `Execute: ${context.operation || 'git operation'}?`,
498
- details: context.warnings || [],
499
- options: [
500
- { key: 'y', label: 'Yes, execute', action: 'approve' },
501
- { key: 'n', label: 'No, cancel', action: 'reject' }
502
- ]
503
- }
504
- }
505
-
506
- return prompts[commandName] || {
507
- title: 'Confirmation Required',
508
- message: `Execute ${commandName}?`,
509
- options: [
510
- { key: 'y', label: 'Yes', action: 'approve' },
511
- { key: 'n', label: 'No', action: 'reject' }
512
- ]
513
- }
514
- }
515
-
516
- /**
517
- * Format plan status for display
518
- * @param {string} projectId
519
- * @returns {string}
520
- */
521
- formatStatus(projectId) {
522
- const plan = this.getActivePlan(projectId)
523
- if (!plan) return 'No active plan'
524
-
525
- const statusEmoji = {
526
- [PLAN_STATUS.GATHERING]: '🔍',
527
- [PLAN_STATUS.ANALYZING]: '🧠',
528
- [PLAN_STATUS.PROPOSING]: '📝',
529
- [PLAN_STATUS.PENDING_APPROVAL]: '⏳',
530
- [PLAN_STATUS.APPROVED]: '✅',
531
- [PLAN_STATUS.EXECUTING]: '⚡',
532
- [PLAN_STATUS.COMPLETED]: '🎉',
533
- [PLAN_STATUS.REJECTED]: '❌',
534
- [PLAN_STATUS.ABORTED]: '🛑'
535
- }
536
-
537
- const lines = [
538
- `${statusEmoji[plan.status] || '📋'} Plan: ${plan.command}`,
539
- `Status: ${plan.status}`
540
- ]
541
-
542
- if (plan.status === PLAN_STATUS.EXECUTING) {
543
- const progress = Math.round((plan.currentStep / plan.steps.length) * 100)
544
- lines.push(`Progress: ${plan.currentStep}/${plan.steps.length} (${progress}%)`)
545
- }
546
-
547
- return lines.join('\n')
548
- }
549
-
550
- /**
551
- * Calculate duration between two timestamps
552
- * @private
553
- */
554
- _calculateDuration(start, end) {
555
- if (!start || !end) return null
556
- const ms = new Date(end) - new Date(start)
557
- const seconds = Math.floor(ms / 1000)
558
- const minutes = Math.floor(seconds / 60)
559
- const hours = Math.floor(minutes / 60)
560
-
561
- if (hours > 0) return `${hours}h ${minutes % 60}m`
562
- if (minutes > 0) return `${minutes}m ${seconds % 60}s`
563
- return `${seconds}s`
564
- }
565
- }
566
-
567
- // Export singleton and constants
568
- module.exports = new PlanMode()
569
- module.exports.PLAN_STATUS = PLAN_STATUS
570
- module.exports.PLAN_REQUIRED_COMMANDS = PLAN_REQUIRED_COMMANDS
571
- module.exports.DESTRUCTIVE_COMMANDS = DESTRUCTIVE_COMMANDS
572
- module.exports.PLANNING_TOOLS = PLANNING_TOOLS