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.
- package/LICENSE +21 -0
- package/README.md +171 -0
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +56 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +38 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +32 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/remove.d.ts +3 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +37 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +35 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +35 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/constants/index.d.ts +16 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +16 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/core/errors.d.ts +22 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +44 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/logger.d.ts +11 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +45 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/program.d.ts +3 -0
- package/dist/core/program.d.ts.map +1 -0
- package/dist/core/program.js +25 -0
- package/dist/core/program.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/installers/asset-installer.d.ts +14 -0
- package/dist/installers/asset-installer.d.ts.map +1 -0
- package/dist/installers/asset-installer.js +55 -0
- package/dist/installers/asset-installer.js.map +1 -0
- package/dist/metadata/store.d.ts +8 -0
- package/dist/metadata/store.d.ts.map +1 -0
- package/dist/metadata/store.js +78 -0
- package/dist/metadata/store.js.map +1 -0
- package/dist/registry/cloner.d.ts +12 -0
- package/dist/registry/cloner.d.ts.map +1 -0
- package/dist/registry/cloner.js +51 -0
- package/dist/registry/cloner.js.map +1 -0
- package/dist/registry/validator.d.ts +5 -0
- package/dist/registry/validator.d.ts.map +1 -0
- package/dist/registry/validator.js +47 -0
- package/dist/registry/validator.js.map +1 -0
- package/dist/services/doctor-service.d.ts +3 -0
- package/dist/services/doctor-service.d.ts.map +1 -0
- package/dist/services/doctor-service.js +105 -0
- package/dist/services/doctor-service.js.map +1 -0
- package/dist/services/install-service.d.ts +18 -0
- package/dist/services/install-service.d.ts.map +1 -0
- package/dist/services/install-service.js +280 -0
- package/dist/services/install-service.js.map +1 -0
- package/dist/types/index.d.ts +403 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +44 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/assets.d.ts +14 -0
- package/dist/utils/assets.d.ts.map +1 -0
- package/dist/utils/assets.js +57 -0
- package/dist/utils/assets.js.map +1 -0
- package/dist/utils/fs.d.ts +8 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +42 -0
- package/dist/utils/fs.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Ora } from "ora";
|
|
2
|
+
export declare function createSpinner(text: string): Ora;
|
|
3
|
+
export declare function logSuccess(message: string): void;
|
|
4
|
+
export declare function logError(message: string): void;
|
|
5
|
+
export declare function logWarn(message: string): void;
|
|
6
|
+
export declare function logInfo(message: string): void;
|
|
7
|
+
export declare function logVerbose(message: string, verbose?: boolean): void;
|
|
8
|
+
export declare function logTitle(title: string): void;
|
|
9
|
+
export declare function formatError(error: unknown): string;
|
|
10
|
+
export declare function handleCommandError(error: unknown, verbose?: boolean): never;
|
|
11
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAGpC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAE/C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAInE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAQlD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,KAAK,CAM3E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import ora from "ora";
|
|
3
|
+
import { isNoahError } from "./errors.js";
|
|
4
|
+
export function createSpinner(text) {
|
|
5
|
+
return ora({ text, spinner: "dots" });
|
|
6
|
+
}
|
|
7
|
+
export function logSuccess(message) {
|
|
8
|
+
console.log(`${chalk.green("✔")} ${message}`);
|
|
9
|
+
}
|
|
10
|
+
export function logError(message) {
|
|
11
|
+
console.error(`${chalk.red("✖")} ${message}`);
|
|
12
|
+
}
|
|
13
|
+
export function logWarn(message) {
|
|
14
|
+
console.warn(`${chalk.yellow("⚠")} ${message}`);
|
|
15
|
+
}
|
|
16
|
+
export function logInfo(message) {
|
|
17
|
+
console.log(`${chalk.cyan("ℹ")} ${message}`);
|
|
18
|
+
}
|
|
19
|
+
export function logVerbose(message, verbose) {
|
|
20
|
+
if (verbose) {
|
|
21
|
+
console.log(chalk.dim(` ${message}`));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export function logTitle(title) {
|
|
25
|
+
console.log();
|
|
26
|
+
console.log(chalk.bold.cyan(title));
|
|
27
|
+
console.log(chalk.dim("─".repeat(Math.min(title.length, 40))));
|
|
28
|
+
}
|
|
29
|
+
export function formatError(error) {
|
|
30
|
+
if (isNoahError(error)) {
|
|
31
|
+
return `${error.message}${error.code ? chalk.dim(` [${error.code}]`) : ""}`;
|
|
32
|
+
}
|
|
33
|
+
if (error instanceof Error) {
|
|
34
|
+
return error.message;
|
|
35
|
+
}
|
|
36
|
+
return String(error);
|
|
37
|
+
}
|
|
38
|
+
export function handleCommandError(error, verbose) {
|
|
39
|
+
logError(formatError(error));
|
|
40
|
+
if (verbose && error instanceof Error && error.stack) {
|
|
41
|
+
console.error(chalk.dim(error.stack));
|
|
42
|
+
}
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAiB,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,OAAiB;IAC3D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC9E,CAAC;IACD,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,OAAiB;IAClE,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7B,IAAI,OAAO,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACrD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { CLI_NAME, CLI_VERSION } from "../constants/index.js";
|
|
3
|
+
import { registerAddCommand } from "../commands/add.js";
|
|
4
|
+
import { registerSearchCommand } from "../commands/search.js";
|
|
5
|
+
import { registerListCommand } from "../commands/list.js";
|
|
6
|
+
import { registerRemoveCommand } from "../commands/remove.js";
|
|
7
|
+
import { registerUpdateCommand } from "../commands/update.js";
|
|
8
|
+
import { registerDoctorCommand } from "../commands/doctor.js";
|
|
9
|
+
export function createProgram() {
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name(CLI_NAME)
|
|
13
|
+
.description("Install reusable Cursor assets (Skills, Rules, Prompts, MCP, Presets) from GitHub registries")
|
|
14
|
+
.version(CLI_VERSION)
|
|
15
|
+
.showHelpAfterError()
|
|
16
|
+
.showSuggestionAfterError();
|
|
17
|
+
registerAddCommand(program);
|
|
18
|
+
registerSearchCommand(program);
|
|
19
|
+
registerListCommand(program);
|
|
20
|
+
registerRemoveCommand(program);
|
|
21
|
+
registerUpdateCommand(program);
|
|
22
|
+
registerDoctorCommand(program);
|
|
23
|
+
return program;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=program.js.map
|
|
@@ -0,0 +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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createProgram } from "./core/program.js";
|
|
3
|
+
async function main() {
|
|
4
|
+
const program = createProgram();
|
|
5
|
+
await program.parseAsync(process.argv);
|
|
6
|
+
}
|
|
7
|
+
main().catch((error) => {
|
|
8
|
+
console.error(error);
|
|
9
|
+
process.exit(1);
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AssetType, InstallResult, Manifest } from "../types/index.js";
|
|
2
|
+
export interface InstallerOptions {
|
|
3
|
+
force?: boolean;
|
|
4
|
+
dryRun?: boolean;
|
|
5
|
+
verbose?: boolean;
|
|
6
|
+
cwd?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function installAsset(registryPath: string, manifest: Manifest, type: AssetType, id: string, options?: InstallerOptions): Promise<InstallResult>;
|
|
9
|
+
export declare function removeAssetFiles(type: AssetType, id: string, options?: {
|
|
10
|
+
cwd?: string;
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
verbose?: boolean;
|
|
13
|
+
}): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=asset-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-installer.d.ts","sourceRoot":"","sources":["../../src/installers/asset-installer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAS5E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,YAAY,CAChC,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,aAAa,CAAC,CAkDxB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,MAAM,EACV,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClE,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import { ConflictError, NotFoundError } from "../core/errors.js";
|
|
4
|
+
import { logVerbose } from "../core/logger.js";
|
|
5
|
+
import { findAssetInManifest, resolveAssetPath, assetTypeToDir, } from "../utils/assets.js";
|
|
6
|
+
import { assertAssetExists } from "../registry/validator.js";
|
|
7
|
+
import { resolveCursorDir } from "../utils/fs.js";
|
|
8
|
+
export async function installAsset(registryPath, manifest, type, id, options = {}) {
|
|
9
|
+
const entry = findAssetInManifest(manifest, type, id);
|
|
10
|
+
if (!entry) {
|
|
11
|
+
throw new NotFoundError(`${type} "${id}" not found in registry manifest`);
|
|
12
|
+
}
|
|
13
|
+
if (type === "preset") {
|
|
14
|
+
throw new ConflictError(`Preset "${id}" must be expanded before installation. Use the install service.`);
|
|
15
|
+
}
|
|
16
|
+
const sourceRelative = resolveAssetPath(type, id, entry.path);
|
|
17
|
+
await assertAssetExists(registryPath, sourceRelative);
|
|
18
|
+
const sourcePath = path.join(registryPath, sourceRelative);
|
|
19
|
+
const targetDir = path.join(resolveCursorDir(options.cwd), assetTypeToDir(type), id);
|
|
20
|
+
if ((await fs.pathExists(targetDir)) && !options.force) {
|
|
21
|
+
return {
|
|
22
|
+
type,
|
|
23
|
+
id,
|
|
24
|
+
version: entry.version,
|
|
25
|
+
path: path.relative(options.cwd ?? process.cwd(), targetDir),
|
|
26
|
+
skipped: true,
|
|
27
|
+
reason: "already exists (use --force to overwrite)",
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
logVerbose(`${options.dryRun ? "[dry-run] " : ""}Install ${type}/${id}: ${sourcePath} → ${targetDir}`, options.verbose);
|
|
31
|
+
if (!options.dryRun) {
|
|
32
|
+
await fs.ensureDir(path.dirname(targetDir));
|
|
33
|
+
await fs.remove(targetDir);
|
|
34
|
+
await fs.copy(sourcePath, targetDir);
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
type,
|
|
38
|
+
id,
|
|
39
|
+
version: entry.version,
|
|
40
|
+
path: path.join(assetTypeToDir(type), id),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export async function removeAssetFiles(type, id, options = {}) {
|
|
44
|
+
if (type === "preset") {
|
|
45
|
+
// Presets don't install files directly
|
|
46
|
+
return `preset:${id}`;
|
|
47
|
+
}
|
|
48
|
+
const targetDir = path.join(resolveCursorDir(options.cwd), assetTypeToDir(type), id);
|
|
49
|
+
logVerbose(`${options.dryRun ? "[dry-run] " : ""}Remove ${targetDir}`, options.verbose);
|
|
50
|
+
if (!options.dryRun && (await fs.pathExists(targetDir))) {
|
|
51
|
+
await fs.remove(targetDir);
|
|
52
|
+
}
|
|
53
|
+
return path.join(assetTypeToDir(type), id);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=asset-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-installer.js","sourceRoot":"","sources":["../../src/installers/asset-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type InstalledAsset, type NoahMetadata } from "../types/index.js";
|
|
2
|
+
export declare function getMetadataPath(cwd?: string): string;
|
|
3
|
+
export declare function readMetadata(cwd?: string): Promise<NoahMetadata | null>;
|
|
4
|
+
export declare function writeMetadata(metadata: NoahMetadata, cwd?: string): Promise<void>;
|
|
5
|
+
export declare function upsertInstalledAssets(registry: string, assets: InstalledAsset[], cwd?: string): Promise<NoahMetadata>;
|
|
6
|
+
export declare function removeInstalledAsset(type: string, id: string, cwd?: string): Promise<NoahMetadata | null>;
|
|
7
|
+
export declare function findInstalled(metadata: NoahMetadata, type: string, id: string): InstalledAsset | undefined;
|
|
8
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import { CURSOR_DIR, METADATA_FILE } from "../constants/index.js";
|
|
4
|
+
import { MetadataError } from "../core/errors.js";
|
|
5
|
+
import { NoahMetadataSchema, } from "../types/index.js";
|
|
6
|
+
import { resolveProjectRoot } from "../utils/fs.js";
|
|
7
|
+
export function getMetadataPath(cwd = process.cwd()) {
|
|
8
|
+
return path.join(resolveProjectRoot(cwd), CURSOR_DIR, METADATA_FILE);
|
|
9
|
+
}
|
|
10
|
+
export async function readMetadata(cwd = process.cwd()) {
|
|
11
|
+
const metadataPath = getMetadataPath(cwd);
|
|
12
|
+
if (!(await fs.pathExists(metadataPath))) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const raw = await fs.readJson(metadataPath);
|
|
17
|
+
const parsed = NoahMetadataSchema.safeParse(raw);
|
|
18
|
+
if (!parsed.success) {
|
|
19
|
+
throw new MetadataError(`Invalid ${METADATA_FILE}`, parsed.error.flatten());
|
|
20
|
+
}
|
|
21
|
+
return parsed.data;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (error instanceof MetadataError) {
|
|
25
|
+
throw error;
|
|
26
|
+
}
|
|
27
|
+
throw new MetadataError(`Failed to read ${METADATA_FILE}: ${String(error)}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export async function writeMetadata(metadata, cwd = process.cwd()) {
|
|
31
|
+
const metadataPath = getMetadataPath(cwd);
|
|
32
|
+
await fs.ensureDir(path.dirname(metadataPath));
|
|
33
|
+
const payload = {
|
|
34
|
+
...metadata,
|
|
35
|
+
updatedAt: new Date().toISOString(),
|
|
36
|
+
};
|
|
37
|
+
const parsed = NoahMetadataSchema.safeParse(payload);
|
|
38
|
+
if (!parsed.success) {
|
|
39
|
+
throw new MetadataError(`Invalid metadata payload`, parsed.error.flatten());
|
|
40
|
+
}
|
|
41
|
+
await fs.writeJson(metadataPath, parsed.data, { spaces: 2 });
|
|
42
|
+
}
|
|
43
|
+
export async function upsertInstalledAssets(registry, assets, cwd = process.cwd()) {
|
|
44
|
+
const existing = (await readMetadata(cwd)) ?? {
|
|
45
|
+
registry,
|
|
46
|
+
installed: [],
|
|
47
|
+
};
|
|
48
|
+
const byKey = new Map(existing.installed.map((asset) => [`${asset.type}:${asset.id}`, asset]));
|
|
49
|
+
for (const asset of assets) {
|
|
50
|
+
byKey.set(`${asset.type}:${asset.id}`, {
|
|
51
|
+
...asset,
|
|
52
|
+
installedAt: asset.installedAt ?? new Date().toISOString(),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const metadata = {
|
|
56
|
+
registry,
|
|
57
|
+
installed: Array.from(byKey.values()).sort((a, b) => `${a.type}:${a.id}`.localeCompare(`${b.type}:${b.id}`)),
|
|
58
|
+
};
|
|
59
|
+
await writeMetadata(metadata, cwd);
|
|
60
|
+
return metadata;
|
|
61
|
+
}
|
|
62
|
+
export async function removeInstalledAsset(type, id, cwd = process.cwd()) {
|
|
63
|
+
const existing = await readMetadata(cwd);
|
|
64
|
+
if (!existing) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
const installed = existing.installed.filter((asset) => !(asset.type === type && asset.id === id));
|
|
68
|
+
const metadata = {
|
|
69
|
+
...existing,
|
|
70
|
+
installed,
|
|
71
|
+
};
|
|
72
|
+
await writeMetadata(metadata, cwd);
|
|
73
|
+
return metadata;
|
|
74
|
+
}
|
|
75
|
+
export function findInstalled(metadata, type, id) {
|
|
76
|
+
return metadata.installed.find((asset) => asset.type === type && asset.id === id);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/metadata/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Manifest } from "../types/index.js";
|
|
2
|
+
export interface ClonedRegistry {
|
|
3
|
+
path: string;
|
|
4
|
+
url: string;
|
|
5
|
+
manifest: Manifest;
|
|
6
|
+
cleanup: () => Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
export declare function cloneRegistry(repository: string, options?: {
|
|
9
|
+
verbose?: boolean;
|
|
10
|
+
}): Promise<ClonedRegistry>;
|
|
11
|
+
export declare function loadLocalRegistry(registryPath: string): Promise<ClonedRegistry>;
|
|
12
|
+
//# sourceMappingURL=cloner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloner.d.ts","sourceRoot":"","sources":["../../src/registry/cloner.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,cAAc,CAAC,CA8BzB;AAED,wBAAsB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAiBrF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import { simpleGit } from "simple-git";
|
|
4
|
+
import { RegistryError } from "../core/errors.js";
|
|
5
|
+
import { logVerbose } from "../core/logger.js";
|
|
6
|
+
import { cleanupTempDir, createTempDir, normalizeGitHubUrl } from "../utils/fs.js";
|
|
7
|
+
import { readManifest, validateRegistryStructure } from "./validator.js";
|
|
8
|
+
export async function cloneRegistry(repository, options = {}) {
|
|
9
|
+
const url = normalizeGitHubUrl(repository);
|
|
10
|
+
const tempDir = await createTempDir();
|
|
11
|
+
logVerbose(`Cloning ${url} → ${tempDir}`, options.verbose);
|
|
12
|
+
try {
|
|
13
|
+
const git = simpleGit();
|
|
14
|
+
await git.clone(url, tempDir, ["--depth", "1"]);
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
await cleanupTempDir(tempDir);
|
|
18
|
+
throw new RegistryError(`Failed to clone repository: ${url.replace(/\.git$/, "")}. ${error instanceof Error ? error.message : String(error)}`);
|
|
19
|
+
}
|
|
20
|
+
try {
|
|
21
|
+
await validateRegistryStructure(tempDir);
|
|
22
|
+
const manifest = await readManifest(tempDir);
|
|
23
|
+
return {
|
|
24
|
+
path: tempDir,
|
|
25
|
+
url: url.replace(/\.git$/, ""),
|
|
26
|
+
manifest,
|
|
27
|
+
cleanup: async () => cleanupTempDir(tempDir),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
await cleanupTempDir(tempDir);
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function loadLocalRegistry(registryPath) {
|
|
36
|
+
const resolved = path.resolve(registryPath);
|
|
37
|
+
if (!(await fs.pathExists(resolved))) {
|
|
38
|
+
throw new RegistryError(`Local registry path does not exist: ${resolved}`);
|
|
39
|
+
}
|
|
40
|
+
await validateRegistryStructure(resolved);
|
|
41
|
+
const manifest = await readManifest(resolved);
|
|
42
|
+
return {
|
|
43
|
+
path: resolved,
|
|
44
|
+
url: `file://${resolved}`,
|
|
45
|
+
manifest,
|
|
46
|
+
cleanup: async () => {
|
|
47
|
+
// Local registries are not cleaned up
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=cloner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloner.js","sourceRoot":"","sources":["../../src/registry/cloner.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAUzE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,UAAiC,EAAE;IAEnC,MAAM,GAAG,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,aAAa,EAAE,CAAC;IAEtC,UAAU,CAAC,WAAW,GAAG,MAAM,OAAO,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;QACxB,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,IAAI,aAAa,CACrB,+BAA+B,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtH,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAE7C,OAAO;YACL,IAAI,EAAE,OAAO;YACb,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC9B,QAAQ;YACR,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC;SAC7C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,YAAoB;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,aAAa,CAAC,uCAAuC,QAAQ,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE9C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,UAAU,QAAQ,EAAE;QACzB,QAAQ;QACR,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,sCAAsC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { type Manifest } from "../types/index.js";
|
|
2
|
+
export declare function readManifest(registryPath: string): Promise<Manifest>;
|
|
3
|
+
export declare function validateRegistryStructure(registryPath: string): Promise<void>;
|
|
4
|
+
export declare function assertAssetExists(registryPath: string, relativePath: string): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/registry/validator.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElE,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsB1E;AAED,wBAAsB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBnF;AAED,wBAAsB,iBAAiB,CACrC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAKf"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import { MANIFEST_FILE, REGISTRY_REQUIRED_DIRS } from "../constants/index.js";
|
|
4
|
+
import { RegistryError, ValidationError } from "../core/errors.js";
|
|
5
|
+
import { ManifestSchema } from "../types/index.js";
|
|
6
|
+
export async function readManifest(registryPath) {
|
|
7
|
+
const manifestPath = path.join(registryPath, MANIFEST_FILE);
|
|
8
|
+
if (!(await fs.pathExists(manifestPath))) {
|
|
9
|
+
throw new RegistryError(`Registry is missing ${MANIFEST_FILE}. Expected it at the repository root.`);
|
|
10
|
+
}
|
|
11
|
+
let raw;
|
|
12
|
+
try {
|
|
13
|
+
raw = await fs.readJson(manifestPath);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
throw new RegistryError(`Failed to parse ${MANIFEST_FILE}: ${String(error)}`);
|
|
17
|
+
}
|
|
18
|
+
const parsed = ManifestSchema.safeParse(raw);
|
|
19
|
+
if (!parsed.success) {
|
|
20
|
+
throw new ValidationError(`Invalid ${MANIFEST_FILE}`, parsed.error.flatten());
|
|
21
|
+
}
|
|
22
|
+
return parsed.data;
|
|
23
|
+
}
|
|
24
|
+
export async function validateRegistryStructure(registryPath) {
|
|
25
|
+
if (!(await fs.pathExists(registryPath))) {
|
|
26
|
+
throw new RegistryError(`Registry path does not exist: ${registryPath}`);
|
|
27
|
+
}
|
|
28
|
+
const missing = [];
|
|
29
|
+
for (const dir of REGISTRY_REQUIRED_DIRS) {
|
|
30
|
+
const dirPath = path.join(registryPath, dir);
|
|
31
|
+
if (!(await fs.pathExists(dirPath))) {
|
|
32
|
+
missing.push(dir);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (missing.length > 0) {
|
|
36
|
+
throw new RegistryError(`Registry is missing required directories: ${missing.join(", ")}. ` +
|
|
37
|
+
`Expected: ${REGISTRY_REQUIRED_DIRS.join(", ")}.`);
|
|
38
|
+
}
|
|
39
|
+
await readManifest(registryPath);
|
|
40
|
+
}
|
|
41
|
+
export async function assertAssetExists(registryPath, relativePath) {
|
|
42
|
+
const fullPath = path.join(registryPath, relativePath);
|
|
43
|
+
if (!(await fs.pathExists(fullPath))) {
|
|
44
|
+
throw new RegistryError(`Asset path not found in registry: ${relativePath}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/registry/validator.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAiB,MAAM,mBAAmB,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,YAAoB;IACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAE5D,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,aAAa,CACrB,uBAAuB,aAAa,uCAAuC,CAC5E,CAAC;IACJ,CAAC;IAED,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC,mBAAmB,aAAa,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,eAAe,CAAC,WAAW,aAAa,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,YAAoB;IAClE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,aAAa,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,sBAAsB,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,aAAa,CACrB,6CAA6C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACjE,aAAa,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACpD,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,YAAoB,EACpB,YAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,aAAa,CAAC,qCAAqC,YAAY,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-service.d.ts","sourceRoot":"","sources":["../../src/services/doctor-service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,wBAAsB,SAAS,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAuG3E"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import { CURSOR_DIR, METADATA_FILE } from "../constants/index.js";
|
|
4
|
+
import { readMetadata } from "../metadata/store.js";
|
|
5
|
+
import { assetTypeToDir } from "../utils/assets.js";
|
|
6
|
+
import { resolveCursorDir, resolveProjectRoot } from "../utils/fs.js";
|
|
7
|
+
export async function runDoctor(cwd = process.cwd()) {
|
|
8
|
+
const checks = [];
|
|
9
|
+
// Node version
|
|
10
|
+
const major = Number(process.versions.node.split(".")[0]);
|
|
11
|
+
checks.push({
|
|
12
|
+
name: "Node.js version",
|
|
13
|
+
status: major >= 20 ? "pass" : "fail",
|
|
14
|
+
message: major >= 20
|
|
15
|
+
? `Node.js ${process.versions.node}`
|
|
16
|
+
: `Node.js ${process.versions.node} (requires >= 20)`,
|
|
17
|
+
});
|
|
18
|
+
// Project writable
|
|
19
|
+
const root = resolveProjectRoot(cwd);
|
|
20
|
+
try {
|
|
21
|
+
await fs.access(root, fs.constants.W_OK);
|
|
22
|
+
checks.push({
|
|
23
|
+
name: "Project directory writable",
|
|
24
|
+
status: "pass",
|
|
25
|
+
message: root,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
checks.push({
|
|
30
|
+
name: "Project directory writable",
|
|
31
|
+
status: "fail",
|
|
32
|
+
message: `Cannot write to ${root}`,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// .cursor directory
|
|
36
|
+
const cursorDir = resolveCursorDir(cwd);
|
|
37
|
+
const cursorExists = await fs.pathExists(cursorDir);
|
|
38
|
+
checks.push({
|
|
39
|
+
name: `${CURSOR_DIR}/ directory`,
|
|
40
|
+
status: cursorExists ? "pass" : "warn",
|
|
41
|
+
message: cursorExists
|
|
42
|
+
? `Found at ${cursorDir}`
|
|
43
|
+
: `Missing — will be created on first install`,
|
|
44
|
+
});
|
|
45
|
+
// Metadata
|
|
46
|
+
const metadataPath = path.join(cursorDir, METADATA_FILE);
|
|
47
|
+
const metadata = await readMetadata(cwd).catch(() => null);
|
|
48
|
+
if (!(await fs.pathExists(metadataPath))) {
|
|
49
|
+
checks.push({
|
|
50
|
+
name: METADATA_FILE,
|
|
51
|
+
status: "warn",
|
|
52
|
+
message: "Not found — no assets installed yet",
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
else if (!metadata) {
|
|
56
|
+
checks.push({
|
|
57
|
+
name: METADATA_FILE,
|
|
58
|
+
status: "fail",
|
|
59
|
+
message: "Exists but is invalid or unreadable",
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
checks.push({
|
|
64
|
+
name: METADATA_FILE,
|
|
65
|
+
status: "pass",
|
|
66
|
+
message: `${metadata.installed.length} installed asset(s) from ${metadata.registry}`,
|
|
67
|
+
});
|
|
68
|
+
// Orphan / missing file checks
|
|
69
|
+
let missingFiles = 0;
|
|
70
|
+
for (const asset of metadata.installed) {
|
|
71
|
+
if (asset.type === "preset")
|
|
72
|
+
continue;
|
|
73
|
+
const assetPath = path.join(cursorDir, assetTypeToDir(asset.type), asset.id);
|
|
74
|
+
if (!(await fs.pathExists(assetPath))) {
|
|
75
|
+
missingFiles += 1;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
checks.push({
|
|
79
|
+
name: "Installed asset files",
|
|
80
|
+
status: missingFiles === 0 ? "pass" : "warn",
|
|
81
|
+
message: missingFiles === 0
|
|
82
|
+
? "All recorded assets are present on disk"
|
|
83
|
+
: `${missingFiles} recorded asset(s) missing from disk`,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Git availability (needed for clone)
|
|
87
|
+
try {
|
|
88
|
+
const { execa } = await import("execa");
|
|
89
|
+
const result = await execa("git", ["--version"]);
|
|
90
|
+
checks.push({
|
|
91
|
+
name: "Git",
|
|
92
|
+
status: "pass",
|
|
93
|
+
message: result.stdout.trim(),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
checks.push({
|
|
98
|
+
name: "Git",
|
|
99
|
+
status: "fail",
|
|
100
|
+
message: "Git is required to clone registries",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return checks;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=doctor-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-service.js","sourceRoot":"","sources":["../../src/services/doctor-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { AddOptions, AssetType, InstallResult, SearchResult } from "../types/index.js";
|
|
2
|
+
export declare function addFromRegistry(repository: string, options: AddOptions): Promise<InstallResult[]>;
|
|
3
|
+
export declare function searchRegistry(query: string, repository?: string, options?: {
|
|
4
|
+
verbose?: boolean;
|
|
5
|
+
}): Promise<SearchResult[]>;
|
|
6
|
+
export declare function removeAsset(type: AssetType, id: string, options?: {
|
|
7
|
+
force?: boolean;
|
|
8
|
+
yes?: boolean;
|
|
9
|
+
dryRun?: boolean;
|
|
10
|
+
verbose?: boolean;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
export declare function updateAssets(options?: {
|
|
13
|
+
force?: boolean;
|
|
14
|
+
yes?: boolean;
|
|
15
|
+
verbose?: boolean;
|
|
16
|
+
dryRun?: boolean;
|
|
17
|
+
}): Promise<InstallResult[]>;
|
|
18
|
+
//# sourceMappingURL=install-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-service.d.ts","sourceRoot":"","sources":["../../src/services/install-service.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,UAAU,EAEV,SAAS,EACT,aAAa,EAGb,YAAY,EACb,MAAM,mBAAmB,CAAC;AAyH3B,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,aAAa,EAAE,CAAC,CAqF1B;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,OAAO,CAAC,YAAY,EAAE,CAAC,CA4BzB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,MAAM,EACV,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GACpF,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAsB,YAAY,CAChC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACpF,OAAO,CAAC,aAAa,EAAE,CAAC,CA4E1B"}
|