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,376 @@
1
+ /**
2
+ * State Manager
3
+ *
4
+ * Manages unified project state with atomic read/write operations.
5
+ * Replaces scattered file reads with single state.json access.
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
+ ProjectState,
13
+ CurrentTask,
14
+ QueuedTask,
15
+ ActiveFeature,
16
+ PerformanceStats,
17
+ RecentActivity,
18
+ StateUpdate,
19
+ } from './types'
20
+ import { DEFAULT_STATE } from './types'
21
+
22
+ const STATE_FILENAME = 'state.json'
23
+ const MAX_RECENT_ACTIVITY = 10
24
+
25
+ /**
26
+ * StateManager - Single source of truth for project state.
27
+ */
28
+ export class StateManager {
29
+ private cache: Map<string, ProjectState> = new Map()
30
+ private cacheTimeout = 5000 // 5 seconds
31
+ private lastRead: Map<string, number> = new Map()
32
+
33
+ /**
34
+ * Get state file path for a project.
35
+ */
36
+ private getStatePath(projectId: string): string {
37
+ const globalPath = pathManager.getGlobalProjectPath(projectId)
38
+ return path.join(globalPath, 'core', STATE_FILENAME)
39
+ }
40
+
41
+ /**
42
+ * Read project state.
43
+ * Uses cache if available and fresh.
44
+ */
45
+ async read(projectId: string): Promise<ProjectState> {
46
+ const now = Date.now()
47
+ const lastReadTime = this.lastRead.get(projectId) || 0
48
+
49
+ // Return cached if fresh
50
+ if (now - lastReadTime < this.cacheTimeout && this.cache.has(projectId)) {
51
+ return this.cache.get(projectId)!
52
+ }
53
+
54
+ const statePath = this.getStatePath(projectId)
55
+ const state = await fileHelper.readJson<ProjectState>(statePath, {
56
+ ...DEFAULT_STATE,
57
+ projectId,
58
+ })
59
+
60
+ // Update cache
61
+ this.cache.set(projectId, state)
62
+ this.lastRead.set(projectId, now)
63
+
64
+ return state
65
+ }
66
+
67
+ /**
68
+ * Write project state atomically.
69
+ */
70
+ async write(projectId: string, state: ProjectState): Promise<void> {
71
+ const statePath = this.getStatePath(projectId)
72
+
73
+ // Ensure directory exists
74
+ await fileHelper.ensureDir(path.dirname(statePath))
75
+
76
+ // Update lastSync
77
+ const updatedState: ProjectState = {
78
+ ...state,
79
+ lastSync: new Date().toISOString(),
80
+ }
81
+
82
+ await fileHelper.writeJson(statePath, updatedState)
83
+
84
+ // Update cache
85
+ this.cache.set(projectId, updatedState)
86
+ this.lastRead.set(projectId, Date.now())
87
+ }
88
+
89
+ /**
90
+ * Apply an update to project state.
91
+ */
92
+ async update(projectId: string, update: StateUpdate): Promise<ProjectState> {
93
+ const state = await this.read(projectId)
94
+ const newState = this.applyUpdate(state, update)
95
+ await this.write(projectId, newState)
96
+ return newState
97
+ }
98
+
99
+ /**
100
+ * Apply multiple updates atomically.
101
+ */
102
+ async batchUpdate(projectId: string, updates: StateUpdate[]): Promise<ProjectState> {
103
+ let state = await this.read(projectId)
104
+ for (const update of updates) {
105
+ state = this.applyUpdate(state, update)
106
+ }
107
+ await this.write(projectId, state)
108
+ return state
109
+ }
110
+
111
+ /**
112
+ * Apply a single update to state.
113
+ */
114
+ private applyUpdate(state: ProjectState, update: StateUpdate): ProjectState {
115
+ switch (update.type) {
116
+ case 'SET_CURRENT_TASK':
117
+ return { ...state, currentTask: update.task }
118
+
119
+ case 'ADD_TO_QUEUE':
120
+ return {
121
+ ...state,
122
+ queue: [...state.queue, update.task].sort((a, b) => {
123
+ const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 }
124
+ return priorityOrder[a.priority] - priorityOrder[b.priority]
125
+ }),
126
+ }
127
+
128
+ case 'REMOVE_FROM_QUEUE':
129
+ return {
130
+ ...state,
131
+ queue: state.queue.filter((t) => t.id !== update.taskId),
132
+ }
133
+
134
+ case 'UPDATE_QUEUE_TASK':
135
+ return {
136
+ ...state,
137
+ queue: state.queue.map((t) =>
138
+ t.id === update.taskId ? { ...t, ...update.updates } : t
139
+ ),
140
+ }
141
+
142
+ case 'SET_ACTIVE_FEATURE':
143
+ return { ...state, activeFeature: update.feature }
144
+
145
+ case 'UPDATE_STATS':
146
+ return {
147
+ ...state,
148
+ stats: { ...state.stats, ...update.stats },
149
+ }
150
+
151
+ case 'ADD_ACTIVITY':
152
+ return {
153
+ ...state,
154
+ recentActivity: [update.activity, ...state.recentActivity].slice(
155
+ 0,
156
+ MAX_RECENT_ACTIVITY
157
+ ),
158
+ }
159
+
160
+ case 'SYNC':
161
+ return { ...state, lastSync: new Date().toISOString() }
162
+
163
+ default:
164
+ return state
165
+ }
166
+ }
167
+
168
+ // =========== Convenience Methods ===========
169
+
170
+ /**
171
+ * Start a new task.
172
+ */
173
+ async startTask(
174
+ projectId: string,
175
+ task: Omit<CurrentTask, 'startedAt'>
176
+ ): Promise<ProjectState> {
177
+ const currentTask: CurrentTask = {
178
+ ...task,
179
+ startedAt: new Date().toISOString(),
180
+ }
181
+
182
+ return this.batchUpdate(projectId, [
183
+ { type: 'SET_CURRENT_TASK', task: currentTask },
184
+ {
185
+ type: 'ADD_ACTIVITY',
186
+ activity: {
187
+ type: 'session_started',
188
+ description: task.description,
189
+ timestamp: new Date().toISOString(),
190
+ },
191
+ },
192
+ ])
193
+ }
194
+
195
+ /**
196
+ * Complete the current task.
197
+ */
198
+ async completeTask(projectId: string, duration: string): Promise<ProjectState> {
199
+ const state = await this.read(projectId)
200
+ if (!state.currentTask) {
201
+ throw new Error('No active task to complete')
202
+ }
203
+
204
+ const activity: RecentActivity = {
205
+ type: 'task_completed',
206
+ description: state.currentTask.description,
207
+ timestamp: new Date().toISOString(),
208
+ duration,
209
+ }
210
+
211
+ // Update feature progress if linked
212
+ let featureUpdate: StateUpdate | null = null
213
+ if (state.activeFeature && state.currentTask.featureId === state.activeFeature.id) {
214
+ featureUpdate = {
215
+ type: 'SET_ACTIVE_FEATURE',
216
+ feature: {
217
+ ...state.activeFeature,
218
+ tasksCompleted: state.activeFeature.tasksCompleted + 1,
219
+ tasksRemaining: Math.max(0, state.activeFeature.tasksRemaining - 1),
220
+ },
221
+ }
222
+ }
223
+
224
+ const updates: StateUpdate[] = [
225
+ { type: 'SET_CURRENT_TASK', task: null },
226
+ { type: 'ADD_ACTIVITY', activity },
227
+ {
228
+ type: 'UPDATE_STATS',
229
+ stats: { tasksToday: state.stats.tasksToday + 1 },
230
+ },
231
+ ]
232
+
233
+ if (featureUpdate) {
234
+ updates.push(featureUpdate)
235
+ }
236
+
237
+ return this.batchUpdate(projectId, updates)
238
+ }
239
+
240
+ /**
241
+ * Pause the current task.
242
+ */
243
+ async pauseTask(projectId: string, reason?: string): Promise<ProjectState> {
244
+ const state = await this.read(projectId)
245
+ if (!state.currentTask) {
246
+ throw new Error('No active task to pause')
247
+ }
248
+
249
+ const pausedTask: CurrentTask = {
250
+ ...state.currentTask,
251
+ pausedAt: new Date().toISOString(),
252
+ pauseReason: reason,
253
+ }
254
+
255
+ return this.update(projectId, { type: 'SET_CURRENT_TASK', task: pausedTask })
256
+ }
257
+
258
+ /**
259
+ * Resume a paused task.
260
+ */
261
+ async resumeTask(projectId: string): Promise<ProjectState> {
262
+ const state = await this.read(projectId)
263
+ if (!state.currentTask || !state.currentTask.pausedAt) {
264
+ throw new Error('No paused task to resume')
265
+ }
266
+
267
+ const resumedTask: CurrentTask = {
268
+ ...state.currentTask,
269
+ pausedAt: undefined,
270
+ pauseReason: undefined,
271
+ }
272
+
273
+ return this.update(projectId, { type: 'SET_CURRENT_TASK', task: resumedTask })
274
+ }
275
+
276
+ /**
277
+ * Add a task to the queue.
278
+ */
279
+ async addToQueue(
280
+ projectId: string,
281
+ task: Omit<QueuedTask, 'id' | 'createdAt'>
282
+ ): Promise<ProjectState> {
283
+ const queuedTask: QueuedTask = {
284
+ ...task,
285
+ id: `task_${Date.now()}`,
286
+ createdAt: new Date().toISOString(),
287
+ }
288
+
289
+ return this.update(projectId, { type: 'ADD_TO_QUEUE', task: queuedTask })
290
+ }
291
+
292
+ /**
293
+ * Get the next task from queue.
294
+ */
295
+ async getNextTask(projectId: string): Promise<QueuedTask | null> {
296
+ const state = await this.read(projectId)
297
+ return state.queue.find((t) => t.blockedReason === undefined) || null
298
+ }
299
+
300
+ /**
301
+ * Start a feature.
302
+ */
303
+ async startFeature(
304
+ projectId: string,
305
+ feature: Omit<ActiveFeature, 'startedAt' | 'tasksCompleted' | 'status'>
306
+ ): Promise<ProjectState> {
307
+ const activeFeature: ActiveFeature = {
308
+ ...feature,
309
+ status: 'in_progress',
310
+ tasksCompleted: 0,
311
+ startedAt: new Date().toISOString(),
312
+ }
313
+
314
+ return this.update(projectId, { type: 'SET_ACTIVE_FEATURE', feature: activeFeature })
315
+ }
316
+
317
+ /**
318
+ * Ship a feature.
319
+ */
320
+ async shipFeature(projectId: string): Promise<ProjectState> {
321
+ const state = await this.read(projectId)
322
+ if (!state.activeFeature) {
323
+ throw new Error('No active feature to ship')
324
+ }
325
+
326
+ const activity: RecentActivity = {
327
+ type: 'feature_shipped',
328
+ description: state.activeFeature.name,
329
+ timestamp: new Date().toISOString(),
330
+ }
331
+
332
+ return this.batchUpdate(projectId, [
333
+ { type: 'SET_ACTIVE_FEATURE', feature: null },
334
+ { type: 'ADD_ACTIVITY', activity },
335
+ ])
336
+ }
337
+
338
+ /**
339
+ * Clear cache for a project.
340
+ */
341
+ clearCache(projectId?: string): void {
342
+ if (projectId) {
343
+ this.cache.delete(projectId)
344
+ this.lastRead.delete(projectId)
345
+ } else {
346
+ this.cache.clear()
347
+ this.lastRead.clear()
348
+ }
349
+ }
350
+
351
+ /**
352
+ * Check if project has state file.
353
+ */
354
+ async exists(projectId: string): Promise<boolean> {
355
+ const statePath = this.getStatePath(projectId)
356
+ return fileHelper.fileExists(statePath)
357
+ }
358
+
359
+ /**
360
+ * Initialize state for a new project.
361
+ */
362
+ async initialize(projectId: string): Promise<ProjectState> {
363
+ const initialState: ProjectState = {
364
+ ...DEFAULT_STATE,
365
+ projectId,
366
+ lastSync: new Date().toISOString(),
367
+ }
368
+
369
+ await this.write(projectId, initialState)
370
+ return initialState
371
+ }
372
+ }
373
+
374
+ // Singleton instance
375
+ const stateManager = new StateManager()
376
+ export default stateManager
@@ -0,0 +1,185 @@
1
+ /**
2
+ * State Types
3
+ *
4
+ * Unified project state that replaces scattered files.
5
+ * This is the single source of truth for project status.
6
+ */
7
+
8
+ /**
9
+ * Priority levels for tasks.
10
+ */
11
+ export type Priority = 'low' | 'medium' | 'high' | 'critical'
12
+
13
+ /**
14
+ * Task status values.
15
+ */
16
+ export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'blocked' | 'paused'
17
+
18
+ /**
19
+ * Feature status values.
20
+ */
21
+ export type FeatureStatus = 'planned' | 'in_progress' | 'completed' | 'shipped'
22
+
23
+ /**
24
+ * A task in the queue.
25
+ */
26
+ export interface QueuedTask {
27
+ /** Unique task ID */
28
+ id: string
29
+ /** Task description */
30
+ description: string
31
+ /** Priority level */
32
+ priority: Priority
33
+ /** Related feature (if any) */
34
+ featureId?: string
35
+ /** Estimated duration (e.g., "2h", "30m") */
36
+ estimatedDuration?: string
37
+ /** Tags for categorization */
38
+ tags?: string[]
39
+ /** When task was added */
40
+ createdAt: string
41
+ /** Blocking reason if blocked */
42
+ blockedReason?: string
43
+ }
44
+
45
+ /**
46
+ * The currently active task.
47
+ */
48
+ export interface CurrentTask {
49
+ /** Unique task ID */
50
+ id: string
51
+ /** Task description */
52
+ description: string
53
+ /** When task started */
54
+ startedAt: string
55
+ /** Assigned agent */
56
+ agent?: string
57
+ /** Agent confidence (0-1) */
58
+ agentConfidence?: number
59
+ /** Estimated duration */
60
+ estimatedDuration?: string
61
+ /** Related feature */
62
+ featureId?: string
63
+ /** Paused state info */
64
+ pausedAt?: string
65
+ /** Reason for pause */
66
+ pauseReason?: string
67
+ }
68
+
69
+ /**
70
+ * Active feature being worked on.
71
+ */
72
+ export interface ActiveFeature {
73
+ /** Feature ID */
74
+ id: string
75
+ /** Feature name */
76
+ name: string
77
+ /** Current status */
78
+ status: FeatureStatus
79
+ /** Tasks completed for this feature */
80
+ tasksCompleted: number
81
+ /** Tasks remaining */
82
+ tasksRemaining: number
83
+ /** Total estimated effort */
84
+ estimatedEffort?: string
85
+ /** Actual effort so far */
86
+ actualEffort?: string
87
+ /** When feature was started */
88
+ startedAt: string
89
+ }
90
+
91
+ /**
92
+ * Performance statistics.
93
+ */
94
+ export interface PerformanceStats {
95
+ /** Tasks completed today */
96
+ tasksToday: number
97
+ /** Tasks completed this week */
98
+ tasksThisWeek: number
99
+ /** Average task duration */
100
+ avgDuration: string
101
+ /** Tasks per day velocity */
102
+ velocity: string
103
+ /** Estimate accuracy percentage (0-100) */
104
+ estimateAccuracy: number
105
+ /** Streak of consecutive productive days */
106
+ streak: number
107
+ }
108
+
109
+ /**
110
+ * Recent activity entry.
111
+ */
112
+ export interface RecentActivity {
113
+ /** Activity type */
114
+ type: 'task_completed' | 'feature_shipped' | 'idea_captured' | 'session_started'
115
+ /** Description */
116
+ description: string
117
+ /** When it happened */
118
+ timestamp: string
119
+ /** Duration if applicable */
120
+ duration?: string
121
+ }
122
+
123
+ /**
124
+ * Unified project state.
125
+ * This replaces reading from now.md, next.md, roadmap.md, etc.
126
+ */
127
+ export interface ProjectState {
128
+ /** Project ID */
129
+ projectId: string
130
+
131
+ /** Currently active task (null if none) */
132
+ currentTask: CurrentTask | null
133
+
134
+ /** Task queue (priority ordered) */
135
+ queue: QueuedTask[]
136
+
137
+ /** Active feature being worked on */
138
+ activeFeature: ActiveFeature | null
139
+
140
+ /** Performance statistics */
141
+ stats: PerformanceStats
142
+
143
+ /** Recent activity (last 10 items) */
144
+ recentActivity: RecentActivity[]
145
+
146
+ /** When state was last synced */
147
+ lastSync: string
148
+
149
+ /** State version for migrations */
150
+ version: number
151
+ }
152
+
153
+ /**
154
+ * Default empty state.
155
+ */
156
+ export const DEFAULT_STATE: ProjectState = {
157
+ projectId: '',
158
+ currentTask: null,
159
+ queue: [],
160
+ activeFeature: null,
161
+ stats: {
162
+ tasksToday: 0,
163
+ tasksThisWeek: 0,
164
+ avgDuration: '0h',
165
+ velocity: '0',
166
+ estimateAccuracy: 0,
167
+ streak: 0,
168
+ },
169
+ recentActivity: [],
170
+ lastSync: new Date().toISOString(),
171
+ version: 1,
172
+ }
173
+
174
+ /**
175
+ * State update operations.
176
+ */
177
+ export type StateUpdate =
178
+ | { type: 'SET_CURRENT_TASK'; task: CurrentTask | null }
179
+ | { type: 'ADD_TO_QUEUE'; task: QueuedTask }
180
+ | { type: 'REMOVE_FROM_QUEUE'; taskId: string }
181
+ | { type: 'UPDATE_QUEUE_TASK'; taskId: string; updates: Partial<QueuedTask> }
182
+ | { type: 'SET_ACTIVE_FEATURE'; feature: ActiveFeature | null }
183
+ | { type: 'UPDATE_STATS'; stats: Partial<PerformanceStats> }
184
+ | { type: 'ADD_ACTIVITY'; activity: RecentActivity }
185
+ | { type: 'SYNC' }
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "CommonJS",
5
+ "moduleResolution": "node",
6
+ "lib": ["ES2022"],
7
+ "strict": true,
8
+ "noEmit": true,
9
+ "skipLibCheck": true,
10
+ "esModuleInterop": true,
11
+ "allowSyntheticDefaultImports": true,
12
+ "resolveJsonModule": true,
13
+ "declaration": false,
14
+ "outDir": "./dist",
15
+ "rootDir": ".",
16
+ "types": ["bun-types"],
17
+ "allowJs": true,
18
+ "checkJs": false
19
+ },
20
+ "include": ["./**/*.ts", "./**/*.js"],
21
+ "exclude": ["node_modules", "dist"]
22
+ }