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
@@ -0,0 +1,444 @@
1
+ /**
2
+ * Agent Performance Tracker
3
+ *
4
+ * Tracks agent performance for intelligent routing.
5
+ * Enables learning which agent works best for which task type.
6
+ */
7
+
8
+ import path from 'path'
9
+ import * as fileHelper from '../utils/file-helper'
10
+ import pathManager from '../infrastructure/path-manager'
11
+ import type {
12
+ AgentPerformance,
13
+ AgentTaskRecord,
14
+ AgentSuggestion,
15
+ AgentPerformanceSummary,
16
+ TaskType,
17
+ } from './types'
18
+
19
+ const PERFORMANCE_DIR = 'analysis'
20
+ const PERFORMANCE_FILE = 'agent-performance.json'
21
+ const RECORDS_FILE = 'agent-records.jsonl'
22
+
23
+ /**
24
+ * AgentPerformanceTracker - Tracks and analyzes agent performance.
25
+ */
26
+ export class AgentPerformanceTracker {
27
+ /**
28
+ * Get performance directory path for a project.
29
+ */
30
+ private getPerformanceDir(projectId: string): string {
31
+ const globalPath = pathManager.getGlobalProjectPath(projectId)
32
+ return path.join(globalPath, PERFORMANCE_DIR)
33
+ }
34
+
35
+ /**
36
+ * Get performance file path.
37
+ */
38
+ private getPerformancePath(projectId: string): string {
39
+ return path.join(this.getPerformanceDir(projectId), PERFORMANCE_FILE)
40
+ }
41
+
42
+ /**
43
+ * Get records file path.
44
+ */
45
+ private getRecordsPath(projectId: string): string {
46
+ return path.join(this.getPerformanceDir(projectId), RECORDS_FILE)
47
+ }
48
+
49
+ /**
50
+ * Record a task completion for an agent.
51
+ */
52
+ async recordTask(projectId: string, record: AgentTaskRecord): Promise<void> {
53
+ const recordsPath = this.getRecordsPath(projectId)
54
+
55
+ // Ensure directory exists
56
+ await fileHelper.ensureDir(path.dirname(recordsPath))
57
+
58
+ // Append record
59
+ await fileHelper.appendLine(recordsPath, JSON.stringify(record))
60
+
61
+ // Update performance summary
62
+ await this.updatePerformance(projectId, record)
63
+ }
64
+
65
+ /**
66
+ * Get all task records for a project.
67
+ */
68
+ async getRecords(projectId: string): Promise<AgentTaskRecord[]> {
69
+ const recordsPath = this.getRecordsPath(projectId)
70
+
71
+ if (!(await fileHelper.fileExists(recordsPath))) {
72
+ return []
73
+ }
74
+
75
+ const content = await fileHelper.readFile(recordsPath)
76
+ if (!content.trim()) {
77
+ return []
78
+ }
79
+
80
+ return content
81
+ .trim()
82
+ .split('\n')
83
+ .filter((line) => line.trim())
84
+ .map((line) => JSON.parse(line) as AgentTaskRecord)
85
+ }
86
+
87
+ /**
88
+ * Get all agent performance data.
89
+ */
90
+ async getAllPerformance(projectId: string): Promise<AgentPerformance[]> {
91
+ const perfPath = this.getPerformancePath(projectId)
92
+
93
+ if (!(await fileHelper.fileExists(perfPath))) {
94
+ return []
95
+ }
96
+
97
+ const data = await fileHelper.readJson<{ agents: AgentPerformance[] }>(
98
+ perfPath,
99
+ { agents: [] }
100
+ )
101
+ return data.agents
102
+ }
103
+
104
+ /**
105
+ * Get performance for a specific agent.
106
+ */
107
+ async getAgentPerformance(
108
+ projectId: string,
109
+ agentName: string
110
+ ): Promise<AgentPerformance | null> {
111
+ const all = await this.getAllPerformance(projectId)
112
+ return all.find((a) => a.agentName === agentName) || null
113
+ }
114
+
115
+ /**
116
+ * Update performance summary after a task completion.
117
+ */
118
+ private async updatePerformance(
119
+ projectId: string,
120
+ record: AgentTaskRecord
121
+ ): Promise<void> {
122
+ const perfPath = this.getPerformancePath(projectId)
123
+ await fileHelper.ensureDir(path.dirname(perfPath))
124
+
125
+ const data = await fileHelper.readJson<{ agents: AgentPerformance[] }>(
126
+ perfPath,
127
+ { agents: [] }
128
+ )
129
+
130
+ // Find or create agent performance
131
+ let agentPerf = data.agents.find((a) => a.agentName === record.agentName)
132
+
133
+ if (!agentPerf) {
134
+ agentPerf = {
135
+ agentName: record.agentName,
136
+ taskType: record.taskType,
137
+ tasksCompleted: 0,
138
+ successRate: 0,
139
+ avgDuration: '0m',
140
+ estimateAccuracy: 0,
141
+ improving: false,
142
+ lastUpdated: new Date().toISOString(),
143
+ bestFor: [],
144
+ avoidFor: [],
145
+ }
146
+ data.agents.push(agentPerf)
147
+ }
148
+
149
+ // Get all records for this agent
150
+ const allRecords = await this.getRecords(projectId)
151
+ const agentRecords = allRecords.filter((r) => r.agentName === record.agentName)
152
+
153
+ // Calculate updated stats
154
+ agentPerf.tasksCompleted = agentRecords.length
155
+ agentPerf.successRate = Math.round(
156
+ (agentRecords.filter((r) => r.success).length / agentRecords.length) * 100
157
+ )
158
+ agentPerf.avgDuration = this.calculateAvgDuration(agentRecords)
159
+ agentPerf.estimateAccuracy = this.calculateEstimateAccuracy(agentRecords)
160
+ agentPerf.lastUpdated = new Date().toISOString()
161
+
162
+ // Calculate best/avoid task types
163
+ const taskTypeStats = this.calculateTaskTypeStats(agentRecords)
164
+ agentPerf.bestFor = taskTypeStats.bestFor
165
+ agentPerf.avoidFor = taskTypeStats.avoidFor
166
+
167
+ // Check if improving (compare last 5 vs previous 5)
168
+ agentPerf.improving = this.checkImproving(agentRecords)
169
+
170
+ await fileHelper.writeJson(perfPath, data)
171
+ }
172
+
173
+ /**
174
+ * Calculate average duration from records.
175
+ */
176
+ private calculateAvgDuration(records: AgentTaskRecord[]): string {
177
+ if (records.length === 0) return '0m'
178
+
179
+ const totalMinutes = records.reduce((sum, r) => {
180
+ return sum + this.parseDuration(r.actualDuration)
181
+ }, 0)
182
+
183
+ const avgMinutes = Math.round(totalMinutes / records.length)
184
+
185
+ if (avgMinutes >= 60) {
186
+ const hours = Math.floor(avgMinutes / 60)
187
+ const mins = avgMinutes % 60
188
+ return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`
189
+ }
190
+ return `${avgMinutes}m`
191
+ }
192
+
193
+ /**
194
+ * Calculate estimate accuracy from records.
195
+ */
196
+ private calculateEstimateAccuracy(records: AgentTaskRecord[]): number {
197
+ if (records.length === 0) return 0
198
+
199
+ const accurateCount = records.filter((r) => {
200
+ const estimated = this.parseDuration(r.estimatedDuration)
201
+ const actual = this.parseDuration(r.actualDuration)
202
+ if (estimated === 0) return false
203
+ return Math.abs(actual - estimated) / estimated <= 0.2
204
+ }).length
205
+
206
+ return Math.round((accurateCount / records.length) * 100)
207
+ }
208
+
209
+ /**
210
+ * Calculate best and avoid task types for an agent.
211
+ */
212
+ private calculateTaskTypeStats(records: AgentTaskRecord[]): {
213
+ bestFor: TaskType[]
214
+ avoidFor: TaskType[]
215
+ } {
216
+ const byType = new Map<TaskType, { success: number; total: number }>()
217
+
218
+ for (const record of records) {
219
+ const stats = byType.get(record.taskType) || { success: 0, total: 0 }
220
+ stats.total++
221
+ if (record.success) stats.success++
222
+ byType.set(record.taskType, stats)
223
+ }
224
+
225
+ const bestFor: TaskType[] = []
226
+ const avoidFor: TaskType[] = []
227
+
228
+ for (const [taskType, stats] of byType) {
229
+ if (stats.total < 2) continue // Need at least 2 tasks
230
+
231
+ const successRate = stats.success / stats.total
232
+
233
+ if (successRate >= 0.8) {
234
+ bestFor.push(taskType)
235
+ } else if (successRate < 0.5) {
236
+ avoidFor.push(taskType)
237
+ }
238
+ }
239
+
240
+ return { bestFor, avoidFor }
241
+ }
242
+
243
+ /**
244
+ * Check if agent performance is improving.
245
+ */
246
+ private checkImproving(records: AgentTaskRecord[]): boolean {
247
+ if (records.length < 10) return false
248
+
249
+ const recent = records.slice(-5)
250
+ const previous = records.slice(-10, -5)
251
+
252
+ const recentSuccess = recent.filter((r) => r.success).length / 5
253
+ const previousSuccess = previous.filter((r) => r.success).length / 5
254
+
255
+ return recentSuccess > previousSuccess
256
+ }
257
+
258
+ /**
259
+ * Parse duration string to minutes.
260
+ */
261
+ private parseDuration(duration: string): number {
262
+ let minutes = 0
263
+
264
+ const hourMatch = duration.match(/(\d+)h/)
265
+ if (hourMatch) {
266
+ minutes += parseInt(hourMatch[1], 10) * 60
267
+ }
268
+
269
+ const minMatch = duration.match(/(\d+)m/)
270
+ if (minMatch) {
271
+ minutes += parseInt(minMatch[1], 10)
272
+ }
273
+
274
+ return minutes
275
+ }
276
+
277
+ /**
278
+ * Suggest the best agent for a task type.
279
+ */
280
+ async suggestAgent(
281
+ projectId: string,
282
+ taskType: TaskType
283
+ ): Promise<AgentSuggestion | null> {
284
+ const allPerf = await this.getAllPerformance(projectId)
285
+
286
+ if (allPerf.length === 0) {
287
+ return null
288
+ }
289
+
290
+ // Find agents good at this task type
291
+ const suitable = allPerf.filter(
292
+ (a) => a.bestFor.includes(taskType) && !a.avoidFor.includes(taskType)
293
+ )
294
+
295
+ if (suitable.length > 0) {
296
+ // Sort by success rate
297
+ suitable.sort((a, b) => b.successRate - a.successRate)
298
+ const best = suitable[0]
299
+
300
+ return {
301
+ agentName: best.agentName,
302
+ confidence: best.successRate / 100,
303
+ reason: `Best success rate (${best.successRate}%) for ${taskType} tasks`,
304
+ alternatives: suitable.slice(1, 3).map((a) => a.agentName),
305
+ }
306
+ }
307
+
308
+ // Fallback to most experienced agent
309
+ const byExperience = [...allPerf].sort(
310
+ (a, b) => b.tasksCompleted - a.tasksCompleted
311
+ )
312
+ const fallback = byExperience[0]
313
+
314
+ return {
315
+ agentName: fallback.agentName,
316
+ confidence: 0.5,
317
+ reason: `Most experienced agent (${fallback.tasksCompleted} tasks)`,
318
+ alternatives: byExperience.slice(1, 3).map((a) => a.agentName),
319
+ }
320
+ }
321
+
322
+ /**
323
+ * Get performance summary for a project.
324
+ */
325
+ async getSummary(projectId: string): Promise<AgentPerformanceSummary> {
326
+ const allPerf = await this.getAllPerformance(projectId)
327
+
328
+ if (allPerf.length === 0) {
329
+ return {
330
+ totalAgents: 0,
331
+ topPerformer: null,
332
+ mostUsed: null,
333
+ avgSuccessRate: 0,
334
+ byTaskType: {} as Record<TaskType, string | null>,
335
+ }
336
+ }
337
+
338
+ // Find top performer
339
+ const bySuccess = [...allPerf].sort((a, b) => b.successRate - a.successRate)
340
+ const topPerformer = bySuccess[0].agentName
341
+
342
+ // Find most used
343
+ const byTasks = [...allPerf].sort((a, b) => b.tasksCompleted - a.tasksCompleted)
344
+ const mostUsed = byTasks[0].agentName
345
+
346
+ // Average success rate
347
+ const avgSuccessRate = Math.round(
348
+ allPerf.reduce((sum, a) => sum + a.successRate, 0) / allPerf.length
349
+ )
350
+
351
+ // Best agent by task type
352
+ const taskTypes: TaskType[] = [
353
+ 'frontend',
354
+ 'backend',
355
+ 'devops',
356
+ 'database',
357
+ 'testing',
358
+ 'documentation',
359
+ 'refactoring',
360
+ 'bugfix',
361
+ 'feature',
362
+ 'design',
363
+ 'other',
364
+ ]
365
+ const byTaskType: Record<TaskType, string | null> = {} as Record<
366
+ TaskType,
367
+ string | null
368
+ >
369
+
370
+ for (const taskType of taskTypes) {
371
+ const best = allPerf.find((a) => a.bestFor.includes(taskType))
372
+ byTaskType[taskType] = best?.agentName || null
373
+ }
374
+
375
+ return {
376
+ totalAgents: allPerf.length,
377
+ topPerformer,
378
+ mostUsed,
379
+ avgSuccessRate,
380
+ byTaskType,
381
+ }
382
+ }
383
+
384
+ /**
385
+ * Generate markdown report of agent performance.
386
+ */
387
+ async generateReport(projectId: string): Promise<string> {
388
+ const allPerf = await this.getAllPerformance(projectId)
389
+ const summary = await this.getSummary(projectId)
390
+
391
+ const lines: string[] = []
392
+
393
+ lines.push('# Agent Performance Report')
394
+ lines.push('')
395
+ lines.push(`Generated: ${new Date().toISOString()}`)
396
+ lines.push('')
397
+
398
+ lines.push('## Summary')
399
+ lines.push('')
400
+ lines.push(`- **Total Agents**: ${summary.totalAgents}`)
401
+ lines.push(`- **Top Performer**: ${summary.topPerformer || 'N/A'}`)
402
+ lines.push(`- **Most Used**: ${summary.mostUsed || 'N/A'}`)
403
+ lines.push(`- **Avg Success Rate**: ${summary.avgSuccessRate}%`)
404
+ lines.push('')
405
+
406
+ if (allPerf.length > 0) {
407
+ lines.push('## Agent Details')
408
+ lines.push('')
409
+
410
+ for (const agent of allPerf) {
411
+ lines.push(`### ${agent.agentName}`)
412
+ lines.push('')
413
+ lines.push(`- **Tasks Completed**: ${agent.tasksCompleted}`)
414
+ lines.push(`- **Success Rate**: ${agent.successRate}%`)
415
+ lines.push(`- **Avg Duration**: ${agent.avgDuration}`)
416
+ lines.push(`- **Estimate Accuracy**: ${agent.estimateAccuracy}%`)
417
+ lines.push(`- **Improving**: ${agent.improving ? 'Yes' : 'No'}`)
418
+
419
+ if (agent.bestFor.length > 0) {
420
+ lines.push(`- **Best For**: ${agent.bestFor.join(', ')}`)
421
+ }
422
+ if (agent.avoidFor.length > 0) {
423
+ lines.push(`- **Avoid For**: ${agent.avoidFor.join(', ')}`)
424
+ }
425
+ lines.push('')
426
+ }
427
+ }
428
+
429
+ lines.push('## Task Type Routing')
430
+ lines.push('')
431
+ lines.push('| Task Type | Recommended Agent |')
432
+ lines.push('|-----------|-------------------|')
433
+
434
+ for (const [taskType, agent] of Object.entries(summary.byTaskType)) {
435
+ lines.push(`| ${taskType} | ${agent || 'No data'} |`)
436
+ }
437
+
438
+ return lines.join('\n')
439
+ }
440
+ }
441
+
442
+ // Singleton instance
443
+ const agentPerformanceTracker = new AgentPerformanceTracker()
444
+ export default agentPerformanceTracker
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Agent Types
3
+ *
4
+ * Types for agent performance tracking and management.
5
+ */
6
+
7
+ /**
8
+ * Task type categories for agent routing.
9
+ */
10
+ export type TaskType =
11
+ | 'frontend'
12
+ | 'backend'
13
+ | 'devops'
14
+ | 'database'
15
+ | 'testing'
16
+ | 'documentation'
17
+ | 'refactoring'
18
+ | 'bugfix'
19
+ | 'feature'
20
+ | 'design'
21
+ | 'other'
22
+
23
+ /**
24
+ * Agent performance record.
25
+ *
26
+ * @property agentName - Name of the agent
27
+ * @property taskType - Type of tasks this agent handles
28
+ * @property tasksCompleted - Total tasks completed
29
+ */
30
+ export interface AgentPerformance {
31
+ /** Agent name (e.g., "fe", "be", "devops") */
32
+ agentName: string
33
+
34
+ /** Primary task type this agent handles */
35
+ taskType: TaskType
36
+
37
+ /** Total tasks completed by this agent */
38
+ tasksCompleted: number
39
+
40
+ /** Success rate (0-100) */
41
+ successRate: number
42
+
43
+ /** Average task duration */
44
+ avgDuration: string
45
+
46
+ /** Estimate accuracy (0-100) */
47
+ estimateAccuracy: number
48
+
49
+ /** Whether performance is improving */
50
+ improving: boolean
51
+
52
+ /** When this record was last updated */
53
+ lastUpdated: string
54
+
55
+ /** Task types this agent excels at */
56
+ bestFor: TaskType[]
57
+
58
+ /** Task types to avoid for this agent */
59
+ avoidFor: TaskType[]
60
+ }
61
+
62
+ /**
63
+ * Task completion record for agent performance tracking.
64
+ */
65
+ export interface AgentTaskRecord {
66
+ /** Agent that completed the task */
67
+ agentName: string
68
+
69
+ /** Type of task */
70
+ taskType: TaskType
71
+
72
+ /** Whether task was completed successfully */
73
+ success: boolean
74
+
75
+ /** Estimated duration */
76
+ estimatedDuration: string
77
+
78
+ /** Actual duration */
79
+ actualDuration: string
80
+
81
+ /** Quality score (1-5) */
82
+ qualityScore: 1 | 2 | 3 | 4 | 5
83
+
84
+ /** When task was completed */
85
+ completedAt: string
86
+
87
+ /** Optional notes about performance */
88
+ notes?: string
89
+ }
90
+
91
+ /**
92
+ * Agent routing suggestion.
93
+ */
94
+ export interface AgentSuggestion {
95
+ /** Recommended agent */
96
+ agentName: string
97
+
98
+ /** Confidence in this suggestion (0-1) */
99
+ confidence: number
100
+
101
+ /** Reason for this suggestion */
102
+ reason: string
103
+
104
+ /** Alternative agents */
105
+ alternatives?: string[]
106
+ }
107
+
108
+ /**
109
+ * Agent performance summary for a project.
110
+ */
111
+ export interface AgentPerformanceSummary {
112
+ /** Total agents tracked */
113
+ totalAgents: number
114
+
115
+ /** Best performing agent */
116
+ topPerformer: string | null
117
+
118
+ /** Agent with most tasks */
119
+ mostUsed: string | null
120
+
121
+ /** Average success rate across all agents */
122
+ avgSuccessRate: number
123
+
124
+ /** Performance by task type */
125
+ byTaskType: Record<TaskType, string | null>
126
+ }