aicm 0.14.3 → 0.14.5
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/dist/cli.js +4 -1
- package/dist/commands/install.d.ts +5 -1
- package/dist/commands/install.js +24 -13
- package/package.json +3 -3
- package/dist/api_v2.d.ts +0 -9
- package/dist/api_v2.js +0 -12
- package/dist/bin/aicm_v2.d.ts +0 -2
- package/dist/bin/aicm_v2.js +0 -8
- package/dist/cli_v2.d.ts +0 -2
- package/dist/cli_v2.js +0 -94
- package/dist/commands/install/install-package.d.ts +0 -53
- package/dist/commands/install/install-package.js +0 -122
- package/dist/commands/install/install-single-package.d.ts +0 -53
- package/dist/commands/install/install-single-package.js +0 -139
- package/dist/commands/install/install-workspaces.d.ts +0 -9
- package/dist/commands/install/install-workspaces.js +0 -172
- package/dist/commands/install_new.d.ts +0 -17
- package/dist/commands/install_new.js +0 -457
- package/dist/commands/install_v2.d.ts +0 -52
- package/dist/commands/install_v2.js +0 -505
- package/dist/commands/install_/327/2242.d.ts +0 -59
- package/dist/commands/install_/327/2242.js +0 -546
- package/dist/commands/workspaces/discovery.d.ts +0 -7
- package/dist/commands/workspaces/discovery.js +0 -50
- package/dist/commands/workspaces/workspaces-install.d.ts +0 -9
- package/dist/commands/workspaces/workspaces-install.js +0 -48
- package/dist/index.d.ts +0 -2
- package/dist/index.js +0 -76
- package/dist/types/index.d.ts +0 -64
- package/dist/types/index.js +0 -2
- package/dist/utils/config_new.d.ts +0 -64
- package/dist/utils/config_new.js +0 -228
- package/dist/utils/config_v2.d.ts +0 -64
- package/dist/utils/config_v2.js +0 -250
- package/dist/utils/glob-handler.d.ts +0 -35
- package/dist/utils/glob-handler.js +0 -125
- package/dist/utils/mcp-writer.d.ts +0 -14
- package/dist/utils/mcp-writer.js +0 -69
- package/dist/utils/mdc-parser.d.ts +0 -9
- package/dist/utils/mdc-parser.js +0 -59
- package/dist/utils/rule-collector.d.ts +0 -33
- package/dist/utils/rule-collector.js +0 -169
- package/dist/utils/rule-detector.d.ts +0 -4
- package/dist/utils/rule-detector.js +0 -31
- package/dist/utils/rule-status.d.ts +0 -8
- package/dist/utils/rule-status.js +0 -53
- package/dist/utils/rule-writer.d.ts +0 -6
- package/dist/utils/rule-writer.js +0 -118
package/dist/cli.js
CHANGED
|
@@ -19,6 +19,7 @@ async function runCli() {
|
|
|
19
19
|
"--version": Boolean,
|
|
20
20
|
"--ci": Boolean,
|
|
21
21
|
"--verbose": Boolean,
|
|
22
|
+
"--dry-run": Boolean,
|
|
22
23
|
"-h": "--help",
|
|
23
24
|
"-v": "--version",
|
|
24
25
|
}, {
|
|
@@ -42,7 +43,7 @@ async function runCli() {
|
|
|
42
43
|
(0, init_1.initCommand)();
|
|
43
44
|
break;
|
|
44
45
|
case "install":
|
|
45
|
-
await (0, install_1.installCommand)(args["--ci"], args["--verbose"]);
|
|
46
|
+
await (0, install_1.installCommand)(args["--ci"], args["--verbose"], args["--dry-run"]);
|
|
46
47
|
break;
|
|
47
48
|
case "list":
|
|
48
49
|
await (0, list_1.listCommand)();
|
|
@@ -74,10 +75,12 @@ ${chalk_1.default.bold("OPTIONS")}
|
|
|
74
75
|
-v, --version Show version number
|
|
75
76
|
--ci Run in CI environments (default: \`false\`)
|
|
76
77
|
--verbose Show detailed output and stack traces for debugging
|
|
78
|
+
--dry-run Simulate installation without writing files, useful for validating presets in CI
|
|
77
79
|
|
|
78
80
|
${chalk_1.default.bold("EXAMPLES")}
|
|
79
81
|
$ aicm init
|
|
80
82
|
$ aicm install
|
|
83
|
+
$ aicm install --dry-run
|
|
81
84
|
$ aicm list
|
|
82
85
|
`);
|
|
83
86
|
}
|
|
@@ -16,6 +16,10 @@ export interface InstallOptions {
|
|
|
16
16
|
* Show verbose output during installation
|
|
17
17
|
*/
|
|
18
18
|
verbose?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Perform a dry run without writing any files
|
|
21
|
+
*/
|
|
22
|
+
dryRun?: boolean;
|
|
19
23
|
}
|
|
20
24
|
/**
|
|
21
25
|
* Result of the install operation
|
|
@@ -49,4 +53,4 @@ export declare function install(options?: InstallOptions): Promise<InstallResult
|
|
|
49
53
|
/**
|
|
50
54
|
* CLI command wrapper for install
|
|
51
55
|
*/
|
|
52
|
-
export declare function installCommand(installOnCI?: boolean, verbose?: boolean): Promise<void>;
|
|
56
|
+
export declare function installCommand(installOnCI?: boolean, verbose?: boolean, dryRun?: boolean): Promise<void>;
|
package/dist/commands/install.js
CHANGED
|
@@ -323,11 +323,13 @@ async function installPackage(options = {}) {
|
|
|
323
323
|
}
|
|
324
324
|
}
|
|
325
325
|
try {
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
326
|
+
if (!options.dryRun) {
|
|
327
|
+
// Write rules to targets
|
|
328
|
+
writeRulesToTargets(rules, config.targets);
|
|
329
|
+
// Write MCP servers
|
|
330
|
+
if (mcpServers && Object.keys(mcpServers).length > 0) {
|
|
331
|
+
writeMcpServersToTargets(mcpServers, config.targets, cwd);
|
|
332
|
+
}
|
|
331
333
|
}
|
|
332
334
|
return {
|
|
333
335
|
success: true,
|
|
@@ -387,7 +389,7 @@ async function installWorkspacesPackages(packages, options = {}) {
|
|
|
387
389
|
/**
|
|
388
390
|
* Install rules across multiple packages in a workspace
|
|
389
391
|
*/
|
|
390
|
-
async function installWorkspaces(cwd, installOnCI, verbose = false) {
|
|
392
|
+
async function installWorkspaces(cwd, installOnCI, verbose = false, dryRun = false) {
|
|
391
393
|
return (0, working_directory_1.withWorkingDirectory)(cwd, async () => {
|
|
392
394
|
if (verbose) {
|
|
393
395
|
console.log(chalk_1.default.blue("🔍 Discovering packages..."));
|
|
@@ -420,6 +422,7 @@ async function installWorkspaces(cwd, installOnCI, verbose = false) {
|
|
|
420
422
|
const result = await installWorkspacesPackages(packages, {
|
|
421
423
|
installOnCI,
|
|
422
424
|
verbose,
|
|
425
|
+
dryRun,
|
|
423
426
|
});
|
|
424
427
|
if (verbose) {
|
|
425
428
|
result.packages.forEach((pkg) => {
|
|
@@ -448,7 +451,6 @@ async function installWorkspaces(cwd, installOnCI, verbose = false) {
|
|
|
448
451
|
packagesCount: result.packages.length,
|
|
449
452
|
};
|
|
450
453
|
}
|
|
451
|
-
console.log(`Successfully installed ${result.totalRuleCount} rules across ${result.packages.length} packages`);
|
|
452
454
|
return {
|
|
453
455
|
success: true,
|
|
454
456
|
installedRuleCount: result.totalRuleCount,
|
|
@@ -482,7 +484,7 @@ async function install(options = {}) {
|
|
|
482
484
|
const shouldUseWorkspaces = (resolvedConfig === null || resolvedConfig === void 0 ? void 0 : resolvedConfig.config.workspaces) ||
|
|
483
485
|
(!resolvedConfig && (0, config_1.detectWorkspacesFromPackageJson)(cwd));
|
|
484
486
|
if (shouldUseWorkspaces) {
|
|
485
|
-
return await installWorkspaces(cwd, installOnCI, options.verbose);
|
|
487
|
+
return await installWorkspaces(cwd, installOnCI, options.verbose, options.dryRun);
|
|
486
488
|
}
|
|
487
489
|
return installPackage(options);
|
|
488
490
|
});
|
|
@@ -490,18 +492,27 @@ async function install(options = {}) {
|
|
|
490
492
|
/**
|
|
491
493
|
* CLI command wrapper for install
|
|
492
494
|
*/
|
|
493
|
-
async function installCommand(installOnCI, verbose) {
|
|
495
|
+
async function installCommand(installOnCI, verbose, dryRun) {
|
|
494
496
|
var _a;
|
|
495
|
-
const result = await install({ installOnCI, verbose });
|
|
497
|
+
const result = await install({ installOnCI, verbose, dryRun });
|
|
496
498
|
if (!result.success) {
|
|
497
499
|
throw (_a = result.error) !== null && _a !== void 0 ? _a : new Error("Installation failed with unknown error");
|
|
498
500
|
}
|
|
499
501
|
else {
|
|
500
|
-
|
|
501
|
-
|
|
502
|
+
const rulesInstalledMessage = `${result.installedRuleCount} rule${result.installedRuleCount === 1 ? "" : "s"}`;
|
|
503
|
+
if (dryRun) {
|
|
504
|
+
if (result.packagesCount > 1) {
|
|
505
|
+
console.log(`Dry run: validated ${rulesInstalledMessage} across ${result.packagesCount} packages`);
|
|
506
|
+
}
|
|
507
|
+
else {
|
|
508
|
+
console.log(`Dry run: validated ${rulesInstalledMessage}`);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
else if (result.packagesCount > 1) {
|
|
512
|
+
console.log(`Successfully installed ${rulesInstalledMessage} across ${result.packagesCount} packages`);
|
|
502
513
|
}
|
|
503
514
|
else {
|
|
504
|
-
console.log(
|
|
515
|
+
console.log(`Successfully installed ${rulesInstalledMessage}`);
|
|
505
516
|
}
|
|
506
517
|
}
|
|
507
518
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "aicm",
|
|
3
|
-
"version": "0.14.
|
|
3
|
+
"version": "0.14.5",
|
|
4
4
|
"description": "A TypeScript CLI tool for managing AI IDE rules across different projects and teams",
|
|
5
5
|
"main": "dist/api.js",
|
|
6
6
|
"types": "dist/api.d.ts",
|
|
@@ -56,13 +56,13 @@
|
|
|
56
56
|
"watch": "tsc --watch",
|
|
57
57
|
"start": "node dist/bin/aicm.js",
|
|
58
58
|
"dev": "ts-node src/bin/aicm.ts",
|
|
59
|
-
"test": "jest",
|
|
59
|
+
"test": "pnpm build && jest",
|
|
60
60
|
"test:watch": "jest --watch",
|
|
61
61
|
"test:all": "npm run build && npm run test",
|
|
62
62
|
"format": "prettier --write .",
|
|
63
63
|
"format:check": "prettier --check .",
|
|
64
64
|
"lint": "eslint",
|
|
65
65
|
"version": "auto-changelog -p && git add CHANGELOG.md",
|
|
66
|
-
"release": "np
|
|
66
|
+
"release": "np"
|
|
67
67
|
}
|
|
68
68
|
}
|
package/dist/api_v2.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { InstallOptions, InstallResult } from "./commands/install";
|
|
2
|
-
/**
|
|
3
|
-
* Install AICM rules based on configuration (v2)
|
|
4
|
-
* @param options Installation options
|
|
5
|
-
* @returns Result of the install operation
|
|
6
|
-
*/
|
|
7
|
-
export declare function install(options?: InstallOptions): Promise<InstallResult>;
|
|
8
|
-
export type { InstallOptions, InstallResult } from "./commands/install";
|
|
9
|
-
export type { ResolvedConfig, Config, RuleFile, MCPServers, } from "./utils/config";
|
package/dist/api_v2.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.install = install;
|
|
4
|
-
const install_1 = require("./commands/install");
|
|
5
|
-
/**
|
|
6
|
-
* Install AICM rules based on configuration (v2)
|
|
7
|
-
* @param options Installation options
|
|
8
|
-
* @returns Result of the install operation
|
|
9
|
-
*/
|
|
10
|
-
async function install(options = {}) {
|
|
11
|
-
return (0, install_1.install)(options);
|
|
12
|
-
}
|
package/dist/bin/aicm_v2.d.ts
DELETED
package/dist/bin/aicm_v2.js
DELETED
package/dist/cli_v2.d.ts
DELETED
package/dist/cli_v2.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
"use strict";
|
|
3
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
-
};
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.runCliV2 = runCliV2;
|
|
8
|
-
const arg_1 = __importDefault(require("arg"));
|
|
9
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
10
|
-
const init_1 = require("./commands/init");
|
|
11
|
-
const install_1 = require("./commands/install");
|
|
12
|
-
const list_1 = require("./commands/list");
|
|
13
|
-
// Define version from package.json
|
|
14
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
15
|
-
const pkg = require("../package.json");
|
|
16
|
-
async function runCliV2() {
|
|
17
|
-
const args = (0, arg_1.default)({
|
|
18
|
-
"--help": Boolean,
|
|
19
|
-
"--version": Boolean,
|
|
20
|
-
"--ci": Boolean,
|
|
21
|
-
"--verbose": Boolean,
|
|
22
|
-
"-h": "--help",
|
|
23
|
-
"-v": "--version",
|
|
24
|
-
}, {
|
|
25
|
-
permissive: true,
|
|
26
|
-
argv: process.argv.slice(2),
|
|
27
|
-
});
|
|
28
|
-
// Show version
|
|
29
|
-
if (args["--version"]) {
|
|
30
|
-
console.log(pkg.version);
|
|
31
|
-
process.exit(0);
|
|
32
|
-
}
|
|
33
|
-
// Show help
|
|
34
|
-
if (args["--help"]) {
|
|
35
|
-
showHelp();
|
|
36
|
-
process.exit(0);
|
|
37
|
-
}
|
|
38
|
-
const command = args._.length > 0 ? args._[0] : null;
|
|
39
|
-
try {
|
|
40
|
-
switch (command) {
|
|
41
|
-
case "init":
|
|
42
|
-
(0, init_1.initCommand)();
|
|
43
|
-
break;
|
|
44
|
-
case "install":
|
|
45
|
-
await (0, install_1.installCommand)(args["--ci"], args["--verbose"]);
|
|
46
|
-
break;
|
|
47
|
-
case "list":
|
|
48
|
-
await (0, list_1.listCommand)();
|
|
49
|
-
break;
|
|
50
|
-
default:
|
|
51
|
-
showHelp();
|
|
52
|
-
break;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
logError(error, args["--verbose"]);
|
|
57
|
-
process.exit(1);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
function showHelp() {
|
|
61
|
-
console.log(`
|
|
62
|
-
${chalk_1.default.bold("aicm v2")} - A CLI tool for managing AI IDE configurations (v2)
|
|
63
|
-
|
|
64
|
-
${chalk_1.default.bold("USAGE")}
|
|
65
|
-
$ aicm-v2 [command] [options]
|
|
66
|
-
|
|
67
|
-
${chalk_1.default.bold("COMMANDS")}
|
|
68
|
-
init Initialize a new aicm configuration file
|
|
69
|
-
install Install rules from configured sources
|
|
70
|
-
list List all configured rules and their status
|
|
71
|
-
|
|
72
|
-
${chalk_1.default.bold("OPTIONS")}
|
|
73
|
-
-h, --help Show this help message
|
|
74
|
-
-v, --version Show version number
|
|
75
|
-
--ci Run in CI environments (default: \`false\`)
|
|
76
|
-
--verbose Show detailed output and stack traces for debugging
|
|
77
|
-
|
|
78
|
-
${chalk_1.default.bold("EXAMPLES")}
|
|
79
|
-
$ aicm-v2 init
|
|
80
|
-
$ aicm-v2 install
|
|
81
|
-
$ aicm-v2 list
|
|
82
|
-
`);
|
|
83
|
-
}
|
|
84
|
-
function logError(error, verbose) {
|
|
85
|
-
if (error instanceof Error) {
|
|
86
|
-
console.error(chalk_1.default.red(`Error: ${error.message}`));
|
|
87
|
-
if (verbose && error.stack) {
|
|
88
|
-
console.error(chalk_1.default.gray(error.stack));
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
console.error(chalk_1.default.red(`Error: ${String(error)}`));
|
|
93
|
-
}
|
|
94
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { NormalizedConfig } from "../../types";
|
|
2
|
-
/**
|
|
3
|
-
* Options for the install functions
|
|
4
|
-
*/
|
|
5
|
-
export interface InstallOptions {
|
|
6
|
-
/**
|
|
7
|
-
* Base directory to use instead of process.cwd()
|
|
8
|
-
*/
|
|
9
|
-
cwd?: string;
|
|
10
|
-
/**
|
|
11
|
-
* Custom config object to use instead of loading from file
|
|
12
|
-
*/
|
|
13
|
-
config?: NormalizedConfig;
|
|
14
|
-
/**
|
|
15
|
-
* allow installation on CI environments
|
|
16
|
-
*/
|
|
17
|
-
installOnCI?: boolean;
|
|
18
|
-
/**
|
|
19
|
-
* Show verbose output during installation
|
|
20
|
-
*/
|
|
21
|
-
verbose?: boolean;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Result of the install operation
|
|
25
|
-
*/
|
|
26
|
-
export interface InstallResult {
|
|
27
|
-
/**
|
|
28
|
-
* Whether the operation was successful
|
|
29
|
-
*/
|
|
30
|
-
success: boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Error message if the operation failed
|
|
33
|
-
*/
|
|
34
|
-
error?: string;
|
|
35
|
-
/**
|
|
36
|
-
* Error stack trace for debugging (when available)
|
|
37
|
-
*/
|
|
38
|
-
errorStack?: string;
|
|
39
|
-
/**
|
|
40
|
-
* Number of rules installed
|
|
41
|
-
*/
|
|
42
|
-
installedRuleCount: number;
|
|
43
|
-
/**
|
|
44
|
-
* Number of packages installed
|
|
45
|
-
*/
|
|
46
|
-
packagesCount: number;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Install rules for a single package (used within workspaces and standalone installs)
|
|
50
|
-
* @param options Install options
|
|
51
|
-
* @returns Result of the install operation
|
|
52
|
-
*/
|
|
53
|
-
export declare function installPackage(options?: InstallOptions): Promise<InstallResult>;
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.installPackage = installPackage;
|
|
7
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
-
const config_1 = require("../../utils/config");
|
|
9
|
-
const rule_detector_1 = require("../../utils/rule-detector");
|
|
10
|
-
const working_directory_1 = require("../../utils/working-directory");
|
|
11
|
-
const rule_collector_1 = require("../../utils/rule-collector");
|
|
12
|
-
const rule_writer_1 = require("../../utils/rule-writer");
|
|
13
|
-
const mcp_writer_1 = require("../../utils/mcp-writer");
|
|
14
|
-
const glob_handler_1 = require("../../utils/glob-handler");
|
|
15
|
-
/**
|
|
16
|
-
* Install rules for a single package (used within workspaces and standalone installs)
|
|
17
|
-
* @param options Install options
|
|
18
|
-
* @returns Result of the install operation
|
|
19
|
-
*/
|
|
20
|
-
async function installPackage(options = {}) {
|
|
21
|
-
const cwd = options.cwd || process.cwd();
|
|
22
|
-
return (0, working_directory_1.withWorkingDirectory)(cwd, async () => {
|
|
23
|
-
const config = options.config || (await (0, config_1.getConfig)());
|
|
24
|
-
const ruleCollection = (0, rule_collector_1.initRuleCollection)();
|
|
25
|
-
if (!config) {
|
|
26
|
-
return {
|
|
27
|
-
success: false,
|
|
28
|
-
error: "Configuration file not found",
|
|
29
|
-
installedRuleCount: 0,
|
|
30
|
-
packagesCount: 0,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
// Check if rules are defined (either directly or through presets)
|
|
34
|
-
if (!config.rules || Object.keys(config.rules).length === 0) {
|
|
35
|
-
// If there are no presets defined either, show a message
|
|
36
|
-
if (!config.presets || config.presets.length === 0) {
|
|
37
|
-
return {
|
|
38
|
-
success: false,
|
|
39
|
-
error: "No rules defined in configuration",
|
|
40
|
-
installedRuleCount: 0,
|
|
41
|
-
packagesCount: 0,
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
let expandedRules;
|
|
46
|
-
try {
|
|
47
|
-
const expansion = await (0, glob_handler_1.expandRulesGlobPatterns)(config.rules, cwd);
|
|
48
|
-
expandedRules = expansion.expandedRules;
|
|
49
|
-
if (options.verbose) {
|
|
50
|
-
for (const [expandedKey, originalPattern] of Object.entries(expansion.globSources)) {
|
|
51
|
-
console.log(chalk_1.default.gray(` Pattern "${originalPattern}" → ${expandedKey}`));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
const errorMessage = `Error expanding glob patterns: ${error instanceof Error ? error.message : String(error)}`;
|
|
57
|
-
return {
|
|
58
|
-
success: false,
|
|
59
|
-
error: errorMessage,
|
|
60
|
-
errorStack: error instanceof Error ? error.stack : undefined,
|
|
61
|
-
installedRuleCount: 0,
|
|
62
|
-
packagesCount: 0,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
let hasErrors = false;
|
|
66
|
-
const errorMessages = [];
|
|
67
|
-
let firstErrorStack;
|
|
68
|
-
let installedRuleCount = 0;
|
|
69
|
-
for (const [name, source] of Object.entries(expandedRules)) {
|
|
70
|
-
const ruleType = (0, rule_detector_1.detectRuleType)(source);
|
|
71
|
-
const ruleBasePath = (0, config_1.getRuleSource)(config, name);
|
|
72
|
-
const originalPresetPath = (0, config_1.getOriginalPresetPath)(config, name);
|
|
73
|
-
try {
|
|
74
|
-
let ruleContent;
|
|
75
|
-
switch (ruleType) {
|
|
76
|
-
case "npm":
|
|
77
|
-
ruleContent = (0, rule_collector_1.collectNpmRule)(name, source);
|
|
78
|
-
break;
|
|
79
|
-
case "local":
|
|
80
|
-
ruleContent = (0, rule_collector_1.collectLocalRule)(name, source, ruleBasePath);
|
|
81
|
-
break;
|
|
82
|
-
default:
|
|
83
|
-
errorMessages.push(`Unknown rule type: ${ruleType}`);
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
if (originalPresetPath) {
|
|
87
|
-
ruleContent.presetPath = originalPresetPath;
|
|
88
|
-
}
|
|
89
|
-
(0, rule_collector_1.addRuleToCollection)(ruleCollection, ruleContent, config.ides);
|
|
90
|
-
installedRuleCount++;
|
|
91
|
-
}
|
|
92
|
-
catch (e) {
|
|
93
|
-
hasErrors = true;
|
|
94
|
-
const errorMessage = `Error processing rule ${name}: ${e instanceof Error ? e.message : String(e)}`;
|
|
95
|
-
errorMessages.push(errorMessage);
|
|
96
|
-
// Keep the first error stack trace
|
|
97
|
-
if (!firstErrorStack && e instanceof Error && e.stack) {
|
|
98
|
-
firstErrorStack = e.stack;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
if (hasErrors) {
|
|
103
|
-
return {
|
|
104
|
-
success: false,
|
|
105
|
-
error: errorMessages.join("; "),
|
|
106
|
-
errorStack: firstErrorStack,
|
|
107
|
-
installedRuleCount,
|
|
108
|
-
packagesCount: 0,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
(0, rule_writer_1.writeRulesToTargets)(ruleCollection);
|
|
112
|
-
if (config.mcpServers) {
|
|
113
|
-
const filteredMcpServers = Object.fromEntries(Object.entries(config.mcpServers).filter(([, v]) => v !== false));
|
|
114
|
-
(0, mcp_writer_1.writeMcpServersToTargets)(filteredMcpServers, config.ides, cwd);
|
|
115
|
-
}
|
|
116
|
-
return {
|
|
117
|
-
success: true,
|
|
118
|
-
installedRuleCount,
|
|
119
|
-
packagesCount: 1,
|
|
120
|
-
};
|
|
121
|
-
});
|
|
122
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { NormalizedConfig } from "../../types";
|
|
2
|
-
/**
|
|
3
|
-
* Options for the install functions
|
|
4
|
-
*/
|
|
5
|
-
export interface InstallOptions {
|
|
6
|
-
/**
|
|
7
|
-
* Base directory to use instead of process.cwd()
|
|
8
|
-
*/
|
|
9
|
-
cwd?: string;
|
|
10
|
-
/**
|
|
11
|
-
* Custom config object to use instead of loading from file
|
|
12
|
-
*/
|
|
13
|
-
config?: NormalizedConfig;
|
|
14
|
-
/**
|
|
15
|
-
* allow installation on CI environments
|
|
16
|
-
*/
|
|
17
|
-
installOnCI?: boolean;
|
|
18
|
-
/**
|
|
19
|
-
* Show verbose output during installation
|
|
20
|
-
*/
|
|
21
|
-
verbose?: boolean;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Result of the install operation
|
|
25
|
-
*/
|
|
26
|
-
export interface InstallResult {
|
|
27
|
-
/**
|
|
28
|
-
* Whether the operation was successful
|
|
29
|
-
*/
|
|
30
|
-
success: boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Error message if the operation failed
|
|
33
|
-
*/
|
|
34
|
-
error?: string;
|
|
35
|
-
/**
|
|
36
|
-
* Error stack trace for debugging (when available)
|
|
37
|
-
*/
|
|
38
|
-
errorStack?: string;
|
|
39
|
-
/**
|
|
40
|
-
* Number of rules installed
|
|
41
|
-
*/
|
|
42
|
-
installedRuleCount: number;
|
|
43
|
-
/**
|
|
44
|
-
* Number of packages installed
|
|
45
|
-
*/
|
|
46
|
-
packagesCount: number;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Core single package installation logic
|
|
50
|
-
* @param options Install options
|
|
51
|
-
* @returns Result of the install operation
|
|
52
|
-
*/
|
|
53
|
-
export declare function installSinglePackage(options?: InstallOptions): Promise<InstallResult>;
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.installSinglePackage = installSinglePackage;
|
|
7
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
-
const config_1 = require("../../utils/config");
|
|
9
|
-
const rule_detector_1 = require("../../utils/rule-detector");
|
|
10
|
-
const rule_collector_1 = require("../../utils/rule-collector");
|
|
11
|
-
const rule_writer_1 = require("../../utils/rule-writer");
|
|
12
|
-
const mcp_writer_1 = require("../../utils/mcp-writer");
|
|
13
|
-
const glob_handler_1 = require("../../utils/glob-handler");
|
|
14
|
-
/**
|
|
15
|
-
* Helper function to execute a function within a specific working directory
|
|
16
|
-
* and ensure the original directory is always restored
|
|
17
|
-
*/
|
|
18
|
-
async function withWorkingDirectory(targetDir, fn) {
|
|
19
|
-
const originalCwd = process.cwd();
|
|
20
|
-
if (targetDir !== originalCwd) {
|
|
21
|
-
process.chdir(targetDir);
|
|
22
|
-
}
|
|
23
|
-
try {
|
|
24
|
-
return await fn();
|
|
25
|
-
}
|
|
26
|
-
finally {
|
|
27
|
-
if (targetDir !== originalCwd) {
|
|
28
|
-
process.chdir(originalCwd);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Core single package installation logic
|
|
34
|
-
* @param options Install options
|
|
35
|
-
* @returns Result of the install operation
|
|
36
|
-
*/
|
|
37
|
-
async function installSinglePackage(options = {}) {
|
|
38
|
-
const cwd = options.cwd || process.cwd();
|
|
39
|
-
return withWorkingDirectory(cwd, async () => {
|
|
40
|
-
const config = options.config || (0, config_1.getConfig)();
|
|
41
|
-
const ruleCollection = (0, rule_collector_1.initRuleCollection)();
|
|
42
|
-
if (!config) {
|
|
43
|
-
return {
|
|
44
|
-
success: false,
|
|
45
|
-
error: "Configuration file not found",
|
|
46
|
-
installedRuleCount: 0,
|
|
47
|
-
packagesCount: 0,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
// Check if rules are defined (either directly or through presets)
|
|
51
|
-
if (!config.rules || Object.keys(config.rules).length === 0) {
|
|
52
|
-
// If there are no presets defined either, show a message
|
|
53
|
-
if (!config.presets || config.presets.length === 0) {
|
|
54
|
-
return {
|
|
55
|
-
success: false,
|
|
56
|
-
error: "No rules defined in configuration",
|
|
57
|
-
installedRuleCount: 0,
|
|
58
|
-
packagesCount: 0,
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
let expandedRules;
|
|
63
|
-
try {
|
|
64
|
-
const expansion = await (0, glob_handler_1.expandRulesGlobPatterns)(config.rules, cwd);
|
|
65
|
-
expandedRules = expansion.expandedRules;
|
|
66
|
-
if (options.verbose) {
|
|
67
|
-
for (const [expandedKey, originalPattern] of Object.entries(expansion.globSources)) {
|
|
68
|
-
console.log(chalk_1.default.gray(` Pattern "${originalPattern}" → ${expandedKey}`));
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
catch (error) {
|
|
73
|
-
const errorMessage = `Error expanding glob patterns: ${error instanceof Error ? error.message : String(error)}`;
|
|
74
|
-
return {
|
|
75
|
-
success: false,
|
|
76
|
-
error: errorMessage,
|
|
77
|
-
errorStack: error instanceof Error ? error.stack : undefined,
|
|
78
|
-
installedRuleCount: 0,
|
|
79
|
-
packagesCount: 0,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
let hasErrors = false;
|
|
83
|
-
const errorMessages = [];
|
|
84
|
-
let firstErrorStack;
|
|
85
|
-
let installedRuleCount = 0;
|
|
86
|
-
for (const [name, source] of Object.entries(expandedRules)) {
|
|
87
|
-
const ruleType = (0, rule_detector_1.detectRuleType)(source);
|
|
88
|
-
const ruleBasePath = (0, config_1.getRuleSource)(config, name);
|
|
89
|
-
const originalPresetPath = (0, config_1.getOriginalPresetPath)(config, name);
|
|
90
|
-
try {
|
|
91
|
-
let ruleContent;
|
|
92
|
-
switch (ruleType) {
|
|
93
|
-
case "npm":
|
|
94
|
-
ruleContent = (0, rule_collector_1.collectNpmRule)(name, source);
|
|
95
|
-
break;
|
|
96
|
-
case "local":
|
|
97
|
-
ruleContent = (0, rule_collector_1.collectLocalRule)(name, source, ruleBasePath);
|
|
98
|
-
break;
|
|
99
|
-
default:
|
|
100
|
-
errorMessages.push(`Unknown rule type: ${ruleType}`);
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
103
|
-
if (originalPresetPath) {
|
|
104
|
-
ruleContent.presetPath = originalPresetPath;
|
|
105
|
-
}
|
|
106
|
-
(0, rule_collector_1.addRuleToCollection)(ruleCollection, ruleContent, config.ides);
|
|
107
|
-
installedRuleCount++;
|
|
108
|
-
}
|
|
109
|
-
catch (e) {
|
|
110
|
-
hasErrors = true;
|
|
111
|
-
const errorMessage = `Error processing rule ${name}: ${e instanceof Error ? e.message : String(e)}`;
|
|
112
|
-
errorMessages.push(errorMessage);
|
|
113
|
-
// Keep the first error stack trace
|
|
114
|
-
if (!firstErrorStack && e instanceof Error && e.stack) {
|
|
115
|
-
firstErrorStack = e.stack;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
if (hasErrors) {
|
|
120
|
-
return {
|
|
121
|
-
success: false,
|
|
122
|
-
error: errorMessages.join("; "),
|
|
123
|
-
errorStack: firstErrorStack,
|
|
124
|
-
installedRuleCount,
|
|
125
|
-
packagesCount: 0,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
(0, rule_writer_1.writeRulesToTargets)(ruleCollection);
|
|
129
|
-
if (config.mcpServers) {
|
|
130
|
-
const filteredMcpServers = Object.fromEntries(Object.entries(config.mcpServers).filter(([, v]) => v !== false));
|
|
131
|
-
(0, mcp_writer_1.writeMcpServersToTargets)(filteredMcpServers, config.ides, cwd);
|
|
132
|
-
}
|
|
133
|
-
return {
|
|
134
|
-
success: true,
|
|
135
|
-
installedRuleCount,
|
|
136
|
-
packagesCount: 1,
|
|
137
|
-
};
|
|
138
|
-
});
|
|
139
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { InstallResult } from "./install-package";
|
|
2
|
-
/**
|
|
3
|
-
* Install rules across multiple packages in a workspace
|
|
4
|
-
* @param cwd The current working directory
|
|
5
|
-
* @param installOnCI Whether to install on CI environments
|
|
6
|
-
* @param verbose Whether to show verbose output
|
|
7
|
-
* @returns Result of the install operation
|
|
8
|
-
*/
|
|
9
|
-
export declare function installWorkspaces(cwd: string, installOnCI: boolean, verbose?: boolean): Promise<InstallResult>;
|