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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unified.d.ts","sourceRoot":"","sources":["../src/unified.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Shared Utilities
3
+ */
4
+ /**
5
+ * Generate a unique session ID
6
+ */
7
+ export declare function generateSessionId(): string;
8
+ /**
9
+ * Generate a unique ID with prefix
10
+ */
11
+ export declare function generateId(prefix?: string): string;
12
+ /**
13
+ * Format duration in seconds to human readable
14
+ */
15
+ export declare function formatDuration(seconds: number): string;
16
+ /**
17
+ * Parse duration string to seconds
18
+ */
19
+ export declare function parseDuration(duration: string): number;
20
+ /**
21
+ * Get relative time string
22
+ */
23
+ export declare function getRelativeTime(date: Date | string): string;
24
+ /**
25
+ * Get ISO timestamp
26
+ */
27
+ export declare function getTimestamp(): string;
28
+ /**
29
+ * Get date in YYYY-MM-DD format
30
+ */
31
+ export declare function getDate(): string;
32
+ /**
33
+ * Get year-month in YYYY-MM format
34
+ */
35
+ export declare function getYearMonth(): string;
36
+ /**
37
+ * Safely parse JSON
38
+ */
39
+ export declare function safeJsonParse<T>(json: string, fallback: T): T;
40
+ /**
41
+ * Truncate string with ellipsis
42
+ */
43
+ export declare function truncate(str: string, maxLength: number): string;
44
+ /**
45
+ * Slugify string
46
+ */
47
+ export declare function slugify(str: string): string;
48
+ /**
49
+ * Deep clone object
50
+ */
51
+ export declare function deepClone<T>(obj: T): T;
52
+ /**
53
+ * Check if running in Node.js
54
+ */
55
+ export declare function isNode(): boolean;
56
+ /**
57
+ * Check if running in browser
58
+ */
59
+ export declare function isBrowser(): boolean;
60
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,GAAE,MAAa,GAAG,MAAM,CAOxD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAStD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAStD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAgB3D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAM7D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAEtC;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAEnC"}
@@ -13,8 +13,9 @@
13
13
  }
14
14
  },
15
15
  "scripts": {
16
- "build": "tsup src/index.ts --format esm --dts",
17
- "dev": "tsup src/index.ts --format esm --dts --watch",
16
+ "build": "bun build src/index.ts --outdir ./dist --target bun && bun run build:types",
17
+ "build:types": "tsc --emitDeclarationOnly --declaration --outDir dist",
18
+ "dev": "bun build src/index.ts --outdir ./dist --target bun --watch",
18
19
  "typecheck": "tsc --noEmit",
19
20
  "lint": "eslint src"
20
21
  },
@@ -22,8 +23,7 @@
22
23
  "zod": "^3.23.8"
23
24
  },
24
25
  "devDependencies": {
25
- "esbuild": "^0.25.0",
26
- "tsup": "^8.0.2",
26
+ "@types/bun": "latest",
27
27
  "typescript": "^5.4.5"
28
28
  }
29
29
  }
@@ -7,3 +7,4 @@
7
7
  export * from './types'
8
8
  export * from './schemas'
9
9
  export * from './utils'
10
+ export * from './unified'
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Unified State Types
3
+ *
4
+ * Types shared between CLI core modules and web UI.
5
+ * These mirror the types in core/state/, core/outcomes/, and core/agents/
6
+ */
7
+
8
+ // ============== State Types ==============
9
+
10
+ export type Priority = 'low' | 'medium' | 'high' | 'critical'
11
+ export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'blocked' | 'paused'
12
+ export type FeatureStatus = 'planned' | 'in_progress' | 'completed' | 'shipped'
13
+
14
+ export interface CurrentTask {
15
+ id: string
16
+ description: string
17
+ startedAt: string
18
+ agent?: string
19
+ agentConfidence?: number
20
+ estimatedDuration?: string
21
+ featureId?: string
22
+ pausedAt?: string
23
+ pauseReason?: string
24
+ }
25
+
26
+ export interface QueuedTask {
27
+ id: string
28
+ description: string
29
+ priority: Priority
30
+ featureId?: string
31
+ estimatedDuration?: string
32
+ tags?: string[]
33
+ createdAt: string
34
+ blockedReason?: string
35
+ }
36
+
37
+ export interface ActiveFeature {
38
+ id: string
39
+ name: string
40
+ status: FeatureStatus
41
+ tasksCompleted: number
42
+ tasksRemaining: number
43
+ estimatedEffort?: string
44
+ actualEffort?: string
45
+ startedAt: string
46
+ }
47
+
48
+ export interface PerformanceStats {
49
+ tasksToday: number
50
+ tasksThisWeek: number
51
+ avgDuration: string
52
+ velocity: string
53
+ estimateAccuracy: number
54
+ streak: number
55
+ }
56
+
57
+ export interface RecentActivity {
58
+ type: 'task_completed' | 'feature_shipped' | 'idea_captured' | 'session_started'
59
+ description: string
60
+ timestamp: string
61
+ duration?: string
62
+ }
63
+
64
+ export interface ProjectState {
65
+ projectId: string
66
+ currentTask: CurrentTask | null
67
+ queue: QueuedTask[]
68
+ activeFeature: ActiveFeature | null
69
+ stats: PerformanceStats
70
+ recentActivity: RecentActivity[]
71
+ lastSync: string
72
+ version: number
73
+ }
74
+
75
+ // ============== Outcomes Types ==============
76
+
77
+ export type QualityScore = 1 | 2 | 3 | 4 | 5
78
+
79
+ export interface Outcome {
80
+ id: string
81
+ sessionId: string
82
+ command: string
83
+ task: string
84
+ startedAt: string
85
+ completedAt: string
86
+ estimatedDuration: string
87
+ actualDuration: string
88
+ variance: string
89
+ completedAsPlanned: boolean
90
+ qualityScore: QualityScore
91
+ blockers?: string[]
92
+ errors?: string[]
93
+ agentUsed?: string
94
+ agentConfidence?: number
95
+ agentPerformedWell?: boolean
96
+ patternDetected?: string
97
+ nextTimeEstimate?: string
98
+ tags?: string[]
99
+ }
100
+
101
+ export interface OutcomeSummary {
102
+ totalOutcomes: number
103
+ avgQualityScore: number
104
+ estimateAccuracy: number
105
+ topBlockers: string[]
106
+ topAgents: string[]
107
+ patternsDetected: string[]
108
+ }
109
+
110
+ // ============== Agent Types ==============
111
+
112
+ export type TaskType =
113
+ | 'frontend'
114
+ | 'backend'
115
+ | 'devops'
116
+ | 'database'
117
+ | 'testing'
118
+ | 'documentation'
119
+ | 'refactoring'
120
+ | 'bugfix'
121
+ | 'feature'
122
+ | 'design'
123
+ | 'other'
124
+
125
+ export interface AgentPerformance {
126
+ agentName: string
127
+ taskType: TaskType
128
+ tasksCompleted: number
129
+ successRate: number
130
+ avgDuration: string
131
+ estimateAccuracy: number
132
+ improving: boolean
133
+ lastUpdated: string
134
+ bestFor: TaskType[]
135
+ avoidFor: TaskType[]
136
+ }
137
+
138
+ export interface AgentSuggestion {
139
+ agentName: string
140
+ confidence: number
141
+ reason: string
142
+ alternatives?: string[]
143
+ }
144
+
145
+ // ============== Unified API Response ==============
146
+
147
+ export interface ProjectInsights {
148
+ healthScore: number
149
+ estimateAccuracy: number
150
+ topBlockers: string[]
151
+ patternsDetected: string[]
152
+ recommendations: string[]
153
+ }
154
+
155
+ export interface UnifiedProjectData {
156
+ state: ProjectState | null
157
+ outcomes: OutcomeSummary | null
158
+ agentPerformance: AgentPerformance[]
159
+ insights: ProjectInsights
160
+ legacyFallback: boolean
161
+ }
162
+
163
+ export interface UnifiedApiResponse {
164
+ success: boolean
165
+ version: 'v2' | 'v1-legacy'
166
+ state: ProjectState | null
167
+ outcomes: OutcomeSummary | null
168
+ agentPerformance: AgentPerformance[]
169
+ insights: ProjectInsights
170
+ legacyFallback: boolean
171
+ // Legacy data when fallback
172
+ legacyData?: unknown
173
+ legacyRaw?: unknown
174
+ }
@@ -7,7 +7,7 @@ export async function GET() {
7
7
  try {
8
8
  const sessions = listSessions()
9
9
  return NextResponse.json({ success: true, data: sessions })
10
- } catch (error) {
10
+ } catch {
11
11
  return NextResponse.json(
12
12
  { success: false, error: 'Failed to list sessions' },
13
13
  { status: 500 }
@@ -22,7 +22,7 @@ export async function GET() {
22
22
  version
23
23
  }
24
24
  })
25
- } catch (error) {
25
+ } catch {
26
26
  return NextResponse.json({
27
27
  success: true,
28
28
  data: {
@@ -0,0 +1,46 @@
1
+ import { NextResponse } from 'next/server'
2
+ import { migrateProject, getProjectsToMigrate } from '@/lib/services/migration.server'
3
+
4
+ export async function GET() {
5
+ try {
6
+ const projects = await getProjectsToMigrate()
7
+ return NextResponse.json({
8
+ success: true,
9
+ data: { projects }
10
+ })
11
+ } catch (error) {
12
+ return NextResponse.json(
13
+ { success: false, error: 'Failed to list projects' },
14
+ { status: 500 }
15
+ )
16
+ }
17
+ }
18
+
19
+ export async function POST(request: Request) {
20
+ try {
21
+ const body = await request.json()
22
+ const { projectId } = body
23
+
24
+ if (!projectId) {
25
+ return NextResponse.json(
26
+ { success: false, error: 'Project ID is required' },
27
+ { status: 400 }
28
+ )
29
+ }
30
+
31
+ const result = await migrateProject(projectId)
32
+
33
+ return NextResponse.json({
34
+ success: result.success,
35
+ data: result
36
+ })
37
+ } catch (error) {
38
+ return NextResponse.json(
39
+ {
40
+ success: false,
41
+ error: error instanceof Error ? error.message : 'Migration failed'
42
+ },
43
+ { status: 500 }
44
+ )
45
+ }
46
+ }
@@ -20,7 +20,7 @@ export async function GET(
20
20
  }
21
21
 
22
22
  return NextResponse.json({ success: true, data: project })
23
- } catch (error) {
23
+ } catch {
24
24
  return NextResponse.json(
25
25
  { success: false, error: 'Failed to get project' },
26
26
  { status: 500 }
@@ -1,4 +1,5 @@
1
1
  import { NextRequest, NextResponse } from 'next/server'
2
+ import { loadUnifiedJsonData, hasJsonState } from '@/lib/json-loader'
2
3
  import { getProjectStats, getRawProjectFiles } from '@/lib/parse-prjct-files'
3
4
 
4
5
  export async function GET(
@@ -15,7 +16,33 @@ export async function GET(
15
16
  }
16
17
 
17
18
  try {
18
- // Get both parsed stats AND raw files
19
+ // Check if JSON files exist (new format)
20
+ const hasJson = await hasJsonState(projectId)
21
+
22
+ if (hasJson) {
23
+ // Use new JSON loader (fast path)
24
+ const jsonData = await loadUnifiedJsonData(projectId)
25
+
26
+ // Convert to stats-compatible format using new architecture
27
+ return NextResponse.json({
28
+ success: true,
29
+ version: 'v2',
30
+ data: {
31
+ currentTask: jsonData.state?.currentTask || null,
32
+ queue: jsonData.queue?.tasks?.filter(t => !t.completed) || [],
33
+ metrics: jsonData.metrics || null,
34
+ agents: jsonData.agents,
35
+ ideas: jsonData.ideas?.ideas || [],
36
+ roadmap: jsonData.roadmap?.features || [],
37
+ shipped: jsonData.shipped?.items || [],
38
+ analysis: jsonData.analysis,
39
+ outcomes: jsonData.outcomes,
40
+ insights: jsonData.insights
41
+ }
42
+ })
43
+ }
44
+
45
+ // Fallback to legacy markdown parsing
19
46
  const [stats, raw] = await Promise.all([
20
47
  getProjectStats(projectId),
21
48
  getRawProjectFiles(projectId)
@@ -23,8 +50,9 @@ export async function GET(
23
50
 
24
51
  return NextResponse.json({
25
52
  success: true,
53
+ version: 'v1-legacy',
26
54
  data: stats,
27
- raw // Raw markdown files for direct rendering
55
+ raw
28
56
  })
29
57
  } catch (error) {
30
58
  console.error('[API] Error getting project stats:', error)
@@ -12,7 +12,7 @@ export async function GET(
12
12
  try {
13
13
  const status = await getProjectStatus(id)
14
14
  return NextResponse.json({ success: true, data: status })
15
- } catch (error) {
15
+ } catch {
16
16
  return NextResponse.json(
17
17
  { success: false, error: 'Failed to get status' },
18
18
  { status: 500 }
@@ -7,7 +7,7 @@ export async function GET() {
7
7
  try {
8
8
  const projects = await getProjects()
9
9
  return NextResponse.json({ success: true, data: projects })
10
- } catch (error) {
10
+ } catch {
11
11
  return NextResponse.json(
12
12
  { success: false, error: 'Failed to list projects' },
13
13
  { status: 500 }
@@ -0,0 +1,97 @@
1
+ import { NextResponse } from 'next/server'
2
+ import { promises as fs } from 'fs'
3
+ import { join } from 'path'
4
+ import { homedir } from 'os'
5
+
6
+ const SETTINGS_PATH = join(homedir(), '.prjct-cli', 'settings.json')
7
+
8
+ interface Settings {
9
+ openRouterApiKey?: string
10
+ }
11
+
12
+ async function getSettings(): Promise<Settings> {
13
+ try {
14
+ const content = await fs.readFile(SETTINGS_PATH, 'utf-8')
15
+ return JSON.parse(content)
16
+ } catch {
17
+ return {}
18
+ }
19
+ }
20
+
21
+ async function saveSettings(settings: Settings): Promise<void> {
22
+ const dir = join(homedir(), '.prjct-cli')
23
+ await fs.mkdir(dir, { recursive: true })
24
+ await fs.writeFile(SETTINGS_PATH, JSON.stringify(settings, null, 2))
25
+ }
26
+
27
+ export async function GET() {
28
+ try {
29
+ const settings = await getSettings()
30
+ // Mask the API key for security (only show last 4 chars)
31
+ const maskedKey = settings.openRouterApiKey
32
+ ? `sk-...${settings.openRouterApiKey.slice(-4)}`
33
+ : null
34
+
35
+ return NextResponse.json({
36
+ success: true,
37
+ data: {
38
+ hasApiKey: !!settings.openRouterApiKey,
39
+ maskedKey
40
+ }
41
+ })
42
+ } catch (error) {
43
+ return NextResponse.json(
44
+ { success: false, error: 'Failed to read settings' },
45
+ { status: 500 }
46
+ )
47
+ }
48
+ }
49
+
50
+ export async function POST(request: Request) {
51
+ try {
52
+ const body = await request.json()
53
+ const { openRouterApiKey } = body
54
+
55
+ if (!openRouterApiKey || typeof openRouterApiKey !== 'string') {
56
+ return NextResponse.json(
57
+ { success: false, error: 'Invalid API key' },
58
+ { status: 400 }
59
+ )
60
+ }
61
+
62
+ const settings = await getSettings()
63
+ settings.openRouterApiKey = openRouterApiKey
64
+ await saveSettings(settings)
65
+
66
+ return NextResponse.json({
67
+ success: true,
68
+ data: {
69
+ hasApiKey: true,
70
+ maskedKey: `sk-...${openRouterApiKey.slice(-4)}`
71
+ }
72
+ })
73
+ } catch (error) {
74
+ return NextResponse.json(
75
+ { success: false, error: 'Failed to save settings' },
76
+ { status: 500 }
77
+ )
78
+ }
79
+ }
80
+
81
+ export async function DELETE() {
82
+ try {
83
+ const settings = await getSettings()
84
+ delete settings.openRouterApiKey
85
+ await saveSettings(settings)
86
+
87
+ return NextResponse.json({
88
+ success: true,
89
+ data: { hasApiKey: false, maskedKey: null }
90
+ })
91
+ } catch (error) {
92
+ return NextResponse.json(
93
+ { success: false, error: 'Failed to delete API key' },
94
+ { status: 500 }
95
+ )
96
+ }
97
+ }
@@ -0,0 +1,57 @@
1
+ import { NextRequest, NextResponse } from 'next/server'
2
+ import { loadUnifiedJsonData } from '@/lib/json-loader'
3
+
4
+ export async function GET(
5
+ request: NextRequest,
6
+ { params }: { params: Promise<{ id: string }> }
7
+ ) {
8
+ const { id: projectId } = await params
9
+
10
+ if (!projectId) {
11
+ return NextResponse.json(
12
+ { success: false, error: 'Project ID required' },
13
+ { status: 400 }
14
+ )
15
+ }
16
+
17
+ try {
18
+ // Load all JSON data directly
19
+ const jsonData = await loadUnifiedJsonData(projectId)
20
+
21
+ if (!jsonData.hasJsonData) {
22
+ // No JSON files exist yet
23
+ return NextResponse.json({
24
+ success: true,
25
+ version: 'v2-empty',
26
+ state: null,
27
+ project: null,
28
+ agents: [],
29
+ ideas: [],
30
+ roadmap: [],
31
+ shipped: [],
32
+ analysis: null,
33
+ outcomes: [],
34
+ insights: {
35
+ healthScore: 0,
36
+ estimateAccuracy: 0,
37
+ topBlockers: [],
38
+ patternsDetected: [],
39
+ recommendations: ['Run /p:sync to initialize project data'],
40
+ },
41
+ hasJsonData: false,
42
+ })
43
+ }
44
+
45
+ return NextResponse.json({
46
+ success: true,
47
+ version: 'v2',
48
+ ...jsonData,
49
+ })
50
+ } catch (error) {
51
+ console.error('[API v2] Error getting unified project data:', error)
52
+ return NextResponse.json(
53
+ { success: false, error: 'Failed to get project data' },
54
+ { status: 500 }
55
+ )
56
+ }
57
+ }
@@ -119,6 +119,44 @@
119
119
  }
120
120
  body {
121
121
  @apply bg-background text-foreground;
122
+ /* Prevent pull-to-refresh on mobile */
123
+ overscroll-behavior: none;
124
+ /* Prevent text selection on touch devices for UI elements */
125
+ -webkit-tap-highlight-color: transparent;
126
+ }
127
+
128
+ /* Safe areas for notched devices (iPhone X+, etc) */
129
+ html {
130
+ padding-top: env(safe-area-inset-top);
131
+ padding-bottom: env(safe-area-inset-bottom);
132
+ padding-left: env(safe-area-inset-left);
133
+ padding-right: env(safe-area-inset-right);
134
+ }
135
+
136
+ /* Smooth scrolling with momentum on iOS */
137
+ .overflow-auto,
138
+ .overflow-y-auto,
139
+ .overflow-x-auto {
140
+ -webkit-overflow-scrolling: touch;
141
+ }
142
+
143
+ /* Hide scrollbars while preserving functionality */
144
+ .scrollbar-hide {
145
+ -ms-overflow-style: none;
146
+ scrollbar-width: none;
147
+ }
148
+ .scrollbar-hide::-webkit-scrollbar {
149
+ display: none;
150
+ }
151
+
152
+ /* Better touch targets for small buttons */
153
+ .touch-target-sm {
154
+ min-height: 36px;
155
+ min-width: 36px;
156
+ }
157
+ .touch-target-md {
158
+ min-height: 44px;
159
+ min-width: 44px;
122
160
  }
123
161
  }
124
162
 
@@ -1,7 +1,7 @@
1
- import type { Metadata } from 'next'
1
+ import type { Metadata, Viewport } from 'next'
2
2
  import { Geist, Geist_Mono } from 'next/font/google'
3
3
  import './globals.css'
4
- import { Providers } from '@/components/providers'
4
+ import { Providers } from '@/components/Providers'
5
5
  import { AppSidebar } from '@/components/AppSidebar'
6
6
 
7
7
  const geistSans = Geist({
@@ -19,6 +19,14 @@ export const metadata: Metadata = {
19
19
  description: 'Ship fast, track progress, stay focused.',
20
20
  }
21
21
 
22
+ export const viewport: Viewport = {
23
+ width: 'device-width',
24
+ initialScale: 1,
25
+ maximumScale: 1,
26
+ userScalable: false,
27
+ viewportFit: 'cover',
28
+ }
29
+
22
30
  export default function RootLayout({
23
31
  children,
24
32
  }: Readonly<{