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.
Files changed (48) hide show
  1. package/dist/cli.js +4 -1
  2. package/dist/commands/install.d.ts +5 -1
  3. package/dist/commands/install.js +24 -13
  4. package/package.json +3 -3
  5. package/dist/api_v2.d.ts +0 -9
  6. package/dist/api_v2.js +0 -12
  7. package/dist/bin/aicm_v2.d.ts +0 -2
  8. package/dist/bin/aicm_v2.js +0 -8
  9. package/dist/cli_v2.d.ts +0 -2
  10. package/dist/cli_v2.js +0 -94
  11. package/dist/commands/install/install-package.d.ts +0 -53
  12. package/dist/commands/install/install-package.js +0 -122
  13. package/dist/commands/install/install-single-package.d.ts +0 -53
  14. package/dist/commands/install/install-single-package.js +0 -139
  15. package/dist/commands/install/install-workspaces.d.ts +0 -9
  16. package/dist/commands/install/install-workspaces.js +0 -172
  17. package/dist/commands/install_new.d.ts +0 -17
  18. package/dist/commands/install_new.js +0 -457
  19. package/dist/commands/install_v2.d.ts +0 -52
  20. package/dist/commands/install_v2.js +0 -505
  21. package/dist/commands/install_/327/2242.d.ts +0 -59
  22. package/dist/commands/install_/327/2242.js +0 -546
  23. package/dist/commands/workspaces/discovery.d.ts +0 -7
  24. package/dist/commands/workspaces/discovery.js +0 -50
  25. package/dist/commands/workspaces/workspaces-install.d.ts +0 -9
  26. package/dist/commands/workspaces/workspaces-install.js +0 -48
  27. package/dist/index.d.ts +0 -2
  28. package/dist/index.js +0 -76
  29. package/dist/types/index.d.ts +0 -64
  30. package/dist/types/index.js +0 -2
  31. package/dist/utils/config_new.d.ts +0 -64
  32. package/dist/utils/config_new.js +0 -228
  33. package/dist/utils/config_v2.d.ts +0 -64
  34. package/dist/utils/config_v2.js +0 -250
  35. package/dist/utils/glob-handler.d.ts +0 -35
  36. package/dist/utils/glob-handler.js +0 -125
  37. package/dist/utils/mcp-writer.d.ts +0 -14
  38. package/dist/utils/mcp-writer.js +0 -69
  39. package/dist/utils/mdc-parser.d.ts +0 -9
  40. package/dist/utils/mdc-parser.js +0 -59
  41. package/dist/utils/rule-collector.d.ts +0 -33
  42. package/dist/utils/rule-collector.js +0 -169
  43. package/dist/utils/rule-detector.d.ts +0 -4
  44. package/dist/utils/rule-detector.js +0 -31
  45. package/dist/utils/rule-status.d.ts +0 -8
  46. package/dist/utils/rule-status.js +0 -53
  47. package/dist/utils/rule-writer.d.ts +0 -6
  48. 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>;
@@ -323,11 +323,13 @@ async function installPackage(options = {}) {
323
323
  }
324
324
  }
325
325
  try {
326
- // Write rules to targets
327
- writeRulesToTargets(rules, config.targets);
328
- // Write MCP servers
329
- if (mcpServers && Object.keys(mcpServers).length > 0) {
330
- writeMcpServersToTargets(mcpServers, config.targets, cwd);
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
- if (result.packagesCount > 1) {
501
- console.log(`Successfully installed ${result.installedRuleCount} rules across ${result.packagesCount} packages`);
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("Rules installation completed");
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",
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 --no-tests"
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
- }
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- const cli_v2_1 = require("../cli_v2");
5
- (0, cli_v2_1.runCliV2)().catch((error) => {
6
- console.error(error);
7
- process.exit(1);
8
- });
package/dist/cli_v2.d.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export declare function runCliV2(): Promise<void>;
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>;