@atercates/claude-deck 0.2.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 (293) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/app/api/claude/hidden/route.ts +66 -0
  4. package/app/api/claude/projects/[name]/sessions/route.ts +71 -0
  5. package/app/api/claude/projects/route.ts +44 -0
  6. package/app/api/code-search/available/route.ts +12 -0
  7. package/app/api/code-search/route.ts +47 -0
  8. package/app/api/dev-servers/[id]/logs/route.ts +23 -0
  9. package/app/api/dev-servers/[id]/restart/route.ts +20 -0
  10. package/app/api/dev-servers/[id]/route.ts +51 -0
  11. package/app/api/dev-servers/[id]/stop/route.ts +20 -0
  12. package/app/api/dev-servers/detect/route.ts +39 -0
  13. package/app/api/dev-servers/route.ts +48 -0
  14. package/app/api/exec/route.ts +60 -0
  15. package/app/api/files/content/route.ts +76 -0
  16. package/app/api/files/route.ts +37 -0
  17. package/app/api/files/upload-temp/route.ts +41 -0
  18. package/app/api/git/check/route.ts +54 -0
  19. package/app/api/git/clone/route.ts +99 -0
  20. package/app/api/git/commit/route.ts +75 -0
  21. package/app/api/git/discard/route.ts +38 -0
  22. package/app/api/git/file-content/route.ts +64 -0
  23. package/app/api/git/history/[hash]/diff/route.ts +38 -0
  24. package/app/api/git/history/[hash]/route.ts +34 -0
  25. package/app/api/git/history/route.ts +27 -0
  26. package/app/api/git/multi-status/route.ts +46 -0
  27. package/app/api/git/pr/route.ts +164 -0
  28. package/app/api/git/push/route.ts +64 -0
  29. package/app/api/git/stage/route.ts +40 -0
  30. package/app/api/git/status/route.ts +51 -0
  31. package/app/api/git/unstage/route.ts +46 -0
  32. package/app/api/groups/[...path]/route.ts +136 -0
  33. package/app/api/groups/route.ts +93 -0
  34. package/app/api/orchestrate/spawn/route.ts +45 -0
  35. package/app/api/orchestrate/workers/[id]/route.ts +89 -0
  36. package/app/api/orchestrate/workers/route.ts +31 -0
  37. package/app/api/projects/[id]/detect/route.ts +27 -0
  38. package/app/api/projects/[id]/dev-servers/[dsId]/route.ts +66 -0
  39. package/app/api/projects/[id]/dev-servers/route.ts +51 -0
  40. package/app/api/projects/[id]/repositories/[repoId]/route.ts +67 -0
  41. package/app/api/projects/[id]/repositories/route.ts +74 -0
  42. package/app/api/projects/[id]/route.ts +108 -0
  43. package/app/api/projects/detect/route.ts +33 -0
  44. package/app/api/projects/route.ts +59 -0
  45. package/app/api/sessions/[id]/claude-session/route.ts +42 -0
  46. package/app/api/sessions/[id]/fork/route.ts +74 -0
  47. package/app/api/sessions/[id]/mcp-config/route.ts +34 -0
  48. package/app/api/sessions/[id]/messages/route.ts +60 -0
  49. package/app/api/sessions/[id]/pr/route.ts +188 -0
  50. package/app/api/sessions/[id]/preview/route.ts +42 -0
  51. package/app/api/sessions/[id]/route.ts +229 -0
  52. package/app/api/sessions/[id]/send-keys/route.ts +119 -0
  53. package/app/api/sessions/[id]/summarize/route.ts +331 -0
  54. package/app/api/sessions/init-script/route.ts +84 -0
  55. package/app/api/sessions/route.ts +209 -0
  56. package/app/api/sessions/status/route.ts +237 -0
  57. package/app/api/system/route.ts +9 -0
  58. package/app/api/tmux/kill-all/route.ts +57 -0
  59. package/app/api/tmux/rename/route.ts +30 -0
  60. package/app/globals.css +174 -0
  61. package/app/icon.svg +11 -0
  62. package/app/layout.tsx +122 -0
  63. package/app/page.tsx +629 -0
  64. package/components/ChatMessage.tsx +65 -0
  65. package/components/ChatView.tsx +276 -0
  66. package/components/ClaudeProjects/ClaudeProjectCard.tsx +195 -0
  67. package/components/ClaudeProjects/ClaudeProjectsSection.tsx +89 -0
  68. package/components/ClaudeProjects/ClaudeSessionCard.tsx +100 -0
  69. package/components/ClaudeProjects/index.ts +1 -0
  70. package/components/CodeSearch/CodeSearchResults.tsx +177 -0
  71. package/components/ConductorPanel.tsx +256 -0
  72. package/components/DevServers/DevServerCard.tsx +311 -0
  73. package/components/DevServers/DevServersSection.tsx +91 -0
  74. package/components/DevServers/ServerLogsModal.tsx +151 -0
  75. package/components/DevServers/StartServerDialog.tsx +359 -0
  76. package/components/DevServers/index.ts +4 -0
  77. package/components/DiffViewer/DiffModal.tsx +151 -0
  78. package/components/DiffViewer/UnifiedDiff.tsx +185 -0
  79. package/components/DiffViewer/index.tsx +2 -0
  80. package/components/DirectoryPicker.tsx +355 -0
  81. package/components/FileExplorer/FileEditor.tsx +276 -0
  82. package/components/FileExplorer/FileTabs.tsx +118 -0
  83. package/components/FileExplorer/FileTree.tsx +214 -0
  84. package/components/FileExplorer/HtmlRenderer.tsx +16 -0
  85. package/components/FileExplorer/MarkdownRenderer.tsx +18 -0
  86. package/components/FileExplorer/index.tsx +520 -0
  87. package/components/FilePicker.tsx +339 -0
  88. package/components/FolderPicker.tsx +201 -0
  89. package/components/GitDrawer/FileEditDialog.tsx +400 -0
  90. package/components/GitDrawer/index.tsx +464 -0
  91. package/components/GitPanel/CommitForm.tsx +205 -0
  92. package/components/GitPanel/CommitHistory.tsx +174 -0
  93. package/components/GitPanel/CommitItem.tsx +196 -0
  94. package/components/GitPanel/FileChanges.tsx +414 -0
  95. package/components/GitPanel/GitPanelTabs.tsx +39 -0
  96. package/components/GitPanel/index.tsx +817 -0
  97. package/components/MessageInput.tsx +82 -0
  98. package/components/NewClaudeSessionDialog.tsx +166 -0
  99. package/components/NewSessionDialog/AdvancedSettings.tsx +78 -0
  100. package/components/NewSessionDialog/AgentSelector.tsx +37 -0
  101. package/components/NewSessionDialog/CreatingOverlay.tsx +94 -0
  102. package/components/NewSessionDialog/NewSessionDialog.types.ts +136 -0
  103. package/components/NewSessionDialog/ProjectSelector.tsx +146 -0
  104. package/components/NewSessionDialog/WorkingDirectoryInput.tsx +55 -0
  105. package/components/NewSessionDialog/WorktreeSection.tsx +92 -0
  106. package/components/NewSessionDialog/hooks/useNewSessionForm.ts +370 -0
  107. package/components/NewSessionDialog/index.tsx +106 -0
  108. package/components/NotificationSettings.tsx +127 -0
  109. package/components/PRCreationModal.tsx +272 -0
  110. package/components/Pane/DesktopTabBar.tsx +353 -0
  111. package/components/Pane/MobileTabBar.tsx +210 -0
  112. package/components/Pane/OpenInVSCode.tsx +69 -0
  113. package/components/Pane/PaneSkeletons.tsx +57 -0
  114. package/components/Pane/index.tsx +558 -0
  115. package/components/PaneLayout.tsx +60 -0
  116. package/components/Projects/DevServersSection.tsx +140 -0
  117. package/components/Projects/DirectoryField.tsx +92 -0
  118. package/components/Projects/NewProjectDialog.tsx +188 -0
  119. package/components/Projects/NewProjectDialog.types.ts +46 -0
  120. package/components/Projects/ProjectCard.tsx +276 -0
  121. package/components/Projects/ProjectSettingsDialog.tsx +811 -0
  122. package/components/Projects/hooks/useNewProjectForm.ts +249 -0
  123. package/components/Projects/index.ts +3 -0
  124. package/components/Providers.tsx +49 -0
  125. package/components/QuickSwitcher.tsx +306 -0
  126. package/components/SessionList/KillAllConfirm.tsx +46 -0
  127. package/components/SessionList/SelectionToolbar.tsx +164 -0
  128. package/components/SessionList/SessionList.types.ts +37 -0
  129. package/components/SessionList/SessionListHeader.tsx +71 -0
  130. package/components/SessionList/hooks/useSessionListMutations.ts +269 -0
  131. package/components/SessionList/index.tsx +189 -0
  132. package/components/ShellDrawer/index.tsx +106 -0
  133. package/components/SidebarFooter.tsx +55 -0
  134. package/components/Terminal/KeybarToggleButton.tsx +45 -0
  135. package/components/Terminal/ScrollToBottomButton.tsx +32 -0
  136. package/components/Terminal/SearchBar.tsx +71 -0
  137. package/components/Terminal/TerminalToolbar.tsx +551 -0
  138. package/components/Terminal/VirtualKeyboard.tsx +711 -0
  139. package/components/Terminal/constants.ts +20 -0
  140. package/components/Terminal/hooks/index.ts +5 -0
  141. package/components/Terminal/hooks/resize-handlers.ts +140 -0
  142. package/components/Terminal/hooks/terminal-init.ts +151 -0
  143. package/components/Terminal/hooks/touch-scroll.ts +155 -0
  144. package/components/Terminal/hooks/useTerminalConnection.ts +282 -0
  145. package/components/Terminal/hooks/useTerminalConnection.types.ts +39 -0
  146. package/components/Terminal/hooks/useTerminalSearch.ts +103 -0
  147. package/components/Terminal/hooks/websocket-connection.ts +274 -0
  148. package/components/Terminal/index.tsx +320 -0
  149. package/components/ThemeToggle.tsx +168 -0
  150. package/components/TmuxSessions.tsx +132 -0
  151. package/components/ToolCallDisplay.tsx +71 -0
  152. package/components/WorkerCard.tsx +245 -0
  153. package/components/a/ABadge.tsx +115 -0
  154. package/components/a/AButton.tsx +163 -0
  155. package/components/a/ADialog.tsx +93 -0
  156. package/components/a/ADropdownMenu.tsx +279 -0
  157. package/components/a/AIconButton.tsx +190 -0
  158. package/components/a/ASheet.tsx +150 -0
  159. package/components/a/ATooltip.tsx +77 -0
  160. package/components/a/index.ts +64 -0
  161. package/components/mobile/SwipeSidebar.tsx +122 -0
  162. package/components/ui/badge.tsx +41 -0
  163. package/components/ui/button.tsx +60 -0
  164. package/components/ui/context-menu.tsx +197 -0
  165. package/components/ui/dialog.tsx +143 -0
  166. package/components/ui/dropdown-menu.tsx +257 -0
  167. package/components/ui/input.tsx +21 -0
  168. package/components/ui/scroll-area.tsx +52 -0
  169. package/components/ui/select.tsx +159 -0
  170. package/components/ui/skeleton.tsx +111 -0
  171. package/components/ui/switch.tsx +31 -0
  172. package/components/ui/textarea.tsx +21 -0
  173. package/components/ui/tooltip.tsx +32 -0
  174. package/components/views/DesktopView.tsx +244 -0
  175. package/components/views/MobileView.tsx +110 -0
  176. package/components/views/types.ts +75 -0
  177. package/contexts/PaneContext.tsx +336 -0
  178. package/data/claude/index.ts +9 -0
  179. package/data/claude/keys.ts +6 -0
  180. package/data/claude/queries.ts +120 -0
  181. package/data/claude/useClaudeUpdates.ts +37 -0
  182. package/data/code-search/index.ts +2 -0
  183. package/data/code-search/keys.ts +7 -0
  184. package/data/code-search/queries.ts +61 -0
  185. package/data/dev-servers/index.ts +8 -0
  186. package/data/dev-servers/keys.ts +4 -0
  187. package/data/dev-servers/queries.ts +104 -0
  188. package/data/files/index.ts +3 -0
  189. package/data/files/keys.ts +4 -0
  190. package/data/files/queries.ts +25 -0
  191. package/data/git/keys.ts +15 -0
  192. package/data/git/queries.ts +395 -0
  193. package/data/groups/index.ts +1 -0
  194. package/data/groups/mutations.ts +95 -0
  195. package/data/projects/index.ts +10 -0
  196. package/data/projects/keys.ts +4 -0
  197. package/data/projects/queries.ts +193 -0
  198. package/data/repositories/index.ts +7 -0
  199. package/data/repositories/keys.ts +5 -0
  200. package/data/repositories/queries.ts +122 -0
  201. package/data/sessions/index.ts +12 -0
  202. package/data/sessions/keys.ts +8 -0
  203. package/data/sessions/queries.ts +218 -0
  204. package/data/statuses/index.ts +1 -0
  205. package/data/statuses/queries.ts +69 -0
  206. package/hooks/useCopyToClipboard.ts +48 -0
  207. package/hooks/useDevServersManager.ts +73 -0
  208. package/hooks/useDirectoryBrowser.ts +90 -0
  209. package/hooks/useDrawerAnimation.ts +27 -0
  210. package/hooks/useFileDrop.ts +87 -0
  211. package/hooks/useFileEditor.ts +184 -0
  212. package/hooks/useGroups.ts +37 -0
  213. package/hooks/useHomePath.ts +34 -0
  214. package/hooks/useKeyRepeat.ts +55 -0
  215. package/hooks/useKeybarVisibility.ts +42 -0
  216. package/hooks/useNotifications.ts +257 -0
  217. package/hooks/useProjects.ts +53 -0
  218. package/hooks/useSessionStatuses.ts +30 -0
  219. package/hooks/useSessions.ts +86 -0
  220. package/hooks/useSpeechRecognition.ts +124 -0
  221. package/hooks/useViewport.ts +32 -0
  222. package/hooks/useViewportHeight.ts +50 -0
  223. package/lib/async-operations.ts +35 -0
  224. package/lib/banner.ts +81 -0
  225. package/lib/claude/jsonl-cache.ts +86 -0
  226. package/lib/claude/jsonl-reader.ts +271 -0
  227. package/lib/claude/process-manager.ts +278 -0
  228. package/lib/claude/stream-parser.ts +173 -0
  229. package/lib/claude/types.ts +154 -0
  230. package/lib/claude/watcher.ts +71 -0
  231. package/lib/client/session-registry.ts +111 -0
  232. package/lib/code-search.ts +121 -0
  233. package/lib/db/index.ts +48 -0
  234. package/lib/db/migrations.ts +45 -0
  235. package/lib/db/queries.ts +460 -0
  236. package/lib/db/schema.ts +114 -0
  237. package/lib/db/types.ts +92 -0
  238. package/lib/db.ts +2 -0
  239. package/lib/dev-servers.ts +509 -0
  240. package/lib/diff-parser.ts +221 -0
  241. package/lib/env-setup.ts +285 -0
  242. package/lib/file-upload.ts +34 -0
  243. package/lib/file-utils.ts +50 -0
  244. package/lib/files.ts +207 -0
  245. package/lib/git-history.ts +294 -0
  246. package/lib/git-status.ts +391 -0
  247. package/lib/git.ts +257 -0
  248. package/lib/mcp-config.ts +81 -0
  249. package/lib/multi-repo-git.ts +179 -0
  250. package/lib/notifications.ts +219 -0
  251. package/lib/orchestration.ts +448 -0
  252. package/lib/panes.ts +232 -0
  253. package/lib/ports.ts +97 -0
  254. package/lib/pr-generation.ts +307 -0
  255. package/lib/pr.ts +234 -0
  256. package/lib/projects.ts +578 -0
  257. package/lib/providers/registry.ts +70 -0
  258. package/lib/providers.ts +121 -0
  259. package/lib/query-client.ts +14 -0
  260. package/lib/rangeSelectionUtils.ts +65 -0
  261. package/lib/status-detector.ts +375 -0
  262. package/lib/terminal-themes.ts +265 -0
  263. package/lib/theme-config.ts +327 -0
  264. package/lib/utils.ts +6 -0
  265. package/lib/worktrees.ts +262 -0
  266. package/mcp/orchestration-server.ts +438 -0
  267. package/package.json +139 -0
  268. package/postcss.config.mjs +7 -0
  269. package/public/icon.svg +10 -0
  270. package/public/icons/icon-128x128.png +0 -0
  271. package/public/icons/icon-144x144.png +0 -0
  272. package/public/icons/icon-152x152.png +0 -0
  273. package/public/icons/icon-192x192.png +0 -0
  274. package/public/icons/icon-384x384.png +0 -0
  275. package/public/icons/icon-512x512.png +0 -0
  276. package/public/icons/icon-72x72.png +0 -0
  277. package/public/icons/icon-96x96.png +0 -0
  278. package/public/manifest.json +61 -0
  279. package/public/sw.js +64 -0
  280. package/scripts/agent-os +91 -0
  281. package/scripts/install.sh +48 -0
  282. package/scripts/lib/ai-clis.sh +132 -0
  283. package/scripts/lib/commands.sh +487 -0
  284. package/scripts/lib/common.sh +89 -0
  285. package/scripts/lib/prerequisites.sh +462 -0
  286. package/scripts/setup.sh +134 -0
  287. package/server.ts +155 -0
  288. package/stores/fileOpen.ts +26 -0
  289. package/stores/index.ts +1 -0
  290. package/stores/initialPrompt.ts +24 -0
  291. package/stores/sessionSelection.ts +48 -0
  292. package/styles/themes.css +603 -0
  293. package/tsconfig.json +33 -0
package/package.json ADDED
@@ -0,0 +1,139 @@
1
+ {
2
+ "name": "@atercates/claude-deck",
3
+ "version": "0.2.1",
4
+ "description": "Self-hosted web UI for managing Claude Code sessions",
5
+ "bin": {
6
+ "claude-deck": "./scripts/claude-deck"
7
+ },
8
+ "files": [
9
+ "app/",
10
+ "components/",
11
+ "contexts/",
12
+ "data/",
13
+ "hooks/",
14
+ "lib/",
15
+ "mcp/",
16
+ "public/",
17
+ "scripts/",
18
+ "stores/",
19
+ "styles/",
20
+ "next.config.js",
21
+ "postcss.config.mjs",
22
+ "server.ts",
23
+ "tailwind.config.ts",
24
+ "tsconfig.json",
25
+ "package-lock.json",
26
+ "README.md",
27
+ "LICENSE"
28
+ ],
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/atercates/claude-deck.git"
32
+ },
33
+ "keywords": [
34
+ "claude",
35
+ "ai",
36
+ "terminal",
37
+ "tmux",
38
+ "agent"
39
+ ],
40
+ "author": "Saad Naveed",
41
+ "license": "MIT",
42
+ "engines": {
43
+ "node": ">=24"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/atercates/claude-deck/issues"
47
+ },
48
+ "homepage": "https://github.com/atercates/claude-deck#readme",
49
+ "dependencies": {
50
+ "@anthropic-ai/claude-agent-sdk": "^0.2.104",
51
+ "@codemirror/lang-css": "^6.3.1",
52
+ "@codemirror/lang-html": "^6.4.11",
53
+ "@codemirror/lang-javascript": "^6.2.5",
54
+ "@codemirror/lang-json": "^6.0.2",
55
+ "@codemirror/lang-markdown": "^6.5.0",
56
+ "@codemirror/lang-python": "^6.2.1",
57
+ "@codemirror/language": "^6.12.3",
58
+ "@codemirror/state": "^6.6.0",
59
+ "@codemirror/view": "^6.41.0",
60
+ "@lezer/highlight": "^1.2.3",
61
+ "@modelcontextprotocol/sdk": "^1.29.0",
62
+ "@monaco-editor/react": "^4.7.0",
63
+ "@radix-ui/react-context-menu": "^2.2.16",
64
+ "@radix-ui/react-dialog": "^1.1.15",
65
+ "@radix-ui/react-dropdown-menu": "^2.1.16",
66
+ "@radix-ui/react-scroll-area": "^1.2.10",
67
+ "@radix-ui/react-select": "^2.2.6",
68
+ "@radix-ui/react-slot": "^1.2.4",
69
+ "@radix-ui/react-switch": "^1.2.6",
70
+ "@radix-ui/react-tooltip": "^1.2.8",
71
+ "@tailwindcss/typography": "^0.5.19",
72
+ "@tanstack/react-query": "^5.97.0",
73
+ "@tanstack/react-query-devtools": "^5.97.0",
74
+ "@types/react-syntax-highlighter": "^15.5.13",
75
+ "@uiw/react-codemirror": "^4.25.9",
76
+ "@xterm/addon-canvas": "^0.7.0",
77
+ "@xterm/addon-fit": "^0.11.0",
78
+ "@xterm/addon-search": "^0.16.0",
79
+ "@xterm/addon-web-links": "^0.12.0",
80
+ "@xterm/xterm": "^6.0.0",
81
+ "better-sqlite3": "^12.8.0",
82
+ "chokidar": "^5.0.0",
83
+ "class-variance-authority": "^0.7.1",
84
+ "clsx": "^2.1.1",
85
+ "highlight.js": "^11.11.1",
86
+ "lucide-react": "^1.8.0",
87
+ "monaco-editor": "^0.55.1",
88
+ "next": "^16.2.3",
89
+ "next-themes": "^0.4.6",
90
+ "node-pty": "1.2.0-beta.12",
91
+ "react": "^19.2.5",
92
+ "react-dom": "^19.2.5",
93
+ "react-markdown": "^10.1.0",
94
+ "react-resizable-panels": "^4.9.0",
95
+ "react-syntax-highlighter": "^16.1.1",
96
+ "remark-gfm": "^4.0.1",
97
+ "sonner": "^2.0.7",
98
+ "tailwind-merge": "^3.5.0",
99
+ "valtio": "^2.3.1",
100
+ "ws": "^8.20.0"
101
+ },
102
+ "devDependencies": {
103
+ "@eslint/eslintrc": "^3.3.5",
104
+ "@next/eslint-plugin-next": "^16.2.3",
105
+ "@tailwindcss/postcss": "^4.2.2",
106
+ "@tauri-apps/api": "^2.10.1",
107
+ "@tauri-apps/cli": "^2.10.1",
108
+ "@types/better-sqlite3": "^7.6.13",
109
+ "@types/node": "^25.6.0",
110
+ "@types/react": "^19.2.14",
111
+ "@types/react-dom": "^19.2.3",
112
+ "@types/ws": "^8.18.1",
113
+ "eslint": "^10.2.0",
114
+ "eslint-config-prettier": "^10.1.8",
115
+ "eslint-plugin-react-hooks": "^7.0.1",
116
+ "husky": "^9.1.7",
117
+ "prettier": "^3.8.2",
118
+ "prettier-plugin-tailwindcss": "^0.7.2",
119
+ "tailwindcss": "^4.2.2",
120
+ "tsx": "^4.21.0",
121
+ "tw-animate-css": "^1.4.0",
122
+ "typescript": "^6.0.2",
123
+ "typescript-eslint": "^8.58.1"
124
+ },
125
+ "scripts": {
126
+ "dev": "tsx --env-file=.env server.ts",
127
+ "build": "next build",
128
+ "start": "NODE_ENV=production tsx --env-file=.env server.ts",
129
+ "lint": "eslint .",
130
+ "format": "prettier --write .",
131
+ "typecheck": "tsc --noEmit",
132
+ "setup": "bash scripts/setup.sh",
133
+ "postinstall": "chmod +x node_modules/node-pty/prebuilds/*/spawn-helper 2>/dev/null || true",
134
+ "tauri": "tauri",
135
+ "tauri:dev": "tauri dev",
136
+ "tauri:build": "tauri build",
137
+ "tauri:build:linux": "docker build -t agentos-linux -f src-tauri/Dockerfile.linux src-tauri && docker run --rm -v $(pwd)/src-tauri/target:/app/target agentos-linux"
138
+ }
139
+ }
@@ -0,0 +1,7 @@
1
+ const config = {
2
+ plugins: {
3
+ "@tailwindcss/postcss": {},
4
+ },
5
+ };
6
+
7
+ export default config;
@@ -0,0 +1,10 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
2
+ <g stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" fill="none">
3
+ <path d="M12 8V4H8" />
4
+ <rect width="16" height="12" x="4" y="8" rx="2" />
5
+ <path d="M2 14h2" />
6
+ <path d="M20 14h2" />
7
+ <path d="M15 13v2" />
8
+ <path d="M9 13v2" />
9
+ </g>
10
+ </svg>
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "ClaudeDeck",
3
+ "short_name": "ClaudeDeck",
4
+ "description": "AI Agent Command Center",
5
+ "start_url": "/",
6
+ "display": "standalone",
7
+ "background_color": "#0a0a0a",
8
+ "theme_color": "#0a0a0a",
9
+ "orientation": "any",
10
+ "scope": "/",
11
+ "icons": [
12
+ {
13
+ "src": "/icons/icon-72x72.png",
14
+ "sizes": "72x72",
15
+ "type": "image/png",
16
+ "purpose": "maskable any"
17
+ },
18
+ {
19
+ "src": "/icons/icon-96x96.png",
20
+ "sizes": "96x96",
21
+ "type": "image/png",
22
+ "purpose": "maskable any"
23
+ },
24
+ {
25
+ "src": "/icons/icon-128x128.png",
26
+ "sizes": "128x128",
27
+ "type": "image/png",
28
+ "purpose": "maskable any"
29
+ },
30
+ {
31
+ "src": "/icons/icon-144x144.png",
32
+ "sizes": "144x144",
33
+ "type": "image/png",
34
+ "purpose": "maskable any"
35
+ },
36
+ {
37
+ "src": "/icons/icon-152x152.png",
38
+ "sizes": "152x152",
39
+ "type": "image/png",
40
+ "purpose": "maskable any"
41
+ },
42
+ {
43
+ "src": "/icons/icon-192x192.png",
44
+ "sizes": "192x192",
45
+ "type": "image/png",
46
+ "purpose": "maskable any"
47
+ },
48
+ {
49
+ "src": "/icons/icon-384x384.png",
50
+ "sizes": "384x384",
51
+ "type": "image/png",
52
+ "purpose": "maskable any"
53
+ },
54
+ {
55
+ "src": "/icons/icon-512x512.png",
56
+ "sizes": "512x512",
57
+ "type": "image/png",
58
+ "purpose": "maskable any"
59
+ }
60
+ ]
61
+ }
package/public/sw.js ADDED
@@ -0,0 +1,64 @@
1
+ const CACHE_NAME = "agent-os-v1";
2
+ const urlsToCache = ["/manifest.json"];
3
+
4
+ self.addEventListener("install", (event) => {
5
+ event.waitUntil(
6
+ caches.open(CACHE_NAME).then((cache) => cache.addAll(urlsToCache))
7
+ );
8
+ self.skipWaiting();
9
+ });
10
+
11
+ self.addEventListener("fetch", (event) => {
12
+ const url = event.request.url;
13
+
14
+ if (url.includes("/api/") || url.includes("/ws")) {
15
+ return;
16
+ }
17
+
18
+ if (event.request.mode === "navigate") {
19
+ event.respondWith(
20
+ fetch(event.request).catch(
21
+ () =>
22
+ new Response("<h1>Offline</h1><p>Please check your connection.</p>", {
23
+ headers: { "Content-Type": "text/html" },
24
+ })
25
+ )
26
+ );
27
+ return;
28
+ }
29
+
30
+ if (url.includes("/_next/static/")) {
31
+ event.respondWith(
32
+ caches.match(event.request).then((cached) => {
33
+ if (cached) return cached;
34
+ return fetch(event.request).then((response) => {
35
+ const clone = response.clone();
36
+ caches
37
+ .open(CACHE_NAME)
38
+ .then((cache) => cache.put(event.request, clone));
39
+ return response;
40
+ });
41
+ })
42
+ );
43
+ return;
44
+ }
45
+
46
+ event.respondWith(
47
+ fetch(event.request).catch(() => caches.match(event.request))
48
+ );
49
+ });
50
+
51
+ self.addEventListener("activate", (event) => {
52
+ event.waitUntil(
53
+ caches
54
+ .keys()
55
+ .then((cacheNames) =>
56
+ Promise.all(
57
+ cacheNames
58
+ .filter((name) => name !== CACHE_NAME)
59
+ .map((name) => caches.delete(name))
60
+ )
61
+ )
62
+ );
63
+ self.clients.claim();
64
+ });
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # AgentOS - Self-hosted AI coding session manager
4
+ # https://github.com/anthropics/agent-os
5
+ #
6
+
7
+ set -euo pipefail
8
+
9
+ # Configuration
10
+ AGENT_OS_HOME="${AGENT_OS_HOME:-$HOME/.agent-os}"
11
+ PORT="${AGENT_OS_PORT:-3011}"
12
+ REPO_URL="https://github.com/atercates/agent-os.git"
13
+
14
+ # Derived paths
15
+ REPO_DIR="$AGENT_OS_HOME/repo"
16
+ PID_FILE="$AGENT_OS_HOME/agent-os.pid"
17
+ LOG_FILE="$AGENT_OS_HOME/agent-os.log"
18
+
19
+ # Detect OS
20
+ OS=$(uname -s | tr '[:upper:]' '[:lower:]')
21
+ [[ "$OS" == "darwin" ]] && OS="macos"
22
+
23
+ # Source Homebrew if available (ensures npm/node/etc are in PATH)
24
+ if [[ "$OS" == "macos" ]]; then
25
+ if [[ -f /opt/homebrew/bin/brew ]]; then
26
+ eval "$(/opt/homebrew/bin/brew shellenv)"
27
+ elif [[ -f /usr/local/bin/brew ]]; then
28
+ eval "$(/usr/local/bin/brew shellenv)"
29
+ fi
30
+ fi
31
+
32
+ # Source fnm if available (for non-admin users who installed via fnm)
33
+ if [[ -d "$HOME/.local/share/fnm" ]]; then
34
+ export PATH="$HOME/.local/share/fnm:$PATH"
35
+ eval "$(fnm env --use-on-cd 2>/dev/null || true)"
36
+ fi
37
+
38
+ # Add ~/.local/bin to PATH (for ripgrep and other binaries installed for non-admin users)
39
+ if [[ -d "$HOME/.local/bin" ]]; then
40
+ export PATH="$HOME/.local/bin:$PATH"
41
+ fi
42
+
43
+ # Styling
44
+ BOLD='\033[1m'
45
+ RED='\033[0;31m'
46
+ GREEN='\033[0;32m'
47
+ YELLOW='\033[1;33m'
48
+ BLUE='\033[0;34m'
49
+ NC='\033[0m'
50
+
51
+ # Find script directory (works even when called via symlink)
52
+ SCRIPT_PATH="${BASH_SOURCE[0]}"
53
+ while [[ -L "$SCRIPT_PATH" ]]; do
54
+ SCRIPT_DIR="$(cd -P "$(dirname "$SCRIPT_PATH")" && pwd)"
55
+ SCRIPT_PATH="$(readlink "$SCRIPT_PATH")"
56
+ [[ "$SCRIPT_PATH" != /* ]] && SCRIPT_PATH="$SCRIPT_DIR/$SCRIPT_PATH"
57
+ done
58
+ SCRIPT_DIR="$(cd -P "$(dirname "$SCRIPT_PATH")" && pwd)"
59
+
60
+ # Local repo path (parent of scripts dir) - used for --local installs
61
+ LOCAL_REPO="$(dirname "$SCRIPT_DIR")"
62
+
63
+ # Source library files
64
+ source "$SCRIPT_DIR/lib/common.sh"
65
+ source "$SCRIPT_DIR/lib/prerequisites.sh"
66
+ source "$SCRIPT_DIR/lib/ai-clis.sh"
67
+ source "$SCRIPT_DIR/lib/commands.sh"
68
+
69
+ # Main
70
+ case "${1:-}" in
71
+ install) cmd_install "${2:-}" ;;
72
+ start) cmd_start ;;
73
+ stop) cmd_stop ;;
74
+ restart) cmd_restart ;;
75
+ run) cmd_run ;;
76
+ status) cmd_status ;;
77
+ logs) cmd_logs ;;
78
+ update) cmd_update ;;
79
+ enable) cmd_enable ;;
80
+ disable) cmd_disable ;;
81
+ uninstall) cmd_uninstall ;;
82
+ start-foreground) cmd_start_foreground ;;
83
+ help|--help|-h) cmd_help ;;
84
+ *)
85
+ if [[ -n "${1:-}" ]]; then
86
+ log_error "Unknown command: $1"
87
+ fi
88
+ cmd_help
89
+ exit 1
90
+ ;;
91
+ esac
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # ClaudeDeck Installer
4
+ #
5
+ # Usage:
6
+ # curl -fsSL https://raw.githubusercontent.com/atercates/claude-deck/main/scripts/install.sh | bash
7
+ #
8
+
9
+ set -e
10
+
11
+ # Colors
12
+ RED='\033[0;31m'
13
+ GREEN='\033[0;32m'
14
+ BLUE='\033[0;34m'
15
+ BOLD='\033[1m'
16
+ NC='\033[0m'
17
+
18
+ log_info() { echo -e "${BLUE}==>${NC} $1"; }
19
+ log_success() { echo -e "${GREEN}==>${NC} $1"; }
20
+ log_error() { echo -e "${RED}==>${NC} $1"; }
21
+
22
+ REPO_URL="https://github.com/atercates/claude-deck.git"
23
+ INSTALL_DIR="$HOME/.claude-deck/repo"
24
+
25
+ echo ""
26
+ echo -e "${BOLD}ClaudeDeck Installer${NC}"
27
+ echo ""
28
+
29
+ # Check for git
30
+ if ! command -v git &> /dev/null; then
31
+ log_error "git is required. Please install git first."
32
+ exit 1
33
+ fi
34
+
35
+ # Clone or update repo
36
+ if [[ -d "$INSTALL_DIR" ]]; then
37
+ log_info "Updating existing installation..."
38
+ cd "$INSTALL_DIR"
39
+ git pull --ff-only
40
+ else
41
+ log_info "Downloading ClaudeDeck..."
42
+ mkdir -p "$(dirname "$INSTALL_DIR")"
43
+ git clone "$REPO_URL" "$INSTALL_DIR"
44
+ cd "$INSTALL_DIR"
45
+ fi
46
+
47
+ # Run the install command
48
+ exec "$INSTALL_DIR/scripts/claude-deck" install
@@ -0,0 +1,132 @@
1
+ #!/usr/bin/env bash
2
+ # AI CLI detection and installation for claude-deck
3
+
4
+ detect_ai_clis() {
5
+ local installed=()
6
+
7
+ command -v claude &> /dev/null && installed+=("claude")
8
+ command -v codex &> /dev/null && installed+=("codex")
9
+ command -v opencode &> /dev/null && installed+=("opencode")
10
+ command -v gemini &> /dev/null && installed+=("gemini")
11
+ command -v aider &> /dev/null && installed+=("aider")
12
+ command -v cursor &> /dev/null && installed+=("cursor")
13
+
14
+ echo "${installed[*]}"
15
+ }
16
+
17
+ install_claude_code() {
18
+ if command -v claude &> /dev/null; then
19
+ log_success "Claude Code already installed"
20
+ return 0
21
+ fi
22
+
23
+ log_info "Installing Claude Code..."
24
+ curl -fsSL https://claude.ai/install.sh | bash
25
+
26
+ if is_interactive; then
27
+ log_info "Authenticating Claude Code..."
28
+ echo ""
29
+ echo "Please complete the authentication in your browser."
30
+ read -p "Press Enter when ready to continue..." -r
31
+ claude auth login
32
+ else
33
+ log_info "Run 'claude' to authenticate when ready"
34
+ fi
35
+ }
36
+
37
+ install_codex() {
38
+ if command -v codex &> /dev/null; then
39
+ log_success "Codex already installed"
40
+ return 0
41
+ fi
42
+
43
+ log_info "Installing Codex..."
44
+ npm install -g @openai/codex
45
+
46
+ log_info "Authenticating Codex..."
47
+ echo ""
48
+ echo "Please set your OPENAI_API_KEY environment variable."
49
+ echo "Get your key at: https://platform.openai.com/api-keys"
50
+ }
51
+
52
+ install_aider() {
53
+ if command -v aider &> /dev/null; then
54
+ log_success "Aider already installed"
55
+ return 0
56
+ fi
57
+
58
+ log_info "Installing Aider..."
59
+
60
+ if command -v pipx &> /dev/null; then
61
+ pipx install aider-chat
62
+ elif command -v pip3 &> /dev/null; then
63
+ pip3 install aider-chat
64
+ else
65
+ log_error "Please install Python/pip first, then run: pip install aider-chat"
66
+ return 1
67
+ fi
68
+ }
69
+
70
+ install_gemini_cli() {
71
+ if command -v gemini &> /dev/null; then
72
+ log_success "Gemini CLI already installed"
73
+ return 0
74
+ fi
75
+
76
+ log_info "Installing Gemini CLI..."
77
+ npm install -g @google/gemini-cli 2>/dev/null || npm install -g gemini-cli
78
+
79
+ log_info "Authenticating Gemini CLI..."
80
+ echo ""
81
+ echo "Please complete the authentication."
82
+ gemini auth login 2>/dev/null || true
83
+ }
84
+
85
+ prompt_ai_cli_install() {
86
+ local installed
87
+ installed=$(detect_ai_clis)
88
+
89
+ if [[ -n "$installed" ]]; then
90
+ log_success "Found AI CLI(s): $installed"
91
+ return 0
92
+ fi
93
+
94
+ echo ""
95
+ log_warn "No AI coding CLI detected"
96
+ echo ""
97
+ echo "ClaudeDeck supports these AI coding assistants:"
98
+ echo ""
99
+ echo " 1) Claude Code (Anthropic) - Recommended"
100
+ echo " 2) Codex (OpenAI)"
101
+ echo " 3) Aider (Multi-LLM)"
102
+ echo " 4) Gemini CLI (Google)"
103
+ echo " 5) Skip - I'll install one myself"
104
+ echo ""
105
+
106
+ if ! is_interactive; then
107
+ log_info "Non-interactive mode: Installing Claude Code by default"
108
+ install_claude_code
109
+ return
110
+ fi
111
+
112
+ read -p "Which would you like to install? [1-5, default: 1] " -r choice
113
+ echo ""
114
+
115
+ case "${choice:-1}" in
116
+ 1) install_claude_code ;;
117
+ 2) install_codex ;;
118
+ 3) install_aider ;;
119
+ 4) install_gemini_cli ;;
120
+ 5)
121
+ log_info "Skipping AI CLI installation"
122
+ echo ""
123
+ echo "Install one of these before using ClaudeDeck:"
124
+ echo " Claude Code: npm install -g @anthropic-ai/claude-code"
125
+ echo " Codex: npm install -g @openai/codex"
126
+ echo " Aider: pip install aider-chat"
127
+ echo " Gemini: npm install -g gemini-cli"
128
+ echo ""
129
+ ;;
130
+ *) log_warn "Invalid choice, skipping" ;;
131
+ esac
132
+ }