jettypod 4.4.120 → 4.4.121

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 (208) hide show
  1. package/.env +2 -1
  2. package/Cargo.lock +6450 -0
  3. package/Cargo.toml +35 -0
  4. package/README.md +5 -1
  5. package/TAURI-MIGRATION-PLAN.md +840 -0
  6. package/apps/dashboard/app/connect-claude/page.tsx +5 -6
  7. package/apps/dashboard/app/decision/[id]/page.tsx +54 -49
  8. package/apps/dashboard/app/demo/gates/page.tsx +3 -5
  9. package/apps/dashboard/app/design-system/page.tsx +1 -1
  10. package/apps/dashboard/app/globals.css +74 -2
  11. package/apps/dashboard/app/install-claude/page.tsx +3 -5
  12. package/apps/dashboard/app/login/page.tsx +17 -20
  13. package/apps/dashboard/app/page.tsx +101 -48
  14. package/apps/dashboard/app/settings/page.tsx +60 -12
  15. package/apps/dashboard/app/signup/page.tsx +14 -17
  16. package/apps/dashboard/app/subscribe/page.tsx +0 -2
  17. package/apps/dashboard/app/tests/page.tsx +37 -4
  18. package/apps/dashboard/app/welcome/page.tsx +12 -15
  19. package/apps/dashboard/app/work/[id]/page.tsx +90 -75
  20. package/apps/dashboard/app/work/[id]/proof/page.tsx +1489 -0
  21. package/apps/dashboard/components/AppShell.tsx +70 -61
  22. package/apps/dashboard/components/CardMenu.tsx +0 -1
  23. package/apps/dashboard/components/ClaudePanel.tsx +541 -283
  24. package/apps/dashboard/components/ClaudePanelInput.tsx +23 -4
  25. package/apps/dashboard/components/ConnectClaudeScreen.tsx +1 -5
  26. package/apps/dashboard/components/CopyableId.tsx +1 -2
  27. package/apps/dashboard/components/DetailReviewActions.tsx +11 -20
  28. package/apps/dashboard/components/DragContext.tsx +132 -62
  29. package/apps/dashboard/components/DraggableCard.tsx +3 -5
  30. package/apps/dashboard/components/DropZone.tsx +5 -6
  31. package/apps/dashboard/components/EditableDetailDescription.tsx +6 -12
  32. package/apps/dashboard/components/EditableDetailTitle.tsx +6 -13
  33. package/apps/dashboard/components/EditableTitle.tsx +0 -1
  34. package/apps/dashboard/components/ElapsedTimer.tsx +15 -3
  35. package/apps/dashboard/components/EpicGroup.tsx +100 -70
  36. package/apps/dashboard/components/GateCard.tsx +0 -1
  37. package/apps/dashboard/components/GateChoiceCard.tsx +1 -2
  38. package/apps/dashboard/components/InstallClaudeScreen.tsx +1 -5
  39. package/apps/dashboard/components/JettyLoader.tsx +0 -1
  40. package/apps/dashboard/components/KanbanBoard.tsx +319 -173
  41. package/apps/dashboard/components/KanbanCard.tsx +341 -107
  42. package/apps/dashboard/components/LazyCard.tsx +62 -0
  43. package/apps/dashboard/components/LazyMarkdown.tsx +0 -1
  44. package/apps/dashboard/components/MainNav.tsx +24 -25
  45. package/apps/dashboard/components/MessageBlock.tsx +93 -16
  46. package/apps/dashboard/components/ModeStartCard.tsx +0 -1
  47. package/apps/dashboard/components/OnboardingWelcome.tsx +0 -1
  48. package/apps/dashboard/components/PlaceholderCard.tsx +0 -1
  49. package/apps/dashboard/components/ProjectSwitcher.tsx +20 -20
  50. package/apps/dashboard/components/PrototypeTimeline.tsx +47 -26
  51. package/apps/dashboard/components/RealTimeKanbanWrapper.tsx +308 -223
  52. package/apps/dashboard/components/RealTimeTestsWrapper.tsx +303 -160
  53. package/apps/dashboard/components/ReviewFooter.tsx +12 -14
  54. package/apps/dashboard/components/SessionList.tsx +0 -1
  55. package/apps/dashboard/components/SubscribeContent.tsx +40 -11
  56. package/apps/dashboard/components/TestTree.tsx +1 -2
  57. package/apps/dashboard/components/TipCard.tsx +2 -4
  58. package/apps/dashboard/components/Toast.tsx +0 -1
  59. package/apps/dashboard/components/TypeIcon.tsx +7 -8
  60. package/apps/dashboard/components/ViewModeToolbar.tsx +104 -0
  61. package/apps/dashboard/components/WaveCompletionAnimation.tsx +5 -17
  62. package/apps/dashboard/components/WelcomeScreen.tsx +2 -6
  63. package/apps/dashboard/components/WorkItemHeader.tsx +0 -1
  64. package/apps/dashboard/components/WorkItemTree.tsx +2 -4
  65. package/apps/dashboard/components/settings/AccountSection.tsx +27 -13
  66. package/apps/dashboard/components/settings/AiContextSection.tsx +89 -0
  67. package/apps/dashboard/components/settings/ContextDocumentsSection.tsx +317 -0
  68. package/apps/dashboard/components/settings/EnvVarsSection.tsx +20 -73
  69. package/apps/dashboard/components/settings/GeneralSection.tsx +137 -26
  70. package/apps/dashboard/components/settings/ProjectStackSection.tsx +948 -0
  71. package/apps/dashboard/components/settings/SettingsLayout.tsx +0 -1
  72. package/apps/dashboard/components/ui/Button.tsx +1 -1
  73. package/apps/dashboard/components/ui/Input.tsx +1 -1
  74. package/apps/dashboard/components.json +1 -1
  75. package/apps/dashboard/contexts/ClaudeSessionContext.tsx +611 -358
  76. package/apps/dashboard/contexts/ConnectionStatusContext.tsx +0 -1
  77. package/apps/dashboard/contexts/UsageContext.tsx +62 -31
  78. package/apps/dashboard/dev.sh +35 -0
  79. package/apps/dashboard/eslint.config.mjs +9 -9
  80. package/apps/dashboard/hooks/useWebSocket.ts +138 -83
  81. package/apps/dashboard/index.html +73 -0
  82. package/apps/dashboard/lib/data-bridge.ts +722 -0
  83. package/apps/dashboard/lib/db.ts +69 -1302
  84. package/apps/dashboard/lib/environment-config.ts +173 -0
  85. package/apps/dashboard/lib/environment-verification.ts +119 -0
  86. package/apps/dashboard/lib/kanban-utils.ts +226 -26
  87. package/apps/dashboard/lib/proof-run.ts +495 -0
  88. package/apps/dashboard/lib/proof-scenario-runner.ts +346 -0
  89. package/apps/dashboard/lib/service-recovery.ts +326 -0
  90. package/apps/dashboard/lib/session-state-machine.ts +1 -0
  91. package/apps/dashboard/lib/session-state-utils.ts +0 -164
  92. package/apps/dashboard/lib/session-stream-manager.ts +253 -122
  93. package/apps/dashboard/lib/stream-manager-registry.ts +46 -6
  94. package/apps/dashboard/lib/tauri-bridge.ts +102 -0
  95. package/apps/dashboard/lib/tauri.ts +106 -0
  96. package/apps/dashboard/lib/utils.ts +3 -3
  97. package/apps/dashboard/next-env.d.ts +1 -1
  98. package/apps/dashboard/package.json +21 -33
  99. package/apps/dashboard/public/bug-icon.png +0 -0
  100. package/apps/dashboard/public/buoy-icon.png +0 -0
  101. package/apps/dashboard/public/in-flight-seagull.png +0 -0
  102. package/apps/dashboard/public/pier-icon.png +0 -0
  103. package/apps/dashboard/public/star-icon.png +0 -0
  104. package/apps/dashboard/public/wrench-icon.png +0 -0
  105. package/apps/dashboard/scripts/tauri-build.js +228 -0
  106. package/apps/dashboard/scripts/upload-tauri-to-r2.js +125 -0
  107. package/apps/dashboard/src/main.tsx +12 -0
  108. package/apps/dashboard/src/router.tsx +107 -0
  109. package/apps/dashboard/src/vite-env.d.ts +1 -0
  110. package/apps/dashboard/tsconfig.json +7 -12
  111. package/apps/dashboard/tsconfig.tsbuildinfo +1 -1
  112. package/apps/dashboard/vite.config.ts +33 -0
  113. package/apps/update-server/src/index.ts +167 -30
  114. package/claude-hooks/global-guardrails.js +14 -13
  115. package/crates/jettypod-cli/Cargo.toml +19 -0
  116. package/crates/jettypod-cli/src/commands.rs +1249 -0
  117. package/crates/jettypod-cli/src/main.rs +595 -0
  118. package/crates/jettypod-core/Cargo.toml +26 -0
  119. package/crates/jettypod-core/build.rs +98 -0
  120. package/crates/jettypod-core/migrations/V1__baseline.sql +197 -0
  121. package/crates/jettypod-core/migrations/V2__work_items_indexes.sql +6 -0
  122. package/crates/jettypod-core/migrations/V3__qa_steps.sql +2 -0
  123. package/crates/jettypod-core/src/auth.rs +294 -0
  124. package/crates/jettypod-core/src/config.rs +397 -0
  125. package/crates/jettypod-core/src/db/mod.rs +507 -0
  126. package/crates/jettypod-core/src/db/recovery.rs +114 -0
  127. package/crates/jettypod-core/src/db/startup.rs +101 -0
  128. package/crates/jettypod-core/src/db/validate.rs +149 -0
  129. package/crates/jettypod-core/src/error.rs +76 -0
  130. package/crates/jettypod-core/src/git.rs +458 -0
  131. package/crates/jettypod-core/src/lib.rs +20 -0
  132. package/crates/jettypod-core/src/sessions.rs +625 -0
  133. package/crates/jettypod-core/src/skills.rs +556 -0
  134. package/crates/jettypod-core/src/work.rs +1086 -0
  135. package/crates/jettypod-core/src/worktree.rs +628 -0
  136. package/crates/jettypod-core/src/ws.rs +767 -0
  137. package/cucumber-test.cjs +6 -0
  138. package/jettypod.js +96 -4
  139. package/lib/bdd-preflight.js +96 -0
  140. package/lib/merge-lock.js +111 -253
  141. package/lib/migrations/030-rejection-round-columns.js +54 -0
  142. package/lib/migrations/031-session-isolation-index.js +17 -0
  143. package/lib/work-commands/index.js +58 -16
  144. package/lib/work-tracking/index.js +108 -8
  145. package/package.json +1 -1
  146. package/skills-templates/bug-mode/SKILL.md +43 -1
  147. package/skills-templates/chore-mode/SKILL.md +40 -1
  148. package/skills-templates/design-system-selection/SKILL.md +273 -0
  149. package/skills-templates/epic-planning/SKILL.md +14 -0
  150. package/skills-templates/feature-planning/SKILL.md +90 -1
  151. package/skills-templates/production-mode/SKILL.md +20 -0
  152. package/skills-templates/simple-improvement/SKILL.md +39 -2
  153. package/skills-templates/speed-mode/SKILL.md +10 -15
  154. package/skills-templates/stable-mode/SKILL.md +47 -0
  155. package/apps/dashboard/README.md +0 -36
  156. package/apps/dashboard/app/api/claude/[workItemId]/message/route.ts +0 -446
  157. package/apps/dashboard/app/api/claude/[workItemId]/pin/route.ts +0 -24
  158. package/apps/dashboard/app/api/claude/[workItemId]/route.ts +0 -280
  159. package/apps/dashboard/app/api/claude/sessions/[sessionId]/content/route.ts +0 -52
  160. package/apps/dashboard/app/api/claude/sessions/[sessionId]/message/route.ts +0 -525
  161. package/apps/dashboard/app/api/claude/sessions/[sessionId]/pin/route.ts +0 -24
  162. package/apps/dashboard/app/api/claude/sessions/cleanup/route.ts +0 -34
  163. package/apps/dashboard/app/api/claude/sessions/route.ts +0 -184
  164. package/apps/dashboard/app/api/decisions/[id]/route.ts +0 -25
  165. package/apps/dashboard/app/api/internal/set-project/route.ts +0 -17
  166. package/apps/dashboard/app/api/kanban/route.ts +0 -15
  167. package/apps/dashboard/app/api/settings/env-vars/route.ts +0 -125
  168. package/apps/dashboard/app/api/settings/general/route.ts +0 -21
  169. package/apps/dashboard/app/api/tests/route.ts +0 -9
  170. package/apps/dashboard/app/api/tests/run/route.ts +0 -82
  171. package/apps/dashboard/app/api/tests/run/stream/route.ts +0 -71
  172. package/apps/dashboard/app/api/tests/undefined/route.ts +0 -9
  173. package/apps/dashboard/app/api/usage/route.ts +0 -17
  174. package/apps/dashboard/app/api/work/[id]/description/route.ts +0 -21
  175. package/apps/dashboard/app/api/work/[id]/epic/route.ts +0 -21
  176. package/apps/dashboard/app/api/work/[id]/order/route.ts +0 -21
  177. package/apps/dashboard/app/api/work/[id]/route.ts +0 -35
  178. package/apps/dashboard/app/api/work/[id]/status/route.ts +0 -63
  179. package/apps/dashboard/app/api/work/[id]/title/route.ts +0 -21
  180. package/apps/dashboard/app/layout.tsx +0 -55
  181. package/apps/dashboard/components/UpgradeBanner.tsx +0 -30
  182. package/apps/dashboard/electron/ipc-handlers.js +0 -1026
  183. package/apps/dashboard/electron/main.js +0 -2306
  184. package/apps/dashboard/electron/preload.js +0 -125
  185. package/apps/dashboard/electron/session-manager.js +0 -163
  186. package/apps/dashboard/electron-builder.config.js +0 -357
  187. package/apps/dashboard/hooks/useClaudeSessions.ts +0 -299
  188. package/apps/dashboard/lib/backlog-parser.ts +0 -50
  189. package/apps/dashboard/lib/claude-process-manager.ts +0 -529
  190. package/apps/dashboard/lib/db-bridge.ts +0 -283
  191. package/apps/dashboard/lib/prototypes.ts +0 -202
  192. package/apps/dashboard/lib/test-results-db.ts +0 -307
  193. package/apps/dashboard/lib/tests.ts +0 -282
  194. package/apps/dashboard/next.config.js +0 -66
  195. package/apps/dashboard/postcss.config.mjs +0 -7
  196. package/apps/dashboard/public/bug-icon.svg +0 -9
  197. package/apps/dashboard/public/buoy-icon.svg +0 -9
  198. package/apps/dashboard/public/file.svg +0 -1
  199. package/apps/dashboard/public/globe.svg +0 -1
  200. package/apps/dashboard/public/in-flight-seagull.svg +0 -9
  201. package/apps/dashboard/public/next.svg +0 -1
  202. package/apps/dashboard/public/pier-icon.svg +0 -14
  203. package/apps/dashboard/public/star-icon.svg +0 -9
  204. package/apps/dashboard/public/vercel.svg +0 -1
  205. package/apps/dashboard/public/window.svg +0 -1
  206. package/apps/dashboard/public/wrench-icon.svg +0 -9
  207. package/apps/dashboard/scripts/download-node.js +0 -104
  208. package/apps/dashboard/scripts/upload-to-r2.js +0 -89
@@ -0,0 +1,12 @@
1
+ import { StrictMode } from 'react'
2
+ import { createRoot } from 'react-dom/client'
3
+ import { RouterProvider } from 'react-router-dom'
4
+ import { router } from './router'
5
+ import '@fontsource-variable/geist-mono'
6
+ import '../app/globals.css'
7
+
8
+ createRoot(document.getElementById('root')!).render(
9
+ <StrictMode>
10
+ <RouterProvider router={router} />
11
+ </StrictMode>
12
+ )
@@ -0,0 +1,107 @@
1
+ import { lazy, Suspense, useState, useEffect } from 'react'
2
+ import { createBrowserRouter, Outlet } from 'react-router-dom'
3
+ import { AppShell } from '../components/AppShell'
4
+ import { JettyLoader } from '../components/JettyLoader'
5
+ import { dataBridge } from '../lib/data-bridge'
6
+
7
+ // Lazy-load all pages — prefetch nav targets on app load so first navigation
8
+ // never shows a spinner. It's a desktop app; the extra chunks cost nothing.
9
+ const dashboardImport = () => import('../app/page')
10
+ const Dashboard = lazy(dashboardImport)
11
+ const workDetailImport = () => import('../app/work/[id]/page')
12
+ const WorkDetail = lazy(workDetailImport)
13
+ const proofDashboardImport = () => import('../app/work/[id]/proof/page')
14
+ const ProofDashboard = lazy(proofDashboardImport)
15
+ const decisionDetailImport = () => import('../app/decision/[id]/page')
16
+ const DecisionDetail = lazy(decisionDetailImport)
17
+ const testsImport = () => import('../app/tests/page')
18
+ const Tests = lazy(testsImport)
19
+ const settingsImport = () => import('../app/settings/page')
20
+ const Settings = lazy(settingsImport)
21
+ const prototypesImport = () => import('../app/prototypes/page')
22
+ const Prototypes = lazy(prototypesImport)
23
+
24
+ // Kick off chunk prefetches immediately
25
+ dashboardImport()
26
+ workDetailImport()
27
+ proofDashboardImport()
28
+ decisionDetailImport()
29
+ testsImport()
30
+ settingsImport()
31
+ prototypesImport()
32
+
33
+ const Welcome = lazy(() => import('../app/welcome/page'))
34
+ const Login = lazy(() => import('../app/login/page'))
35
+ const Signup = lazy(() => import('../app/signup/page'))
36
+ const Subscribe = lazy(() => import('../app/subscribe/page'))
37
+ const InstallClaude = lazy(() => import('../app/install-claude/page'))
38
+ const ConnectClaude = lazy(() => import('../app/connect-claude/page'))
39
+ // Dev-only pages — excluded from production to reduce bundle
40
+ const DesignSystem = import.meta.env.DEV ? lazy(() => import('../app/design-system/page')) : () => null
41
+ const DemoGates = import.meta.env.DEV ? lazy(() => import('../app/demo/gates/page')) : () => null
42
+ const DevSessionPrototype = import.meta.env.DEV ? lazy(() => import('../app/prototypes/dev-session/page')) : () => null
43
+ const ProofDashboardPrototype = import.meta.env.DEV ? lazy(() => import('../app/prototypes/proof-dashboard/page')) : () => null
44
+ const OnboardingPrototype = import.meta.env.DEV ? lazy(() => import('../app/prototypes/onboarding/page')) : () => null
45
+ const OnboardingMadlibPrototype = import.meta.env.DEV ? lazy(() => import('../app/prototypes/onboarding-madlib/page')) : () => null
46
+
47
+ function PageLoader() {
48
+ return (
49
+ <div className="h-full flex items-center justify-center bg-background">
50
+ <JettyLoader size={80} />
51
+ </div>
52
+ )
53
+ }
54
+
55
+ function RootLayout() {
56
+ const [projectName, setProjectName] = useState('JettyPod')
57
+
58
+ useEffect(() => {
59
+ dataBridge.getProjectRoot().then((root) => {
60
+ if (root) {
61
+ setProjectName(root.split('/').pop() || 'JettyPod')
62
+ }
63
+ })
64
+ }, [])
65
+
66
+ return (
67
+ <AppShell projectName={projectName}>
68
+ <Outlet />
69
+ </AppShell>
70
+ )
71
+ }
72
+
73
+ export const router = createBrowserRouter([
74
+ {
75
+ path: '/',
76
+ element: <RootLayout />,
77
+ children: [
78
+ {
79
+ // Dashboard layout route — kanban stays mounted while viewing work items.
80
+ // Navigating to /work/:id hides the kanban (display:none) instead of
81
+ // unmounting it, so returning to / is instant with no refetch.
82
+ element: <Suspense fallback={<PageLoader />}><Dashboard /></Suspense>,
83
+ children: [
84
+ { index: true, element: null },
85
+ { path: 'work/:id', element: <Suspense fallback={<PageLoader />}><WorkDetail /></Suspense> },
86
+ { path: 'work/:id/proof', element: <Suspense fallback={<PageLoader />}><ProofDashboard /></Suspense> },
87
+ { path: 'decision/:id', element: <Suspense fallback={<PageLoader />}><DecisionDetail /></Suspense> },
88
+ ],
89
+ },
90
+ { path: 'tests', element: <Suspense fallback={<PageLoader />}><Tests /></Suspense> },
91
+ { path: 'settings', element: <Suspense fallback={<PageLoader />}><Settings /></Suspense> },
92
+ { path: 'prototypes', element: <Suspense fallback={<PageLoader />}><Prototypes /></Suspense> },
93
+ { path: 'welcome', element: <Suspense fallback={<PageLoader />}><Welcome /></Suspense> },
94
+ { path: 'login', element: <Suspense fallback={<PageLoader />}><Login /></Suspense> },
95
+ { path: 'signup', element: <Suspense fallback={<PageLoader />}><Signup /></Suspense> },
96
+ { path: 'subscribe', element: <Suspense fallback={<PageLoader />}><Subscribe /></Suspense> },
97
+ { path: 'install-claude', element: <Suspense fallback={<PageLoader />}><InstallClaude /></Suspense> },
98
+ { path: 'connect-claude', element: <Suspense fallback={<PageLoader />}><ConnectClaude /></Suspense> },
99
+ { path: 'design-system', element: <Suspense fallback={<PageLoader />}><DesignSystem /></Suspense> },
100
+ { path: 'demo/gates', element: <Suspense fallback={<PageLoader />}><DemoGates /></Suspense> },
101
+ { path: 'prototypes/dev-session', element: <Suspense fallback={<PageLoader />}><DevSessionPrototype /></Suspense> },
102
+ { path: 'prototypes/proof-dashboard', element: <Suspense fallback={<PageLoader />}><ProofDashboardPrototype /></Suspense> },
103
+ { path: 'prototypes/onboarding', element: <Suspense fallback={<PageLoader />}><OnboardingPrototype /></Suspense> },
104
+ { path: 'prototypes/onboarding-madlib', element: <Suspense fallback={<PageLoader />}><OnboardingMadlibPrototype /></Suspense> },
105
+ ],
106
+ },
107
+ ])
@@ -0,0 +1 @@
1
+ /// <reference types="vite/client" />
@@ -13,22 +13,17 @@
13
13
  "isolatedModules": true,
14
14
  "jsx": "react-jsx",
15
15
  "incremental": true,
16
- "plugins": [
17
- {
18
- "name": "next"
19
- }
20
- ],
21
16
  "paths": {
22
17
  "@/*": ["./*"]
23
18
  }
24
19
  },
25
20
  "include": [
26
- "next-env.d.ts",
27
- "**/*.ts",
28
- "**/*.tsx",
29
- ".next/types/**/*.ts",
30
- ".next/dev/types/**/*.ts",
31
- "**/*.mts"
21
+ "src",
22
+ "app",
23
+ "components",
24
+ "contexts",
25
+ "hooks",
26
+ "lib"
32
27
  ],
33
- "exclude": ["node_modules"]
28
+ "exclude": ["node_modules", "dist", ".next"]
34
29
  }