@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,462 @@
|
|
|
1
|
+
import { readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { withConfigSchema, createPluginRegistry, findConfigFile, isCanonicalGlobalConfigPath, loadConfig, } from "@made-by-moonlight/athene-core";
|
|
4
|
+
import { parseDocument } from "yaml";
|
|
5
|
+
import { buildPluginDescriptor, findMarketplacePlugin, loadMarketplaceCatalog, normalizeImportedPluginModule, refreshMarketplaceCatalog, } from "../lib/plugin-marketplace.js";
|
|
6
|
+
import { getLatestPublishedPackageVersion, importPluginModuleFromSource, installPackageIntoStore, readInstalledPackageVersion, uninstallPackageFromStore, } from "../lib/plugin-store.js";
|
|
7
|
+
import { buildDefaultPackageName, normalizePluginName, resolveScaffoldDirectory, scaffoldPlugin, } from "../lib/plugin-scaffold.js";
|
|
8
|
+
import { runSetupAction } from "./setup.js";
|
|
9
|
+
function findInstalledPlugin(plugins, descriptor) {
|
|
10
|
+
return plugins.find((plugin) => {
|
|
11
|
+
if (descriptor.package && plugin.package === descriptor.package)
|
|
12
|
+
return true;
|
|
13
|
+
if (descriptor.path && plugin.path === descriptor.path)
|
|
14
|
+
return true;
|
|
15
|
+
return plugin.name === descriptor.name;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
function upsertInstalledPlugin(plugins, descriptor) {
|
|
19
|
+
const existing = findInstalledPlugin(plugins, descriptor);
|
|
20
|
+
if (!existing) {
|
|
21
|
+
return [...plugins, descriptor];
|
|
22
|
+
}
|
|
23
|
+
return plugins.map((plugin) => (plugin === existing ? { ...existing, ...descriptor } : plugin));
|
|
24
|
+
}
|
|
25
|
+
function writePluginsConfig(configPath, plugins) {
|
|
26
|
+
const rawYaml = readFileSync(configPath, "utf-8");
|
|
27
|
+
const doc = parseDocument(rawYaml);
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
|
+
const rawConfig = doc.toJS() ?? {};
|
|
30
|
+
if (plugins.length === 0) {
|
|
31
|
+
delete rawConfig.plugins;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
rawConfig.plugins = plugins;
|
|
35
|
+
}
|
|
36
|
+
doc.contents = doc.createNode(isCanonicalGlobalConfigPath(configPath) ? rawConfig : withConfigSchema(rawConfig));
|
|
37
|
+
const rendered = doc.toString({ indent: 2 });
|
|
38
|
+
const tempPath = `${configPath}.tmp.${process.pid}.${Date.now()}`;
|
|
39
|
+
writeFileSync(tempPath, rendered, "utf-8");
|
|
40
|
+
renameSync(tempPath, configPath);
|
|
41
|
+
}
|
|
42
|
+
function matchesPluginReference(plugin, reference) {
|
|
43
|
+
const marketplacePlugin = findMarketplacePlugin(reference);
|
|
44
|
+
return (plugin.name === reference ||
|
|
45
|
+
plugin.package === reference ||
|
|
46
|
+
plugin.path === reference ||
|
|
47
|
+
(marketplacePlugin !== undefined &&
|
|
48
|
+
(plugin.package === marketplacePlugin.package || plugin.name === marketplacePlugin.id)));
|
|
49
|
+
}
|
|
50
|
+
async function rollbackManagedPackageInstall(packageName, previousVersion) {
|
|
51
|
+
if (previousVersion) {
|
|
52
|
+
await installPackageIntoStore(packageName, previousVersion);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
await uninstallPackageFromStore(packageName);
|
|
56
|
+
}
|
|
57
|
+
function formatInstallSummary(descriptor, configPath) {
|
|
58
|
+
const version = descriptor.version ? ` @ ${descriptor.version}` : "";
|
|
59
|
+
return `Installed ${descriptor.name}${version} (${descriptor.source}) into ${configPath}`;
|
|
60
|
+
}
|
|
61
|
+
async function installOrVerifyPlugin(config, descriptor, specifier) {
|
|
62
|
+
if (!descriptor.package || descriptor.source === "local") {
|
|
63
|
+
return verifyPluginDescriptor(config, descriptor, specifier);
|
|
64
|
+
}
|
|
65
|
+
const previousVersion = readInstalledPackageVersion(descriptor.package);
|
|
66
|
+
let installCompleted = false;
|
|
67
|
+
try {
|
|
68
|
+
const installedVersion = await installPackageIntoStore(descriptor.package, descriptor.version);
|
|
69
|
+
installCompleted = true;
|
|
70
|
+
return await verifyPluginDescriptor(config, { ...descriptor, version: installedVersion }, descriptor.package);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
if (installCompleted) {
|
|
74
|
+
try {
|
|
75
|
+
await rollbackManagedPackageInstall(descriptor.package, previousVersion);
|
|
76
|
+
}
|
|
77
|
+
catch (rollbackErr) {
|
|
78
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
79
|
+
const rollbackMessage = rollbackErr instanceof Error ? rollbackErr.message : String(rollbackErr);
|
|
80
|
+
throw new Error(`${message}\nRollback failed for ${descriptor.package}: ${rollbackMessage}`, { cause: rollbackErr });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function resolveTargetVersion(plugin) {
|
|
87
|
+
if (!plugin.package) {
|
|
88
|
+
throw new Error(`Plugin ${plugin.name} does not have a package-backed source and cannot be updated.`);
|
|
89
|
+
}
|
|
90
|
+
const marketplacePlugin = findMarketplacePlugin(plugin.package) ?? findMarketplacePlugin(plugin.name);
|
|
91
|
+
if (marketplacePlugin?.latestVersion) {
|
|
92
|
+
return marketplacePlugin.latestVersion;
|
|
93
|
+
}
|
|
94
|
+
return getLatestPublishedPackageVersion(plugin.package);
|
|
95
|
+
}
|
|
96
|
+
async function updateManagedPlugin(configPath, config, plugin) {
|
|
97
|
+
if (!plugin.package || plugin.source === "local") {
|
|
98
|
+
throw new Error(`Plugin ${plugin.name} is local-only and cannot be updated through the AO store.`);
|
|
99
|
+
}
|
|
100
|
+
const currentVersion = readInstalledPackageVersion(plugin.package) ?? plugin.version ?? null;
|
|
101
|
+
const targetVersion = await resolveTargetVersion(plugin);
|
|
102
|
+
if (currentVersion === targetVersion) {
|
|
103
|
+
if (plugin.version !== currentVersion && currentVersion) {
|
|
104
|
+
writePluginsConfig(configPath, upsertInstalledPlugin(config.plugins ?? [], { ...plugin, version: currentVersion }));
|
|
105
|
+
}
|
|
106
|
+
console.log(chalk.dim(`${plugin.name} is already up to date (${targetVersion}).`));
|
|
107
|
+
return "skipped";
|
|
108
|
+
}
|
|
109
|
+
const previousVersion = readInstalledPackageVersion(plugin.package);
|
|
110
|
+
let installCompleted = false;
|
|
111
|
+
try {
|
|
112
|
+
const installedVersion = await installPackageIntoStore(plugin.package, targetVersion);
|
|
113
|
+
installCompleted = true;
|
|
114
|
+
const verifiedDescriptor = await verifyPluginDescriptor(config, { ...plugin, version: installedVersion }, plugin.package);
|
|
115
|
+
writePluginsConfig(configPath, upsertInstalledPlugin(config.plugins ?? [], verifiedDescriptor));
|
|
116
|
+
console.log(chalk.green(`Updated ${verifiedDescriptor.name} from ${currentVersion ?? "not installed"} to ${installedVersion}`));
|
|
117
|
+
return "updated";
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
if (installCompleted) {
|
|
121
|
+
try {
|
|
122
|
+
await rollbackManagedPackageInstall(plugin.package, previousVersion);
|
|
123
|
+
}
|
|
124
|
+
catch (rollbackErr) {
|
|
125
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
126
|
+
const rollbackMessage = rollbackErr instanceof Error ? rollbackErr.message : String(rollbackErr);
|
|
127
|
+
throw new Error(`${message}\nRollback failed for ${plugin.package}: ${rollbackMessage}`, {
|
|
128
|
+
cause: rollbackErr,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
throw err;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function verifyPluginDescriptor(config, descriptor, specifier) {
|
|
136
|
+
const imported = normalizeImportedPluginModule(await importPluginModuleFromSource(specifier));
|
|
137
|
+
if (!imported) {
|
|
138
|
+
throw new Error(`Imported module ${specifier} does not export a valid AO plugin`);
|
|
139
|
+
}
|
|
140
|
+
const normalizedDescriptor = {
|
|
141
|
+
...descriptor,
|
|
142
|
+
name: imported.manifest.name,
|
|
143
|
+
};
|
|
144
|
+
const registry = createPluginRegistry();
|
|
145
|
+
const tempConfig = {
|
|
146
|
+
...config,
|
|
147
|
+
plugins: upsertInstalledPlugin(config.plugins ?? [], normalizedDescriptor),
|
|
148
|
+
};
|
|
149
|
+
const originalWarn = console.warn;
|
|
150
|
+
console.warn = () => { };
|
|
151
|
+
try {
|
|
152
|
+
await registry.loadFromConfig(tempConfig, importPluginModuleFromSource);
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
console.warn = originalWarn;
|
|
156
|
+
}
|
|
157
|
+
const registered = registry.get(imported.manifest.slot, imported.manifest.name);
|
|
158
|
+
if (!registered) {
|
|
159
|
+
throw new Error(`Plugin ${imported.manifest.name} imported successfully but did not load through the registry`);
|
|
160
|
+
}
|
|
161
|
+
return normalizedDescriptor;
|
|
162
|
+
}
|
|
163
|
+
function printPluginListFromCatalog(config, installedOnly, catalog, slotFilter) {
|
|
164
|
+
const installed = config?.plugins ?? [];
|
|
165
|
+
if (installedOnly) {
|
|
166
|
+
const filtered = slotFilter
|
|
167
|
+
? installed.filter((p) => {
|
|
168
|
+
const entry = catalog.find((e) => e.id === p.name || e.package === p.package);
|
|
169
|
+
return entry?.slot === slotFilter;
|
|
170
|
+
})
|
|
171
|
+
: installed;
|
|
172
|
+
if (filtered.length === 0) {
|
|
173
|
+
console.log(chalk.dim(slotFilter
|
|
174
|
+
? `No installed plugins with type "${slotFilter}".`
|
|
175
|
+
: "No plugins are installed in this config."));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
for (const plugin of filtered) {
|
|
179
|
+
const source = plugin.source === "local" ? plugin.path : plugin.package;
|
|
180
|
+
const version = plugin.version ? ` @ ${plugin.version}` : "";
|
|
181
|
+
console.log(`${chalk.green(plugin.name)}${chalk.dim(version)} ${chalk.dim(`(${plugin.source}) ${source ?? ""}`)}`);
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
const filteredCatalog = slotFilter ? catalog.filter((p) => p.slot === slotFilter) : catalog;
|
|
186
|
+
if (filteredCatalog.length === 0) {
|
|
187
|
+
console.log(chalk.dim(slotFilter
|
|
188
|
+
? `No marketplace plugins with type "${slotFilter}".`
|
|
189
|
+
: "No marketplace plugins found."));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
for (const plugin of filteredCatalog) {
|
|
193
|
+
const isInstalled = installed.some((entry) => entry.package === plugin.package || entry.name === plugin.id);
|
|
194
|
+
const marker = isInstalled ? chalk.green("installed") : chalk.dim("available");
|
|
195
|
+
console.log(`${chalk.cyan(plugin.id)} ${chalk.dim(`(${plugin.slot})`)} ${marker}`);
|
|
196
|
+
console.log(chalk.dim(` ${plugin.description}`));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
export function registerPlugin(program) {
|
|
200
|
+
const plugin = program.command("plugin").description("Browse and manage AO plugins");
|
|
201
|
+
plugin
|
|
202
|
+
.command("list")
|
|
203
|
+
.description("List bundled marketplace plugins")
|
|
204
|
+
.option("--installed", "Show only plugins installed in the current config")
|
|
205
|
+
.option("--type <slot>", "Filter by plugin slot (e.g. agent, notifier, tracker)")
|
|
206
|
+
.option("--refresh", "Fetch the latest registry and update the local marketplace cache")
|
|
207
|
+
.action(async (opts) => {
|
|
208
|
+
let config = null;
|
|
209
|
+
const configPath = findConfigFile();
|
|
210
|
+
if (configPath) {
|
|
211
|
+
config = loadConfig(configPath);
|
|
212
|
+
}
|
|
213
|
+
const catalog = opts.refresh === true ? await refreshMarketplaceCatalog() : loadMarketplaceCatalog();
|
|
214
|
+
printPluginListFromCatalog(config, opts.installed === true, catalog, opts.type);
|
|
215
|
+
});
|
|
216
|
+
plugin
|
|
217
|
+
.command("search")
|
|
218
|
+
.description("Search the bundled marketplace catalog")
|
|
219
|
+
.argument("<query>", "Search term")
|
|
220
|
+
.action((query) => {
|
|
221
|
+
const normalizedQuery = query.trim().toLowerCase();
|
|
222
|
+
const matches = loadMarketplaceCatalog().filter((plugin) => {
|
|
223
|
+
return (plugin.id.toLowerCase().includes(normalizedQuery) ||
|
|
224
|
+
plugin.package.toLowerCase().includes(normalizedQuery) ||
|
|
225
|
+
plugin.description.toLowerCase().includes(normalizedQuery) ||
|
|
226
|
+
plugin.slot.toLowerCase().includes(normalizedQuery));
|
|
227
|
+
});
|
|
228
|
+
if (matches.length === 0) {
|
|
229
|
+
console.log(chalk.dim(`No marketplace plugins matched "${query}".`));
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
for (const match of matches) {
|
|
233
|
+
console.log(`${chalk.cyan(match.id)} ${chalk.dim(`(${match.slot})`)}`);
|
|
234
|
+
console.log(chalk.dim(` ${match.description}`));
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
plugin
|
|
238
|
+
.command("create")
|
|
239
|
+
.description("Scaffold a new AO plugin package")
|
|
240
|
+
.argument("[directory]", "Target directory for the new plugin")
|
|
241
|
+
.option("--name <name>", "Display/plugin name")
|
|
242
|
+
.option("--slot <slot>", "Plugin slot: runtime | agent | workspace | tracker | scm | notifier | terminal")
|
|
243
|
+
.option("--description <description>", "Short plugin description")
|
|
244
|
+
.option("--author <author>", "Package author")
|
|
245
|
+
.option("--package-name <packageName>", "npm package name")
|
|
246
|
+
.option("--non-interactive", "Skip prompts and require explicit values for required fields")
|
|
247
|
+
.action(async (directory, opts) => {
|
|
248
|
+
const slotOptions = [
|
|
249
|
+
"runtime",
|
|
250
|
+
"agent",
|
|
251
|
+
"workspace",
|
|
252
|
+
"tracker",
|
|
253
|
+
"scm",
|
|
254
|
+
"notifier",
|
|
255
|
+
"terminal",
|
|
256
|
+
];
|
|
257
|
+
const isInteractive = process.stdin.isTTY && opts.nonInteractive !== true;
|
|
258
|
+
let name = opts.name;
|
|
259
|
+
let slot = slotOptions.find((candidate) => candidate === opts.slot);
|
|
260
|
+
let description = opts.description;
|
|
261
|
+
let author = opts.author ?? process.env["USER"] ?? process.env["USERNAME"];
|
|
262
|
+
let packageName = opts.packageName;
|
|
263
|
+
if (isInteractive) {
|
|
264
|
+
const clack = await import("@clack/prompts");
|
|
265
|
+
clack.intro(chalk.bgCyan(chalk.black(" athene plugin create ")));
|
|
266
|
+
if (!name) {
|
|
267
|
+
const value = await clack.text({
|
|
268
|
+
message: "Plugin display name:",
|
|
269
|
+
placeholder: "My Plugin",
|
|
270
|
+
validate: (input) => {
|
|
271
|
+
if (!input)
|
|
272
|
+
return "Plugin name is required";
|
|
273
|
+
try {
|
|
274
|
+
normalizePluginName(input);
|
|
275
|
+
}
|
|
276
|
+
catch (err) {
|
|
277
|
+
return err instanceof Error ? err.message : String(err);
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
if (clack.isCancel(value)) {
|
|
282
|
+
clack.cancel("Plugin creation cancelled.");
|
|
283
|
+
process.exit(0);
|
|
284
|
+
}
|
|
285
|
+
name = value;
|
|
286
|
+
}
|
|
287
|
+
if (!slot) {
|
|
288
|
+
const value = await clack.select({
|
|
289
|
+
message: "Plugin slot:",
|
|
290
|
+
options: slotOptions.map((candidate) => ({ value: candidate, label: candidate })),
|
|
291
|
+
});
|
|
292
|
+
if (clack.isCancel(value)) {
|
|
293
|
+
clack.cancel("Plugin creation cancelled.");
|
|
294
|
+
process.exit(0);
|
|
295
|
+
}
|
|
296
|
+
slot = value;
|
|
297
|
+
}
|
|
298
|
+
if (!description) {
|
|
299
|
+
const value = await clack.text({
|
|
300
|
+
message: "Short description:",
|
|
301
|
+
placeholder: `AO ${slot} plugin`,
|
|
302
|
+
validate: (input) => (!input ? "Description is required" : undefined),
|
|
303
|
+
});
|
|
304
|
+
if (clack.isCancel(value)) {
|
|
305
|
+
clack.cancel("Plugin creation cancelled.");
|
|
306
|
+
process.exit(0);
|
|
307
|
+
}
|
|
308
|
+
description = value;
|
|
309
|
+
}
|
|
310
|
+
if (!author) {
|
|
311
|
+
const value = await clack.text({
|
|
312
|
+
message: "Author:",
|
|
313
|
+
placeholder: "Your Name",
|
|
314
|
+
});
|
|
315
|
+
if (clack.isCancel(value)) {
|
|
316
|
+
clack.cancel("Plugin creation cancelled.");
|
|
317
|
+
process.exit(0);
|
|
318
|
+
}
|
|
319
|
+
author = value || undefined;
|
|
320
|
+
}
|
|
321
|
+
if (!packageName) {
|
|
322
|
+
const value = await clack.text({
|
|
323
|
+
message: "Package name:",
|
|
324
|
+
initialValue: buildDefaultPackageName(slot, name),
|
|
325
|
+
validate: (input) => (!input ? "Package name is required" : undefined),
|
|
326
|
+
});
|
|
327
|
+
if (clack.isCancel(value)) {
|
|
328
|
+
clack.cancel("Plugin creation cancelled.");
|
|
329
|
+
process.exit(0);
|
|
330
|
+
}
|
|
331
|
+
packageName = value;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
if (!name)
|
|
335
|
+
throw new Error("--name is required");
|
|
336
|
+
if (!slot)
|
|
337
|
+
throw new Error("--slot is required");
|
|
338
|
+
if (!description)
|
|
339
|
+
throw new Error("--description is required");
|
|
340
|
+
const targetDirectory = resolveScaffoldDirectory(name, directory);
|
|
341
|
+
const createdDir = scaffoldPlugin({
|
|
342
|
+
author,
|
|
343
|
+
description,
|
|
344
|
+
directory: targetDirectory,
|
|
345
|
+
displayName: name,
|
|
346
|
+
packageName: packageName ?? buildDefaultPackageName(slot, name),
|
|
347
|
+
slot,
|
|
348
|
+
});
|
|
349
|
+
console.log(chalk.green(`Created plugin scaffold at ${createdDir}`));
|
|
350
|
+
console.log(chalk.dim(` Package: ${packageName ?? buildDefaultPackageName(slot, name)}`));
|
|
351
|
+
console.log(chalk.dim(` Slot: ${slot}`));
|
|
352
|
+
console.log(chalk.dim(" Next: npm install && npm run build"));
|
|
353
|
+
});
|
|
354
|
+
plugin
|
|
355
|
+
.command("install")
|
|
356
|
+
.description("Install a plugin into the current config")
|
|
357
|
+
.argument("<reference>", "Marketplace id, package name, or local path")
|
|
358
|
+
.option("--url <url>", "OpenClaw webhook URL (passed to setup when installing notifier-openclaw)")
|
|
359
|
+
.option("--token <token>", "Remote/manual OpenClaw token fallback (passed to setup when installing notifier-openclaw)")
|
|
360
|
+
.option("--openclaw-config-path <path>", "OpenClaw config path that contains hooks.token (passed to setup when installing notifier-openclaw)")
|
|
361
|
+
.action(async (reference, opts) => {
|
|
362
|
+
const configPath = findConfigFile();
|
|
363
|
+
if (!configPath) {
|
|
364
|
+
throw new Error("No agent-orchestrator.yaml found. Run 'athene start' first.");
|
|
365
|
+
}
|
|
366
|
+
const config = loadConfig(configPath);
|
|
367
|
+
const { descriptor, specifier, setupAction } = buildPluginDescriptor(reference, configPath);
|
|
368
|
+
const verifiedDescriptor = await installOrVerifyPlugin(config, descriptor, specifier);
|
|
369
|
+
const previousPlugins = config.plugins ?? [];
|
|
370
|
+
const nextPlugins = upsertInstalledPlugin(previousPlugins, verifiedDescriptor);
|
|
371
|
+
writePluginsConfig(configPath, nextPlugins);
|
|
372
|
+
console.log(chalk.green(formatInstallSummary(verifiedDescriptor, configPath)));
|
|
373
|
+
if (setupAction === "openclaw-setup") {
|
|
374
|
+
// Always run setup — interactive in TTY, auto-detect in non-TTY.
|
|
375
|
+
// Non-interactive setup will auto-detect OpenClaw on localhost if
|
|
376
|
+
// no --url is given and the gateway is reachable.
|
|
377
|
+
try {
|
|
378
|
+
await runSetupAction({
|
|
379
|
+
url: opts.url,
|
|
380
|
+
token: opts.token,
|
|
381
|
+
openclawConfigPath: opts.openclawConfigPath,
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
catch (err) {
|
|
385
|
+
// Rollback: restore previous plugin list so a failed setup
|
|
386
|
+
// doesn't leave a half-configured notifier enabled in config.
|
|
387
|
+
writePluginsConfig(configPath, previousPlugins);
|
|
388
|
+
console.log(chalk.dim("Rolled back plugin config after setup failure."));
|
|
389
|
+
throw err;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
plugin
|
|
394
|
+
.command("update")
|
|
395
|
+
.description("Update installer-managed plugins in the current config")
|
|
396
|
+
.argument("[reference]", "Installed plugin name, marketplace id, or package name")
|
|
397
|
+
.option("--all", "Update all installer-managed plugins in the current config")
|
|
398
|
+
.action(async (reference, opts) => {
|
|
399
|
+
const configPath = findConfigFile();
|
|
400
|
+
if (!configPath) {
|
|
401
|
+
throw new Error("No agent-orchestrator.yaml found. Run 'athene start' first.");
|
|
402
|
+
}
|
|
403
|
+
if (!reference && opts.all !== true) {
|
|
404
|
+
throw new Error("Specify a plugin reference or pass --all.");
|
|
405
|
+
}
|
|
406
|
+
let config = loadConfig(configPath);
|
|
407
|
+
const managedPlugins = (config.plugins ?? []).filter((plugin) => plugin.source !== "local");
|
|
408
|
+
const targets = opts.all
|
|
409
|
+
? managedPlugins
|
|
410
|
+
: managedPlugins.filter((plugin) => reference && matchesPluginReference(plugin, reference));
|
|
411
|
+
if (targets.length === 0) {
|
|
412
|
+
throw new Error(opts.all
|
|
413
|
+
? "No installer-managed plugins are configured in this project."
|
|
414
|
+
: `Plugin ${reference} is not installed in this config`);
|
|
415
|
+
}
|
|
416
|
+
const failures = [];
|
|
417
|
+
let updated = 0;
|
|
418
|
+
let skipped = 0;
|
|
419
|
+
for (const target of targets) {
|
|
420
|
+
try {
|
|
421
|
+
const result = await updateManagedPlugin(configPath, config, target);
|
|
422
|
+
if (result === "updated") {
|
|
423
|
+
updated++;
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
skipped++;
|
|
427
|
+
}
|
|
428
|
+
config = loadConfig(configPath);
|
|
429
|
+
}
|
|
430
|
+
catch (err) {
|
|
431
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
432
|
+
failures.push(`${target.name}: ${message}`);
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
if (updated > 0 || skipped > 0) {
|
|
436
|
+
console.log(chalk.dim(`Plugin update summary: ${updated} updated, ${skipped} already current, ${failures.length} failed.`));
|
|
437
|
+
}
|
|
438
|
+
if (failures.length > 0) {
|
|
439
|
+
throw new Error(`Failed to update plugin(s):\n ${failures.join("\n ")}`);
|
|
440
|
+
}
|
|
441
|
+
});
|
|
442
|
+
plugin
|
|
443
|
+
.command("uninstall")
|
|
444
|
+
.description("Remove a plugin from the current config")
|
|
445
|
+
.argument("<reference>", "Installed plugin name, package name, or local path")
|
|
446
|
+
.action((reference) => {
|
|
447
|
+
const configPath = findConfigFile();
|
|
448
|
+
if (!configPath) {
|
|
449
|
+
throw new Error("No agent-orchestrator.yaml found. Run 'athene start' first.");
|
|
450
|
+
}
|
|
451
|
+
const config = loadConfig(configPath);
|
|
452
|
+
const nextPlugins = (config.plugins ?? []).filter((plugin) => {
|
|
453
|
+
return !matchesPluginReference(plugin, reference);
|
|
454
|
+
});
|
|
455
|
+
if (nextPlugins.length === (config.plugins ?? []).length) {
|
|
456
|
+
throw new Error(`Plugin ${reference} is not installed in this config`);
|
|
457
|
+
}
|
|
458
|
+
writePluginsConfig(configPath, nextPlugins);
|
|
459
|
+
console.log(chalk.green(`Removed ${reference} from ${configPath}`));
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,2BAA2B,EAC3B,UAAU,GAIX,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,gCAAgC,EAChC,4BAA4B,EAC5B,uBAAuB,EACvB,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,SAAS,mBAAmB,CAC1B,OAAgC,EAChC,UAAiC;IAEjC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QAC7B,IAAI,UAAU,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC7E,IAAI,UAAU,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACpE,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAgC,EAChC,UAAiC;IAEjC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,OAAO,EAAE,UAAU,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAClG,CAAC;AAED,SAAS,kBAAkB,CAAC,UAAkB,EAAE,OAAgC;IAC9E,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,8DAA8D;IAC9D,MAAM,SAAS,GAAI,GAAG,CAAC,IAAI,EAA0B,IAAI,EAAE,CAAC;IAC5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC,OAAO,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;IAC9B,CAAC;IACD,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,UAAU,CAC3B,2BAA2B,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAC3D,CAAC;IACzB,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,GAAG,UAAU,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAClE,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA6B,EAAE,SAAiB;IAC9E,MAAM,iBAAiB,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC3D,OAAO,CACL,MAAM,CAAC,IAAI,KAAK,SAAS;QACzB,MAAM,CAAC,OAAO,KAAK,SAAS;QAC5B,MAAM,CAAC,IAAI,KAAK,SAAS;QACzB,CAAC,iBAAiB,KAAK,SAAS;YAC9B,CAAC,MAAM,CAAC,OAAO,KAAK,iBAAiB,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAC1F,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,6BAA6B,CAC1C,WAAmB,EACnB,eAA8B;IAE9B,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,uBAAuB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,MAAM,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAiC,EAAE,UAAkB;IACjF,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,OAAO,aAAa,UAAU,CAAC,IAAI,GAAG,OAAO,KAAK,UAAU,CAAC,MAAM,UAAU,UAAU,EAAE,CAAC;AAC5F,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,MAA0B,EAC1B,UAAiC,EACjC,SAAiB;IAEjB,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACzD,OAAO,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,eAAe,GAAG,2BAA2B,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACxE,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,MAAM,uBAAuB,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QAC/F,gBAAgB,GAAG,IAAI,CAAC;QACxB,OAAO,MAAM,sBAAsB,CACjC,MAAM,EACN,EAAE,GAAG,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAC5C,UAAU,CAAC,OAAO,CACnB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,6BAA6B,CAAC,UAAU,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YAC3E,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,eAAe,GACnB,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC3E,MAAM,IAAI,KAAK,CACb,GAAG,OAAO,yBAAyB,UAAU,CAAC,OAAO,KAAK,eAAe,EAAE,EAC3E,EAAE,KAAK,EAAE,WAAW,EAAE,CACvB,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,MAA6B;IAC/D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,UAAU,MAAM,CAAC,IAAI,+DAA+D,CACrF,CAAC;IACJ,CAAC;IAED,MAAM,iBAAiB,GACrB,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9E,IAAI,iBAAiB,EAAE,aAAa,EAAE,CAAC;QACrC,OAAO,iBAAiB,CAAC,aAAa,CAAC;IACzC,CAAC;IAED,OAAO,gCAAgC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC1D,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,UAAkB,EAClB,MAA0B,EAC1B,MAA6B;IAE7B,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CACb,UAAU,MAAM,CAAC,IAAI,4DAA4D,CAClF,CAAC;IACJ,CAAC;IAED,MAAM,cAAc,GAAG,2BAA2B,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC;IAC7F,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEzD,IAAI,cAAc,KAAK,aAAa,EAAE,CAAC;QACrC,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,IAAI,cAAc,EAAE,CAAC;YACxD,kBAAkB,CAChB,UAAU,EACV,qBAAqB,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CACpF,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,2BAA2B,aAAa,IAAI,CAAC,CAAC,CAAC;QACnF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,eAAe,GAAG,2BAA2B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpE,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACtF,gBAAgB,GAAG,IAAI,CAAC;QACxB,MAAM,kBAAkB,GAAG,MAAM,sBAAsB,CACrD,MAAM,EACN,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,EACxC,MAAM,CAAC,OAAO,CACf,CAAC;QACF,kBAAkB,CAAC,UAAU,EAAE,qBAAqB,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CACT,WAAW,kBAAkB,CAAC,IAAI,SAAS,cAAc,IAAI,eAAe,OAAO,gBAAgB,EAAE,CACtG,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,6BAA6B,CAAC,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;YACvE,CAAC;YAAC,OAAO,WAAW,EAAE,CAAC;gBACrB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,eAAe,GACnB,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC3E,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,yBAAyB,MAAM,CAAC,OAAO,KAAK,eAAe,EAAE,EAAE;oBACvF,KAAK,EAAE,WAAW;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,MAA0B,EAC1B,UAAiC,EACjC,SAAiB;IAEjB,MAAM,QAAQ,GAAG,6BAA6B,CAAC,MAAM,4BAA4B,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9F,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,oCAAoC,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,oBAAoB,GAA0B;QAClD,GAAG,UAAU;QACb,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;KAC7B,CAAC;IAEF,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,MAAM,UAAU,GAAuB;QACrC,GAAG,MAAM;QACT,OAAO,EAAE,qBAAqB,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,oBAAoB,CAAC;KAC3E,CAAC;IACF,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAClC,OAAO,CAAC,IAAI,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAC;IAC1E,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;IAC9B,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChF,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,UAAU,QAAQ,CAAC,QAAQ,CAAC,IAAI,8DAA8D,CAC/F,CAAC;IACJ,CAAC;IAED,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,SAAS,0BAA0B,CACjC,MAAiC,EACjC,aAAsB,EACtB,OAAkD,EAClD,UAAmB;IAEnB,MAAM,SAAS,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IAExC,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,UAAU;YACzB,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;gBACrB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC9E,OAAO,KAAK,EAAE,IAAI,KAAK,UAAU,CAAC;YACpC,CAAC,CAAC;YACJ,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,UAAU;gBACR,CAAC,CAAC,mCAAmC,UAAU,IAAI;gBACnD,CAAC,CAAC,0CAA0C,CAC/C,CACF,CAAC;YACF,OAAO;QACT,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACxE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,EAAE,EAAE,CAAC,EAAE,CACtG,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAE5F,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,UAAU;YACR,CAAC,CAAC,qCAAqC,UAAU,IAAI;YACrD,CAAC,CAAC,+BAA+B,CACpC,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAChC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,CACxE,CAAC;QACF,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,8BAA8B,CAAC,CAAC;IAErF,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,aAAa,EAAE,mDAAmD,CAAC;SAC1E,MAAM,CAAC,eAAe,EAAE,uDAAuD,CAAC;SAChF,MAAM,CAAC,WAAW,EAAE,kEAAkE,CAAC;SACvF,MAAM,CAAC,KAAK,EAAE,IAA+D,EAAE,EAAE;QAChF,IAAI,MAAM,GAA8B,IAAI,CAAC;QAC7C,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QACpC,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,OAAO,GACX,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,yBAAyB,EAAE,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC;QACvF,0BAA0B,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wCAAwC,CAAC;SACrD,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;SAClC,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE;QACxB,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YACzD,OAAO,CACL,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACjD,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;gBACtD,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,CACpD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mCAAmC,KAAK,IAAI,CAAC,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,QAAQ,CAAC,aAAa,EAAE,qCAAqC,CAAC;SAC9D,MAAM,CAAC,eAAe,EAAE,qBAAqB,CAAC;SAC9C,MAAM,CACL,eAAe,EACf,gFAAgF,CACjF;SACA,MAAM,CAAC,6BAA6B,EAAE,0BAA0B,CAAC;SACjE,MAAM,CAAC,mBAAmB,EAAE,gBAAgB,CAAC;SAC7C,MAAM,CAAC,8BAA8B,EAAE,kBAAkB,CAAC;SAC1D,MAAM,CAAC,mBAAmB,EAAE,8DAA8D,CAAC;SAC3F,MAAM,CACL,KAAK,EACH,SAA6B,EAC7B,IAOC,EACD,EAAE;QACF,MAAM,WAAW,GAAiB;YAChC,SAAS;YACT,OAAO;YACP,WAAW;YACX,SAAS;YACT,KAAK;YACL,UAAU;YACV,UAAU;SACX,CAAC;QACF,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC;QAC1E,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,IAAI,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACnC,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC3E,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAEnC,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC7C,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;YAEjE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;oBAC7B,OAAO,EAAE,sBAAsB;oBAC/B,WAAW,EAAE,WAAW;oBACxB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;wBAClB,IAAI,CAAC,KAAK;4BAAE,OAAO,yBAAyB,CAAC;wBAC7C,IAAI,CAAC;4BACH,mBAAmB,CAAC,KAAK,CAAC,CAAC;wBAC7B,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAC1D,CAAC;oBACH,CAAC;iBACF,CAAC,CAAC;gBACH,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,IAAI,GAAG,KAAe,CAAC;YACzB,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;oBAC/B,OAAO,EAAE,cAAc;oBACvB,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;iBAClF,CAAC,CAAC;gBACH,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,IAAI,GAAG,KAAmB,CAAC;YAC7B,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;oBAC7B,OAAO,EAAE,oBAAoB;oBAC7B,WAAW,EAAE,MAAM,IAAI,SAAS;oBAChC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,SAAS,CAAC;iBACtE,CAAC,CAAC;gBACH,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,WAAW,GAAG,KAAe,CAAC;YAChC,CAAC;YAED,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;oBAC7B,OAAO,EAAE,SAAS;oBAClB,WAAW,EAAE,WAAW;iBACzB,CAAC,CAAC;gBACH,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,GAAI,KAAgB,IAAI,SAAS,CAAC;YAC1C,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC;oBAC7B,OAAO,EAAE,eAAe;oBACxB,YAAY,EAAE,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC;oBACjD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,SAAS,CAAC;iBACvE,CAAC,CAAC;gBACH,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC1B,KAAK,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;oBAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBACD,WAAW,GAAG,KAAe,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAE/D,MAAM,eAAe,GAAG,wBAAwB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,cAAc,CAAC;YAChC,MAAM;YACN,WAAW;YACX,SAAS,EAAE,eAAe;YAC1B,WAAW,EAAE,IAAI;YACjB,WAAW,EAAE,WAAW,IAAI,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC;YAC/D,IAAI;SACL,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,WAAW,IAAI,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;IACjE,CAAC,CACF,CAAC;IAEJ,MAAM;SACH,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,0CAA0C,CAAC;SACvD,QAAQ,CAAC,aAAa,EAAE,6CAA6C,CAAC;SACtE,MAAM,CACL,aAAa,EACb,0EAA0E,CAC3E;SACA,MAAM,CACL,iBAAiB,EACjB,2FAA2F,CAC5F;SACA,MAAM,CACL,+BAA+B,EAC/B,oGAAoG,CACrG;SACA,MAAM,CACL,KAAK,EACH,SAAiB,EACjB,IAAmE,EACnE,EAAE;QACF,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,qBAAqB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAC5F,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACtF,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,qBAAqB,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;QAC/E,kBAAkB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAE5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QAE/E,IAAI,WAAW,KAAK,gBAAgB,EAAE,CAAC;YACrC,iEAAiE;YACjE,kEAAkE;YAClE,kDAAkD;YAClD,IAAI,CAAC;gBACH,MAAM,cAAc,CAAC;oBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;iBAC5C,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,2DAA2D;gBAC3D,8DAA8D;gBAC9D,kBAAkB,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;gBACzE,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC,CACF,CAAC;IAEJ,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wDAAwD,CAAC;SACrE,QAAQ,CAAC,aAAa,EAAE,wDAAwD,CAAC;SACjF,MAAM,CAAC,OAAO,EAAE,4DAA4D,CAAC;SAC7E,MAAM,CAAC,KAAK,EAAE,SAA6B,EAAE,IAAuB,EAAE,EAAE;QACvE,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,cAAc,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;QAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG;YACtB,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,IAAI,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;QAE9F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,GAAG;gBACN,CAAC,CAAC,8DAA8D;gBAChE,CAAC,CAAC,UAAU,SAAS,kCAAkC,CAC1D,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBACrE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,OAAO,EAAE,CAAC;gBACZ,CAAC;gBACD,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QAED,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,0BAA0B,OAAO,aAAa,OAAO,qBAAqB,QAAQ,CAAC,MAAM,UAAU,CACpG,CACF,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,yCAAyC,CAAC;SACtD,QAAQ,CAAC,aAAa,EAAE,oDAAoD,CAAC;SAC7E,MAAM,CAAC,CAAC,SAAiB,EAAE,EAAE;QAC5B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;YAC3D,OAAO,CAAC,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,kCAAkC,CAAC,CAAC;QACzE,CAAC;QAED,kBAAkB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,SAAS,SAAS,UAAU,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgK7D"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { basename, resolve } from "node:path";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { getPortfolio, getPortfolioSessionCounts, isPortfolioEnabled, recordActivityEvent, registerProject, unregisterProject, loadPreferences, savePreferences, loadLocalProjectConfig, loadConfig, } from "@made-by-moonlight/athene-core";
|
|
5
|
+
import { formatPortfolioDegradedReason, formatPortfolioProjectName, formatPortfolioProjectStatus, } from "../lib/portfolio-display.js";
|
|
6
|
+
function assertPortfolioEnabled() {
|
|
7
|
+
if (isPortfolioEnabled())
|
|
8
|
+
return;
|
|
9
|
+
console.error(chalk.red("Portfolio mode is disabled. Unset AO_ENABLE_PORTFOLIO or set it to 1 to use `athene project`."));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
export function registerProjectCommand(program) {
|
|
13
|
+
const project = program.command("project").description("Manage portfolio projects");
|
|
14
|
+
// athene project ls
|
|
15
|
+
project
|
|
16
|
+
.command("ls")
|
|
17
|
+
.description("List all portfolio projects")
|
|
18
|
+
.action(async () => {
|
|
19
|
+
assertPortfolioEnabled();
|
|
20
|
+
const portfolio = getPortfolio();
|
|
21
|
+
if (portfolio.length === 0) {
|
|
22
|
+
console.log(chalk.dim("No projects in portfolio."));
|
|
23
|
+
console.log(chalk.dim("Run `athene start` in a project or `athene project add <path>` to register one."));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const counts = await getPortfolioSessionCounts(portfolio);
|
|
27
|
+
const prefs = loadPreferences();
|
|
28
|
+
console.log(chalk.bold("\nPortfolio Projects\n"));
|
|
29
|
+
for (const p of portfolio) {
|
|
30
|
+
const count = counts[p.id] || { total: 0, active: 0 };
|
|
31
|
+
const isDefault = prefs.defaultProjectId === p.id;
|
|
32
|
+
const status = formatPortfolioProjectStatus(p, count);
|
|
33
|
+
const pin = p.pinned ? chalk.yellow("*") : " ";
|
|
34
|
+
const def = isDefault ? chalk.cyan(" (default)") : "";
|
|
35
|
+
const name = formatPortfolioProjectName(p);
|
|
36
|
+
const degradedReason = formatPortfolioDegradedReason(p);
|
|
37
|
+
console.log(` ${pin} ${chalk.bold(p.id)}${name}${def}`);
|
|
38
|
+
console.log(` ${status} | ${count.total} sessions | ${chalk.dim(p.source)}`);
|
|
39
|
+
if (degradedReason) {
|
|
40
|
+
console.log(` ${degradedReason}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
console.log();
|
|
44
|
+
});
|
|
45
|
+
// athene project add <path>
|
|
46
|
+
project
|
|
47
|
+
.command("add <path>")
|
|
48
|
+
.description("Register a project path in the portfolio")
|
|
49
|
+
.option("-k, --key <key>", "Legacy only: the project key under `projects:` in a wrapped agent-orchestrator.yaml. Omit for flat configs.")
|
|
50
|
+
.option("--default", "Use the default project ID, adding a numeric suffix if needed")
|
|
51
|
+
.action(async (path, opts) => {
|
|
52
|
+
assertPortfolioEnabled();
|
|
53
|
+
const resolvedPath = resolve(path);
|
|
54
|
+
const candidatePaths = [
|
|
55
|
+
resolve(resolvedPath, "agent-orchestrator.yaml"),
|
|
56
|
+
resolve(resolvedPath, "agent-orchestrator.yml"),
|
|
57
|
+
];
|
|
58
|
+
if (!loadLocalProjectConfig(resolvedPath)) {
|
|
59
|
+
const existingConfigPath = candidatePaths.find((candidate) => existsSync(candidate));
|
|
60
|
+
if (!existingConfigPath) {
|
|
61
|
+
recordActivityEvent({
|
|
62
|
+
source: "cli",
|
|
63
|
+
kind: "cli.project_register_failed",
|
|
64
|
+
level: "warn",
|
|
65
|
+
summary: `athene project add: no agent-orchestrator config found`,
|
|
66
|
+
data: { resolvedPath, reason: "no_config_found" },
|
|
67
|
+
});
|
|
68
|
+
console.error(chalk.red(`No agent-orchestrator.yaml found at ${resolvedPath}`));
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
try {
|
|
72
|
+
loadConfig(existingConfigPath);
|
|
73
|
+
recordActivityEvent({
|
|
74
|
+
source: "cli",
|
|
75
|
+
kind: "cli.project_register_failed",
|
|
76
|
+
level: "warn",
|
|
77
|
+
summary: `athene project add: found old-format config requiring migration`,
|
|
78
|
+
data: {
|
|
79
|
+
resolvedPath,
|
|
80
|
+
configPath: existingConfigPath,
|
|
81
|
+
reason: "old_format",
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
console.error(chalk.red(`Found old-format config at ${existingConfigPath}. Run \`athene start\` in that project to migrate it before using \`athene project add\`.`));
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
recordActivityEvent({
|
|
88
|
+
source: "cli",
|
|
89
|
+
kind: "cli.project_register_failed",
|
|
90
|
+
level: "error",
|
|
91
|
+
summary: `athene project add: config load failed`,
|
|
92
|
+
data: {
|
|
93
|
+
resolvedPath,
|
|
94
|
+
configPath: existingConfigPath,
|
|
95
|
+
reason: "load_error",
|
|
96
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
console.error(chalk.red(`Found agent-orchestrator config at ${existingConfigPath}, but it could not be loaded: ${error instanceof Error ? error.message : String(error)}`));
|
|
100
|
+
}
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
let projectId = opts.key;
|
|
104
|
+
if (!projectId) {
|
|
105
|
+
projectId = basename(resolvedPath) || "project";
|
|
106
|
+
}
|
|
107
|
+
const effectiveId = registerProject(resolvedPath, projectId, basename(resolvedPath) || projectId);
|
|
108
|
+
console.log(chalk.green(`Registered project "${effectiveId}" at ${resolvedPath}`));
|
|
109
|
+
});
|
|
110
|
+
// athene project rm <id>
|
|
111
|
+
project
|
|
112
|
+
.command("rm <id>")
|
|
113
|
+
.description("Remove a project from the portfolio")
|
|
114
|
+
.action((id) => {
|
|
115
|
+
assertPortfolioEnabled();
|
|
116
|
+
const portfolio = getPortfolio();
|
|
117
|
+
const found = portfolio.find((p) => p.id === id);
|
|
118
|
+
if (!found) {
|
|
119
|
+
console.error(chalk.red(`Project "${id}" not found in portfolio`));
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
unregisterProject(id);
|
|
123
|
+
console.log(chalk.green(`Removed project "${id}" from portfolio`));
|
|
124
|
+
});
|
|
125
|
+
// athene project set-default <id>
|
|
126
|
+
project
|
|
127
|
+
.command("set-default <id>")
|
|
128
|
+
.description("Set the default project for the portfolio")
|
|
129
|
+
.action((id) => {
|
|
130
|
+
assertPortfolioEnabled();
|
|
131
|
+
const portfolio = getPortfolio();
|
|
132
|
+
const found = portfolio.find((p) => p.id === id);
|
|
133
|
+
if (!found) {
|
|
134
|
+
console.error(chalk.red(`Project "${id}" not found in portfolio`));
|
|
135
|
+
process.exit(1);
|
|
136
|
+
}
|
|
137
|
+
const prefs = loadPreferences();
|
|
138
|
+
prefs.defaultProjectId = id;
|
|
139
|
+
savePreferences(prefs);
|
|
140
|
+
console.log(chalk.green(`Set default project to "${id}"`));
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=project.js.map
|