@made-by-moonlight/athene-cli 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/dist/assets/plugin-registry.json +67 -0
- package/dist/assets/scripts/athene-doctor.ps1 +352 -0
- package/dist/assets/scripts/athene-doctor.sh +552 -0
- package/dist/assets/scripts/athene-update.ps1 +224 -0
- package/dist/assets/scripts/athene-update.sh +252 -0
- package/dist/commands/completion.d.ts +3 -0
- package/dist/commands/completion.d.ts.map +1 -0
- package/dist/commands/completion.js +26 -0
- package/dist/commands/completion.js.map +1 -0
- package/dist/commands/config.d.ts +11 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +89 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +103 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +329 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/events.d.ts +3 -0
- package/dist/commands/events.d.ts.map +1 -0
- package/dist/commands/events.js +172 -0
- package/dist/commands/events.js.map +1 -0
- package/dist/commands/migrate-storage.d.ts +3 -0
- package/dist/commands/migrate-storage.d.ts.map +1 -0
- package/dist/commands/migrate-storage.js +78 -0
- package/dist/commands/migrate-storage.js.map +1 -0
- package/dist/commands/notify.d.ts +3 -0
- package/dist/commands/notify.d.ts.map +1 -0
- package/dist/commands/notify.js +143 -0
- package/dist/commands/notify.js.map +1 -0
- package/dist/commands/open.d.ts +3 -0
- package/dist/commands/open.d.ts.map +1 -0
- package/dist/commands/open.js +167 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/plugin.d.ts +3 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +462 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/project.d.ts +3 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +143 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/report.d.ts +19 -0
- package/dist/commands/report.d.ts.map +1 -0
- package/dist/commands/report.js +114 -0
- package/dist/commands/report.js.map +1 -0
- package/dist/commands/review-check.d.ts +3 -0
- package/dist/commands/review-check.d.ts.map +1 -0
- package/dist/commands/review-check.js +122 -0
- package/dist/commands/review-check.js.map +1 -0
- package/dist/commands/review.d.ts +3 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +215 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/send.d.ts +3 -0
- package/dist/commands/send.d.ts.map +1 -0
- package/dist/commands/send.js +187 -0
- package/dist/commands/send.js.map +1 -0
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +439 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +297 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/spawn.d.ts +4 -0
- package/dist/commands/spawn.d.ts.map +1 -0
- package/dist/commands/spawn.js +436 -0
- package/dist/commands/spawn.js.map +1 -0
- package/dist/commands/start.d.ts +21 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +1836 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +556 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +15 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +652 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +3 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +131 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/bun-tmp-janitor.d.ts +18 -0
- package/dist/lib/bun-tmp-janitor.d.ts.map +1 -0
- package/dist/lib/bun-tmp-janitor.js +127 -0
- package/dist/lib/bun-tmp-janitor.js.map +1 -0
- package/dist/lib/caller-context.d.ts +13 -0
- package/dist/lib/caller-context.d.ts.map +1 -0
- package/dist/lib/caller-context.js +20 -0
- package/dist/lib/caller-context.js.map +1 -0
- package/dist/lib/cli-errors.d.ts +8 -0
- package/dist/lib/cli-errors.d.ts.map +1 -0
- package/dist/lib/cli-errors.js +20 -0
- package/dist/lib/cli-errors.js.map +1 -0
- package/dist/lib/completion.d.ts +13 -0
- package/dist/lib/completion.d.ts.map +1 -0
- package/dist/lib/completion.js +428 -0
- package/dist/lib/completion.js.map +1 -0
- package/dist/lib/composio-setup.d.ts +65 -0
- package/dist/lib/composio-setup.d.ts.map +1 -0
- package/dist/lib/composio-setup.js +3255 -0
- package/dist/lib/composio-setup.js.map +1 -0
- package/dist/lib/config-instruction.d.ts +2 -0
- package/dist/lib/config-instruction.d.ts.map +1 -0
- package/dist/lib/config-instruction.js +193 -0
- package/dist/lib/config-instruction.js.map +1 -0
- package/dist/lib/constants.d.ts +3 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +3 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/create-session-manager.d.ts +26 -0
- package/dist/lib/create-session-manager.d.ts.map +1 -0
- package/dist/lib/create-session-manager.js +55 -0
- package/dist/lib/create-session-manager.js.map +1 -0
- package/dist/lib/credential-resolver.d.ts +37 -0
- package/dist/lib/credential-resolver.d.ts.map +1 -0
- package/dist/lib/credential-resolver.js +105 -0
- package/dist/lib/credential-resolver.js.map +1 -0
- package/dist/lib/daemon.d.ts +69 -0
- package/dist/lib/daemon.d.ts.map +1 -0
- package/dist/lib/daemon.js +77 -0
- package/dist/lib/daemon.js.map +1 -0
- package/dist/lib/dashboard-rebuild.d.ts +53 -0
- package/dist/lib/dashboard-rebuild.d.ts.map +1 -0
- package/dist/lib/dashboard-rebuild.js +188 -0
- package/dist/lib/dashboard-rebuild.js.map +1 -0
- package/dist/lib/dashboard-setup.d.ts +14 -0
- package/dist/lib/dashboard-setup.d.ts.map +1 -0
- package/dist/lib/dashboard-setup.js +192 -0
- package/dist/lib/dashboard-setup.js.map +1 -0
- package/dist/lib/dashboard-url.d.ts +19 -0
- package/dist/lib/dashboard-url.d.ts.map +1 -0
- package/dist/lib/dashboard-url.js +25 -0
- package/dist/lib/dashboard-url.js.map +1 -0
- package/dist/lib/desktop-setup.d.ts +21 -0
- package/dist/lib/desktop-setup.d.ts.map +1 -0
- package/dist/lib/desktop-setup.js +556 -0
- package/dist/lib/desktop-setup.js.map +1 -0
- package/dist/lib/detect-agent.d.ts +24 -0
- package/dist/lib/detect-agent.d.ts.map +1 -0
- package/dist/lib/detect-agent.js +69 -0
- package/dist/lib/detect-agent.js.map +1 -0
- package/dist/lib/detect-env.d.ts +14 -0
- package/dist/lib/detect-env.d.ts.map +1 -0
- package/dist/lib/detect-env.js +46 -0
- package/dist/lib/detect-env.js.map +1 -0
- package/dist/lib/discord-setup.d.ts +20 -0
- package/dist/lib/discord-setup.d.ts.map +1 -0
- package/dist/lib/discord-setup.js +584 -0
- package/dist/lib/discord-setup.js.map +1 -0
- package/dist/lib/format.d.ts +11 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +116 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/git-utils.d.ts +14 -0
- package/dist/lib/git-utils.d.ts.map +1 -0
- package/dist/lib/git-utils.js +45 -0
- package/dist/lib/git-utils.js.map +1 -0
- package/dist/lib/install-helpers.d.ts +24 -0
- package/dist/lib/install-helpers.d.ts.map +1 -0
- package/dist/lib/install-helpers.js +76 -0
- package/dist/lib/install-helpers.js.map +1 -0
- package/dist/lib/lifecycle-service.d.ts +11 -0
- package/dist/lib/lifecycle-service.d.ts.map +1 -0
- package/dist/lib/lifecycle-service.js +65 -0
- package/dist/lib/lifecycle-service.js.map +1 -0
- package/dist/lib/notifier-routing.d.ts +35 -0
- package/dist/lib/notifier-routing.d.ts.map +1 -0
- package/dist/lib/notifier-routing.js +133 -0
- package/dist/lib/notifier-routing.js.map +1 -0
- package/dist/lib/notify-test.d.ts +72 -0
- package/dist/lib/notify-test.d.ts.map +1 -0
- package/dist/lib/notify-test.js +674 -0
- package/dist/lib/notify-test.js.map +1 -0
- package/dist/lib/openclaw-probe.d.ts +38 -0
- package/dist/lib/openclaw-probe.d.ts.map +1 -0
- package/dist/lib/openclaw-probe.js +146 -0
- package/dist/lib/openclaw-probe.js.map +1 -0
- package/dist/lib/openclaw-setup.d.ts +19 -0
- package/dist/lib/openclaw-setup.d.ts.map +1 -0
- package/dist/lib/openclaw-setup.js +684 -0
- package/dist/lib/openclaw-setup.js.map +1 -0
- package/dist/lib/path-equality.d.ts +29 -0
- package/dist/lib/path-equality.d.ts.map +1 -0
- package/dist/lib/path-equality.js +52 -0
- package/dist/lib/path-equality.js.map +1 -0
- package/dist/lib/plugin-marketplace.d.ts +24 -0
- package/dist/lib/plugin-marketplace.d.ts.map +1 -0
- package/dist/lib/plugin-marketplace.js +175 -0
- package/dist/lib/plugin-marketplace.js.map +1 -0
- package/dist/lib/plugin-scaffold.d.ts +14 -0
- package/dist/lib/plugin-scaffold.d.ts.map +1 -0
- package/dist/lib/plugin-scaffold.js +174 -0
- package/dist/lib/plugin-scaffold.js.map +1 -0
- package/dist/lib/plugin-store.d.ts +9 -0
- package/dist/lib/plugin-store.d.ts.map +1 -0
- package/dist/lib/plugin-store.js +121 -0
- package/dist/lib/plugin-store.js.map +1 -0
- package/dist/lib/plugins.d.ts +17 -0
- package/dist/lib/plugins.d.ts.map +1 -0
- package/dist/lib/plugins.js +65 -0
- package/dist/lib/plugins.js.map +1 -0
- package/dist/lib/portfolio-display.d.ts +10 -0
- package/dist/lib/portfolio-display.d.ts.map +1 -0
- package/dist/lib/portfolio-display.js +17 -0
- package/dist/lib/portfolio-display.js.map +1 -0
- package/dist/lib/preflight.d.ts +27 -0
- package/dist/lib/preflight.d.ts.map +1 -0
- package/dist/lib/preflight.js +77 -0
- package/dist/lib/preflight.js.map +1 -0
- package/dist/lib/prevent-sleep.d.ts +34 -0
- package/dist/lib/prevent-sleep.d.ts.map +1 -0
- package/dist/lib/prevent-sleep.js +65 -0
- package/dist/lib/prevent-sleep.js.map +1 -0
- package/dist/lib/project-detection.d.ts +11 -0
- package/dist/lib/project-detection.d.ts.map +1 -0
- package/dist/lib/project-detection.js +206 -0
- package/dist/lib/project-detection.js.map +1 -0
- package/dist/lib/project-resolution.d.ts +10 -0
- package/dist/lib/project-resolution.d.ts.map +1 -0
- package/dist/lib/project-resolution.js +17 -0
- package/dist/lib/project-resolution.js.map +1 -0
- package/dist/lib/project-supervisor.d.ts +28 -0
- package/dist/lib/project-supervisor.d.ts.map +1 -0
- package/dist/lib/project-supervisor.js +167 -0
- package/dist/lib/project-supervisor.js.map +1 -0
- package/dist/lib/prompts.d.ts +7 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +37 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/repo-utils.d.ts +16 -0
- package/dist/lib/repo-utils.d.ts.map +1 -0
- package/dist/lib/repo-utils.js +26 -0
- package/dist/lib/repo-utils.js.map +1 -0
- package/dist/lib/resolve-project.d.ts +113 -0
- package/dist/lib/resolve-project.d.ts.map +1 -0
- package/dist/lib/resolve-project.js +433 -0
- package/dist/lib/resolve-project.js.map +1 -0
- package/dist/lib/routes.d.ts +2 -0
- package/dist/lib/routes.d.ts.map +1 -0
- package/dist/lib/routes.js +5 -0
- package/dist/lib/routes.js.map +1 -0
- package/dist/lib/running-state.d.ts +76 -0
- package/dist/lib/running-state.d.ts.map +1 -0
- package/dist/lib/running-state.js +338 -0
- package/dist/lib/running-state.js.map +1 -0
- package/dist/lib/script-runner.d.ts +10 -0
- package/dist/lib/script-runner.d.ts.map +1 -0
- package/dist/lib/script-runner.js +189 -0
- package/dist/lib/script-runner.js.map +1 -0
- package/dist/lib/session-utils.d.ts +14 -0
- package/dist/lib/session-utils.d.ts.map +1 -0
- package/dist/lib/session-utils.js +58 -0
- package/dist/lib/session-utils.js.map +1 -0
- package/dist/lib/shell.d.ts +17 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +90 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/shutdown.d.ts +30 -0
- package/dist/lib/shutdown.d.ts.map +1 -0
- package/dist/lib/shutdown.js +177 -0
- package/dist/lib/shutdown.js.map +1 -0
- package/dist/lib/slack-setup.d.ts +17 -0
- package/dist/lib/slack-setup.d.ts.map +1 -0
- package/dist/lib/slack-setup.js +485 -0
- package/dist/lib/slack-setup.js.map +1 -0
- package/dist/lib/startup-preflight.d.ts +36 -0
- package/dist/lib/startup-preflight.d.ts.map +1 -0
- package/dist/lib/startup-preflight.js +273 -0
- package/dist/lib/startup-preflight.js.map +1 -0
- package/dist/lib/update-channel-onboarding.d.ts +52 -0
- package/dist/lib/update-channel-onboarding.d.ts.map +1 -0
- package/dist/lib/update-channel-onboarding.js +107 -0
- package/dist/lib/update-channel-onboarding.js.map +1 -0
- package/dist/lib/update-check.d.ts +161 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +504 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/web-dir.d.ts +47 -0
- package/dist/lib/web-dir.d.ts.map +1 -0
- package/dist/lib/web-dir.js +179 -0
- package/dist/lib/web-dir.js.map +1 -0
- package/dist/lib/webhook-setup.d.ts +16 -0
- package/dist/lib/webhook-setup.d.ts.map +1 -0
- package/dist/lib/webhook-setup.js +383 -0
- package/dist/lib/webhook-setup.js.map +1 -0
- package/dist/options/version.d.ts +2 -0
- package/dist/options/version.d.ts.map +1 -0
- package/dist/options/version.js +7 -0
- package/dist/options/version.js.map +1 -0
- package/dist/program.d.ts +3 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +63 -0
- package/dist/program.js.map +1 -0
- package/package.json +80 -0
- package/templates/rules/base.md +4 -0
- package/templates/rules/go.md +8 -0
- package/templates/rules/javascript.md +4 -0
- package/templates/rules/nextjs.md +7 -0
- package/templates/rules/pnpm-workspaces.md +4 -0
- package/templates/rules/python.md +8 -0
- package/templates/rules/react.md +8 -0
- package/templates/rules/typescript.md +6 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { isWindows, loadConfig } from "@made-by-moonlight/athene-core";
|
|
5
|
+
import { findWebDir, buildDashboardEnv, waitForPortAndOpen } from "../lib/web-dir.js";
|
|
6
|
+
import { forwardSignalsToChild } from "../lib/shell.js";
|
|
7
|
+
import { clearStaleCacheIfNeeded, isInstalledUnderNodeModules, rebuildDashboardProductionArtifacts, } from "../lib/dashboard-rebuild.js";
|
|
8
|
+
import { preflight } from "../lib/preflight.js";
|
|
9
|
+
import { DEFAULT_PORT } from "../lib/constants.js";
|
|
10
|
+
import { dashboardUrl } from "../lib/dashboard-url.js";
|
|
11
|
+
export function registerDashboard(program) {
|
|
12
|
+
program
|
|
13
|
+
.command("dashboard")
|
|
14
|
+
.description("Start the web dashboard")
|
|
15
|
+
.option("-p, --port <port>", "Port to listen on")
|
|
16
|
+
.option("--no-open", "Don't open browser automatically")
|
|
17
|
+
.option("--rebuild", "Clean stale build artifacts and rebuild before starting")
|
|
18
|
+
/* c8 ignore start -- process-spawning startup code, tested via integration/onboarding */
|
|
19
|
+
.action(async (opts) => {
|
|
20
|
+
const config = loadConfig();
|
|
21
|
+
const port = opts.port ? parseInt(opts.port, 10) : (config.port ?? DEFAULT_PORT);
|
|
22
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
23
|
+
console.error(chalk.red("Invalid port number. Must be 1-65535."));
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
const localWebDir = findWebDir(); // throws with install-specific guidance if not found
|
|
27
|
+
if (opts.rebuild) {
|
|
28
|
+
await rebuildDashboardProductionArtifacts(localWebDir, [port]);
|
|
29
|
+
// Fall through to start the dashboard on this port.
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
await preflight.checkBuilt(localWebDir);
|
|
33
|
+
await clearStaleCacheIfNeeded(localWebDir);
|
|
34
|
+
}
|
|
35
|
+
const webDir = localWebDir;
|
|
36
|
+
console.log(chalk.bold(`Starting dashboard on ${dashboardUrl(port)}\n`));
|
|
37
|
+
const env = await buildDashboardEnv(port, config.configPath, config.terminalPort, config.directTerminalPort);
|
|
38
|
+
const startScript = resolve(webDir, "dist-server", "start-all.js");
|
|
39
|
+
const child = spawn("node", [startScript], {
|
|
40
|
+
cwd: webDir,
|
|
41
|
+
stdio: ["inherit", "inherit", "pipe"],
|
|
42
|
+
detached: !isWindows(),
|
|
43
|
+
env,
|
|
44
|
+
});
|
|
45
|
+
const stderrChunks = [];
|
|
46
|
+
const MAX_STDERR_CHUNKS = 100;
|
|
47
|
+
child.stderr?.on("data", (data) => {
|
|
48
|
+
const text = data.toString();
|
|
49
|
+
if (stderrChunks.length < MAX_STDERR_CHUNKS) {
|
|
50
|
+
stderrChunks.push(text);
|
|
51
|
+
}
|
|
52
|
+
// Still show stderr to the user
|
|
53
|
+
process.stderr.write(data);
|
|
54
|
+
});
|
|
55
|
+
child.on("error", (err) => {
|
|
56
|
+
console.error(chalk.red("Could not start dashboard. Ensure Next.js is installed."));
|
|
57
|
+
console.error(chalk.dim(String(err)));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
});
|
|
60
|
+
// On Unix the child is spawned with detached:true (own process group) so
|
|
61
|
+
// Ctrl+C only reaches the parent's process group, not the dashboard's.
|
|
62
|
+
// Forward SIGINT/SIGTERM so the child group is cleaned up on exit.
|
|
63
|
+
const pid = child.pid;
|
|
64
|
+
if (!isWindows() && pid) {
|
|
65
|
+
forwardSignalsToChild(pid, child);
|
|
66
|
+
}
|
|
67
|
+
let openAbort;
|
|
68
|
+
if (opts.open !== false) {
|
|
69
|
+
openAbort = new AbortController();
|
|
70
|
+
void waitForPortAndOpen(port, dashboardUrl(port), openAbort.signal);
|
|
71
|
+
}
|
|
72
|
+
child.on("exit", (code) => {
|
|
73
|
+
if (openAbort)
|
|
74
|
+
openAbort.abort();
|
|
75
|
+
if (code !== 0 && code !== null && !opts.rebuild) {
|
|
76
|
+
const stderr = stderrChunks.join("");
|
|
77
|
+
if (looksLikeStaleBuild(stderr)) {
|
|
78
|
+
const recoveryCommand = isInstalledUnderNodeModules(webDir)
|
|
79
|
+
? "npm install -g @made-by-moonlight/athene@latest"
|
|
80
|
+
: "athene dashboard --rebuild";
|
|
81
|
+
console.error(chalk.yellow("\nThis looks like a stale build cache issue. Try:\n\n" +
|
|
82
|
+
` ${chalk.cyan(recoveryCommand)}\n`));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
process.exit(code ?? 0);
|
|
86
|
+
});
|
|
87
|
+
/* c8 ignore stop */
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Check if stderr output suggests stale build artifacts.
|
|
92
|
+
*/
|
|
93
|
+
function looksLikeStaleBuild(stderr) {
|
|
94
|
+
const patterns = [
|
|
95
|
+
/Cannot find module.*vendor-chunks/,
|
|
96
|
+
/Cannot find module.*\.next/,
|
|
97
|
+
/Module not found.*\.next/,
|
|
98
|
+
/ENOENT.*\.next/,
|
|
99
|
+
/Could not find a production build/,
|
|
100
|
+
];
|
|
101
|
+
return patterns.some((p) => p.test(stderr));
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACL,uBAAuB,EACvB,2BAA2B,EAC3B,mCAAmC,GACpC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SAChD,MAAM,CAAC,WAAW,EAAE,kCAAkC,CAAC;SACvD,MAAM,CAAC,WAAW,EAAE,yDAAyD,CAAC;QAC/E,yFAAyF;SACxF,MAAM,CAAC,KAAK,EAAE,IAA0D,EAAE,EAAE;QAC3E,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;QAEjF,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,EAAE,CAAC,CAAC,qDAAqD;QAEvF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,mCAAmC,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAC/D,oDAAoD;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YACxC,MAAM,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC;QAE3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAEzE,MAAM,GAAG,GAAG,MAAM,iBAAiB,CACjC,IAAI,EACJ,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,kBAAkB,CAC1B,CAAC;QAEF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE;YACzC,GAAG,EAAE,MAAM;YACX,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC;YACrC,QAAQ,EAAE,CAAC,SAAS,EAAE;YACtB,GAAG;SACJ,CAAC,CAAC;QAEH,MAAM,YAAY,GAAa,EAAE,CAAC;QAElC,MAAM,iBAAiB,GAAG,GAAG,CAAC;QAE9B,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,IAAI,YAAY,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;gBAC5C,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YACD,gCAAgC;YAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC,CAAC;YACpF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,yEAAyE;QACzE,uEAAuE;QACvE,mEAAmE;QACnE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACtB,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,EAAE,CAAC;YACxB,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,SAAsC,CAAC;QAE3C,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACxB,SAAS,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,KAAK,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QACtE,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,SAAS;gBAAE,SAAS,CAAC,KAAK,EAAE,CAAC;YAEjC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrC,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChC,MAAM,eAAe,GAAG,2BAA2B,CAAC,MAAM,CAAC;wBACzD,CAAC,CAAC,iDAAiD;wBACnD,CAAC,CAAC,4BAA4B,CAAC;oBACjC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,MAAM,CACV,uDAAuD;wBACrD,KAAK,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CACvC,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,oBAAoB;IACtB,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,MAAc;IACzC,MAAM,QAAQ,GAAG;QACf,mCAAmC;QACnC,4BAA4B;QAC5B,0BAA0B;QAC1B,gBAAgB;QAChB,mCAAmC;KACpC,CAAC;IACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmZzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0DrD"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { createPluginRegistry, findConfigFile, getObservabilityBaseDir, loadConfig, resolveNotifierTarget, } from "@made-by-moonlight/athene-core";
|
|
5
|
+
import { runNotifyTest } from "../lib/notify-test.js";
|
|
6
|
+
import { runRepoScript } from "../lib/script-runner.js";
|
|
7
|
+
import { detectOpenClawInstallation, validateToken } from "../lib/openclaw-probe.js";
|
|
8
|
+
import { importPluginModuleFromSource } from "../lib/plugin-store.js";
|
|
9
|
+
import { detectInstallMethod, getCurrentVersion, getUpdateCommand, isVersionOutdated, readCachedUpdateInfo, } from "../lib/update-check.js";
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Helpers — match the PASS / WARN / FAIL style of athene-doctor.sh
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
function pass(msg) {
|
|
14
|
+
console.log(`${chalk.green("PASS")} ${msg}`);
|
|
15
|
+
}
|
|
16
|
+
function warn(msg) {
|
|
17
|
+
console.log(`${chalk.yellow("WARN")} ${msg}`);
|
|
18
|
+
}
|
|
19
|
+
/** Returns a fail() recorder and a count() getter — local per invocation, no shared state. */
|
|
20
|
+
function makeFailCounter() {
|
|
21
|
+
let n = 0;
|
|
22
|
+
return {
|
|
23
|
+
fail(msg) {
|
|
24
|
+
n++;
|
|
25
|
+
console.log(`${chalk.red("FAIL")} ${msg}`);
|
|
26
|
+
},
|
|
27
|
+
count() {
|
|
28
|
+
return n;
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
async function loadPluginRegistry(config) {
|
|
33
|
+
const registry = createPluginRegistry();
|
|
34
|
+
await registry.loadFromConfig(config, importPluginModuleFromSource);
|
|
35
|
+
return registry;
|
|
36
|
+
}
|
|
37
|
+
function addPluginReference(refs, slot, pluginName, source) {
|
|
38
|
+
if (!pluginName)
|
|
39
|
+
return;
|
|
40
|
+
refs.push({ slot, pluginName, source });
|
|
41
|
+
}
|
|
42
|
+
function collectPluginReferences(config) {
|
|
43
|
+
const refs = [];
|
|
44
|
+
addPluginReference(refs, "runtime", config.defaults.runtime, "defaults.runtime");
|
|
45
|
+
addPluginReference(refs, "agent", config.defaults.agent, "defaults.agent");
|
|
46
|
+
addPluginReference(refs, "workspace", config.defaults.workspace, "defaults.workspace");
|
|
47
|
+
addPluginReference(refs, "agent", config.defaults.orchestrator?.agent, "defaults.orchestrator.agent");
|
|
48
|
+
addPluginReference(refs, "agent", config.defaults.worker?.agent, "defaults.worker.agent");
|
|
49
|
+
for (const notifierName of config.defaults.notifiers ?? []) {
|
|
50
|
+
const target = resolveNotifierTarget(config, notifierName);
|
|
51
|
+
addPluginReference(refs, "notifier", target.pluginName, `defaults.notifiers: ${target.reference} (plugin: ${target.pluginName})`);
|
|
52
|
+
}
|
|
53
|
+
for (const [priority, notifierNames] of Object.entries(config.notificationRouting ?? {})) {
|
|
54
|
+
for (const notifierName of notifierNames) {
|
|
55
|
+
const target = resolveNotifierTarget(config, notifierName);
|
|
56
|
+
addPluginReference(refs, "notifier", target.pluginName, `notificationRouting.${priority}: ${target.reference} (plugin: ${target.pluginName})`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
for (const [name, notifierConfig] of Object.entries(config.notifiers ?? {})) {
|
|
60
|
+
addPluginReference(refs, "notifier", notifierConfig.plugin, `notifiers.${name} (plugin: ${notifierConfig.plugin})`);
|
|
61
|
+
}
|
|
62
|
+
for (const [projectId, project] of Object.entries(config.projects)) {
|
|
63
|
+
addPluginReference(refs, "runtime", project.runtime, `projects.${projectId}.runtime`);
|
|
64
|
+
addPluginReference(refs, "agent", project.agent, `projects.${projectId}.agent`);
|
|
65
|
+
addPluginReference(refs, "workspace", project.workspace, `projects.${projectId}.workspace`);
|
|
66
|
+
addPluginReference(refs, "agent", project.orchestrator?.agent, `projects.${projectId}.orchestrator.agent`);
|
|
67
|
+
addPluginReference(refs, "agent", project.worker?.agent, `projects.${projectId}.worker.agent`);
|
|
68
|
+
addPluginReference(refs, "tracker", project.tracker?.plugin, `projects.${projectId}.tracker.plugin`);
|
|
69
|
+
addPluginReference(refs, "scm", project.scm?.plugin, `projects.${projectId}.scm.plugin`);
|
|
70
|
+
}
|
|
71
|
+
return refs;
|
|
72
|
+
}
|
|
73
|
+
async function checkPluginResolution(config, fail) {
|
|
74
|
+
console.log("");
|
|
75
|
+
console.log("Plugin resolution:");
|
|
76
|
+
const registry = await loadPluginRegistry(config);
|
|
77
|
+
const loadedBySlot = new Map();
|
|
78
|
+
const slots = [
|
|
79
|
+
"runtime",
|
|
80
|
+
"agent",
|
|
81
|
+
"workspace",
|
|
82
|
+
"tracker",
|
|
83
|
+
"scm",
|
|
84
|
+
"notifier",
|
|
85
|
+
];
|
|
86
|
+
for (const slot of slots) {
|
|
87
|
+
loadedBySlot.set(slot, new Set(registry.list(slot).map((manifest) => manifest.name)));
|
|
88
|
+
}
|
|
89
|
+
const references = collectPluginReferences(config);
|
|
90
|
+
if (references.length === 0) {
|
|
91
|
+
warn("No plugin references found in config.");
|
|
92
|
+
return registry;
|
|
93
|
+
}
|
|
94
|
+
for (const ref of references) {
|
|
95
|
+
const loaded = loadedBySlot.get(ref.slot);
|
|
96
|
+
if (loaded?.has(ref.pluginName)) {
|
|
97
|
+
pass(`${ref.source} -> ${ref.slot} plugin "${ref.pluginName}"`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
fail(`${ref.source} references ${ref.slot} plugin "${ref.pluginName}", but it could not be loaded. ` +
|
|
101
|
+
`Fix: install the plugin or correct the config value.`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return registry;
|
|
105
|
+
}
|
|
106
|
+
function formatTimestamp(timestamp) {
|
|
107
|
+
if (!timestamp)
|
|
108
|
+
return null;
|
|
109
|
+
const date = new Date(timestamp);
|
|
110
|
+
return Number.isNaN(date.getTime()) ? timestamp : date.toLocaleString();
|
|
111
|
+
}
|
|
112
|
+
function readOpenClawHealth(config) {
|
|
113
|
+
if (!config.configPath)
|
|
114
|
+
return null;
|
|
115
|
+
const healthPath = join(getObservabilityBaseDir(config.configPath), "openclaw-health.json");
|
|
116
|
+
if (!existsSync(healthPath))
|
|
117
|
+
return null;
|
|
118
|
+
try {
|
|
119
|
+
const raw = readFileSync(healthPath, "utf-8");
|
|
120
|
+
const parsed = JSON.parse(raw);
|
|
121
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
122
|
+
return null;
|
|
123
|
+
return {
|
|
124
|
+
lastSuccessAt: typeof parsed.lastSuccessAt === "string" ? parsed.lastSuccessAt : null,
|
|
125
|
+
lastFailureAt: typeof parsed.lastFailureAt === "string" ? parsed.lastFailureAt : null,
|
|
126
|
+
lastFailureError: typeof parsed.lastFailureError === "string" ? parsed.lastFailureError : null,
|
|
127
|
+
totalSent: typeof parsed.totalSent === "number" ? parsed.totalSent : 0,
|
|
128
|
+
totalFailed: typeof parsed.totalFailed === "number" ? parsed.totalFailed : 0,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function checkOpenClawNotifier(config, fail) {
|
|
136
|
+
const openclawConfig = config.notifiers?.["openclaw"];
|
|
137
|
+
if (!openclawConfig || openclawConfig.plugin !== "openclaw") {
|
|
138
|
+
warn("OpenClaw notifier is not configured. Fix: run athene setup openclaw");
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const url = (typeof openclawConfig["url"] === "string" ? openclawConfig["url"] : undefined) ??
|
|
142
|
+
"http://127.0.0.1:18789";
|
|
143
|
+
// Resolve ${ENV_VAR} placeholders written by `athene setup openclaw` — the config
|
|
144
|
+
// stores the literal string "${OPENCLAW_HOOKS_TOKEN}" which is truthy but wrong.
|
|
145
|
+
const rawToken = typeof openclawConfig["token"] === "string" ? openclawConfig["token"] : undefined;
|
|
146
|
+
const envVarMatch = rawToken?.match(/^\$\{([^}]+)\}$/);
|
|
147
|
+
const token = (envVarMatch ? process.env[envVarMatch[1]] : rawToken) ?? process.env["OPENCLAW_HOOKS_TOKEN"];
|
|
148
|
+
const installation = await detectOpenClawInstallation(url);
|
|
149
|
+
if (installation.state === "running") {
|
|
150
|
+
pass(`OpenClaw gateway detected at ${installation.gatewayUrl} (HTTP ${installation.probe.httpStatus})`);
|
|
151
|
+
}
|
|
152
|
+
else if (installation.state === "installed-but-stopped") {
|
|
153
|
+
const installHint = installation.binaryPath
|
|
154
|
+
? `installed at ${installation.binaryPath}`
|
|
155
|
+
: "configured on this machine";
|
|
156
|
+
fail(`OpenClaw is ${installHint} but the gateway is not running at ${installation.gatewayUrl}`);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
fail(`OpenClaw is not installed locally and the gateway is not reachable at ${installation.gatewayUrl}. ` +
|
|
160
|
+
`Fix: install/start OpenClaw or update the notifier URL`);
|
|
161
|
+
}
|
|
162
|
+
// Step 2: Validate auth token if present
|
|
163
|
+
if (!token) {
|
|
164
|
+
warn("OpenClaw token is not set. Fix: set OPENCLAW_HOOKS_TOKEN env var or add token to notifiers.openclaw in config");
|
|
165
|
+
}
|
|
166
|
+
else if (installation.state === "running") {
|
|
167
|
+
const tokenResult = await validateToken(installation.gatewayUrl, token);
|
|
168
|
+
if (!tokenResult.valid) {
|
|
169
|
+
fail(`OpenClaw token validation failed: ${tokenResult.error}`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
pass("OpenClaw token is valid");
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const health = readOpenClawHealth(config);
|
|
176
|
+
if (!health) {
|
|
177
|
+
warn("No OpenClaw notification history recorded yet");
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const lastSuccess = formatTimestamp(health.lastSuccessAt);
|
|
181
|
+
if (lastSuccess) {
|
|
182
|
+
pass(`OpenClaw last successful notification: ${lastSuccess}`);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
warn("OpenClaw has not recorded a successful notification yet");
|
|
186
|
+
}
|
|
187
|
+
if (health.lastFailureAt) {
|
|
188
|
+
const lastFailure = formatTimestamp(health.lastFailureAt);
|
|
189
|
+
warn(`OpenClaw last failure: ${lastFailure ?? health.lastFailureAt} (${health.lastFailureError ?? "unknown error"})`);
|
|
190
|
+
}
|
|
191
|
+
pass(`OpenClaw notification totals: ${health.totalSent} sent, ${health.totalFailed} failed`);
|
|
192
|
+
}
|
|
193
|
+
async function checkNotifierConnectivity(config, fail) {
|
|
194
|
+
console.log(""); // blank line before notifier section
|
|
195
|
+
console.log("Notifier connectivity:");
|
|
196
|
+
const configuredNotifiers = Object.keys(config.notifiers ?? {});
|
|
197
|
+
if (configuredNotifiers.length === 0) {
|
|
198
|
+
warn("No notifiers are configured. Fix: add notifiers to your agent-orchestrator.yaml");
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// Check OpenClaw specifically (it's the only one we can probe without side effects)
|
|
202
|
+
if (config.notifiers?.["openclaw"]) {
|
|
203
|
+
await checkOpenClawNotifier(config, fail);
|
|
204
|
+
}
|
|
205
|
+
// Report other configured notifiers as present (we can't health-check Slack/desktop/webhook without sending)
|
|
206
|
+
for (const [name, notifierConfig] of Object.entries(config.notifiers ?? {})) {
|
|
207
|
+
if (name === "openclaw")
|
|
208
|
+
continue; // already checked above
|
|
209
|
+
const plugin = notifierConfig.plugin;
|
|
210
|
+
pass(`${name} notifier is configured (plugin: ${plugin})`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
// Test-notify (Gap 3)
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
async function sendTestNotifications(config, registry, fail) {
|
|
217
|
+
const result = await runNotifyTest(config, registry, {
|
|
218
|
+
templateName: "basic",
|
|
219
|
+
all: true,
|
|
220
|
+
message: "Test notification from athene doctor --test-notify",
|
|
221
|
+
sessionId: "doctor-test",
|
|
222
|
+
projectId: "doctor",
|
|
223
|
+
data: { source: "athene-doctor" },
|
|
224
|
+
});
|
|
225
|
+
if (result.targets.length === 0) {
|
|
226
|
+
warn("No notifiers to test. Fix: configure notifiers in your agent-orchestrator.yaml");
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
console.log(`\nSending test notification to ${result.targets.length} notifier(s)...\n`);
|
|
230
|
+
for (const delivery of result.deliveries) {
|
|
231
|
+
if (delivery.status === "sent") {
|
|
232
|
+
pass(`${delivery.reference}: test notification sent`);
|
|
233
|
+
}
|
|
234
|
+
else if (delivery.status === "unresolved") {
|
|
235
|
+
warn(`${delivery.reference}: plugin "${delivery.pluginName}" not loaded (may not be installed)`);
|
|
236
|
+
}
|
|
237
|
+
else if (delivery.error) {
|
|
238
|
+
fail(delivery.error);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
for (const warning of result.warnings) {
|
|
242
|
+
warn(warning);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// ---------------------------------------------------------------------------
|
|
246
|
+
// Version freshness (cache-only — no network call)
|
|
247
|
+
// ---------------------------------------------------------------------------
|
|
248
|
+
function checkVersionFreshness() {
|
|
249
|
+
console.log("");
|
|
250
|
+
console.log("Version:");
|
|
251
|
+
const current = getCurrentVersion();
|
|
252
|
+
const installMethod = detectInstallMethod();
|
|
253
|
+
const cached = readCachedUpdateInfo(installMethod);
|
|
254
|
+
if (!cached) {
|
|
255
|
+
pass(`athene v${current} installed (run any athene command to check for updates)`);
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
const isOutdated = installMethod === "git"
|
|
259
|
+
? cached.isOutdated === true
|
|
260
|
+
: isVersionOutdated(current, cached.latestVersion);
|
|
261
|
+
if (isOutdated) {
|
|
262
|
+
const latest = installMethod === "git" ? cached.latestVersion : `v${cached.latestVersion}`;
|
|
263
|
+
warn(`athene v${current} is outdated (latest: ${latest}). Run: ${getUpdateCommand(installMethod)}`);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
pass(`athene v${current} is the latest version`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// ---------------------------------------------------------------------------
|
|
270
|
+
// Command registration
|
|
271
|
+
// ---------------------------------------------------------------------------
|
|
272
|
+
export function registerDoctor(program) {
|
|
273
|
+
program
|
|
274
|
+
.command("doctor")
|
|
275
|
+
.description("Run install, environment, and runtime health checks")
|
|
276
|
+
.option("--fix", "Apply safe fixes for launcher and stale temp issues")
|
|
277
|
+
.option("--test-notify", "Send a test notification through each configured notifier")
|
|
278
|
+
.action(async (opts) => {
|
|
279
|
+
const { fail, count: failCount } = makeFailCounter();
|
|
280
|
+
// 1. Run shell checks
|
|
281
|
+
const scriptArgs = [];
|
|
282
|
+
if (opts.fix) {
|
|
283
|
+
scriptArgs.push("--fix");
|
|
284
|
+
}
|
|
285
|
+
let shellExitCode;
|
|
286
|
+
try {
|
|
287
|
+
shellExitCode = await runRepoScript("athene-doctor.sh", scriptArgs);
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
291
|
+
shellExitCode = 1;
|
|
292
|
+
}
|
|
293
|
+
// 2. Version freshness (cache-only, no network dependency)
|
|
294
|
+
checkVersionFreshness();
|
|
295
|
+
// 3. Run TypeScript-based notifier checks if a config file exists
|
|
296
|
+
const configPath = findConfigFile();
|
|
297
|
+
if (configPath) {
|
|
298
|
+
let config;
|
|
299
|
+
let registry;
|
|
300
|
+
try {
|
|
301
|
+
config = loadConfig(configPath);
|
|
302
|
+
registry = await checkPluginResolution(config, fail);
|
|
303
|
+
await checkNotifierConnectivity(config, fail);
|
|
304
|
+
}
|
|
305
|
+
catch (err) {
|
|
306
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
307
|
+
fail(`Config-aware doctor checks failed: ${message}`);
|
|
308
|
+
}
|
|
309
|
+
// 4. Send test notifications if requested (separate catch for accurate errors)
|
|
310
|
+
if (opts.testNotify && config && registry) {
|
|
311
|
+
try {
|
|
312
|
+
await sendTestNotifications(config, registry, fail);
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
316
|
+
fail(`Sending test notifications failed: ${message}`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else if (opts.testNotify) {
|
|
321
|
+
fail("No config file found. Cannot test notifiers without agent-orchestrator.yaml");
|
|
322
|
+
}
|
|
323
|
+
// Exit non-zero if shell checks or notifier checks failed
|
|
324
|
+
if (shellExitCode !== 0 || failCount() > 0) {
|
|
325
|
+
process.exit(shellExitCode || 1);
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/commands/events.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwEzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuJrD"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { queryActivityEvents, searchActivityEvents, getActivityEventStats, droppedEventCount, isActivityEventsFtsEnabled, } from "@made-by-moonlight/athene-core";
|
|
3
|
+
function toJsonOutput(ev) {
|
|
4
|
+
let data = ev.data;
|
|
5
|
+
if (typeof ev.data === "string") {
|
|
6
|
+
try {
|
|
7
|
+
data = JSON.parse(ev.data);
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
// leave as raw string if not valid JSON
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return { ...ev, data };
|
|
14
|
+
}
|
|
15
|
+
function parseSinceDuration(raw) {
|
|
16
|
+
const match = raw.match(/^(\d+)(m|h|d)$/);
|
|
17
|
+
if (!match)
|
|
18
|
+
return undefined;
|
|
19
|
+
const value = parseInt(match[1], 10);
|
|
20
|
+
const unit = match[2];
|
|
21
|
+
const ms = unit === "m" ? value * 60_000 : unit === "h" ? value * 3_600_000 : value * 86_400_000;
|
|
22
|
+
return new Date(Date.now() - ms);
|
|
23
|
+
}
|
|
24
|
+
function formatRow(ev) {
|
|
25
|
+
const ts = new Date(ev.tsEpoch).toLocaleTimeString();
|
|
26
|
+
const session = ev.sessionId ? ev.sessionId.slice(0, 12) : "—";
|
|
27
|
+
const kind = chalk.cyan(ev.kind.padEnd(22));
|
|
28
|
+
// Pad raw string before chalk-wrapping: chalk adds ANSI codes that inflate .length
|
|
29
|
+
const levelLabel = ev.level.padEnd(9);
|
|
30
|
+
const level = ev.level === "error"
|
|
31
|
+
? chalk.red(levelLabel)
|
|
32
|
+
: ev.level === "warn"
|
|
33
|
+
? chalk.yellow(levelLabel)
|
|
34
|
+
: chalk.gray(levelLabel);
|
|
35
|
+
return `${chalk.dim(ts)} ${kind} ${level} ${chalk.dim(session)} ${ev.summary}`;
|
|
36
|
+
}
|
|
37
|
+
function jsonMeta(resultCount, fallbackUsed = false) {
|
|
38
|
+
return {
|
|
39
|
+
resultCount,
|
|
40
|
+
droppedEventCount: droppedEventCount(),
|
|
41
|
+
ftsEnabled: isActivityEventsFtsEnabled(),
|
|
42
|
+
fallbackUsed,
|
|
43
|
+
ts: new Date().toISOString(),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
export function registerEvents(program) {
|
|
47
|
+
const events = program
|
|
48
|
+
.command("events")
|
|
49
|
+
.description("Query activity event log (session spawns, transitions, CI failures)");
|
|
50
|
+
events
|
|
51
|
+
.command("list")
|
|
52
|
+
.description("List recent activity events")
|
|
53
|
+
.option("-p, --project <id>", "Filter by project ID")
|
|
54
|
+
.option("-s, --session <id>", "Filter by session ID")
|
|
55
|
+
.option("-t, --type <kind>", "Filter by event kind (e.g. session.spawned, lifecycle.transition)")
|
|
56
|
+
.option("--kind <kind>", "Alias for --type")
|
|
57
|
+
.option("--source <source>", "Filter by event source (e.g. lifecycle, recovery, api)")
|
|
58
|
+
.option("--log-level <level>", "Filter by log level (debug, info, warn, error)")
|
|
59
|
+
.option("--since <duration>", "Show events from last N minutes/hours/days (e.g. 30m, 2h, 1d)")
|
|
60
|
+
.option("-n, --limit <n>", "Max results", "50")
|
|
61
|
+
.option("--json", "Output as JSON")
|
|
62
|
+
.action(async (opts) => {
|
|
63
|
+
const sinceRaw = opts["since"];
|
|
64
|
+
let since;
|
|
65
|
+
if (sinceRaw) {
|
|
66
|
+
since = parseSinceDuration(sinceRaw);
|
|
67
|
+
if (!since) {
|
|
68
|
+
console.error(chalk.yellow(`Warning: unrecognised --since format "${sinceRaw}" (use e.g. 30m, 2h, 1d). No time filter applied.`));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const limit = parseInt(opts["limit"] ?? "50", 10);
|
|
72
|
+
const kind = opts["type"] ?? opts["kind"];
|
|
73
|
+
const results = queryActivityEvents({
|
|
74
|
+
projectId: opts["project"],
|
|
75
|
+
sessionId: opts["session"],
|
|
76
|
+
kind: kind,
|
|
77
|
+
source: opts["source"],
|
|
78
|
+
level: opts["logLevel"],
|
|
79
|
+
since,
|
|
80
|
+
limit,
|
|
81
|
+
});
|
|
82
|
+
if (opts["json"]) {
|
|
83
|
+
const envelope = {
|
|
84
|
+
version: 1,
|
|
85
|
+
query: {
|
|
86
|
+
projectId: opts["project"] ?? null,
|
|
87
|
+
sessionId: opts["session"] ?? null,
|
|
88
|
+
kind: kind ?? null,
|
|
89
|
+
source: opts["source"] ?? null,
|
|
90
|
+
level: opts["logLevel"] ?? null,
|
|
91
|
+
since: sinceRaw ?? null,
|
|
92
|
+
limit,
|
|
93
|
+
},
|
|
94
|
+
meta: jsonMeta(results.length),
|
|
95
|
+
events: results.map(toJsonOutput),
|
|
96
|
+
};
|
|
97
|
+
console.log(JSON.stringify(envelope, null, 2));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
if (results.length === 0) {
|
|
101
|
+
console.log(chalk.dim("No events found."));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
console.log(chalk.dim(`${"TIME".padEnd(10)} ${"KIND".padEnd(22)} ${"LEVEL".padEnd(9)} ${"SESSION".padEnd(12)} SUMMARY`));
|
|
105
|
+
for (const ev of results) {
|
|
106
|
+
console.log(formatRow(ev));
|
|
107
|
+
}
|
|
108
|
+
console.log(chalk.dim(`\n${results.length} event(s)`));
|
|
109
|
+
});
|
|
110
|
+
events
|
|
111
|
+
.command("search <query>")
|
|
112
|
+
.description("Full-text search across event summaries and data")
|
|
113
|
+
.option("-p, --project <id>", "Filter by project ID")
|
|
114
|
+
.option("-n, --limit <n>", "Max results", "100")
|
|
115
|
+
.option("--json", "Output as JSON")
|
|
116
|
+
.action(async (query, opts) => {
|
|
117
|
+
const limit = parseInt(opts["limit"] ?? "100", 10);
|
|
118
|
+
const results = searchActivityEvents(query, opts["project"], limit);
|
|
119
|
+
const fallbackUsed = !isActivityEventsFtsEnabled();
|
|
120
|
+
if (opts["json"]) {
|
|
121
|
+
const envelope = {
|
|
122
|
+
version: 1,
|
|
123
|
+
query: { q: query, projectId: opts["project"] ?? null, limit },
|
|
124
|
+
meta: jsonMeta(results.length, fallbackUsed),
|
|
125
|
+
events: results.map(toJsonOutput),
|
|
126
|
+
};
|
|
127
|
+
console.log(JSON.stringify(envelope, null, 2));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (results.length === 0) {
|
|
131
|
+
console.log(chalk.dim("No events found."));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
console.log(chalk.dim(`${"TIME".padEnd(10)} ${"KIND".padEnd(22)} ${"LEVEL".padEnd(9)} ${"SESSION".padEnd(12)} SUMMARY`));
|
|
135
|
+
for (const ev of results) {
|
|
136
|
+
console.log(formatRow(ev));
|
|
137
|
+
}
|
|
138
|
+
console.log(chalk.dim(`\n${results.length} event(s)`));
|
|
139
|
+
});
|
|
140
|
+
events
|
|
141
|
+
.command("stats")
|
|
142
|
+
.description("Show event log statistics")
|
|
143
|
+
.action(async () => {
|
|
144
|
+
const stats = getActivityEventStats();
|
|
145
|
+
if (!stats) {
|
|
146
|
+
console.log(chalk.yellow("Event log unavailable (better-sqlite3 not loaded)."));
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
console.log(chalk.bold("Event Log Stats"));
|
|
150
|
+
console.log(` Total events: ${stats.total}`);
|
|
151
|
+
console.log(` Dropped (process): ${stats.droppedThisProcess}`);
|
|
152
|
+
if (stats.oldestTs)
|
|
153
|
+
console.log(` Oldest event: ${stats.oldestTs}`);
|
|
154
|
+
if (stats.newestTs)
|
|
155
|
+
console.log(` Newest event: ${stats.newestTs}`);
|
|
156
|
+
if (Object.keys(stats.byKind).length > 0) {
|
|
157
|
+
console.log(chalk.bold("\nBy kind:"));
|
|
158
|
+
const byKind = Object.entries(stats.byKind);
|
|
159
|
+
for (const [kind, count] of byKind.sort((a, b) => b[1] - a[1])) {
|
|
160
|
+
console.log(` ${kind.padEnd(30)} ${count}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (Object.keys(stats.bySource).length > 0) {
|
|
164
|
+
console.log(chalk.bold("\nBy source:"));
|
|
165
|
+
const bySource = Object.entries(stats.bySource);
|
|
166
|
+
for (const [source, count] of bySource.sort((a, b) => b[1] - a[1])) {
|
|
167
|
+
console.log(` ${source.padEnd(30)} ${count}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=events.js.map
|