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
@@ -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
+ }