noah-cursor 1.0.0 → 1.2.0

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 (103) hide show
  1. package/README.md +56 -25
  2. package/dist/commands/add.d.ts.map +1 -1
  3. package/dist/commands/add.js +3 -3
  4. package/dist/commands/add.js.map +1 -1
  5. package/dist/commands/browse.d.ts +3 -0
  6. package/dist/commands/browse.d.ts.map +1 -0
  7. package/dist/commands/browse.js +127 -0
  8. package/dist/commands/browse.js.map +1 -0
  9. package/dist/commands/list.d.ts.map +1 -1
  10. package/dist/commands/list.js +54 -15
  11. package/dist/commands/list.js.map +1 -1
  12. package/dist/commands/search.d.ts.map +1 -1
  13. package/dist/commands/search.js +2 -2
  14. package/dist/commands/search.js.map +1 -1
  15. package/dist/constants/index.d.ts +7 -1
  16. package/dist/constants/index.d.ts.map +1 -1
  17. package/dist/constants/index.js +10 -1
  18. package/dist/constants/index.js.map +1 -1
  19. package/dist/core/program.d.ts.map +1 -1
  20. package/dist/core/program.js +25 -1
  21. package/dist/core/program.js.map +1 -1
  22. package/dist/index.js +8 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/metadata/store.d.ts +12 -0
  25. package/dist/metadata/store.d.ts.map +1 -1
  26. package/dist/metadata/store.js +61 -2
  27. package/dist/metadata/store.js.map +1 -1
  28. package/dist/noah-registry/manifest.json +85 -0
  29. package/dist/noah-registry/mcp/.gitkeep +0 -0
  30. package/dist/noah-registry/presets/noah-web-stack/preset.json +3 -0
  31. package/dist/noah-registry/presets/test/preset.json +3 -0
  32. package/dist/noah-registry/prompts/.gitkeep +0 -0
  33. package/dist/noah-registry/rules/laravel-api/RULE.md +62 -0
  34. package/dist/noah-registry/rules/nextjs-marketing/RULE.md +52 -0
  35. package/dist/noah-registry/rules/nuxt-marketing/RULE.md +50 -0
  36. package/dist/noah-registry/rules/react-spa-dashboard/RULE.md +75 -0
  37. package/dist/noah-registry/rules/stack-architecture/RULE.md +28 -0
  38. package/dist/noah-registry/rules/test/RULE.md +16 -0
  39. package/dist/noah-registry/skills/commit-push/SKILL.md +193 -0
  40. package/dist/noah-registry/skills/test/SKILL.md +14 -0
  41. package/dist/services/doctor-service.js +3 -3
  42. package/dist/services/doctor-service.js.map +1 -1
  43. package/dist/services/install-service.d.ts +24 -2
  44. package/dist/services/install-service.d.ts.map +1 -1
  45. package/dist/services/install-service.js +115 -93
  46. package/dist/services/install-service.js.map +1 -1
  47. package/dist/services/registry-loader.d.ts +15 -0
  48. package/dist/services/registry-loader.d.ts.map +1 -0
  49. package/dist/services/registry-loader.js +39 -0
  50. package/dist/services/registry-loader.js.map +1 -0
  51. package/dist/ui/assetMenu.d.ts +8 -0
  52. package/dist/ui/assetMenu.d.ts.map +1 -0
  53. package/dist/ui/assetMenu.js +60 -0
  54. package/dist/ui/assetMenu.js.map +1 -0
  55. package/dist/ui/banner.d.ts +7 -0
  56. package/dist/ui/banner.d.ts.map +1 -0
  57. package/dist/ui/banner.js +60 -0
  58. package/dist/ui/banner.js.map +1 -0
  59. package/dist/ui/categoryMenu.d.ts +9 -0
  60. package/dist/ui/categoryMenu.d.ts.map +1 -0
  61. package/dist/ui/categoryMenu.js +44 -0
  62. package/dist/ui/categoryMenu.js.map +1 -0
  63. package/dist/ui/format.d.ts +5 -0
  64. package/dist/ui/format.d.ts.map +1 -0
  65. package/dist/ui/format.js +26 -0
  66. package/dist/ui/format.js.map +1 -0
  67. package/dist/ui/mcpMenu.d.ts +2 -0
  68. package/dist/ui/mcpMenu.d.ts.map +1 -0
  69. package/dist/ui/mcpMenu.js +2 -0
  70. package/dist/ui/mcpMenu.js.map +1 -0
  71. package/dist/ui/presetsMenu.d.ts +2 -0
  72. package/dist/ui/presetsMenu.d.ts.map +1 -0
  73. package/dist/ui/presetsMenu.js +2 -0
  74. package/dist/ui/presetsMenu.js.map +1 -0
  75. package/dist/ui/progress.d.ts +8 -0
  76. package/dist/ui/progress.d.ts.map +1 -0
  77. package/dist/ui/progress.js +34 -0
  78. package/dist/ui/progress.js.map +1 -0
  79. package/dist/ui/prompt-errors.d.ts +2 -0
  80. package/dist/ui/prompt-errors.d.ts.map +1 -0
  81. package/dist/ui/prompt-errors.js +5 -0
  82. package/dist/ui/prompt-errors.js.map +1 -0
  83. package/dist/ui/promptsMenu.d.ts +2 -0
  84. package/dist/ui/promptsMenu.d.ts.map +1 -0
  85. package/dist/ui/promptsMenu.js +2 -0
  86. package/dist/ui/promptsMenu.js.map +1 -0
  87. package/dist/ui/rulesMenu.d.ts +2 -0
  88. package/dist/ui/rulesMenu.d.ts.map +1 -0
  89. package/dist/ui/rulesMenu.js +2 -0
  90. package/dist/ui/rulesMenu.js.map +1 -0
  91. package/dist/ui/skillsMenu.d.ts +2 -0
  92. package/dist/ui/skillsMenu.d.ts.map +1 -0
  93. package/dist/ui/skillsMenu.js +2 -0
  94. package/dist/ui/skillsMenu.js.map +1 -0
  95. package/dist/ui/summary.d.ts +4 -0
  96. package/dist/ui/summary.d.ts.map +1 -0
  97. package/dist/ui/summary.js +68 -0
  98. package/dist/ui/summary.js.map +1 -0
  99. package/dist/utils/registry.d.ts +22 -0
  100. package/dist/utils/registry.d.ts.map +1 -0
  101. package/dist/utils/registry.js +95 -0
  102. package/dist/utils/registry.js.map +1 -0
  103. package/package.json +9 -3
package/README.md CHANGED
@@ -1,38 +1,63 @@
1
- # Noah Cursor
1
+ <p align="center">
2
+ <img src="assets/noah-cursor-banner.png" alt="Noah Cursor" width="100%" />
3
+ </p>
2
4
 
3
- Install reusable Cursor assets — Skills, Rules, Prompts, MCP configs, and Presets — from any compatible GitHub registry into your project.
5
+ Install Noah's reusable Cursor assets — Skills, Rules, Prompts, MCP configs, and Presets — into your project.
4
6
 
5
7
  ```bash
6
- npx noah-cursor add https://github.com/itsmenoahpoli/noah-cursor --skill test
8
+ npx noah-cursor add --skill test
7
9
  ```
8
10
 
9
11
  ## Install
10
12
 
11
13
  ```bash
12
- # One-shot (recommended)
13
- npx noah-cursor add <repository> --skill <name>
14
+ # One-shot (recommended) — uses the registry bundled in the package
15
+ npx noah-cursor add --skill <name>
14
16
 
15
17
  # Or install globally
16
18
  npm install -g noah-cursor
17
19
  ```
18
20
 
19
- Requires **Node.js 20+** and **Git**.
21
+ Requires **Node.js 20+**. The registry ships inside the package (no GitHub clone or sign-in).
20
22
 
21
23
  ## Commands
22
24
 
23
- | Command | Description |
24
- |---------|-------------|
25
- | `add` | Install assets from a registry |
26
- | `search` | Search assets in a registry |
27
- | `list` | List installed assets |
28
- | `remove` | Remove an installed asset |
29
- | `update` | Re-fetch and update installed assets |
30
- | `doctor` | Diagnose environment health |
25
+ | Command | Description |
26
+ | -------- | --------------------------------------- |
27
+ | `add` | Install assets from Noah's registry |
28
+ | `browse` | Interactively browse and install assets |
29
+ | `search` | Search assets in Noah's registry |
30
+ | `list` | List all assets in Noah's registry |
31
+ | `remove` | Remove an installed asset |
32
+ | `update` | Re-fetch and update installed assets |
33
+ | `doctor` | Diagnose environment health |
34
+
35
+ ### browse
36
+
37
+ Interactive TUI for discovering assets without knowing their ids:
38
+
39
+ ```bash
40
+ noah-cursor browse
41
+ noah-cursor browse --browse-skills
42
+ noah-cursor browse --browse-rules
43
+ noah-cursor browse --browse-prompts
44
+ noah-cursor browse --browse-mcp
45
+ noah-cursor browse --browse-presets
46
+ ```
47
+
48
+ Examples:
49
+
50
+ ```bash
51
+ npx noah-cursor browse
52
+ npx noah-cursor browse . --browse-skills
53
+ ```
54
+
55
+ Controls: ↑↓ navigate · Space select · A toggle all · I invert · Enter confirm · Esc cancel
31
56
 
32
57
  ### add
33
58
 
34
59
  ```bash
35
- noah-cursor add <repository>
60
+ noah-cursor add [repository]
36
61
 
37
62
  --skill <name>
38
63
  --rule <name>
@@ -46,24 +71,28 @@ noah-cursor add <repository>
46
71
  --verbose
47
72
  ```
48
73
 
74
+ `[repository]` is optional. By default the CLI uses the **bundled** Noah registry (copied into the package at build time). Third-party GitHub registries are not supported. Use a local path (e.g. `.`) only while developing this repo.
75
+
49
76
  Examples:
50
77
 
51
78
  ```bash
52
- # From another project — install from this GitHub registry
53
- npx noah-cursor add https://github.com/itsmenoahpoli/noah-cursor --skill test
54
- npx noah-cursor add https://github.com/itsmenoahpoli/noah-cursor --rule test
55
- npx noah-cursor add https://github.com/itsmenoahpoli/noah-cursor --preset test
56
- npx noah-cursor add itsmenoahpoli/noah-cursor --all
57
-
58
- # Local path while developing
79
+ # Install from Noah's official registry
80
+ npx noah-cursor add --skill test
81
+ npx noah-cursor add --rule test
82
+ npx noah-cursor add --preset test
83
+ npx noah-cursor add --all
84
+ npx noah-cursor add itsmenoahpoli/noah-cursor --skill commit-push
85
+
86
+ # Local path while developing this registry
59
87
  noah-cursor add . --skill test --dry-run
60
88
  ```
61
89
 
62
90
  ### search / list / remove / update / doctor
63
91
 
64
92
  ```bash
65
- noah-cursor search test --registry https://github.com/itsmenoahpoli/noah-cursor
93
+ noah-cursor search test
66
94
  noah-cursor list
95
+ noah-cursor list --installed
67
96
  noah-cursor remove skill test --yes
68
97
  noah-cursor update --yes
69
98
  noah-cursor doctor
@@ -88,7 +117,7 @@ presets/
88
117
  - **rule** `test`
89
118
  - **preset** `test` (installs both)
90
119
 
91
- Add your own assets under those folders and register them in `manifest.json`.
120
+ Add curated Noah assets under those folders and register them in `manifest.json`.
92
121
 
93
122
  ### manifest.json
94
123
 
@@ -161,11 +190,13 @@ Assets are copied into your project:
161
190
 
162
191
  ```bash
163
192
  npm install
164
- npm run build
193
+ npm run build # compiles TypeScript and bundles registry → dist/registry
165
194
  npm test
166
195
  npm run dev -- doctor
167
196
  ```
168
197
 
198
+ `npm run build` copies `manifest.json` plus `skills/`, `rules/`, `prompts/`, `mcp/`, and `presets/` into `dist/noah-registry/` so published installs never need to clone GitHub.
199
+
169
200
  ## License
170
201
 
171
202
  MIT
@@ -1 +1 @@
1
- {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsDzD"}
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyDzD"}
@@ -4,8 +4,8 @@ import { addFromRegistry } from "../services/install-service.js";
4
4
  export function registerAddCommand(program) {
5
5
  program
6
6
  .command("add")
7
- .description("Install assets from a GitHub registry repository")
8
- .argument("<repository>", "GitHub repository URL or owner/repo")
7
+ .description("Install assets from Noah's official registry")
8
+ .argument("[repository]", "Local path for development (default: bundled Noah registry)")
9
9
  .option("--skill <name>", "Install a skill by id")
10
10
  .option("--rule <name>", "Install a rule by id")
11
11
  .option("--prompt <name>", "Install a prompt by id")
@@ -17,7 +17,7 @@ export function registerAddCommand(program) {
17
17
  .option("-y, --yes", "Skip confirmation prompts", false)
18
18
  .option("-v, --verbose", "Verbose output", false)
19
19
  .action(async (repository, opts) => {
20
- const spinner = createSpinner("Fetching registry…");
20
+ const spinner = createSpinner("Loading registry…");
21
21
  try {
22
22
  spinner.start();
23
23
  const options = {
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,kDAAkD,CAAC;SAC/D,QAAQ,CAAC,cAAc,EAAE,qCAAqC,CAAC;SAC/D,MAAM,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;SACjD,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;SAC/C,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;SACnD,MAAM,CAAC,cAAc,EAAE,6BAA6B,CAAC;SACrD,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;SAC1E,MAAM,CAAC,OAAO,EAAE,sCAAsC,EAAE,KAAK,CAAC;SAC9D,MAAM,CAAC,SAAS,EAAE,2BAA2B,EAAE,KAAK,CAAC;SACrD,MAAM,CAAC,WAAW,EAAE,oDAAoD,EAAE,KAAK,CAAC;SAChF,MAAM,CAAC,WAAW,EAAE,2BAA2B,EAAE,KAAK,CAAC;SACvD,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,IAAuC,EAAE,EAAE;QAC5E,MAAM,OAAO,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAe;gBAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC;YAEF,OAAO,CAAC,IAAI,GAAG,mCAAmC,CAAC;YACnD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO;wBAC3B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;wBACzB,CAAC,CAAC,OAAO,CAAC,MAAM;4BACd,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;4BACvB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBAC/B,OAAO,CAAC,GAAG,CACT,KAAK,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,CACzE,CAAC;gBACJ,CAAC;YACH,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,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,8CAA8C,CAAC;SAC3D,QAAQ,CACP,cAAc,EACd,6DAA6D,CAC9D;SACA,MAAM,CAAC,gBAAgB,EAAE,uBAAuB,CAAC;SACjD,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC;SAC/C,MAAM,CAAC,iBAAiB,EAAE,wBAAwB,CAAC;SACnD,MAAM,CAAC,cAAc,EAAE,6BAA6B,CAAC;SACrD,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;SAC1E,MAAM,CAAC,OAAO,EAAE,sCAAsC,EAAE,KAAK,CAAC;SAC9D,MAAM,CAAC,SAAS,EAAE,2BAA2B,EAAE,KAAK,CAAC;SACrD,MAAM,CAAC,WAAW,EAAE,oDAAoD,EAAE,KAAK,CAAC;SAChF,MAAM,CAAC,WAAW,EAAE,2BAA2B,EAAE,KAAK,CAAC;SACvD,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,UAA8B,EAAE,IAAuC,EAAE,EAAE;QACxF,MAAM,OAAO,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAe;gBAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC;YAEF,OAAO,CAAC,IAAI,GAAG,mCAAmC,CAAC;YACnD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO;wBAC3B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;wBACzB,CAAC,CAAC,OAAO,CAAC,MAAM;4BACd,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;4BACvB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;oBAC/B,OAAO,CAAC,GAAG,CACT,KAAK,MAAM,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,CACzE,CAAC;gBACJ,CAAC;YACH,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,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerBrowseCommand(program: Command): void;
3
+ //# sourceMappingURL=browse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browse.d.ts","sourceRoot":"","sources":["../../src/commands/browse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiEpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwG5D"}
@@ -0,0 +1,127 @@
1
+ import chalk from "chalk";
2
+ import { handleCommandError, logWarn } from "../core/logger.js";
3
+ import { installFromSelections } from "../services/install-service.js";
4
+ import { loadRegistry } from "../services/registry-loader.js";
5
+ import { getManifestAssets } from "../utils/assets.js";
6
+ import { displayRegistryUrl } from "../utils/fs.js";
7
+ import { resolveNoahRegistry } from "../utils/registry.js";
8
+ import { selectCategories } from "../ui/categoryMenu.js";
9
+ import { selectAssets } from "../ui/assetMenu.js";
10
+ import { confirmInstallation } from "../ui/summary.js";
11
+ import { ProgressDisplay } from "../ui/progress.js";
12
+ import { humanizeId } from "../ui/format.js";
13
+ function categoriesFromFlags(opts) {
14
+ const selected = [];
15
+ if (opts.browseSkills)
16
+ selected.push("skill");
17
+ if (opts.browseRules)
18
+ selected.push("rule");
19
+ if (opts.browsePrompts)
20
+ selected.push("prompt");
21
+ if (opts.browseMcp)
22
+ selected.push("mcp");
23
+ if (opts.browsePresets)
24
+ selected.push("preset");
25
+ return selected;
26
+ }
27
+ function assetsForCategory(manifest, type) {
28
+ if (type === "preset") {
29
+ return manifest.presets;
30
+ }
31
+ return getManifestAssets(manifest, type);
32
+ }
33
+ async function collectSelections(manifest, categories) {
34
+ const selections = [];
35
+ for (const category of categories) {
36
+ const assets = assetsForCategory(manifest, category);
37
+ const chosen = await selectAssets(category, assets);
38
+ if (chosen === null) {
39
+ return null;
40
+ }
41
+ for (const id of chosen) {
42
+ selections.push({ type: category, id });
43
+ }
44
+ console.log();
45
+ }
46
+ return selections;
47
+ }
48
+ export function registerBrowseCommand(program) {
49
+ program
50
+ .command("browse")
51
+ .description("Interactively browse and install assets from Noah's official registry")
52
+ .argument("[repository]", "Local path for development (default: bundled Noah registry)")
53
+ .option("--browse-skills", "Browse skills only", false)
54
+ .option("--browse-rules", "Browse rules only", false)
55
+ .option("--browse-prompts", "Browse prompts only", false)
56
+ .option("--browse-mcp", "Browse MCP configs only", false)
57
+ .option("--browse-presets", "Browse presets only", false)
58
+ .option("--force", "Overwrite existing assets", false)
59
+ .option("--dry-run", "Show what would be installed without writing files", false)
60
+ .option("-y, --yes", "Skip final confirmation", false)
61
+ .option("-v, --verbose", "Verbose output", false)
62
+ .action(async (repository, opts) => {
63
+ const progress = new ProgressDisplay();
64
+ try {
65
+ progress.start("Loading registry…");
66
+ const source = resolveNoahRegistry(repository);
67
+ const registry = await loadRegistry(source, { verbose: opts.verbose });
68
+ progress.succeed("Loading registry");
69
+ progress.start("Reading manifest…");
70
+ const { manifest } = registry;
71
+ progress.succeed(`Reading manifest${manifest.name ? chalk.dim(` (${manifest.name}@${manifest.version})`) : ""}`);
72
+ console.log();
73
+ try {
74
+ const flagged = categoriesFromFlags(opts);
75
+ const categories = await selectCategories(flagged.length > 0 ? flagged : undefined);
76
+ if (!categories || categories.length === 0) {
77
+ logWarn("No categories selected. Exiting.");
78
+ return;
79
+ }
80
+ console.log();
81
+ const selections = await collectSelections(manifest, categories);
82
+ if (selections === null) {
83
+ logWarn("Browse cancelled.");
84
+ return;
85
+ }
86
+ if (selections.length === 0) {
87
+ logWarn("No assets selected. Nothing to install.");
88
+ return;
89
+ }
90
+ const shouldInstall = opts.yes ||
91
+ opts.dryRun ||
92
+ (await confirmInstallation(registry.url, selections));
93
+ if (!shouldInstall) {
94
+ logWarn("Installation cancelled.");
95
+ return;
96
+ }
97
+ console.log();
98
+ const formatStep = (message) => message.startsWith("Installing ")
99
+ ? message.replace(/^Installing ([^/]+)\/(.+)$/, (_full, type, id) => `Installing ${humanizeId(id)} ${chalk.dim(`(${type})`)}`)
100
+ : message;
101
+ const results = await installFromSelections(registry, selections, {
102
+ force: opts.force,
103
+ dryRun: opts.dryRun,
104
+ verbose: opts.verbose,
105
+ onStepStart: async (message) => {
106
+ progress.start(formatStep(message));
107
+ },
108
+ onStepDone: async (message) => {
109
+ progress.succeed(formatStep(message));
110
+ },
111
+ });
112
+ progress.succeed(opts.dryRun ? "Dry run complete" : "Installation complete");
113
+ const installed = results.filter((r) => !r.skipped);
114
+ console.log();
115
+ console.log(chalk.green(`${opts.dryRun ? "Planned" : "Installed"} ${installed.length} asset(s) from ${displayRegistryUrl(registry.url)}`));
116
+ }
117
+ finally {
118
+ await registry.cleanup();
119
+ }
120
+ }
121
+ catch (error) {
122
+ progress.fail("Browse failed");
123
+ handleCommandError(error, opts.verbose);
124
+ }
125
+ });
126
+ }
127
+ //# sourceMappingURL=browse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browse.js","sourceRoot":"","sources":["../../src/commands/browse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAuB,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAc7C,SAAS,mBAAmB,CAAC,IAAmB;IAC9C,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,IAAI,IAAI,CAAC,YAAY;QAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,IAAI,CAAC,WAAW;QAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,IAAI,CAAC,aAAa;QAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,IAAI,IAAI,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC,aAAa;QAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAkB,EAAE,IAAe;IAC5D,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IACD,OAAO,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,QAAkB,EAClB,UAA4B;IAE5B,MAAM,UAAU,GAAmB,EAAE,CAAC;IAEtC,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uEAAuE,CAAC;SACpF,QAAQ,CACP,cAAc,EACd,6DAA6D,CAC9D;SACA,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,EAAE,KAAK,CAAC;SACtD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,KAAK,CAAC;SACpD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,cAAc,EAAE,yBAAyB,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,EAAE,KAAK,CAAC;SACxD,MAAM,CAAC,SAAS,EAAE,2BAA2B,EAAE,KAAK,CAAC;SACrD,MAAM,CAAC,WAAW,EAAE,oDAAoD,EAAE,KAAK,CAAC;SAChF,MAAM,CAAC,WAAW,EAAE,yBAAyB,EAAE,KAAK,CAAC;SACrD,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,UAA8B,EAAE,IAAmB,EAAE,EAAE;QACpE,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QAEvC,IAAI,CAAC;YACH,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACpC,MAAM,MAAM,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACvE,QAAQ,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YAErC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;YACpC,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;YAC9B,QAAQ,CAAC,OAAO,CACd,mBAAmB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/F,CAAC;YACF,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC1C,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAEpF,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC3C,OAAO,CAAC,kCAAkC,CAAC,CAAC;oBAC5C,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAEjE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;oBACxB,OAAO,CAAC,mBAAmB,CAAC,CAAC;oBAC7B,OAAO;gBACT,CAAC;gBAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,yCAAyC,CAAC,CAAC;oBACnD,OAAO;gBACT,CAAC;gBAED,MAAM,aAAa,GACjB,IAAI,CAAC,GAAG;oBACR,IAAI,CAAC,MAAM;oBACX,CAAC,MAAM,mBAAmB,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;gBAExD,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,OAAO,CAAC,yBAAyB,CAAC,CAAC;oBACnC,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,MAAM,UAAU,GAAG,CAAC,OAAe,EAAU,EAAE,CAC7C,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC;oBAC/B,CAAC,CAAC,OAAO,CAAC,OAAO,CACb,4BAA4B,EAC5B,CAAC,KAAK,EAAE,IAAY,EAAE,EAAU,EAAE,EAAE,CAClC,cAAc,UAAU,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAC3D;oBACH,CAAC,CAAC,OAAO,CAAC;gBAEd,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,QAAQ,EAAE,UAAU,EAAE;oBAChE,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;wBAC7B,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;oBACtC,CAAC;oBACD,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;wBAC5B,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;oBACxC,CAAC;iBACF,CAAC,CAAC;gBAEH,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;gBAE7E,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CACT,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC,MAAM,kBAAkB,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CACjH,CACF,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC/B,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8B1D"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4E1D"}
@@ -1,30 +1,69 @@
1
1
  import chalk from "chalk";
2
- import { handleCommandError, logInfo, logTitle } from "../core/logger.js";
3
- import { readMetadata } from "../metadata/store.js";
2
+ import { createSpinner, handleCommandError, logInfo, logTitle } from "../core/logger.js";
3
+ import { listInstalledAssets } from "../metadata/store.js";
4
+ import { listRegistryAssets } from "../services/install-service.js";
5
+ const TYPE_ORDER = ["skill", "rule", "prompt", "mcp", "preset"];
4
6
  export function registerListCommand(program) {
5
7
  program
6
8
  .command("list")
7
- .description("List installed Noah Cursor assets")
9
+ .description("List all Skills, Rules, Prompts, MCP configs, and Presets in Noah's registry")
10
+ .argument("[repository]", "Local path for development (default: local checkout or bundled registry)")
11
+ .option("--installed", "List locally installed assets only", false)
8
12
  .option("-v, --verbose", "Verbose output", false)
9
- .action(async (opts) => {
13
+ .action(async (repository, opts) => {
14
+ if (opts.installed) {
15
+ try {
16
+ const listed = await listInstalledAssets();
17
+ if (listed.installed.length === 0) {
18
+ logInfo("No assets installed. Use `noah-cursor add` to install some.");
19
+ return;
20
+ }
21
+ logTitle(`Installed assets (${listed.installed.length})`);
22
+ if (listed.registry) {
23
+ console.log(chalk.dim(` Registry: ${listed.registry}`));
24
+ }
25
+ if (listed.updatedAt) {
26
+ console.log(chalk.dim(` Updated: ${listed.updatedAt}`));
27
+ }
28
+ console.log();
29
+ for (const asset of listed.installed) {
30
+ const pathInfo = asset.path ? chalk.dim(` → ${asset.path}`) : "";
31
+ console.log(` ${chalk.cyan(asset.type.padEnd(7))} ${chalk.bold(asset.id)}@${asset.version}${pathInfo}`);
32
+ }
33
+ }
34
+ catch (error) {
35
+ handleCommandError(error, opts.verbose);
36
+ }
37
+ return;
38
+ }
39
+ const spinner = createSpinner("Loading registry…");
10
40
  try {
11
- const metadata = await readMetadata();
12
- if (!metadata || metadata.installed.length === 0) {
13
- logInfo("No assets installed. Use `noah-cursor add` to install some.");
41
+ spinner.start();
42
+ const listed = await listRegistryAssets(repository, { verbose: opts.verbose });
43
+ spinner.stop();
44
+ if (listed.assets.length === 0) {
45
+ logInfo("No assets found in the registry manifest.");
14
46
  return;
15
47
  }
16
- logTitle(`Installed assets (${metadata.installed.length})`);
17
- console.log(chalk.dim(` Registry: ${metadata.registry}`));
18
- if (metadata.updatedAt) {
19
- console.log(chalk.dim(` Updated: ${metadata.updatedAt}`));
20
- }
48
+ logTitle(`Registry assets (${listed.assets.length})`);
49
+ console.log(chalk.dim(` ${listed.name}@${listed.version}`));
50
+ console.log(chalk.dim(` ${listed.registry}`));
21
51
  console.log();
22
- for (const asset of metadata.installed) {
23
- const pathInfo = asset.path ? chalk.dim(` ${asset.path}`) : "";
24
- console.log(` ${chalk.cyan(asset.type.padEnd(7))} ${chalk.bold(asset.id)}@${asset.version}${pathInfo}`);
52
+ for (const type of TYPE_ORDER) {
53
+ const group = listed.assets.filter((asset) => asset.type === type);
54
+ if (group.length === 0) {
55
+ continue;
56
+ }
57
+ console.log(chalk.bold(type === "mcp" ? "MCP" : `${type[0].toUpperCase()}${type.slice(1)}s`));
58
+ for (const asset of group) {
59
+ const desc = asset.description ? chalk.dim(` — ${asset.description}`) : "";
60
+ console.log(` ${chalk.cyan(asset.type.padEnd(7))} ${chalk.bold(asset.id)}@${asset.version}${desc}`);
61
+ }
62
+ console.log();
25
63
  }
26
64
  }
27
65
  catch (error) {
66
+ spinner.stop();
28
67
  handleCommandError(error, opts.verbose);
29
68
  }
30
69
  });
@@ -1 +1 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,IAA2B,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,6DAA6D,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,qBAAqB,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC3D,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,QAAQ,EAAE,CAC5F,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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiC5D"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoC5D"}
@@ -4,9 +4,9 @@ import { searchRegistry } from "../services/install-service.js";
4
4
  export function registerSearchCommand(program) {
5
5
  program
6
6
  .command("search")
7
- .description("Search assets in a registry")
7
+ .description("Search assets in Noah's official registry")
8
8
  .argument("<query>", "Search query")
9
- .option("-r, --registry <url>", "Registry repository URL (defaults to last used)")
9
+ .option("-r, --registry <url>", "Official registry URL or local path (defaults to official / last used)")
10
10
  .option("-v, --verbose", "Verbose output", false)
11
11
  .action(async (query, opts) => {
12
12
  const spinner = createSpinner("Searching registry…");
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;SACnC,MAAM,CAAC,sBAAsB,EAAE,iDAAiD,CAAC;SACjF,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAA8C,EAAE,EAAE;QAC9E,MAAM,OAAO,GAAG,aAAa,CAAC,qBAAqB,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;gBACzD,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,sBAAsB,KAAK,GAAG,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,uBAAuB,KAAK,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YAC9D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE,CAC3F,CAAC;YACJ,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,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzF,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2CAA2C,CAAC;SACxD,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;SACnC,MAAM,CACL,sBAAsB,EACtB,wEAAwE,CACzE;SACA,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,KAAK,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAA8C,EAAE,EAAE;QAC9E,MAAM,OAAO,GAAG,aAAa,CAAC,qBAAqB,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE;gBACzD,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,sBAAsB,KAAK,GAAG,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,uBAAuB,KAAK,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;YAC9D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,OAAO,CAAC,GAAG,CACT,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE,CAC3F,CAAC;YACJ,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,CAAC,CAAC;AACP,CAAC"}
@@ -1,8 +1,14 @@
1
1
  export declare const CLI_NAME = "noah-cursor";
2
- export declare const CLI_VERSION = "1.0.0";
2
+ export declare const CLI_VERSION: string;
3
3
  export declare const CURSOR_DIR = ".cursor";
4
4
  export declare const METADATA_FILE = "noah.json";
5
5
  export declare const MANIFEST_FILE = "manifest.json";
6
+ /** Official Noah asset registry (Skills, Rules, Prompts, MCP, Presets). */
7
+ export declare const OFFICIAL_REGISTRY_OWNER = "itsmenoahpoli";
8
+ export declare const OFFICIAL_REGISTRY_REPO = "noah-cursor";
9
+ export declare const OFFICIAL_REGISTRY = "https://github.com/itsmenoahpoli/noah-cursor";
10
+ /** Sentinel source: load the registry bundled into this package at build time. */
11
+ export declare const BUNDLED_REGISTRY = "bundled:noah-cursor";
6
12
  export declare const ASSET_TYPES: readonly ["skill", "rule", "prompt", "mcp", "preset"];
7
13
  export declare const ASSET_DIRECTORIES: {
8
14
  readonly skill: "skills";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,gBAAgB,CAAC;AACtC,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,UAAU,YAAY,CAAC;AACpC,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,eAAO,MAAM,WAAW,uDAAwD,CAAC;AAEjF,eAAO,MAAM,iBAAiB;;;;;;CAMpB,CAAC;AAEX,eAAO,MAAM,sBAAsB,2DAA4D,CAAC;AAEhG,eAAO,MAAM,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,QAAQ,gBAAgB,CAAC;AACtC,eAAO,MAAM,WAAW,QAAc,CAAC;AACvC,eAAO,MAAM,UAAU,YAAY,CAAC;AACpC,eAAO,MAAM,aAAa,cAAc,CAAC;AACzC,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,2EAA2E;AAC3E,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AACvD,eAAO,MAAM,sBAAsB,gBAAgB,CAAC;AACpD,eAAO,MAAM,iBAAiB,iDAA4E,CAAC;AAE3G,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;AAEtD,eAAO,MAAM,WAAW,uDAAwD,CAAC;AAEjF,eAAO,MAAM,iBAAiB;;;;;;CAMpB,CAAC;AAEX,eAAO,MAAM,sBAAsB,2DAA4D,CAAC;AAEhG,eAAO,MAAM,eAAe,iBAAiB,CAAC"}
@@ -1,8 +1,17 @@
1
+ import { createRequire } from "node:module";
2
+ const require = createRequire(import.meta.url);
3
+ const pkg = require("../../package.json");
1
4
  export const CLI_NAME = "noah-cursor";
2
- export const CLI_VERSION = "1.0.0";
5
+ export const CLI_VERSION = pkg.version;
3
6
  export const CURSOR_DIR = ".cursor";
4
7
  export const METADATA_FILE = "noah.json";
5
8
  export const MANIFEST_FILE = "manifest.json";
9
+ /** Official Noah asset registry (Skills, Rules, Prompts, MCP, Presets). */
10
+ export const OFFICIAL_REGISTRY_OWNER = "itsmenoahpoli";
11
+ export const OFFICIAL_REGISTRY_REPO = "noah-cursor";
12
+ export const OFFICIAL_REGISTRY = `https://github.com/${OFFICIAL_REGISTRY_OWNER}/${OFFICIAL_REGISTRY_REPO}`;
13
+ /** Sentinel source: load the registry bundled into this package at build time. */
14
+ export const BUNDLED_REGISTRY = "bundled:noah-cursor";
6
15
  export const ASSET_TYPES = ["skill", "rule", "prompt", "mcp", "preset"];
7
16
  export const ASSET_DIRECTORIES = {
8
17
  skill: "skills",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAU,CAAC;AAEjF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,SAAS;CACT,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAU,CAAC;AAEhG,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEjE,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC;AACvC,MAAM,CAAC,MAAM,UAAU,GAAG,SAAS,CAAC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAe,CAAC;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,aAAa,CAAC;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,uBAAuB,IAAI,sBAAsB,EAAE,CAAC;AAE3G,kFAAkF;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AAEtD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,CAAU,CAAC;AAEjF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,QAAQ;IACf,IAAI,EAAE,OAAO;IACb,MAAM,EAAE,SAAS;IACjB,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,SAAS;CACT,CAAC;AAEX,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,CAAU,CAAC;AAEhG,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/core/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,aAAa,IAAI,OAAO,CAoBvC"}
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../../src/core/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,aAAa,IAAI,OAAO,CA8CvC"}
@@ -1,20 +1,44 @@
1
1
  import { Command } from "commander";
2
2
  import { CLI_NAME, CLI_VERSION } from "../constants/index.js";
3
3
  import { registerAddCommand } from "../commands/add.js";
4
+ import { registerBrowseCommand } from "../commands/browse.js";
4
5
  import { registerSearchCommand } from "../commands/search.js";
5
6
  import { registerListCommand } from "../commands/list.js";
6
7
  import { registerRemoveCommand } from "../commands/remove.js";
7
8
  import { registerUpdateCommand } from "../commands/update.js";
8
9
  import { registerDoctorCommand } from "../commands/doctor.js";
10
+ import { renderBanner, shouldShowBanner } from "../ui/banner.js";
9
11
  export function createProgram() {
10
12
  const program = new Command();
11
13
  program
12
14
  .name(CLI_NAME)
13
- .description("Install reusable Cursor assets (Skills, Rules, Prompts, MCP, Presets) from GitHub registries")
15
+ .description("Install Noah's reusable Cursor assets (Skills, Rules, Prompts, MCP, Presets)")
14
16
  .version(CLI_VERSION)
17
+ .option("--no-banner", "Hide the NOAH DEV CLI banner")
15
18
  .showHelpAfterError()
16
19
  .showSuggestionAfterError();
20
+ // Show branding above help (`noah-cursor`, `noah-cursor --help`, `… help`)
21
+ program.configureHelp({
22
+ helpWidth: process.stdout.columns || 80,
23
+ });
24
+ program.addHelpText("beforeAll", () => {
25
+ // Banner for explicit --help / help command (empty argv is handled in index.ts)
26
+ if (shouldShowBanner()) {
27
+ renderBanner();
28
+ }
29
+ return "";
30
+ });
31
+ // Show branding before every subcommand action
32
+ program.hook("preAction", () => {
33
+ renderBanner();
34
+ });
35
+ // If Commander still routes to the root with no subcommand, show help (exit 0)
36
+ program.action(() => {
37
+ renderBanner();
38
+ program.outputHelp();
39
+ });
17
40
  registerAddCommand(program);
41
+ registerBrowseCommand(program);
18
42
  registerSearchCommand(program);
19
43
  registerListCommand(program);
20
44
  registerRemoveCommand(program);
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/core/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CACV,8FAA8F,CAC/F;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,kBAAkB,EAAE;SACpB,wBAAwB,EAAE,CAAC;IAE9B,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../../src/core/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEjE,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CACV,8EAA8E,CAC/E;SACA,OAAO,CAAC,WAAW,CAAC;SACpB,MAAM,CAAC,aAAa,EAAE,8BAA8B,CAAC;SACrD,kBAAkB,EAAE;SACpB,wBAAwB,EAAE,CAAC;IAE9B,2EAA2E;IAC3E,OAAO,CAAC,aAAa,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;KACxC,CAAC,CAAC;IAEH,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE;QACpC,gFAAgF;QAChF,IAAI,gBAAgB,EAAE,EAAE,CAAC;YACvB,YAAY,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;QAC7B,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE;QAClB,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/dist/index.js CHANGED
@@ -1,7 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import { createProgram } from "./core/program.js";
3
+ import { renderBanner } from "./ui/banner.js";
3
4
  async function main() {
4
5
  const program = createProgram();
6
+ const args = process.argv.slice(2);
7
+ // No arguments: show branding + help, exit successfully (not an error)
8
+ if (args.length === 0) {
9
+ renderBanner(true);
10
+ program.outputHelp();
11
+ return;
12
+ }
5
13
  await program.parseAsync(process.argv);
6
14
  }
7
15
  main().catch((error) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,uEAAuE;IACvE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -5,4 +5,16 @@ export declare function writeMetadata(metadata: NoahMetadata, cwd?: string): Pro
5
5
  export declare function upsertInstalledAssets(registry: string, assets: InstalledAsset[], cwd?: string): Promise<NoahMetadata>;
6
6
  export declare function removeInstalledAsset(type: string, id: string, cwd?: string): Promise<NoahMetadata | null>;
7
7
  export declare function findInstalled(metadata: NoahMetadata, type: string, id: string): InstalledAsset | undefined;
8
+ /** Scan `.cursor/{skills,rules,prompts,mcp}` for asset folders on disk. */
9
+ export declare function scanCursorAssets(cwd?: string): Promise<InstalledAsset[]>;
10
+ export interface ListedAssets {
11
+ registry?: string;
12
+ updatedAt?: string;
13
+ installed: InstalledAsset[];
14
+ }
15
+ /**
16
+ * List installed assets by merging `.cursor/noah.json` with folders found on disk.
17
+ * Project skills (e.g. publish-npm) show up even when not recorded in metadata.
18
+ */
19
+ export declare function listInstalledAssets(cwd?: string): Promise<ListedAssets>;
8
20
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/metadata/store.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAG3B,wBAAgB,eAAe,CAAC,GAAG,SAAgB,GAAG,MAAM,CAE3D;AAED,wBAAsB,YAAY,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAmBpF;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,YAAY,EACtB,GAAG,SAAgB,GAClB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EAAE,EACxB,GAAG,SAAgB,GAClB,OAAO,CAAC,YAAY,CAAC,CA0BvB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,GAAG,SAAgB,GAClB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAiB9B;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,cAAc,GAAG,SAAS,CAE5B"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/metadata/store.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAK3B,wBAAgB,eAAe,CAAC,GAAG,SAAgB,GAAG,MAAM,CAE3D;AAED,wBAAsB,YAAY,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAmBpF;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,YAAY,EACtB,GAAG,SAAgB,GAClB,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,EAAE,EACxB,GAAG,SAAgB,GAClB,OAAO,CAAC,YAAY,CAAC,CA0BvB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,GAAG,SAAgB,GAClB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAiB9B;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,GACT,cAAc,GAAG,SAAS,CAE5B;AAED,2EAA2E;AAC3E,wBAAsB,gBAAgB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAiCrF;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CA6BpF"}