prjct-cli 0.11.4 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +81 -25
  3. package/bin/dev.js +1 -1
  4. package/bin/generate-views.js +209 -0
  5. package/bin/migrate-to-json.js +742 -0
  6. package/bin/prjct +5 -5
  7. package/bin/serve.js +246 -54
  8. package/core/__tests__/agentic/{memory-system.test.js → memory-system.test.ts} +12 -23
  9. package/core/__tests__/agentic/{plan-mode.test.js → plan-mode.test.ts} +26 -24
  10. package/core/__tests__/agentic/{prompt-builder.test.js → prompt-builder.test.ts} +3 -8
  11. package/core/__tests__/utils/date-helper.test.ts +405 -0
  12. package/core/__tests__/utils/{output.test.js → output.test.ts} +12 -24
  13. package/core/agentic/agent-router.ts +137 -0
  14. package/core/agentic/chain-of-thought.ts +228 -0
  15. package/core/agentic/command-executor/command-executor.ts +384 -0
  16. package/core/agentic/command-executor/index.ts +16 -0
  17. package/core/agentic/command-executor/status-signal.ts +38 -0
  18. package/core/agentic/command-executor/types.ts +79 -0
  19. package/core/agentic/command-executor.ts +8 -0
  20. package/core/agentic/{context-builder.js → context-builder.ts} +99 -89
  21. package/core/agentic/context-filter.ts +365 -0
  22. package/core/agentic/ground-truth/index.ts +76 -0
  23. package/core/agentic/ground-truth/types.ts +33 -0
  24. package/core/agentic/ground-truth/utils.ts +48 -0
  25. package/core/agentic/ground-truth/verifiers/analyze.ts +54 -0
  26. package/core/agentic/ground-truth/verifiers/done.ts +75 -0
  27. package/core/agentic/ground-truth/verifiers/feature.ts +70 -0
  28. package/core/agentic/ground-truth/verifiers/index.ts +37 -0
  29. package/core/agentic/ground-truth/verifiers/init.ts +52 -0
  30. package/core/agentic/ground-truth/verifiers/now.ts +57 -0
  31. package/core/agentic/ground-truth/verifiers/ship.ts +85 -0
  32. package/core/agentic/ground-truth/verifiers/spec.ts +45 -0
  33. package/core/agentic/ground-truth/verifiers/sync.ts +47 -0
  34. package/core/agentic/ground-truth/verifiers.ts +6 -0
  35. package/core/agentic/ground-truth.ts +8 -0
  36. package/core/agentic/loop-detector/error-analysis.ts +97 -0
  37. package/core/agentic/loop-detector/hallucination.ts +71 -0
  38. package/core/agentic/loop-detector/index.ts +41 -0
  39. package/core/agentic/loop-detector/loop-detector.ts +222 -0
  40. package/core/agentic/loop-detector/types.ts +66 -0
  41. package/core/agentic/loop-detector.ts +8 -0
  42. package/core/agentic/memory-system/history.ts +53 -0
  43. package/core/agentic/memory-system/index.ts +192 -0
  44. package/core/agentic/memory-system/patterns.ts +156 -0
  45. package/core/agentic/memory-system/semantic-memories.ts +277 -0
  46. package/core/agentic/memory-system/session.ts +21 -0
  47. package/core/agentic/memory-system/types.ts +159 -0
  48. package/core/agentic/memory-system.ts +8 -0
  49. package/core/agentic/parallel-tools.ts +165 -0
  50. package/core/agentic/plan-mode/approval.ts +57 -0
  51. package/core/agentic/plan-mode/constants.ts +44 -0
  52. package/core/agentic/plan-mode/index.ts +28 -0
  53. package/core/agentic/plan-mode/plan-mode.ts +406 -0
  54. package/core/agentic/plan-mode/types.ts +193 -0
  55. package/core/agentic/plan-mode.ts +8 -0
  56. package/core/agentic/prompt-builder.ts +566 -0
  57. package/core/agentic/response-templates.ts +164 -0
  58. package/core/agentic/semantic-compression.ts +273 -0
  59. package/core/agentic/services.ts +206 -0
  60. package/core/agentic/smart-context.ts +476 -0
  61. package/core/agentic/{template-loader.js → template-loader.ts} +35 -18
  62. package/core/agentic/think-blocks.ts +202 -0
  63. package/core/agentic/tool-registry.ts +119 -0
  64. package/core/agentic/validation-rules.ts +313 -0
  65. package/core/agents/index.ts +28 -0
  66. package/core/agents/performance.ts +444 -0
  67. package/core/agents/types.ts +126 -0
  68. package/core/bus/{index.js → index.ts} +57 -61
  69. package/core/command-registry/categories.ts +23 -0
  70. package/core/command-registry/commands.ts +15 -0
  71. package/core/command-registry/core-commands.ts +319 -0
  72. package/core/command-registry/index.ts +158 -0
  73. package/core/command-registry/optional-commands.ts +119 -0
  74. package/core/command-registry/setup-commands.ts +53 -0
  75. package/core/command-registry/types.ts +59 -0
  76. package/core/command-registry.ts +9 -0
  77. package/core/commands/analysis.ts +298 -0
  78. package/core/commands/analytics.ts +288 -0
  79. package/core/commands/base.ts +273 -0
  80. package/core/commands/index.ts +211 -0
  81. package/core/commands/maintenance.ts +226 -0
  82. package/core/commands/planning.ts +311 -0
  83. package/core/commands/setup.ts +309 -0
  84. package/core/commands/shipping.ts +188 -0
  85. package/core/commands/types.ts +183 -0
  86. package/core/commands/workflow.ts +226 -0
  87. package/core/commands.ts +11 -0
  88. package/core/constants/formats.ts +187 -0
  89. package/core/constants/index.ts +7 -0
  90. package/core/{context-sync.js → context-sync.ts} +59 -26
  91. package/core/data/agents-manager.ts +76 -0
  92. package/core/data/analysis-manager.ts +83 -0
  93. package/core/data/base-manager.ts +156 -0
  94. package/core/data/ideas-manager.ts +81 -0
  95. package/core/data/index.ts +32 -0
  96. package/core/data/outcomes-manager.ts +96 -0
  97. package/core/data/project-manager.ts +75 -0
  98. package/core/data/roadmap-manager.ts +118 -0
  99. package/core/data/shipped-manager.ts +65 -0
  100. package/core/data/state-manager.ts +214 -0
  101. package/core/domain/{agent-generator.js → agent-generator.ts} +77 -57
  102. package/core/domain/{agent-loader.js → agent-loader.ts} +65 -56
  103. package/core/domain/{agent-matcher.js → agent-matcher.ts} +51 -24
  104. package/core/domain/{agent-validator.js → agent-validator.ts} +70 -37
  105. package/core/domain/{analyzer.js → analyzer.ts} +91 -85
  106. package/core/domain/{architect-session.js → architect-session.ts} +49 -34
  107. package/core/domain/{architecture-generator.js → architecture-generator.ts} +25 -13
  108. package/core/domain/{context-estimator.js → context-estimator.ts} +57 -36
  109. package/core/domain/{product-standards.js → product-standards.ts} +40 -26
  110. package/core/domain/{smart-cache.js → smart-cache.ts} +39 -30
  111. package/core/domain/{snapshot-manager.js → snapshot-manager.ts} +103 -100
  112. package/core/domain/{task-analyzer.js → task-analyzer.ts} +82 -43
  113. package/core/domain/task-stack/index.ts +19 -0
  114. package/core/domain/task-stack/parser.ts +86 -0
  115. package/core/domain/task-stack/storage.ts +123 -0
  116. package/core/domain/task-stack/task-stack.ts +340 -0
  117. package/core/domain/task-stack/types.ts +51 -0
  118. package/core/domain/task-stack.ts +8 -0
  119. package/core/{index.js → index.ts} +61 -18
  120. package/core/infrastructure/{agent-detector.js → agent-detector.ts} +62 -23
  121. package/core/infrastructure/agents/{claude-agent.js → claude-agent.ts} +61 -21
  122. package/core/infrastructure/{author-detector.js → author-detector.ts} +42 -49
  123. package/core/infrastructure/{capability-installer.js → capability-installer.ts} +51 -27
  124. package/core/infrastructure/{command-installer.js → command-installer/command-installer.ts} +43 -144
  125. package/core/infrastructure/command-installer/global-config.ts +106 -0
  126. package/core/infrastructure/command-installer/index.ts +25 -0
  127. package/core/infrastructure/command-installer/types.ts +41 -0
  128. package/core/infrastructure/command-installer.ts +8 -0
  129. package/core/infrastructure/{config-manager.js → config-manager.ts} +60 -80
  130. package/core/infrastructure/{editors-config.js → editors-config.ts} +33 -31
  131. package/core/infrastructure/legacy-installer-detector/cleanup.ts +216 -0
  132. package/core/infrastructure/legacy-installer-detector/detection.ts +95 -0
  133. package/core/infrastructure/legacy-installer-detector/index.ts +171 -0
  134. package/core/infrastructure/legacy-installer-detector/migration.ts +87 -0
  135. package/core/infrastructure/legacy-installer-detector/types.ts +42 -0
  136. package/core/infrastructure/legacy-installer-detector.ts +7 -0
  137. package/core/infrastructure/migrator/file-operations.ts +125 -0
  138. package/core/infrastructure/migrator/index.ts +288 -0
  139. package/core/infrastructure/migrator/project-scanner.ts +89 -0
  140. package/core/infrastructure/migrator/reports.ts +117 -0
  141. package/core/infrastructure/migrator/types.ts +124 -0
  142. package/core/infrastructure/migrator/validation.ts +94 -0
  143. package/core/infrastructure/migrator/version-migration.ts +117 -0
  144. package/core/infrastructure/migrator.ts +10 -0
  145. package/core/infrastructure/{path-manager.js → path-manager.ts} +51 -91
  146. package/core/infrastructure/session-manager/index.ts +23 -0
  147. package/core/infrastructure/session-manager/migration.ts +88 -0
  148. package/core/infrastructure/session-manager/session-manager.ts +307 -0
  149. package/core/infrastructure/session-manager/types.ts +45 -0
  150. package/core/infrastructure/session-manager.ts +8 -0
  151. package/core/infrastructure/{setup.js → setup.ts} +29 -21
  152. package/core/infrastructure/{update-checker.js → update-checker.ts} +40 -18
  153. package/core/outcomes/analyzer.ts +333 -0
  154. package/core/outcomes/index.ts +34 -0
  155. package/core/outcomes/recorder.ts +194 -0
  156. package/core/outcomes/types.ts +145 -0
  157. package/core/plugin/{hooks.js → hooks.ts} +56 -58
  158. package/core/plugin/{index.js → index.ts} +19 -8
  159. package/core/plugin/{loader.js → loader.ts} +87 -69
  160. package/core/plugin/{registry.js → registry.ts} +49 -45
  161. package/core/plugins/{webhook.js → webhook.ts} +43 -27
  162. package/core/schemas/agents.ts +27 -0
  163. package/core/schemas/analysis.ts +41 -0
  164. package/core/schemas/ideas.ts +83 -0
  165. package/core/schemas/index.ts +73 -0
  166. package/core/schemas/outcomes.ts +22 -0
  167. package/core/schemas/project.ts +26 -0
  168. package/core/schemas/roadmap.ts +90 -0
  169. package/core/schemas/shipped.ts +82 -0
  170. package/core/schemas/state.ts +107 -0
  171. package/core/session/index.ts +17 -0
  172. package/core/session/{metrics.js → metrics.ts} +64 -46
  173. package/core/session/{index.js → session-manager.ts} +51 -117
  174. package/core/session/types.ts +29 -0
  175. package/core/session/utils.ts +57 -0
  176. package/core/state/index.ts +25 -0
  177. package/core/state/manager.ts +376 -0
  178. package/core/state/types.ts +185 -0
  179. package/core/tsconfig.json +22 -0
  180. package/core/types/index.ts +506 -0
  181. package/core/utils/{animations.js → animations.ts} +74 -28
  182. package/core/utils/{branding.js → branding.ts} +29 -4
  183. package/core/utils/{date-helper.js → date-helper.ts} +31 -74
  184. package/core/utils/file-helper.ts +262 -0
  185. package/core/utils/{jsonl-helper.js → jsonl-helper.ts} +71 -107
  186. package/core/utils/{logger.js → logger.ts} +24 -12
  187. package/core/utils/{output.js → output.ts} +25 -13
  188. package/core/utils/{project-capabilities.js → project-capabilities.ts} +31 -18
  189. package/core/utils/{session-helper.js → session-helper.ts} +79 -66
  190. package/core/utils/{version.js → version.ts} +23 -31
  191. package/core/view-generator.ts +536 -0
  192. package/package.json +23 -17
  193. package/packages/shared/.turbo/turbo-build.log +14 -0
  194. package/packages/shared/dist/index.d.ts +8 -613
  195. package/packages/shared/dist/index.d.ts.map +1 -0
  196. package/packages/shared/dist/index.js +4110 -118
  197. package/packages/shared/dist/schemas.d.ts +408 -0
  198. package/packages/shared/dist/schemas.d.ts.map +1 -0
  199. package/packages/shared/dist/types.d.ts +144 -0
  200. package/packages/shared/dist/types.d.ts.map +1 -0
  201. package/packages/shared/dist/unified.d.ts +139 -0
  202. package/packages/shared/dist/unified.d.ts.map +1 -0
  203. package/packages/shared/dist/utils.d.ts +60 -0
  204. package/packages/shared/dist/utils.d.ts.map +1 -0
  205. package/packages/shared/package.json +4 -4
  206. package/packages/shared/src/index.ts +1 -0
  207. package/packages/shared/src/unified.ts +174 -0
  208. package/packages/web/app/api/claude/sessions/route.ts +1 -1
  209. package/packages/web/app/api/claude/status/route.ts +1 -1
  210. package/packages/web/app/api/migrate/route.ts +46 -0
  211. package/packages/web/app/api/projects/[id]/route.ts +1 -1
  212. package/packages/web/app/api/projects/[id]/stats/route.ts +30 -2
  213. package/packages/web/app/api/projects/[id]/status/route.ts +1 -1
  214. package/packages/web/app/api/projects/route.ts +1 -1
  215. package/packages/web/app/api/settings/route.ts +97 -0
  216. package/packages/web/app/api/v2/projects/[id]/unified/route.ts +57 -0
  217. package/packages/web/app/globals.css +38 -0
  218. package/packages/web/app/layout.tsx +10 -2
  219. package/packages/web/app/page.tsx +9 -224
  220. package/packages/web/app/project/[id]/page.tsx +191 -63
  221. package/packages/web/app/project/[id]/stats/loading.tsx +43 -0
  222. package/packages/web/app/project/[id]/stats/page.tsx +203 -403
  223. package/packages/web/app/settings/page.tsx +222 -2
  224. package/packages/web/components/ActivityTimeline/ActivityTimeline.constants.ts +2 -0
  225. package/packages/web/components/ActivityTimeline/ActivityTimeline.tsx +50 -0
  226. package/packages/web/components/ActivityTimeline/ActivityTimeline.types.ts +8 -0
  227. package/packages/web/components/ActivityTimeline/hooks/index.ts +2 -0
  228. package/packages/web/components/ActivityTimeline/hooks/useExpandable.ts +9 -0
  229. package/packages/web/components/ActivityTimeline/hooks/useGroupedEvents.ts +23 -0
  230. package/packages/web/components/ActivityTimeline/index.ts +2 -0
  231. package/packages/web/components/AgentsCard/AgentsCard.tsx +63 -0
  232. package/packages/web/components/AgentsCard/AgentsCard.types.ts +13 -0
  233. package/packages/web/components/AgentsCard/index.ts +2 -0
  234. package/packages/web/components/AppSidebar/AppSidebar.tsx +134 -0
  235. package/packages/web/components/AppSidebar/index.ts +1 -0
  236. package/packages/web/components/BackLink/BackLink.tsx +18 -0
  237. package/packages/web/components/BackLink/BackLink.types.ts +5 -0
  238. package/packages/web/components/BackLink/index.ts +2 -0
  239. package/packages/web/components/BentoCard/BentoCard.constants.ts +16 -0
  240. package/packages/web/components/BentoCard/BentoCard.tsx +47 -0
  241. package/packages/web/components/BentoCard/BentoCard.types.ts +15 -0
  242. package/packages/web/components/BentoCard/index.ts +2 -0
  243. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.constants.ts +9 -0
  244. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.tsx +18 -0
  245. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.types.ts +5 -0
  246. package/packages/web/components/BentoCardSkeleton/index.ts +2 -0
  247. package/packages/web/components/BentoGrid/BentoGrid.tsx +18 -0
  248. package/packages/web/components/BentoGrid/BentoGrid.types.ts +4 -0
  249. package/packages/web/components/BentoGrid/index.ts +2 -0
  250. package/packages/web/components/CommandButton/index.ts +1 -0
  251. package/packages/web/components/ConnectionStatus/index.ts +1 -0
  252. package/packages/web/components/DashboardContent/DashboardContent.tsx +254 -0
  253. package/packages/web/components/DashboardContent/index.ts +1 -0
  254. package/packages/web/components/DateGroup/DateGroup.tsx +18 -0
  255. package/packages/web/components/DateGroup/DateGroup.types.ts +6 -0
  256. package/packages/web/components/DateGroup/DateGroup.utils.ts +11 -0
  257. package/packages/web/components/DateGroup/index.ts +2 -0
  258. package/packages/web/components/EmptyState/EmptyState.tsx +58 -0
  259. package/packages/web/components/EmptyState/EmptyState.types.ts +10 -0
  260. package/packages/web/components/EmptyState/index.ts +2 -0
  261. package/packages/web/components/EventRow/EventRow.constants.ts +10 -0
  262. package/packages/web/components/EventRow/EventRow.tsx +49 -0
  263. package/packages/web/components/EventRow/EventRow.types.ts +7 -0
  264. package/packages/web/components/EventRow/EventRow.utils.ts +49 -0
  265. package/packages/web/components/EventRow/index.ts +2 -0
  266. package/packages/web/components/ExpandButton/ExpandButton.tsx +18 -0
  267. package/packages/web/components/ExpandButton/ExpandButton.types.ts +6 -0
  268. package/packages/web/components/ExpandButton/index.ts +2 -0
  269. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.tsx +14 -0
  270. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.types.ts +5 -0
  271. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.utils.ts +13 -0
  272. package/packages/web/components/HealthGradientBackground/index.ts +2 -0
  273. package/packages/web/components/HeroSection/HeroSection.tsx +55 -0
  274. package/packages/web/components/HeroSection/HeroSection.types.ts +14 -0
  275. package/packages/web/components/HeroSection/HeroSection.utils.ts +7 -0
  276. package/packages/web/components/HeroSection/hooks/index.ts +2 -0
  277. package/packages/web/components/HeroSection/hooks/useCountUp.ts +45 -0
  278. package/packages/web/components/HeroSection/hooks/useWeeklyActivity.ts +18 -0
  279. package/packages/web/components/HeroSection/index.ts +2 -0
  280. package/packages/web/components/IdeasCard/IdeasCard.tsx +48 -0
  281. package/packages/web/components/IdeasCard/IdeasCard.types.ts +9 -0
  282. package/packages/web/components/IdeasCard/index.ts +2 -0
  283. package/packages/web/components/InsightMessage/InsightMessage.tsx +9 -0
  284. package/packages/web/components/InsightMessage/InsightMessage.types.ts +3 -0
  285. package/packages/web/components/InsightMessage/index.ts +2 -0
  286. package/packages/web/components/Logo/index.ts +1 -0
  287. package/packages/web/components/MarkdownContent/index.ts +1 -0
  288. package/packages/web/components/NowCard/NowCard.tsx +93 -0
  289. package/packages/web/components/NowCard/NowCard.types.ts +15 -0
  290. package/packages/web/components/NowCard/index.ts +2 -0
  291. package/packages/web/components/ProgressRing/ProgressRing.constants.ts +20 -0
  292. package/packages/web/components/ProgressRing/ProgressRing.tsx +51 -0
  293. package/packages/web/components/ProgressRing/ProgressRing.types.ts +11 -0
  294. package/packages/web/components/ProgressRing/index.ts +2 -0
  295. package/packages/web/components/ProjectAvatar/index.ts +1 -0
  296. package/packages/web/components/Providers/index.ts +1 -0
  297. package/packages/web/components/QueueCard/QueueCard.tsx +72 -0
  298. package/packages/web/components/QueueCard/QueueCard.types.ts +11 -0
  299. package/packages/web/components/QueueCard/QueueCard.utils.ts +12 -0
  300. package/packages/web/components/QueueCard/index.ts +2 -0
  301. package/packages/web/components/RoadmapCard/RoadmapCard.tsx +77 -0
  302. package/packages/web/components/RoadmapCard/RoadmapCard.types.ts +15 -0
  303. package/packages/web/components/RoadmapCard/index.ts +2 -0
  304. package/packages/web/components/ShipsCard/ShipsCard.tsx +52 -0
  305. package/packages/web/components/ShipsCard/ShipsCard.types.ts +12 -0
  306. package/packages/web/components/ShipsCard/ShipsCard.utils.ts +4 -0
  307. package/packages/web/components/ShipsCard/index.ts +2 -0
  308. package/packages/web/components/SparklineChart/SparklineChart.tsx +38 -0
  309. package/packages/web/components/SparklineChart/SparklineChart.types.ts +6 -0
  310. package/packages/web/components/SparklineChart/index.ts +2 -0
  311. package/packages/web/components/StreakCard/StreakCard.constants.ts +2 -0
  312. package/packages/web/components/StreakCard/StreakCard.tsx +53 -0
  313. package/packages/web/components/StreakCard/StreakCard.types.ts +4 -0
  314. package/packages/web/components/StreakCard/index.ts +2 -0
  315. package/packages/web/components/TasksCounter/TasksCounter.tsx +14 -0
  316. package/packages/web/components/TasksCounter/TasksCounter.types.ts +3 -0
  317. package/packages/web/components/TasksCounter/index.ts +2 -0
  318. package/packages/web/components/TechStackBadges/index.ts +1 -0
  319. package/packages/web/components/{TerminalTab.tsx → TerminalTabs/TerminalTab.tsx} +11 -0
  320. package/packages/web/components/{TerminalTabs.tsx → TerminalTabs/TerminalTabs.tsx} +29 -28
  321. package/packages/web/components/TerminalTabs/index.ts +1 -0
  322. package/packages/web/components/VelocityBadge/VelocityBadge.tsx +27 -0
  323. package/packages/web/components/VelocityBadge/VelocityBadge.types.ts +3 -0
  324. package/packages/web/components/VelocityBadge/index.ts +2 -0
  325. package/packages/web/components/VelocityCard/VelocityCard.tsx +71 -0
  326. package/packages/web/components/VelocityCard/VelocityCard.types.ts +7 -0
  327. package/packages/web/components/VelocityCard/index.ts +2 -0
  328. package/packages/web/components/WeeklySparkline/WeeklySparkline.tsx +13 -0
  329. package/packages/web/components/WeeklySparkline/WeeklySparkline.types.ts +3 -0
  330. package/packages/web/components/WeeklySparkline/index.ts +2 -0
  331. package/packages/web/components/ui/input.tsx +21 -0
  332. package/packages/web/components/ui/tooltip.tsx +2 -2
  333. package/packages/web/context/TerminalTabsContext.tsx +46 -1
  334. package/packages/web/hooks/useClaudeTerminal.ts +71 -21
  335. package/packages/web/hooks/useProjectStats.ts +55 -0
  336. package/packages/web/hooks/useProjects.ts +6 -6
  337. package/packages/web/lib/actions/projects.ts +15 -0
  338. package/packages/web/lib/json-loader.ts +630 -0
  339. package/packages/web/lib/services/index.ts +9 -0
  340. package/packages/web/lib/services/migration.server.ts +598 -0
  341. package/packages/web/lib/services/projects.server.ts +52 -0
  342. package/packages/web/lib/services/stats.server.ts +264 -0
  343. package/packages/web/lib/unified-loader.ts +396 -0
  344. package/packages/web/next-env.d.ts +1 -1
  345. package/packages/web/package.json +10 -6
  346. package/packages/web/server.ts +36 -6
  347. package/templates/commands/done.md +76 -32
  348. package/templates/commands/feature.md +121 -47
  349. package/templates/commands/idea.md +81 -8
  350. package/templates/commands/now.md +41 -17
  351. package/templates/commands/ship.md +64 -25
  352. package/templates/commands/sync.md +28 -3
  353. package/core/agentic/agent-router.js +0 -128
  354. package/core/agentic/chain-of-thought.js +0 -578
  355. package/core/agentic/command-executor.js +0 -421
  356. package/core/agentic/context-filter.js +0 -354
  357. package/core/agentic/ground-truth.js +0 -591
  358. package/core/agentic/loop-detector.js +0 -406
  359. package/core/agentic/memory-system.js +0 -850
  360. package/core/agentic/parallel-tools.js +0 -366
  361. package/core/agentic/plan-mode.js +0 -572
  362. package/core/agentic/prompt-builder.js +0 -338
  363. package/core/agentic/response-templates.js +0 -290
  364. package/core/agentic/semantic-compression.js +0 -517
  365. package/core/agentic/think-blocks.js +0 -657
  366. package/core/agentic/tool-registry.js +0 -184
  367. package/core/agentic/validation-rules.js +0 -380
  368. package/core/command-registry.js +0 -698
  369. package/core/commands.js +0 -2237
  370. package/core/domain/task-stack.js +0 -497
  371. package/core/infrastructure/legacy-installer-detector.js +0 -546
  372. package/core/infrastructure/migrator.js +0 -799
  373. package/core/infrastructure/session-manager.js +0 -390
  374. package/core/utils/file-helper.js +0 -329
  375. package/packages/web/app/api/projects/[id]/delete/route.ts +0 -21
  376. package/packages/web/app/api/stats/route.ts +0 -38
  377. package/packages/web/components/AppSidebar.tsx +0 -113
  378. package/packages/web/hooks/useStats.ts +0 -28
  379. /package/packages/web/components/{CommandButton.tsx → CommandButton/CommandButton.tsx} +0 -0
  380. /package/packages/web/components/{ConnectionStatus.tsx → ConnectionStatus/ConnectionStatus.tsx} +0 -0
  381. /package/packages/web/components/{Logo.tsx → Logo/Logo.tsx} +0 -0
  382. /package/packages/web/components/{MarkdownContent.tsx → MarkdownContent/MarkdownContent.tsx} +0 -0
  383. /package/packages/web/components/{ProjectAvatar.tsx → ProjectAvatar/ProjectAvatar.tsx} +0 -0
  384. /package/packages/web/components/{providers.tsx → Providers/Providers.tsx} +0 -0
  385. /package/packages/web/components/{TechStackBadges.tsx → TechStackBadges/TechStackBadges.tsx} +0 -0
@@ -1,517 +0,0 @@
1
- /**
2
- * Semantic Compression
3
- *
4
- * Compresses raw data into semantic summaries to reduce token usage.
5
- * Instead of loading full files, provides insights.
6
- *
7
- * OPTIMIZATION (P2.3): Semantic Compression
8
- * - Summarizers for each data type
9
- * - 70% less tokens for same insight
10
- * - Metrics tracking
11
- *
12
- * Source: Cursor, Windsurf, Kiro patterns
13
- */
14
-
15
- class SemanticCompression {
16
- constructor() {
17
- // Track compression metrics
18
- this.metrics = {
19
- totalOriginalTokens: 0,
20
- totalCompressedTokens: 0,
21
- compressions: 0
22
- }
23
- }
24
-
25
- /**
26
- * Compress any content based on type
27
- * @param {string} content - Raw content
28
- * @param {string} type - Content type (session, shipped, metrics, queue, ideas, roadmap)
29
- * @returns {Object} Compressed summary
30
- */
31
- compress(content, type) {
32
- if (!content || content.trim() === '') {
33
- return { summary: 'Empty', tokens: { original: 0, compressed: 0 } }
34
- }
35
-
36
- const compressor = this._getCompressor(type)
37
- const result = compressor.call(this, content)
38
-
39
- // Track metrics
40
- const originalTokens = this._estimateTokens(content)
41
- const compressedTokens = this._estimateTokens(
42
- typeof result === 'string' ? result : JSON.stringify(result)
43
- )
44
-
45
- this.metrics.totalOriginalTokens += originalTokens
46
- this.metrics.totalCompressedTokens += compressedTokens
47
- this.metrics.compressions++
48
-
49
- return {
50
- ...result,
51
- tokens: {
52
- original: originalTokens,
53
- compressed: compressedTokens,
54
- reduction: Math.round((1 - compressedTokens / originalTokens) * 100)
55
- }
56
- }
57
- }
58
-
59
- /**
60
- * Get appropriate compressor for type
61
- * @private
62
- */
63
- _getCompressor(type) {
64
- const compressors = {
65
- session: this._compressSession,
66
- shipped: this._compressShipped,
67
- metrics: this._compressMetrics,
68
- queue: this._compressQueue,
69
- ideas: this._compressIdeas,
70
- roadmap: this._compressRoadmap,
71
- now: this._compressNow,
72
- history: this._compressHistory,
73
- spec: this._compressSpec,
74
- default: this._compressGeneric
75
- }
76
- return compressors[type] || compressors.default
77
- }
78
-
79
- /**
80
- * Compress session JSONL data
81
- * @private
82
- */
83
- _compressSession(content) {
84
- const lines = content.split('\n').filter(l => l.trim())
85
- const entries = lines.map(l => {
86
- try { return JSON.parse(l) }
87
- catch { return null }
88
- }).filter(Boolean)
89
-
90
- if (entries.length === 0) {
91
- return { summary: 'No session data', entries: 0 }
92
- }
93
-
94
- // Group by type
95
- const byType = {}
96
- entries.forEach(e => {
97
- const type = e.type || 'unknown'
98
- byType[type] = (byType[type] || 0) + 1
99
- })
100
-
101
- // Calculate time range
102
- const timestamps = entries.map(e => new Date(e.ts)).filter(d => !isNaN(d))
103
- const earliest = timestamps.length ? new Date(Math.min(...timestamps)) : null
104
- const latest = timestamps.length ? new Date(Math.max(...timestamps)) : null
105
-
106
- // Calculate duration
107
- let duration = 'N/A'
108
- if (earliest && latest) {
109
- const diffMs = latest - earliest
110
- const hours = Math.floor(diffMs / (1000 * 60 * 60))
111
- const minutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60))
112
- duration = hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`
113
- }
114
-
115
- return {
116
- summary: `${entries.length} entries over ${duration}`,
117
- entries: entries.length,
118
- byType,
119
- timeRange: { start: earliest?.toISOString(), end: latest?.toISOString() },
120
- duration
121
- }
122
- }
123
-
124
- /**
125
- * Compress shipped.md content
126
- * @private
127
- */
128
- _compressShipped(content) {
129
- const lines = content.split('\n')
130
-
131
- // Count shipped items
132
- const shipped = lines.filter(l => l.match(/^[-*]\s+/)).length
133
-
134
- // Extract dates
135
- const dateMatches = content.match(/\d{4}-\d{2}-\d{2}/g) || []
136
- const uniqueDates = [...new Set(dateMatches)].sort()
137
-
138
- // Detect recent activity
139
- const today = new Date().toISOString().split('T')[0]
140
- const hasToday = uniqueDates.includes(today)
141
-
142
- // Calculate velocity (ships per week)
143
- let velocity = 0
144
- if (uniqueDates.length > 0) {
145
- const firstDate = new Date(uniqueDates[0])
146
- const lastDate = new Date(uniqueDates[uniqueDates.length - 1])
147
- const weeks = Math.max(1, (lastDate - firstDate) / (1000 * 60 * 60 * 24 * 7))
148
- velocity = Math.round(shipped / weeks * 10) / 10
149
- }
150
-
151
- return {
152
- summary: `${shipped} shipped | ${velocity}/week`,
153
- shipped,
154
- dates: uniqueDates.length,
155
- velocity,
156
- recentActivity: hasToday,
157
- dateRange: {
158
- first: uniqueDates[0] || null,
159
- last: uniqueDates[uniqueDates.length - 1] || null
160
- }
161
- }
162
- }
163
-
164
- /**
165
- * Compress metrics.md content
166
- * @private
167
- */
168
- _compressMetrics(content) {
169
- // Extract key metrics using patterns
170
- const patterns = {
171
- totalTasks: /total[:\s]+(\d+)/i,
172
- completed: /completed[:\s]+(\d+)/i,
173
- velocity: /velocity[:\s]+([\d.]+)/i,
174
- streak: /streak[:\s]+(\d+)/i,
175
- avgTime: /average[:\s]+([\d.]+\s*[hm])/i
176
- }
177
-
178
- const metrics = {}
179
- for (const [key, pattern] of Object.entries(patterns)) {
180
- const match = content.match(pattern)
181
- if (match) {
182
- metrics[key] = match[1]
183
- }
184
- }
185
-
186
- // Determine momentum
187
- let momentum = 'medium'
188
- if (metrics.streak && parseInt(metrics.streak) > 5) momentum = 'high'
189
- else if (metrics.streak && parseInt(metrics.streak) < 2) momentum = 'low'
190
-
191
- return {
192
- summary: `${metrics.completed || '?'} done | Momentum: ${momentum}`,
193
- metrics,
194
- momentum
195
- }
196
- }
197
-
198
- /**
199
- * Compress queue (next.md) content
200
- * @private
201
- */
202
- _compressQueue(content) {
203
- const lines = content.split('\n')
204
-
205
- // Count tasks by status
206
- const pending = (content.match(/- \[ \]/g) || []).length
207
- const done = (content.match(/- \[x\]/gi) || []).length
208
- const total = pending + done
209
-
210
- // Extract priorities
211
- const urgent = lines.filter(l =>
212
- l.toLowerCase().includes('urgent') ||
213
- l.toLowerCase().includes('critical') ||
214
- l.includes('🔥') ||
215
- l.includes('🚨')
216
- ).length
217
-
218
- // Get top 3 items
219
- const taskLines = lines.filter(l => l.match(/^[-*]\s+\[[ x]\]/))
220
- const top3 = taskLines.slice(0, 3).map(l =>
221
- l.replace(/^[-*]\s+\[[ x]\]\s*/, '').trim().substring(0, 40)
222
- )
223
-
224
- return {
225
- summary: `${pending} pending | ${urgent} urgent`,
226
- total,
227
- pending,
228
- done,
229
- urgent,
230
- top3,
231
- percentComplete: total > 0 ? Math.round(done / total * 100) : 0
232
- }
233
- }
234
-
235
- /**
236
- * Compress ideas.md content
237
- * @private
238
- */
239
- _compressIdeas(content) {
240
- // Count ideas by section
241
- const sections = content.split(/^##\s+/m).filter(Boolean)
242
- const ideaCount = (content.match(/^###\s+/gm) || []).length
243
-
244
- // Detect priorities
245
- const highPriority = (content.match(/🔥|HIGH|CRITICAL|URGENT/gi) || []).length
246
- const hasRecent = content.includes(new Date().toISOString().split('T')[0])
247
-
248
- // Extract categories
249
- const categories = sections.map(s => s.split('\n')[0].trim()).filter(Boolean)
250
-
251
- return {
252
- summary: `${ideaCount} ideas | ${highPriority} high priority`,
253
- ideaCount,
254
- highPriority,
255
- categories: categories.slice(0, 5),
256
- hasRecentIdeas: hasRecent
257
- }
258
- }
259
-
260
- /**
261
- * Compress roadmap.md content
262
- * @private
263
- */
264
- _compressRoadmap(content) {
265
- // Extract phases
266
- const phases = content.match(/^##\s+Phase\s+\d+/gim) || []
267
-
268
- // Detect status markers
269
- const completed = (content.match(/✅|COMPLETED?|DONE/gi) || []).length
270
- const inProgress = (content.match(/🔄|IN.?PROGRESS|CURRENT/gi) || []).length
271
- const planned = (content.match(/📋|PLANNED|TODO/gi) || []).length
272
-
273
- // Extract current phase
274
- let currentPhase = 'Unknown'
275
- const currentMatch = content.match(/##\s+(Phase\s+\d+[^#\n]*)/i)
276
- if (currentMatch) {
277
- currentPhase = currentMatch[1].trim()
278
- }
279
-
280
- // Calculate progress
281
- const total = completed + inProgress + planned
282
- const progress = total > 0 ? Math.round(completed / total * 100) : 0
283
-
284
- return {
285
- summary: `${phases.length} phases | ${progress}% complete`,
286
- phases: phases.length,
287
- status: { completed, inProgress, planned },
288
- currentPhase,
289
- progress
290
- }
291
- }
292
-
293
- /**
294
- * Compress now.md content
295
- * @private
296
- */
297
- _compressNow(content) {
298
- if (!content || content.trim() === '') {
299
- return { summary: 'No active task', hasTask: false }
300
- }
301
-
302
- // Extract task name
303
- let taskName = ''
304
- const boldMatch = content.match(/\*\*([^*]+)\*\*/)
305
- const headerMatch = content.match(/^#\s+(.+)$/m)
306
-
307
- if (boldMatch) taskName = boldMatch[1]
308
- else if (headerMatch) taskName = headerMatch[1]
309
- else taskName = content.split('\n')[0].substring(0, 50)
310
-
311
- // Extract start time
312
- const timeMatch = content.match(/Started:\s*(\d{4}-\d{2}-\d{2}T[\d:]+)/i)
313
- let duration = ''
314
- if (timeMatch) {
315
- const start = new Date(timeMatch[1])
316
- const now = new Date()
317
- const diffMs = now - start
318
- const hours = Math.floor(diffMs / (1000 * 60 * 60))
319
- const minutes = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60))
320
- duration = hours > 0 ? `${hours}h ${minutes}m` : `${minutes}m`
321
- }
322
-
323
- // Extract agent if present
324
- const agentMatch = content.match(/Agent:\s*(\w+)/i)
325
-
326
- return {
327
- summary: `🎯 ${taskName.substring(0, 30)}${duration ? ` (${duration})` : ''}`,
328
- hasTask: true,
329
- taskName,
330
- duration,
331
- agent: agentMatch ? agentMatch[1] : null
332
- }
333
- }
334
-
335
- /**
336
- * Compress JSONL history content
337
- * @private
338
- */
339
- _compressHistory(content) {
340
- const lines = content.split('\n').filter(l => l.trim())
341
- const entries = lines.map(l => {
342
- try { return JSON.parse(l) }
343
- catch { return null }
344
- }).filter(Boolean)
345
-
346
- if (entries.length === 0) {
347
- return { summary: 'No history', entries: 0 }
348
- }
349
-
350
- // Get last 5 entries summary
351
- const recent = entries.slice(-5).map(e => ({
352
- type: e.type,
353
- ts: e.ts
354
- }))
355
-
356
- // Count by type
357
- const byType = {}
358
- entries.forEach(e => {
359
- const type = e.type || 'unknown'
360
- byType[type] = (byType[type] || 0) + 1
361
- })
362
-
363
- return {
364
- summary: `${entries.length} events`,
365
- entries: entries.length,
366
- recent,
367
- byType,
368
- lastEntry: entries[entries.length - 1]?.ts || null
369
- }
370
- }
371
-
372
- /**
373
- * Compress spec file content
374
- * @private
375
- */
376
- _compressSpec(content) {
377
- if (!content || content.trim() === '') {
378
- return { summary: 'No spec content', hasSpec: false }
379
- }
380
-
381
- const lines = content.split('\n')
382
-
383
- // Extract spec name from header
384
- const headerMatch = content.match(/^#\s+(.+)$/m)
385
- const specName = headerMatch ? headerMatch[1] : 'Unnamed Spec'
386
-
387
- // Count sections
388
- const sections = (content.match(/^##\s+/gm) || []).length
389
-
390
- // Extract requirements count
391
- const requirements = lines.filter(l =>
392
- l.match(/^[-*]\s+/) && !l.match(/\[[ x]\]/)
393
- ).length
394
-
395
- // Extract tasks count (checkboxes)
396
- const tasks = (content.match(/- \[ \]/g) || []).length
397
- const completedTasks = (content.match(/- \[x\]/gi) || []).length
398
- const totalTasks = tasks + completedTasks
399
-
400
- // Detect status markers
401
- const hasApproval = content.toLowerCase().includes('approved')
402
- const hasDraft = content.toLowerCase().includes('draft')
403
- const hasBlocked = content.toLowerCase().includes('blocked')
404
-
405
- // Determine status
406
- let status = 'draft'
407
- if (hasApproval) status = 'approved'
408
- else if (hasBlocked) status = 'blocked'
409
- else if (hasDraft) status = 'draft'
410
-
411
- // Extract design decisions count
412
- const decisions = (content.match(/^###\s+/gm) || []).length
413
-
414
- // Calculate progress
415
- const progress = totalTasks > 0
416
- ? Math.round(completedTasks / totalTasks * 100)
417
- : 0
418
-
419
- return {
420
- summary: `📋 ${specName} | ${sections} sections | ${totalTasks} tasks (${progress}%)`,
421
- hasSpec: true,
422
- specName,
423
- sections,
424
- requirements,
425
- tasks: totalTasks,
426
- completedTasks,
427
- decisions,
428
- status,
429
- progress
430
- }
431
- }
432
-
433
- /**
434
- * Generic compression for unknown types
435
- * @private
436
- */
437
- _compressGeneric(content) {
438
- const lines = content.split('\n')
439
- const nonEmpty = lines.filter(l => l.trim()).length
440
-
441
- return {
442
- summary: `${nonEmpty} lines`,
443
- lines: lines.length,
444
- nonEmpty,
445
- preview: content.substring(0, 100).replace(/\n/g, ' ')
446
- }
447
- }
448
-
449
- /**
450
- * Estimate token count (rough approximation)
451
- * ~4 characters per token for English text
452
- * @private
453
- */
454
- _estimateTokens(text) {
455
- if (!text) return 0
456
- return Math.ceil(text.length / 4)
457
- }
458
-
459
- /**
460
- * Get compression metrics
461
- * @returns {Object}
462
- */
463
- getMetrics() {
464
- const reduction = this.metrics.totalOriginalTokens > 0
465
- ? Math.round((1 - this.metrics.totalCompressedTokens / this.metrics.totalOriginalTokens) * 100)
466
- : 0
467
-
468
- return {
469
- ...this.metrics,
470
- reductionPercent: reduction,
471
- averageReduction: this.metrics.compressions > 0
472
- ? Math.round(reduction / this.metrics.compressions)
473
- : 0
474
- }
475
- }
476
-
477
- /**
478
- * Reset metrics
479
- */
480
- resetMetrics() {
481
- this.metrics = {
482
- totalOriginalTokens: 0,
483
- totalCompressedTokens: 0,
484
- compressions: 0
485
- }
486
- }
487
-
488
- /**
489
- * Compress multiple contents at once
490
- * @param {Object} contents - Map of type -> content
491
- * @returns {Object} Map of type -> compressed
492
- */
493
- compressAll(contents) {
494
- const result = {}
495
- for (const [type, content] of Object.entries(contents)) {
496
- result[type] = this.compress(content, type)
497
- }
498
- return result
499
- }
500
-
501
- /**
502
- * Format compressed data for context
503
- * @param {Object} compressed - Result from compress()
504
- * @returns {string}
505
- */
506
- format(compressed) {
507
- if (!compressed) return ''
508
-
509
- if (typeof compressed.summary === 'string') {
510
- return compressed.summary
511
- }
512
-
513
- return JSON.stringify(compressed, null, 2)
514
- }
515
- }
516
-
517
- module.exports = new SemanticCompression()