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.
Files changed (169) hide show
  1. package/README.md +253 -182
  2. package/dist/commands/add.d.ts.map +1 -1
  3. package/dist/commands/add.js +2 -1
  4. package/dist/commands/add.js.map +1 -1
  5. package/dist/commands/analyze.d.ts +3 -0
  6. package/dist/commands/analyze.d.ts.map +1 -0
  7. package/dist/commands/analyze.js +48 -0
  8. package/dist/commands/analyze.js.map +1 -0
  9. package/dist/commands/auth.d.ts +3 -0
  10. package/dist/commands/auth.d.ts.map +1 -0
  11. package/dist/commands/auth.js +67 -0
  12. package/dist/commands/auth.js.map +1 -0
  13. package/dist/commands/bootstrap.d.ts +3 -0
  14. package/dist/commands/bootstrap.d.ts.map +1 -0
  15. package/dist/commands/bootstrap.js +92 -0
  16. package/dist/commands/bootstrap.js.map +1 -0
  17. package/dist/commands/config.d.ts +3 -0
  18. package/dist/commands/config.d.ts.map +1 -0
  19. package/dist/commands/config.js +109 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/dashboard.d.ts +3 -0
  22. package/dist/commands/dashboard.d.ts.map +1 -0
  23. package/dist/commands/dashboard.js +21 -0
  24. package/dist/commands/dashboard.js.map +1 -0
  25. package/dist/commands/doctor.d.ts.map +1 -1
  26. package/dist/commands/doctor.js +3 -2
  27. package/dist/commands/doctor.js.map +1 -1
  28. package/dist/commands/explain.d.ts +3 -0
  29. package/dist/commands/explain.d.ts.map +1 -0
  30. package/dist/commands/explain.js +27 -0
  31. package/dist/commands/explain.js.map +1 -0
  32. package/dist/commands/favorite.d.ts +3 -0
  33. package/dist/commands/favorite.d.ts.map +1 -0
  34. package/dist/commands/favorite.js +64 -0
  35. package/dist/commands/favorite.js.map +1 -0
  36. package/dist/commands/install.d.ts +3 -0
  37. package/dist/commands/install.d.ts.map +1 -0
  38. package/dist/commands/install.js +83 -0
  39. package/dist/commands/install.js.map +1 -0
  40. package/dist/commands/new.d.ts +3 -0
  41. package/dist/commands/new.d.ts.map +1 -0
  42. package/dist/commands/new.js +27 -0
  43. package/dist/commands/new.js.map +1 -0
  44. package/dist/commands/plugin.d.ts +3 -0
  45. package/dist/commands/plugin.d.ts.map +1 -0
  46. package/dist/commands/plugin.js +39 -0
  47. package/dist/commands/plugin.js.map +1 -0
  48. package/dist/commands/preview.d.ts +3 -0
  49. package/dist/commands/preview.d.ts.map +1 -0
  50. package/dist/commands/preview.js +25 -0
  51. package/dist/commands/preview.js.map +1 -0
  52. package/dist/commands/publish.d.ts +3 -0
  53. package/dist/commands/publish.d.ts.map +1 -0
  54. package/dist/commands/publish.js +22 -0
  55. package/dist/commands/publish.js.map +1 -0
  56. package/dist/commands/recent.d.ts +3 -0
  57. package/dist/commands/recent.d.ts.map +1 -0
  58. package/dist/commands/recent.js +27 -0
  59. package/dist/commands/recent.js.map +1 -0
  60. package/dist/commands/remove.d.ts.map +1 -1
  61. package/dist/commands/remove.js +2 -1
  62. package/dist/commands/remove.js.map +1 -1
  63. package/dist/commands/search.d.ts.map +1 -1
  64. package/dist/commands/search.js +39 -2
  65. package/dist/commands/search.js.map +1 -1
  66. package/dist/commands/try.d.ts +3 -0
  67. package/dist/commands/try.d.ts.map +1 -0
  68. package/dist/commands/try.js +22 -0
  69. package/dist/commands/try.js.map +1 -0
  70. package/dist/commands/undo.d.ts +3 -0
  71. package/dist/commands/undo.d.ts.map +1 -0
  72. package/dist/commands/undo.js +24 -0
  73. package/dist/commands/undo.js.map +1 -0
  74. package/dist/commands/uninstall.d.ts +3 -0
  75. package/dist/commands/uninstall.d.ts.map +1 -0
  76. package/dist/commands/uninstall.js +52 -0
  77. package/dist/commands/uninstall.js.map +1 -0
  78. package/dist/commands/update.d.ts.map +1 -1
  79. package/dist/commands/update.js +2 -1
  80. package/dist/commands/update.js.map +1 -1
  81. package/dist/commands/wizard.d.ts +3 -0
  82. package/dist/commands/wizard.d.ts.map +1 -0
  83. package/dist/commands/wizard.js +61 -0
  84. package/dist/commands/wizard.js.map +1 -0
  85. package/dist/commands/workspace.d.ts +3 -0
  86. package/dist/commands/workspace.d.ts.map +1 -0
  87. package/dist/commands/workspace.js +84 -0
  88. package/dist/commands/workspace.js.map +1 -0
  89. package/dist/constants/ides.d.ts +2 -2
  90. package/dist/constants/ides.d.ts.map +1 -1
  91. package/dist/constants/ides.js +47 -3
  92. package/dist/constants/ides.js.map +1 -1
  93. package/dist/constants/index.d.ts +4 -0
  94. package/dist/constants/index.d.ts.map +1 -1
  95. package/dist/constants/index.js +4 -0
  96. package/dist/constants/index.js.map +1 -1
  97. package/dist/core/program.d.ts.map +1 -1
  98. package/dist/core/program.js +38 -5
  99. package/dist/core/program.js.map +1 -1
  100. package/dist/index.js +36 -1
  101. package/dist/index.js.map +1 -1
  102. package/dist/metadata/user-store.d.ts +16 -0
  103. package/dist/metadata/user-store.d.ts.map +1 -0
  104. package/dist/metadata/user-store.js +99 -0
  105. package/dist/metadata/user-store.js.map +1 -0
  106. package/dist/noah-registry/manifest.json +129 -16
  107. package/dist/services/doctor-service.d.ts.map +1 -1
  108. package/dist/services/doctor-service.js +74 -7
  109. package/dist/services/doctor-service.js.map +1 -1
  110. package/dist/services/ecosystem.d.ts +17 -0
  111. package/dist/services/ecosystem.d.ts.map +1 -0
  112. package/dist/services/ecosystem.js +136 -0
  113. package/dist/services/ecosystem.js.map +1 -0
  114. package/dist/services/extras.d.ts +29 -0
  115. package/dist/services/extras.d.ts.map +1 -0
  116. package/dist/services/extras.js +164 -0
  117. package/dist/services/extras.js.map +1 -0
  118. package/dist/services/install-service.d.ts +12 -0
  119. package/dist/services/install-service.d.ts.map +1 -1
  120. package/dist/services/install-service.js +169 -12
  121. package/dist/services/install-service.js.map +1 -1
  122. package/dist/services/intelligence.d.ts +20 -0
  123. package/dist/services/intelligence.d.ts.map +1 -0
  124. package/dist/services/intelligence.js +146 -0
  125. package/dist/services/intelligence.js.map +1 -0
  126. package/dist/services/lockfile-service.d.ts +7 -0
  127. package/dist/services/lockfile-service.d.ts.map +1 -0
  128. package/dist/services/lockfile-service.js +36 -0
  129. package/dist/services/lockfile-service.js.map +1 -0
  130. package/dist/services/project-awareness.d.ts +12 -0
  131. package/dist/services/project-awareness.d.ts.map +1 -0
  132. package/dist/services/project-awareness.js +200 -0
  133. package/dist/services/project-awareness.js.map +1 -0
  134. package/dist/services/workspace-service.d.ts +49 -0
  135. package/dist/services/workspace-service.d.ts.map +1 -0
  136. package/dist/services/workspace-service.js +92 -0
  137. package/dist/services/workspace-service.js.map +1 -0
  138. package/dist/types/index.d.ts +508 -4
  139. package/dist/types/index.d.ts.map +1 -1
  140. package/dist/types/index.js +72 -0
  141. package/dist/types/index.js.map +1 -1
  142. package/dist/ui/banner.d.ts.map +1 -1
  143. package/dist/ui/banner.js +2 -3
  144. package/dist/ui/banner.js.map +1 -1
  145. package/dist/ui/homeMenu.d.ts +6 -0
  146. package/dist/ui/homeMenu.d.ts.map +1 -0
  147. package/dist/ui/homeMenu.js +72 -0
  148. package/dist/ui/homeMenu.js.map +1 -0
  149. package/dist/ui/preview.d.ts +3 -0
  150. package/dist/ui/preview.d.ts.map +1 -0
  151. package/dist/ui/preview.js +36 -0
  152. package/dist/ui/preview.js.map +1 -0
  153. package/dist/utils/assets.d.ts +7 -0
  154. package/dist/utils/assets.d.ts.map +1 -1
  155. package/dist/utils/assets.js +18 -14
  156. package/dist/utils/assets.js.map +1 -1
  157. package/dist/utils/fuzzy.d.ts +6 -0
  158. package/dist/utils/fuzzy.d.ts.map +1 -0
  159. package/dist/utils/fuzzy.js +51 -0
  160. package/dist/utils/fuzzy.js.map +1 -0
  161. package/dist/utils/registry.d.ts +8 -1
  162. package/dist/utils/registry.d.ts.map +1 -1
  163. package/dist/utils/registry.js +13 -5
  164. package/dist/utils/registry.js.map +1 -1
  165. package/dist/utils/semver.d.ts +11 -0
  166. package/dist/utils/semver.d.ts.map +1 -0
  167. package/dist/utils/semver.js +41 -0
  168. package/dist/utils/semver.js.map +1 -0
  169. 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,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerBootstrapCommand(program: Command): void;
3
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -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":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerConfigCommands(program: Command): void;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -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":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACL,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,GACf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC;SACzC,MAAM,CAAC,0BAA0B,EAAE,0BAA0B,CAAC;SAC9D,MAAM,CAAC,oBAAoB,EAAE,uCAAuC,CAAC;SACrE,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CACL,KAAK,EAAE,IAKN,EAAE,EAAE;QACH,IAAI,CAAC;YACH,MAAM,KAAK,GAA4B,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,GAAG;gBAAE,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtD,IAAI,IAAI,CAAC,eAAe;gBAAE,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;YACvE,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;gBAC3B,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,GAAG,CAAC;YACxE,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC7C,MAAM,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnD,UAAU,CAAC,mBAAmB,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;YACxC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,CAAC,eAAe,IAAI,GAAG,EAAE,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;YAClF,OAAO,CAAC,GAAG,CAAC,wBAAwB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,QAAQ,CAAC,MAAM,SAAS,CAAC,CAAC;YACpE,IAAI,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CACF,CAAC;IAEJ,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,kDAAkD,CAAC;SAC/D,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;SACrC,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,CACL,KAAK,EACH,GAAW,EACX,IAA0D,EAC1D,EAAE;QACF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,WAAW,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CACF,CAAC;IAEJ,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,wBAAwB,CAAC;SACrC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,IAA4C,EAAE,EAAE;QAC7D,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;YAClE,MAAM,MAAM,GAAI,IAAI,CAAC,MAAqC,IAAI,MAAM,CAAC;YACrE,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,QAAQ,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,KAAK,EAAE,CACjG,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC;SACzC,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,IAA2C,EAAE,EAAE;QAC5D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,aAAa,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACvC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACtB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,sBAAsB,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;gBACnD,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAC/E,CAAC;YACJ,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,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerDashboardCommand(program: Command): void;
3
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -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,CAuC5D"}
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"}
@@ -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 Cursor Doctor · ${ide}`);
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,IAAyC,EAAE,EAAE;QAC1D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;YACnD,QAAQ,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;YAExC,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"}
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,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerExplainCommand(program: Command): void;
3
+ //# sourceMappingURL=explain.d.ts.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerFavoriteCommands(program: Command): void;
3
+ //# sourceMappingURL=favorite.d.ts.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerInstallCommand(program: Command): void;
3
+ //# sourceMappingURL=install.d.ts.map
@@ -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,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerNewCommand(program: Command): void;
3
+ //# sourceMappingURL=new.d.ts.map
@@ -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"}