prjct-cli 0.11.5 → 0.12.1

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 +190 -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 +600 -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 +58 -8
  345. package/templates/commands/done.md +76 -32
  346. package/templates/commands/feature.md +121 -47
  347. package/templates/commands/idea.md +81 -8
  348. package/templates/commands/now.md +41 -17
  349. package/templates/commands/ship.md +64 -25
  350. package/templates/commands/sync.md +28 -3
  351. package/core/agentic/agent-router.js +0 -140
  352. package/core/agentic/chain-of-thought.js +0 -578
  353. package/core/agentic/command-executor.js +0 -417
  354. package/core/agentic/context-filter.js +0 -354
  355. package/core/agentic/ground-truth.js +0 -591
  356. package/core/agentic/loop-detector.js +0 -406
  357. package/core/agentic/memory-system.js +0 -845
  358. package/core/agentic/parallel-tools.js +0 -366
  359. package/core/agentic/plan-mode.js +0 -572
  360. package/core/agentic/prompt-builder.js +0 -352
  361. package/core/agentic/response-templates.js +0 -290
  362. package/core/agentic/semantic-compression.js +0 -517
  363. package/core/agentic/think-blocks.js +0 -657
  364. package/core/agentic/tool-registry.js +0 -184
  365. package/core/agentic/validation-rules.js +0 -380
  366. package/core/command-registry.js +0 -698
  367. package/core/commands.js +0 -2237
  368. package/core/domain/task-stack.js +0 -497
  369. package/core/infrastructure/legacy-installer-detector.js +0 -546
  370. package/core/infrastructure/migrator.js +0 -796
  371. package/core/infrastructure/session-manager.js +0 -390
  372. package/core/utils/file-helper.js +0 -329
  373. package/packages/web/app/api/projects/[id]/delete/route.ts +0 -21
  374. package/packages/web/app/api/stats/route.ts +0 -38
  375. package/packages/web/components/AppSidebar.tsx +0 -113
  376. package/packages/web/components/stats/ActivityTimeline.tsx +0 -201
  377. package/packages/web/components/stats/AgentsCard.tsx +0 -56
  378. package/packages/web/components/stats/BentoCard.tsx +0 -88
  379. package/packages/web/components/stats/HeroSection.tsx +0 -172
  380. package/packages/web/components/stats/NowCard.tsx +0 -71
  381. package/packages/web/components/stats/QueueCard.tsx +0 -58
  382. package/packages/web/components/stats/VelocityCard.tsx +0 -60
  383. package/packages/web/components/stats/index.ts +0 -17
  384. package/packages/web/hooks/useStats.ts +0 -28
  385. /package/packages/web/components/{CommandButton.tsx → CommandButton/CommandButton.tsx} +0 -0
  386. /package/packages/web/components/{ConnectionStatus.tsx → ConnectionStatus/ConnectionStatus.tsx} +0 -0
  387. /package/packages/web/components/{Logo.tsx → Logo/Logo.tsx} +0 -0
  388. /package/packages/web/components/{MarkdownContent.tsx → MarkdownContent/MarkdownContent.tsx} +0 -0
  389. /package/packages/web/components/{ProjectAvatar.tsx → ProjectAvatar/ProjectAvatar.tsx} +0 -0
  390. /package/packages/web/components/{providers.tsx → Providers/Providers.tsx} +0 -0
  391. /package/packages/web/components/{TechStackBadges.tsx → TechStackBadges/TechStackBadges.tsx} +0 -0
@@ -1,29 +1,73 @@
1
1
  /**
2
2
  * TaskAnalyzer - Deep Semantic Task Analysis
3
- *
3
+ *
4
4
  * Analyzes tasks semantically, not just keywords
5
5
  * Considers project context, history, and relationships
6
- *
6
+ *
7
7
  * @version 1.0.0
8
8
  */
9
9
 
10
- const fs = require('fs').promises
11
- const path = require('path')
12
- const analyzer = require('./analyzer')
13
- const configManager = require('../infrastructure/config-manager')
14
- const pathManager = require('../infrastructure/path-manager')
10
+ import fs from 'fs/promises'
11
+ import path from 'path'
12
+ import analyzer from './analyzer'
13
+ import configManager from '../infrastructure/config-manager'
14
+ import pathManager from '../infrastructure/path-manager'
15
+
16
+ interface Task {
17
+ description?: string
18
+ type?: string
19
+ }
20
+
21
+ interface HistoryEntry {
22
+ type: string
23
+ domain?: string
24
+ description?: string
25
+ }
26
+
27
+ interface SemanticAnalysis {
28
+ intent: string | null
29
+ requiresMultipleAgents: boolean
30
+ text: string
31
+ }
32
+
33
+ interface HistoricalAnalysis {
34
+ confidence: number
35
+ patterns: Array<{ domain: string; description: string }>
36
+ suggestedDomain?: string | null
37
+ }
38
+
39
+ interface ProjectData {
40
+ packageJson: unknown
41
+ extensions: Record<string, number>
42
+ directories: string[]
43
+ configFiles: string[]
44
+ }
45
+
46
+ interface TaskAnalysisResult {
47
+ primaryDomain: string
48
+ confidence: number
49
+ semantic: SemanticAnalysis
50
+ historical: HistoricalAnalysis
51
+ complexity: string
52
+ projectData: ProjectData
53
+ matchedKeywords: string[]
54
+ reason: string
55
+ alternatives: string[]
56
+ }
15
57
 
16
58
  class TaskAnalyzer {
17
- constructor(projectPath) {
59
+ projectPath: string
60
+ projectId: string | null = null
61
+ taskHistory: HistoryEntry[] | null = null
62
+
63
+ constructor(projectPath: string) {
18
64
  this.projectPath = projectPath
19
- this.projectId = null
20
- this.taskHistory = null
21
65
  }
22
66
 
23
67
  /**
24
68
  * Initialize analyzer with project context
25
69
  */
26
- async initialize() {
70
+ async initialize(): Promise<void> {
27
71
  this.projectId = await configManager.getProjectId(this.projectPath)
28
72
  analyzer.init(this.projectPath)
29
73
  await this.loadTaskHistory()
@@ -34,11 +78,8 @@ class TaskAnalyzer {
34
78
  *
35
79
  * 100% AGENTIC: No hardcoded patterns. Uses task description
36
80
  * and historical patterns only. Claude decides domain relevance.
37
- *
38
- * @param {Object} task - Task object {description, type}
39
- * @returns {Promise<Object>} Analysis result
40
81
  */
41
- async analyzeTask(task) {
82
+ async analyzeTask(task: Task): Promise<TaskAnalysisResult> {
42
83
  if (!this.projectId) {
43
84
  await this.initialize()
44
85
  }
@@ -48,11 +89,11 @@ class TaskAnalyzer {
48
89
  const fullText = `${description} ${type}`.trim()
49
90
 
50
91
  // Get raw project data (no categorization)
51
- const projectData = {
92
+ const projectData: ProjectData = {
52
93
  packageJson: await analyzer.readPackageJson(),
53
94
  extensions: await analyzer.getFileExtensions(),
54
95
  directories: await analyzer.listDirectories(),
55
- configFiles: await analyzer.listConfigFiles()
96
+ configFiles: await analyzer.listConfigFiles(),
56
97
  }
57
98
 
58
99
  // Semantic understanding (intent-based, not keyword-based)
@@ -77,7 +118,7 @@ class TaskAnalyzer {
77
118
  projectData, // Raw data for Claude to analyze
78
119
  matchedKeywords: [], // No keyword matching - Claude decides
79
120
  reason: this.buildReason(primaryDomain, semantic, historical),
80
- alternatives: ['full-stack', 'generalist']
121
+ alternatives: ['full-stack', 'generalist'],
81
122
  }
82
123
  }
83
124
 
@@ -91,7 +132,7 @@ class TaskAnalyzer {
91
132
  * This method is kept for backward compatibility but returns empty.
92
133
  * Use analyzeTask() which provides raw data for Claude.
93
134
  */
94
- detectDomains(text) {
135
+ detectDomains(text: string): Record<string, unknown> {
95
136
  // No hardcoded patterns - Claude decides domain
96
137
  return {}
97
138
  }
@@ -101,7 +142,7 @@ class TaskAnalyzer {
101
142
  * AGENTIC: Claude uses templates/analysis/intent.md for detailed analysis
102
143
  * This returns minimal structure - Claude determines actual intent
103
144
  */
104
- analyzeSemantics(text) {
145
+ analyzeSemantics(text: string): SemanticAnalysis {
105
146
  // AGENTIC: Return structure only, Claude analyzes via template
106
147
  return {
107
148
  intent: null, // Claude determines via templates/analysis/intent.md
@@ -113,14 +154,14 @@ class TaskAnalyzer {
113
154
  /**
114
155
  * Analyze historical patterns
115
156
  */
116
- async analyzeHistory(text) {
157
+ async analyzeHistory(text: string): Promise<HistoricalAnalysis> {
117
158
  if (!this.taskHistory) {
118
159
  return { confidence: 0, patterns: [] }
119
160
  }
120
161
 
121
162
  // Find similar tasks in history
122
- const similar = this.taskHistory.filter(task => {
123
- const similarity = this.calculateTextSimilarity(text, task.description)
163
+ const similar = this.taskHistory.filter((task) => {
164
+ const similarity = this.calculateTextSimilarity(text, task.description || '')
124
165
  return similarity > 0.5
125
166
  })
126
167
 
@@ -129,20 +170,19 @@ class TaskAnalyzer {
129
170
  }
130
171
 
131
172
  // Find most common domain for similar tasks
132
- const domainCounts = {}
133
- similar.forEach(task => {
173
+ const domainCounts: Record<string, number> = {}
174
+ similar.forEach((task) => {
134
175
  if (task.domain) {
135
176
  domainCounts[task.domain] = (domainCounts[task.domain] || 0) + 1
136
177
  }
137
178
  })
138
179
 
139
- const mostCommon = Object.entries(domainCounts)
140
- .sort((a, b) => b[1] - a[1])[0]
180
+ const mostCommon = Object.entries(domainCounts).sort((a, b) => b[1] - a[1])[0]
141
181
 
142
182
  return {
143
183
  confidence: mostCommon ? mostCommon[1] / similar.length : 0,
144
- patterns: similar.map(t => ({ domain: t.domain, description: t.description })),
145
- suggestedDomain: mostCommon ? mostCommon[0] : null
184
+ patterns: similar.map((t) => ({ domain: t.domain || '', description: t.description || '' })),
185
+ suggestedDomain: mostCommon ? mostCommon[0] : null,
146
186
  }
147
187
  }
148
188
 
@@ -151,7 +191,7 @@ class TaskAnalyzer {
151
191
  * AGENTIC: Claude uses templates/analysis/complexity.md for real estimation
152
192
  * This returns default - Claude determines actual complexity
153
193
  */
154
- estimateComplexity(text) {
194
+ estimateComplexity(text: string): string {
155
195
  // AGENTIC: Return default, Claude analyzes via templates/analysis/complexity.md
156
196
  return 'medium'
157
197
  }
@@ -164,7 +204,7 @@ class TaskAnalyzer {
164
204
  * - Basic intent detection
165
205
  * Claude decides actual domain based on project context.
166
206
  */
167
- selectPrimaryDomain(semantic, historical) {
207
+ selectPrimaryDomain(semantic: SemanticAnalysis, historical: HistoricalAnalysis): string {
168
208
  // Priority: historical > default
169
209
  if (historical && historical.suggestedDomain && historical.confidence > 0.7) {
170
210
  return historical.suggestedDomain
@@ -182,7 +222,7 @@ class TaskAnalyzer {
182
222
  /**
183
223
  * Calculate confidence based on available signals
184
224
  */
185
- calculateConfidence(semantic, historical) {
225
+ calculateConfidence(semantic: SemanticAnalysis, historical: HistoricalAnalysis): number {
186
226
  let confidence = 0.5 // Base confidence
187
227
 
188
228
  // Boost from historical patterns
@@ -201,8 +241,8 @@ class TaskAnalyzer {
201
241
  /**
202
242
  * Build human-readable reason
203
243
  */
204
- buildReason(primaryDomain, semantic, historical) {
205
- const parts = []
244
+ buildReason(primaryDomain: string, semantic: SemanticAnalysis, historical: HistoricalAnalysis): string {
245
+ const parts: string[] = []
206
246
 
207
247
  if (historical && historical.suggestedDomain && historical.confidence > 0.7) {
208
248
  parts.push(`Historical: similar tasks used ${primaryDomain}`)
@@ -218,21 +258,21 @@ class TaskAnalyzer {
218
258
  /**
219
259
  * Load task history from memory
220
260
  */
221
- async loadTaskHistory() {
261
+ async loadTaskHistory(): Promise<void> {
222
262
  try {
223
- const memoryPath = pathManager.getFilePath(this.projectId, 'memory', 'context.jsonl')
263
+ const memoryPath = pathManager.getFilePath(this.projectId!, 'memory', 'context.jsonl')
224
264
  const content = await fs.readFile(memoryPath, 'utf-8')
225
265
  const lines = content.split('\n').filter(Boolean)
226
266
 
227
267
  this.taskHistory = lines
228
- .map(line => {
268
+ .map((line) => {
229
269
  try {
230
- return JSON.parse(line)
270
+ return JSON.parse(line) as HistoryEntry
231
271
  } catch {
232
272
  return null
233
273
  }
234
274
  })
235
- .filter(entry => entry && entry.type === 'task_start' && entry.domain)
275
+ .filter((entry): entry is HistoryEntry => entry !== null && entry.type === 'task_start' && !!entry.domain)
236
276
  .slice(-100) // Last 100 tasks
237
277
  } catch {
238
278
  this.taskHistory = []
@@ -242,16 +282,15 @@ class TaskAnalyzer {
242
282
  /**
243
283
  * Calculate text similarity (simple Jaccard)
244
284
  */
245
- calculateTextSimilarity(text1, text2) {
285
+ calculateTextSimilarity(text1: string, text2: string): number {
246
286
  const words1 = new Set(text1.toLowerCase().split(/\s+/))
247
287
  const words2 = new Set(text2.toLowerCase().split(/\s+/))
248
288
 
249
- const intersection = new Set([...words1].filter(w => words2.has(w)))
289
+ const intersection = new Set([...words1].filter((w) => words2.has(w)))
250
290
  const union = new Set([...words1, ...words2])
251
291
 
252
292
  return intersection.size / union.size
253
293
  }
254
294
  }
255
295
 
256
- module.exports = TaskAnalyzer
257
-
296
+ export default TaskAnalyzer
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Task Stack Manager - Handles multiple concurrent tasks with pause/resume capability
3
+ * Enables natural workflow with interruptions and context switching
4
+ */
5
+
6
+ export type {
7
+ TaskEntry,
8
+ ParsedNowFile,
9
+ MigrationResult,
10
+ SwitchResult,
11
+ StackSummary,
12
+ } from './types'
13
+
14
+ export { parseNowFile, formatDuration } from './parser'
15
+ export { ensureStackFile, appendToStack, readStack, writeStack, updateNowFile } from './storage'
16
+ export { TaskStack } from './task-stack'
17
+
18
+ import { TaskStack } from './task-stack'
19
+ export default TaskStack
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Task Stack Parser
3
+ * Parsing utilities for now.md files
4
+ */
5
+
6
+ import type { ParsedNowFile } from './types'
7
+
8
+ /**
9
+ * Parse legacy now.md format
10
+ */
11
+ export function parseNowFile(content: string): ParsedNowFile {
12
+ const result: ParsedNowFile = {
13
+ description: '',
14
+ started: null,
15
+ agent: null,
16
+ complexity: null,
17
+ dev: null,
18
+ }
19
+
20
+ // Check for frontmatter
21
+ if (content.startsWith('---')) {
22
+ const frontmatterEnd = content.indexOf('---', 3)
23
+ if (frontmatterEnd > 0) {
24
+ const frontmatter = content.substring(3, frontmatterEnd)
25
+ const lines = frontmatter.split('\n')
26
+
27
+ for (const line of lines) {
28
+ if (line.includes('task:')) {
29
+ result.description = line.split('task:')[1].trim().replace(/['"]/g, '')
30
+ }
31
+ if (line.includes('started:')) {
32
+ result.started = line.split('started:')[1].trim()
33
+ }
34
+ if (line.includes('agent:')) {
35
+ result.agent = line.split('agent:')[1].trim()
36
+ }
37
+ if (line.includes('complexity:')) {
38
+ result.complexity = line.split('complexity:')[1].trim()
39
+ }
40
+ if (line.includes('dev:')) {
41
+ result.dev = line.split('dev:')[1].trim()
42
+ }
43
+ }
44
+
45
+ // Get description from content if not in frontmatter
46
+ if (!result.description) {
47
+ const contentBody = content.substring(frontmatterEnd + 3).trim()
48
+ const firstLine = contentBody.split('\n')[0]
49
+ if (firstLine && !firstLine.startsWith('#')) {
50
+ result.description = firstLine.replace(/^[*-]\s*/, '').trim()
51
+ }
52
+ }
53
+ }
54
+ } else {
55
+ // No frontmatter, try to extract task from content
56
+ const lines = content.split('\n')
57
+ for (const line of lines) {
58
+ if (line.trim() && !line.startsWith('#') && !line.startsWith('---')) {
59
+ result.description = line.replace(/^[*-]\s*/, '').trim()
60
+ break
61
+ }
62
+ }
63
+ }
64
+
65
+ return result
66
+ }
67
+
68
+ /**
69
+ * Format duration in human-readable format
70
+ */
71
+ export function formatDuration(ms: number): string {
72
+ const seconds = Math.floor(ms / 1000)
73
+ const minutes = Math.floor(seconds / 60)
74
+ const hours = Math.floor(minutes / 60)
75
+ const days = Math.floor(hours / 24)
76
+
77
+ if (days > 0) {
78
+ return `${days}d ${hours % 24}h`
79
+ } else if (hours > 0) {
80
+ return `${hours}h ${minutes % 60}m`
81
+ } else if (minutes > 0) {
82
+ return `${minutes}m`
83
+ } else {
84
+ return `${seconds}s`
85
+ }
86
+ }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Task Stack Storage
3
+ * File operations for task stack
4
+ */
5
+
6
+ import fs from 'fs/promises'
7
+ import log from '../../utils/logger'
8
+ import type { TaskEntry } from './types'
9
+
10
+ /**
11
+ * Ensure stack file exists
12
+ */
13
+ export async function ensureStackFile(stackPath: string): Promise<void> {
14
+ try {
15
+ await fs.access(stackPath)
16
+ } catch {
17
+ // Create empty file
18
+ await fs.writeFile(stackPath, '')
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Append entry to stack
24
+ */
25
+ export async function appendToStack(stackPath: string, entry: TaskEntry): Promise<void> {
26
+ await ensureStackFile(stackPath)
27
+ const line = JSON.stringify(entry) + '\n'
28
+ await fs.appendFile(stackPath, line)
29
+ }
30
+
31
+ /**
32
+ * Read all stack entries
33
+ */
34
+ export async function readStack(stackPath: string): Promise<TaskEntry[]> {
35
+ await ensureStackFile(stackPath)
36
+ const content = await fs.readFile(stackPath, 'utf8')
37
+
38
+ if (!content.trim()) {
39
+ return []
40
+ }
41
+
42
+ const entries: TaskEntry[] = []
43
+ const lines = content.split('\n').filter((line) => line.trim())
44
+
45
+ for (const line of lines) {
46
+ try {
47
+ entries.push(JSON.parse(line))
48
+ } catch (error) {
49
+ log.error('Error parsing stack line:', (error as Error).message)
50
+ }
51
+ }
52
+
53
+ return entries
54
+ }
55
+
56
+ /**
57
+ * Write full stack to file
58
+ */
59
+ export async function writeStack(stackPath: string, stack: TaskEntry[]): Promise<void> {
60
+ const content = stack.map((task) => JSON.stringify(task)).join('\n') + '\n'
61
+ await fs.writeFile(stackPath, content)
62
+ }
63
+
64
+ /**
65
+ * Generate now.md content for a task
66
+ */
67
+ export function generateNowContent(task: TaskEntry | null, customContent: string | null, formatDuration: (ms: number) => string): string {
68
+ if (customContent !== undefined && customContent !== null) {
69
+ return customContent
70
+ }
71
+
72
+ if (!task) {
73
+ return `# Current Task
74
+
75
+ **No active task**
76
+
77
+ Use \`/p:work\` or \`/p:resume\` to start working.
78
+
79
+ ---
80
+
81
+ _Track your focus with \`/p:work [task]\`_
82
+ `
83
+ }
84
+
85
+ const started = new Date(task.started)
86
+ const now = new Date()
87
+ const elapsed = formatDuration(now.getTime() - started.getTime() - (task.pausedDuration || 0))
88
+
89
+ return `---
90
+ task: "${task.task}"
91
+ started: ${task.started}
92
+ agent: ${task.agent}
93
+ complexity: ${task.complexity}
94
+ dev: ${task.dev}
95
+ ---
96
+
97
+ # Current Task
98
+
99
+ **${task.task}**
100
+
101
+ - Started: ${started.toLocaleTimeString()} (${elapsed} ago)
102
+ - Agent: ${task.agent}
103
+ - Complexity: ${task.complexity}
104
+
105
+ ---
106
+
107
+ When done: \`/p:done\`
108
+ Need to pause: \`/p:pause\`
109
+ `
110
+ }
111
+
112
+ /**
113
+ * Update now.md file
114
+ */
115
+ export async function updateNowFile(
116
+ nowPath: string,
117
+ task: TaskEntry | null,
118
+ customContent: string | null,
119
+ formatDuration: (ms: number) => string
120
+ ): Promise<void> {
121
+ const content = generateNowContent(task, customContent, formatDuration)
122
+ await fs.writeFile(nowPath, content)
123
+ }