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
@@ -3,9 +3,43 @@
3
3
  * Implements prjct commands for Claude Code environment
4
4
  */
5
5
 
6
- const fs = require('fs').promises
6
+ import fs from 'fs/promises'
7
+
8
+ declare const global: typeof globalThis & {
9
+ mcp?: {
10
+ filesystem?: {
11
+ read: (path: string) => Promise<string>
12
+ write: (path: string, content: string) => Promise<void>
13
+ list: (path: string) => Promise<string[]>
14
+ }
15
+ }
16
+ }
17
+
18
+ interface RecapData {
19
+ currentTask?: string | null
20
+ shippedCount: number
21
+ queuedCount: number
22
+ ideasCount: number
23
+ recentActivity?: string
24
+ }
25
+
26
+ interface ProgressData {
27
+ period: string
28
+ count: number
29
+ velocity: number
30
+ previousVelocity: number
31
+ recentFeatures?: string
32
+ }
33
+
34
+ interface IntentResult {
35
+ intent: string
36
+ command: string | null
37
+ }
7
38
 
8
39
  class ClaudeAgent {
40
+ name: string
41
+ type: string
42
+
9
43
  constructor() {
10
44
  this.name = 'Claude Code'
11
45
  this.type = 'claude'
@@ -14,8 +48,8 @@ class ClaudeAgent {
14
48
  /**
15
49
  * Format response - minimal, actionable
16
50
  */
17
- formatResponse(message, type = 'info') {
18
- const emojis = {
51
+ formatResponse(message: string, type: string = 'info'): string {
52
+ const emojis: Record<string, string> = {
19
53
  success: '✅',
20
54
  error: '❌',
21
55
  warning: '⚠️',
@@ -34,12 +68,14 @@ class ClaudeAgent {
34
68
  /**
35
69
  * Read file using MCP if available, fallback to fs
36
70
  */
37
- async readFile(filePath) {
71
+ async readFile(filePath: string): Promise<string> {
38
72
  try {
39
73
  if (global.mcp && global.mcp.filesystem) {
40
74
  return await global.mcp.filesystem.read(filePath)
41
75
  }
42
- } catch (e) {}
76
+ } catch {
77
+ // Fall through to fs
78
+ }
43
79
 
44
80
  return await fs.readFile(filePath, 'utf8')
45
81
  }
@@ -47,12 +83,14 @@ class ClaudeAgent {
47
83
  /**
48
84
  * Write file using MCP if available, fallback to fs
49
85
  */
50
- async writeFile(filePath, content) {
86
+ async writeFile(filePath: string, content: string): Promise<void> {
51
87
  try {
52
88
  if (global.mcp && global.mcp.filesystem) {
53
89
  return await global.mcp.filesystem.write(filePath, content)
54
90
  }
55
- } catch (e) {}
91
+ } catch {
92
+ // Fall through to fs
93
+ }
56
94
 
57
95
  await fs.writeFile(filePath, content, 'utf8')
58
96
  }
@@ -60,12 +98,14 @@ class ClaudeAgent {
60
98
  /**
61
99
  * List directory contents
62
100
  */
63
- async listDirectory(dirPath) {
101
+ async listDirectory(dirPath: string): Promise<string[]> {
64
102
  try {
65
103
  if (global.mcp && global.mcp.filesystem) {
66
104
  return await global.mcp.filesystem.list(dirPath)
67
105
  }
68
- } catch (e) {}
106
+ } catch {
107
+ // Fall through to fs
108
+ }
69
109
 
70
110
  return await fs.readdir(dirPath)
71
111
  }
@@ -73,7 +113,7 @@ class ClaudeAgent {
73
113
  /**
74
114
  * Check if file exists
75
115
  */
76
- async fileExists(filePath) {
116
+ async fileExists(filePath: string): Promise<boolean> {
77
117
  try {
78
118
  await fs.access(filePath)
79
119
  return true
@@ -85,21 +125,21 @@ class ClaudeAgent {
85
125
  /**
86
126
  * Create directory
87
127
  */
88
- async createDirectory(dirPath) {
128
+ async createDirectory(dirPath: string): Promise<void> {
89
129
  await fs.mkdir(dirPath, { recursive: true })
90
130
  }
91
131
 
92
132
  /**
93
133
  * Get current timestamp in ISO format
94
134
  */
95
- getTimestamp() {
135
+ getTimestamp(): string {
96
136
  return new Date().toISOString()
97
137
  }
98
138
 
99
139
  /**
100
140
  * Format task list - data only
101
141
  */
102
- formatTaskList(tasks) {
142
+ formatTaskList(tasks: string[] | null): string {
103
143
  if (!tasks || tasks.length === 0) {
104
144
  return '📋 No tasks queued'
105
145
  }
@@ -110,7 +150,7 @@ class ClaudeAgent {
110
150
  /**
111
151
  * Format recap - metrics only
112
152
  */
113
- formatRecap(data) {
153
+ formatRecap(data: RecapData): string {
114
154
  return `📊 Recap
115
155
 
116
156
  🎯 Current: ${data.currentTask || 'None'}
@@ -123,7 +163,7 @@ ${data.recentActivity ? '\n' + data.recentActivity : ''}`
123
163
  /**
124
164
  * Format progress - data only
125
165
  */
126
- formatProgress(data) {
166
+ formatProgress(data: ProgressData): string {
127
167
  const trend =
128
168
  data.velocity > data.previousVelocity
129
169
  ? '📈'
@@ -141,8 +181,8 @@ ${data.recentFeatures || ''}`
141
181
  /**
142
182
  * Get help - actionable steps only
143
183
  */
144
- getHelpContent(issue) {
145
- const helps = {
184
+ getHelpContent(issue: string): string {
185
+ const helps: Record<string, string> = {
146
186
  debugging:
147
187
  '🔍 1. Isolate code causing error\n2. Add logs at key points\n3. Search exact error message',
148
188
  design: '🎨 1. Define problem clearly\n2. Start with simplest solution\n3. Ship MVP, iterate',
@@ -159,8 +199,8 @@ ${data.recentFeatures || ''}`
159
199
  /**
160
200
  * Suggest next action - conversational prompts
161
201
  */
162
- suggestNextAction(context) {
163
- const suggestions = {
202
+ suggestNextAction(context: string): string {
203
+ const suggestions: Record<string, string> = {
164
204
  taskCompleted: `What's next?
165
205
  • "start [task]" → Begin working
166
206
  • "ship feature" → Track & celebrate
@@ -205,7 +245,7 @@ Type /p:help to see all options`
205
245
  /**
206
246
  * Detect user intent from natural language
207
247
  */
208
- detectIntent(message) {
248
+ detectIntent(message: string): IntentResult {
209
249
  const msg = message.toLowerCase()
210
250
 
211
251
  // Start/begin task
@@ -250,4 +290,4 @@ Type /p:help to see all options`
250
290
  }
251
291
  }
252
292
 
253
- module.exports = ClaudeAgent
293
+ export default ClaudeAgent
@@ -1,7 +1,3 @@
1
- const { promisify } = require('util')
2
- const { exec: execCallback } = require('child_process')
3
- const exec = promisify(execCallback)
4
-
5
1
  /**
6
2
  * AuthorDetector - Detects author information from multiple sources
7
3
  *
@@ -12,22 +8,43 @@ const exec = promisify(execCallback)
12
8
  *
13
9
  * @version 0.2.0
14
10
  */
11
+
12
+ import { promisify } from 'util'
13
+ import { exec as execCallback } from 'child_process'
14
+
15
+ const exec = promisify(execCallback)
16
+
17
+ interface Author {
18
+ name: string | null
19
+ email: string | null
20
+ github: string | null
21
+ }
22
+
23
+ interface ExecResult {
24
+ success: boolean
25
+ output: string
26
+ }
27
+
28
+ interface ConfigStatus {
29
+ hasGitHub: boolean
30
+ hasGit: boolean
31
+ author: Author
32
+ isComplete: boolean
33
+ recommendations: string[]
34
+ }
35
+
15
36
  class AuthorDetector {
16
37
  /**
17
38
  * Execute a shell command safely
18
- *
19
- * @param {string} command - Command to execute
20
- * @returns {Promise<{success: boolean, output: string}>}
21
- * @private
22
39
  */
23
- async execCommand(command) {
40
+ private async execCommand(command: string): Promise<ExecResult> {
24
41
  try {
25
42
  const { stdout } = await exec(command, { timeout: 5000 })
26
43
  return {
27
44
  success: true,
28
45
  output: stdout.trim(),
29
46
  }
30
- } catch (error) {
47
+ } catch {
31
48
  return {
32
49
  success: false,
33
50
  output: '',
@@ -37,10 +54,8 @@ class AuthorDetector {
37
54
 
38
55
  /**
39
56
  * Detect GitHub username using GitHub CLI
40
- *
41
- * @returns {Promise<string|null>} - GitHub username or null
42
57
  */
43
- async detectGitHubUsername() {
58
+ async detectGitHubUsername(): Promise<string | null> {
44
59
  let result = await this.execCommand('gh api user --jq .login')
45
60
  if (result.success && result.output) {
46
61
  return result.output
@@ -56,31 +71,25 @@ class AuthorDetector {
56
71
 
57
72
  /**
58
73
  * Detect git config name
59
- *
60
- * @returns {Promise<string|null>} - Git name or null
61
74
  */
62
- async detectGitName() {
75
+ async detectGitName(): Promise<string | null> {
63
76
  const result = await this.execCommand('git config user.name')
64
77
  return result.success && result.output ? result.output : null
65
78
  }
66
79
 
67
80
  /**
68
81
  * Detect git config email
69
- *
70
- * @returns {Promise<string|null>} - Git email or null
71
82
  */
72
- async detectGitEmail() {
83
+ async detectGitEmail(): Promise<string | null> {
73
84
  const result = await this.execCommand('git config user.email')
74
85
  return result.success && result.output ? result.output : null
75
86
  }
76
87
 
77
88
  /**
78
89
  * Detect author information from all available sources
79
- *
80
- * @returns {Promise<Object>} - Author information {name, email, github}
81
90
  */
82
- async detect() {
83
- const author = {
91
+ async detect(): Promise<Author> {
92
+ const author: Author = {
84
93
  name: null,
85
94
  email: null,
86
95
  github: null,
@@ -105,10 +114,8 @@ class AuthorDetector {
105
114
  /**
106
115
  * Detect and format author for memory logs
107
116
  * Returns just the GitHub username or git name
108
- *
109
- * @returns {Promise<string>} - Author identifier for logs
110
117
  */
111
- async detectAuthorForLogs() {
118
+ async detectAuthorForLogs(): Promise<string> {
112
119
  const author = await this.detect()
113
120
 
114
121
  if (author.github) {
@@ -124,20 +131,16 @@ class AuthorDetector {
124
131
 
125
132
  /**
126
133
  * Check if GitHub CLI is available
127
- *
128
- * @returns {Promise<boolean>} - True if gh command is available
129
134
  */
130
- async isGitHubCLIAvailable() {
135
+ async isGitHubCLIAvailable(): Promise<boolean> {
131
136
  const result = await this.execCommand('gh --version')
132
137
  return result.success
133
138
  }
134
139
 
135
140
  /**
136
141
  * Check if git is configured
137
- *
138
- * @returns {Promise<boolean>} - True if git name and email are set
139
142
  */
140
- async isGitConfigured() {
143
+ async isGitConfigured(): Promise<boolean> {
141
144
  const name = await this.detectGitName()
142
145
  const email = await this.detectGitEmail()
143
146
  return !!(name && email)
@@ -145,10 +148,8 @@ class AuthorDetector {
145
148
 
146
149
  /**
147
150
  * Get configuration status and recommendations
148
- *
149
- * @returns {Promise<Object>} - Status and recommendations
150
151
  */
151
- async getConfigStatus() {
152
+ async getConfigStatus(): Promise<ConfigStatus> {
152
153
  const hasGitHub = await this.isGitHubCLIAvailable()
153
154
  const hasGit = await this.isGitConfigured()
154
155
  const author = await this.detect()
@@ -164,15 +165,9 @@ class AuthorDetector {
164
165
 
165
166
  /**
166
167
  * Generate recommendations based on detected configuration
167
- *
168
- * @param {boolean} hasGitHub - GitHub CLI available
169
- * @param {boolean} hasGit - Git configured
170
- * @param {Object} author - Detected author
171
- * @returns {string[]} - Array of recommendations
172
- * @private
173
168
  */
174
- _getRecommendations(hasGitHub, hasGit, author) {
175
- const recommendations = []
169
+ private _getRecommendations(hasGitHub: boolean, hasGit: boolean, author: Author): string[] {
170
+ const recommendations: string[] = []
176
171
 
177
172
  if (!hasGitHub && !author.github) {
178
173
  recommendations.push(
@@ -194,12 +189,9 @@ class AuthorDetector {
194
189
 
195
190
  /**
196
191
  * Format author information for display
197
- *
198
- * @param {Object} author - Author object
199
- * @returns {string} - Formatted author string
200
192
  */
201
- formatAuthor(author) {
202
- const parts = []
193
+ formatAuthor(author: Author): string {
194
+ const parts: string[] = []
203
195
 
204
196
  if (author.name && author.name !== 'Unknown') {
205
197
  parts.push(author.name)
@@ -217,4 +209,5 @@ class AuthorDetector {
217
209
  }
218
210
  }
219
211
 
220
- module.exports = new AuthorDetector()
212
+ const authorDetector = new AuthorDetector()
213
+ export default authorDetector
@@ -3,15 +3,48 @@
3
3
  * Handles installation of missing tools and tracks them as workflow tasks
4
4
  */
5
5
 
6
- const { exec } = require('child_process')
7
- const { promisify } = require('util')
6
+ import { exec } from 'child_process'
7
+ import { promisify } from 'util'
8
+ import fs from 'fs/promises'
9
+ import path from 'path'
10
+ import projectCapabilities from '../utils/project-capabilities'
11
+
8
12
  const execAsync = promisify(exec)
9
13
 
14
+ interface Recommendation {
15
+ install: string
16
+ }
17
+
18
+ interface InstallResult {
19
+ success: boolean
20
+ capability: string
21
+ command: string
22
+ duration?: number
23
+ output?: string
24
+ errors?: string | null
25
+ error?: string
26
+ }
27
+
28
+ interface ConfigureResult {
29
+ configured: boolean
30
+ framework?: string
31
+ tool?: string
32
+ }
33
+
34
+ interface PackageJson {
35
+ devDependencies?: Record<string, string>
36
+ scripts?: Record<string, string>
37
+ }
38
+
10
39
  class CapabilityInstaller {
11
40
  /**
12
41
  * Install capability and create tracking task
13
42
  */
14
- async install(capability, recommendation, _dataPath) {
43
+ async install(
44
+ capability: string,
45
+ recommendation: Recommendation,
46
+ _dataPath: string
47
+ ): Promise<InstallResult> {
15
48
  const command = recommendation.install
16
49
  const startTime = Date.now()
17
50
 
@@ -35,7 +68,7 @@ class CapabilityInstaller {
35
68
  success: false,
36
69
  capability,
37
70
  command,
38
- error: error.message,
71
+ error: (error as Error).message,
39
72
  }
40
73
  }
41
74
  }
@@ -43,8 +76,8 @@ class CapabilityInstaller {
43
76
  /**
44
77
  * Create configuration for installed tool
45
78
  */
46
- async configure(capability, projectPath) {
47
- const configs = {
79
+ async configure(capability: string, projectPath: string): Promise<ConfigureResult> {
80
+ const configs: Record<string, () => Promise<ConfigureResult>> = {
48
81
  test: () => this.configureTest(projectPath),
49
82
  design: () => this.configureDesign(projectPath),
50
83
  docs: () => this.configureDocs(projectPath),
@@ -60,13 +93,10 @@ class CapabilityInstaller {
60
93
  /**
61
94
  * Configure test framework
62
95
  */
63
- async configureTest(projectPath) {
64
- const fs = require('fs').promises
65
- const path = require('path')
66
-
96
+ async configureTest(projectPath: string): Promise<ConfigureResult> {
67
97
  // Check if package.json exists
68
98
  const pkgPath = path.join(projectPath, 'package.json')
69
- const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf8'))
99
+ const pkg: PackageJson = JSON.parse(await fs.readFile(pkgPath, 'utf8'))
70
100
 
71
101
  const hasVitest = pkg.devDependencies?.vitest
72
102
  const hasJest = pkg.devDependencies?.jest
@@ -121,12 +151,9 @@ export default defineConfig({
121
151
  /**
122
152
  * Configure design system
123
153
  */
124
- async configureDesign(projectPath) {
125
- const fs = require('fs').promises
126
- const path = require('path')
127
-
154
+ async configureDesign(projectPath: string): Promise<ConfigureResult> {
128
155
  const pkgPath = path.join(projectPath, 'package.json')
129
- const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf8'))
156
+ const pkg: PackageJson = JSON.parse(await fs.readFile(pkgPath, 'utf8'))
130
157
 
131
158
  if (pkg.devDependencies?.storybook) {
132
159
  // Storybook auto-configures itself during init
@@ -139,19 +166,16 @@ export default defineConfig({
139
166
  /**
140
167
  * Configure documentation
141
168
  */
142
- async configureDocs(projectPath) {
143
- const fs = require('fs').promises
144
- const path = require('path')
145
-
169
+ async configureDocs(projectPath: string): Promise<ConfigureResult> {
146
170
  const pkgPath = path.join(projectPath, 'package.json')
147
- const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf8'))
171
+ const pkg: PackageJson = JSON.parse(await fs.readFile(pkgPath, 'utf8'))
148
172
 
149
173
  if (pkg.devDependencies?.jsdoc) {
150
174
  // Create jsdoc.json
151
175
  const config = {
152
176
  source: {
153
177
  include: ['src'],
154
- includePattern: '.+\\\\.js(doc|x)?$',
178
+ includePattern: '.+\\.js(doc|x)?$',
155
179
  excludePattern: '(node_modules|docs)',
156
180
  },
157
181
  opts: {
@@ -176,12 +200,12 @@ export default defineConfig({
176
200
  /**
177
201
  * Verify installation succeeded
178
202
  */
179
- async verify(capability, projectPath) {
180
- const caps = require('../utils/project-capabilities')
181
- const detected = await caps.detect(projectPath)
203
+ async verify(capability: string, projectPath: string): Promise<boolean> {
204
+ const detected = await projectCapabilities.detect(projectPath)
182
205
 
183
- return detected[capability] === true
206
+ return detected[capability as keyof typeof detected] === true
184
207
  }
185
208
  }
186
209
 
187
- module.exports = new CapabilityInstaller()
210
+ const capabilityInstaller = new CapabilityInstaller()
211
+ export default capabilityInstaller