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.
- package/CHANGELOG.md +19 -0
- package/README.md +209 -0
- package/dist/agentinit-1.6.0.tgz +0 -0
- package/dist/agents/Agent.d.ts +110 -0
- package/dist/agents/Agent.d.ts.map +1 -0
- package/dist/agents/Agent.js +174 -0
- package/dist/agents/Agent.js.map +1 -0
- package/dist/agents/ClaudeAgent.d.ts +50 -0
- package/dist/agents/ClaudeAgent.d.ts.map +1 -0
- package/dist/agents/ClaudeAgent.js +249 -0
- package/dist/agents/ClaudeAgent.js.map +1 -0
- package/dist/agents/ClaudeDesktopAgent.d.ts +49 -0
- package/dist/agents/ClaudeDesktopAgent.d.ts.map +1 -0
- package/dist/agents/ClaudeDesktopAgent.js +143 -0
- package/dist/agents/ClaudeDesktopAgent.js.map +1 -0
- package/dist/agents/CodexCliAgent.d.ts +48 -0
- package/dist/agents/CodexCliAgent.d.ts.map +1 -0
- package/dist/agents/CodexCliAgent.js +262 -0
- package/dist/agents/CodexCliAgent.js.map +1 -0
- package/dist/agents/CursorAgent.d.ts +44 -0
- package/dist/agents/CursorAgent.d.ts.map +1 -0
- package/dist/agents/CursorAgent.js +231 -0
- package/dist/agents/CursorAgent.js.map +1 -0
- package/dist/agents/DroidAgent.d.ts +52 -0
- package/dist/agents/DroidAgent.d.ts.map +1 -0
- package/dist/agents/DroidAgent.js +228 -0
- package/dist/agents/DroidAgent.js.map +1 -0
- package/dist/agents/GeminiCliAgent.d.ts +40 -0
- package/dist/agents/GeminiCliAgent.d.ts.map +1 -0
- package/dist/agents/GeminiCliAgent.js +195 -0
- package/dist/agents/GeminiCliAgent.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +33365 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/apply.d.ts +2 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +468 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +6 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/detect.d.ts +6 -0
- package/dist/commands/detect.d.ts.map +1 -0
- package/dist/commands/detect.js +55 -0
- package/dist/commands/detect.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +105 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp.d.ts +8 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +127 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/subagents.d.ts +9 -0
- package/dist/commands/subagents.d.ts.map +1 -0
- package/dist/commands/subagents.js +6 -0
- package/dist/commands/subagents.js.map +1 -0
- package/dist/commands/sync.d.ts +7 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +49 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/verifyMcp.d.ts +2 -0
- package/dist/commands/verifyMcp.d.ts.map +1 -0
- package/dist/commands/verifyMcp.js +215 -0
- package/dist/commands/verifyMcp.js.map +1 -0
- package/dist/constants/index.d.ts +3 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +3 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/constants/mcp.d.ts +9 -0
- package/dist/constants/mcp.d.ts.map +1 -0
- package/dist/constants/mcp.js +28 -0
- package/dist/constants/mcp.js.map +1 -0
- package/dist/constants/tokens.d.ts +6 -0
- package/dist/constants/tokens.d.ts.map +1 -0
- package/dist/constants/tokens.js +5 -0
- package/dist/constants/tokens.js.map +1 -0
- package/dist/core/agentDetector.d.ts +9 -0
- package/dist/core/agentDetector.d.ts.map +1 -0
- package/dist/core/agentDetector.js +51 -0
- package/dist/core/agentDetector.js.map +1 -0
- package/dist/core/agentManager.d.ts +55 -0
- package/dist/core/agentManager.d.ts.map +1 -0
- package/dist/core/agentManager.js +113 -0
- package/dist/core/agentManager.js.map +1 -0
- package/dist/core/configMerger.d.ts +49 -0
- package/dist/core/configMerger.d.ts.map +1 -0
- package/dist/core/configMerger.js +180 -0
- package/dist/core/configMerger.js.map +1 -0
- package/dist/core/mcpClient.d.ts +38 -0
- package/dist/core/mcpClient.d.ts.map +1 -0
- package/dist/core/mcpClient.js +416 -0
- package/dist/core/mcpClient.js.map +1 -0
- package/dist/core/mcpFilter.d.ts +44 -0
- package/dist/core/mcpFilter.d.ts.map +1 -0
- package/dist/core/mcpFilter.js +126 -0
- package/dist/core/mcpFilter.js.map +1 -0
- package/dist/core/mcpParser.d.ts +25 -0
- package/dist/core/mcpParser.d.ts.map +1 -0
- package/dist/core/mcpParser.js +297 -0
- package/dist/core/mcpParser.js.map +1 -0
- package/dist/core/propagator.d.ts +25 -0
- package/dist/core/propagator.d.ts.map +1 -0
- package/dist/core/propagator.js +154 -0
- package/dist/core/propagator.js.map +1 -0
- package/dist/core/rulesApplicator.d.ts +29 -0
- package/dist/core/rulesApplicator.d.ts.map +1 -0
- package/dist/core/rulesApplicator.js +181 -0
- package/dist/core/rulesApplicator.js.map +1 -0
- package/dist/core/rulesParser.d.ts +41 -0
- package/dist/core/rulesParser.d.ts.map +1 -0
- package/dist/core/rulesParser.js +260 -0
- package/dist/core/rulesParser.js.map +1 -0
- package/dist/core/rulesTemplateLoader.d.ts +31 -0
- package/dist/core/rulesTemplateLoader.d.ts.map +1 -0
- package/dist/core/rulesTemplateLoader.js +75 -0
- package/dist/core/rulesTemplateLoader.js.map +1 -0
- package/dist/core/stackDetector.d.ts +16 -0
- package/dist/core/stackDetector.d.ts.map +1 -0
- package/dist/core/stackDetector.js +234 -0
- package/dist/core/stackDetector.js.map +1 -0
- package/dist/core/templateEngine.d.ts +15 -0
- package/dist/core/templateEngine.d.ts.map +1 -0
- package/dist/core/templateEngine.js +260 -0
- package/dist/core/templateEngine.js.map +1 -0
- package/dist/core/tomlGenerator.d.ts +24 -0
- package/dist/core/tomlGenerator.d.ts.map +1 -0
- package/dist/core/tomlGenerator.js +185 -0
- package/dist/core/tomlGenerator.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -33195
- package/dist/index.js.map +1 -0
- package/dist/lib/index.d.ts +39 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +40 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/types/index.d.ts +23 -0
- package/dist/lib/types/index.d.ts.map +1 -0
- package/dist/lib/types/index.js +23 -0
- package/dist/lib/types/index.js.map +1 -0
- package/dist/lib/utils/index.d.ts +18 -0
- package/dist/lib/utils/index.d.ts.map +1 -0
- package/dist/lib/utils/index.js +21 -0
- package/dist/lib/utils/index.js.map +1 -0
- package/dist/lib/verifier/index.d.ts +22 -0
- package/dist/lib/verifier/index.d.ts.map +1 -0
- package/dist/lib/verifier/index.js +22 -0
- package/dist/lib/verifier/index.js.map +1 -0
- package/dist/registry/mcpRegistry.d.ts +12 -0
- package/dist/registry/mcpRegistry.d.ts.map +1 -0
- package/dist/registry/mcpRegistry.js +114 -0
- package/dist/registry/mcpRegistry.js.map +1 -0
- package/dist/types/index.d.ts +180 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/rules.d.ts +51 -0
- package/dist/types/rules.d.ts.map +1 -0
- package/dist/types/rules.js +2 -0
- package/dist/types/rules.js.map +1 -0
- package/dist/utils/fs.d.ts +12 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +91 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/logger.d.ts +14 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +36 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +77 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +140 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +30 -6
- 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"}
|