@ironmussa/funny 0.1.0 → 0.1.2

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 (159) hide show
  1. package/README.md +231 -214
  2. package/bin/funny.js +80 -80
  3. package/package.json +79 -59
  4. package/packages/client/dist/assets/AddProjectView-yopCTuKC.js +1 -0
  5. package/packages/client/dist/assets/AllThreadsView-vCQJYKkF.js +2 -0
  6. package/packages/client/dist/assets/AnalyticsView-vz1-NSOv.js +36 -0
  7. package/packages/client/dist/assets/App-BEFplUGa.js +2 -0
  8. package/packages/client/dist/assets/AutomationInboxView-Dj7f9gOu.js +1 -0
  9. package/packages/client/dist/assets/CircuitBreakerDialog-C76CZi4q.js +1 -0
  10. package/packages/client/dist/assets/CommandPalette-7Y8qqH7R.js +1 -0
  11. package/packages/client/dist/assets/LiveColumnsView-CSRiYBNg.js +1 -0
  12. package/packages/client/dist/assets/LoginPage-C61IUXzX.js +1 -0
  13. package/packages/client/dist/assets/MobilePage-B4kbWfE1.js +1 -0
  14. package/packages/client/dist/assets/MonacoEditorDialog-PPXTSIdX.js +1 -0
  15. package/packages/client/dist/assets/PreviewBrowser-Bo2zmDPh.js +2 -0
  16. package/packages/client/dist/assets/PromptInput-Cq_fXmwj.js +1 -0
  17. package/packages/client/dist/assets/ReviewPane-1r1cuH2I.js +10 -0
  18. package/packages/client/dist/assets/SettingsDetailView-D-J9TfZx.js +1 -0
  19. package/packages/client/dist/assets/SetupWizard-BbLWm6BX.js +1 -0
  20. package/packages/client/dist/assets/Sidebar-3Jd5JyAp.js +1 -0
  21. package/packages/client/dist/assets/SlideUpPrompt-_ulHi9sN.js +1 -0
  22. package/packages/client/dist/assets/TerminalPanel-BiLDlQZQ.js +4 -0
  23. package/packages/client/dist/assets/ThreadListView-DthHUodE.js +1 -0
  24. package/packages/client/dist/assets/ThreadView-DsqoxCXZ.js +16 -0
  25. package/packages/client/dist/assets/ToolCallGroup-BgROpRwn.js +22 -0
  26. package/packages/client/dist/assets/_basePickBy-BeHeP2rS.js +1 -0
  27. package/packages/client/dist/assets/_baseUniq-CZf5jOXa.js +1 -0
  28. package/packages/client/dist/assets/ansi_to_html-DYje8R53.js +3 -0
  29. package/packages/client/dist/assets/app-store-B3iAaYzj.js +1 -0
  30. package/packages/client/dist/assets/architectureDiagram-VXUJARFQ-CysgSV_T.js +36 -0
  31. package/packages/client/dist/assets/arrow-down-DQYiOM3D.js +1 -0
  32. package/packages/client/dist/assets/arrow-right-Bbusk4uX.js +1 -0
  33. package/packages/client/dist/assets/automation-store-DiFgwQi4.js +1 -0
  34. package/packages/client/dist/assets/badge-CrCqde50.js +1 -0
  35. package/packages/client/dist/assets/blockDiagram-VD42YOAC-DU32EjW8.js +122 -0
  36. package/packages/client/dist/assets/breadcrumb-BiY69_Mg.js +1 -0
  37. package/packages/client/dist/assets/button-D8qrc3hb.js +1 -0
  38. package/packages/client/dist/assets/c4Diagram-YG6GDRKO-D31N17G_.js +10 -0
  39. package/packages/client/dist/assets/check-Dj_ZR5Y7.js +1 -0
  40. package/packages/client/dist/assets/chevron-down-BJhJsMnL.js +1 -0
  41. package/packages/client/dist/assets/chevron-left-BVsM9RGq.js +1 -0
  42. package/packages/client/dist/assets/chevron-right-PEOnBrxM.js +1 -0
  43. package/packages/client/dist/assets/chevrons-up-down-Sa8XJRBx.js +1 -0
  44. package/packages/client/dist/assets/chunk-4BX2VUAB-CSqlINSL.js +1 -0
  45. package/packages/client/dist/assets/chunk-55IACEB6-D5_ai8AA.js +1 -0
  46. package/packages/client/dist/assets/chunk-B4BG7PRW-DKOAlNfo.js +165 -0
  47. package/packages/client/dist/assets/chunk-DI55MBZ5-BNwqKgG-.js +220 -0
  48. package/packages/client/dist/assets/chunk-FMBD7UC4-MKWtG46g.js +15 -0
  49. package/packages/client/dist/assets/chunk-QN33PNHL-BWGv-iLk.js +1 -0
  50. package/packages/client/dist/assets/chunk-QZHKN3VN-Brx07f_u.js +1 -0
  51. package/packages/client/dist/assets/chunk-TZMSLE5B-Cgz2v9ud.js +1 -0
  52. package/packages/client/dist/assets/circle-x-BNvrcCvx.js +1 -0
  53. package/packages/client/dist/assets/classDiagram-2ON5EDUG-Bi8VPWgp.js +1 -0
  54. package/packages/client/dist/assets/classDiagram-v2-WZHVMYZB-Bi8VPWgp.js +1 -0
  55. package/packages/client/dist/assets/clipboard-list-zkC7qTDO.js +1 -0
  56. package/packages/client/dist/assets/clone-CzE9L7Ig.js +1 -0
  57. package/packages/client/dist/assets/collapsible-DP3s_8s3.js +1 -0
  58. package/packages/client/dist/assets/columns-3-DhvlrNjA.js +1 -0
  59. package/packages/client/dist/assets/command-DOlrnbnh.js +1 -0
  60. package/packages/client/dist/assets/copy-DXKK6zMx.js +1 -0
  61. package/packages/client/dist/assets/cose-bilkent-S5V4N54A-DabFXskf.js +1 -0
  62. package/packages/client/dist/assets/createLucideIcon-CsWFljth.js +1 -0
  63. package/packages/client/dist/assets/cytoscape.esm-5J0xJHOV.js +321 -0
  64. package/packages/client/dist/assets/dagre-6UL2VRFP-BgQrFrWh.js +4 -0
  65. package/packages/client/dist/assets/diagram-PSM6KHXK-B0rQdwLC.js +24 -0
  66. package/packages/client/dist/assets/diagram-QEK2KX5R-aX13lt6A.js +43 -0
  67. package/packages/client/dist/assets/diagram-S2PKOQOG-cgHvdjCm.js +24 -0
  68. package/packages/client/dist/assets/dialog-DapeOKPE.js +1 -0
  69. package/packages/client/dist/assets/draft-store-DnVbStYY.js +1 -0
  70. package/packages/client/dist/assets/dropdown-menu-Bi54WPTK.js +1 -0
  71. package/packages/client/dist/assets/editor-utils-DgK9pIvP.js +2 -0
  72. package/packages/client/dist/assets/erDiagram-Q2GNP2WA-DwocRLhB.js +60 -0
  73. package/packages/client/dist/assets/external-link-Dg0Hq511.js +1 -0
  74. package/packages/client/dist/assets/eye-BAXsQYWt.js +1 -0
  75. package/packages/client/dist/assets/eye-off-ICXVwkI1.js +1 -0
  76. package/packages/client/dist/assets/flowDiagram-NV44I4VS-C0ldc02M.js +162 -0
  77. package/packages/client/dist/assets/folder-d8RRIu-j.js +1 -0
  78. package/packages/client/dist/assets/folder-open-BbwqJxUi.js +1 -0
  79. package/packages/client/dist/assets/ganttDiagram-JELNMOA3-DxdfUar4.js +267 -0
  80. package/packages/client/dist/assets/git-merge-CB0ebeXg.js +1 -0
  81. package/packages/client/dist/assets/gitGraphDiagram-V2S2FVAM-uM_Ec7JF.js +65 -0
  82. package/packages/client/dist/assets/github-DiENtmNz.js +1 -0
  83. package/packages/client/dist/assets/globe-B1hiCqlb.js +1 -0
  84. package/packages/client/dist/assets/graph-Qo1vygVG.js +1 -0
  85. package/packages/client/dist/assets/history-D7cvrs7x.js +1 -0
  86. package/packages/client/dist/assets/inbox-4g-W9WtW.js +1 -0
  87. package/packages/client/dist/assets/index-BplxL2Qj.js +1 -0
  88. package/packages/client/dist/assets/index-DmIp58b6.js +1 -0
  89. package/packages/client/dist/assets/index-Z_QI94Zg.js +18 -0
  90. package/packages/client/dist/assets/{index-B0nLATLY.js → index-cSW024sc.js} +1 -1
  91. package/packages/client/dist/assets/index-zxpgGDAW.css +1 -0
  92. package/packages/client/dist/assets/infoDiagram-HS3SLOUP-C-koF35b.js +2 -0
  93. package/packages/client/dist/assets/input-Dyxe5hqI.js +1 -0
  94. package/packages/client/dist/assets/internal-editor-store-CuhCMFlj.js +1 -0
  95. package/packages/client/dist/assets/journeyDiagram-XKPGCS4Q-DRqupubT.js +139 -0
  96. package/packages/client/dist/assets/kanban-definition-3W4ZIXB7-BvWguxdE.js +89 -0
  97. package/packages/client/dist/assets/katex-DhXJpUyf.js +261 -0
  98. package/packages/client/dist/assets/layout-UD4laNpY.js +1 -0
  99. package/packages/client/dist/assets/markdown-9_JKOUHQ.js +29 -0
  100. package/packages/client/dist/assets/maximize-2-DW-IsQiI.js +1 -0
  101. package/packages/client/dist/assets/mermaid-C0IQv4mH.js +250 -0
  102. package/packages/client/dist/assets/mindmap-definition-VGOIOE7T-C0fzBd6g.js +68 -0
  103. package/packages/client/dist/assets/minimize-2-CWn5BNKr.js +1 -0
  104. package/packages/client/dist/assets/monaco-CvC2RZDL.js +11 -0
  105. package/packages/client/dist/assets/{motion-DRu4QWVj.js → motion-Cyp39Uo1.js} +1 -1
  106. package/packages/client/dist/assets/pencil-pMey300q.js +1 -0
  107. package/packages/client/dist/assets/pieDiagram-ADFJNKIX-CUBE4hL3.js +30 -0
  108. package/packages/client/dist/assets/pin-off-DpiyTpTd.js +1 -0
  109. package/packages/client/dist/assets/pin-uzq68OVB.js +1 -0
  110. package/packages/client/dist/assets/plus-ChfperZy.js +1 -0
  111. package/packages/client/dist/assets/popover-CRZjc4jI.js +1 -0
  112. package/packages/client/dist/assets/project-chip-CkL3EaeE.js +5 -0
  113. package/packages/client/dist/assets/providers-Bv7fzJNY.js +1 -0
  114. package/packages/client/dist/assets/quadrantDiagram-AYHSOK5B-DF7I9OHz.js +7 -0
  115. package/packages/client/dist/assets/refresh-cw-Svvcff2v.js +1 -0
  116. package/packages/client/dist/assets/requirementDiagram-UZGBJVZJ-BBI4q-3_.js +64 -0
  117. package/packages/client/dist/assets/review-pane-store-CrK1Czq6.js +1 -0
  118. package/packages/client/dist/assets/rotate-ccw-DFiWNcpH.js +1 -0
  119. package/packages/client/dist/assets/sankeyDiagram-TZEHDZUN-lqpKxyZi.js +10 -0
  120. package/packages/client/dist/assets/scroll-area-Bj4yTRJP.js +1 -0
  121. package/packages/client/dist/assets/search-JGV9EPmW.js +1 -0
  122. package/packages/client/dist/assets/select-CkTnmILP.js +1 -0
  123. package/packages/client/dist/assets/sequenceDiagram-WL72ISMW-DHImpRwJ.js +145 -0
  124. package/packages/client/dist/assets/shallow-B0DA4RsP.js +1 -0
  125. package/packages/client/dist/assets/square-BqmNpRIH.js +1 -0
  126. package/packages/client/dist/assets/stateDiagram-FKZM4ZOC-C7L7Pt_V.js +1 -0
  127. package/packages/client/dist/assets/stateDiagram-v2-4FDKWEC3-FyYG2QfD.js +1 -0
  128. package/packages/client/dist/assets/{syntax-qKqB8BhQ.js → syntax-CG1UoaFw.js} +17 -17
  129. package/packages/client/dist/assets/terminal-CuAYwdh-.js +1 -0
  130. package/packages/client/dist/assets/timeline-definition-IT6M3QCI-BGABo1HM.js +61 -0
  131. package/packages/client/dist/assets/trash-2-QvY6JeI_.js +1 -0
  132. package/packages/client/dist/assets/treemap-GDKQZRPO-DZ7i2Nwu.js +160 -0
  133. package/packages/client/dist/assets/upload-DXXUmYu2.js +1 -0
  134. package/packages/client/dist/assets/use-minute-tick-BoS3Ec2H.js +1 -0
  135. package/packages/client/dist/assets/use-ws-BIe6kKa2.js +48 -0
  136. package/packages/client/dist/assets/utils-VDOOGGvU.js +2 -0
  137. package/packages/client/dist/assets/x-AprddF_b.js +1 -0
  138. package/packages/client/dist/assets/xychartDiagram-PRI3JC2R-D_bazwNo.js +7 -0
  139. package/packages/client/dist/index.html +9 -13
  140. package/packages/server/dist/index.js +117479 -69360
  141. package/packages/server/dist/index.js.map +682 -138
  142. package/packages/server/dist/pty-helper.mjs +115 -115
  143. package/packages/client/dist/assets/AddProjectView-CODm54MP.js +0 -1
  144. package/packages/client/dist/assets/AllThreadsView--Dd7YSK5.js +0 -1
  145. package/packages/client/dist/assets/AnalyticsView-eRhWGG3y.js +0 -36
  146. package/packages/client/dist/assets/AutomationInboxView-DwBaGJed.js +0 -1
  147. package/packages/client/dist/assets/CircuitBreakerDialog-C2iBwp5W.js +0 -1
  148. package/packages/client/dist/assets/CommandPalette-BXweSrdO.js +0 -1
  149. package/packages/client/dist/assets/ReviewPane-DxtlJNNu.js +0 -10
  150. package/packages/client/dist/assets/SettingsDetailView-BKh9OBM2.js +0 -1
  151. package/packages/client/dist/assets/SetupWizard-BekJX-tc.js +0 -1
  152. package/packages/client/dist/assets/TerminalPanel-DC4U0OTm.js +0 -4
  153. package/packages/client/dist/assets/ThreadListView-B6HvQ8NV.js +0 -1
  154. package/packages/client/dist/assets/arrow-right-3Bby9NNK.js +0 -1
  155. package/packages/client/dist/assets/command-B76T8z-A.js +0 -1
  156. package/packages/client/dist/assets/index-BRi6al6L.js +0 -99
  157. package/packages/client/dist/assets/index-DXO1sSe9.css +0 -1
  158. package/packages/client/dist/assets/markdown-B7CXSXYD.js +0 -29
  159. package/packages/client/dist/assets/review-pane-store-BLhxZHRI.js +0 -1
package/README.md CHANGED
@@ -1,214 +1,231 @@
1
- # funny
2
-
3
- > Parallel Claude Code agent orchestration powered by git worktrees
4
-
5
- funny is a web UI for orchestrating multiple [Claude Code](https://claude.ai/code) agents in parallel. It uses git worktrees to let each agent work on its own branch simultaneously without conflicts. Think of it as a Codex App clone powered by the [Claude Agent SDK](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) (`@anthropic-ai/claude-agent-sdk`).
6
-
7
- ## Features
8
-
9
- - **Parallel agent execution** — Run multiple Claude Code agents simultaneously on different branches
10
- - **Git worktree isolation** — Each agent gets its own isolated working directory
11
- - **Real-time monitoring** — WebSocket-based live updates for all agent activities
12
- - **Git integration** — Built-in diff viewer, staging, commits, and PR creation
13
- - **Kanban board** — Drag-and-drop task management with columns (backlog, in progress, review, done, archived)
14
- - **Search** — Find threads by title, branch name, status, or message content with real-time filtering
15
- - **Analytics dashboard** — Track task creation, completion rates, stage distribution, and cost metrics over time
16
- - **MCP support** — Model Context Protocol integration
17
- - **Automation scheduling** — Cron-based recurring tasks
18
-
19
- ## Installation
20
-
21
- ### Quick Start (bunx)
22
-
23
- No installation needed! Run directly with:
24
-
25
- ```bash
26
- bunx @ironmussa/funny
27
- ```
28
-
29
- The app will start and open at `http://localhost:3001`
30
-
31
- ### Global Installation
32
-
33
- ```bash
34
- bun install -g @ironmussa/funny
35
- funny
36
- ```
37
-
38
- ### From Source
39
-
40
- ```bash
41
- git clone https://github.com/ironmussa/funny.git
42
- cd funny
43
- bun install
44
- bun run build
45
- bun start
46
- ```
47
-
48
- ## Requirements
49
-
50
- - **Bun** >= 1.0.0 (install from [bun.sh](https://bun.sh))
51
- - **Claude CLI** installed and authenticated ([claude.ai/code](https://claude.ai/code))
52
- - **Git** installed and configured
53
-
54
- ## Usage
55
-
56
- ### Starting the Server
57
-
58
- ```bash
59
- # Default (port 3001)
60
- funny
61
-
62
- # Custom port
63
- funny --port 8080
64
-
65
- # Show all options
66
- funny --help
67
- ```
68
-
69
- ### CLI Options
70
-
71
- | Option | Description | Default |
72
- |--------|-------------|---------|
73
- | `-p, --port <port>` | Server port | `3001` |
74
- | `-h, --host <host>` | Server host | `127.0.0.1` |
75
- | `--help` | Show help message | - |
76
-
77
- ### Environment Variables
78
-
79
- | Variable | Description | Default |
80
- |----------|-------------|---------|
81
- | `PORT` | Server port | `3001` |
82
- | `HOST` | Server hostname | `127.0.0.1` |
83
- | `CORS_ORIGIN` | Custom CORS origins (comma-separated) | Auto-configured |
84
-
85
- ## Kanban Board
86
-
87
- Threads can be visualized and managed as a Kanban board with five columns:
88
-
89
- - **Backlog** — Tasks waiting to be started
90
- - **In Progress** — Tasks currently being worked on
91
- - **Review** — Tasks ready for code review
92
- - **Done** — Completed tasks
93
- - **Archived** — Archived tasks
94
-
95
- Drag and drop cards between columns to update their stage. Cards show thread status, git sync state, cost, and time since last update. Pinned threads appear first in each column. You can create new threads directly from the board and switch between list and board views.
96
-
97
- ## Search & Filtering
98
-
99
- Find threads quickly using the search bar. Search matches against:
100
-
101
- - **Thread title**
102
- - **Branch name**
103
- - **Thread status**
104
- - **Message content** (server-side full-text search with content snippets)
105
-
106
- Results highlight matching text. Combine search with filters for status, git state, and mode to narrow results further. Filters sync to URL query parameters so you can share filtered views.
107
-
108
- ## Analytics
109
-
110
- The analytics dashboard provides an overview of task activity and costs:
111
-
112
- - **Metric cards** — Tasks created, completed, moved to review/done/archived, and total cost
113
- - **Stage distribution chart** — Pie chart showing current distribution of threads across stages
114
- - **Timeline chart** — Bar chart showing task activity over time, grouped by day/week/month/year
115
-
116
- Filter analytics by project and time range (day, week, month, or all-time).
117
-
118
- ## Development
119
-
120
- ```bash
121
- # Install dependencies
122
- bun install
123
-
124
- # Run in development mode (client + server with hot reload)
125
- bun run dev
126
-
127
- # Run only server (port 3001)
128
- bun run dev:server
129
-
130
- # Run only client (port 5173)
131
- bun run dev:client
132
-
133
- # Build for production
134
- bun run build
135
-
136
- # Database operations
137
- bun run db:push # Push schema changes
138
- bun run db:studio # Open Drizzle Studio
139
-
140
- # Run tests
141
- bun test
142
- ```
143
-
144
- ## Architecture
145
-
146
- ### Monorepo Structure
147
-
148
- - **`packages/shared`** Shared TypeScript types
149
- - **`packages/server`** — Hono HTTP server with [Claude Agent SDK](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) (port 3001)
150
- - **`packages/client`** — React 19 + Vite SPA (port 5173 in dev)
151
-
152
- ### Tech Stack
153
-
154
- **Server:**
155
- - Hono (HTTP framework)
156
- - [Claude Agent SDK](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) (`@anthropic-ai/claude-agent-sdk`)
157
- - Drizzle ORM + SQLite
158
- - WebSocket (real-time updates)
159
-
160
- **Client:**
161
- - React 19
162
- - Vite
163
- - Zustand (state management)
164
- - shadcn/ui (components)
165
- - Tailwind CSS
166
-
167
- ## Data Storage
168
-
169
- All data is stored in:
170
-
171
- ```
172
- ~/.funny/
173
- ├── data.db # SQLite database (projects, threads, messages)
174
- └── auth-token # Bearer token for authentication
175
- ```
176
-
177
- ## Git Worktrees
178
-
179
- Worktrees are created in `.funny-worktrees/` adjacent to your project:
180
-
181
- ```
182
- /your-project/
183
- ├── .git/
184
- ├── src/
185
- └── ...
186
-
187
- /your-project-worktrees/
188
- ├── feature-branch-1/
189
- ├── feature-branch-2/
190
- └── ...
191
- ```
192
-
193
- Each worktree is an isolated working directory allowing parallel agent work without conflicts.
194
-
195
- ## Commands
196
-
197
- See [CLAUDE.md](./CLAUDE.md) for detailed commands and architecture documentation.
198
-
199
- ## License
200
-
201
- MIT
202
-
203
- ## Support
204
-
205
- - [GitHub Issues](https://github.com/ironmussa/funny/issues)
206
- - [Claude Code Documentation](https://claude.ai/code)
207
-
208
- ## Contributing
209
-
210
- Contributions are welcome! Please read [CLAUDE.md](./CLAUDE.md) for development guidelines.
211
-
212
- ---
213
-
214
- Built with [Claude Code](https://claude.ai/code)
1
+ # funny
2
+
3
+ > Parallel Claude Code agent orchestration powered by git worktrees
4
+
5
+ funny is a web UI for orchestrating multiple [Claude Code](https://claude.ai/code) agents in parallel. It uses git worktrees to let each agent work on its own branch simultaneously without conflicts. Think of it as a Codex App clone powered by the [Claude Agent SDK](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) (`@anthropic-ai/claude-agent-sdk`).
6
+
7
+ ## Features
8
+
9
+ - **Parallel agent execution** — Run multiple Claude Code agents simultaneously on different branches
10
+ - **Git worktree isolation** — Each agent gets its own isolated working directory
11
+ - **Real-time monitoring** — WebSocket-based live updates for all agent activities
12
+ - **Git integration** — Built-in diff viewer, staging, commits, and PR creation
13
+ - **Kanban board** — Drag-and-drop task management with columns (backlog, in progress, review, done, archived)
14
+ - **Search** — Find threads by title, branch name, status, or message content with real-time filtering
15
+ - **Analytics dashboard** — Track task creation, completion rates, stage distribution, and cost metrics over time
16
+ - **MCP support** — Model Context Protocol integration
17
+ - **Automation scheduling** — Cron-based recurring tasks
18
+ - **Mobile support** — Responsive mobile view with touch-friendly navigation for on-the-go monitoring
19
+
20
+ ## Installation
21
+
22
+ ### Quick Start (bunx)
23
+
24
+ No installation needed! Run directly with:
25
+
26
+ ```bash
27
+ bunx @ironmussa/funny
28
+ ```
29
+
30
+ The app will start and open at `http://localhost:3001`
31
+
32
+ ### Global Installation
33
+
34
+ ```bash
35
+ bun install -g @ironmussa/funny
36
+ funny
37
+ ```
38
+
39
+ ### From Source
40
+
41
+ ```bash
42
+ git clone https://github.com/ironmussa/funny.git
43
+ cd funny
44
+ bun install
45
+ bun run build
46
+ bun start
47
+ ```
48
+
49
+ ## Requirements
50
+
51
+ - **Bun** >= 1.0.0 (install from [bun.sh](https://bun.sh))
52
+ - **Claude CLI** installed and authenticated ([claude.ai/code](https://claude.ai/code))
53
+ - **Git** installed and configured
54
+
55
+ ## Usage
56
+
57
+ ### Starting the Server
58
+
59
+ ```bash
60
+ # Default (port 3001)
61
+ funny
62
+
63
+ # Custom port
64
+ funny --port 8080
65
+
66
+ # Show all options
67
+ funny --help
68
+ ```
69
+
70
+ ### CLI Options
71
+
72
+ | Option | Description | Default |
73
+ | ------------------- | ----------------- | ----------- |
74
+ | `-p, --port <port>` | Server port | `3001` |
75
+ | `-h, --host <host>` | Server host | `127.0.0.1` |
76
+ | `--help` | Show help message | - |
77
+
78
+ ### Environment Variables
79
+
80
+ | Variable | Description | Default |
81
+ | ------------- | ------------------------------------- | --------------- |
82
+ | `PORT` | Server port | `3001` |
83
+ | `HOST` | Server hostname | `127.0.0.1` |
84
+ | `CORS_ORIGIN` | Custom CORS origins (comma-separated) | Auto-configured |
85
+
86
+ ## Kanban Board
87
+
88
+ Threads can be visualized and managed as a Kanban board with five columns:
89
+
90
+ - **Backlog** — Tasks waiting to be started
91
+ - **In Progress** — Tasks currently being worked on
92
+ - **Review** — Tasks ready for code review
93
+ - **Done** — Completed tasks
94
+ - **Archived** — Archived tasks
95
+
96
+ Drag and drop cards between columns to update their stage. Cards show thread status, git sync state, cost, and time since last update. Pinned threads appear first in each column. You can create new threads directly from the board and switch between list and board views.
97
+
98
+ ## Search & Filtering
99
+
100
+ Find threads quickly using the search bar. Search matches against:
101
+
102
+ - **Thread title**
103
+ - **Branch name**
104
+ - **Thread status**
105
+ - **Message content** (server-side full-text search with content snippets)
106
+
107
+ Results highlight matching text. Combine search with filters for status, git state, and mode to narrow results further. Filters sync to URL query parameters so you can share filtered views.
108
+
109
+ ## Analytics
110
+
111
+ The analytics dashboard provides an overview of task activity and costs:
112
+
113
+ - **Metric cards** — Tasks created, completed, moved to review/done/archived, and total cost
114
+ - **Stage distribution chart** — Pie chart showing current distribution of threads across stages
115
+ - **Timeline chart** — Bar chart showing task activity over time, grouped by day/week/month/year
116
+
117
+ Filter analytics by project and time range (day, week, month, or all-time).
118
+
119
+ ## Mobile Support
120
+
121
+ funny includes a dedicated mobile view that automatically activates on screens narrower than 768px. The mobile interface provides a streamlined, touch-friendly experience for monitoring and interacting with your agents on the go.
122
+
123
+ **Mobile features:**
124
+
125
+ - **Stack-based navigation** — Projects → Threads → Chat, with back buttons for easy navigation
126
+ - **Full chat interaction** — Send messages, view agent responses, approve/reject tool calls, and monitor running agents
127
+ - **Thread management** Create new threads with model and mode selection directly from your phone
128
+ - **Status monitoring** — Real-time status badges and agent activity indicators
129
+ - **Auto-scrolling** — Smart scroll behavior that follows new messages while preserving your scroll position
130
+
131
+ The sidebar automatically converts to a slide-out drawer on mobile via the shadcn/ui Sheet component.
132
+
133
+ ## Development
134
+
135
+ ```bash
136
+ # Install dependencies
137
+ bun install
138
+
139
+ # Run in development mode (client + server with hot reload)
140
+ bun run dev
141
+
142
+ # Run only server (port 3001)
143
+ bun run dev:server
144
+
145
+ # Run only client (port 5173)
146
+ bun run dev:client
147
+
148
+ # Build for production
149
+ bun run build
150
+
151
+ # Database operations
152
+ bun run db:push # Push schema changes
153
+ bun run db:studio # Open Drizzle Studio
154
+
155
+ # Run tests
156
+ bun test
157
+ ```
158
+
159
+ ## Architecture
160
+
161
+ ### Monorepo Structure
162
+
163
+ - **`packages/shared`** Shared TypeScript types
164
+ - **`packages/server`** — Hono HTTP server with [Claude Agent SDK](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) (port 3001)
165
+ - **`packages/client`** — React 19 + Vite SPA (port 5173 in dev)
166
+
167
+ ### Tech Stack
168
+
169
+ **Server:**
170
+
171
+ - Hono (HTTP framework)
172
+ - [Claude Agent SDK](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) (`@anthropic-ai/claude-agent-sdk`)
173
+ - Drizzle ORM + SQLite
174
+ - WebSocket (real-time updates)
175
+
176
+ **Client:**
177
+
178
+ - React 19
179
+ - Vite
180
+ - Zustand (state management)
181
+ - shadcn/ui (components)
182
+ - Tailwind CSS
183
+
184
+ ## Data Storage
185
+
186
+ All data is stored in:
187
+
188
+ ```
189
+ ~/.funny/
190
+ ├── data.db # SQLite database (projects, threads, messages)
191
+ └── auth-token # Bearer token for authentication
192
+ ```
193
+
194
+ ## Git Worktrees
195
+
196
+ Worktrees are created in `.funny-worktrees/` adjacent to your project:
197
+
198
+ ```
199
+ /your-project/
200
+ ├── .git/
201
+ ├── src/
202
+ └── ...
203
+
204
+ /your-project-worktrees/
205
+ ├── feature-branch-1/
206
+ ├── feature-branch-2/
207
+ └── ...
208
+ ```
209
+
210
+ Each worktree is an isolated working directory allowing parallel agent work without conflicts.
211
+
212
+ ## Commands
213
+
214
+ See [CLAUDE.md](./CLAUDE.md) for detailed commands and architecture documentation.
215
+
216
+ ## License
217
+
218
+ MIT
219
+
220
+ ## Support
221
+
222
+ - [GitHub Issues](https://github.com/ironmussa/funny/issues)
223
+ - [Claude Code Documentation](https://claude.ai/code)
224
+
225
+ ## Contributing
226
+
227
+ Contributions are welcome! Please read [CLAUDE.md](./CLAUDE.md) for development guidelines.
228
+
229
+ ---
230
+
231
+ Built with [Claude Code](https://claude.ai/code)
package/bin/funny.js CHANGED
@@ -1,80 +1,80 @@
1
- #!/usr/bin/env bun
2
- import { parseArgs } from 'util';
3
- import { resolve } from 'path';
4
- import { existsSync } from 'fs';
5
-
6
- // Parse CLI arguments
7
- const { values } = parseArgs({
8
- options: {
9
- port: {
10
- type: 'string',
11
- short: 'p',
12
- default: '3001',
13
- },
14
- host: {
15
- type: 'string',
16
- short: 'h',
17
- default: '127.0.0.1',
18
- },
19
- 'auth-mode': {
20
- type: 'string',
21
- default: 'local',
22
- },
23
- help: {
24
- type: 'boolean',
25
- },
26
- },
27
- allowPositionals: true,
28
- });
29
-
30
- if (values.help) {
31
- console.log(`
32
- funny - Parallel Claude Code agent orchestration
33
-
34
- Usage:
35
- funny [options]
36
-
37
- Options:
38
- -p, --port <port> Server port (default: 3001)
39
- -h, --host <host> Server host (default: 127.0.0.1)
40
- --auth-mode <mode> Authentication mode: local | multi (default: local)
41
- --help Show this help message
42
-
43
- Examples:
44
- funny # Start on http://127.0.0.1:3001
45
- funny --port 8080 # Start on custom port
46
- funny --auth-mode multi # Start in multi-user mode
47
-
48
- Environment Variables:
49
- PORT Server port
50
- HOST Server host
51
- AUTH_MODE Authentication mode (local or multi)
52
- CORS_ORIGIN Custom CORS origins (comma-separated)
53
-
54
- For more information, visit: https://github.com/anthropics/funny
55
- `);
56
- process.exit(0);
57
- }
58
-
59
- // Set environment variables from CLI args
60
- process.env.PORT = values.port;
61
- process.env.HOST = values.host;
62
- process.env.AUTH_MODE = values['auth-mode'];
63
-
64
- // Resolve server entry point
65
- const serverEntry = resolve(import.meta.dir, '../packages/server/dist/index.js');
66
- const serverSrc = resolve(import.meta.dir, '../packages/server/src/index.ts');
67
-
68
- // Check if built version exists, otherwise use source (for development)
69
- if (existsSync(serverEntry)) {
70
- console.log('[funny] Starting from built server...');
71
- await import(serverEntry);
72
- } else if (existsSync(serverSrc)) {
73
- console.log('[funny] Built server not found, starting from source...');
74
- console.log('[funny] Run "npm run build" for production use.');
75
- await import(serverSrc);
76
- } else {
77
- console.error('[funny] Error: Server files not found.');
78
- console.error('Please run "npm install" and "npm run build" first.');
79
- process.exit(1);
80
- }
1
+ #!/usr/bin/env bun
2
+ import { existsSync } from 'fs';
3
+ import { resolve } from 'path';
4
+ import { parseArgs } from 'util';
5
+
6
+ // Parse CLI arguments
7
+ const { values } = parseArgs({
8
+ options: {
9
+ port: {
10
+ type: 'string',
11
+ short: 'p',
12
+ default: '3001',
13
+ },
14
+ host: {
15
+ type: 'string',
16
+ short: 'h',
17
+ default: '127.0.0.1',
18
+ },
19
+ 'auth-mode': {
20
+ type: 'string',
21
+ default: 'local',
22
+ },
23
+ help: {
24
+ type: 'boolean',
25
+ },
26
+ },
27
+ allowPositionals: true,
28
+ });
29
+
30
+ if (values.help) {
31
+ console.log(`
32
+ funny - Parallel Claude Code agent orchestration
33
+
34
+ Usage:
35
+ funny [options]
36
+
37
+ Options:
38
+ -p, --port <port> Server port (default: 3001)
39
+ -h, --host <host> Server host (default: 127.0.0.1)
40
+ --auth-mode <mode> Authentication mode: local | multi (default: local)
41
+ --help Show this help message
42
+
43
+ Examples:
44
+ funny # Start on http://127.0.0.1:3001
45
+ funny --port 8080 # Start on custom port
46
+ funny --auth-mode multi # Start in multi-user mode
47
+
48
+ Environment Variables:
49
+ PORT Server port
50
+ HOST Server host
51
+ AUTH_MODE Authentication mode (local or multi)
52
+ CORS_ORIGIN Custom CORS origins (comma-separated)
53
+
54
+ For more information, visit: https://github.com/anthropics/funny
55
+ `);
56
+ process.exit(0);
57
+ }
58
+
59
+ // Set environment variables from CLI args
60
+ process.env.PORT = values.port;
61
+ process.env.HOST = values.host;
62
+ process.env.AUTH_MODE = values['auth-mode'];
63
+
64
+ // Resolve server entry point
65
+ const serverEntry = resolve(import.meta.dir, '../packages/server/dist/index.js');
66
+ const serverSrc = resolve(import.meta.dir, '../packages/server/src/index.ts');
67
+
68
+ // Check if built version exists, otherwise use source (for development)
69
+ if (existsSync(serverEntry)) {
70
+ console.log('[funny] Starting from built server...');
71
+ await import(serverEntry);
72
+ } else if (existsSync(serverSrc)) {
73
+ console.log('[funny] Built server not found, starting from source...');
74
+ console.log('[funny] Run "npm run build" for production use.');
75
+ await import(serverSrc);
76
+ } else {
77
+ console.error('[funny] Error: Server files not found.');
78
+ console.error('Please run "npm install" and "npm run build" first.');
79
+ process.exit(1);
80
+ }