prjct-cli 0.18.1 → 0.19.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 (245) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/CLAUDE.md +74 -211
  3. package/core/agentic/prompt-builder.ts +3 -7
  4. package/core/command-registry/optional-commands.ts +0 -20
  5. package/core/infrastructure/command-installer/command-installer.ts +8 -1
  6. package/core/infrastructure/command-installer/global-config.ts +31 -1
  7. package/core/infrastructure/command-installer/index.ts +1 -1
  8. package/core/infrastructure/setup.ts +3 -0
  9. package/package.json +3 -17
  10. package/templates/agentic/subagent-generation.md +8 -6
  11. package/templates/commands/done.md +57 -258
  12. package/templates/commands/now.md +72 -277
  13. package/templates/commands/ship.md +55 -261
  14. package/templates/commands/sync.md +7 -7
  15. package/templates/commands/test.md +328 -21
  16. package/templates/global/CLAUDE.md +40 -205
  17. package/templates/global/docs/agents.md +88 -0
  18. package/templates/global/docs/architecture.md +103 -0
  19. package/templates/global/docs/commands.md +98 -0
  20. package/templates/global/docs/validation.md +95 -0
  21. package/templates/mcp-config.json +36 -0
  22. package/bin/dev.js +0 -216
  23. package/bin/serve.js +0 -361
  24. package/packages/web/README.md +0 -36
  25. package/packages/web/app/api/claude/sessions/route.ts +0 -44
  26. package/packages/web/app/api/claude/status/route.ts +0 -34
  27. package/packages/web/app/api/projects/[id]/icon/route.ts +0 -33
  28. package/packages/web/app/api/projects/[id]/momentum/route.ts +0 -257
  29. package/packages/web/app/api/projects/[id]/route.ts +0 -29
  30. package/packages/web/app/api/projects/[id]/stats/route.ts +0 -41
  31. package/packages/web/app/api/projects/[id]/status/route.ts +0 -21
  32. package/packages/web/app/api/projects/route.ts +0 -16
  33. package/packages/web/app/api/sessions/current/route.ts +0 -132
  34. package/packages/web/app/api/sessions/history/route.ts +0 -204
  35. package/packages/web/app/error.tsx +0 -34
  36. package/packages/web/app/favicon.ico +0 -0
  37. package/packages/web/app/globals.css +0 -198
  38. package/packages/web/app/layout.tsx +0 -53
  39. package/packages/web/app/loading.tsx +0 -7
  40. package/packages/web/app/not-found.tsx +0 -25
  41. package/packages/web/app/page.tsx +0 -12
  42. package/packages/web/app/project/[id]/code/layout.tsx +0 -18
  43. package/packages/web/app/project/[id]/code/page.tsx +0 -408
  44. package/packages/web/app/project/[id]/error.tsx +0 -41
  45. package/packages/web/app/project/[id]/loading.tsx +0 -9
  46. package/packages/web/app/project/[id]/not-found.tsx +0 -27
  47. package/packages/web/app/project/[id]/page.tsx +0 -384
  48. package/packages/web/app/project/[id]/reports/page.tsx +0 -59
  49. package/packages/web/app/project/[id]/reports/print/page.tsx +0 -58
  50. package/packages/web/app/sessions/page.tsx +0 -165
  51. package/packages/web/app/settings/page.tsx +0 -151
  52. package/packages/web/components/ActivityTimeline/ActivityTimeline.constants.ts +0 -2
  53. package/packages/web/components/ActivityTimeline/ActivityTimeline.tsx +0 -49
  54. package/packages/web/components/ActivityTimeline/ActivityTimeline.types.ts +0 -8
  55. package/packages/web/components/ActivityTimeline/hooks/index.ts +0 -2
  56. package/packages/web/components/ActivityTimeline/hooks/useExpandable.ts +0 -9
  57. package/packages/web/components/ActivityTimeline/hooks/useGroupedEvents.ts +0 -23
  58. package/packages/web/components/ActivityTimeline/index.ts +0 -2
  59. package/packages/web/components/AgentsCard/AgentsCard.tsx +0 -93
  60. package/packages/web/components/AgentsCard/AgentsCard.types.ts +0 -14
  61. package/packages/web/components/AgentsCard/index.ts +0 -2
  62. package/packages/web/components/AppSidebar/AppSidebar.tsx +0 -316
  63. package/packages/web/components/AppSidebar/index.ts +0 -1
  64. package/packages/web/components/BackLink/BackLink.tsx +0 -18
  65. package/packages/web/components/BackLink/BackLink.types.ts +0 -5
  66. package/packages/web/components/BackLink/index.ts +0 -2
  67. package/packages/web/components/BentoCard/BentoCard.constants.ts +0 -16
  68. package/packages/web/components/BentoCard/BentoCard.tsx +0 -48
  69. package/packages/web/components/BentoCard/BentoCard.types.ts +0 -15
  70. package/packages/web/components/BentoCard/index.ts +0 -2
  71. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.constants.ts +0 -9
  72. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.tsx +0 -18
  73. package/packages/web/components/BentoCardSkeleton/BentoCardSkeleton.types.ts +0 -5
  74. package/packages/web/components/BentoCardSkeleton/index.ts +0 -2
  75. package/packages/web/components/BentoGrid/BentoGrid.tsx +0 -18
  76. package/packages/web/components/BentoGrid/BentoGrid.types.ts +0 -4
  77. package/packages/web/components/BentoGrid/index.ts +0 -2
  78. package/packages/web/components/BlockersCard/BlockersCard.tsx +0 -75
  79. package/packages/web/components/BlockersCard/BlockersCard.types.ts +0 -12
  80. package/packages/web/components/BlockersCard/index.ts +0 -2
  81. package/packages/web/components/CommandBar/CommandBar.tsx +0 -67
  82. package/packages/web/components/CommandBar/index.ts +0 -1
  83. package/packages/web/components/CommandButton/CommandButton.tsx +0 -46
  84. package/packages/web/components/CommandButton/index.ts +0 -1
  85. package/packages/web/components/ConnectionStatus/ConnectionStatus.tsx +0 -29
  86. package/packages/web/components/ConnectionStatus/index.ts +0 -1
  87. package/packages/web/components/DashboardContent/DashboardContent.tsx +0 -284
  88. package/packages/web/components/DashboardContent/index.ts +0 -1
  89. package/packages/web/components/DateGroup/DateGroup.tsx +0 -18
  90. package/packages/web/components/DateGroup/DateGroup.types.ts +0 -6
  91. package/packages/web/components/DateGroup/DateGroup.utils.ts +0 -11
  92. package/packages/web/components/DateGroup/index.ts +0 -2
  93. package/packages/web/components/EmptyState/EmptyState.tsx +0 -76
  94. package/packages/web/components/EmptyState/EmptyState.types.ts +0 -11
  95. package/packages/web/components/EmptyState/index.ts +0 -2
  96. package/packages/web/components/EventRow/EventRow.constants.ts +0 -10
  97. package/packages/web/components/EventRow/EventRow.tsx +0 -49
  98. package/packages/web/components/EventRow/EventRow.types.ts +0 -7
  99. package/packages/web/components/EventRow/EventRow.utils.ts +0 -49
  100. package/packages/web/components/EventRow/index.ts +0 -2
  101. package/packages/web/components/ExpandButton/ExpandButton.tsx +0 -18
  102. package/packages/web/components/ExpandButton/ExpandButton.types.ts +0 -6
  103. package/packages/web/components/ExpandButton/index.ts +0 -2
  104. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.tsx +0 -14
  105. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.types.ts +0 -5
  106. package/packages/web/components/HealthGradientBackground/HealthGradientBackground.utils.ts +0 -13
  107. package/packages/web/components/HealthGradientBackground/index.ts +0 -2
  108. package/packages/web/components/HeroSection/HeroSection.tsx +0 -92
  109. package/packages/web/components/HeroSection/HeroSection.types.ts +0 -14
  110. package/packages/web/components/HeroSection/HeroSection.utils.ts +0 -11
  111. package/packages/web/components/HeroSection/hooks/index.ts +0 -2
  112. package/packages/web/components/HeroSection/hooks/useCountUp.ts +0 -45
  113. package/packages/web/components/HeroSection/hooks/useWeeklyActivity.ts +0 -18
  114. package/packages/web/components/HeroSection/index.ts +0 -2
  115. package/packages/web/components/IdeasCard/IdeasCard.tsx +0 -115
  116. package/packages/web/components/IdeasCard/IdeasCard.types.ts +0 -10
  117. package/packages/web/components/IdeasCard/index.ts +0 -2
  118. package/packages/web/components/InsightMessage/InsightMessage.tsx +0 -9
  119. package/packages/web/components/InsightMessage/InsightMessage.types.ts +0 -3
  120. package/packages/web/components/InsightMessage/index.ts +0 -2
  121. package/packages/web/components/Logo/Logo.tsx +0 -65
  122. package/packages/web/components/Logo/index.ts +0 -1
  123. package/packages/web/components/MarkdownContent/MarkdownContent.tsx +0 -123
  124. package/packages/web/components/MarkdownContent/index.ts +0 -1
  125. package/packages/web/components/MasonryGrid/MasonryGrid.tsx +0 -18
  126. package/packages/web/components/MasonryGrid/index.ts +0 -1
  127. package/packages/web/components/MomentumWidget/MomentumWidget.tsx +0 -119
  128. package/packages/web/components/MomentumWidget/MomentumWidget.types.ts +0 -16
  129. package/packages/web/components/MomentumWidget/index.ts +0 -2
  130. package/packages/web/components/NowCard/NowCard.tsx +0 -118
  131. package/packages/web/components/NowCard/NowCard.types.ts +0 -16
  132. package/packages/web/components/NowCard/index.ts +0 -2
  133. package/packages/web/components/PageHeader/PageHeader.tsx +0 -24
  134. package/packages/web/components/PageHeader/index.ts +0 -1
  135. package/packages/web/components/ProgressRing/ProgressRing.constants.ts +0 -20
  136. package/packages/web/components/ProgressRing/ProgressRing.tsx +0 -51
  137. package/packages/web/components/ProgressRing/ProgressRing.types.ts +0 -11
  138. package/packages/web/components/ProgressRing/index.ts +0 -2
  139. package/packages/web/components/ProjectAvatar/ProjectAvatar.tsx +0 -54
  140. package/packages/web/components/ProjectAvatar/index.ts +0 -1
  141. package/packages/web/components/ProjectColorDot/ProjectColorDot.tsx +0 -37
  142. package/packages/web/components/ProjectColorDot/index.ts +0 -1
  143. package/packages/web/components/ProjectSelectorModal/ProjectSelectorModal.tsx +0 -104
  144. package/packages/web/components/ProjectSelectorModal/index.ts +0 -1
  145. package/packages/web/components/Providers/Providers.tsx +0 -48
  146. package/packages/web/components/Providers/index.ts +0 -1
  147. package/packages/web/components/QueueCard/QueueCard.tsx +0 -125
  148. package/packages/web/components/QueueCard/QueueCard.types.ts +0 -12
  149. package/packages/web/components/QueueCard/QueueCard.utils.ts +0 -12
  150. package/packages/web/components/QueueCard/index.ts +0 -2
  151. package/packages/web/components/RecoverCard/RecoverCard.tsx +0 -72
  152. package/packages/web/components/RecoverCard/RecoverCard.types.ts +0 -16
  153. package/packages/web/components/RecoverCard/index.ts +0 -2
  154. package/packages/web/components/RoadmapCard/RoadmapCard.tsx +0 -145
  155. package/packages/web/components/RoadmapCard/RoadmapCard.types.ts +0 -16
  156. package/packages/web/components/RoadmapCard/index.ts +0 -2
  157. package/packages/web/components/ShipsCard/ShipsCard.tsx +0 -95
  158. package/packages/web/components/ShipsCard/ShipsCard.types.ts +0 -14
  159. package/packages/web/components/ShipsCard/ShipsCard.utils.ts +0 -4
  160. package/packages/web/components/ShipsCard/index.ts +0 -2
  161. package/packages/web/components/SparklineChart/SparklineChart.tsx +0 -40
  162. package/packages/web/components/SparklineChart/SparklineChart.types.ts +0 -6
  163. package/packages/web/components/SparklineChart/index.ts +0 -2
  164. package/packages/web/components/StatsMasonry/StatsMasonry.tsx +0 -95
  165. package/packages/web/components/StatsMasonry/index.ts +0 -1
  166. package/packages/web/components/StreakCard/StreakCard.constants.ts +0 -2
  167. package/packages/web/components/StreakCard/StreakCard.tsx +0 -55
  168. package/packages/web/components/StreakCard/StreakCard.types.ts +0 -4
  169. package/packages/web/components/StreakCard/index.ts +0 -2
  170. package/packages/web/components/TasksCounter/TasksCounter.tsx +0 -14
  171. package/packages/web/components/TasksCounter/TasksCounter.types.ts +0 -3
  172. package/packages/web/components/TasksCounter/index.ts +0 -2
  173. package/packages/web/components/TechStackBadges/TechStackBadges.tsx +0 -28
  174. package/packages/web/components/TechStackBadges/index.ts +0 -1
  175. package/packages/web/components/TerminalDock/DockToggleTab.tsx +0 -29
  176. package/packages/web/components/TerminalDock/TerminalDock.tsx +0 -386
  177. package/packages/web/components/TerminalDock/TerminalDockTab.tsx +0 -130
  178. package/packages/web/components/TerminalDock/TerminalTabBar.tsx +0 -142
  179. package/packages/web/components/TerminalDock/index.ts +0 -2
  180. package/packages/web/components/TerminalTabs/TerminalTab.tsx +0 -95
  181. package/packages/web/components/TerminalTabs/TerminalTabs.tsx +0 -211
  182. package/packages/web/components/TerminalTabs/index.ts +0 -1
  183. package/packages/web/components/VelocityBadge/VelocityBadge.tsx +0 -32
  184. package/packages/web/components/VelocityBadge/VelocityBadge.types.ts +0 -3
  185. package/packages/web/components/VelocityBadge/index.ts +0 -2
  186. package/packages/web/components/VelocityCard/VelocityCard.tsx +0 -73
  187. package/packages/web/components/VelocityCard/VelocityCard.types.ts +0 -7
  188. package/packages/web/components/VelocityCard/index.ts +0 -2
  189. package/packages/web/components/WeeklyReports/PrintableReport.tsx +0 -259
  190. package/packages/web/components/WeeklyReports/ReportPreviewCard.tsx +0 -187
  191. package/packages/web/components/WeeklyReports/WeekCalendar.tsx +0 -288
  192. package/packages/web/components/WeeklyReports/WeeklyReports.tsx +0 -149
  193. package/packages/web/components/WeeklyReports/index.ts +0 -4
  194. package/packages/web/components/WeeklySparkline/WeeklySparkline.tsx +0 -25
  195. package/packages/web/components/WeeklySparkline/WeeklySparkline.types.ts +0 -4
  196. package/packages/web/components/WeeklySparkline/index.ts +0 -2
  197. package/packages/web/components/charts/SessionsChart.tsx +0 -175
  198. package/packages/web/components/ui/alert-dialog.tsx +0 -157
  199. package/packages/web/components/ui/badge.tsx +0 -46
  200. package/packages/web/components/ui/button.tsx +0 -60
  201. package/packages/web/components/ui/card.tsx +0 -92
  202. package/packages/web/components/ui/chart.tsx +0 -385
  203. package/packages/web/components/ui/dialog.tsx +0 -143
  204. package/packages/web/components/ui/drawer.tsx +0 -135
  205. package/packages/web/components/ui/dropdown-menu.tsx +0 -257
  206. package/packages/web/components/ui/input.tsx +0 -21
  207. package/packages/web/components/ui/scroll-area.tsx +0 -58
  208. package/packages/web/components/ui/select.tsx +0 -187
  209. package/packages/web/components/ui/sheet.tsx +0 -139
  210. package/packages/web/components/ui/tabs.tsx +0 -66
  211. package/packages/web/components/ui/tooltip.tsx +0 -61
  212. package/packages/web/components.json +0 -22
  213. package/packages/web/context/GlobalTerminalContext.tsx +0 -538
  214. package/packages/web/context/TerminalContext.tsx +0 -45
  215. package/packages/web/context/TerminalTabsContext.tsx +0 -181
  216. package/packages/web/eslint.config.mjs +0 -18
  217. package/packages/web/hooks/useClaudeTerminal.ts +0 -425
  218. package/packages/web/hooks/useProjectStats.ts +0 -93
  219. package/packages/web/hooks/useProjects.ts +0 -73
  220. package/packages/web/lib/actions/projects.ts +0 -15
  221. package/packages/web/lib/commands.ts +0 -81
  222. package/packages/web/lib/format.ts +0 -23
  223. package/packages/web/lib/generate-week-report.ts +0 -285
  224. package/packages/web/lib/parse-prjct-files.ts +0 -1123
  225. package/packages/web/lib/project-colors.ts +0 -58
  226. package/packages/web/lib/projects.ts +0 -506
  227. package/packages/web/lib/pty.ts +0 -101
  228. package/packages/web/lib/query-config.ts +0 -44
  229. package/packages/web/lib/services/index.ts +0 -9
  230. package/packages/web/lib/services/projects.server.ts +0 -66
  231. package/packages/web/lib/services/stats.server.ts +0 -562
  232. package/packages/web/lib/unified-loader.ts +0 -396
  233. package/packages/web/lib/utils.ts +0 -6
  234. package/packages/web/next-env.d.ts +0 -6
  235. package/packages/web/next.config.ts +0 -7
  236. package/packages/web/package.json +0 -57
  237. package/packages/web/postcss.config.mjs +0 -7
  238. package/packages/web/public/file.svg +0 -1
  239. package/packages/web/public/globe.svg +0 -1
  240. package/packages/web/public/next.svg +0 -1
  241. package/packages/web/public/vercel.svg +0 -1
  242. package/packages/web/public/window.svg +0 -1
  243. package/packages/web/server.ts +0 -312
  244. package/packages/web/tsconfig.json +0 -34
  245. package/templates/commands/serve.md +0 -121
@@ -1 +0,0 @@
1
- export { AppSidebar, MobileHeaderSpacer } from './AppSidebar'
@@ -1,18 +0,0 @@
1
- import Link from 'next/link'
2
- import { ArrowLeft } from 'lucide-react'
3
- import { cn } from '@/lib/utils'
4
- import type { BackLinkProps } from './BackLink.types'
5
-
6
- export function BackLink({ projectId, projectName, className }: BackLinkProps) {
7
- return (
8
- <div className={cn('relative flex', className)}>
9
- <Link
10
- href={`/project/${projectId}`}
11
- className="flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors min-h-[44px]"
12
- >
13
- <ArrowLeft className="w-4 h-4" />
14
- {projectName}
15
- </Link>
16
- </div>
17
- )
18
- }
@@ -1,5 +0,0 @@
1
- export interface BackLinkProps {
2
- projectId: string
3
- projectName: string
4
- className?: string
5
- }
@@ -1,2 +0,0 @@
1
- export { BackLink } from './BackLink'
2
- export type { BackLinkProps } from './BackLink.types'
@@ -1,16 +0,0 @@
1
- import type { AccentColor, BentoSize } from './BentoCard.types'
2
-
3
- export const BENTO_SIZE_CLASSES: Record<BentoSize, string> = {
4
- '1x1': 'col-span-1 row-span-1',
5
- '1x2': 'col-span-1 row-span-2',
6
- '2x1': 'col-span-1 sm:col-span-2 row-span-1',
7
- '2x2': 'col-span-1 sm:col-span-2 row-span-2',
8
- 'full': 'col-span-1 sm:col-span-2 lg:col-span-full',
9
- }
10
-
11
- export const ACCENT_STYLES: Record<AccentColor, string> = {
12
- default: '',
13
- success: 'border-muted-foreground/20',
14
- warning: 'border-muted-foreground/20',
15
- destructive: 'border-muted-foreground/20',
16
- }
@@ -1,48 +0,0 @@
1
- import { cn } from '@/lib/utils'
2
- import { BENTO_SIZE_CLASSES, ACCENT_STYLES } from './BentoCard.constants'
3
- import type { BentoCardProps } from './BentoCard.types'
4
-
5
- export function BentoCard({
6
- size = '1x1',
7
- title,
8
- count,
9
- icon: Icon,
10
- accentColor = 'default',
11
- className,
12
- headerClassName,
13
- children,
14
- }: BentoCardProps) {
15
- return (
16
- <div
17
- className={cn(
18
- 'relative overflow-hidden rounded-xl border bg-card transition-all duration-200',
19
- 'p-3 sm:p-4',
20
- 'hover:shadow-md hover:border-foreground/20',
21
- 'active:scale-[0.99]',
22
- 'min-w-0 max-w-full',
23
- BENTO_SIZE_CLASSES[size],
24
- ACCENT_STYLES[accentColor],
25
- className
26
- )}
27
- >
28
- {(title || count !== undefined || Icon) && (
29
- <div className={cn('flex items-center justify-between mb-2 sm:mb-3', headerClassName)}>
30
- <div className="flex items-center gap-2">
31
- {Icon && <Icon className="h-4 w-4 sm:h-3.5 sm:w-3.5 text-muted-foreground" />}
32
- {title && (
33
- <span className="text-xs font-bold uppercase tracking-wider text-muted-foreground">
34
- {title}
35
- </span>
36
- )}
37
- </div>
38
- {count !== undefined && (
39
- <span className="text-sm sm:text-xs font-medium text-muted-foreground tabular-nums">
40
- {count}
41
- </span>
42
- )}
43
- </div>
44
- )}
45
- {children}
46
- </div>
47
- )
48
- }
@@ -1,15 +0,0 @@
1
- import type { LucideIcon } from 'lucide-react'
2
-
3
- export type BentoSize = '1x1' | '1x2' | '2x1' | '2x2' | 'full'
4
- export type AccentColor = 'default' | 'success' | 'warning' | 'destructive'
5
-
6
- export interface BentoCardProps {
7
- size?: BentoSize
8
- title?: string
9
- count?: number | string
10
- icon?: LucideIcon
11
- accentColor?: AccentColor
12
- className?: string
13
- headerClassName?: string
14
- children: React.ReactNode
15
- }
@@ -1,2 +0,0 @@
1
- export { BentoCard } from './BentoCard'
2
- export type { BentoCardProps } from './BentoCard.types'
@@ -1,9 +0,0 @@
1
- import type { BentoSize } from './BentoCardSkeleton.types'
2
-
3
- export const BENTO_SIZE_CLASSES: Record<BentoSize, string> = {
4
- '1x1': 'col-span-1 row-span-1',
5
- '1x2': 'col-span-1 row-span-2',
6
- '2x1': 'col-span-1 sm:col-span-2 row-span-1',
7
- '2x2': 'col-span-1 sm:col-span-2 row-span-2',
8
- 'full': 'col-span-1 sm:col-span-2 lg:col-span-full',
9
- }
@@ -1,18 +0,0 @@
1
- import { cn } from '@/lib/utils'
2
- import { BENTO_SIZE_CLASSES } from './BentoCardSkeleton.constants'
3
- import type { BentoCardSkeletonProps } from './BentoCardSkeleton.types'
4
-
5
- export function BentoCardSkeleton({ size = '1x1' }: BentoCardSkeletonProps) {
6
- return (
7
- <div
8
- className={cn(
9
- 'rounded-xl border bg-card p-4 animate-pulse',
10
- BENTO_SIZE_CLASSES[size]
11
- )}
12
- >
13
- <div className="h-3 w-16 bg-muted rounded mb-3" />
14
- <div className="h-6 w-24 bg-muted rounded mb-2" />
15
- <div className="h-3 w-full bg-muted rounded" />
16
- </div>
17
- )
18
- }
@@ -1,5 +0,0 @@
1
- export type BentoSize = '1x1' | '1x2' | '2x1' | '2x2' | 'full'
2
-
3
- export interface BentoCardSkeletonProps {
4
- size?: BentoSize
5
- }
@@ -1,2 +0,0 @@
1
- export { BentoCardSkeleton } from './BentoCardSkeleton'
2
- export type { BentoCardSkeletonProps } from './BentoCardSkeleton.types'
@@ -1,18 +0,0 @@
1
- import { cn } from '@/lib/utils'
2
- import type { BentoGridProps } from './BentoGrid.types'
3
-
4
- export function BentoGrid({ className, children }: BentoGridProps) {
5
- return (
6
- <div
7
- className={cn(
8
- 'grid',
9
- 'gap-3 sm:gap-4',
10
- 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',
11
- 'auto-rows-[minmax(160px,auto)] sm:auto-rows-[minmax(180px,auto)]',
12
- className
13
- )}
14
- >
15
- {children}
16
- </div>
17
- )
18
- }
@@ -1,4 +0,0 @@
1
- export interface BentoGridProps {
2
- children: React.ReactNode
3
- className?: string
4
- }
@@ -1,2 +0,0 @@
1
- export { BentoGrid } from './BentoGrid'
2
- export type { BentoGridProps } from './BentoGrid.types'
@@ -1,75 +0,0 @@
1
- 'use client'
2
-
3
- import { useState } from 'react'
4
- import { AlertTriangle, Clock, CheckCircle2 } from 'lucide-react'
5
- import { ExpandButton } from '@/components/ExpandButton'
6
- import { cn } from '@/lib/utils'
7
- import type { BlockersCardProps } from './BlockersCard.types'
8
-
9
- const COLLAPSED_LIMIT = 5
10
-
11
- export function BlockersCard({ blockers, codeHref, className }: BlockersCardProps) {
12
- const [expanded, setExpanded] = useState(false)
13
- const hasBlockers = blockers.length > 0
14
- const displayBlockers = expanded ? blockers : blockers.slice(0, COLLAPSED_LIMIT)
15
- const hasMore = blockers.length > COLLAPSED_LIMIT
16
-
17
- return (
18
- <div className={cn(
19
- 'relative overflow-hidden rounded-xl border bg-card p-4',
20
- className
21
- )}>
22
- <div className="flex items-center justify-between mb-3">
23
- <div className="flex items-center gap-2">
24
- <AlertTriangle className="h-4 w-4 text-muted-foreground" />
25
- <span className="text-xs font-bold uppercase tracking-[0.15em] text-muted-foreground">
26
- Blockers
27
- </span>
28
- </div>
29
- {hasBlockers && (
30
- <span className="text-xs font-bold text-muted-foreground tabular-nums">
31
- {blockers.length}
32
- </span>
33
- )}
34
- </div>
35
-
36
- {!hasBlockers ? (
37
- <div className="flex items-center gap-3 py-2">
38
- <CheckCircle2 className="h-5 w-5 text-muted-foreground" />
39
- <div>
40
- <p className="text-sm font-medium">No blockers</p>
41
- <p className="text-xs text-muted-foreground">Keep the momentum</p>
42
- </div>
43
- </div>
44
- ) : (
45
- <div className="space-y-2">
46
- {displayBlockers.map((blocker, i) => (
47
- <div
48
- key={i}
49
- className="p-2.5 rounded-lg bg-muted/50 border"
50
- >
51
- <p className="text-sm font-medium">{blocker.task}</p>
52
- <p className="text-xs text-muted-foreground mt-0.5">
53
- {blocker.reason}
54
- </p>
55
- <div className="flex items-center gap-1 mt-1.5">
56
- <Clock className="h-3 w-3 text-muted-foreground" />
57
- <span className="text-xs font-medium text-muted-foreground">
58
- {blocker.daysBlocked} day{blocker.daysBlocked !== 1 ? 's' : ''} blocked
59
- </span>
60
- </div>
61
- </div>
62
- ))}
63
- {hasMore && (
64
- <ExpandButton
65
- expanded={expanded}
66
- totalCount={blockers.length}
67
- collapsedLimit={COLLAPSED_LIMIT}
68
- onToggle={() => setExpanded(!expanded)}
69
- />
70
- )}
71
- </div>
72
- )}
73
- </div>
74
- )
75
- }
@@ -1,12 +0,0 @@
1
- export interface Blocker {
2
- task: string
3
- reason: string
4
- since: string
5
- daysBlocked: number
6
- }
7
-
8
- export interface BlockersCardProps {
9
- blockers: Blocker[]
10
- codeHref?: string
11
- className?: string
12
- }
@@ -1,2 +0,0 @@
1
- export { BlockersCard } from './BlockersCard'
2
- export type { BlockersCardProps, Blocker } from './BlockersCard.types'
@@ -1,67 +0,0 @@
1
- 'use client'
2
-
3
- import { cn } from '@/lib/utils'
4
- import {
5
- WORKFLOW_COMMANDS,
6
- COMMAND_GROUPS,
7
- SYNC_COMMAND,
8
- } from '@/lib/commands'
9
- import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'
10
-
11
- interface CommandBarProps {
12
- isConnected: boolean
13
- onCommand: (cmd: string) => void
14
- }
15
-
16
- export function CommandBar({ isConnected, onCommand }: CommandBarProps) {
17
- return (
18
- <div className="flex items-center gap-0.5 px-2 py-1">
19
- <Tooltip>
20
- <TooltipTrigger asChild>
21
- <button
22
- onClick={() => onCommand(SYNC_COMMAND.cmd)}
23
- disabled={!isConnected}
24
- className={cn(
25
- 'p-1.5 rounded transition-colors',
26
- isConnected
27
- ? 'text-orange-500 hover:bg-orange-500/10'
28
- : 'text-muted-foreground/50 cursor-not-allowed'
29
- )}
30
- >
31
- <SYNC_COMMAND.icon className="w-4 h-4" />
32
- </button>
33
- </TooltipTrigger>
34
- <TooltipContent>{SYNC_COMMAND.tip}</TooltipContent>
35
- </Tooltip>
36
-
37
- <div className="w-px h-4 bg-border mx-1" />
38
-
39
- {COMMAND_GROUPS.map((group, groupIdx) => (
40
- <div key={group} className="flex items-center">
41
- {WORKFLOW_COMMANDS.filter(c => c.group === group).map(({ cmd, icon: Icon, tip }) => (
42
- <Tooltip key={cmd}>
43
- <TooltipTrigger asChild>
44
- <button
45
- onClick={() => onCommand(cmd)}
46
- disabled={!isConnected}
47
- className={cn(
48
- 'p-1.5 rounded transition-colors',
49
- isConnected
50
- ? 'text-muted-foreground hover:bg-accent hover:text-accent-foreground'
51
- : 'text-muted-foreground/50 cursor-not-allowed'
52
- )}
53
- >
54
- <Icon className="w-3.5 h-3.5" />
55
- </button>
56
- </TooltipTrigger>
57
- <TooltipContent>{tip}</TooltipContent>
58
- </Tooltip>
59
- ))}
60
- {groupIdx < COMMAND_GROUPS.length - 1 && (
61
- <div className="w-px h-4 bg-border mx-0.5" />
62
- )}
63
- </div>
64
- ))}
65
- </div>
66
- )
67
- }
@@ -1 +0,0 @@
1
- export { CommandBar } from './CommandBar'
@@ -1,46 +0,0 @@
1
- 'use client'
2
-
3
- import { LucideIcon } from 'lucide-react'
4
- import { Button } from '@/components/ui/button'
5
- import {
6
- Tooltip,
7
- TooltipContent,
8
- TooltipTrigger,
9
- } from '@/components/ui/tooltip'
10
- import { cn } from '@/lib/utils'
11
-
12
- interface CommandButtonProps {
13
- cmd: string
14
- icon: LucideIcon
15
- tip: string
16
- disabled?: boolean
17
- onClick: () => void
18
- variant?: 'default' | 'primary'
19
- }
20
-
21
- export function CommandButton({ cmd, icon: Icon, tip, disabled, onClick, variant = 'default' }: CommandButtonProps) {
22
- const isPrimary = variant === 'primary'
23
-
24
- return (
25
- <Tooltip>
26
- <TooltipTrigger asChild>
27
- <Button
28
- variant={isPrimary ? 'default' : 'ghost'}
29
- size="icon"
30
- onClick={onClick}
31
- disabled={disabled}
32
- className={cn(
33
- "h-11 w-11",
34
- isPrimary && "bg-primary text-primary-foreground hover:bg-primary/90"
35
- )}
36
- >
37
- <Icon className="w-5 h-5" />
38
- </Button>
39
- </TooltipTrigger>
40
- <TooltipContent side="right">
41
- <p className="font-semibold">{tip}</p>
42
- <p className="font-mono text-xs text-muted-foreground">{cmd}</p>
43
- </TooltipContent>
44
- </Tooltip>
45
- )
46
- }
@@ -1 +0,0 @@
1
- export { CommandButton } from './CommandButton'
@@ -1,29 +0,0 @@
1
- import { Badge } from '@/components/ui/badge'
2
- import { RefreshCw } from 'lucide-react'
3
-
4
- interface ConnectionStatusProps {
5
- isConnected: boolean
6
- isReconnecting?: boolean
7
- reconnectInfo?: { attempt: number; max: number } | null
8
- }
9
-
10
- export function ConnectionStatus({ isConnected, isReconnecting, reconnectInfo }: ConnectionStatusProps) {
11
- if (isReconnecting && reconnectInfo) {
12
- return (
13
- <Badge variant="outline" className="text-yellow-500 border-yellow-500/50 animate-pulse">
14
- <RefreshCw className="w-3 h-3 mr-1 animate-spin" />
15
- Reconnecting ({reconnectInfo.attempt}/{reconnectInfo.max})
16
- </Badge>
17
- )
18
- }
19
-
20
- if (isConnected) {
21
- return (
22
- <Badge variant="outline" className="text-green-500 border-green-500/50">
23
- Connected
24
- </Badge>
25
- )
26
- }
27
-
28
- return null
29
- }
@@ -1 +0,0 @@
1
- export { ConnectionStatus } from './ConnectionStatus'