agentinit 1.4.1 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +209 -0
  3. package/dist/agentinit-1.6.0.tgz +0 -0
  4. package/dist/agents/Agent.d.ts +110 -0
  5. package/dist/agents/Agent.d.ts.map +1 -0
  6. package/dist/agents/Agent.js +174 -0
  7. package/dist/agents/Agent.js.map +1 -0
  8. package/dist/agents/ClaudeAgent.d.ts +50 -0
  9. package/dist/agents/ClaudeAgent.d.ts.map +1 -0
  10. package/dist/agents/ClaudeAgent.js +249 -0
  11. package/dist/agents/ClaudeAgent.js.map +1 -0
  12. package/dist/agents/ClaudeDesktopAgent.d.ts +49 -0
  13. package/dist/agents/ClaudeDesktopAgent.d.ts.map +1 -0
  14. package/dist/agents/ClaudeDesktopAgent.js +143 -0
  15. package/dist/agents/ClaudeDesktopAgent.js.map +1 -0
  16. package/dist/agents/CodexCliAgent.d.ts +48 -0
  17. package/dist/agents/CodexCliAgent.d.ts.map +1 -0
  18. package/dist/agents/CodexCliAgent.js +262 -0
  19. package/dist/agents/CodexCliAgent.js.map +1 -0
  20. package/dist/agents/CursorAgent.d.ts +44 -0
  21. package/dist/agents/CursorAgent.d.ts.map +1 -0
  22. package/dist/agents/CursorAgent.js +231 -0
  23. package/dist/agents/CursorAgent.js.map +1 -0
  24. package/dist/agents/DroidAgent.d.ts +52 -0
  25. package/dist/agents/DroidAgent.d.ts.map +1 -0
  26. package/dist/agents/DroidAgent.js +228 -0
  27. package/dist/agents/DroidAgent.js.map +1 -0
  28. package/dist/agents/GeminiCliAgent.d.ts +40 -0
  29. package/dist/agents/GeminiCliAgent.d.ts.map +1 -0
  30. package/dist/agents/GeminiCliAgent.js +195 -0
  31. package/dist/agents/GeminiCliAgent.js.map +1 -0
  32. package/dist/cli.d.ts +3 -0
  33. package/dist/cli.d.ts.map +1 -0
  34. package/dist/cli.js +33365 -0
  35. package/dist/cli.js.map +1 -0
  36. package/dist/commands/apply.d.ts +2 -0
  37. package/dist/commands/apply.d.ts.map +1 -0
  38. package/dist/commands/apply.js +468 -0
  39. package/dist/commands/apply.js.map +1 -0
  40. package/dist/commands/config.d.ts +8 -0
  41. package/dist/commands/config.d.ts.map +1 -0
  42. package/dist/commands/config.js +6 -0
  43. package/dist/commands/config.js.map +1 -0
  44. package/dist/commands/detect.d.ts +6 -0
  45. package/dist/commands/detect.d.ts.map +1 -0
  46. package/dist/commands/detect.js +55 -0
  47. package/dist/commands/detect.js.map +1 -0
  48. package/dist/commands/init.d.ts +7 -0
  49. package/dist/commands/init.d.ts.map +1 -0
  50. package/dist/commands/init.js +105 -0
  51. package/dist/commands/init.js.map +1 -0
  52. package/dist/commands/mcp.d.ts +8 -0
  53. package/dist/commands/mcp.d.ts.map +1 -0
  54. package/dist/commands/mcp.js +127 -0
  55. package/dist/commands/mcp.js.map +1 -0
  56. package/dist/commands/subagents.d.ts +9 -0
  57. package/dist/commands/subagents.d.ts.map +1 -0
  58. package/dist/commands/subagents.js +6 -0
  59. package/dist/commands/subagents.js.map +1 -0
  60. package/dist/commands/sync.d.ts +7 -0
  61. package/dist/commands/sync.d.ts.map +1 -0
  62. package/dist/commands/sync.js +49 -0
  63. package/dist/commands/sync.js.map +1 -0
  64. package/dist/commands/verifyMcp.d.ts +2 -0
  65. package/dist/commands/verifyMcp.d.ts.map +1 -0
  66. package/dist/commands/verifyMcp.js +215 -0
  67. package/dist/commands/verifyMcp.js.map +1 -0
  68. package/dist/constants/index.d.ts +3 -0
  69. package/dist/constants/index.d.ts.map +1 -0
  70. package/dist/constants/index.js +3 -0
  71. package/dist/constants/index.js.map +1 -0
  72. package/dist/constants/mcp.d.ts +9 -0
  73. package/dist/constants/mcp.d.ts.map +1 -0
  74. package/dist/constants/mcp.js +28 -0
  75. package/dist/constants/mcp.js.map +1 -0
  76. package/dist/constants/tokens.d.ts +6 -0
  77. package/dist/constants/tokens.d.ts.map +1 -0
  78. package/dist/constants/tokens.js +5 -0
  79. package/dist/constants/tokens.js.map +1 -0
  80. package/dist/core/agentDetector.d.ts +9 -0
  81. package/dist/core/agentDetector.d.ts.map +1 -0
  82. package/dist/core/agentDetector.js +51 -0
  83. package/dist/core/agentDetector.js.map +1 -0
  84. package/dist/core/agentManager.d.ts +55 -0
  85. package/dist/core/agentManager.d.ts.map +1 -0
  86. package/dist/core/agentManager.js +113 -0
  87. package/dist/core/agentManager.js.map +1 -0
  88. package/dist/core/configMerger.d.ts +49 -0
  89. package/dist/core/configMerger.d.ts.map +1 -0
  90. package/dist/core/configMerger.js +180 -0
  91. package/dist/core/configMerger.js.map +1 -0
  92. package/dist/core/mcpClient.d.ts +38 -0
  93. package/dist/core/mcpClient.d.ts.map +1 -0
  94. package/dist/core/mcpClient.js +416 -0
  95. package/dist/core/mcpClient.js.map +1 -0
  96. package/dist/core/mcpFilter.d.ts +44 -0
  97. package/dist/core/mcpFilter.d.ts.map +1 -0
  98. package/dist/core/mcpFilter.js +126 -0
  99. package/dist/core/mcpFilter.js.map +1 -0
  100. package/dist/core/mcpParser.d.ts +25 -0
  101. package/dist/core/mcpParser.d.ts.map +1 -0
  102. package/dist/core/mcpParser.js +297 -0
  103. package/dist/core/mcpParser.js.map +1 -0
  104. package/dist/core/propagator.d.ts +25 -0
  105. package/dist/core/propagator.d.ts.map +1 -0
  106. package/dist/core/propagator.js +154 -0
  107. package/dist/core/propagator.js.map +1 -0
  108. package/dist/core/rulesApplicator.d.ts +29 -0
  109. package/dist/core/rulesApplicator.d.ts.map +1 -0
  110. package/dist/core/rulesApplicator.js +181 -0
  111. package/dist/core/rulesApplicator.js.map +1 -0
  112. package/dist/core/rulesParser.d.ts +41 -0
  113. package/dist/core/rulesParser.d.ts.map +1 -0
  114. package/dist/core/rulesParser.js +260 -0
  115. package/dist/core/rulesParser.js.map +1 -0
  116. package/dist/core/rulesTemplateLoader.d.ts +31 -0
  117. package/dist/core/rulesTemplateLoader.d.ts.map +1 -0
  118. package/dist/core/rulesTemplateLoader.js +75 -0
  119. package/dist/core/rulesTemplateLoader.js.map +1 -0
  120. package/dist/core/stackDetector.d.ts +16 -0
  121. package/dist/core/stackDetector.d.ts.map +1 -0
  122. package/dist/core/stackDetector.js +234 -0
  123. package/dist/core/stackDetector.js.map +1 -0
  124. package/dist/core/templateEngine.d.ts +15 -0
  125. package/dist/core/templateEngine.d.ts.map +1 -0
  126. package/dist/core/templateEngine.js +260 -0
  127. package/dist/core/templateEngine.js.map +1 -0
  128. package/dist/core/tomlGenerator.d.ts +24 -0
  129. package/dist/core/tomlGenerator.d.ts.map +1 -0
  130. package/dist/core/tomlGenerator.js +185 -0
  131. package/dist/core/tomlGenerator.js.map +1 -0
  132. package/dist/index.d.ts +21 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +21 -33195
  135. package/dist/index.js.map +1 -0
  136. package/dist/lib/index.d.ts +39 -0
  137. package/dist/lib/index.d.ts.map +1 -0
  138. package/dist/lib/index.js +40 -0
  139. package/dist/lib/index.js.map +1 -0
  140. package/dist/lib/types/index.d.ts +23 -0
  141. package/dist/lib/types/index.d.ts.map +1 -0
  142. package/dist/lib/types/index.js +23 -0
  143. package/dist/lib/types/index.js.map +1 -0
  144. package/dist/lib/utils/index.d.ts +18 -0
  145. package/dist/lib/utils/index.d.ts.map +1 -0
  146. package/dist/lib/utils/index.js +21 -0
  147. package/dist/lib/utils/index.js.map +1 -0
  148. package/dist/lib/verifier/index.d.ts +22 -0
  149. package/dist/lib/verifier/index.d.ts.map +1 -0
  150. package/dist/lib/verifier/index.js +22 -0
  151. package/dist/lib/verifier/index.js.map +1 -0
  152. package/dist/registry/mcpRegistry.d.ts +12 -0
  153. package/dist/registry/mcpRegistry.d.ts.map +1 -0
  154. package/dist/registry/mcpRegistry.js +114 -0
  155. package/dist/registry/mcpRegistry.js.map +1 -0
  156. package/dist/types/index.d.ts +180 -0
  157. package/dist/types/index.d.ts.map +1 -0
  158. package/dist/types/index.js +21 -0
  159. package/dist/types/index.js.map +1 -0
  160. package/dist/types/rules.d.ts +51 -0
  161. package/dist/types/rules.d.ts.map +1 -0
  162. package/dist/types/rules.js +2 -0
  163. package/dist/types/rules.js.map +1 -0
  164. package/dist/utils/fs.d.ts +12 -0
  165. package/dist/utils/fs.d.ts.map +1 -0
  166. package/dist/utils/fs.js +91 -0
  167. package/dist/utils/fs.js.map +1 -0
  168. package/dist/utils/logger.d.ts +14 -0
  169. package/dist/utils/logger.d.ts.map +1 -0
  170. package/dist/utils/logger.js +36 -0
  171. package/dist/utils/logger.js.map +1 -0
  172. package/dist/utils/paths.d.ts +77 -0
  173. package/dist/utils/paths.d.ts.map +1 -0
  174. package/dist/utils/paths.js +140 -0
  175. package/dist/utils/paths.js.map +1 -0
  176. package/package.json +30 -6
  177. package/dist/agentinit-1.4.1.tgz +0 -0
@@ -0,0 +1,181 @@
1
+ import { resolve } from 'path';
2
+ import { countTokens } from 'contextcalc';
3
+ import { readFileIfExists, writeFile, ensureDirectoryExists } from '../utils/fs.js';
4
+ export class RulesApplicator {
5
+ /**
6
+ * Apply rules to an agent's configuration
7
+ */
8
+ async applyRulesToAgent(agent, rules, projectPath, isGlobal = false) {
9
+ try {
10
+ if (!agent.capabilities.rules) {
11
+ return {
12
+ success: false,
13
+ rulesApplied: 0,
14
+ agent: agent.name,
15
+ configPath: '',
16
+ errors: [`Agent ${agent.name} does not support rules`]
17
+ };
18
+ }
19
+ const configPath = isGlobal
20
+ ? agent.getGlobalMcpPath()
21
+ : this.getAgentRulesPath(agent, projectPath);
22
+ if (!configPath) {
23
+ return {
24
+ success: false,
25
+ rulesApplied: 0,
26
+ agent: agent.name,
27
+ configPath: '',
28
+ errors: [`Could not determine config path for ${agent.name}`]
29
+ };
30
+ }
31
+ // Get existing sections and rules before applying new ones using agent methods
32
+ const existingContent = await readFileIfExists(configPath) || '';
33
+ const existingSections = agent.extractExistingSections(existingContent);
34
+ const existingRules = agent.extractExistingRules(existingContent);
35
+ const previousTokenCount = this.countRulesTokens(existingRules);
36
+ // Merge new sections with existing ones
37
+ const mergedSections = this.mergeSections(existingSections, rules.sections);
38
+ const allMergedRules = mergedSections.flatMap(section => section.rules);
39
+ // Determine which rules are new vs existing
40
+ const existingSet = new Set(existingRules);
41
+ const newlyApplied = allMergedRules.filter(rule => !existingSet.has(rule));
42
+ const existing = allMergedRules.filter(rule => existingSet.has(rule));
43
+ // Apply rules based on agent type using merged sections
44
+ await this.applyRulesByAgentType(agent, allMergedRules, configPath, mergedSections);
45
+ // Count tokens in the applied rules (now using merged rules)
46
+ const tokenCount = this.countRulesTokens(allMergedRules);
47
+ const tokenDiff = tokenCount - previousTokenCount;
48
+ // Count total file tokens after applying rules
49
+ const totalFileTokens = await this.countTotalFileTokens(configPath);
50
+ return {
51
+ success: true,
52
+ rulesApplied: allMergedRules.length,
53
+ agent: agent.name,
54
+ configPath,
55
+ tokenCount,
56
+ tokenDiff,
57
+ totalFileTokens,
58
+ existingRules: existing,
59
+ newlyApplied: newlyApplied,
60
+ existingCount: existing.length,
61
+ newlyAppliedCount: newlyApplied.length,
62
+ mergedSections: mergedSections
63
+ };
64
+ }
65
+ catch (error) {
66
+ return {
67
+ success: false,
68
+ rulesApplied: 0,
69
+ agent: agent.name,
70
+ configPath: '',
71
+ errors: [`Failed to apply rules to ${agent.name}: ${error instanceof Error ? error.message : 'Unknown error'}`]
72
+ };
73
+ }
74
+ }
75
+ /**
76
+ * Apply rules using agent-specific methods
77
+ */
78
+ async applyRulesByAgentType(agent, rules, configPath, sections) {
79
+ await ensureDirectoryExists(configPath);
80
+ const existing = await readFileIfExists(configPath) || '';
81
+ // Create AppliedRules object for the agent
82
+ const appliedRules = {
83
+ templateRules: rules,
84
+ rawRules: [],
85
+ fileRules: [],
86
+ remoteRules: [],
87
+ merged: rules,
88
+ sections: sections || []
89
+ };
90
+ // Delegate to agent-specific implementation
91
+ const newContent = await agent.applyRulesConfig(configPath, appliedRules, existing);
92
+ // Write the new content
93
+ await writeFile(configPath, newContent);
94
+ }
95
+ /**
96
+ * Merge new sections with existing ones
97
+ */
98
+ mergeSections(existingSections, newSections) {
99
+ const merged = new Map();
100
+ // Add all existing sections
101
+ for (const section of existingSections) {
102
+ merged.set(section.templateId, {
103
+ templateId: section.templateId,
104
+ templateName: section.templateName,
105
+ rules: [...section.rules]
106
+ });
107
+ }
108
+ // Add or merge new sections
109
+ for (const section of newSections) {
110
+ if (merged.has(section.templateId)) {
111
+ // Merge rules, deduplicating
112
+ const existing = merged.get(section.templateId);
113
+ const allRules = [...existing.rules, ...section.rules];
114
+ const uniqueRules = [...new Set(allRules)];
115
+ merged.set(section.templateId, {
116
+ ...existing,
117
+ rules: uniqueRules
118
+ });
119
+ }
120
+ else {
121
+ // Add new section
122
+ merged.set(section.templateId, {
123
+ templateId: section.templateId,
124
+ templateName: section.templateName,
125
+ rules: [...section.rules]
126
+ });
127
+ }
128
+ }
129
+ return Array.from(merged.values());
130
+ }
131
+ /**
132
+ * Count total tokens in the entire config file
133
+ */
134
+ async countTotalFileTokens(configPath) {
135
+ try {
136
+ const fileContent = await readFileIfExists(configPath);
137
+ if (!fileContent)
138
+ return 0;
139
+ return countTokens(fileContent);
140
+ }
141
+ catch (error) {
142
+ console.warn('Failed to count total file tokens:', error);
143
+ return 0;
144
+ }
145
+ }
146
+ /**
147
+ * Count tokens in the rules
148
+ */
149
+ countRulesTokens(rules) {
150
+ try {
151
+ if (rules.length === 0)
152
+ return 0;
153
+ // Join all rules with bullet points as they would appear in the config
154
+ const rulesText = rules.map(rule => `- ${rule}`).join('\n');
155
+ return countTokens(rulesText);
156
+ }
157
+ catch (error) {
158
+ // If token counting fails, return 0 to avoid breaking the functionality
159
+ console.warn('Failed to count tokens:', error);
160
+ return 0;
161
+ }
162
+ }
163
+ /**
164
+ * Get the appropriate rules config path for an agent
165
+ */
166
+ getAgentRulesPath(agent, projectPath) {
167
+ // Use the same path as the agent's native config for rules
168
+ // Each agent will handle rules in their own config file
169
+ switch (agent.id) {
170
+ case 'claude':
171
+ return resolve(projectPath, 'CLAUDE.md');
172
+ case 'cursor':
173
+ return resolve(projectPath, '.cursorrules');
174
+ case 'claude-desktop':
175
+ return resolve(projectPath, '.claude_desktop_config.json');
176
+ default:
177
+ return resolve(projectPath, `${agent.id}_rules.md`);
178
+ }
179
+ }
180
+ }
181
+ //# sourceMappingURL=rulesApplicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulesApplicator.js","sourceRoot":"","sources":["../../src/core/rulesApplicator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { RulesConfig, AppliedRules } from '../types/rules.js';
2
+ export declare class RulesParseError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ export declare class RulesParser {
6
+ private templateLoader;
7
+ constructor();
8
+ /**
9
+ * Parse command line arguments for rules configuration
10
+ */
11
+ static parseArguments(args: string[]): RulesConfig;
12
+ /**
13
+ * Process rules configuration and return merged rules
14
+ */
15
+ processRules(config: RulesConfig): Promise<AppliedRules>;
16
+ /**
17
+ * Load rules from a local file
18
+ */
19
+ private loadRulesFromFile;
20
+ /**
21
+ * Load rules from a remote URL
22
+ */
23
+ private loadRulesFromRemote;
24
+ /**
25
+ * Extract rules from a parsed object (JSON/TOML)
26
+ */
27
+ private extractRulesFromObject;
28
+ /**
29
+ * Remove duplicate rules while preserving order
30
+ */
31
+ private deduplicateRules;
32
+ /**
33
+ * Get available rule templates
34
+ */
35
+ getAvailableTemplates(): import("../types/rules.js").RuleTemplate[];
36
+ /**
37
+ * Validate template IDs
38
+ */
39
+ validateTemplateIds(templateIds: string[]): string[];
40
+ }
41
+ //# sourceMappingURL=rulesParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulesParser.d.ts","sourceRoot":"","sources":["../../src/core/rulesParser.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAsB,MAAM,mBAAmB,CAAC;AAGvF,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,cAAc,CAAsB;;IAM5C;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW;IA+ClD;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwE9D;;OAEG;YACW,iBAAiB;IA8B/B;;OAEG;YACW,mBAAmB;IAgDjC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAsB9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAexB;;OAEG;IACH,qBAAqB;IAIrB;;OAEG;IACH,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;CAIrD"}
@@ -0,0 +1,260 @@
1
+ import { readFileSync } from 'fs';
2
+ import { fileExists } from '../utils/fs.js';
3
+ import { RulesTemplateLoader } from './rulesTemplateLoader.js';
4
+ import { DEFAULT_CONNECTION_TIMEOUT_MS } from '../constants/index.js';
5
+ export class RulesParseError extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = 'RulesParseError';
9
+ }
10
+ }
11
+ export class RulesParser {
12
+ templateLoader;
13
+ constructor() {
14
+ this.templateLoader = new RulesTemplateLoader();
15
+ }
16
+ /**
17
+ * Parse command line arguments for rules configuration
18
+ */
19
+ static parseArguments(args) {
20
+ const config = {
21
+ templates: [],
22
+ rawRules: []
23
+ };
24
+ for (let i = 0; i < args.length; i++) {
25
+ const arg = args[i];
26
+ if (arg === '--rules' && i + 1 < args.length) {
27
+ const templatesStr = args[i + 1];
28
+ if (templatesStr) {
29
+ config.templates = templatesStr.split(',').map(t => t.trim()).filter(Boolean);
30
+ }
31
+ i++; // Skip next argument
32
+ }
33
+ else if (arg === '--rule-raw' && i + 1 < args.length) {
34
+ const rawRule = args[i + 1];
35
+ if (rawRule) {
36
+ config.rawRules.push(rawRule);
37
+ }
38
+ i++; // Skip next argument
39
+ }
40
+ else if (arg === '--rules-file' && i + 1 < args.length) {
41
+ const filePath = args[i + 1];
42
+ if (filePath) {
43
+ config.fileRules = filePath;
44
+ }
45
+ i++; // Skip next argument
46
+ }
47
+ else if (arg === '--rules-remote' && i + 1 < args.length) {
48
+ const url = args[i + 1];
49
+ let auth;
50
+ // Check if next argument is auth
51
+ if (i + 2 < args.length && args[i + 2] === '--auth' && i + 3 < args.length) {
52
+ auth = args[i + 3];
53
+ i += 2; // Skip --auth and its value
54
+ }
55
+ if (url) {
56
+ config.remoteRules = auth ? { url, auth } : { url };
57
+ }
58
+ i++; // Skip URL argument
59
+ }
60
+ }
61
+ return config;
62
+ }
63
+ /**
64
+ * Process rules configuration and return merged rules
65
+ */
66
+ async processRules(config) {
67
+ const result = {
68
+ templateRules: [],
69
+ rawRules: config.rawRules || [],
70
+ fileRules: [],
71
+ remoteRules: [],
72
+ merged: [],
73
+ sections: []
74
+ };
75
+ // Process template rules and build sections
76
+ for (const templateId of config.templates || []) {
77
+ const template = this.templateLoader.getTemplate(templateId);
78
+ if (!template) {
79
+ throw new RulesParseError(`Unknown rule template: ${templateId}`);
80
+ }
81
+ result.templateRules.push(...template.rules);
82
+ // Add section information
83
+ result.sections.push({
84
+ templateId: template.id,
85
+ templateName: template.name,
86
+ rules: template.rules
87
+ });
88
+ }
89
+ // Process file rules
90
+ if (config.fileRules) {
91
+ result.fileRules = await this.loadRulesFromFile(config.fileRules);
92
+ if (result.fileRules.length > 0) {
93
+ result.sections.push({
94
+ templateId: 'file_rules',
95
+ templateName: 'File Rules',
96
+ rules: result.fileRules
97
+ });
98
+ }
99
+ }
100
+ // Process remote rules
101
+ if (config.remoteRules) {
102
+ result.remoteRules = await this.loadRulesFromRemote(config.remoteRules);
103
+ if (result.remoteRules.length > 0) {
104
+ result.sections.push({
105
+ templateId: 'remote_rules',
106
+ templateName: 'Remote Rules',
107
+ rules: result.remoteRules
108
+ });
109
+ }
110
+ }
111
+ // Process raw rules
112
+ if (result.rawRules.length > 0) {
113
+ result.sections.push({
114
+ templateId: 'custom_rules',
115
+ templateName: 'Custom Rules',
116
+ rules: result.rawRules
117
+ });
118
+ }
119
+ // Merge all rules and deduplicate
120
+ const allRules = [
121
+ ...result.templateRules,
122
+ ...result.rawRules,
123
+ ...result.fileRules,
124
+ ...result.remoteRules
125
+ ];
126
+ result.merged = this.deduplicateRules(allRules);
127
+ return result;
128
+ }
129
+ /**
130
+ * Load rules from a local file
131
+ */
132
+ async loadRulesFromFile(filePath) {
133
+ if (!await fileExists(filePath)) {
134
+ throw new RulesParseError(`Rules file not found: ${filePath}`);
135
+ }
136
+ try {
137
+ const content = readFileSync(filePath, 'utf-8');
138
+ // Try to detect file format and parse accordingly
139
+ if (filePath.endsWith('.json')) {
140
+ const parsed = JSON.parse(content);
141
+ return this.extractRulesFromObject(parsed);
142
+ }
143
+ else if (filePath.endsWith('.toml')) {
144
+ // Handle TOML files (could be rule templates or simple rule lists)
145
+ const TOML = await import('@iarna/toml');
146
+ const parsed = TOML.parse(content);
147
+ return this.extractRulesFromObject(parsed);
148
+ }
149
+ else {
150
+ // Treat as plain text with one rule per line
151
+ return content
152
+ .split('\n')
153
+ .map(line => line.trim())
154
+ .filter(line => line && !line.startsWith('#'))
155
+ .map(line => line.replace(/^[-*]\s*/, '')); // Remove markdown list markers
156
+ }
157
+ }
158
+ catch (error) {
159
+ throw new RulesParseError(`Failed to parse rules file ${filePath}: ${error instanceof Error ? error.message : 'Unknown error'}`);
160
+ }
161
+ }
162
+ /**
163
+ * Load rules from a remote URL
164
+ */
165
+ async loadRulesFromRemote(options) {
166
+ try {
167
+ const headers = {};
168
+ if (options.auth) {
169
+ if (options.auth.startsWith('Bearer ')) {
170
+ headers.Authorization = options.auth;
171
+ }
172
+ else {
173
+ headers.Authorization = `Bearer ${options.auth}`;
174
+ }
175
+ }
176
+ const controller = new AbortController();
177
+ const timeoutMs = options.timeout ?? DEFAULT_CONNECTION_TIMEOUT_MS;
178
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
179
+ let response;
180
+ try {
181
+ response = await fetch(options.url, {
182
+ headers,
183
+ signal: controller.signal
184
+ });
185
+ }
186
+ finally {
187
+ clearTimeout(timeoutId);
188
+ }
189
+ if (!response.ok) {
190
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
191
+ }
192
+ const content = await response.text();
193
+ // Try to parse as JSON first, then as plain text
194
+ try {
195
+ const parsed = JSON.parse(content);
196
+ return this.extractRulesFromObject(parsed);
197
+ }
198
+ catch {
199
+ // Treat as plain text
200
+ return content
201
+ .split('\n')
202
+ .map((line) => line.trim())
203
+ .filter((line) => line && !line.startsWith('#'))
204
+ .map((line) => line.replace(/^[-*]\s*/, ''));
205
+ }
206
+ }
207
+ catch (error) {
208
+ throw new RulesParseError(`Failed to fetch remote rules from ${options.url}: ${error instanceof Error ? error.message : 'Unknown error'}`);
209
+ }
210
+ }
211
+ /**
212
+ * Extract rules from a parsed object (JSON/TOML)
213
+ */
214
+ extractRulesFromObject(obj) {
215
+ if (Array.isArray(obj)) {
216
+ return obj.map(item => typeof item === 'string' ? item : item.text || item.rule || String(item));
217
+ }
218
+ if (obj.rules && Array.isArray(obj.rules)) {
219
+ return obj.rules.map((rule) => typeof rule === 'string' ? rule : rule.text || rule.rule || String(rule));
220
+ }
221
+ if (obj.template && obj.template.rules) {
222
+ return this.extractRulesFromObject(obj.template.rules);
223
+ }
224
+ // If it's a flat object, try to extract string values
225
+ const values = Object.values(obj).filter(value => typeof value === 'string');
226
+ if (values.length > 0) {
227
+ return values;
228
+ }
229
+ throw new Error('Could not extract rules from object structure');
230
+ }
231
+ /**
232
+ * Remove duplicate rules while preserving order
233
+ */
234
+ deduplicateRules(rules) {
235
+ const seen = new Set();
236
+ const result = [];
237
+ for (const rule of rules) {
238
+ const normalized = rule.trim().toLowerCase();
239
+ if (!seen.has(normalized) && rule.trim()) {
240
+ seen.add(normalized);
241
+ result.push(rule.trim());
242
+ }
243
+ }
244
+ return result;
245
+ }
246
+ /**
247
+ * Get available rule templates
248
+ */
249
+ getAvailableTemplates() {
250
+ return this.templateLoader.getAllTemplates();
251
+ }
252
+ /**
253
+ * Validate template IDs
254
+ */
255
+ validateTemplateIds(templateIds) {
256
+ const invalid = templateIds.filter(id => !this.templateLoader.hasTemplate(id));
257
+ return invalid;
258
+ }
259
+ }
260
+ //# sourceMappingURL=rulesParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulesParser.js","sourceRoot":"","sources":["../../src/core/rulesParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { RuleTemplate } from '../types/rules.js';
2
+ export declare class RulesTemplateLoader {
3
+ private readonly templatesPath;
4
+ private templates;
5
+ constructor();
6
+ /**
7
+ * Load all rule templates from TOML files
8
+ */
9
+ private loadTemplates;
10
+ /**
11
+ * Get a rule template by ID
12
+ */
13
+ getTemplate(id: string): RuleTemplate | null;
14
+ /**
15
+ * Get all available rule templates
16
+ */
17
+ getAllTemplates(): RuleTemplate[];
18
+ /**
19
+ * Get templates by category
20
+ */
21
+ getTemplatesByCategory(category: RuleTemplate['category']): RuleTemplate[];
22
+ /**
23
+ * Check if a template exists
24
+ */
25
+ hasTemplate(id: string): boolean;
26
+ /**
27
+ * Get available template IDs
28
+ */
29
+ getAvailableTemplateIds(): string[];
30
+ }
31
+ //# sourceMappingURL=rulesTemplateLoader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulesTemplateLoader.d.ts","sourceRoot":"","sources":["../../src/core/rulesTemplateLoader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAgBtD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,SAAS,CAAwC;;IAQzD;;OAEG;IACH,OAAO,CAAC,aAAa;IA6BrB;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAI5C;;OAEG;IACH,eAAe,IAAI,YAAY,EAAE;IAIjC;;OAEG;IACH,sBAAsB,CAAC,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,YAAY,EAAE;IAK1E;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,uBAAuB,IAAI,MAAM,EAAE;CAGpC"}
@@ -0,0 +1,75 @@
1
+ import { resolve, dirname } from 'path';
2
+ import { fileURLToPath } from 'url';
3
+ import { readFileSync, readdirSync, existsSync } from 'fs';
4
+ import TOML from '@iarna/toml';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ export class RulesTemplateLoader {
8
+ templatesPath;
9
+ templates = new Map();
10
+ constructor() {
11
+ // In the built version, templates will be next to the bundle
12
+ this.templatesPath = resolve(__dirname, 'templates/rules');
13
+ this.loadTemplates();
14
+ }
15
+ /**
16
+ * Load all rule templates from TOML files
17
+ */
18
+ loadTemplates() {
19
+ if (!existsSync(this.templatesPath)) {
20
+ throw new Error(`Rules templates directory not found: ${this.templatesPath}`);
21
+ }
22
+ const files = readdirSync(this.templatesPath).filter(file => file.endsWith('.toml'));
23
+ for (const file of files) {
24
+ try {
25
+ const filePath = resolve(this.templatesPath, file);
26
+ const content = readFileSync(filePath, 'utf-8');
27
+ const parsed = TOML.parse(content);
28
+ const template = {
29
+ id: parsed.template.id,
30
+ name: parsed.template.name,
31
+ description: parsed.template.description,
32
+ category: parsed.template.category,
33
+ priority: parsed.template.priority || 5,
34
+ rules: parsed.rules.map(rule => rule.text)
35
+ };
36
+ this.templates.set(template.id, template);
37
+ }
38
+ catch (error) {
39
+ console.warn(`Failed to load rule template from ${file}:`, error);
40
+ }
41
+ }
42
+ }
43
+ /**
44
+ * Get a rule template by ID
45
+ */
46
+ getTemplate(id) {
47
+ return this.templates.get(id) || null;
48
+ }
49
+ /**
50
+ * Get all available rule templates
51
+ */
52
+ getAllTemplates() {
53
+ return Array.from(this.templates.values());
54
+ }
55
+ /**
56
+ * Get templates by category
57
+ */
58
+ getTemplatesByCategory(category) {
59
+ return Array.from(this.templates.values())
60
+ .filter(template => template.category === category);
61
+ }
62
+ /**
63
+ * Check if a template exists
64
+ */
65
+ hasTemplate(id) {
66
+ return this.templates.has(id);
67
+ }
68
+ /**
69
+ * Get available template IDs
70
+ */
71
+ getAvailableTemplateIds() {
72
+ return Array.from(this.templates.keys());
73
+ }
74
+ }
75
+ //# sourceMappingURL=rulesTemplateLoader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rulesTemplateLoader.js","sourceRoot":"","sources":["../../src/core/rulesTemplateLoader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { StackInfo } from '../types/index.js';
2
+ export declare class StackDetector {
3
+ private readonly lockFiles;
4
+ private readonly manifestFiles;
5
+ private readonly configFiles;
6
+ detectStack(projectPath: string): Promise<StackInfo>;
7
+ private detectFromLockFiles;
8
+ private inferStackFromLockFile;
9
+ private detectFromManifests;
10
+ private inferStackFromManifest;
11
+ private detectFromConfigs;
12
+ private inferStackFromConfig;
13
+ private detectFromFilePatterns;
14
+ private analyzeJavaScriptProject;
15
+ }
16
+ //# sourceMappingURL=stackDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stackDetector.d.ts","sourceRoot":"","sources":["../../src/core/stackDetector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CASxB;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAQ5B;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAS1B;IAEI,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YAiB5C,mBAAmB;YAUnB,sBAAsB;YA8BtB,mBAAmB;YAUnB,sBAAsB;YA+BtB,iBAAiB;YAUjB,oBAAoB;YAyBpB,sBAAsB;YAoCtB,wBAAwB;CAoDvC"}