noah-cursor 1.5.8 → 1.5.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +253 -182
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +2 -1
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/analyze.d.ts +3 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +48 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +67 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/bootstrap.d.ts +3 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +92 -0
- package/dist/commands/bootstrap.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +109 -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 +21 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +3 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/explain.d.ts +3 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +27 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/favorite.d.ts +3 -0
- package/dist/commands/favorite.d.ts.map +1 -0
- package/dist/commands/favorite.js +64 -0
- package/dist/commands/favorite.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +83 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/new.d.ts +3 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +27 -0
- package/dist/commands/new.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 +39 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/preview.d.ts +3 -0
- package/dist/commands/preview.d.ts.map +1 -0
- package/dist/commands/preview.js +25 -0
- package/dist/commands/preview.js.map +1 -0
- package/dist/commands/publish.d.ts +3 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +22 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/recent.d.ts +3 -0
- package/dist/commands/recent.d.ts.map +1 -0
- package/dist/commands/recent.js +27 -0
- package/dist/commands/recent.js.map +1 -0
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +2 -1
- package/dist/commands/remove.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +39 -2
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/try.d.ts +3 -0
- package/dist/commands/try.d.ts.map +1 -0
- package/dist/commands/try.js +22 -0
- package/dist/commands/try.js.map +1 -0
- package/dist/commands/undo.d.ts +3 -0
- package/dist/commands/undo.d.ts.map +1 -0
- package/dist/commands/undo.js +24 -0
- package/dist/commands/undo.js.map +1 -0
- package/dist/commands/uninstall.d.ts +3 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +52 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +2 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/wizard.d.ts +3 -0
- package/dist/commands/wizard.d.ts.map +1 -0
- package/dist/commands/wizard.js +61 -0
- package/dist/commands/wizard.js.map +1 -0
- package/dist/commands/workspace.d.ts +3 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +84 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/constants/ides.d.ts +2 -2
- package/dist/constants/ides.d.ts.map +1 -1
- package/dist/constants/ides.js +47 -3
- package/dist/constants/ides.js.map +1 -1
- package/dist/constants/index.d.ts +4 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +4 -0
- package/dist/constants/index.js.map +1 -1
- package/dist/core/program.d.ts.map +1 -1
- package/dist/core/program.js +38 -5
- package/dist/core/program.js.map +1 -1
- package/dist/index.js +36 -1
- package/dist/index.js.map +1 -1
- package/dist/metadata/user-store.d.ts +16 -0
- package/dist/metadata/user-store.d.ts.map +1 -0
- package/dist/metadata/user-store.js +99 -0
- package/dist/metadata/user-store.js.map +1 -0
- package/dist/noah-registry/manifest.json +129 -16
- package/dist/services/doctor-service.d.ts.map +1 -1
- package/dist/services/doctor-service.js +74 -7
- package/dist/services/doctor-service.js.map +1 -1
- package/dist/services/ecosystem.d.ts +17 -0
- package/dist/services/ecosystem.d.ts.map +1 -0
- package/dist/services/ecosystem.js +136 -0
- package/dist/services/ecosystem.js.map +1 -0
- package/dist/services/extras.d.ts +29 -0
- package/dist/services/extras.d.ts.map +1 -0
- package/dist/services/extras.js +164 -0
- package/dist/services/extras.js.map +1 -0
- package/dist/services/install-service.d.ts +12 -0
- package/dist/services/install-service.d.ts.map +1 -1
- package/dist/services/install-service.js +169 -12
- package/dist/services/install-service.js.map +1 -1
- package/dist/services/intelligence.d.ts +20 -0
- package/dist/services/intelligence.d.ts.map +1 -0
- package/dist/services/intelligence.js +146 -0
- package/dist/services/intelligence.js.map +1 -0
- package/dist/services/lockfile-service.d.ts +7 -0
- package/dist/services/lockfile-service.d.ts.map +1 -0
- package/dist/services/lockfile-service.js +36 -0
- package/dist/services/lockfile-service.js.map +1 -0
- package/dist/services/project-awareness.d.ts +12 -0
- package/dist/services/project-awareness.d.ts.map +1 -0
- package/dist/services/project-awareness.js +200 -0
- package/dist/services/project-awareness.js.map +1 -0
- package/dist/services/workspace-service.d.ts +49 -0
- package/dist/services/workspace-service.d.ts.map +1 -0
- package/dist/services/workspace-service.js +92 -0
- package/dist/services/workspace-service.js.map +1 -0
- package/dist/types/index.d.ts +508 -4
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +72 -0
- package/dist/types/index.js.map +1 -1
- package/dist/ui/banner.d.ts.map +1 -1
- package/dist/ui/banner.js +2 -3
- package/dist/ui/banner.js.map +1 -1
- package/dist/ui/homeMenu.d.ts +6 -0
- package/dist/ui/homeMenu.d.ts.map +1 -0
- package/dist/ui/homeMenu.js +72 -0
- package/dist/ui/homeMenu.js.map +1 -0
- package/dist/ui/preview.d.ts +3 -0
- package/dist/ui/preview.d.ts.map +1 -0
- package/dist/ui/preview.js +36 -0
- package/dist/ui/preview.js.map +1 -0
- package/dist/utils/assets.d.ts +7 -0
- package/dist/utils/assets.d.ts.map +1 -1
- package/dist/utils/assets.js +18 -14
- package/dist/utils/assets.js.map +1 -1
- package/dist/utils/fuzzy.d.ts +6 -0
- package/dist/utils/fuzzy.d.ts.map +1 -0
- package/dist/utils/fuzzy.js +51 -0
- package/dist/utils/fuzzy.js.map +1 -0
- package/dist/utils/registry.d.ts +8 -1
- package/dist/utils/registry.d.ts.map +1 -1
- package/dist/utils/registry.js +13 -5
- package/dist/utils/registry.js.map +1 -1
- package/dist/utils/semver.d.ts +11 -0
- package/dist/utils/semver.d.ts.map +1 -0
- package/dist/utils/semver.js +41 -0
- package/dist/utils/semver.js.map +1 -0
- package/package.json +7 -5
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { handleCommandError, logInfo, logSuccess } from "../core/logger.js";
|
|
2
|
+
import { getAnalyticsSummary, login, logout, whoami } from "../services/ecosystem.js";
|
|
3
|
+
import { isPromptExit } from "../ui/prompt-errors.js";
|
|
4
|
+
export function registerAuthCommands(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("login")
|
|
7
|
+
.description("Log in for publish / team features (local token)")
|
|
8
|
+
.argument("[username]", "Username or email")
|
|
9
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
10
|
+
.action(async (username, opts) => {
|
|
11
|
+
try {
|
|
12
|
+
await login(username);
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (isPromptExit(error)) {
|
|
16
|
+
logInfo("Cancelled.");
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
handleCommandError(error, opts.verbose);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
program
|
|
23
|
+
.command("logout")
|
|
24
|
+
.description("Clear local auth")
|
|
25
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
26
|
+
.action(async (opts) => {
|
|
27
|
+
try {
|
|
28
|
+
await logout();
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
handleCommandError(error, opts.verbose);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
program
|
|
35
|
+
.command("whoami")
|
|
36
|
+
.description("Show logged-in user")
|
|
37
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
38
|
+
.action(async (opts) => {
|
|
39
|
+
try {
|
|
40
|
+
const user = await whoami();
|
|
41
|
+
if (user)
|
|
42
|
+
logSuccess(user);
|
|
43
|
+
else
|
|
44
|
+
logInfo("Not logged in.");
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
handleCommandError(error, opts.verbose);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
program
|
|
51
|
+
.command("analytics")
|
|
52
|
+
.description("Show local usage analytics summary")
|
|
53
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
54
|
+
.action(async (opts) => {
|
|
55
|
+
try {
|
|
56
|
+
const summary = await getAnalyticsSummary();
|
|
57
|
+
console.log(` Favorites: ${summary.favorites}`);
|
|
58
|
+
console.log(` Recent: ${summary.recent}`);
|
|
59
|
+
console.log(` Audit events: ${summary.auditEvents}`);
|
|
60
|
+
console.log(` Logged in: ${summary.loggedIn ? "yes" : "no"}`);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
handleCommandError(error, opts.verbose);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+G/D"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { confirm } from "@inquirer/prompts";
|
|
3
|
+
import { createSpinner, handleCommandError, logInfo, logTitle, logWarn, } from "../core/logger.js";
|
|
4
|
+
import { IDE_IDS, parseIdeId } from "../constants/index.js";
|
|
5
|
+
import { applyBootstrap, planBootstrap } from "../services/workspace-service.js";
|
|
6
|
+
import { isPromptExit } from "../ui/prompt-errors.js";
|
|
7
|
+
export function registerBootstrapCommand(program) {
|
|
8
|
+
program
|
|
9
|
+
.command("bootstrap")
|
|
10
|
+
.description("Detect project stack, recommend packages, and install them")
|
|
11
|
+
.option("--ide <name>", `Target IDE (${IDE_IDS.join("|")})`, "cursor")
|
|
12
|
+
.option("--target <name>", "Alias for --ide")
|
|
13
|
+
.option("--all", "Recommend all matches (not just top 5)", false)
|
|
14
|
+
.option("--dry-run", "Analyze and show plan without installing", false)
|
|
15
|
+
.option("-y, --yes", "Skip confirmation and install recommendations", false)
|
|
16
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
17
|
+
.action(async (opts) => {
|
|
18
|
+
const spinner = createSpinner("Analyzing project…");
|
|
19
|
+
try {
|
|
20
|
+
const ide = parseIdeId(opts.target ?? opts.ide);
|
|
21
|
+
spinner.start();
|
|
22
|
+
const plan = await planBootstrap({ ide, all: opts.all, verbose: opts.verbose }, process.cwd());
|
|
23
|
+
spinner.stop();
|
|
24
|
+
logTitle("Project detected");
|
|
25
|
+
console.log(` ${chalk.bold(plan.analysis.stack.frameworks.join(", ") || "Unknown stack")}`);
|
|
26
|
+
if (plan.analysis.stack.tools.length) {
|
|
27
|
+
console.log(chalk.dim(` Tools: ${plan.analysis.stack.tools.join(", ")}`));
|
|
28
|
+
}
|
|
29
|
+
console.log();
|
|
30
|
+
console.log(` Health score ${Math.round(plan.analysis.health.overall * 10)}%`);
|
|
31
|
+
console.log(chalk.dim(` Architecture ${plan.analysis.health.architecture} · Security ${plan.analysis.health.security} · Docs ${plan.analysis.health.documentation} · Testing ${plan.analysis.health.testing}`));
|
|
32
|
+
if (plan.analysis.missing.length) {
|
|
33
|
+
console.log();
|
|
34
|
+
console.log(chalk.yellow(` Missing: ${plan.analysis.missing.join(", ")}`));
|
|
35
|
+
}
|
|
36
|
+
if (plan.packages.length === 0) {
|
|
37
|
+
logInfo("No recommended packages for this project.");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
logTitle("Recommended packages");
|
|
41
|
+
for (const pkg of plan.packages) {
|
|
42
|
+
console.log(` ✓ ${pkg}`);
|
|
43
|
+
}
|
|
44
|
+
console.log();
|
|
45
|
+
if (opts.dryRun) {
|
|
46
|
+
logInfo(`[dry-run] Would install ${plan.packages.length} package(s).`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
let shouldInstall = Boolean(opts.yes);
|
|
50
|
+
if (!shouldInstall) {
|
|
51
|
+
try {
|
|
52
|
+
shouldInstall = await confirm({
|
|
53
|
+
message: `Install ${plan.packages.length} recommended package(s)?`,
|
|
54
|
+
default: true,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
if (isPromptExit(error)) {
|
|
59
|
+
logInfo("Bootstrap cancelled.");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (!shouldInstall) {
|
|
66
|
+
logWarn("Skipped install. Run again with -y to install, or use browse/install.");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const installSpinner = createSpinner("Installing recommended packages…");
|
|
70
|
+
try {
|
|
71
|
+
installSpinner.start();
|
|
72
|
+
const results = await applyBootstrap(plan, { yes: true, dryRun: false, verbose: opts.verbose }, process.cwd());
|
|
73
|
+
installSpinner.stop();
|
|
74
|
+
if (results.length) {
|
|
75
|
+
logTitle("Installed");
|
|
76
|
+
for (const r of results.filter((x) => !x.skipped)) {
|
|
77
|
+
console.log(` ${chalk.green("✔")} ${r.type}/${r.id}@${r.version}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
installSpinner.stop();
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
spinner.stop();
|
|
88
|
+
handleCommandError(error, opts.verbose);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,OAAO,EACP,QAAQ,EACR,OAAO,GACR,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,cAAc,EAAE,eAAe,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;SACrE,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;SAC5C,MAAM,CAAC,OAAO,EAAE,wCAAwC,EAAE,KAAK,CAAC;SAChE,MAAM,CAAC,WAAW,EAAE,0CAA0C,EAAE,KAAK,CAAC;SACtE,MAAM,CAAC,WAAW,EAAE,+CAA+C,EAAE,KAAK,CAAC;SAC3E,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CACL,KAAK,EAAE,IAON,EAAE,EAAE;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;YAChD,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,MAAM,aAAa,CAC9B,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAC7C,OAAO,CAAC,GAAG,EAAE,CACd,CAAC;YACF,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAC7B,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,EAAE,CAChF,CAAC;YACF,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7E,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CACP,kBAAkB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,eAAe,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,WAAW,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,cAAc,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CACzL,CACF,CAAC;YACF,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9E,CAAC;YAED,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,2CAA2C,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,sBAAsB,CAAC,CAAC;YACjC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;YAC5B,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,2BAA2B,IAAI,CAAC,QAAQ,CAAC,MAAM,cAAc,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YAED,IAAI,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,IAAI,CAAC;oBACH,aAAa,GAAG,MAAM,OAAO,CAAC;wBAC5B,OAAO,EAAE,WAAW,IAAI,CAAC,QAAQ,CAAC,MAAM,0BAA0B;wBAClE,OAAO,EAAE,IAAI;qBACd,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;wBACxB,OAAO,CAAC,sBAAsB,CAAC,CAAC;wBAChC,OAAO;oBACT,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YAED,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,CAAC,uEAAuE,CAAC,CAAC;gBACjF,OAAO;YACT,CAAC;YAED,MAAM,cAAc,GAAG,aAAa,CAAC,kCAAkC,CAAC,CAAC;YACzE,IAAI,CAAC;gBACH,cAAc,CAAC,KAAK,EAAE,CAAC;gBACvB,MAAM,OAAO,GAAG,MAAM,cAAc,CAClC,IAAI,EACJ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EACnD,OAAO,CAAC,GAAG,EAAE,CACd,CAAC;gBACF,cAAc,CAAC,IAAI,EAAE,CAAC;gBAEtB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,QAAQ,CAAC,WAAW,CAAC,CAAC;oBACtB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;wBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;oBACtE,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAc,CAAC,IAAI,EAAE,CAAC;gBACtB,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqH7D"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { handleCommandError, logInfo, logSuccess, logTitle } from "../core/logger.js";
|
|
3
|
+
import { IDE_IDS, parseIdeId } from "../constants/index.js";
|
|
4
|
+
import { appendAudit, getSettings, listFavorites, readUserStore, updateSettings, } from "../metadata/user-store.js";
|
|
5
|
+
import { previewDiff } from "../services/extras.js";
|
|
6
|
+
export function registerConfigCommands(program) {
|
|
7
|
+
program
|
|
8
|
+
.command("config")
|
|
9
|
+
.description("Show or update Noah user settings (~/.noah)")
|
|
10
|
+
.option("--ide <name>", "Set default IDE")
|
|
11
|
+
.option("--private-registry <url>", "Set private registry URL")
|
|
12
|
+
.option("--analytics <bool>", "Enable/disable analytics (true|false)")
|
|
13
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
14
|
+
.action(async (opts) => {
|
|
15
|
+
try {
|
|
16
|
+
const patch = {};
|
|
17
|
+
if (opts.ide)
|
|
18
|
+
patch.defaultIde = parseIdeId(opts.ide);
|
|
19
|
+
if (opts.privateRegistry)
|
|
20
|
+
patch.privateRegistry = opts.privateRegistry;
|
|
21
|
+
if (opts.analytics != null) {
|
|
22
|
+
patch.analytics = opts.analytics === "true" || opts.analytics === "1";
|
|
23
|
+
}
|
|
24
|
+
if (Object.keys(patch).length > 0) {
|
|
25
|
+
const settings = await updateSettings(patch);
|
|
26
|
+
await appendAudit("config", JSON.stringify(patch));
|
|
27
|
+
logSuccess("Settings updated.");
|
|
28
|
+
console.log(settings);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const store = await readUserStore();
|
|
32
|
+
const settings = await getSettings();
|
|
33
|
+
const favorites = await listFavorites();
|
|
34
|
+
logTitle("Noah settings (~/.noah)");
|
|
35
|
+
console.log(` Default IDE: ${settings.defaultIde ?? "cursor"}`);
|
|
36
|
+
console.log(` Private registry: ${settings.privateRegistry ?? "—"}`);
|
|
37
|
+
console.log(` Analytics: ${settings.analytics ?? false}`);
|
|
38
|
+
console.log(` Plugins: ${(settings.plugins ?? []).join(", ") || "—"}`);
|
|
39
|
+
console.log(` Favorites: ${favorites.length}`);
|
|
40
|
+
console.log(` Recent: ${store.recent.length}`);
|
|
41
|
+
console.log(` Audit log: ${store.auditLog.length} events`);
|
|
42
|
+
if (store.auth?.username) {
|
|
43
|
+
console.log(` Logged in as: ${chalk.bold(store.auth.username)}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
handleCommandError(error, opts.verbose);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
program
|
|
51
|
+
.command("diff")
|
|
52
|
+
.description("Preview file changes before installing a package")
|
|
53
|
+
.argument("<package>", "Package name")
|
|
54
|
+
.option("--ide <name>", `Target IDE (${IDE_IDS.join("|")})`, "cursor")
|
|
55
|
+
.option("--target <name>", "Alias for --ide")
|
|
56
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
57
|
+
.action(async (pkg, opts) => {
|
|
58
|
+
try {
|
|
59
|
+
const ide = parseIdeId(opts.target ?? opts.ide);
|
|
60
|
+
await previewDiff(pkg, { ide, verbose: opts.verbose });
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
handleCommandError(error, opts.verbose);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
program
|
|
67
|
+
.command("trending")
|
|
68
|
+
.description("Show trending packages")
|
|
69
|
+
.option("--period <name>", "today|week|month", "week")
|
|
70
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
71
|
+
.action(async (opts) => {
|
|
72
|
+
try {
|
|
73
|
+
const { listTrending } = await import("../services/ecosystem.js");
|
|
74
|
+
const period = opts.period ?? "week";
|
|
75
|
+
const items = await listTrending(period, { verbose: opts.verbose });
|
|
76
|
+
logTitle(`Trending · ${period}`);
|
|
77
|
+
for (const item of items) {
|
|
78
|
+
const stars = item.rating != null ? `★${item.rating}` : "";
|
|
79
|
+
console.log(` ${chalk.cyan(item.type.padEnd(7))} ${chalk.bold(item.id)} ↓${item.downloads ?? 0} ${stars}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
handleCommandError(error, opts.verbose);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
program
|
|
87
|
+
.command("audit")
|
|
88
|
+
.description("Show enterprise audit log")
|
|
89
|
+
.option("--limit <n>", "Max events", "20")
|
|
90
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
91
|
+
.action(async (opts) => {
|
|
92
|
+
try {
|
|
93
|
+
const store = await readUserStore();
|
|
94
|
+
const limit = Number(opts.limit ?? 20);
|
|
95
|
+
logTitle("Audit log");
|
|
96
|
+
if (store.auditLog.length === 0) {
|
|
97
|
+
logInfo("No audit events yet.");
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
for (const event of store.auditLog.slice(0, limit)) {
|
|
101
|
+
console.log(` ${chalk.dim(event.at)} ${chalk.bold(event.action)} ${event.detail ?? ""}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
handleCommandError(error, opts.verbose);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAe/D"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { handleCommandError } from "../core/logger.js";
|
|
2
|
+
import { IDE_IDS, parseIdeId } from "../constants/index.js";
|
|
3
|
+
import { showDashboard } from "../services/extras.js";
|
|
4
|
+
export function registerDashboardCommand(program) {
|
|
5
|
+
program
|
|
6
|
+
.command("dashboard")
|
|
7
|
+
.description("Interactive summary of updates, health, and recommendations")
|
|
8
|
+
.option("--ide <name>", `Target IDE (${IDE_IDS.join("|")})`, "cursor")
|
|
9
|
+
.option("--target <name>", "Alias for --ide")
|
|
10
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
try {
|
|
13
|
+
const ide = parseIdeId(opts.target ?? opts.ide);
|
|
14
|
+
await showDashboard(ide);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
handleCommandError(error, opts.verbose);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,cAAc,EAAE,eAAe,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC;SACrE,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;SAC5C,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,IAA0D,EAAE,EAAE;QAC3E,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwC5D"}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -7,12 +7,13 @@ export function registerDoctorCommand(program) {
|
|
|
7
7
|
.command("doctor")
|
|
8
8
|
.description("Diagnose Noah Cursor environment and installation health")
|
|
9
9
|
.option("--ide <name>", `Target IDE (${IDE_IDS.join("|")})`, "cursor")
|
|
10
|
+
.option("--target <name>", "Alias for --ide")
|
|
10
11
|
.option("-v, --verbose", "Verbose output", false)
|
|
11
12
|
.action(async (opts) => {
|
|
12
13
|
try {
|
|
13
|
-
const ide = parseIdeId(opts.ide);
|
|
14
|
+
const ide = parseIdeId(opts.target ?? opts.ide);
|
|
14
15
|
const checks = await runDoctor(process.cwd(), ide);
|
|
15
|
-
logTitle(`Noah
|
|
16
|
+
logTitle(`Noah Doctor · ${ide}`);
|
|
16
17
|
let failures = 0;
|
|
17
18
|
for (const check of checks) {
|
|
18
19
|
const icon = check.status === "pass"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CACL,cAAc,EACd,eAAe,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EACnC,QAAQ,CACT;SACA,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CACL,cAAc,EACd,eAAe,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EACnC,QAAQ,CACT;SACA,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;SAC5C,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,IAA0D,EAAE,EAAE;QAC3E,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;YACnD,QAAQ,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;YAEjC,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,MAAM,IAAI,GACR,KAAK,CAAC,MAAM,KAAK,MAAM;oBACrB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;oBAClB,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM;wBACvB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;wBACnB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrE,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;oBAAE,QAAQ,IAAI,CAAC,CAAC;YAC7C,CAAC;YAED,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,mBAAmB,CAAC,CAAC,CAAC;gBACvD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../src/commands/explain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB7D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createSpinner, handleCommandError } from "../core/logger.js";
|
|
2
|
+
import { explainPackage, formatExplanation } from "../services/intelligence.js";
|
|
3
|
+
export function registerExplainCommand(program) {
|
|
4
|
+
program
|
|
5
|
+
.command("explain")
|
|
6
|
+
.description("Explain a package's purpose, benefits, and use cases")
|
|
7
|
+
.argument("<package>", "Package name")
|
|
8
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
9
|
+
.action(async (pkg, opts) => {
|
|
10
|
+
const spinner = createSpinner("Loading…");
|
|
11
|
+
try {
|
|
12
|
+
spinner.start();
|
|
13
|
+
const preview = await explainPackage(pkg, { verbose: opts.verbose });
|
|
14
|
+
spinner.stop();
|
|
15
|
+
console.log();
|
|
16
|
+
for (const line of formatExplanation(preview)) {
|
|
17
|
+
console.log(line ? ` ${line}` : "");
|
|
18
|
+
}
|
|
19
|
+
console.log();
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
spinner.stop();
|
|
23
|
+
handleCommandError(error, opts.verbose);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=explain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/commands/explain.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhF,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,sDAAsD,CAAC;SACnE,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;SACrC,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAA2B,EAAE,EAAE;QACzD,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"favorite.d.ts","sourceRoot":"","sources":["../../src/commands/favorite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0D/D"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { handleCommandError, logInfo, logSuccess, logTitle } from "../core/logger.js";
|
|
3
|
+
import { addFavorite, listFavorites, removeFavorite } from "../metadata/user-store.js";
|
|
4
|
+
import { resolvePackageRequest } from "../services/install-service.js";
|
|
5
|
+
export function registerFavoriteCommands(program) {
|
|
6
|
+
const favorite = program
|
|
7
|
+
.command("favorite")
|
|
8
|
+
.description("Manage favorite packages");
|
|
9
|
+
favorite
|
|
10
|
+
.command("add")
|
|
11
|
+
.description("Add a package to favorites")
|
|
12
|
+
.argument("<package>", "Package name")
|
|
13
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
14
|
+
.action(async (pkg, opts) => {
|
|
15
|
+
try {
|
|
16
|
+
const resolved = await resolvePackageRequest(pkg, undefined, { verbose: opts.verbose });
|
|
17
|
+
await addFavorite(resolved.type, resolved.id);
|
|
18
|
+
logSuccess(`Favorited ${resolved.type}/${resolved.id}`);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
handleCommandError(error, opts.verbose);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
favorite
|
|
25
|
+
.command("remove")
|
|
26
|
+
.alias("rm")
|
|
27
|
+
.description("Remove a package from favorites")
|
|
28
|
+
.argument("<package>", "Package name")
|
|
29
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
30
|
+
.action(async (pkg, opts) => {
|
|
31
|
+
try {
|
|
32
|
+
const resolved = await resolvePackageRequest(pkg, undefined, { verbose: opts.verbose });
|
|
33
|
+
const ok = await removeFavorite(resolved.type, resolved.id);
|
|
34
|
+
if (ok)
|
|
35
|
+
logSuccess(`Removed ${resolved.type}/${resolved.id} from favorites`);
|
|
36
|
+
else
|
|
37
|
+
logInfo("Not in favorites.");
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
handleCommandError(error, opts.verbose);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
program
|
|
44
|
+
.command("favorites")
|
|
45
|
+
.description("List favorite packages")
|
|
46
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
47
|
+
.action(async (opts) => {
|
|
48
|
+
try {
|
|
49
|
+
const favorites = await listFavorites();
|
|
50
|
+
if (favorites.length === 0) {
|
|
51
|
+
logInfo("No favorites yet. Use `noah-cursor favorite add <package>`.");
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
logTitle(`Favorites (${favorites.length})`);
|
|
55
|
+
for (const entry of favorites) {
|
|
56
|
+
console.log(` ${chalk.cyan(entry.type.padEnd(7))} ${chalk.bold(entry.id)} ${chalk.dim(entry.addedAt)}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
handleCommandError(error, opts.verbose);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=favorite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"favorite.js","sourceRoot":"","sources":["../../src/commands/favorite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE7D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { createSpinner, handleCommandError, logTitle } from "../core/logger.js";
|
|
3
|
+
import { IDE_IDS, parseIdeId } from "../constants/index.js";
|
|
4
|
+
import { installByPackageNames } from "../services/install-service.js";
|
|
5
|
+
export function registerInstallCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command("install")
|
|
8
|
+
.alias("i")
|
|
9
|
+
.description("Install packages by name (e.g. laravel-api, rule/laravel-api@1.0.0)")
|
|
10
|
+
.argument("[packages...]", "Package names")
|
|
11
|
+
.option("--skill <name>", "Install a skill by id")
|
|
12
|
+
.option("--rule <name>", "Install a rule by id")
|
|
13
|
+
.option("--prompt <name>", "Install a prompt by id")
|
|
14
|
+
.option("--mcp <name>", "Install an MCP config by id")
|
|
15
|
+
.option("--preset <name>", "Install a preset")
|
|
16
|
+
.option("--all", "Install all assets from the registry", false)
|
|
17
|
+
.option("--ide <name>", `Target IDE (${IDE_IDS.join("|")})`, "cursor")
|
|
18
|
+
.option("--target <name>", "Alias for --ide")
|
|
19
|
+
.option("--force", "Overwrite existing assets", false)
|
|
20
|
+
.option("--dry-run", "Show what would be installed without writing files", false)
|
|
21
|
+
.option("-y, --yes", "Skip confirmation prompts", false)
|
|
22
|
+
.option("-v, --verbose", "Verbose output", false)
|
|
23
|
+
.action(async (packages, opts) => {
|
|
24
|
+
const spinner = createSpinner("Installing…");
|
|
25
|
+
try {
|
|
26
|
+
const ide = parseIdeId(opts.target ?? opts.ide);
|
|
27
|
+
const names = [...packages];
|
|
28
|
+
if (opts.skill)
|
|
29
|
+
names.push(`skill/${opts.skill}`);
|
|
30
|
+
if (opts.rule)
|
|
31
|
+
names.push(`rule/${opts.rule}`);
|
|
32
|
+
if (opts.prompt)
|
|
33
|
+
names.push(`prompt/${opts.prompt}`);
|
|
34
|
+
if (opts.mcp)
|
|
35
|
+
names.push(`mcp/${opts.mcp}`);
|
|
36
|
+
if (opts.preset)
|
|
37
|
+
names.push(`preset/${opts.preset}`);
|
|
38
|
+
if (opts.all) {
|
|
39
|
+
const { addFromRegistry } = await import("../services/install-service.js");
|
|
40
|
+
spinner.start();
|
|
41
|
+
const results = await addFromRegistry(undefined, {
|
|
42
|
+
all: true,
|
|
43
|
+
force: opts.force,
|
|
44
|
+
dryRun: opts.dryRun,
|
|
45
|
+
yes: opts.yes,
|
|
46
|
+
verbose: opts.verbose,
|
|
47
|
+
ide,
|
|
48
|
+
});
|
|
49
|
+
spinner.stop();
|
|
50
|
+
printResults(results, opts.dryRun);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
spinner.start();
|
|
54
|
+
const results = await installByPackageNames(names, {
|
|
55
|
+
force: opts.force,
|
|
56
|
+
dryRun: opts.dryRun,
|
|
57
|
+
yes: opts.yes,
|
|
58
|
+
verbose: opts.verbose,
|
|
59
|
+
ide,
|
|
60
|
+
});
|
|
61
|
+
spinner.stop();
|
|
62
|
+
printResults(results, opts.dryRun);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
spinner.stop();
|
|
66
|
+
handleCommandError(error, opts.verbose);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function printResults(results, dryRun) {
|
|
71
|
+
if (results.length === 0)
|
|
72
|
+
return;
|
|
73
|
+
logTitle("Results");
|
|
74
|
+
for (const result of results) {
|
|
75
|
+
const status = result.skipped
|
|
76
|
+
? chalk.yellow("skipped")
|
|
77
|
+
: dryRun
|
|
78
|
+
? chalk.cyan("planned")
|
|
79
|
+
: chalk.green("installed");
|
|
80
|
+
console.log(` ${status} ${chalk.bold(result.type)}/${result.id}@${result.version}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0BzD"}
|