@lordierclaw/bluenote 0.4.5 → 0.4.8
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 +4 -2
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +10 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.js +37 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/daemon.d.ts +2 -0
- package/dist/commands/daemon.js +163 -0
- package/dist/commands/daemon.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +113 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/help.d.ts +3 -0
- package/dist/commands/help.js +25 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/tui.d.ts +2 -0
- package/dist/commands/tui.js +63 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/commands/version.d.ts +2 -0
- package/dist/commands/version.js +17 -0
- package/dist/commands/version.js.map +1 -0
- package/dist/commands/web.d.ts +2 -0
- package/dist/commands/web.js +63 -0
- package/dist/commands/web.js.map +1 -0
- package/dist/daemon/paths.d.ts +3 -0
- package/dist/daemon/paths.js +29 -0
- package/dist/daemon/paths.js.map +1 -0
- package/dist/daemon/router.d.ts +38 -0
- package/dist/daemon/router.js +107 -0
- package/dist/daemon/router.js.map +1 -0
- package/dist/daemon/server.d.ts +13 -0
- package/dist/daemon/server.js +78 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/token.d.ts +1 -0
- package/dist/daemon/token.js +11 -0
- package/dist/daemon/token.js.map +1 -0
- package/dist/types.d.ts +11 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/command-discovery.d.ts +31 -0
- package/dist/utils/command-discovery.js +162 -0
- package/dist/utils/command-discovery.js.map +1 -0
- package/dist/utils/daemon-state.d.ts +21 -0
- package/dist/utils/daemon-state.js +99 -0
- package/dist/utils/daemon-state.js.map +1 -0
- package/dist/utils/lazy-import.d.ts +1 -0
- package/dist/utils/lazy-import.js +10 -0
- package/dist/utils/lazy-import.js.map +1 -0
- package/dist/utils/package-info.d.ts +15 -0
- package/dist/utils/package-info.js +49 -0
- package/dist/utils/package-info.js.map +1 -0
- package/dist/utils/runtime-requirements.d.ts +8 -0
- package/dist/utils/runtime-requirements.js +26 -0
- package/dist/utils/runtime-requirements.js.map +1 -0
- package/dist/utils/write.d.ts +1 -0
- package/dist/utils/write.js +9 -0
- package/dist/utils/write.js.map +1 -0
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -192,7 +192,7 @@ node dist/bin.js version
|
|
|
192
192
|
node dist/bin.js doctor
|
|
193
193
|
```
|
|
194
194
|
|
|
195
|
-
`npm run version:status` checks the four sibling package names and versions and rejects unsupported `@lordierclaw/bluenote-core` dependency specs. `latest`
|
|
195
|
+
`npm run version:status` checks the four sibling package names and versions and rejects unsupported `@lordierclaw/bluenote-core` dependency specs. Release mode requires `latest` for published core consumption; development mode may use pinned Git deps when you intentionally pass `--allow-git-deps` for a local-only workspace.
|
|
196
196
|
|
|
197
197
|
The distribution repo also owns the release gate for `@lordierclaw/bluenote`: publishing a GitHub Release for the matching `v*` tag triggers the workflow, which runs the repo checks and a fresh Docker `node:22-bookworm` install/smoke pass before npm publish is allowed to continue.
|
|
198
198
|
|
|
@@ -200,9 +200,11 @@ The distribution repo also owns the release gate for `@lordierclaw/bluenote`: pu
|
|
|
200
200
|
|
|
201
201
|
The package name is `@lordierclaw/bluenote`; published binaries are `bluenote` and `bn`.
|
|
202
202
|
|
|
203
|
+
The published tarball must include `dist/bin.js` so npm can generate working `bluenote` / `bn` launchers, including Windows `.cmd` shims. The package `prepack` hook rebuilds `dist/` before `npm pack` / `npm publish`.
|
|
204
|
+
|
|
203
205
|
The distribution depends on `@lordierclaw/bluenote-core` for headless behavior. Optional clients are installed separately and discovered as `bluenote-webui` and `bluenote-term` executables on `PATH`.
|
|
204
206
|
|
|
205
|
-
The distribution package consumes the latest published `@lordierclaw/bluenote-core` by default instead of requiring a same-version coordinated release. For local development workspaces that intentionally opt into Git-pinned dependencies, keep using `npm run version:status -- --allow-git-deps`.
|
|
207
|
+
The distribution package consumes the latest published `@lordierclaw/bluenote-core` by default instead of requiring a same-version coordinated release. BlueNote repos now release independently rather than following lockstep sibling version bumps. For local development workspaces that intentionally opt into Git-pinned dependencies, keep using `npm run version:status -- --allow-git-deps`.
|
|
206
208
|
|
|
207
209
|
## Cross-platform notes
|
|
208
210
|
|
package/dist/bin.d.ts
ADDED
package/dist/bin.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const cli_1 = require("./cli");
|
|
5
|
+
(0, cli_1.main)(process.argv.slice(2)).catch((error) => {
|
|
6
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
7
|
+
process.stderr.write(`${message}\n`);
|
|
8
|
+
process.exitCode = 1;
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";;;AACA,+BAA4B;AAE5B,IAAA,UAAI,EAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC1C,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,IAAI,CAAC,CAAA;IACpC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;AACtB,CAAC,CAAC,CAAA"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CommandIo } from "./types";
|
|
2
|
+
export declare const COMMANDS: readonly ["tui", "web", "daemon", "doctor", "version"];
|
|
3
|
+
export declare function run(args?: string[], io?: CommandIo): Promise<number>;
|
|
4
|
+
export declare function main(args?: string[], io?: CommandIo): Promise<number>;
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.COMMANDS = void 0;
|
|
4
|
+
exports.run = run;
|
|
5
|
+
exports.main = main;
|
|
6
|
+
const daemon_1 = require("./commands/daemon");
|
|
7
|
+
const doctor_1 = require("./commands/doctor");
|
|
8
|
+
const help_1 = require("./commands/help");
|
|
9
|
+
const tui_1 = require("./commands/tui");
|
|
10
|
+
const version_1 = require("./commands/version");
|
|
11
|
+
const web_1 = require("./commands/web");
|
|
12
|
+
const write_1 = require("./utils/write");
|
|
13
|
+
exports.COMMANDS = ["tui", "web", "daemon", "doctor", "version"];
|
|
14
|
+
async function run(args = [], io = {}) {
|
|
15
|
+
const [command, ...commandArgs] = args;
|
|
16
|
+
if (!command || command === "--help" || command === "-h" || command === "help") {
|
|
17
|
+
return (0, help_1.runHelp)(commandArgs, io);
|
|
18
|
+
}
|
|
19
|
+
if (command === "version" || command === "--version")
|
|
20
|
+
return (0, version_1.runVersion)(commandArgs, io);
|
|
21
|
+
if (command === "doctor")
|
|
22
|
+
return (0, doctor_1.runDoctor)(commandArgs, io);
|
|
23
|
+
if (command === "daemon")
|
|
24
|
+
return (0, daemon_1.runDaemon)(commandArgs, io);
|
|
25
|
+
if (command === "tui")
|
|
26
|
+
return (0, tui_1.runTui)(commandArgs, io);
|
|
27
|
+
if (command === "web")
|
|
28
|
+
return (0, web_1.runWeb)(commandArgs, io);
|
|
29
|
+
(0, write_1.write)(io.stderr || process.stderr, `Unknown command: ${command}\nRun "bluenote --help" for usage.\n`);
|
|
30
|
+
return 1;
|
|
31
|
+
}
|
|
32
|
+
async function main(args = process.argv.slice(2), io) {
|
|
33
|
+
const exitCode = await run(args, io);
|
|
34
|
+
process.exitCode = exitCode;
|
|
35
|
+
return exitCode;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;AAWA,kBAeC;AAED,oBAIC;AA/BD,8CAA6C;AAC7C,8CAA6C;AAC7C,0CAAyC;AACzC,wCAAuC;AACvC,gDAA+C;AAC/C,wCAAuC;AACvC,yCAAqC;AAExB,QAAA,QAAQ,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAA;AAEvE,KAAK,UAAU,GAAG,CAAC,OAAiB,EAAE,EAAE,KAAgB,EAAE;IAC/D,MAAM,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,GAAG,IAAI,CAAA;IAEtC,IAAI,CAAC,OAAO,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QAC/E,OAAO,IAAA,cAAO,EAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IACjC,CAAC;IAED,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,WAAW;QAAE,OAAO,IAAA,oBAAU,EAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IACxF,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAA,kBAAS,EAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IAC3D,IAAI,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAA,kBAAS,EAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IAC3D,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,IAAA,YAAM,EAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IACrD,IAAI,OAAO,KAAK,KAAK;QAAE,OAAO,IAAA,YAAM,EAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IAErD,IAAA,aAAK,EAAC,EAAE,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,oBAAoB,OAAO,sCAAsC,CAAC,CAAA;IACrG,OAAO,CAAC,CAAA;AACV,CAAC;AAEM,KAAK,UAAU,IAAI,CAAC,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAc;IAC/E,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACpC,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC3B,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runDaemon = runDaemon;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const paths_1 = require("../daemon/paths");
|
|
10
|
+
const token_1 = require("../daemon/token");
|
|
11
|
+
const server_1 = require("../daemon/server");
|
|
12
|
+
const package_info_1 = require("../utils/package-info");
|
|
13
|
+
const daemon_state_1 = require("../utils/daemon-state");
|
|
14
|
+
const write_1 = require("../utils/write");
|
|
15
|
+
const HELP_TEXT = `BlueNote daemon
|
|
16
|
+
|
|
17
|
+
Usage: bluenote daemon <start|status|stop>
|
|
18
|
+
|
|
19
|
+
Commands:
|
|
20
|
+
start Start the local BlueNote daemon
|
|
21
|
+
status Show daemon status and health
|
|
22
|
+
stop Stop the local BlueNote daemon
|
|
23
|
+
`;
|
|
24
|
+
function binPath() {
|
|
25
|
+
return path_1.default.resolve(__dirname, "..", "bin.js");
|
|
26
|
+
}
|
|
27
|
+
function parseServeArgs(args, env = process.env) {
|
|
28
|
+
const parsed = { token: env.BLUENOTE_DAEMON_SERVE_TOKEN };
|
|
29
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
30
|
+
const value = args[index];
|
|
31
|
+
if (value === "--state" && args[index + 1])
|
|
32
|
+
parsed.statePath = args[++index];
|
|
33
|
+
else if (value === "--version" && args[index + 1])
|
|
34
|
+
parsed.version = args[++index];
|
|
35
|
+
}
|
|
36
|
+
return parsed;
|
|
37
|
+
}
|
|
38
|
+
async function waitForRunning(env, deadlineMs) {
|
|
39
|
+
const deadline = Date.now() + deadlineMs;
|
|
40
|
+
let latest = await (0, daemon_state_1.readDaemonStatus)(env);
|
|
41
|
+
while (Date.now() < deadline) {
|
|
42
|
+
latest = await (0, daemon_state_1.readDaemonStatus)(env);
|
|
43
|
+
if (latest.state === "running")
|
|
44
|
+
return latest;
|
|
45
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
46
|
+
}
|
|
47
|
+
return latest;
|
|
48
|
+
}
|
|
49
|
+
async function startDaemon(io) {
|
|
50
|
+
const stdout = io.stdout || process.stdout;
|
|
51
|
+
const stderr = io.stderr || process.stderr;
|
|
52
|
+
const env = io.env || process.env;
|
|
53
|
+
const existing = await (0, daemon_state_1.readDaemonStatus)(env);
|
|
54
|
+
if (existing.state === "running" && existing.metadata) {
|
|
55
|
+
(0, write_1.write)(stdout, `BlueNote daemon already running\nstatus: running\nendpoint: ${existing.metadata.url}\npid: ${existing.metadata.pid}\n`);
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
if (existing.state === "stale")
|
|
59
|
+
(0, daemon_state_1.removeDaemonMetadata)(env);
|
|
60
|
+
const statePath = (0, paths_1.getDaemonStatePath)(env);
|
|
61
|
+
const token = (0, token_1.createDaemonToken)();
|
|
62
|
+
const version = (0, package_info_1.readOwnPackageInfo)().version;
|
|
63
|
+
const spawn = io.spawn || child_process_1.spawn;
|
|
64
|
+
let child;
|
|
65
|
+
try {
|
|
66
|
+
child = spawn(process.execPath, [binPath(), "daemon", "serve", "--state", statePath, "--version", version], {
|
|
67
|
+
detached: true,
|
|
68
|
+
stdio: "ignore",
|
|
69
|
+
env: { ...env, BLUENOTE_DAEMON_SERVE_TOKEN: token },
|
|
70
|
+
});
|
|
71
|
+
child.unref();
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
75
|
+
(0, write_1.write)(stderr, `Unable to start BlueNote daemon: ${message}\n`);
|
|
76
|
+
return 1;
|
|
77
|
+
}
|
|
78
|
+
const status = await waitForRunning(env, 5000);
|
|
79
|
+
if (status.state !== "running" || !status.metadata) {
|
|
80
|
+
if (child?.pid) {
|
|
81
|
+
try {
|
|
82
|
+
process.kill(child.pid, "SIGTERM");
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// best effort cleanup for failed starts
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
(0, write_1.write)(stderr, "Unable to start BlueNote daemon: health check did not become ready.\n");
|
|
89
|
+
return 1;
|
|
90
|
+
}
|
|
91
|
+
(0, write_1.write)(stdout, `BlueNote daemon started\nstatus: running\nendpoint: ${status.metadata.url}\npid: ${status.metadata.pid}\n`);
|
|
92
|
+
return 0;
|
|
93
|
+
}
|
|
94
|
+
async function statusDaemon(io) {
|
|
95
|
+
const stdout = io.stdout || process.stdout;
|
|
96
|
+
const status = await (0, daemon_state_1.readDaemonStatus)(io.env || process.env);
|
|
97
|
+
(0, write_1.write)(stdout, `status: ${status.state}\n`);
|
|
98
|
+
(0, write_1.write)(stdout, `endpoint: ${status.metadata ? status.metadata.url : "unavailable"}\n`);
|
|
99
|
+
(0, write_1.write)(stdout, `pid: ${status.metadata?.pid || "unavailable"}\n`);
|
|
100
|
+
(0, write_1.write)(stdout, `token: ${status.metadata?.token ? "present" : "missing"}\n`);
|
|
101
|
+
(0, write_1.write)(stdout, `health: ${status.healthOk ? "ok" : status.state === "stopped" ? "not checked" : "failed"}\n`);
|
|
102
|
+
return 0;
|
|
103
|
+
}
|
|
104
|
+
async function stopDaemon(io) {
|
|
105
|
+
const stdout = io.stdout || process.stdout;
|
|
106
|
+
const env = io.env || process.env;
|
|
107
|
+
const status = await (0, daemon_state_1.readDaemonStatus)(env);
|
|
108
|
+
if (!status.metadata) {
|
|
109
|
+
(0, write_1.write)(stdout, "BlueNote daemon is not running.\nstatus: stopped\n");
|
|
110
|
+
return 0;
|
|
111
|
+
}
|
|
112
|
+
if (status.state === "running") {
|
|
113
|
+
try {
|
|
114
|
+
await (0, daemon_state_1.requestJson)(`${status.metadata.url}/shutdown`, { method: "POST", token: status.metadata.token, timeoutMs: 1500 });
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
try {
|
|
118
|
+
process.kill(status.metadata.pid, "SIGTERM");
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// best effort
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
try {
|
|
127
|
+
process.kill(status.metadata.pid, "SIGTERM");
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// best effort
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
(0, daemon_state_1.removeDaemonMetadata)(env);
|
|
134
|
+
(0, write_1.write)(stdout, "BlueNote daemon stopped\nstatus: stopped\n");
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
async function runDaemon(args = [], io = {}) {
|
|
138
|
+
const stdout = io.stdout || process.stdout;
|
|
139
|
+
const stderr = io.stderr || process.stderr;
|
|
140
|
+
const command = args[0];
|
|
141
|
+
if (!command || command === "--help" || command === "-h" || command === "help") {
|
|
142
|
+
(0, write_1.write)(stdout, HELP_TEXT);
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
if (command === "serve") {
|
|
146
|
+
const parsed = parseServeArgs(args.slice(1), io.env || process.env);
|
|
147
|
+
if (!parsed.statePath || !parsed.token || !parsed.version) {
|
|
148
|
+
(0, write_1.write)(stderr, "Missing daemon serve arguments.\n");
|
|
149
|
+
return 1;
|
|
150
|
+
}
|
|
151
|
+
await (0, server_1.startDaemonServer)({ statePath: parsed.statePath, token: parsed.token, version: parsed.version });
|
|
152
|
+
return 0;
|
|
153
|
+
}
|
|
154
|
+
if (command === "start")
|
|
155
|
+
return await startDaemon(io);
|
|
156
|
+
if (command === "status")
|
|
157
|
+
return await statusDaemon(io);
|
|
158
|
+
if (command === "stop")
|
|
159
|
+
return await stopDaemon(io);
|
|
160
|
+
(0, write_1.write)(stderr, `Unknown daemon command: ${command}\nRun "bluenote daemon --help" for usage.\n`);
|
|
161
|
+
return 1;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/commands/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.runDoctor = runDoctor;
|
|
7
|
+
const child_process_1 = require("child_process");
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const paths_1 = require("../daemon/paths");
|
|
10
|
+
const command_discovery_1 = require("../utils/command-discovery");
|
|
11
|
+
const daemon_state_1 = require("../utils/daemon-state");
|
|
12
|
+
const package_info_1 = require("../utils/package-info");
|
|
13
|
+
const runtime_requirements_1 = require("../utils/runtime-requirements");
|
|
14
|
+
const write_1 = require("../utils/write");
|
|
15
|
+
const OPTIONAL_CLIENTS = ["bluenote-webui", "bluenote-term"];
|
|
16
|
+
function isWindowsShellCommand(commandPath, platform) {
|
|
17
|
+
return platform === "win32" && /\.(cmd|bat)$/i.test(commandPath);
|
|
18
|
+
}
|
|
19
|
+
function runClientCheck(commandPath, args, io, platform, env) {
|
|
20
|
+
const spawnSync = io.spawnSync || child_process_1.spawnSync;
|
|
21
|
+
const result = spawnSync(commandPath, args, {
|
|
22
|
+
encoding: "utf8",
|
|
23
|
+
env,
|
|
24
|
+
shell: isWindowsShellCommand(commandPath, platform),
|
|
25
|
+
timeout: 5000,
|
|
26
|
+
});
|
|
27
|
+
return {
|
|
28
|
+
ok: !result.error && result.status === 0,
|
|
29
|
+
stdout: String(result.stdout || ""),
|
|
30
|
+
stderr: String(result.stderr || ""),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function firstLine(value) {
|
|
34
|
+
return value.split(/\r?\n/).map((line) => line.trim()).find(Boolean);
|
|
35
|
+
}
|
|
36
|
+
function checkBun(io) {
|
|
37
|
+
const spawnSync = io.spawnSync || child_process_1.spawnSync;
|
|
38
|
+
const result = spawnSync("bun", ["--version"], { encoding: "utf8", env: io.env || process.env });
|
|
39
|
+
if (result.error || result.status !== 0)
|
|
40
|
+
return { available: false };
|
|
41
|
+
return { available: true, version: String(result.stdout || "").trim() };
|
|
42
|
+
}
|
|
43
|
+
async function runDoctor(args = [], io = {}) {
|
|
44
|
+
const stdout = io.stdout || process.stdout;
|
|
45
|
+
const stderr = io.stderr || process.stderr;
|
|
46
|
+
const env = io.env || process.env;
|
|
47
|
+
const parsedClientMode = (0, command_discovery_1.parseClientModeArgs)(args, env);
|
|
48
|
+
if (!parsedClientMode.ok) {
|
|
49
|
+
(0, write_1.write)(stderr, parsedClientMode.message);
|
|
50
|
+
return 1;
|
|
51
|
+
}
|
|
52
|
+
const nodeVersion = io.nodeVersion || process.versions.node;
|
|
53
|
+
const platform = io.platform || process.platform;
|
|
54
|
+
const supportedNode = (0, runtime_requirements_1.isSupportedNodeVersion)(nodeVersion);
|
|
55
|
+
const ownPackage = (0, package_info_1.readOwnPackageInfo)();
|
|
56
|
+
(0, write_1.write)(stdout, "BlueNote doctor\n\n");
|
|
57
|
+
(0, write_1.write)(stdout, "Distribution\n");
|
|
58
|
+
(0, write_1.write)(stdout, " command: ok\n");
|
|
59
|
+
(0, write_1.write)(stdout, ` version: ${ownPackage.version}\n`);
|
|
60
|
+
(0, write_1.write)(stdout, ` platform: ${platform} (${os_1.default.arch()})\n`);
|
|
61
|
+
(0, write_1.write)(stdout, ` node: ${supportedNode ? "ok" : "unsupported"} (${nodeVersion}; requires ${(0, runtime_requirements_1.nodeRequirementText)()})\n`);
|
|
62
|
+
(0, write_1.write)(stdout, `Node status: ${supportedNode ? "ok" : "unsupported"}\n`);
|
|
63
|
+
const daemon = await (0, daemon_state_1.readDaemonStatus)(env);
|
|
64
|
+
(0, write_1.write)(stdout, "\nDaemon\n");
|
|
65
|
+
(0, write_1.write)(stdout, ` status: ${daemon.state}\n`);
|
|
66
|
+
(0, write_1.write)(stdout, ` endpoint: ${daemon.metadata ? daemon.metadata.url : "unavailable"}\n`);
|
|
67
|
+
(0, write_1.write)(stdout, ` pid: ${daemon.metadata?.pid || "unavailable"}\n`);
|
|
68
|
+
(0, write_1.write)(stdout, ` token: ${daemon.metadata?.token ? "present" : "missing"}\n`);
|
|
69
|
+
(0, write_1.write)(stdout, ` health: ${daemon.healthOk ? "ok" : daemon.state === "stopped" ? "not checked" : "failed"}\n`);
|
|
70
|
+
(0, write_1.write)(stdout, "\nClients\n");
|
|
71
|
+
let builtTuiAvailable = false;
|
|
72
|
+
for (const client of OPTIONAL_CLIENTS) {
|
|
73
|
+
const resolution = (0, command_discovery_1.resolveClientCommand)(client, { env, clientMode: parsedClientMode.mode, platform, pathext: env.PATHEXT });
|
|
74
|
+
if (!resolution) {
|
|
75
|
+
(0, write_1.write)(stdout, ` ${client}: missing\n`);
|
|
76
|
+
(0, write_1.write)(stdout, " version: unavailable\n");
|
|
77
|
+
(0, write_1.write)(stdout, " daemon handshake: not checked\n");
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const clientEnv = { ...env };
|
|
81
|
+
if (daemon.state === "running" && daemon.metadata) {
|
|
82
|
+
clientEnv.BLUENOTE_DAEMON_URL = daemon.metadata.url;
|
|
83
|
+
clientEnv.BLUENOTE_DAEMON_TOKEN = daemon.metadata.token;
|
|
84
|
+
}
|
|
85
|
+
const version = runClientCheck(resolution.path, ["--version"], io, platform, clientEnv);
|
|
86
|
+
const handshake = daemon.state === "running" && daemon.metadata
|
|
87
|
+
? runClientCheck(resolution.path, ["--check-daemon"], io, platform, clientEnv)
|
|
88
|
+
: undefined;
|
|
89
|
+
const status = version.ok ? resolution.mode : "broken";
|
|
90
|
+
if (client === "bluenote-term" && resolution.mode === "built" && status === "built")
|
|
91
|
+
builtTuiAvailable = true;
|
|
92
|
+
(0, write_1.write)(stdout, ` ${client}: ${status}\n`);
|
|
93
|
+
(0, write_1.write)(stdout, ` path: ${resolution.path}\n`);
|
|
94
|
+
(0, write_1.write)(stdout, ` version: ${version.ok ? firstLine(version.stdout) || "available" : "unavailable"}\n`);
|
|
95
|
+
(0, write_1.write)(stdout, ` daemon handshake: ${handshake ? handshake.ok ? "ok" : "failed" : "not checked"}\n`);
|
|
96
|
+
}
|
|
97
|
+
if (builtTuiAvailable) {
|
|
98
|
+
(0, write_1.write)(stdout, " Bun for source TUI: not required for built TUI\n");
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const bun = checkBun(io);
|
|
102
|
+
(0, write_1.write)(stdout, ` Bun for source TUI: ${bun.available ? `available${bun.version ? ` (${bun.version})` : ""}` : "not found; install Bun for source/development TUI usage"}\n`);
|
|
103
|
+
}
|
|
104
|
+
(0, write_1.write)(stdout, "\nConfig\n");
|
|
105
|
+
(0, write_1.write)(stdout, ` config dir: ${(0, paths_1.getBluenoteStateDir)(env)}\n`);
|
|
106
|
+
(0, write_1.write)(stdout, ` daemon state: ${(0, paths_1.getDaemonStatePath)(env)}\n`);
|
|
107
|
+
(0, write_1.write)(stdout, ` daemon endpoint: ${daemon.metadata ? daemon.metadata.url : "unavailable"}\n`);
|
|
108
|
+
(0, write_1.write)(stdout, "\nAI\n");
|
|
109
|
+
(0, write_1.write)(stdout, " provider: not configured\n");
|
|
110
|
+
(0, write_1.write)(stdout, " secrets: not printed\n");
|
|
111
|
+
return supportedNode ? 0 : 1;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { CommandIo } from "../types";
|
|
2
|
+
export declare const HELP_TEXT = "BlueNote distribution CLI\n\nUsage: bluenote <command> [options]\n bn <command> [options]\n\nCommands:\n tui [...args] Launch the terminal interface via bluenote-term\n web [...args] Launch the local WebUI via bluenote-webui\n daemon start|status|stop Manage the local BlueNote daemon\n doctor Check runtime, daemon, and optional clients\n version Print package versions\n\nOptions:\n -h, --help Show this help message\n";
|
|
3
|
+
export declare function runHelp(_args?: string[], io?: CommandIo): number;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HELP_TEXT = void 0;
|
|
4
|
+
exports.runHelp = runHelp;
|
|
5
|
+
const write_1 = require("../utils/write");
|
|
6
|
+
exports.HELP_TEXT = `BlueNote distribution CLI
|
|
7
|
+
|
|
8
|
+
Usage: bluenote <command> [options]
|
|
9
|
+
bn <command> [options]
|
|
10
|
+
|
|
11
|
+
Commands:
|
|
12
|
+
tui [...args] Launch the terminal interface via bluenote-term
|
|
13
|
+
web [...args] Launch the local WebUI via bluenote-webui
|
|
14
|
+
daemon start|status|stop Manage the local BlueNote daemon
|
|
15
|
+
doctor Check runtime, daemon, and optional clients
|
|
16
|
+
version Print package versions
|
|
17
|
+
|
|
18
|
+
Options:
|
|
19
|
+
-h, --help Show this help message
|
|
20
|
+
`;
|
|
21
|
+
function runHelp(_args = [], io = {}) {
|
|
22
|
+
(0, write_1.write)(io.stdout || process.stdout, exports.HELP_TEXT);
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":";;;AAmBA,0BAGC;AAtBD,0CAAsC;AAGzB,QAAA,SAAS,GAAG;;;;;;;;;;;;;;CAcxB,CAAA;AAED,SAAgB,OAAO,CAAC,QAAkB,EAAE,EAAE,KAAgB,EAAE;IAC9D,IAAA,aAAK,EAAC,EAAE,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,iBAAS,CAAC,CAAA;IAC7C,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runTui = runTui;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const command_discovery_1 = require("../utils/command-discovery");
|
|
6
|
+
const daemon_state_1 = require("../utils/daemon-state");
|
|
7
|
+
const write_1 = require("../utils/write");
|
|
8
|
+
function daemonNotRunning(io) {
|
|
9
|
+
(0, write_1.write)(io.stderr || process.stderr, "BlueNote daemon is not running.\nRun: bluenote daemon start\n");
|
|
10
|
+
return 1;
|
|
11
|
+
}
|
|
12
|
+
function missingClient(io, command, mode) {
|
|
13
|
+
if (mode === "built") {
|
|
14
|
+
(0, write_1.write)(io.stderr || process.stderr, `Built client ${command} was not found in BLUENOTE_BUILT_CLIENT_DIR. Install the BlueNote built client artifact, set BLUENOTE_BUILT_CLIENT_DIR to its directory, or retry with --client-mode path for PATH discovery.\n`);
|
|
15
|
+
return 1;
|
|
16
|
+
}
|
|
17
|
+
(0, write_1.write)(io.stderr || process.stderr, `Optional client ${command} was not found on PATH. Install it with npm install -g ${command} and retry.\n`);
|
|
18
|
+
return 1;
|
|
19
|
+
}
|
|
20
|
+
async function runTui(args = [], io = {}) {
|
|
21
|
+
const env = io.env || process.env;
|
|
22
|
+
const daemon = await (0, daemon_state_1.readDaemonStatus)(env);
|
|
23
|
+
if (daemon.state !== "running" || !daemon.metadata)
|
|
24
|
+
return daemonNotRunning(io);
|
|
25
|
+
const metadata = daemon.metadata;
|
|
26
|
+
const parsed = (0, command_discovery_1.parseClientModeArgs)(args, env);
|
|
27
|
+
if (!parsed.ok) {
|
|
28
|
+
(0, write_1.write)(io.stderr || process.stderr, parsed.message);
|
|
29
|
+
return 1;
|
|
30
|
+
}
|
|
31
|
+
const resolution = (0, command_discovery_1.resolveClientCommand)("bluenote-term", { env, clientMode: parsed.mode, platform: io.platform || process.platform, pathext: env.PATHEXT });
|
|
32
|
+
if (!resolution)
|
|
33
|
+
return missingClient(io, "bluenote-term", parsed.mode);
|
|
34
|
+
const spawn = io.spawn || child_process_1.spawn;
|
|
35
|
+
return await new Promise((resolve) => {
|
|
36
|
+
let child;
|
|
37
|
+
try {
|
|
38
|
+
child = spawn(resolution.path, parsed.args, {
|
|
39
|
+
stdio: ["inherit", "inherit", "inherit"],
|
|
40
|
+
shell: (io.platform || process.platform) === "win32" && /\.(cmd|bat)$/i.test(resolution.path),
|
|
41
|
+
env: {
|
|
42
|
+
...env,
|
|
43
|
+
BLUENOTE_DAEMON_URL: metadata.url,
|
|
44
|
+
BLUENOTE_DAEMON_TOKEN: metadata.token,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
50
|
+
(0, write_1.write)(io.stderr || process.stderr, `Unable to launch bluenote-term: ${message}\n`);
|
|
51
|
+
resolve(1);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
child.on("error", (error) => {
|
|
55
|
+
(0, write_1.write)(io.stderr || process.stderr, `Unable to launch bluenote-term: ${error.message}\n`);
|
|
56
|
+
resolve(1);
|
|
57
|
+
});
|
|
58
|
+
child.on("exit", (code) => {
|
|
59
|
+
resolve(code === null ? 1 : code);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=tui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/commands/tui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runVersion = runVersion;
|
|
4
|
+
const package_info_1 = require("../utils/package-info");
|
|
5
|
+
const write_1 = require("../utils/write");
|
|
6
|
+
const RUNTIME_PACKAGES = ["@lordierclaw/bluenote-core"];
|
|
7
|
+
function runVersion(_args = [], io = {}) {
|
|
8
|
+
const own = (0, package_info_1.readOwnPackageInfo)();
|
|
9
|
+
const lines = [`${own.name} ${own.version}`];
|
|
10
|
+
for (const packageName of RUNTIME_PACKAGES) {
|
|
11
|
+
const resolution = (0, package_info_1.resolvePackageJson)(packageName);
|
|
12
|
+
lines.push(`${packageName} ${resolution.version || (resolution.resolved ? "version unavailable" : "not installed")}`);
|
|
13
|
+
}
|
|
14
|
+
(0, write_1.write)(io.stdout || process.stdout, `${lines.join("\n")}\n`);
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":";;AAMA,gCAWC;AAhBD,wDAA8E;AAC9E,0CAAsC;AAEtC,MAAM,gBAAgB,GAAG,CAAC,4BAA4B,CAAC,CAAA;AAEvD,SAAgB,UAAU,CAAC,QAAkB,EAAE,EAAE,KAAgB,EAAE;IACjE,MAAM,GAAG,GAAG,IAAA,iCAAkB,GAAE,CAAA;IAChC,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;IAE5C,KAAK,MAAM,WAAW,IAAI,gBAAgB,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,IAAA,iCAAkB,EAAC,WAAW,CAAC,CAAA;QAClD,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,CAAA;IACvH,CAAC;IAED,IAAA,aAAK,EAAC,EAAE,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3D,OAAO,CAAC,CAAA;AACV,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runWeb = runWeb;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const command_discovery_1 = require("../utils/command-discovery");
|
|
6
|
+
const daemon_state_1 = require("../utils/daemon-state");
|
|
7
|
+
const write_1 = require("../utils/write");
|
|
8
|
+
function daemonNotRunning(io) {
|
|
9
|
+
(0, write_1.write)(io.stderr || process.stderr, "BlueNote daemon is not running.\nRun: bluenote daemon start\n");
|
|
10
|
+
return 1;
|
|
11
|
+
}
|
|
12
|
+
function missingClient(io, command, mode) {
|
|
13
|
+
if (mode === "built") {
|
|
14
|
+
(0, write_1.write)(io.stderr || process.stderr, `Built client ${command} was not found in BLUENOTE_BUILT_CLIENT_DIR. Install the BlueNote built client artifact, set BLUENOTE_BUILT_CLIENT_DIR to its directory, or retry with --client-mode path for PATH discovery.\n`);
|
|
15
|
+
return 1;
|
|
16
|
+
}
|
|
17
|
+
(0, write_1.write)(io.stderr || process.stderr, `Optional client ${command} was not found on PATH. Install it with npm install -g ${command} and retry.\n`);
|
|
18
|
+
return 1;
|
|
19
|
+
}
|
|
20
|
+
async function runWeb(args = [], io = {}) {
|
|
21
|
+
const env = io.env || process.env;
|
|
22
|
+
const daemon = await (0, daemon_state_1.readDaemonStatus)(env);
|
|
23
|
+
if (daemon.state !== "running" || !daemon.metadata)
|
|
24
|
+
return daemonNotRunning(io);
|
|
25
|
+
const metadata = daemon.metadata;
|
|
26
|
+
const parsed = (0, command_discovery_1.parseClientModeArgs)(args, env);
|
|
27
|
+
if (!parsed.ok) {
|
|
28
|
+
(0, write_1.write)(io.stderr || process.stderr, parsed.message);
|
|
29
|
+
return 1;
|
|
30
|
+
}
|
|
31
|
+
const resolution = (0, command_discovery_1.resolveClientCommand)("bluenote-webui", { env, clientMode: parsed.mode, platform: io.platform || process.platform, pathext: env.PATHEXT });
|
|
32
|
+
if (!resolution)
|
|
33
|
+
return missingClient(io, "bluenote-webui", parsed.mode);
|
|
34
|
+
const spawn = io.spawn || child_process_1.spawn;
|
|
35
|
+
return await new Promise((resolve) => {
|
|
36
|
+
let child;
|
|
37
|
+
try {
|
|
38
|
+
child = spawn(resolution.path, parsed.args, {
|
|
39
|
+
stdio: ["inherit", "inherit", "inherit"],
|
|
40
|
+
shell: (io.platform || process.platform) === "win32" && /\.(cmd|bat)$/i.test(resolution.path),
|
|
41
|
+
env: {
|
|
42
|
+
...env,
|
|
43
|
+
BLUENOTE_DAEMON_URL: metadata.url,
|
|
44
|
+
BLUENOTE_DAEMON_TOKEN: metadata.token,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
50
|
+
(0, write_1.write)(io.stderr || process.stderr, `Unable to launch bluenote-webui: ${message}\n`);
|
|
51
|
+
resolve(1);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
child.on("error", (error) => {
|
|
55
|
+
(0, write_1.write)(io.stderr || process.stderr, `Unable to launch bluenote-webui: ${error.message}\n`);
|
|
56
|
+
resolve(1);
|
|
57
|
+
});
|
|
58
|
+
child.on("exit", (code) => {
|
|
59
|
+
resolve(code === null ? 1 : code);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/commands/web.ts"],"names":[],"mappings":"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"}
|