@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,206 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { join, dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
5
|
+
const __dirname = dirname(__filename);
|
|
6
|
+
export function detectProjectType(dir) {
|
|
7
|
+
const hasFile = (name) => existsSync(join(dir, name));
|
|
8
|
+
const readJson = (name) => {
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(readFileSync(join(dir, name), "utf-8"));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const type = {
|
|
17
|
+
languages: [],
|
|
18
|
+
frameworks: [],
|
|
19
|
+
tools: [],
|
|
20
|
+
};
|
|
21
|
+
// JavaScript/TypeScript detection
|
|
22
|
+
if (hasFile("package.json")) {
|
|
23
|
+
const pkg = readJson("package.json");
|
|
24
|
+
if (hasFile("tsconfig.json") ||
|
|
25
|
+
hasFile("tsconfig.base.json") ||
|
|
26
|
+
pkg?.devDependencies?.typescript) {
|
|
27
|
+
type.languages.push("typescript");
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
type.languages.push("javascript");
|
|
31
|
+
}
|
|
32
|
+
// Detect frameworks
|
|
33
|
+
if (pkg?.dependencies?.react || pkg?.devDependencies?.react) {
|
|
34
|
+
type.frameworks.push("react");
|
|
35
|
+
}
|
|
36
|
+
if (pkg?.dependencies?.next || pkg?.devDependencies?.next) {
|
|
37
|
+
type.frameworks.push("nextjs");
|
|
38
|
+
}
|
|
39
|
+
if (pkg?.dependencies?.vue || pkg?.devDependencies?.vue) {
|
|
40
|
+
type.frameworks.push("vue");
|
|
41
|
+
}
|
|
42
|
+
if (pkg?.dependencies?.express || pkg?.devDependencies?.express) {
|
|
43
|
+
type.frameworks.push("express");
|
|
44
|
+
}
|
|
45
|
+
// Detect test framework
|
|
46
|
+
if (pkg?.devDependencies?.vitest) {
|
|
47
|
+
type.testFramework = "vitest";
|
|
48
|
+
}
|
|
49
|
+
else if (pkg?.devDependencies?.jest) {
|
|
50
|
+
type.testFramework = "jest";
|
|
51
|
+
}
|
|
52
|
+
else if (pkg?.devDependencies?.mocha) {
|
|
53
|
+
type.testFramework = "mocha";
|
|
54
|
+
}
|
|
55
|
+
// Detect package manager
|
|
56
|
+
if (hasFile("pnpm-lock.yaml") || hasFile("pnpm-workspace.yaml")) {
|
|
57
|
+
type.packageManager = "pnpm";
|
|
58
|
+
if (hasFile("pnpm-workspace.yaml")) {
|
|
59
|
+
type.tools.push("pnpm-workspaces");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else if (hasFile("yarn.lock")) {
|
|
63
|
+
type.packageManager = "yarn";
|
|
64
|
+
}
|
|
65
|
+
else if (hasFile("package-lock.json")) {
|
|
66
|
+
type.packageManager = "npm";
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Python detection
|
|
70
|
+
if (hasFile("pyproject.toml") || hasFile("requirements.txt") || hasFile("setup.py")) {
|
|
71
|
+
type.languages.push("python");
|
|
72
|
+
if (hasFile("pyproject.toml")) {
|
|
73
|
+
type.tools.push("pyproject");
|
|
74
|
+
}
|
|
75
|
+
// Detect Python frameworks (check both files but avoid duplicates)
|
|
76
|
+
const reqFiles = ["requirements.txt", "pyproject.toml"];
|
|
77
|
+
const addFramework = (framework) => {
|
|
78
|
+
if (!type.frameworks.includes(framework)) {
|
|
79
|
+
type.frameworks.push(framework);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
for (const file of reqFiles) {
|
|
83
|
+
if (hasFile(file)) {
|
|
84
|
+
const content = readFileSync(join(dir, file), "utf-8").toLowerCase();
|
|
85
|
+
if (content.includes("fastapi"))
|
|
86
|
+
addFramework("fastapi");
|
|
87
|
+
if (content.includes("django"))
|
|
88
|
+
addFramework("django");
|
|
89
|
+
if (content.includes("flask"))
|
|
90
|
+
addFramework("flask");
|
|
91
|
+
if (content.includes("pytest") && !type.testFramework) {
|
|
92
|
+
type.testFramework = "pytest";
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Go detection
|
|
98
|
+
if (hasFile("go.mod")) {
|
|
99
|
+
type.languages.push("go");
|
|
100
|
+
}
|
|
101
|
+
// Rust detection
|
|
102
|
+
if (hasFile("Cargo.toml")) {
|
|
103
|
+
type.languages.push("rust");
|
|
104
|
+
}
|
|
105
|
+
return type;
|
|
106
|
+
}
|
|
107
|
+
export function generateRulesFromTemplates(projectType) {
|
|
108
|
+
const templatesDir = join(__dirname, "../..", "templates", "rules");
|
|
109
|
+
const rules = [];
|
|
110
|
+
// Always include base rules (if available)
|
|
111
|
+
const basePath = join(templatesDir, "base.md");
|
|
112
|
+
if (existsSync(basePath)) {
|
|
113
|
+
const baseRules = readFileSync(basePath, "utf-8");
|
|
114
|
+
rules.push(baseRules.trim());
|
|
115
|
+
}
|
|
116
|
+
// Add language-specific rules
|
|
117
|
+
for (const lang of projectType.languages) {
|
|
118
|
+
const templatePath = join(templatesDir, `${lang}.md`);
|
|
119
|
+
if (existsSync(templatePath)) {
|
|
120
|
+
const langRules = readFileSync(templatePath, "utf-8");
|
|
121
|
+
rules.push(langRules.trim());
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Add framework-specific rules
|
|
125
|
+
for (const framework of projectType.frameworks) {
|
|
126
|
+
const templatePath = join(templatesDir, `${framework}.md`);
|
|
127
|
+
if (existsSync(templatePath)) {
|
|
128
|
+
const frameworkRules = readFileSync(templatePath, "utf-8");
|
|
129
|
+
rules.push(frameworkRules.trim());
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Add tool-specific rules
|
|
133
|
+
for (const tool of projectType.tools) {
|
|
134
|
+
const templatePath = join(templatesDir, `${tool}.md`);
|
|
135
|
+
if (existsSync(templatePath)) {
|
|
136
|
+
const toolRules = readFileSync(templatePath, "utf-8");
|
|
137
|
+
rules.push(toolRules.trim());
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Add test commands based on detected tools
|
|
141
|
+
const testCommands = generateTestCommands(projectType);
|
|
142
|
+
if (testCommands) {
|
|
143
|
+
rules.push(testCommands);
|
|
144
|
+
}
|
|
145
|
+
return rules.join("\n\n");
|
|
146
|
+
}
|
|
147
|
+
function generateTestCommands(projectType) {
|
|
148
|
+
const commands = [];
|
|
149
|
+
if (projectType.languages.includes("typescript") ||
|
|
150
|
+
projectType.languages.includes("javascript")) {
|
|
151
|
+
const pm = projectType.packageManager || "npm";
|
|
152
|
+
commands.push(`Before pushing, run these commands:`);
|
|
153
|
+
if (projectType.tools.includes("pnpm-workspaces")) {
|
|
154
|
+
commands.push(`- ${pm} build (build all packages)`);
|
|
155
|
+
commands.push(`- ${pm} typecheck (type check all packages)`);
|
|
156
|
+
commands.push(`- ${pm} lint (or ${pm} lint:fix to auto-fix)`);
|
|
157
|
+
if (projectType.testFramework) {
|
|
158
|
+
commands.push(`- ${pm} test (run all tests)`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
if (projectType.languages.includes("typescript")) {
|
|
163
|
+
commands.push(`- ${pm} run typecheck`);
|
|
164
|
+
}
|
|
165
|
+
commands.push(`- ${pm} run lint`);
|
|
166
|
+
if (projectType.testFramework) {
|
|
167
|
+
commands.push(`- ${pm} test`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else if (projectType.languages.includes("python")) {
|
|
172
|
+
commands.push(`Before pushing, run these commands:`);
|
|
173
|
+
if (projectType.testFramework === "pytest") {
|
|
174
|
+
commands.push(`- pytest (run tests)`);
|
|
175
|
+
}
|
|
176
|
+
commands.push(`- black . (format code)`);
|
|
177
|
+
commands.push(`- mypy . (type checking)`);
|
|
178
|
+
}
|
|
179
|
+
else if (projectType.languages.includes("go")) {
|
|
180
|
+
commands.push(`Before pushing, run these commands:`);
|
|
181
|
+
commands.push(`- go test ./... (run tests)`);
|
|
182
|
+
commands.push(`- go vet ./... (check for issues)`);
|
|
183
|
+
commands.push(`- gofmt -w . (format code)`);
|
|
184
|
+
}
|
|
185
|
+
return commands.length > 0 ? commands.join("\n") : "";
|
|
186
|
+
}
|
|
187
|
+
export function formatProjectTypeForDisplay(projectType) {
|
|
188
|
+
const parts = [];
|
|
189
|
+
if (projectType.languages.length > 0) {
|
|
190
|
+
parts.push(`Languages: ${projectType.languages.join(", ")}`);
|
|
191
|
+
}
|
|
192
|
+
if (projectType.frameworks.length > 0) {
|
|
193
|
+
parts.push(`Frameworks: ${projectType.frameworks.join(", ")}`);
|
|
194
|
+
}
|
|
195
|
+
if (projectType.packageManager) {
|
|
196
|
+
parts.push(`Package Manager: ${projectType.packageManager}`);
|
|
197
|
+
}
|
|
198
|
+
if (projectType.testFramework) {
|
|
199
|
+
parts.push(`Test Framework: ${projectType.testFramework}`);
|
|
200
|
+
}
|
|
201
|
+
if (projectType.tools.length > 0) {
|
|
202
|
+
parts.push(`Tools: ${projectType.tools.join(", ")}`);
|
|
203
|
+
}
|
|
204
|
+
return parts.join("\n");
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=project-detection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-detection.js","sourceRoot":"","sources":["../../src/lib/project-detection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface ProjectWithPath {
|
|
2
|
+
path: string;
|
|
3
|
+
}
|
|
4
|
+
/**
|
|
5
|
+
* Find the best matching project for the current directory.
|
|
6
|
+
* When multiple project paths contain the cwd, prefer the deepest match.
|
|
7
|
+
*/
|
|
8
|
+
export declare function findProjectForDirectory<T extends ProjectWithPath>(projects: Record<string, T>, currentDir: string): string | null;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=project-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-resolution.d.ts","sourceRoot":"","sources":["../../src/lib/project-resolution.ts"],"names":[],"mappings":"AAEA,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AAOD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,SAAS,eAAe,EAC/D,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAC3B,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAQf"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { isAbsolute, relative, resolve } from "node:path";
|
|
2
|
+
function isWithinProject(projectPath, currentDir) {
|
|
3
|
+
const relativePath = relative(projectPath, currentDir);
|
|
4
|
+
return relativePath === "" || (!relativePath.startsWith("..") && !isAbsolute(relativePath));
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Find the best matching project for the current directory.
|
|
8
|
+
* When multiple project paths contain the cwd, prefer the deepest match.
|
|
9
|
+
*/
|
|
10
|
+
export function findProjectForDirectory(projects, currentDir) {
|
|
11
|
+
const resolvedCurrentDir = resolve(currentDir);
|
|
12
|
+
const matches = Object.entries(projects)
|
|
13
|
+
.filter(([, project]) => isWithinProject(resolve(project.path), resolvedCurrentDir))
|
|
14
|
+
.sort(([, a], [, b]) => resolve(b.path).length - resolve(a.path).length);
|
|
15
|
+
return matches[0]?.[0] ?? null;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=project-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-resolution.js","sourceRoot":"","sources":["../../src/lib/project-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAM1D,SAAS,eAAe,CAAC,WAAmB,EAAE,UAAkB;IAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACvD,OAAO,YAAY,KAAK,EAAE,IAAI,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAA2B,EAC3B,UAAkB;IAElB,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;SACrC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAC;SACnF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;IAE3E,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
interface SupervisorHandle {
|
|
2
|
+
stop: () => void;
|
|
3
|
+
reconcileNow: () => Promise<void>;
|
|
4
|
+
}
|
|
5
|
+
export interface ReconcileProjectSupervisorOptions {
|
|
6
|
+
intervalMs?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Resolved config path from the caller (typically `athene start`). When the
|
|
9
|
+
* global config is missing, this is used as the explicit local-fallback
|
|
10
|
+
* source. Without it the supervisor would fall back to a cwd-walk via
|
|
11
|
+
* bare `loadConfig()`, which misses configs in `athene start <url>` /
|
|
12
|
+
* `athene start <path>` first-run flows — there the resolved config can
|
|
13
|
+
* live under the clone/target path while the daemon's cwd is somewhere
|
|
14
|
+
* else. A bare cwd-walk in that case throws ConfigNotFoundError, which
|
|
15
|
+
* `run()` silently swallows, leaving `running.projects` empty.
|
|
16
|
+
*/
|
|
17
|
+
configPath?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface StartProjectSupervisorOptions {
|
|
20
|
+
intervalMs?: number;
|
|
21
|
+
/** See {@link ReconcileProjectSupervisorOptions.configPath}. */
|
|
22
|
+
configPath?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare function reconcileProjectSupervisor(options?: ReconcileProjectSupervisorOptions): Promise<void>;
|
|
25
|
+
export declare function startProjectSupervisor(options?: StartProjectSupervisorOptions): Promise<SupervisorHandle>;
|
|
26
|
+
export declare function stopProjectSupervisor(): void;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=project-supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-supervisor.d.ts","sourceRoot":"","sources":["../../src/lib/project-supervisor.ts"],"names":[],"mappings":"AAoBA,UAAU,gBAAgB;IACxB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAWD,MAAM,WAAW,iCAAiC;IAChD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAgED,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,IAAI,CAAC,CAsDf;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,gBAAgB,CAAC,CA8D3B;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { loadConfig, getGlobalConfigPath, isTerminalSession, createCorrelationId, createProjectObserver, ConfigNotFoundError, } from "@made-by-moonlight/athene-core";
|
|
2
|
+
import { getSessionManager } from "./create-session-manager.js";
|
|
3
|
+
import { ensureLifecycleWorker, listLifecycleWorkers, stopLifecycleWorker, } from "./lifecycle-service.js";
|
|
4
|
+
import { addProjectToRunning, removeProjectFromRunning } from "./running-state.js";
|
|
5
|
+
const DEFAULT_SUPERVISOR_INTERVAL_MS = 60_000;
|
|
6
|
+
let activeSupervisor = null;
|
|
7
|
+
function isMissingConfigError(error) {
|
|
8
|
+
if (error instanceof ConfigNotFoundError)
|
|
9
|
+
return true;
|
|
10
|
+
return (error instanceof Error &&
|
|
11
|
+
"code" in error &&
|
|
12
|
+
error.code === "ENOENT" &&
|
|
13
|
+
"path" in error &&
|
|
14
|
+
error.path === getGlobalConfigPath());
|
|
15
|
+
}
|
|
16
|
+
/** Load the supervisor config: prefer the global registry, fall back to the
|
|
17
|
+
* caller-resolved local config path (or cwd discovery when none provided).
|
|
18
|
+
* Returns the source so callers can gate authoritative actions (like the
|
|
19
|
+
* detach pass) on whether we're looking at the real registry. */
|
|
20
|
+
function loadSupervisorConfig(configPath) {
|
|
21
|
+
const globalConfigPath = getGlobalConfigPath();
|
|
22
|
+
try {
|
|
23
|
+
return { config: loadConfig(globalConfigPath), source: "global" };
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
if (error instanceof Error &&
|
|
27
|
+
"code" in error &&
|
|
28
|
+
error.code === "ENOENT" &&
|
|
29
|
+
"path" in error &&
|
|
30
|
+
error.path === globalConfigPath) {
|
|
31
|
+
const config = configPath ? loadConfig(configPath) : loadConfig();
|
|
32
|
+
return { config, source: "local-fallback" };
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function reportProjectSupervisorError(observer, projectId, reason, error) {
|
|
38
|
+
observer.setHealth({
|
|
39
|
+
surface: "project-supervisor.reconcile",
|
|
40
|
+
status: "warn",
|
|
41
|
+
projectId,
|
|
42
|
+
correlationId: createCorrelationId("project-supervisor"),
|
|
43
|
+
reason,
|
|
44
|
+
details: {
|
|
45
|
+
projectId,
|
|
46
|
+
error: error instanceof Error ? error.message : String(error),
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
async function projectHasNonTerminalSession(config, projectId) {
|
|
51
|
+
const sm = await getSessionManager(config);
|
|
52
|
+
const sessions = await sm.list(projectId);
|
|
53
|
+
return sessions.some((session) => !isTerminalSession(session));
|
|
54
|
+
}
|
|
55
|
+
export async function reconcileProjectSupervisor(options = {}) {
|
|
56
|
+
const { config, source } = loadSupervisorConfig(options.configPath);
|
|
57
|
+
const observer = createProjectObserver(config, "project-supervisor");
|
|
58
|
+
const configuredProjectIds = new Set(Object.keys(config.projects));
|
|
59
|
+
// Only the authoritative global registry can declare a project "removed".
|
|
60
|
+
// On a local fallback (e.g. global config was deleted while the daemon is
|
|
61
|
+
// already supervising multiple projects) the loaded config likely doesn't
|
|
62
|
+
// enumerate every supervised project — running the detach pass would kill
|
|
63
|
+
// unrelated lifecycle workers. Pre-fallback behavior was a no-op on
|
|
64
|
+
// missing global; preserve that property for the detach pass specifically.
|
|
65
|
+
if (source === "global") {
|
|
66
|
+
const activeProjectIds = new Set(listLifecycleWorkers());
|
|
67
|
+
for (const projectId of activeProjectIds) {
|
|
68
|
+
if (!configuredProjectIds.has(projectId)) {
|
|
69
|
+
try {
|
|
70
|
+
stopLifecycleWorker(projectId);
|
|
71
|
+
await removeProjectFromRunning(projectId);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
reportProjectSupervisorError(observer, projectId, "Failed to detach lifecycle worker for removed project", error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
for (const projectId of configuredProjectIds) {
|
|
80
|
+
try {
|
|
81
|
+
const hasNonTerminalSession = await projectHasNonTerminalSession(config, projectId);
|
|
82
|
+
const isAttached = listLifecycleWorkers().includes(projectId);
|
|
83
|
+
if (hasNonTerminalSession) {
|
|
84
|
+
if (!isAttached) {
|
|
85
|
+
await ensureLifecycleWorker(config, projectId, options.intervalMs);
|
|
86
|
+
}
|
|
87
|
+
await addProjectToRunning(projectId);
|
|
88
|
+
}
|
|
89
|
+
else if (isAttached) {
|
|
90
|
+
stopLifecycleWorker(projectId);
|
|
91
|
+
await removeProjectFromRunning(projectId);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
reportProjectSupervisorError(observer, projectId, "Failed to reconcile lifecycle worker for project", error);
|
|
96
|
+
// Best-effort per project: a broken project must not block others from reconciling.
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export async function startProjectSupervisor(options = {}) {
|
|
101
|
+
if (activeSupervisor)
|
|
102
|
+
return activeSupervisor;
|
|
103
|
+
const intervalMs = options.intervalMs ?? DEFAULT_SUPERVISOR_INTERVAL_MS;
|
|
104
|
+
const configPath = options.configPath;
|
|
105
|
+
let reconciling = false;
|
|
106
|
+
let pending = false;
|
|
107
|
+
let stopped = false;
|
|
108
|
+
let waiters = [];
|
|
109
|
+
const run = async (runOptions = {}) => {
|
|
110
|
+
if (stopped)
|
|
111
|
+
return;
|
|
112
|
+
if (reconciling) {
|
|
113
|
+
pending = true;
|
|
114
|
+
return new Promise((resolve) => {
|
|
115
|
+
waiters.push(resolve);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
reconciling = true;
|
|
119
|
+
try {
|
|
120
|
+
do {
|
|
121
|
+
pending = false;
|
|
122
|
+
try {
|
|
123
|
+
await reconcileProjectSupervisor({ intervalMs, configPath });
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
if (isMissingConfigError(error))
|
|
127
|
+
return;
|
|
128
|
+
if (!runOptions.swallowErrors)
|
|
129
|
+
throw error;
|
|
130
|
+
// Best-effort background loop: transient config/state errors should not crash athene start.
|
|
131
|
+
}
|
|
132
|
+
} while (pending && !stopped);
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
reconciling = false;
|
|
136
|
+
const pendingWaiters = waiters;
|
|
137
|
+
waiters = [];
|
|
138
|
+
for (const resolve of pendingWaiters)
|
|
139
|
+
resolve();
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
const timer = setInterval(() => {
|
|
143
|
+
void run({ swallowErrors: true });
|
|
144
|
+
}, intervalMs);
|
|
145
|
+
timer.unref?.();
|
|
146
|
+
const handle = {
|
|
147
|
+
stop: () => {
|
|
148
|
+
stopped = true;
|
|
149
|
+
clearInterval(timer);
|
|
150
|
+
activeSupervisor = null;
|
|
151
|
+
},
|
|
152
|
+
reconcileNow: run,
|
|
153
|
+
};
|
|
154
|
+
activeSupervisor = handle;
|
|
155
|
+
try {
|
|
156
|
+
await run();
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
handle.stop();
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
return handle;
|
|
163
|
+
}
|
|
164
|
+
export function stopProjectSupervisor() {
|
|
165
|
+
activeSupervisor?.stop();
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=project-supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-supervisor.js","sourceRoot":"","sources":["../../src/lib/project-supervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type Option } from "@clack/prompts";
|
|
2
|
+
type SelectOption<T extends string> = Option<T>;
|
|
3
|
+
export declare function promptConfirm(message: string, initialValue?: boolean): Promise<boolean>;
|
|
4
|
+
export declare function promptSelect<T extends string>(message: string, options: SelectOption<T>[], initialValue?: T): Promise<T>;
|
|
5
|
+
export declare function promptText(message: string, placeholder?: string, initialValue?: string): Promise<string>;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,KAAK,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE9E,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;AAEhD,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAO1F;AAED,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,EACjD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,EAC1B,YAAY,CAAC,EAAE,CAAC,GACf,OAAO,CAAC,CAAC,CAAC,CAWZ;AAGD,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAWjB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { confirm, isCancel, select, text } from "@clack/prompts";
|
|
3
|
+
export async function promptConfirm(message, initialValue = true) {
|
|
4
|
+
const result = await confirm({ message, initialValue });
|
|
5
|
+
if (isCancel(result)) {
|
|
6
|
+
console.log(chalk.yellow("\nCancelled."));
|
|
7
|
+
process.exit(0);
|
|
8
|
+
}
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
export async function promptSelect(message, options, initialValue) {
|
|
12
|
+
const result = await select({
|
|
13
|
+
message,
|
|
14
|
+
options,
|
|
15
|
+
...(initialValue !== undefined ? { initialValue } : {}),
|
|
16
|
+
});
|
|
17
|
+
if (isCancel(result)) {
|
|
18
|
+
console.log(chalk.yellow("\nRequest Cancelled."));
|
|
19
|
+
process.exit(0);
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
/* c8 ignore start -- interactive prompt wrapper, same pattern as promptConfirm/promptSelect */
|
|
24
|
+
export async function promptText(message, placeholder, initialValue) {
|
|
25
|
+
const result = await text({
|
|
26
|
+
message,
|
|
27
|
+
...(placeholder ? { placeholder } : {}),
|
|
28
|
+
...(initialValue ? { initialValue } : {}),
|
|
29
|
+
});
|
|
30
|
+
if (isCancel(result)) {
|
|
31
|
+
console.log(chalk.yellow("\nCancelled."));
|
|
32
|
+
process.exit(0);
|
|
33
|
+
}
|
|
34
|
+
return typeof result === "string" ? result : "";
|
|
35
|
+
}
|
|
36
|
+
/* c8 ignore stop */
|
|
37
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAe,MAAM,gBAAgB,CAAC;AAI9E,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,YAAY,GAAG,IAAI;IACtE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;IACxD,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,OAA0B,EAC1B,YAAgB;IAEhB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC;QAC1B,OAAO;QACP,OAAO;QACP,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe,EACf,WAAoB,EACpB,YAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;QACxB,OAAO;QACP,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAClD,CAAC;AACD,oBAAoB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for repository detection and validation.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Extract owner/repo from a git remote URL.
|
|
6
|
+
* Returns null if the remote doesn't match a known host (github.com, gitlab.com).
|
|
7
|
+
*/
|
|
8
|
+
export declare function extractOwnerRepo(gitRemote: string): string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Validate a user-entered repo string.
|
|
11
|
+
* Accepts "owner/repo" and "group/subgroup/repo" formats.
|
|
12
|
+
* Rejects empty strings, strings with whitespace, and strings without at least one slash.
|
|
13
|
+
*/
|
|
14
|
+
export declare const REPO_VALIDATION_REGEX: RegExp;
|
|
15
|
+
export declare function isValidRepoString(value: string): boolean;
|
|
16
|
+
//# sourceMappingURL=repo-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-utils.d.ts","sourceRoot":"","sources":["../../src/lib/repo-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGjE;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAA4B,CAAC;AAE/D,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAExD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for repository detection and validation.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Regex to extract owner/repo (or group/subgroup/repo) from GitHub/GitLab remotes.
|
|
6
|
+
* Supports both HTTPS and SSH formats, and GitLab subgroup paths.
|
|
7
|
+
*/
|
|
8
|
+
const REMOTE_REPO_REGEX = /(?:github|gitlab)\.com[:/](.+?)(?:\.git)?$/;
|
|
9
|
+
/**
|
|
10
|
+
* Extract owner/repo from a git remote URL.
|
|
11
|
+
* Returns null if the remote doesn't match a known host (github.com, gitlab.com).
|
|
12
|
+
*/
|
|
13
|
+
export function extractOwnerRepo(gitRemote) {
|
|
14
|
+
const match = gitRemote.match(REMOTE_REPO_REGEX);
|
|
15
|
+
return match ? match[1] : null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Validate a user-entered repo string.
|
|
19
|
+
* Accepts "owner/repo" and "group/subgroup/repo" formats.
|
|
20
|
+
* Rejects empty strings, strings with whitespace, and strings without at least one slash.
|
|
21
|
+
*/
|
|
22
|
+
export const REPO_VALIDATION_REGEX = /^[^\s/]+(?:\/[^\s/]+)+$/;
|
|
23
|
+
export function isValidRepoString(value) {
|
|
24
|
+
return REPO_VALIDATION_REGEX.test(value);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=repo-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-utils.js","sourceRoot":"","sources":["../../src/lib/repo-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,iBAAiB,GAAG,4CAA4C,CAAC;AAEvE;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IAChD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AAE/D,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC"}
|