clauder-hub 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +179 -2
- package/bin/clauder-hub.mjs +61 -0
- package/logo.svg +1 -0
- package/package.json +61 -4
- package/server/dist/index.js +34907 -0
- package/web/dist/assets/MonacoEditor-BbYsqB7V.css +1 -0
- package/web/dist/assets/MonacoEditor-Bdblyy-v.js +1007 -0
- package/web/dist/assets/abap-DLDM7-KI.js +1 -0
- package/web/dist/assets/apex-DNDY2TF8.js +1 -0
- package/web/dist/assets/azcli-Y6nb8tq_.js +1 -0
- package/web/dist/assets/babel-Dw5Eu3O9.js +16 -0
- package/web/dist/assets/bat-BwHxbl9M.js +1 -0
- package/web/dist/assets/bicep-CFznDFnq.js +2 -0
- package/web/dist/assets/cameligo-Bf6VGUru.js +1 -0
- package/web/dist/assets/clojure-Dnu-v4kV.js +1 -0
- package/web/dist/assets/codicon-DF1abBS2.ttf +0 -0
- package/web/dist/assets/coffee-Bd8akH9Z.js +1 -0
- package/web/dist/assets/cpp-BbWJElDN.js +1 -0
- package/web/dist/assets/csharp-Co3qMtFm.js +1 -0
- package/web/dist/assets/csp-D-4FJmMZ.js +1 -0
- package/web/dist/assets/css-DdJfP1eB.js +3 -0
- package/web/dist/assets/css.worker-CH7Os8C2.js +97 -0
- package/web/dist/assets/cssMode-DOakqY50.js +1 -0
- package/web/dist/assets/cypher-cTPe9QuQ.js +1 -0
- package/web/dist/assets/dart-BOtBlQCF.js +1 -0
- package/web/dist/assets/dockerfile-BG73LgW2.js +1 -0
- package/web/dist/assets/ecl-BEgZUVRK.js +1 -0
- package/web/dist/assets/editor.worker-BytiCuzy.js +30 -0
- package/web/dist/assets/elixir-BkW5O-1t.js +1 -0
- package/web/dist/assets/estree-DlGR-zBs.js +44 -0
- package/web/dist/assets/flow9-BeJ5waoc.js +1 -0
- package/web/dist/assets/freemarker2-WsMzPf-p.js +3 -0
- package/web/dist/assets/fsharp-PahG7c26.js +1 -0
- package/web/dist/assets/go-acbASCJo.js +1 -0
- package/web/dist/assets/graphql-BxJiqAUM.js +1 -0
- package/web/dist/assets/graphql-Houc-vhO.js +17 -0
- package/web/dist/assets/handlebars-CFf3afIj.js +1 -0
- package/web/dist/assets/hcl-DtV1sZF8.js +1 -0
- package/web/dist/assets/html-Cdlyoy-I.js +25 -0
- package/web/dist/assets/html-Duk6L3Ci.js +1 -0
- package/web/dist/assets/html.worker-DTgyLzoY.js +474 -0
- package/web/dist/assets/htmlMode-CuaMCYCU.js +1 -0
- package/web/dist/assets/index-CGbzqzmX.js +19 -0
- package/web/dist/assets/index-DI4uTQnz.css +32 -0
- package/web/dist/assets/index-DpS67tuQ.js +522 -0
- package/web/dist/assets/ini-Kd9XrMLS.js +1 -0
- package/web/dist/assets/java-CXBNlu9o.js +1 -0
- package/web/dist/assets/javascript-57wNn1QZ.js +1 -0
- package/web/dist/assets/json.worker-Dgwax7hT.js +62 -0
- package/web/dist/assets/jsonMode-DPgMOUkd.js +7 -0
- package/web/dist/assets/julia-cl7-CwDS.js +1 -0
- package/web/dist/assets/kotlin-s7OhZKlX.js +1 -0
- package/web/dist/assets/less-9HpZscsL.js +2 -0
- package/web/dist/assets/lexon-OrD6JF1K.js +1 -0
- package/web/dist/assets/liquid-DHlnUOel.js +1 -0
- package/web/dist/assets/lspLanguageFeatures-BIy_BVAi.js +4 -0
- package/web/dist/assets/lua-Cyyb5UIc.js +1 -0
- package/web/dist/assets/m3-B8OfTtLu.js +1 -0
- package/web/dist/assets/markdown-BFxVWTOG.js +1 -0
- package/web/dist/assets/markdown-Da4luf4E.js +70 -0
- package/web/dist/assets/mdx-SCDblWWe.js +1 -0
- package/web/dist/assets/mips-CiqrrVzr.js +1 -0
- package/web/dist/assets/msdax-DmeGPVcC.js +1 -0
- package/web/dist/assets/mysql-C_tMU-Nz.js +1 -0
- package/web/dist/assets/objective-c-BDtDVThU.js +1 -0
- package/web/dist/assets/pascal-vHIfCaH5.js +1 -0
- package/web/dist/assets/pascaligo-DtZ0uQbO.js +1 -0
- package/web/dist/assets/perl-Ub6l9XKa.js +1 -0
- package/web/dist/assets/pgsql-BlNEE0v7.js +1 -0
- package/web/dist/assets/php-BBUBE1dy.js +1 -0
- package/web/dist/assets/pla-DSh2-awV.js +1 -0
- package/web/dist/assets/postcss-2VMvKpSM.js +62 -0
- package/web/dist/assets/postiats-CocnycG-.js +1 -0
- package/web/dist/assets/powerquery-tScXyioY.js +1 -0
- package/web/dist/assets/powershell-COWaemsV.js +1 -0
- package/web/dist/assets/protobuf-Brw8urJB.js +2 -0
- package/web/dist/assets/pug-8SOpv6rk.js +1 -0
- package/web/dist/assets/python-DcjgL-6k.js +1 -0
- package/web/dist/assets/qsharp-Bw9ernYp.js +1 -0
- package/web/dist/assets/r-j7ic8hl3.js +1 -0
- package/web/dist/assets/razor-q_Zkc8t3.js +1 -0
- package/web/dist/assets/redis-Bu5POkcn.js +1 -0
- package/web/dist/assets/redshift-Bs9aos_-.js +1 -0
- package/web/dist/assets/restructuredtext-CqXO7rUv.js +1 -0
- package/web/dist/assets/ruby-zBfavPgS.js +1 -0
- package/web/dist/assets/rust-BzKRNQWT.js +1 -0
- package/web/dist/assets/sb-BBc9UKZt.js +1 -0
- package/web/dist/assets/scala-D9hQfWCl.js +1 -0
- package/web/dist/assets/scheme-BPhDTwHR.js +1 -0
- package/web/dist/assets/scss-CBJaRo0y.js +3 -0
- package/web/dist/assets/shell-DiJ1NA_G.js +1 -0
- package/web/dist/assets/solidity-Db0IVjzk.js +1 -0
- package/web/dist/assets/sophia-CnS9iZB_.js +1 -0
- package/web/dist/assets/sparql-CJmd_6j2.js +1 -0
- package/web/dist/assets/sql-ClhHkBeG.js +1 -0
- package/web/dist/assets/st-CHwy0fLd.js +1 -0
- package/web/dist/assets/standalone-fOeV0Vsa.js +29 -0
- package/web/dist/assets/swift-Bqt4WxQ4.js +3 -0
- package/web/dist/assets/systemverilog-Bs9z6M-B.js +1 -0
- package/web/dist/assets/tcl-Dm6ycUr_.js +1 -0
- package/web/dist/assets/ts.worker-CE_y865M.js +67735 -0
- package/web/dist/assets/tsMode-N3PGleJF.js +11 -0
- package/web/dist/assets/twig-Csy3S7wG.js +1 -0
- package/web/dist/assets/typescript-CpwMS6-X.js +22 -0
- package/web/dist/assets/typescript-UQxkBsMs.js +1 -0
- package/web/dist/assets/typespec-Btyra-wh.js +1 -0
- package/web/dist/assets/vb-Db0cS2oM.js +1 -0
- package/web/dist/assets/wgsl-BTesnYfV.js +298 -0
- package/web/dist/assets/workers-BVzxuZVI.js +1 -0
- package/web/dist/assets/xml-BDNQC6ch.js +1 -0
- package/web/dist/assets/yaml-CwaMJBxz.js +154 -0
- package/web/dist/assets/yaml-FyKAiCgl.js +1 -0
- package/web/dist/favicon.svg +1 -0
- package/web/dist/index.html +20 -0
- package/web/dist/logo-small.svg +1 -0
- package/web/dist/logo.svg +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 goldyndevs
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,180 @@
|
|
|
1
|
-
|
|
1
|
+
<h1 align="center">
|
|
2
|
+
<a href="https://github.com/goldyndevs/clauder-hub"><img src="logo.svg" width="64" alt="Clauder Hub logo"></a>
|
|
3
|
+
<br>
|
|
4
|
+
Clauder Hub
|
|
5
|
+
</h1>
|
|
2
6
|
|
|
3
|
-
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://www.npmjs.com/package/clauder-hub"><img src="https://img.shields.io/npm/v/clauder-hub?color=d97757" alt="npm version"></a>
|
|
9
|
+
<a href="https://www.npmjs.com/package/clauder-hub"><img src="https://img.shields.io/npm/dm/clauder-hub" alt="npm downloads"></a>
|
|
10
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="MIT license"></a>
|
|
11
|
+
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D22-339933" alt="Node 22 or newer"></a>
|
|
12
|
+
<a href="https://github.com/goldyndevs/clauder-hub/stargazers"><img src="https://img.shields.io/github/stars/goldyndevs/clauder-hub?style=flat" alt="GitHub stars"></a>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<p align="center">
|
|
16
|
+
<b>Every Claude Code session on your machine, in one browser tab.</b><br>
|
|
17
|
+
A handy ADE and wrapper around Claude Code.
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
<p align="center">
|
|
21
|
+
<img src="docs/assets/hero.jpg" width="960" alt="Clauder Hub: a Claude Code session in its terminal, waiting on a permission, with the project's sessions in the sidebar">
|
|
22
|
+
</p>
|
|
23
|
+
|
|
24
|
+
<p align="center">
|
|
25
|
+
<code>npx clauder-hub .</code>
|
|
26
|
+
</p>
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Features
|
|
31
|
+
|
|
32
|
+
Clauder Hub runs the real `claude` you already use, in real terminals, and adds what one terminal window cannot: every project at once, an inbox of everything Claude is waiting on, answers from your phone, scheduled runs and stats. Nothing is reimplemented and nothing is installed into Claude Code.
|
|
33
|
+
|
|
34
|
+
<table>
|
|
35
|
+
<tr>
|
|
36
|
+
<td width="40%">
|
|
37
|
+
<h3>Real terminals, live activity</h3>
|
|
38
|
+
<b>New session</b> opens a plain <code>claude</code> in an embedded xterm. Close the tab and it keeps running; every tool call, token and subagent is read from the transcripts as it goes.
|
|
39
|
+
</td>
|
|
40
|
+
<td width="60%">
|
|
41
|
+
<picture>
|
|
42
|
+
<source srcset="docs/assets/terminal.webp" type="image/webp">
|
|
43
|
+
<img src="docs/assets/terminal.jpg" width="100%" alt="Starting a session and typing a prompt; Claude reads, edits and asks to run npm test">
|
|
44
|
+
</picture>
|
|
45
|
+
</td>
|
|
46
|
+
</tr>
|
|
47
|
+
<tr>
|
|
48
|
+
<td>
|
|
49
|
+
<h3>One inbox for every project</h3>
|
|
50
|
+
Permissions, questions and finished turns from all your projects land in one place, with buttons. The answer is typed into the terminal, and the first answer from anywhere wins.
|
|
51
|
+
</td>
|
|
52
|
+
<td>
|
|
53
|
+
<picture>
|
|
54
|
+
<source srcset="docs/assets/inbox.webp" type="image/webp">
|
|
55
|
+
<img src="docs/assets/inbox.jpg" width="100%" alt="The global inbox: allowing npm test and picking Redis, then each session comes back with its next question">
|
|
56
|
+
</picture>
|
|
57
|
+
</td>
|
|
58
|
+
</tr>
|
|
59
|
+
<tr>
|
|
60
|
+
<td>
|
|
61
|
+
<h3>Answer from your phone</h3>
|
|
62
|
+
Telegram and Slack bots relay every question with inline buttons, and BotFather-style commands (<code>/new</code>, <code>/sessions</code>, <code>/summary</code>, <code>/stop</code>) drive sessions from chat. No public URL needed.
|
|
63
|
+
</td>
|
|
64
|
+
<td>
|
|
65
|
+
<picture>
|
|
66
|
+
<source srcset="docs/assets/telegram.webp" type="image/webp">
|
|
67
|
+
<img src="docs/assets/telegram.jpg" width="100%" alt="A Telegram chat with the hub's bot: a permission card with Allow and Deny buttons, then the /sessions picker">
|
|
68
|
+
</picture>
|
|
69
|
+
</td>
|
|
70
|
+
</tr>
|
|
71
|
+
<tr>
|
|
72
|
+
<td>
|
|
73
|
+
<h3>Cron, webhooks and a queue</h3>
|
|
74
|
+
Nightly test triage, weekly dependency audits, a run per new GitHub issue. Each project has one queue, and a task category defines what "done" means before a run may close.
|
|
75
|
+
</td>
|
|
76
|
+
<td>
|
|
77
|
+
<img src="docs/assets/automation.jpg" width="100%" alt="The Automation page: cron and webhook jobs and the queue of finished runs">
|
|
78
|
+
</td>
|
|
79
|
+
</tr>
|
|
80
|
+
<tr>
|
|
81
|
+
<td>
|
|
82
|
+
<h3>Toolsets and presets</h3>
|
|
83
|
+
Turn agents, skills, MCP servers and plugins off for one session, or save the choice as a preset for jobs and new sessions. Applied through that session's own <code>--settings</code>, nothing else.
|
|
84
|
+
</td>
|
|
85
|
+
<td>
|
|
86
|
+
<img src="docs/assets/toolsets.jpg" width="100%" alt="Toolset presets: switches for plugins and agents in a Frontend preset">
|
|
87
|
+
</td>
|
|
88
|
+
</tr>
|
|
89
|
+
<tr>
|
|
90
|
+
<td>
|
|
91
|
+
<h3>Stats from the transcripts</h3>
|
|
92
|
+
Tokens by day and by model, built-in tools, MCP servers, skills and subagents, per project and per session. Parsed from the JSONL Claude Code already writes, so it costs nothing.
|
|
93
|
+
</td>
|
|
94
|
+
<td>
|
|
95
|
+
<img src="docs/assets/stats.jpg" width="100%" alt="The project overview: token totals, output tokens per day, tokens by model, tool and MCP usage">
|
|
96
|
+
</td>
|
|
97
|
+
</tr>
|
|
98
|
+
<tr>
|
|
99
|
+
<td>
|
|
100
|
+
<h3>Files and editor</h3>
|
|
101
|
+
A file tree and a Monaco editor with tabs sit beside your sessions, with GitLens-style blame from <code>git blame</code>, so you can check what Claude changed without leaving the page.
|
|
102
|
+
</td>
|
|
103
|
+
<td>
|
|
104
|
+
<img src="docs/assets/files.jpg" width="100%" alt="The Files tab and the editor showing src/lib/cart.ts with its last change">
|
|
105
|
+
</td>
|
|
106
|
+
</tr>
|
|
107
|
+
</table>
|
|
108
|
+
|
|
109
|
+
**Also in the box:**
|
|
110
|
+
|
|
111
|
+
- **The global page.** A card per project with what is running, waiting and queued, plus one global bot that tags each message with its project (`/projects`, `/use`, `/addproject`).
|
|
112
|
+
- **No forms.** Creating a job, a run, a category, a preset or a channel opens a Claude session for it: Claude asks, shows the JSON and saves it after your yes.
|
|
113
|
+
- **Natural-language fallbacks.** Misspell a command or describe a session ("the one fixing the login bug") and a small Haiku call offers its guesses as buttons. Nothing runs until you press one.
|
|
114
|
+
- **Prompts, memory and inventory.** Edit every word the hub adds to a session, edit `CLAUDE.md`, rules, agents and skills after a diff, and see every agent, skill, command, MCP server, hook and plugin by scope.
|
|
115
|
+
- **MCP suggestions.** A session blocked on a missing integration says so; `claude mcp add --scope project` runs only when you approve it.
|
|
116
|
+
- **Desktop notifications** on Windows, macOS and Linux, and webhooks to Discord, Teams or your own endpoint.
|
|
117
|
+
- **Local only.** The server listens on `127.0.0.1`. Hooks are answered `{}` at once, so the hub can never approve or block a tool call by itself.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Install
|
|
122
|
+
|
|
123
|
+
**Requirements:** Node.js 22 or newer, and [Claude Code](https://docs.claude.com/en/docs/claude-code) installed and signed in (`claude` on your PATH).
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npx clauder-hub . # the current folder
|
|
127
|
+
npx clauder-hub ~/code/my-app # or any project folder
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Or keep it installed:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
npm i -g clauder-hub
|
|
134
|
+
clauder-hub .
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Open **http://localhost:4329**. If the port is taken the next free one is used (`--port <n>` picks one). The hub remembers its projects, so later runs can be just `clauder-hub`; running it again with another folder adds that folder to the hub already running. `clauder-hub --help` lists the options.
|
|
138
|
+
|
|
139
|
+
Data lives in `~/.clauder-hub` (`CLAUDER_HUB_HOME` moves it): the project list, one database per project, and per-terminal settings files.
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Developing
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
git clone https://github.com/goldyndevs/clauder-hub.git
|
|
147
|
+
cd clauder-hub
|
|
148
|
+
npm install
|
|
149
|
+
npm run dev -- /path/to/a/project # server and web with reload
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
`npm run typecheck` and `npm run build` before a pull request. See [CONTRIBUTING.md](CONTRIBUTING.md) and [CLAUDE.md](CLAUDE.md) for how the code is laid out and the rules it keeps.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## FAQ
|
|
157
|
+
|
|
158
|
+
**Does it replace Claude Code?**
|
|
159
|
+
No. It runs the `claude` you already have, with your login, settings and plugins, in a real terminal.
|
|
160
|
+
|
|
161
|
+
**Does it write anything into my Claude Code setup?**
|
|
162
|
+
No. Hooks and the extra system prompt are passed per process with `--settings` and `--append-system-prompt-file`. The only exceptions are ones you ask for by name: a suggested `claude mcp add --scope project`, or saving an instruction file after its diff.
|
|
163
|
+
|
|
164
|
+
**Do I need a public URL for Telegram or Slack?**
|
|
165
|
+
No. Telegram uses long polling and Slack uses Socket Mode, both outgoing connections.
|
|
166
|
+
|
|
167
|
+
**What happens when I close the browser?**
|
|
168
|
+
Sessions keep running in the hub. Reopen the page and attach again.
|
|
169
|
+
|
|
170
|
+
**Can it see sessions I started in a normal terminal?**
|
|
171
|
+
Yes, with their stats. Resume one in the hub to answer it from the inbox or a channel.
|
|
172
|
+
|
|
173
|
+
**Does it cost extra tokens?**
|
|
174
|
+
Stats and `/summary` are read from transcripts. Only the natural-language fallbacks in channels make a small Haiku call.
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## License
|
|
179
|
+
|
|
180
|
+
[MIT](LICENSE) © goldyndevs
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
|
+
|
|
6
|
+
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const serverEntry = path.join(here, "..", "server", "dist", "index.js");
|
|
8
|
+
|
|
9
|
+
const args = process.argv.slice(2);
|
|
10
|
+
|
|
11
|
+
if (args.includes("-h") || args.includes("--help")) {
|
|
12
|
+
console.log(`
|
|
13
|
+
clauder-hub [project path] [--port <n>]
|
|
14
|
+
|
|
15
|
+
Opens the dashboard for the Claude Code sessions of your projects. One hub
|
|
16
|
+
runs per machine and keeps every project it was given: their sessions, cron
|
|
17
|
+
jobs and webhooks run as long as it does. A path adds that project and opens
|
|
18
|
+
it ('clauder-hub .' for the current folder); when a hub is already running,
|
|
19
|
+
the path is handed to it.
|
|
20
|
+
|
|
21
|
+
--port <n> Preferred port (default 4329). If it is taken, the next free
|
|
22
|
+
one is used.
|
|
23
|
+
version Print the version.
|
|
24
|
+
|
|
25
|
+
Examples:
|
|
26
|
+
npx clauder-hub "C:\\Source code\\your-repo"
|
|
27
|
+
cd your-repo && npx clauder-hub .
|
|
28
|
+
npx clauder-hub
|
|
29
|
+
`);
|
|
30
|
+
process.exit(0);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (args[0] === "version") {
|
|
34
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(here, "..", "package.json"), "utf8"));
|
|
35
|
+
console.log(pkg.version);
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function flag(name) {
|
|
40
|
+
const index = args.indexOf(name);
|
|
41
|
+
return index === -1 ? undefined : args[index + 1];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const positional = args.find((arg, index) => !arg.startsWith("-") && args[index - 1] !== "--port");
|
|
45
|
+
const target = positional ? path.resolve(positional) : "";
|
|
46
|
+
|
|
47
|
+
if (target && (!fs.existsSync(target) || !fs.statSync(target).isDirectory())) {
|
|
48
|
+
console.error(`\n ${target} is not a folder.\n`);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!fs.existsSync(serverEntry)) {
|
|
53
|
+
console.error(`\n The hub has not been built yet.\n Run 'npm run build' in ${path.join(here, "..")}\n`);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const port = flag("--port");
|
|
58
|
+
if (port) process.env.PORT = port;
|
|
59
|
+
if (target) process.env.CLAUDER_HUB_PROJECT = target;
|
|
60
|
+
|
|
61
|
+
await import(pathToFileURL(serverEntry).href);
|
package/logo.svg
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 18 48 30" width="480px" height="300px" baseProfile="basic"><rect width="36" height="24" x="6" y="18" fill="#d77757"/><rect width="3" height="9" x="9" y="39" fill="#d77757"/><rect width="3" height="9" x="15" y="39" fill="#d77757"/><rect width="3" height="9" x="30" y="39" fill="#d77757"/><rect width="3" height="9" x="36" y="39" fill="#d77757"/><rect width="7.5" height="6" y="33" fill="#d77757"/><rect width="7.5" height="6" x="40.5" y="33" fill="#d77757"/><rect width="9" height="9" x="12" y="24"/><rect width="9" height="9" x="27" y="24"/><rect width="3" height="6" x="22.5" y="22.5" transform="rotate(90 24 25.5)"/><rect width="3" height="7" x="37" y="22" transform="rotate(90 38.5 25.5)"/><rect width="3" height="7" x="8" y="22" transform="rotate(90 9.5 25.5)"/></svg>
|
package/package.json
CHANGED
|
@@ -1,6 +1,63 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clauder-hub",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "A local dashboard that runs, watches and automates the Claude Code sessions of every project on the machine",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "goldyndevs <goldyndevs@gmail.com>",
|
|
7
|
+
"homepage": "https://github.com/goldyndevs/clauder-hub#readme",
|
|
8
|
+
"bugs": {
|
|
9
|
+
"url": "https://github.com/goldyndevs/clauder-hub/issues"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/goldyndevs/clauder-hub.git"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=22"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"claude",
|
|
21
|
+
"claude-code",
|
|
22
|
+
"dashboard",
|
|
23
|
+
"terminal",
|
|
24
|
+
"automation"
|
|
25
|
+
],
|
|
26
|
+
"workspaces": [
|
|
27
|
+
"server",
|
|
28
|
+
"web"
|
|
29
|
+
],
|
|
30
|
+
"bin": {
|
|
31
|
+
"clauder-hub": "bin/clauder-hub.mjs"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"LICENSE",
|
|
35
|
+
"logo.svg",
|
|
36
|
+
"bin",
|
|
37
|
+
"server/dist",
|
|
38
|
+
"web/dist"
|
|
39
|
+
],
|
|
40
|
+
"scripts": {
|
|
41
|
+
"dev": "node scripts/dev.mjs",
|
|
42
|
+
"build": "npm run build:server && npm -w web run build",
|
|
43
|
+
"typecheck": "npm -w server run typecheck && npm -w web run typecheck",
|
|
44
|
+
"prepare": "npm run build",
|
|
45
|
+
"build:server": "esbuild server/src/index.ts --bundle --platform=node --format=esm --target=node22 --outfile=server/dist/index.js --external:better-sqlite3 --external:@lydell/node-pty --banner:js=\"import{createRequire}from'node:module';const require=createRequire(import.meta.url);\""
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@lydell/node-pty": "1.2.0-beta.18",
|
|
49
|
+
"better-sqlite3": "^13.0.3",
|
|
50
|
+
"material-icon-theme": "^5.40.0"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"cors": "^2.8.5",
|
|
54
|
+
"croner": "^9.1.0",
|
|
55
|
+
"esbuild": "^0.28.2",
|
|
56
|
+
"express": "^4.21.2",
|
|
57
|
+
"ignore": "^7.0.14",
|
|
58
|
+
"nanoid": "^5.0.9",
|
|
59
|
+
"tsx": "^4.19.2",
|
|
60
|
+
"ws": "^8.18.0",
|
|
61
|
+
"zod": "^4.1.13"
|
|
62
|
+
}
|
|
63
|
+
}
|