@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,143 @@
|
|
|
1
|
+
const PROFILES = {
|
|
2
|
+
claude: {
|
|
3
|
+
displayName: "Claude Code",
|
|
4
|
+
primaryModel: "claude-sonnet-4-6",
|
|
5
|
+
contextWindowTokens: 200_000,
|
|
6
|
+
costPerMillion: 3.0,
|
|
7
|
+
subscriptionBased: false,
|
|
8
|
+
expectedSections: ["commands", "architecture", "rules", "style"],
|
|
9
|
+
vaguenessSensitivity: 1.0,
|
|
10
|
+
},
|
|
11
|
+
cursor: {
|
|
12
|
+
displayName: "Cursor",
|
|
13
|
+
primaryModel: "claude-sonnet / gpt-4o (auto)",
|
|
14
|
+
contextWindowTokens: 200_000,
|
|
15
|
+
costPerMillion: 1.25,
|
|
16
|
+
subscriptionBased: false,
|
|
17
|
+
// GPT-4.1 follows instructions more literally — vagueness has higher cost
|
|
18
|
+
expectedSections: ["rules", "style", "context"],
|
|
19
|
+
vaguenessSensitivity: 1.2,
|
|
20
|
+
},
|
|
21
|
+
cline: {
|
|
22
|
+
displayName: "Cline",
|
|
23
|
+
primaryModel: "configurable (Claude Sonnet default)",
|
|
24
|
+
contextWindowTokens: 200_000,
|
|
25
|
+
costPerMillion: 3.0,
|
|
26
|
+
subscriptionBased: false,
|
|
27
|
+
expectedSections: ["rules", "context", "style"],
|
|
28
|
+
vaguenessSensitivity: 1.0,
|
|
29
|
+
},
|
|
30
|
+
codex: {
|
|
31
|
+
displayName: "Codex (OpenAI)",
|
|
32
|
+
primaryModel: "codex-1 / gpt-4.1",
|
|
33
|
+
contextWindowTokens: 200_000,
|
|
34
|
+
costPerMillion: 0,
|
|
35
|
+
subscriptionBased: true,
|
|
36
|
+
// codex-1 / GPT-4.1 is the most literal instruction follower — highest sensitivity
|
|
37
|
+
expectedSections: ["conventions", "testing", "architecture", "pr-instructions"],
|
|
38
|
+
vaguenessSensitivity: 1.3,
|
|
39
|
+
},
|
|
40
|
+
gemini: {
|
|
41
|
+
displayName: "Gemini CLI",
|
|
42
|
+
primaryModel: "gemini-2.5-pro",
|
|
43
|
+
contextWindowTokens: 1_000_000,
|
|
44
|
+
costPerMillion: 1.25,
|
|
45
|
+
subscriptionBased: false,
|
|
46
|
+
// Gemini docs recommend context-first, query-last ordering
|
|
47
|
+
expectedSections: ["instructions", "context", "constraints"],
|
|
48
|
+
vaguenessSensitivity: 1.0,
|
|
49
|
+
},
|
|
50
|
+
copilot: {
|
|
51
|
+
displayName: "GitHub Copilot",
|
|
52
|
+
primaryModel: "gpt-4o",
|
|
53
|
+
contextWindowTokens: 192_000,
|
|
54
|
+
costPerMillion: 0,
|
|
55
|
+
subscriptionBased: true,
|
|
56
|
+
expectedSections: ["instructions", "style"],
|
|
57
|
+
vaguenessSensitivity: 1.2,
|
|
58
|
+
},
|
|
59
|
+
windsurf: {
|
|
60
|
+
displayName: "Windsurf",
|
|
61
|
+
primaryModel: "claude-sonnet",
|
|
62
|
+
contextWindowTokens: 1_000_000,
|
|
63
|
+
costPerMillion: 0,
|
|
64
|
+
subscriptionBased: true,
|
|
65
|
+
expectedSections: ["rules", "style"],
|
|
66
|
+
vaguenessSensitivity: 1.0,
|
|
67
|
+
},
|
|
68
|
+
amp: {
|
|
69
|
+
displayName: "Amp",
|
|
70
|
+
primaryModel: "claude-opus-4-7",
|
|
71
|
+
contextWindowTokens: 1_000_000,
|
|
72
|
+
costPerMillion: 5.0,
|
|
73
|
+
subscriptionBased: false,
|
|
74
|
+
// Source: ampcode.com/manual — recommended content: architecture, build/test, conventions, review procedures
|
|
75
|
+
expectedSections: ["conventions", "testing", "architecture"],
|
|
76
|
+
vaguenessSensitivity: 1.0,
|
|
77
|
+
},
|
|
78
|
+
opencode: {
|
|
79
|
+
displayName: "OpenCode",
|
|
80
|
+
primaryModel: "configurable",
|
|
81
|
+
contextWindowTokens: 131_072,
|
|
82
|
+
costPerMillion: 3.0,
|
|
83
|
+
subscriptionBased: false,
|
|
84
|
+
// Source: opencode.ai/docs/rules — recommended: build/lint/test commands, architecture, conventions
|
|
85
|
+
expectedSections: ["rules", "commands", "architecture"],
|
|
86
|
+
vaguenessSensitivity: 1.1,
|
|
87
|
+
},
|
|
88
|
+
warp: {
|
|
89
|
+
displayName: "Warp",
|
|
90
|
+
primaryModel: "configurable",
|
|
91
|
+
contextWindowTokens: 200_000,
|
|
92
|
+
costPerMillion: 0,
|
|
93
|
+
subscriptionBased: true,
|
|
94
|
+
expectedSections: ["rules"],
|
|
95
|
+
vaguenessSensitivity: 1.1,
|
|
96
|
+
},
|
|
97
|
+
kimi: {
|
|
98
|
+
displayName: "Kimi Code CLI",
|
|
99
|
+
primaryModel: "kimi-k2",
|
|
100
|
+
contextWindowTokens: 200_000,
|
|
101
|
+
costPerMillion: 0.5,
|
|
102
|
+
subscriptionBased: false,
|
|
103
|
+
expectedSections: ["rules"],
|
|
104
|
+
vaguenessSensitivity: 1.1,
|
|
105
|
+
},
|
|
106
|
+
antigravity: {
|
|
107
|
+
displayName: "Antigravity",
|
|
108
|
+
primaryModel: "gemini-based",
|
|
109
|
+
contextWindowTokens: 1_000_000,
|
|
110
|
+
costPerMillion: 0,
|
|
111
|
+
subscriptionBased: true,
|
|
112
|
+
expectedSections: ["rules"],
|
|
113
|
+
vaguenessSensitivity: 1.0,
|
|
114
|
+
},
|
|
115
|
+
firebender: {
|
|
116
|
+
displayName: "Firebender",
|
|
117
|
+
primaryModel: "unknown",
|
|
118
|
+
contextWindowTokens: 200_000,
|
|
119
|
+
costPerMillion: 0,
|
|
120
|
+
subscriptionBased: true,
|
|
121
|
+
expectedSections: ["rules"],
|
|
122
|
+
vaguenessSensitivity: 1.1,
|
|
123
|
+
},
|
|
124
|
+
// Fallback for any platform not explicitly profiled.
|
|
125
|
+
// Uses the most conservative values across known platforms:
|
|
126
|
+
// - vaguenessSensitivity: mirrors Codex (1.3) — highest known value, safest assumption
|
|
127
|
+
// - contextWindowTokens: 128k — smallest sensible modern window, strictest token-efficiency threshold
|
|
128
|
+
// - costPerMillion: Claude Sonnet rate ($3/M) — non-zero so cost warnings still surface
|
|
129
|
+
// - expectedSections: minimal ["rules"] — avoids false positives on unknown formats
|
|
130
|
+
unknown: {
|
|
131
|
+
displayName: "Unknown Platform",
|
|
132
|
+
primaryModel: "unknown",
|
|
133
|
+
contextWindowTokens: 128_000,
|
|
134
|
+
costPerMillion: 3.0,
|
|
135
|
+
subscriptionBased: false,
|
|
136
|
+
expectedSections: ["rules"],
|
|
137
|
+
vaguenessSensitivity: 1.3,
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
export function getProfile(platform) {
|
|
141
|
+
return PROFILES[platform];
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=platforms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platforms.js","sourceRoot":"","sources":["../src/platforms.ts"],"names":[],"mappings":"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"}
|
package/dist/scorer.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { AnalysisResult } from "./analyzer.js";
|
|
2
|
+
export interface CategoryScores {
|
|
3
|
+
clarity: number;
|
|
4
|
+
structure: number;
|
|
5
|
+
tokenEfficiency: number;
|
|
6
|
+
coverage: number;
|
|
7
|
+
}
|
|
8
|
+
export interface ScoreResult {
|
|
9
|
+
overall: number;
|
|
10
|
+
categories: CategoryScores;
|
|
11
|
+
grade: "A" | "B" | "C" | "D" | "F";
|
|
12
|
+
}
|
|
13
|
+
export declare function score(result: AnalysisResult): ScoreResult;
|
|
14
|
+
//# sourceMappingURL=scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.d.ts","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,cAAc,CAAC;IAC3B,KAAK,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CACpC;AAmHD,wBAAgB,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,WAAW,CAazD"}
|
package/dist/scorer.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { getProfile } from "./platforms.js";
|
|
2
|
+
// Each category is worth 25 points; penalties accumulate within each.
|
|
3
|
+
function clamp(value, min = 0, max = 100) {
|
|
4
|
+
return Math.max(min, Math.min(max, value));
|
|
5
|
+
}
|
|
6
|
+
// Penalty weights per category, calibrated against:
|
|
7
|
+
// - AMBIG-SWE (arXiv:2502.13069): informational gaps hurt most
|
|
8
|
+
// - Passive voice study (arXiv:2402.10800): passive voice less harmful than assumed
|
|
9
|
+
const CATEGORY_PENALTIES = {
|
|
10
|
+
"false-shared-context": 7, // model fills gaps with its own assumptions
|
|
11
|
+
"outcome-without-criterion": 6, // no success definition → unverifiable output
|
|
12
|
+
"unmeasurable-quality": 5, // subjective → inconsistent output
|
|
13
|
+
"passive-voice": 5, // harmful but less than assumed (arXiv:2402.10800)
|
|
14
|
+
"comparative-without-baseline": 4, // directional but no target
|
|
15
|
+
"vague-condition": 3, // trigger unclear; agent can partially recover
|
|
16
|
+
"weak-obligation": 2, // least harmful — model likely complies anyway
|
|
17
|
+
};
|
|
18
|
+
function scoreClarity(result) {
|
|
19
|
+
const { vaguenessSensitivity } = getProfile(result.platform);
|
|
20
|
+
let penalty = 0;
|
|
21
|
+
for (const { category } of result.checks.vagueRules.vagueLines) {
|
|
22
|
+
penalty += (CATEGORY_PENALTIES[category] ?? 5) * vaguenessSensitivity;
|
|
23
|
+
}
|
|
24
|
+
return clamp(25 - Math.min(Math.round(penalty), 25));
|
|
25
|
+
}
|
|
26
|
+
function scoreStructure(result) {
|
|
27
|
+
const { hasHeadings, headingCount, longParagraphLines, unorganizedRuleCount } = result.checks.structure;
|
|
28
|
+
let score = 25;
|
|
29
|
+
if (!hasHeadings)
|
|
30
|
+
score -= 15;
|
|
31
|
+
else if (headingCount < 2)
|
|
32
|
+
score -= 5;
|
|
33
|
+
score -= Math.min(10, longParagraphLines.length * 2);
|
|
34
|
+
score -= Math.min(5, Math.floor(unorganizedRuleCount / 2));
|
|
35
|
+
// Platform-specific format compliance penalties
|
|
36
|
+
for (const issue of result.checks.formatCompliance.issues) {
|
|
37
|
+
if (issue.severity === "critical")
|
|
38
|
+
score -= 10;
|
|
39
|
+
else if (issue.severity === "warning")
|
|
40
|
+
score -= 5;
|
|
41
|
+
else
|
|
42
|
+
score -= 2;
|
|
43
|
+
}
|
|
44
|
+
return clamp(score);
|
|
45
|
+
}
|
|
46
|
+
function scoreTokenEfficiency(result) {
|
|
47
|
+
const { tokenCount } = result.checks.tokenCost;
|
|
48
|
+
const { duplicatePhrases } = result.checks.duplicates;
|
|
49
|
+
const { contextWindowTokens } = getProfile(result.platform);
|
|
50
|
+
let score = 25;
|
|
51
|
+
// DETAIL (arXiv:2512.02246): specific prompts avg 124 tokens, vague ones avg 57.
|
|
52
|
+
// "Too long" thresholds scale proportionally with the platform's context window.
|
|
53
|
+
const scaleFactor = Math.min(contextWindowTokens / 200_000, 5);
|
|
54
|
+
const thresholdModerate = Math.round(1_000 * scaleFactor);
|
|
55
|
+
const thresholdHeavy = Math.round(2_000 * scaleFactor);
|
|
56
|
+
const thresholdBloated = Math.round(4_000 * scaleFactor);
|
|
57
|
+
// Short-file penalties are independent of window size — a 50-token config is useless everywhere.
|
|
58
|
+
if (tokenCount < 50)
|
|
59
|
+
score -= 10;
|
|
60
|
+
else if (tokenCount < 150)
|
|
61
|
+
score -= 3;
|
|
62
|
+
else if (tokenCount > thresholdBloated)
|
|
63
|
+
score -= 15;
|
|
64
|
+
else if (tokenCount > thresholdHeavy)
|
|
65
|
+
score -= 7;
|
|
66
|
+
else if (tokenCount > thresholdModerate)
|
|
67
|
+
score -= 3;
|
|
68
|
+
score -= Math.min(10, duplicatePhrases.length * 3);
|
|
69
|
+
// Codex enforces a hard 32 KiB (≈8,192 token) truncation limit — content beyond it is silently
|
|
70
|
+
// dropped. This is qualitatively different from soft verbosity: the agent never sees the rules.
|
|
71
|
+
// Penalize separately from the generic window scaling above.
|
|
72
|
+
if (result.platform === "codex") {
|
|
73
|
+
const CODEX_HARD_LIMIT_TOKENS = 8_192; // 32,768 bytes / 4 chars per token
|
|
74
|
+
if (tokenCount > CODEX_HARD_LIMIT_TOKENS)
|
|
75
|
+
score -= 10;
|
|
76
|
+
else if (tokenCount > CODEX_HARD_LIMIT_TOKENS * 0.8)
|
|
77
|
+
score -= 5;
|
|
78
|
+
}
|
|
79
|
+
return clamp(score);
|
|
80
|
+
}
|
|
81
|
+
function scoreCoverage(result) {
|
|
82
|
+
const { missing, present } = result.checks.missingSections;
|
|
83
|
+
const total = missing.length + present.length;
|
|
84
|
+
if (total === 0)
|
|
85
|
+
return 25;
|
|
86
|
+
const coveredRatio = present.length / total;
|
|
87
|
+
let score = Math.round(25 * coveredRatio);
|
|
88
|
+
// Bonus for having critical content placed well
|
|
89
|
+
const { criticalInHead, criticalInTail } = result.checks.attentionPlacement;
|
|
90
|
+
if (criticalInHead || criticalInTail)
|
|
91
|
+
score = Math.min(25, score + 3);
|
|
92
|
+
// Claude Code: runnable commands are the highest-value content in CLAUDE.md — without them
|
|
93
|
+
// Claude must spend tokens discovering build/test/lint commands on every session.
|
|
94
|
+
if (result.platform === "claude") {
|
|
95
|
+
const missingBuildCommands = result.checks.formatCompliance.issues.some((i) => i.code === "CLAUDE_MISSING_BUILD_COMMANDS");
|
|
96
|
+
if (missingBuildCommands)
|
|
97
|
+
score -= 5;
|
|
98
|
+
}
|
|
99
|
+
return clamp(score);
|
|
100
|
+
}
|
|
101
|
+
function toGrade(overall) {
|
|
102
|
+
if (overall >= 90)
|
|
103
|
+
return "A";
|
|
104
|
+
if (overall >= 75)
|
|
105
|
+
return "B";
|
|
106
|
+
if (overall >= 60)
|
|
107
|
+
return "C";
|
|
108
|
+
if (overall >= 40)
|
|
109
|
+
return "D";
|
|
110
|
+
return "F";
|
|
111
|
+
}
|
|
112
|
+
export function score(result) {
|
|
113
|
+
const clarity = scoreClarity(result);
|
|
114
|
+
const structure = scoreStructure(result);
|
|
115
|
+
const tokenEfficiency = scoreTokenEfficiency(result);
|
|
116
|
+
const coverage = scoreCoverage(result);
|
|
117
|
+
const overall = clamp(clarity + structure + tokenEfficiency + coverage);
|
|
118
|
+
return {
|
|
119
|
+
overall,
|
|
120
|
+
categories: { clarity, structure, tokenEfficiency, coverage },
|
|
121
|
+
grade: toGrade(overall),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorer.js","sourceRoot":"","sources":["../src/scorer.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@serdaraytac/agentsitter",
|
|
3
|
+
"version": "1.0.4",
|
|
4
|
+
"description": "Analyze, score, and optimize AI coding agent config files",
|
|
5
|
+
"main": "dist/mcp-server.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"agentsitter": "dist/mcp-server.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"prepare": "npm run build",
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"build:web": "esbuild src/browser.ts --bundle --platform=browser --format=iife --global-name=ConfigMode --outfile=web/bundle.js --minify",
|
|
13
|
+
"dev": "tsx src/mcp-server.ts",
|
|
14
|
+
"test": "vitest run",
|
|
15
|
+
"test:watch": "vitest"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"mcp",
|
|
19
|
+
"claude",
|
|
20
|
+
"cursor",
|
|
21
|
+
"ai-agent",
|
|
22
|
+
"config",
|
|
23
|
+
"analyzer",
|
|
24
|
+
"llm",
|
|
25
|
+
"coding-agent"
|
|
26
|
+
],
|
|
27
|
+
"author": "serdaraytac",
|
|
28
|
+
"license": "Elastic-2.0",
|
|
29
|
+
"type": "module",
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"LICENSE",
|
|
33
|
+
"README.md"
|
|
34
|
+
],
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/serdaraytac/agentsitter.git"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://github.com/serdaraytac/agentsitter#readme",
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/serdaraytac/agentsitter/issues"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=22"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"@modelcontextprotocol/sdk": "^1.29.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^25.7.0",
|
|
51
|
+
"esbuild": "^0.25.12",
|
|
52
|
+
"tsx": "^4.21.0",
|
|
53
|
+
"typescript": "^6.0.3",
|
|
54
|
+
"vitest": "^4.1.6"
|
|
55
|
+
}
|
|
56
|
+
}
|