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 +106 -6
- package/bin/claudelink-ui.js +2 -0
- package/bin/prompt-hook.js +2 -0
- package/bin/stop-hook.js +2 -0
- package/dist/cap-state.d.ts +26 -0
- package/dist/cap-state.js +133 -0
- package/dist/cap-state.js.map +1 -0
- package/dist/cli.js +227 -5
- package/dist/cli.js.map +1 -1
- package/dist/db.d.ts +24 -3
- package/dist/db.js +175 -36
- package/dist/db.js.map +1 -1
- package/dist/hooks/stop-hook.d.ts +1 -0
- package/dist/hooks/stop-hook.js +211 -0
- package/dist/hooks/stop-hook.js.map +1 -0
- package/dist/hooks/user-prompt-submit-hook.d.ts +1 -0
- package/dist/hooks/user-prompt-submit-hook.js +54 -0
- package/dist/hooks/user-prompt-submit-hook.js.map +1 -0
- package/dist/index.js +86 -5
- package/dist/index.js.map +1 -1
- package/dist/scheduler-settings.d.ts +6 -0
- package/dist/scheduler-settings.js +58 -0
- package/dist/scheduler-settings.js.map +1 -0
- package/dist/scheduler.d.ts +10 -0
- package/dist/scheduler.js +189 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/ui-bin.d.ts +2 -0
- package/dist/ui-bin.js +10 -0
- package/dist/ui-bin.js.map +1 -0
- package/dist/ui-launcher.d.ts +16 -0
- package/dist/ui-launcher.js +145 -0
- package/dist/ui-launcher.js.map +1 -0
- package/dist/ui-server.d.ts +2 -0
- package/dist/ui-server.js +813 -0
- package/dist/ui-server.js.map +1 -0
- package/package.json +5 -2
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
|
+

|
|
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
|
|
123
|
-
claudelink init --global
|
|
124
|
-
claudelink status
|
|
125
|
-
claudelink
|
|
126
|
-
claudelink
|
|
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
|
package/bin/stop-hook.js
ADDED
|
@@ -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
|
|
186
|
-
init --global
|
|
187
|
-
status
|
|
188
|
-
|
|
189
|
-
|
|
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":";;;;;;AAEA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,iBAAiB,GAAG;IACxB,IAAI,EAAE,OAAgB;IACtB,OAAO,EAAE,mBAAmB;CAC7B,CAAC;AAEF,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BzB,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,gBAAgB,GAAG,gDAAgD,CAAC;AAE1E,SAAS,eAAe,CAAC,KAA2B;IAClD,IAAI,YAAoB,CAAC;IAEzB,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,+DAA+D;IAC/D,IAAI,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACxD,IAAI,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,oDAAoD,YAAY,GAAG,CAAC,CAAC;YACjF,OAAO;QACT,CAAC;QACD,0BAA0B;QAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1D,YAAE,CAAC,aAAa,CAAC,YAAY,EAAE,QAAQ,GAAG,SAAS,GAAG,iBAAiB,GAAG,IAAI,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,+CAA+C,YAAY,EAAE,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,kBAAkB;QAClB,YAAE,CAAC,aAAa,CAAC,YAAY,EAAE,2BAA2B,GAAG,iBAAiB,GAAG,IAAI,CAAC,CAAC;QACvF,OAAO,CAAC,GAAG,CAAC,aAAa,YAAY,+BAA+B,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,CAAC,GAAG,CAAC;;;;;GAKX,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAEhD,iCAAiC;IACjC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,2BAA2B;IAC3B,IAAI,SAAS,GAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAExC,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACtD,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;gBAC1B,SAAS,CAAC,UAAU,GAAG,EAAE,CAAC;YAC5B,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;YACjF,SAAS,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,iBAAiB,CAAC;IAEvD,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,aAAa,WAAW,EAAE,CAAC,CAAC;IAExC,sDAAsD;IACtD,eAAe,CAAC,SAAS,CAAC,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;oBAiBM,SAAS;uBACN,WAAW;GAC/B,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU;IACjB,iCAAiC;IACjC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,GAAG,CAAC,CAAC;IACzC,CAAC;IAED,4DAA4D;IAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9C,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,CAAC,6DAA6D,EAAE;YACtE,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC;;;;;;KAMX,CAAC,CAAC;IACL,CAAC;IAED,6DAA6D;IAC7D,eAAe,CAAC,QAAQ,CAAC,CAAC;IAE1B,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;oBAcI,SAAS;KACxB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC;;;;;;;;;GASX,CAAC,CAAC;AACL,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAChD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC,GAAG,EAAE,CAAC;QACpF,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,uDAAuD,CAAC,CAAC,GAAG,EAAS,CAAC;QAClG,MAAM,aAAa,GAAG,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC,GAAG,EAAS,CAAC;QAExF,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,EAAE,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,uBAAuB,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QAEvD,KAAK,MAAM,KAAK,IAAI,MAAe,EAAE,CAAC;YACpC,IAAI,KAAK,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC3B,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAEV,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,QAAQ,MAAM,KAAK,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,GAAG,mBAAmB,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC;YACtG,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,SAAS,OAAO;IACd,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAChD,IAAI,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACtB,gCAAgC;QAChC,IAAI,YAAE,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;YAAE,YAAE,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;QACnE,IAAI,YAAE,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;YAAE,YAAE,CAAC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;IACxF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,eAAe;AACf,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAExB,WAAW,EAAE,CAAC;AAEd,QAAQ,OAAO,EAAE,CAAC;IAChB,KAAK,MAAM;QACT,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,UAAU,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,WAAW,EAAE,CAAC;QAChB,CAAC;QACD,MAAM;IACR,KAAK,QAAQ;QACX,UAAU,EAAE,CAAC;QACb,MAAM;IACR,KAAK,OAAO;QACV,OAAO,EAAE,CAAC;QACV,MAAM;IACR,KAAK,MAAM,CAAC;IACZ,KAAK,QAAQ,CAAC;IACd,KAAK,IAAI;QACP,QAAQ,EAAE,CAAC;QACX,MAAM;IACR;QACE,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,IAAI,CAAC,CAAC;QACjD,CAAC;QACD,QAAQ,EAAE,CAAC;QACX,MAAM;AACV,CAAC"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|