@serdaraytac/agentsitter 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +91 -0
- package/README.md +349 -0
- package/dist/analyzer.d.ts +78 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +815 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/browser.d.ts +5 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +5 -0
- package/dist/browser.js.map +1 -0
- package/dist/mcp-server.d.ts +3 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +323 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/optimizer.d.ts +9 -0
- package/dist/optimizer.d.ts.map +1 -0
- package/dist/optimizer.js +345 -0
- package/dist/optimizer.js.map +1 -0
- package/dist/parser.d.ts +20 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +115 -0
- package/dist/parser.js.map +1 -0
- package/dist/platforms.d.ts +12 -0
- package/dist/platforms.d.ts.map +1 -0
- package/dist/platforms.js +143 -0
- package/dist/platforms.js.map +1 -0
- package/dist/scorer.d.ts +14 -0
- package/dist/scorer.d.ts.map +1 -0
- package/dist/scorer.js +124 -0
- package/dist/scorer.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
// Maps vague phrases to concrete alternatives, organized by category.
|
|
2
|
+
// Patterns mirror the VAGUE_PATTERNS in analyzer.ts.
|
|
3
|
+
// Replacements with $1/$2 use JavaScript's native capture-group substitution.
|
|
4
|
+
const VAGUE_REPLACEMENTS = [
|
|
5
|
+
// --- unmeasurable-quality ---
|
|
6
|
+
{ pattern: /\bwrite\s+(good|great|better|clean|quality|nice)\s+code\b/gi, suggestion: "write code that passes all tests and type checks" },
|
|
7
|
+
{ pattern: /\b(elegant|robust)\b/gi, suggestion: "[TODO: replace with a measurable criterion]" },
|
|
8
|
+
{ pattern: /\bwell[\s-]?(written|structured|organized)\b/gi, suggestion: "[TODO: specify the convention, e.g. follows linting rules, passes type checks]" },
|
|
9
|
+
{ pattern: /\bhigh[\s-]?quality\b/gi, suggestion: "verified via tests and linting" },
|
|
10
|
+
{ pattern: /\bmaintainable\b/gi, suggestion: "easy to extend without modifying existing functions" },
|
|
11
|
+
{ pattern: /\breadable\b/gi, suggestion: "self-documenting through naming, not comments" },
|
|
12
|
+
{ pattern: /\bproper(ly)?\b/gi, suggestion: "[TODO: define what correct means in this context]" },
|
|
13
|
+
// --- false-shared-context ---
|
|
14
|
+
{ pattern: /\bfollow\s+best\s+practices\b/gi, suggestion: "follow the conventions defined in this file" },
|
|
15
|
+
{ pattern: /\buse\s+common\s+sense\b/gi, suggestion: "[TODO: define the decision criteria explicitly]" },
|
|
16
|
+
{ pattern: /\buse\s+(your\s+)?judgment\b/gi, suggestion: "[TODO: specify the decision criteria]" },
|
|
17
|
+
{ pattern: /\buse\s+standard\s+patterns?\b/gi, suggestion: "[TODO: name the specific patterns, e.g. repository, factory]" },
|
|
18
|
+
{ pattern: /\bindustry\s+standards?\b/gi, suggestion: "[TODO: reference the specific standard or spec]" },
|
|
19
|
+
{ pattern: /\bfollow\s+(the\s+)?conventions?\b/gi, suggestion: "follow the conventions defined in this file" },
|
|
20
|
+
{ pattern: /\bconventional\s+(approach|way|method)\b/gi, suggestion: "[TODO: describe the expected approach explicitly]" },
|
|
21
|
+
{ pattern: /\bstandard\s+(way|approach|practice)\b/gi, suggestion: "[TODO: name the specific practice]" },
|
|
22
|
+
// --- passive-voice ---
|
|
23
|
+
{ pattern: /\bshould\s+be\s+(done|handled|implemented|addressed|considered|reviewed|tested)\b/gi, suggestion: "must [TODO: specify who performs this action and how]" },
|
|
24
|
+
{ pattern: /\bneeds?\s+to\s+be\s+(handled|done|checked|fixed|resolved|addressed)\b/gi, suggestion: "must [TODO: specify the action and owner]" },
|
|
25
|
+
{ pattern: /\bmust\s+be\s+considered\b/gi, suggestion: "must [TODO: specify the required action]" },
|
|
26
|
+
{ pattern: /\bis\s+expected\s+to\b/gi, suggestion: "must [TODO: rewrite as an active directive]" },
|
|
27
|
+
// --- weak-obligation ---
|
|
28
|
+
{ pattern: /\btry\s+to\b/gi, suggestion: "[TODO: use 'always' if required, or remove if optional]" },
|
|
29
|
+
{ pattern: /\battempt\s+to\b/gi, suggestion: "[TODO: use 'must' if required, or remove if optional]" },
|
|
30
|
+
{ pattern: /\bconsider\s+(using|adding|implementing|making|doing)\b/gi, suggestion: "[TODO: decide if required — use 'always $1' or remove]" },
|
|
31
|
+
{ pattern: /\bmight\s+want\s+to\b/gi, suggestion: "[TODO: use 'must' if required, or remove]" },
|
|
32
|
+
{ pattern: /\bit\s+would\s+be\s+(good|nice|helpful|better)\s+to\b/gi, suggestion: "[TODO: rewrite as a directive or remove]" },
|
|
33
|
+
{ pattern: /\bideally\b/gi, suggestion: "[TODO: remove qualifier and state the rule directly, or drop if aspirational only]" },
|
|
34
|
+
// --- vague-condition ---
|
|
35
|
+
{ pattern: /\bappropriate(ly)?\b/gi, suggestion: "[TODO: define the criterion for appropriateness]" },
|
|
36
|
+
{ pattern: /\bas\s+needed\b/gi, suggestion: "when [TODO: specify the trigger condition]" },
|
|
37
|
+
{ pattern: /\bwhen\s+(necessary|applicable|possible|appropriate)\b/gi, suggestion: "when [TODO: specify the exact condition]" },
|
|
38
|
+
{ pattern: /\bif\s+(necessary|needed|required|applicable)\b/gi, suggestion: "if [TODO: specify the condition]" },
|
|
39
|
+
{ pattern: /\bin\s+most\s+cases\b/gi, suggestion: "always, except when [TODO: list the explicit exceptions]" },
|
|
40
|
+
{ pattern: /\bin\s+general\b/gi, suggestion: "[TODO: remove qualifier — state the rule directly]" },
|
|
41
|
+
{ pattern: /\bwhere\s+(possible|feasible)\b/gi, suggestion: "[TODO: define what makes this impossible, or make it unconditional]" },
|
|
42
|
+
{ pattern: /\bfor\s+(large|complex|small)\s+(files?|functions?|classes?|components?)\b/gi, suggestion: "for $2 exceeding [TODO: specify a measurable threshold, e.g. 300 lines]" },
|
|
43
|
+
// --- comparative-without-baseline ---
|
|
44
|
+
{ pattern: /\bas\s+(\w+)\s+as\s+possible\b/gi, suggestion: "[TODO: specify a concrete target, e.g. under 50 lines, under 200ms]" },
|
|
45
|
+
{ pattern: /\bimprove\s+(performance|readability|maintainability|quality)\b/gi, suggestion: "ensure $1 meets [TODO: specify the threshold or criterion]" },
|
|
46
|
+
{ pattern: /\b(better|cleaner|simpler|faster)\s+(code|approach|solution|implementation)\b/gi, suggestion: "$2 that [TODO: define the acceptance baseline]" },
|
|
47
|
+
{ pattern: /\befficient(ly)?\s+as\s+possible\b/gi, suggestion: "[TODO: specify the performance target, e.g. p95 latency under 200ms]" },
|
|
48
|
+
{ pattern: /\boptimize\s+(for\s+)?(performance|speed|memory|readability)\b/gi, suggestion: "optimize $2 to [TODO: specify the target metric and threshold]" },
|
|
49
|
+
// --- outcome-without-criterion ---
|
|
50
|
+
{ pattern: /\bensure\s+(quality|correctness|accuracy|consistency)\b/gi, suggestion: "verify $1 via tests and linting" },
|
|
51
|
+
{ pattern: /\bmaintain\s+(standards?|quality|consistency)\b/gi, suggestion: "conform to the rules defined in this file" },
|
|
52
|
+
{ pattern: /\bbe\s+(thorough|careful|diligent|mindful|consistent)\b/gi, suggestion: "[TODO: specify what this means concretely — replace with a verifiable check]" },
|
|
53
|
+
{ pattern: /\bpay\s+attention\s+to\b/gi, suggestion: "always verify [TODO: specify what to check]" },
|
|
54
|
+
{ pattern: /\bhandle\s+(errors?|edge\s+cases?)\s+properly\b/gi, suggestion: "handle $1 by [TODO: specify the strategy, e.g. log and rethrow / return Result type]" },
|
|
55
|
+
{ pattern: /\bsimple(r|ly)?\b/gi, suggestion: "[TODO: define simplicity criterion, e.g. cyclomatic complexity ≤ 5]" },
|
|
56
|
+
];
|
|
57
|
+
function deduplicateLines(lines) {
|
|
58
|
+
const seen = new Set();
|
|
59
|
+
const result = [];
|
|
60
|
+
let removed = 0;
|
|
61
|
+
for (const line of lines) {
|
|
62
|
+
const normalized = line.trim().toLowerCase();
|
|
63
|
+
// Keep empty lines and headings always
|
|
64
|
+
if (!normalized || normalized.startsWith("#")) {
|
|
65
|
+
result.push(line);
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (seen.has(normalized)) {
|
|
69
|
+
removed++;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
seen.add(normalized);
|
|
73
|
+
result.push(line);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return { lines: result, removed };
|
|
77
|
+
}
|
|
78
|
+
function fixVagueRules(content) {
|
|
79
|
+
let result = content;
|
|
80
|
+
let replacements = 0;
|
|
81
|
+
for (const { pattern, suggestion } of VAGUE_REPLACEMENTS) {
|
|
82
|
+
const before = result;
|
|
83
|
+
result = result.replace(pattern, suggestion);
|
|
84
|
+
if (result !== before)
|
|
85
|
+
replacements++;
|
|
86
|
+
}
|
|
87
|
+
return { content: result, replacements };
|
|
88
|
+
}
|
|
89
|
+
// Platform-specific hints for each expected section — replaces generic TODO comments.
|
|
90
|
+
const SECTION_HINTS = {
|
|
91
|
+
claude: {
|
|
92
|
+
commands: "```bash\n# [TODO: build command, e.g. npm run build]\n# [TODO: test command, e.g. npm test]\n# [TODO: lint command, e.g. npm run lint]\n```",
|
|
93
|
+
architecture: "<!-- Key directories, main modules, and design decisions -->",
|
|
94
|
+
rules: "<!-- Coding conventions and hard requirements for this project -->",
|
|
95
|
+
style: "<!-- Formatting, naming, and style guide references -->",
|
|
96
|
+
},
|
|
97
|
+
codex: {
|
|
98
|
+
conventions: "<!-- Naming rules, code style, and working agreements for this repo -->",
|
|
99
|
+
testing: "<!-- Test framework, coverage requirements, and how to run tests -->",
|
|
100
|
+
architecture: "<!-- Repository structure, key modules, and design decisions -->",
|
|
101
|
+
"pr-instructions": "<!-- PR title format, review process, and merge criteria -->",
|
|
102
|
+
},
|
|
103
|
+
cursor: {
|
|
104
|
+
rules: "<!-- Directives that apply to every file Cursor edits -->",
|
|
105
|
+
style: "<!-- Formatting, naming, and code style conventions -->",
|
|
106
|
+
context: "<!-- Background the model needs to understand this codebase -->",
|
|
107
|
+
},
|
|
108
|
+
cline: {
|
|
109
|
+
rules: "<!-- Each rule on its own bullet — be specific, not vague -->",
|
|
110
|
+
context: "<!-- Project background, stack, and key dependencies -->",
|
|
111
|
+
},
|
|
112
|
+
gemini: {
|
|
113
|
+
instructions: "<!-- Primary directives — Gemini reads these on every turn -->",
|
|
114
|
+
context: "<!-- Project overview; use @./context.md to split large sections -->",
|
|
115
|
+
constraints: "<!-- Hard boundaries: what Gemini must never do -->",
|
|
116
|
+
},
|
|
117
|
+
copilot: {
|
|
118
|
+
instructions: "<!-- Directives for GitHub Copilot — keep under 4,000 characters for code review -->",
|
|
119
|
+
style: "<!-- Formatting and naming conventions -->",
|
|
120
|
+
},
|
|
121
|
+
amp: {
|
|
122
|
+
conventions: "<!-- Coding standards; reference files with @./path/to/guide.md -->",
|
|
123
|
+
testing: "<!-- Test requirements and how to run the test suite -->",
|
|
124
|
+
},
|
|
125
|
+
opencode: {
|
|
126
|
+
rules: "<!-- Project rules — AGENTS.md at root; compose extras via opencode.json 'instructions' -->",
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
function addMissingSectionStubs(content, missingSections, platform) {
|
|
130
|
+
if (missingSections.length === 0)
|
|
131
|
+
return { content, added: [] };
|
|
132
|
+
const platformHints = SECTION_HINTS[platform] ?? {};
|
|
133
|
+
const stubs = [];
|
|
134
|
+
const added = [];
|
|
135
|
+
for (const section of missingSections) {
|
|
136
|
+
const capitalized = section.charAt(0).toUpperCase() + section.slice(1);
|
|
137
|
+
const hint = platformHints[section] ?? `<!-- TODO: Add ${section} guidance -->`;
|
|
138
|
+
stubs.push(`\n## ${capitalized}\n${hint}`);
|
|
139
|
+
added.push(section);
|
|
140
|
+
}
|
|
141
|
+
return { content: content + stubs.join("\n"), added };
|
|
142
|
+
}
|
|
143
|
+
// Converts non-heading, non-bullet prose lines to bullet list format.
|
|
144
|
+
// Used for Cline where docs explicitly recommend "bullet points make individual requirements clear".
|
|
145
|
+
function proseTooBullets(lines) {
|
|
146
|
+
let converted = 0;
|
|
147
|
+
let insideBlock = false;
|
|
148
|
+
const result = lines.map((line) => {
|
|
149
|
+
if (line.trimStart().startsWith("```")) {
|
|
150
|
+
insideBlock = !insideBlock;
|
|
151
|
+
return line;
|
|
152
|
+
}
|
|
153
|
+
if (insideBlock)
|
|
154
|
+
return line;
|
|
155
|
+
const trimmed = line.trim();
|
|
156
|
+
if (trimmed && !trimmed.startsWith("#") && !trimmed.startsWith("-") && !trimmed.startsWith("*") && !trimmed.startsWith(">") && !trimmed.startsWith("|")) {
|
|
157
|
+
converted++;
|
|
158
|
+
return `- ${trimmed}`;
|
|
159
|
+
}
|
|
160
|
+
return line;
|
|
161
|
+
});
|
|
162
|
+
return { lines: result, converted };
|
|
163
|
+
}
|
|
164
|
+
// Fixes @ import paths that are missing a required prefix.
|
|
165
|
+
// Gemini CLI and Amp both require ./ ../ / or ~/ — bare @word is not resolved.
|
|
166
|
+
function fixAtImportPaths(lines) {
|
|
167
|
+
let fixed = 0;
|
|
168
|
+
let insideBlock = false;
|
|
169
|
+
const BARE_AT = /@(?!\.\/|\.\.\/|\/|~\/)([^\s,*@]+)/g;
|
|
170
|
+
const result = lines.map((line) => {
|
|
171
|
+
if (line.trimStart().startsWith("```")) {
|
|
172
|
+
insideBlock = !insideBlock;
|
|
173
|
+
return line;
|
|
174
|
+
}
|
|
175
|
+
if (insideBlock)
|
|
176
|
+
return line;
|
|
177
|
+
const replaced = line.replace(BARE_AT, (_, path) => { fixed++; return `@./${path}`; });
|
|
178
|
+
return replaced;
|
|
179
|
+
});
|
|
180
|
+
return { lines: result, fixed };
|
|
181
|
+
}
|
|
182
|
+
function applyPlatformOptimizations(content, config, issues) {
|
|
183
|
+
const changes = [];
|
|
184
|
+
const hasCodes = (...codes) => codes.some((c) => issues.some((i) => i.code === c));
|
|
185
|
+
let lines = content.split("\n");
|
|
186
|
+
switch (config.platform) {
|
|
187
|
+
case "claude": {
|
|
188
|
+
// Add Commands section with runnable stub when no build/test commands are found
|
|
189
|
+
if (hasCodes("CLAUDE_MISSING_BUILD_COMMANDS")) {
|
|
190
|
+
const stub = [
|
|
191
|
+
"",
|
|
192
|
+
"## Commands",
|
|
193
|
+
"```bash",
|
|
194
|
+
"# [TODO: build command, e.g. npm run build]",
|
|
195
|
+
"# [TODO: test command, e.g. npm test]",
|
|
196
|
+
"# [TODO: lint command, e.g. npm run lint]",
|
|
197
|
+
"```",
|
|
198
|
+
"",
|
|
199
|
+
];
|
|
200
|
+
lines = [...lines, ...stub];
|
|
201
|
+
changes.push("Added Commands section stub — fill in build, test, and lint commands so Claude Code can run them without discovery overhead");
|
|
202
|
+
}
|
|
203
|
+
// Flag unfilled placeholders — cannot auto-fix without project-specific context
|
|
204
|
+
if (hasCodes("CLAUDE_PLACEHOLDER_FOUND")) {
|
|
205
|
+
const count = (content.match(/\[TODO:/g) ?? []).length;
|
|
206
|
+
changes.push(`Found ${count} unfilled [TODO:] placeholder(s) — fill these in before relying on this config`);
|
|
207
|
+
}
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
case "cursor": {
|
|
211
|
+
// Prepend frontmatter stub to .cursor/rules/ files that are missing it
|
|
212
|
+
if (hasCodes("CURSOR_MISSING_FRONTMATTER")) {
|
|
213
|
+
const stub = [
|
|
214
|
+
"---",
|
|
215
|
+
"description: [TODO: describe when this rule applies]",
|
|
216
|
+
"globs: []",
|
|
217
|
+
"alwaysApply: false",
|
|
218
|
+
"---",
|
|
219
|
+
"",
|
|
220
|
+
];
|
|
221
|
+
lines = [...stub, ...lines];
|
|
222
|
+
changes.push("Added Cursor rule frontmatter stub — set 'globs' or 'alwaysApply: true' to control scope");
|
|
223
|
+
}
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
case "cline": {
|
|
227
|
+
// Convert unstructured prose to bullet points
|
|
228
|
+
if (hasCodes("CLINE_UNSTRUCTURED_RULES")) {
|
|
229
|
+
const { lines: bulleted, converted } = proseTooBullets(lines);
|
|
230
|
+
if (converted > 0) {
|
|
231
|
+
lines = bulleted;
|
|
232
|
+
changes.push(`Converted ${converted} prose line(s) to bullet points (Cline: "bullet points make individual requirements clear")`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
case "gemini": {
|
|
238
|
+
// Fix invalid @ import paths (missing ./ prefix)
|
|
239
|
+
if (hasCodes("GEMINI_IMPORT_INVALID_PATH")) {
|
|
240
|
+
const { lines: fixed, fixed: count } = fixAtImportPaths(lines);
|
|
241
|
+
if (count > 0) {
|
|
242
|
+
lines = fixed;
|
|
243
|
+
changes.push(`Fixed ${count} @-import path(s) to use ./ prefix — required by Gemini CLI's import processor`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
case "amp": {
|
|
249
|
+
// Fix bare @path → @./path to prevent Amp's implicit **/ recursive prepend
|
|
250
|
+
if (hasCodes("AMP_IMPORT_IMPLICIT_RECURSIVE")) {
|
|
251
|
+
const { lines: fixed, fixed: count } = fixAtImportPaths(lines);
|
|
252
|
+
if (count > 0) {
|
|
253
|
+
lines = fixed;
|
|
254
|
+
changes.push(`Fixed ${count} @-mention path(s) to use ./ prefix — prevents Amp from prepending **/ and matching files across the entire project`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
case "copilot": {
|
|
260
|
+
// Add applyTo frontmatter stub to .github/instructions/ files missing it
|
|
261
|
+
if (hasCodes("COPILOT_INSTRUCTIONS_MISSING_APPLY_TO") && !content.trimStart().startsWith("---")) {
|
|
262
|
+
const stub = [
|
|
263
|
+
"---",
|
|
264
|
+
"applyTo: '[TODO: glob pattern, e.g. **/*.rb or src/**/*.ts]'",
|
|
265
|
+
"---",
|
|
266
|
+
"",
|
|
267
|
+
];
|
|
268
|
+
lines = [...stub, ...lines];
|
|
269
|
+
changes.push("Added applyTo frontmatter stub — specify a glob pattern to scope this instruction file to matching paths");
|
|
270
|
+
}
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return { content: lines.join("\n"), changes };
|
|
275
|
+
}
|
|
276
|
+
function moveCriticalRulesToTop(lines, issues) {
|
|
277
|
+
const hasAttentionIssue = issues.some((i) => i.code === "ATTENTION_PLACEMENT");
|
|
278
|
+
if (!hasAttentionIssue)
|
|
279
|
+
return { lines, moved: false };
|
|
280
|
+
const criticalKeywords = /\b(important|critical|never|always|must|required|forbidden|do not|don't)\b/i;
|
|
281
|
+
const firstHeading = lines.findIndex((l) => l.startsWith("#"));
|
|
282
|
+
if (firstHeading === -1)
|
|
283
|
+
return { lines, moved: false };
|
|
284
|
+
const criticalLines = [];
|
|
285
|
+
for (let i = firstHeading + 1; i < lines.length; i++) {
|
|
286
|
+
if (criticalKeywords.test(lines[i]) && !lines[i].startsWith("#")) {
|
|
287
|
+
criticalLines.push(i);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
if (criticalLines.length === 0)
|
|
291
|
+
return { lines, moved: false };
|
|
292
|
+
// Insert a "Critical Rules" section right after the first heading
|
|
293
|
+
const insertAt = firstHeading + 1;
|
|
294
|
+
const extracted = criticalLines.map((idx) => lines[idx]);
|
|
295
|
+
const remaining = lines.filter((_, i) => !criticalLines.includes(i));
|
|
296
|
+
const newLines = [
|
|
297
|
+
...remaining.slice(0, insertAt),
|
|
298
|
+
"",
|
|
299
|
+
"## Critical Rules",
|
|
300
|
+
...extracted,
|
|
301
|
+
"",
|
|
302
|
+
...remaining.slice(insertAt),
|
|
303
|
+
];
|
|
304
|
+
return { lines: newLines, moved: true };
|
|
305
|
+
}
|
|
306
|
+
export function optimize(config, analysis, scoreResult) {
|
|
307
|
+
const changes = [];
|
|
308
|
+
let content = config.content;
|
|
309
|
+
// Platform-specific structural fixes (frontmatter, import paths, prose format)
|
|
310
|
+
// Run first so subsequent passes work on already-corrected structure.
|
|
311
|
+
const { content: platformFixed, changes: platformChanges } = applyPlatformOptimizations(content, config, analysis.issues);
|
|
312
|
+
if (platformChanges.length > 0) {
|
|
313
|
+
content = platformFixed;
|
|
314
|
+
changes.push(...platformChanges);
|
|
315
|
+
}
|
|
316
|
+
// Fix vague rules
|
|
317
|
+
const { content: fixedVague, replacements } = fixVagueRules(content);
|
|
318
|
+
if (replacements > 0) {
|
|
319
|
+
content = fixedVague;
|
|
320
|
+
changes.push(`Replaced ${replacements} vague directive(s) with concrete alternatives`);
|
|
321
|
+
}
|
|
322
|
+
// Deduplicate lines
|
|
323
|
+
const { lines: dedupedLines, removed } = deduplicateLines(content.split("\n"));
|
|
324
|
+
if (removed > 0) {
|
|
325
|
+
content = dedupedLines.join("\n");
|
|
326
|
+
changes.push(`Removed ${removed} duplicate line(s)`);
|
|
327
|
+
}
|
|
328
|
+
// Move critical rules toward top
|
|
329
|
+
const { lines: reorderedLines, moved } = moveCriticalRulesToTop(content.split("\n"), analysis.issues);
|
|
330
|
+
if (moved) {
|
|
331
|
+
content = reorderedLines.join("\n");
|
|
332
|
+
changes.push("Moved critical rules (never/always/must) to the top of the file for better LLM attention");
|
|
333
|
+
}
|
|
334
|
+
// Add missing section stubs (platform-aware content hints)
|
|
335
|
+
const { content: withStubs, added } = addMissingSectionStubs(content, analysis.checks.missingSections.missing, config.platform);
|
|
336
|
+
if (added.length > 0) {
|
|
337
|
+
content = withStubs;
|
|
338
|
+
changes.push(`Added stub sections: ${added.join(", ")}`);
|
|
339
|
+
}
|
|
340
|
+
if (changes.length === 0) {
|
|
341
|
+
changes.push("No changes needed — config looks well-structured");
|
|
342
|
+
}
|
|
343
|
+
return { optimizedContent: content, changesSummary: changes };
|
|
344
|
+
}
|
|
345
|
+
//# sourceMappingURL=optimizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../src/optimizer.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type Platform = "claude" | "cursor" | "cline" | "codex" | "gemini" | "copilot" | "windsurf" | "amp" | "antigravity" | "opencode" | "kimi" | "warp" | "firebender" | "unknown";
|
|
2
|
+
export interface ParsedConfig {
|
|
3
|
+
platform: Platform;
|
|
4
|
+
filename: string;
|
|
5
|
+
content: string;
|
|
6
|
+
lines: string[];
|
|
7
|
+
sections: Section[];
|
|
8
|
+
wordCount: number;
|
|
9
|
+
charCount: number;
|
|
10
|
+
}
|
|
11
|
+
export interface Section {
|
|
12
|
+
heading: string;
|
|
13
|
+
level: number;
|
|
14
|
+
startLine: number;
|
|
15
|
+
endLine: number;
|
|
16
|
+
content: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function detectPlatform(filename: string): Platform;
|
|
19
|
+
export declare function parseConfig(filename: string, content: string): ParsedConfig;
|
|
20
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAChB,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,OAAO,GACP,QAAQ,GACR,SAAS,GACT,UAAU,GACV,KAAK,GACL,aAAa,GACb,UAAU,GACV,MAAM,GACN,MAAM,GACN,YAAY,GACZ,SAAS,CAAC;AAEd,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAyBD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CA+BzD;AA6CD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAc3E"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
const FILENAME_PLATFORM_MAP = {
|
|
2
|
+
"claude.md": "claude",
|
|
3
|
+
"claude.local.md": "claude",
|
|
4
|
+
".cursorrules": "cursor",
|
|
5
|
+
"cursor.md": "cursor",
|
|
6
|
+
".clinerules": "cline",
|
|
7
|
+
"cline.md": "cline",
|
|
8
|
+
"codex.md": "codex",
|
|
9
|
+
"agents.md": "codex",
|
|
10
|
+
"gemini.md": "gemini",
|
|
11
|
+
".gemini/GEMINI.md": "gemini",
|
|
12
|
+
"copilot-instructions.md": "copilot",
|
|
13
|
+
".windsurfrules": "windsurf",
|
|
14
|
+
"windsurf.md": "windsurf",
|
|
15
|
+
".amp/instructions.md": "amp",
|
|
16
|
+
".antigravity/instructions.md": "antigravity",
|
|
17
|
+
"opencode.md": "opencode",
|
|
18
|
+
"kimi.md": "kimi",
|
|
19
|
+
".warp/instructions.md": "warp",
|
|
20
|
+
"warp.md": "warp",
|
|
21
|
+
"firebender.xml": "firebender",
|
|
22
|
+
};
|
|
23
|
+
export function detectPlatform(filename) {
|
|
24
|
+
const normalized = filename.toLowerCase().replace(/\\/g, "/");
|
|
25
|
+
const basename = normalized.split("/").pop() ?? normalized;
|
|
26
|
+
// .cursor/rules/*.md files are Cursor rule files regardless of their basename
|
|
27
|
+
if (normalized.includes(".cursor/rules/"))
|
|
28
|
+
return "cursor";
|
|
29
|
+
// .clinerules/ directory files are Cline rule files regardless of their basename
|
|
30
|
+
if (normalized.includes(".clinerules/"))
|
|
31
|
+
return "cline";
|
|
32
|
+
// .github/instructions/*.instructions.md are path-specific Copilot instruction files
|
|
33
|
+
if (normalized.includes(".github/instructions/"))
|
|
34
|
+
return "copilot";
|
|
35
|
+
for (const [pattern, platform] of Object.entries(FILENAME_PLATFORM_MAP)) {
|
|
36
|
+
if (normalized.endsWith(pattern.toLowerCase()) || basename === pattern.toLowerCase()) {
|
|
37
|
+
return platform;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (basename.includes("claude"))
|
|
41
|
+
return "claude";
|
|
42
|
+
if (basename.includes("cursor"))
|
|
43
|
+
return "cursor";
|
|
44
|
+
if (basename.includes("cline"))
|
|
45
|
+
return "cline";
|
|
46
|
+
if (basename.includes("codex"))
|
|
47
|
+
return "codex";
|
|
48
|
+
if (basename.includes("gemini"))
|
|
49
|
+
return "gemini";
|
|
50
|
+
if (basename.includes("copilot"))
|
|
51
|
+
return "copilot";
|
|
52
|
+
if (basename.includes("windsurf"))
|
|
53
|
+
return "windsurf";
|
|
54
|
+
if (basename.includes("amp"))
|
|
55
|
+
return "amp";
|
|
56
|
+
if (basename.includes("kimi"))
|
|
57
|
+
return "kimi";
|
|
58
|
+
if (basename.includes("warp"))
|
|
59
|
+
return "warp";
|
|
60
|
+
return "unknown";
|
|
61
|
+
}
|
|
62
|
+
function extractSections(lines) {
|
|
63
|
+
const sections = [];
|
|
64
|
+
let currentSection = null;
|
|
65
|
+
const contentLines = [];
|
|
66
|
+
for (let i = 0; i < lines.length; i++) {
|
|
67
|
+
const line = lines[i];
|
|
68
|
+
const headingMatch = line.match(/^(#{1,6})\s+(.+)/);
|
|
69
|
+
if (headingMatch) {
|
|
70
|
+
if (currentSection?.heading !== undefined) {
|
|
71
|
+
sections.push({
|
|
72
|
+
heading: currentSection.heading,
|
|
73
|
+
level: currentSection.level,
|
|
74
|
+
startLine: currentSection.startLine,
|
|
75
|
+
endLine: i - 1,
|
|
76
|
+
content: contentLines.join("\n"),
|
|
77
|
+
});
|
|
78
|
+
contentLines.length = 0;
|
|
79
|
+
}
|
|
80
|
+
currentSection = {
|
|
81
|
+
heading: headingMatch[2].trim(),
|
|
82
|
+
level: headingMatch[1].length,
|
|
83
|
+
startLine: i,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
else if (currentSection) {
|
|
87
|
+
contentLines.push(line);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (currentSection?.heading !== undefined) {
|
|
91
|
+
sections.push({
|
|
92
|
+
heading: currentSection.heading,
|
|
93
|
+
level: currentSection.level,
|
|
94
|
+
startLine: currentSection.startLine,
|
|
95
|
+
endLine: lines.length - 1,
|
|
96
|
+
content: contentLines.join("\n"),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return sections;
|
|
100
|
+
}
|
|
101
|
+
export function parseConfig(filename, content) {
|
|
102
|
+
const lines = content.split("\n");
|
|
103
|
+
const sections = extractSections(lines);
|
|
104
|
+
const wordCount = content.split(/\s+/).filter(Boolean).length;
|
|
105
|
+
return {
|
|
106
|
+
platform: detectPlatform(filename),
|
|
107
|
+
filename,
|
|
108
|
+
content,
|
|
109
|
+
lines,
|
|
110
|
+
sections,
|
|
111
|
+
wordCount,
|
|
112
|
+
charCount: content.length,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAkCA,MAAM,qBAAqB,GAA6B;IACtD,WAAW,EAAE,QAAQ;IACrB,iBAAiB,EAAE,QAAQ;IAC3B,cAAc,EAAE,QAAQ;IACxB,WAAW,EAAE,QAAQ;IACrB,aAAa,EAAE,OAAO;IACtB,UAAU,EAAE,OAAO;IACnB,UAAU,EAAE,OAAO;IACnB,WAAW,EAAE,OAAO;IACpB,WAAW,EAAE,QAAQ;IACrB,mBAAmB,EAAE,QAAQ;IAC7B,yBAAyB,EAAE,SAAS;IACpC,gBAAgB,EAAE,UAAU;IAC5B,aAAa,EAAE,UAAU;IACzB,sBAAsB,EAAE,KAAK;IAC7B,8BAA8B,EAAE,aAAa;IAC7C,aAAa,EAAE,UAAU;IACzB,SAAS,EAAE,MAAM;IACjB,uBAAuB,EAAE,MAAM;IAC/B,SAAS,EAAE,MAAM;IACjB,gBAAgB,EAAE,YAAY;CAC/B,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC;IAE3D,8EAA8E;IAC9E,IAAI,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE3D,iFAAiF;IACjF,IAAI,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,OAAO,CAAC;IAExD,qFAAqF;IACrF,IAAI,UAAU,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAAE,OAAO,SAAS,CAAC;IAEnE,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,EAAE,CAAC;QACxE,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,QAAQ,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YACrF,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/C,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/C,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACrD,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAE7C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,KAAe;IACtC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,cAAc,GAA4B,IAAI,CAAC;IACnD,MAAM,YAAY,GAAa,EAAE,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAEpD,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,cAAc,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1C,QAAQ,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE,cAAc,CAAC,OAAO;oBAC/B,KAAK,EAAE,cAAc,CAAC,KAAM;oBAC5B,SAAS,EAAE,cAAc,CAAC,SAAU;oBACpC,OAAO,EAAE,CAAC,GAAG,CAAC;oBACd,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;iBACjC,CAAC,CAAC;gBACH,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1B,CAAC;YACD,cAAc,GAAG;gBACf,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBAC/B,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM;gBAC7B,SAAS,EAAE,CAAC;aACb,CAAC;QACJ,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAC1B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,cAAc,EAAE,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,KAAK,EAAE,cAAc,CAAC,KAAM;YAC5B,SAAS,EAAE,cAAc,CAAC,SAAU;YACpC,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC;YACzB,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;SACjC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAe;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAE9D,OAAO;QACL,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC;QAClC,QAAQ;QACR,OAAO;QACP,KAAK;QACL,QAAQ;QACR,SAAS;QACT,SAAS,EAAE,OAAO,CAAC,MAAM;KAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Platform } from "./parser.js";
|
|
2
|
+
export interface PlatformProfile {
|
|
3
|
+
displayName: string;
|
|
4
|
+
primaryModel: string;
|
|
5
|
+
contextWindowTokens: number;
|
|
6
|
+
costPerMillion: number;
|
|
7
|
+
subscriptionBased: boolean;
|
|
8
|
+
expectedSections: string[];
|
|
9
|
+
vaguenessSensitivity: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function getProfile(platform: Platform): PlatformProfile;
|
|
12
|
+
//# sourceMappingURL=platforms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platforms.d.ts","sourceRoot":"","sources":["../src/platforms.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAE5B,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAG3B,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AA8ID,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAE9D"}
|