claudelink 1.0.0 → 1.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/README.md CHANGED
@@ -11,6 +11,10 @@ Terminal 3 (tester) ──┤
11
11
  Terminal 4 (ops) ──┘
12
12
  ```
13
13
 
14
+ A local **Command Center** at `http://127.0.0.1:7878` opens automatically with the first agent — see who's online, watch messages flow, and kill stuck servers without touching the terminal.
15
+
16
+ ![ClaudeLink Command Center](docs/assets/command-center.png)
17
+
14
18
  ## Quick Start
15
19
 
16
20
  ```bash
@@ -70,6 +74,30 @@ ClaudeLink is an [MCP (Model Context Protocol)](https://modelcontextprotocol.io/
70
74
 
71
75
  There is no daemon or background service. Each Claude Code session spawns its own MCP server process, and they coordinate through the shared database.
72
76
 
77
+ ## Command Center
78
+
79
+ The Command Center is a local web UI at `http://127.0.0.1:7878` that gives you a live view of every agent in the mesh. The first `claudelink-server` to boot in any terminal launches it automatically — subsequent agents share the same window. It survives MCP restarts and only exits when you click **Quit UI** (or run `claudelink ui --stop`).
80
+
81
+ ### What it shows
82
+
83
+ - **Running servers** — every `claudelink-server` process, with PID, TTY, uptime, and the role it registered as. Per-row **Kill** button sends SIGTERM.
84
+ - **Registered agents** — role, description, online status, message counts (sent / received), and last-seen timestamp. Per-row **Kill agent** SIGTERMs the matching server.
85
+ - **Health** — total agents, unread/total messages, bulletin entries, orphan blockers, FK violations, and servers running. The **Heal orphans** button cascade-cleans every dead agent's messages and bulletin rows in one transaction.
86
+ - **Recent messages** — the last several messages across all agents, with unread and priority badges.
87
+
88
+ The page auto-refreshes every 2 seconds. **Kill all servers** in the header drops the whole mesh in one click.
89
+
90
+ ### Lifecycle
91
+
92
+ A lock file at `~/.claudelink/ui.lock` prevents duplicate windows. The launcher detached-spawns the UI process with `unref()` so it outlives the MCP parent. If a stale lock is detected (PID dead and no heartbeat at `/api/heartbeat`), a fresh UI takes over.
93
+
94
+ To opt out, set `CLAUDELINK_UI=off` in the environment before starting Claude Code.
95
+
96
+ ```bash
97
+ claudelink ui # start it manually (or just spawn any agent)
98
+ claudelink ui --stop # graceful shutdown
99
+ ```
100
+
73
101
  ## Available Tools
74
102
 
75
103
  Once connected, Claude Code gains these tools:
@@ -119,13 +147,86 @@ Read the bulletin board.
119
147
  ## CLI Commands
120
148
 
121
149
  ```bash
122
- claudelink init # Configure for current project
123
- claudelink init --global # Configure globally
124
- claudelink status # Show registered agents and message stats
125
- claudelink reset # Clear all data (fresh start)
126
- claudelink help # Show help
150
+ claudelink init # Configure for current project
151
+ claudelink init --global # Configure globally
152
+ claudelink status # Show registered agents and message stats
153
+ claudelink ui # Open the Command Center in your browser
154
+ claudelink ui --stop # Stop the Command Center
155
+ claudelink install-hooks # Install autonomous-reply hooks (project)
156
+ claudelink install-hooks --global # Install hooks in ~/.claude/settings.json
157
+ claudelink install-hooks --uninstall # Remove ClaudeLink hooks
158
+ claudelink reset # Clear all data (fresh start)
159
+ claudelink help # Show help
127
160
  ```
128
161
 
162
+ ## Autonomous Replies
163
+
164
+ ClaudeLink eliminates the "go to every terminal and type *check inbox*" loop with two complementary mechanisms: an **auto-nudge scheduler** for the periodic / idle case, and a **Stop hook** for low-latency turn-end processing. Both feed messages into the recipient agent through Claude's own `read_inbox` MCP tool, so Claude has full agency over whether and how to reply.
165
+
166
+ ### Auto-nudge scheduler (primary)
167
+
168
+ The Command Center runs a periodic scheduler that types `check for updates` into each registered agent's terminal whenever its inbox has unread messages. Configure it directly from the Command Center UI:
169
+
170
+ - **On/off toggle** — the "Auto-nudge" panel (between Health and Recent messages)
171
+ - **Interval** — minutes between ticks (default 5, clamped to 1–120)
172
+
173
+ The scheduler is **smart**: the SQL trigger only nudges terminals that actually have unread mail, so empty inboxes don't burn Claude turns. Per-terminal-app dispatch:
174
+
175
+ - **tmux** → `tmux send-keys` (no permissions needed)
176
+ - **iTerm2** → `osascript` matched by tty (no Accessibility prompt)
177
+ - **Apple Terminal** → currently unsupported (would need Accessibility permission; logged as skipped)
178
+
179
+ When the keystroke arrives, the existing UserPromptSubmit hook fires, injects "you have N unread, call read_inbox" as `additionalContext`, and Claude reads the inbox via its own tool call. This routes through Claude's normal trusted-input path, so the prompt-injection defense never trips.
180
+
181
+ Settings persist at `~/.claudelink/scheduler.json`. Audit log at `~/.claudelink/scheduler.log`.
182
+
183
+ ### Stop hook (supplementary low-latency path)
184
+
185
+ For the case where an agent has *just* finished a turn and there's a message in its inbox, a Stop hook can fire immediately instead of waiting for the next scheduler tick. Install with:
186
+
187
+ ```bash
188
+ claudelink install-hooks # project-scoped — writes ./.claude/settings.json
189
+ claudelink install-hooks --global # writes ~/.claude/settings.json
190
+ claudelink install-hooks --uninstall # clean rollback
191
+ ```
192
+
193
+ The hook emits `{"decision": "block", "reason": "..."}` directing Claude to call `read_inbox`. Three guards prevent runaway loops:
194
+
195
+ - **Hard cap** — max consecutive auto-fires per terminal without a human prompt (`CLAUDELINK_HARD_CAP`, default 5)
196
+ - **Cooldown** — minimum seconds between auto-fires per terminal (`CLAUDELINK_COOLDOWN_S`, default 30)
197
+ - **Chain cap** — max `parent_id` chain depth before a message stops triggering auto-fires (`CLAUDELINK_CHAIN_CAP`, default 8)
198
+
199
+ Set any to `0` to disable that specific guard. Every Stop hook decision logs to `~/.claudelink/auto-fire.log`.
200
+
201
+ **Honest note on Claude's safety boundary:** Claude Code's prompt-injection defense correctly flags "external content steering outbound tool calls" as adversarial. In practice this means the Stop hook reliably triggers an autonomous inbox read, but Claude may decline to send the outbound reply autonomously — particularly when the reply would be unrelated to the user's most recent prompt. This is responsible safety behavior, not a bug. The auto-nudge scheduler avoids this entirely because the keystroke path is indistinguishable from the user typing by hand.
202
+
203
+ ### Per-agent opt-out (advisor pattern)
204
+
205
+ Register with `autonomousReply: false` for terminals that should receive but never auto-process messages:
206
+
207
+ - The Stop hook reads the inbox (so messages don't pile up) but never emits a continuation
208
+ - The auto-nudge scheduler skips advisor agents entirely
209
+
210
+ Use this for strategy/oversight terminals where you want visibility without auto-replies.
211
+
212
+ ### Per-message opt-out
213
+
214
+ Send with `expectsReply: false` for FYI / informational pings. The recipient still reads them but the Stop hook treats them as ineligible for auto-fire (the scheduler already filters by message presence regardless of `expects_reply`, so FYIs trigger nudges too).
215
+
216
+ ### Desktop notifications
217
+
218
+ The Command Center fires a macOS desktop notification (via `osascript display notification`, no Accessibility permission required) for every new message that lands in any agent's inbox — including agents registered with `autonomousReply: false`. Notifications give you situational awareness across the swarm without switching terminals.
219
+
220
+ Multiple messages arriving in the same 2-second poll window collapse into one summary notification ("3 new ClaudeLink messages: reviewer → developer: ... (+2 more)"). The historical backlog is suppressed at startup so a freshly opened Command Center doesn't spam you with old messages.
221
+
222
+ Off-switch: `CLAUDELINK_NOTIFY=off`.
223
+
224
+ ### Debug knobs
225
+
226
+ - `CLAUDELINK_HOOK_TTY=/dev/ttysNNN` — override TTY auto-detection (testing, CI).
227
+ - `CLAUDELINK_HOOK_STRICT=1` — surface hook errors to stderr instead of swallowing them. Default is fail-open (production safety).
228
+ - `CLAUDELINK_NOTIFY=off` — disable desktop notifications.
229
+
129
230
  ## Autonomous Mode (Recommended)
130
231
 
131
232
  By default, you'd have to tell Claude "check my inbox" manually every time. That defeats the purpose. With autonomous mode, agents communicate **on their own** — checking for messages and sending updates without you asking.
@@ -451,7 +552,6 @@ node dist/cli.js status
451
552
  - **Message history**: Tool to view past messages (not just unread)
452
553
  - **File sharing**: Agents can share file paths or code snippets with structured formatting
453
554
  - **Priority notifications**: Interrupt the current agent when a high-priority message arrives
454
- - **Web dashboard**: A local web UI to visualize agent activity
455
555
  - **Agent templates**: Pre-built role configurations for common workflows
456
556
  - **Webhooks**: Notify external services when agents communicate
457
557
  - **Encryption**: Encrypt messages at rest in the database
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/ui-bin.js');
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/hooks/user-prompt-submit-hook.js');
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/hooks/stop-hook.js');
@@ -0,0 +1,26 @@
1
+ export interface FireState {
2
+ count: number;
3
+ lastFireTs: number;
4
+ }
5
+ export interface Caps {
6
+ hardCap: number;
7
+ cooldownS: number;
8
+ chainCap: number;
9
+ }
10
+ export interface CapDecision {
11
+ allowed: boolean;
12
+ reason: string;
13
+ newCount: number;
14
+ caps: Caps;
15
+ }
16
+ export declare function getCaps(): Caps;
17
+ export declare function readState(tty: string): FireState;
18
+ export declare function checkAndIncrement(tty: string): CapDecision;
19
+ export declare function resetCounter(tty: string): void;
20
+ export declare function appendAutoFireLog(entry: {
21
+ tty: string;
22
+ agentRole: string | null;
23
+ decision: "fired" | "blocked-by-cap" | "no-eligible-msgs" | "opt-out" | "no-agent" | "counter-reset";
24
+ reason: string;
25
+ inboundCount?: number;
26
+ }): void;
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ // Per-TTY auto-fire state for the Stop hook.
3
+ //
4
+ // Each terminal that has registered an agent gets a tiny JSON file at
5
+ // ~/.claudelink/state/<tty>.json holding the consecutive auto-fire count
6
+ // and the last-fire timestamp. checkAndIncrement applies the hard cap
7
+ // (consecutive fires) and the soft cooldown (seconds since last fire);
8
+ // resetCounter is called by the UserPromptSubmit hook when the human types
9
+ // something. Everything is per-TTY, so different terminals never contend.
10
+ var __importDefault = (this && this.__importDefault) || function (mod) {
11
+ return (mod && mod.__esModule) ? mod : { "default": mod };
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.getCaps = getCaps;
15
+ exports.readState = readState;
16
+ exports.checkAndIncrement = checkAndIncrement;
17
+ exports.resetCounter = resetCounter;
18
+ exports.appendAutoFireLog = appendAutoFireLog;
19
+ const fs_1 = __importDefault(require("fs"));
20
+ const path_1 = __importDefault(require("path"));
21
+ const os_1 = __importDefault(require("os"));
22
+ const HARD_CAP_DEFAULT = 5;
23
+ const COOLDOWN_S_DEFAULT = 30;
24
+ const CHAIN_CAP_DEFAULT = 8;
25
+ const STATE_DIR = path_1.default.join(os_1.default.homedir(), ".claudelink", "state");
26
+ const LOG_PATH = path_1.default.join(os_1.default.homedir(), ".claudelink", "auto-fire.log");
27
+ function envInt(key, dflt) {
28
+ const raw = process.env[key];
29
+ if (raw === undefined || raw === "")
30
+ return dflt;
31
+ const n = parseInt(raw, 10);
32
+ if (Number.isNaN(n))
33
+ return dflt;
34
+ return Math.max(0, n);
35
+ }
36
+ function getCaps() {
37
+ return {
38
+ hardCap: envInt("CLAUDELINK_HARD_CAP", HARD_CAP_DEFAULT),
39
+ cooldownS: envInt("CLAUDELINK_COOLDOWN_S", COOLDOWN_S_DEFAULT),
40
+ chainCap: envInt("CLAUDELINK_CHAIN_CAP", CHAIN_CAP_DEFAULT),
41
+ };
42
+ }
43
+ function ensureStateDir() {
44
+ if (!fs_1.default.existsSync(STATE_DIR)) {
45
+ fs_1.default.mkdirSync(STATE_DIR, { recursive: true });
46
+ }
47
+ }
48
+ function ttyToFilename(tty) {
49
+ return tty.replace(/^\/dev\//, "").replace(/[^a-zA-Z0-9_-]/g, "_");
50
+ }
51
+ function statePath(tty) {
52
+ return path_1.default.join(STATE_DIR, ttyToFilename(tty) + ".json");
53
+ }
54
+ function readState(tty) {
55
+ try {
56
+ const raw = fs_1.default.readFileSync(statePath(tty), "utf8");
57
+ const parsed = JSON.parse(raw);
58
+ return {
59
+ count: Number(parsed.count) || 0,
60
+ lastFireTs: Number(parsed.lastFireTs) || 0,
61
+ };
62
+ }
63
+ catch {
64
+ return { count: 0, lastFireTs: 0 };
65
+ }
66
+ }
67
+ function writeState(tty, state) {
68
+ ensureStateDir();
69
+ // Atomic-on-POSIX write: write to a sibling temp file then rename. Avoids
70
+ // partial writes if the process is killed mid-write.
71
+ const tmp = statePath(tty) + ".tmp";
72
+ fs_1.default.writeFileSync(tmp, JSON.stringify(state));
73
+ fs_1.default.renameSync(tmp, statePath(tty));
74
+ }
75
+ // Apply hard-cap and cooldown policy. If allowed, increment and persist.
76
+ // Caller decides what "allowed=false" means (typically: read inbox but do
77
+ // not block-and-continue).
78
+ function checkAndIncrement(tty) {
79
+ const caps = getCaps();
80
+ const now = Date.now();
81
+ const state = readState(tty);
82
+ if (state.lastFireTs > 0) {
83
+ const sinceLastS = (now - state.lastFireTs) / 1000;
84
+ if (sinceLastS < caps.cooldownS) {
85
+ return {
86
+ allowed: false,
87
+ reason: `cooldown (${sinceLastS.toFixed(1)}s of ${caps.cooldownS}s)`,
88
+ newCount: state.count,
89
+ caps,
90
+ };
91
+ }
92
+ }
93
+ if (state.count >= caps.hardCap) {
94
+ return {
95
+ allowed: false,
96
+ reason: `hard cap reached (${state.count}/${caps.hardCap}); awaiting user prompt`,
97
+ newCount: state.count,
98
+ caps,
99
+ };
100
+ }
101
+ const newState = { count: state.count + 1, lastFireTs: now };
102
+ writeState(tty, newState);
103
+ return {
104
+ allowed: true,
105
+ reason: `fire ${newState.count}/${caps.hardCap}`,
106
+ newCount: newState.count,
107
+ caps,
108
+ };
109
+ }
110
+ function resetCounter(tty) {
111
+ try {
112
+ fs_1.default.unlinkSync(statePath(tty));
113
+ }
114
+ catch {
115
+ // No file = already reset.
116
+ }
117
+ }
118
+ // Append to ~/.claudelink/auto-fire.log so a human can audit the swarm
119
+ // without reading any conversation. One line per Stop-hook fire,
120
+ // regardless of whether the cap allowed it.
121
+ function appendAutoFireLog(entry) {
122
+ try {
123
+ const ts = new Date().toISOString();
124
+ const role = entry.agentRole ?? "?";
125
+ const inbound = entry.inboundCount === undefined ? "" : ` inbound=${entry.inboundCount}`;
126
+ const line = `${ts} tty=${entry.tty} role=${role} decision=${entry.decision} reason="${entry.reason}"${inbound}\n`;
127
+ fs_1.default.appendFileSync(LOG_PATH, line);
128
+ }
129
+ catch {
130
+ // Logging must never break the hook. Drop the entry on failure.
131
+ }
132
+ }
133
+ //# sourceMappingURL=cap-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cap-state.js","sourceRoot":"","sources":["../src/cap-state.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -1,5 +1,38 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
3
36
  var __importDefault = (this && this.__importDefault) || function (mod) {
4
37
  return (mod && mod.__esModule) ? mod : { "default": mod };
5
38
  };
@@ -182,13 +215,196 @@ function showHelp() {
182
215
  Usage: claudelink <command>
183
216
 
184
217
  Commands:
185
- init Add ClaudeLink to .mcp.json in current project + CLAUDE.md
186
- init --global Add ClaudeLink globally + ~/.claude/CLAUDE.md
187
- status Show registered agents and their status
188
- reset Clear all messages and agent registrations
189
- help Show this help message
218
+ init Add ClaudeLink to .mcp.json in current project + CLAUDE.md
219
+ init --global Add ClaudeLink globally + ~/.claude/CLAUDE.md
220
+ status Show registered agents and their status
221
+ ui Launch the Command Center UI in your browser
222
+ ui --stop Stop the Command Center UI
223
+ install-hooks Install Stop + UserPromptSubmit hooks for autonomous replies (project)
224
+ install-hooks --global Install hooks in ~/.claude/settings.json (all projects)
225
+ install-hooks --uninstall Remove ClaudeLink hooks from the chosen scope
226
+ reset Clear all messages and agent registrations
227
+ help Show this help message
228
+ `);
229
+ }
230
+ // --- Hook installation (Path A) ---------------------------------------------
231
+ // Idempotently installs the Stop + UserPromptSubmit hooks into the appropriate
232
+ // settings.json. Never clobbers existing hook entries: we look for our
233
+ // command name and skip if already present. The two hook scripts are
234
+ // installed by npm into the same bin directory as `claudelink` itself, so
235
+ // resolving an absolute path lets the install survive even if the user's
236
+ // shell PATH is different from Claude Code's spawned-process PATH.
237
+ const STOP_HOOK_BIN = "claudelink-stop-hook";
238
+ const PROMPT_HOOK_BIN = "claudelink-prompt-hook";
239
+ function resolveHookCommand(name) {
240
+ // Prefer absolute path next to this CLI binary (works regardless of PATH).
241
+ // Falls back to bare name if we can't locate ourselves.
242
+ const candidates = [
243
+ path_1.default.join(path_1.default.dirname(process.argv[1] || ""), name),
244
+ path_1.default.join(__dirname, "..", "bin", name + ".js"),
245
+ ];
246
+ for (const c of candidates) {
247
+ if (c && fs_1.default.existsSync(c))
248
+ return c;
249
+ }
250
+ return name;
251
+ }
252
+ function settingsPath(scope) {
253
+ return scope === "global"
254
+ ? path_1.default.join(os_1.default.homedir(), ".claude", "settings.json")
255
+ : path_1.default.join(process.cwd(), ".claude", "settings.json");
256
+ }
257
+ function readSettings(p) {
258
+ if (!fs_1.default.existsSync(p))
259
+ return {};
260
+ try {
261
+ return JSON.parse(fs_1.default.readFileSync(p, "utf-8"));
262
+ }
263
+ catch (e) {
264
+ throw new Error(`Could not parse ${p}: ${e.message}. Refusing to overwrite — fix the JSON manually and rerun.`);
265
+ }
266
+ }
267
+ function writeSettingsAtomic(p, settings) {
268
+ const dir = path_1.default.dirname(p);
269
+ if (!fs_1.default.existsSync(dir))
270
+ fs_1.default.mkdirSync(dir, { recursive: true });
271
+ const tmp = p + ".tmp";
272
+ fs_1.default.writeFileSync(tmp, JSON.stringify(settings, null, 2) + "\n");
273
+ fs_1.default.renameSync(tmp, p);
274
+ }
275
+ function hookEntryExists(settings, event, binName) {
276
+ const events = settings?.hooks?.[event];
277
+ if (!Array.isArray(events))
278
+ return false;
279
+ for (const group of events) {
280
+ const groupHooks = group?.hooks;
281
+ if (!Array.isArray(groupHooks))
282
+ continue;
283
+ for (const h of groupHooks) {
284
+ if (typeof h?.command === "string" && h.command.endsWith(binName)) {
285
+ return true;
286
+ }
287
+ }
288
+ }
289
+ return false;
290
+ }
291
+ function appendHookEntry(settings, event, command, timeout) {
292
+ if (!settings.hooks)
293
+ settings.hooks = {};
294
+ if (!Array.isArray(settings.hooks[event]))
295
+ settings.hooks[event] = [];
296
+ settings.hooks[event].push({
297
+ matcher: "",
298
+ hooks: [{ type: "command", command, timeout }],
299
+ });
300
+ }
301
+ function removeHookEntries(settings, event, binName) {
302
+ if (!Array.isArray(settings?.hooks?.[event]))
303
+ return 0;
304
+ let removed = 0;
305
+ const filtered = [];
306
+ for (const group of settings.hooks[event]) {
307
+ const remaining = (group?.hooks || []).filter((h) => !(typeof h?.command === "string" && h.command.endsWith(binName)));
308
+ if (remaining.length !== (group?.hooks || []).length) {
309
+ removed += (group?.hooks?.length || 0) - remaining.length;
310
+ }
311
+ if (remaining.length > 0) {
312
+ filtered.push({ ...group, hooks: remaining });
313
+ }
314
+ }
315
+ settings.hooks[event] = filtered;
316
+ if (settings.hooks[event].length === 0)
317
+ delete settings.hooks[event];
318
+ return removed;
319
+ }
320
+ function installHooks(scope, uninstall) {
321
+ const p = settingsPath(scope);
322
+ let settings;
323
+ try {
324
+ settings = readSettings(p);
325
+ }
326
+ catch (e) {
327
+ console.log(` ${e.message}`);
328
+ return;
329
+ }
330
+ const stopCmd = resolveHookCommand(STOP_HOOK_BIN);
331
+ const promptCmd = resolveHookCommand(PROMPT_HOOK_BIN);
332
+ if (uninstall) {
333
+ const stopRemoved = removeHookEntries(settings, "Stop", STOP_HOOK_BIN);
334
+ const promptRemoved = removeHookEntries(settings, "UserPromptSubmit", PROMPT_HOOK_BIN);
335
+ if (stopRemoved + promptRemoved === 0) {
336
+ console.log(` No ClaudeLink hooks found in ${p}. Nothing to remove.`);
337
+ return;
338
+ }
339
+ if (settings.hooks && Object.keys(settings.hooks).length === 0)
340
+ delete settings.hooks;
341
+ writeSettingsAtomic(p, settings);
342
+ console.log(` Removed ${stopRemoved} Stop hook(s) and ${promptRemoved} UserPromptSubmit hook(s) from ${p}.`);
343
+ return;
344
+ }
345
+ let stopAction;
346
+ let promptAction;
347
+ if (hookEntryExists(settings, "Stop", STOP_HOOK_BIN)) {
348
+ stopAction = "skipped";
349
+ }
350
+ else {
351
+ appendHookEntry(settings, "Stop", stopCmd, 10);
352
+ stopAction = "added";
353
+ }
354
+ if (hookEntryExists(settings, "UserPromptSubmit", PROMPT_HOOK_BIN)) {
355
+ promptAction = "skipped";
356
+ }
357
+ else {
358
+ appendHookEntry(settings, "UserPromptSubmit", promptCmd, 5);
359
+ promptAction = "added";
360
+ }
361
+ if (stopAction === "skipped" && promptAction === "skipped") {
362
+ console.log(` ClaudeLink hooks already installed in ${p}. Nothing to do.`);
363
+ return;
364
+ }
365
+ writeSettingsAtomic(p, settings);
366
+ console.log(` Updated ${p}:`);
367
+ console.log(` Stop hook: ${stopAction} (${stopCmd})`);
368
+ console.log(` UserPromptSubmit hook: ${promptAction} (${promptCmd})`);
369
+ console.log(`
370
+ Restart Claude Code in any terminal where you want autonomous replies
371
+ active. The hooks fire on Stop (when an agent finishes a turn) and
372
+ UserPromptSubmit (resets the per-terminal auto-fire counter).
373
+
374
+ Tunable env vars:
375
+ CLAUDELINK_HARD_CAP=5 consecutive auto-fires per terminal
376
+ CLAUDELINK_COOLDOWN_S=30 seconds between fires
377
+ CLAUDELINK_CHAIN_CAP=8 parent_id chain depth before excluding msg
378
+ CLAUDELINK_HOOK_STRICT=1 surface hook errors to stderr (dev mode)
379
+
380
+ Audit log: ~/.claudelink/auto-fire.log
190
381
  `);
191
382
  }
383
+ async function uiCommand(stop) {
384
+ const { launchUIIfNeeded, stopUI, getUIStatus } = await Promise.resolve().then(() => __importStar(require("./ui-launcher.js")));
385
+ if (stop) {
386
+ const ok = stopUI();
387
+ console.log(ok ? " Command Center UI stopped." : " Command Center UI is not running.");
388
+ return;
389
+ }
390
+ const status = getUIStatus();
391
+ if (status.running) {
392
+ console.log(` Command Center UI is already running.`);
393
+ console.log(` Open: ${status.url}`);
394
+ return;
395
+ }
396
+ const url = await launchUIIfNeeded({ openBrowser: true });
397
+ if (url) {
398
+ console.log(` Command Center UI launched.`);
399
+ console.log(` Open: ${url}`);
400
+ }
401
+ else {
402
+ console.log(` Could not launch the Command Center UI.`);
403
+ if (process.env.CLAUDELINK_UI === "off") {
404
+ console.log(` CLAUDELINK_UI=off is set. Unset it to enable.`);
405
+ }
406
+ }
407
+ }
192
408
  function showStatus() {
193
409
  const dbPath = path_1.default.join(NEXUS_DIR, "nexus.db");
194
410
  if (!fs_1.default.existsSync(dbPath)) {
@@ -259,6 +475,12 @@ switch (command) {
259
475
  case "status":
260
476
  showStatus();
261
477
  break;
478
+ case "ui":
479
+ uiCommand(args.includes("--stop") || args.includes("stop"));
480
+ break;
481
+ case "install-hooks":
482
+ installHooks(args.includes("--global") ? "global" : "project", args.includes("--uninstall"));
483
+ break;
262
484
  case "reset":
263
485
  resetDB();
264
486
  break;
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}