noah-cursor 1.0.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -0
  3. package/dist/commands/add.d.ts +3 -0
  4. package/dist/commands/add.d.ts.map +1 -0
  5. package/dist/commands/add.js +56 -0
  6. package/dist/commands/add.js.map +1 -0
  7. package/dist/commands/doctor.d.ts +3 -0
  8. package/dist/commands/doctor.d.ts.map +1 -0
  9. package/dist/commands/doctor.js +38 -0
  10. package/dist/commands/doctor.js.map +1 -0
  11. package/dist/commands/list.d.ts +3 -0
  12. package/dist/commands/list.d.ts.map +1 -0
  13. package/dist/commands/list.js +32 -0
  14. package/dist/commands/list.js.map +1 -0
  15. package/dist/commands/remove.d.ts +3 -0
  16. package/dist/commands/remove.d.ts.map +1 -0
  17. package/dist/commands/remove.js +37 -0
  18. package/dist/commands/remove.js.map +1 -0
  19. package/dist/commands/search.d.ts +3 -0
  20. package/dist/commands/search.d.ts.map +1 -0
  21. package/dist/commands/search.js +35 -0
  22. package/dist/commands/search.js.map +1 -0
  23. package/dist/commands/update.d.ts +3 -0
  24. package/dist/commands/update.d.ts.map +1 -0
  25. package/dist/commands/update.js +35 -0
  26. package/dist/commands/update.js.map +1 -0
  27. package/dist/constants/index.d.ts +16 -0
  28. package/dist/constants/index.d.ts.map +1 -0
  29. package/dist/constants/index.js +16 -0
  30. package/dist/constants/index.js.map +1 -0
  31. package/dist/core/errors.d.ts +22 -0
  32. package/dist/core/errors.d.ts.map +1 -0
  33. package/dist/core/errors.js +44 -0
  34. package/dist/core/errors.js.map +1 -0
  35. package/dist/core/logger.d.ts +11 -0
  36. package/dist/core/logger.d.ts.map +1 -0
  37. package/dist/core/logger.js +45 -0
  38. package/dist/core/logger.js.map +1 -0
  39. package/dist/core/program.d.ts +3 -0
  40. package/dist/core/program.d.ts.map +1 -0
  41. package/dist/core/program.js +25 -0
  42. package/dist/core/program.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +11 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/installers/asset-installer.d.ts +14 -0
  48. package/dist/installers/asset-installer.d.ts.map +1 -0
  49. package/dist/installers/asset-installer.js +55 -0
  50. package/dist/installers/asset-installer.js.map +1 -0
  51. package/dist/metadata/store.d.ts +8 -0
  52. package/dist/metadata/store.d.ts.map +1 -0
  53. package/dist/metadata/store.js +78 -0
  54. package/dist/metadata/store.js.map +1 -0
  55. package/dist/registry/cloner.d.ts +12 -0
  56. package/dist/registry/cloner.d.ts.map +1 -0
  57. package/dist/registry/cloner.js +51 -0
  58. package/dist/registry/cloner.js.map +1 -0
  59. package/dist/registry/validator.d.ts +5 -0
  60. package/dist/registry/validator.d.ts.map +1 -0
  61. package/dist/registry/validator.js +47 -0
  62. package/dist/registry/validator.js.map +1 -0
  63. package/dist/services/doctor-service.d.ts +3 -0
  64. package/dist/services/doctor-service.d.ts.map +1 -0
  65. package/dist/services/doctor-service.js +105 -0
  66. package/dist/services/doctor-service.js.map +1 -0
  67. package/dist/services/install-service.d.ts +18 -0
  68. package/dist/services/install-service.d.ts.map +1 -0
  69. package/dist/services/install-service.js +280 -0
  70. package/dist/services/install-service.js.map +1 -0
  71. package/dist/types/index.d.ts +403 -0
  72. package/dist/types/index.d.ts.map +1 -0
  73. package/dist/types/index.js +44 -0
  74. package/dist/types/index.js.map +1 -0
  75. package/dist/utils/assets.d.ts +14 -0
  76. package/dist/utils/assets.d.ts.map +1 -0
  77. package/dist/utils/assets.js +57 -0
  78. package/dist/utils/assets.js.map +1 -0
  79. package/dist/utils/fs.d.ts +8 -0
  80. package/dist/utils/fs.d.ts.map +1 -0
  81. package/dist/utils/fs.js +42 -0
  82. package/dist/utils/fs.js.map +1 -0
  83. package/package.json +70 -0
@@ -0,0 +1,280 @@
1
+ import { confirm } from "@inquirer/prompts";
2
+ import fs from "fs-extra";
3
+ import { NotFoundError, ValidationError } from "../core/errors.js";
4
+ import { logInfo, logSuccess, logVerbose, logWarn } from "../core/logger.js";
5
+ import { installAsset, removeAssetFiles } from "../installers/asset-installer.js";
6
+ import { findInstalled, readMetadata, removeInstalledAsset, upsertInstalledAssets, } from "../metadata/store.js";
7
+ import { cloneRegistry, loadLocalRegistry } from "../registry/cloner.js";
8
+ import { findAssetInManifest, getManifestAssets, listAllManifestAssets, } from "../utils/assets.js";
9
+ import { displayRegistryUrl, pluralize } from "../utils/fs.js";
10
+ async function openRegistry(repository, options = {}) {
11
+ if (repository.startsWith("file://")) {
12
+ return loadLocalRegistry(repository.replace(/^file:\/\//, ""));
13
+ }
14
+ const looksRemote = repository.includes("github.com") ||
15
+ repository.startsWith("git@") ||
16
+ repository.startsWith("http://") ||
17
+ repository.startsWith("https://") ||
18
+ /^[\w.-]+\/[\w.-]+$/.test(repository);
19
+ if (!looksRemote && (await fs.pathExists(repository))) {
20
+ return loadLocalRegistry(repository);
21
+ }
22
+ return cloneRegistry(repository, options);
23
+ }
24
+ function collectRequests(options) {
25
+ const requests = [];
26
+ if (options.skill)
27
+ requests.push({ type: "skill", id: options.skill });
28
+ if (options.rule)
29
+ requests.push({ type: "rule", id: options.rule });
30
+ if (options.prompt)
31
+ requests.push({ type: "prompt", id: options.prompt });
32
+ if (options.mcp)
33
+ requests.push({ type: "mcp", id: options.mcp });
34
+ if (options.preset)
35
+ requests.push({ type: "preset", id: options.preset });
36
+ return requests;
37
+ }
38
+ function expandPreset(manifest, presetId) {
39
+ const preset = findAssetInManifest(manifest, "preset", presetId);
40
+ if (!preset) {
41
+ throw new NotFoundError(`Preset "${presetId}" not found in registry manifest`);
42
+ }
43
+ const requests = [];
44
+ const includes = preset.includes ?? {};
45
+ for (const id of includes.skills ?? []) {
46
+ requests.push({ type: "skill", id });
47
+ }
48
+ for (const id of includes.rules ?? []) {
49
+ requests.push({ type: "rule", id });
50
+ }
51
+ for (const id of includes.prompts ?? []) {
52
+ requests.push({ type: "prompt", id });
53
+ }
54
+ for (const id of includes.mcp ?? []) {
55
+ requests.push({ type: "mcp", id });
56
+ }
57
+ if (requests.length === 0) {
58
+ throw new ValidationError(`Preset "${presetId}" does not include any assets`);
59
+ }
60
+ return requests;
61
+ }
62
+ function resolveInstallTargets(manifest, options) {
63
+ if (options.all) {
64
+ const requests = [];
65
+ for (const type of ["skill", "rule", "prompt", "mcp"]) {
66
+ for (const asset of getManifestAssets(manifest, type)) {
67
+ requests.push({ type, id: asset.id });
68
+ }
69
+ }
70
+ return { requests, presets: manifest.presets.map((p) => p.id) };
71
+ }
72
+ const collected = collectRequests(options);
73
+ if (collected.length === 0) {
74
+ throw new ValidationError("Specify at least one asset with --skill, --rule, --prompt, --mcp, --preset, or use --all");
75
+ }
76
+ const requests = [];
77
+ const presets = [];
78
+ const seen = new Set();
79
+ for (const request of collected) {
80
+ if (request.type === "preset") {
81
+ presets.push(request.id);
82
+ for (const expanded of expandPreset(manifest, request.id)) {
83
+ const key = `${expanded.type}:${expanded.id}`;
84
+ if (!seen.has(key)) {
85
+ seen.add(key);
86
+ requests.push(expanded);
87
+ }
88
+ }
89
+ }
90
+ else {
91
+ const key = `${request.type}:${request.id}`;
92
+ if (!seen.has(key)) {
93
+ seen.add(key);
94
+ requests.push(request);
95
+ }
96
+ }
97
+ }
98
+ return { requests, presets };
99
+ }
100
+ export async function addFromRegistry(repository, options) {
101
+ const registry = await openRegistry(repository, { verbose: options.verbose });
102
+ try {
103
+ const { requests, presets } = resolveInstallTargets(registry.manifest, options);
104
+ logVerbose(`Resolved ${requests.length} ${pluralize(requests.length, "asset")} ` +
105
+ `(${presets.length} ${pluralize(presets.length, "preset")})`, options.verbose);
106
+ if (!options.yes && !options.dryRun && requests.length > 5) {
107
+ const ok = await confirm({
108
+ message: `Install ${requests.length} assets from ${displayRegistryUrl(registry.url)}?`,
109
+ default: true,
110
+ });
111
+ if (!ok) {
112
+ logWarn("Installation cancelled.");
113
+ return [];
114
+ }
115
+ }
116
+ const results = [];
117
+ const installedMeta = [];
118
+ for (const request of requests) {
119
+ const result = await installAsset(registry.path, registry.manifest, request.type, request.id, {
120
+ force: options.force,
121
+ dryRun: options.dryRun,
122
+ verbose: options.verbose,
123
+ });
124
+ results.push(result);
125
+ if (!result.skipped) {
126
+ installedMeta.push({
127
+ type: result.type,
128
+ id: result.id,
129
+ version: result.version,
130
+ path: result.path,
131
+ installedAt: new Date().toISOString(),
132
+ });
133
+ }
134
+ else {
135
+ logWarn(`Skipped ${result.type}/${result.id}: ${result.reason}`);
136
+ }
137
+ }
138
+ for (const presetId of presets) {
139
+ const preset = findAssetInManifest(registry.manifest, "preset", presetId);
140
+ if (preset && !options.dryRun) {
141
+ installedMeta.push({
142
+ type: "preset",
143
+ id: presetId,
144
+ version: preset.version,
145
+ installedAt: new Date().toISOString(),
146
+ });
147
+ }
148
+ }
149
+ if (!options.dryRun && installedMeta.length > 0) {
150
+ await upsertInstalledAssets(displayRegistryUrl(registry.url), installedMeta);
151
+ }
152
+ const installed = results.filter((r) => !r.skipped);
153
+ if (options.dryRun) {
154
+ logInfo(`[dry-run] Would install ${installed.length} ${pluralize(installed.length, "asset")}`);
155
+ }
156
+ else {
157
+ logSuccess(`Installed ${installed.length} ${pluralize(installed.length, "asset")} ` +
158
+ `from ${displayRegistryUrl(registry.url)}`);
159
+ }
160
+ return results;
161
+ }
162
+ finally {
163
+ await registry.cleanup();
164
+ }
165
+ }
166
+ export async function searchRegistry(query, repository, options = {}) {
167
+ const metadata = await readMetadata();
168
+ const repo = repository ?? metadata?.registry;
169
+ if (!repo) {
170
+ throw new ValidationError("No registry specified. Pass a repository URL or install assets first.");
171
+ }
172
+ const registry = await openRegistry(repo, options);
173
+ try {
174
+ const needle = query.toLowerCase();
175
+ return listAllManifestAssets(registry.manifest).filter((asset) => {
176
+ const haystack = [
177
+ asset.id,
178
+ asset.description ?? "",
179
+ ...(asset.tags ?? []),
180
+ asset.type,
181
+ ]
182
+ .join(" ")
183
+ .toLowerCase();
184
+ return haystack.includes(needle);
185
+ });
186
+ }
187
+ finally {
188
+ await registry.cleanup();
189
+ }
190
+ }
191
+ export async function removeAsset(type, id, options = {}) {
192
+ const metadata = await readMetadata();
193
+ if (!metadata) {
194
+ throw new NotFoundError("No installed assets found (.cursor/noah.json missing)");
195
+ }
196
+ const installed = findInstalled(metadata, type, id);
197
+ if (!installed && !options.force) {
198
+ throw new NotFoundError(`${type} "${id}" is not recorded in .cursor/noah.json`);
199
+ }
200
+ if (!options.yes && !options.dryRun) {
201
+ const ok = await confirm({
202
+ message: `Remove ${type}/${id}?`,
203
+ default: false,
204
+ });
205
+ if (!ok) {
206
+ logWarn("Removal cancelled.");
207
+ return;
208
+ }
209
+ }
210
+ await removeAssetFiles(type, id, options);
211
+ if (!options.dryRun) {
212
+ await removeInstalledAsset(type, id);
213
+ logSuccess(`Removed ${type}/${id}`);
214
+ }
215
+ else {
216
+ logInfo(`[dry-run] Would remove ${type}/${id}`);
217
+ }
218
+ }
219
+ export async function updateAssets(options = {}) {
220
+ const metadata = await readMetadata();
221
+ if (!metadata || metadata.installed.length === 0) {
222
+ throw new NotFoundError("No installed assets to update");
223
+ }
224
+ const nonPresets = metadata.installed.filter((a) => a.type !== "preset");
225
+ const presets = metadata.installed.filter((a) => a.type === "preset");
226
+ if (!options.yes && !options.dryRun) {
227
+ const ok = await confirm({
228
+ message: `Update ${nonPresets.length} ${pluralize(nonPresets.length, "asset")} from ${metadata.registry}?`,
229
+ default: true,
230
+ });
231
+ if (!ok) {
232
+ logWarn("Update cancelled.");
233
+ return [];
234
+ }
235
+ }
236
+ const registry = await openRegistry(metadata.registry, { verbose: options.verbose });
237
+ try {
238
+ const results = [];
239
+ const installedMeta = [];
240
+ for (const asset of nonPresets) {
241
+ const result = await installAsset(registry.path, registry.manifest, asset.type, asset.id, {
242
+ force: true,
243
+ dryRun: options.dryRun,
244
+ verbose: options.verbose,
245
+ });
246
+ results.push(result);
247
+ if (!result.skipped) {
248
+ installedMeta.push({
249
+ type: result.type,
250
+ id: result.id,
251
+ version: result.version,
252
+ path: result.path,
253
+ installedAt: new Date().toISOString(),
254
+ });
255
+ }
256
+ }
257
+ for (const preset of presets) {
258
+ const entry = findAssetInManifest(registry.manifest, "preset", preset.id);
259
+ if (entry && !options.dryRun) {
260
+ installedMeta.push({
261
+ type: "preset",
262
+ id: preset.id,
263
+ version: entry.version,
264
+ installedAt: new Date().toISOString(),
265
+ });
266
+ }
267
+ }
268
+ if (!options.dryRun && installedMeta.length > 0) {
269
+ await upsertInstalledAssets(metadata.registry, installedMeta);
270
+ }
271
+ logSuccess(options.dryRun
272
+ ? `[dry-run] Would update ${results.length} ${pluralize(results.length, "asset")}`
273
+ : `Updated ${results.length} ${pluralize(results.length, "asset")}`);
274
+ return results;
275
+ }
276
+ finally {
277
+ await registry.cleanup();
278
+ }
279
+ }
280
+ //# sourceMappingURL=install-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-service.js","sourceRoot":"","sources":["../../src/services/install-service.ts"],"names":[],"mappings":"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"}