@promptci/core 0.0.1
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 +201 -0
- package/README.md +30 -0
- package/dist/agent-practices.d.ts +22 -0
- package/dist/agent-practices.d.ts.map +1 -0
- package/dist/agent-practices.js +582 -0
- package/dist/agent-practices.js.map +1 -0
- package/dist/baseline.d.ts +40 -0
- package/dist/baseline.d.ts.map +1 -0
- package/dist/baseline.js +172 -0
- package/dist/baseline.js.map +1 -0
- package/dist/canonical-owner.d.ts +3 -0
- package/dist/canonical-owner.d.ts.map +1 -0
- package/dist/canonical-owner.js +131 -0
- package/dist/canonical-owner.js.map +1 -0
- package/dist/cheap-model-routing.d.ts +4 -0
- package/dist/cheap-model-routing.d.ts.map +1 -0
- package/dist/cheap-model-routing.js +43 -0
- package/dist/cheap-model-routing.js.map +1 -0
- package/dist/ci-alignment.d.ts +10 -0
- package/dist/ci-alignment.d.ts.map +1 -0
- package/dist/ci-alignment.js +343 -0
- package/dist/ci-alignment.js.map +1 -0
- package/dist/cli-output-filter.d.ts +16 -0
- package/dist/cli-output-filter.d.ts.map +1 -0
- package/dist/cli-output-filter.js +88 -0
- package/dist/cli-output-filter.js.map +1 -0
- package/dist/command-validity.d.ts +12 -0
- package/dist/command-validity.d.ts.map +1 -0
- package/dist/command-validity.js +543 -0
- package/dist/command-validity.js.map +1 -0
- package/dist/conflicts.d.ts +49 -0
- package/dist/conflicts.d.ts.map +1 -0
- package/dist/conflicts.js +1065 -0
- package/dist/conflicts.js.map +1 -0
- package/dist/context-analysis.d.ts +15 -0
- package/dist/context-analysis.d.ts.map +1 -0
- package/dist/context-analysis.js +24 -0
- package/dist/context-analysis.js.map +1 -0
- package/dist/context-bloat.d.ts +17 -0
- package/dist/context-bloat.d.ts.map +1 -0
- package/dist/context-bloat.js +148 -0
- package/dist/context-bloat.js.map +1 -0
- package/dist/context-cost.d.ts +4 -0
- package/dist/context-cost.d.ts.map +1 -0
- package/dist/context-cost.js +70 -0
- package/dist/context-cost.js.map +1 -0
- package/dist/context-optimizer.d.ts +14 -0
- package/dist/context-optimizer.d.ts.map +1 -0
- package/dist/context-optimizer.js +219 -0
- package/dist/context-optimizer.js.map +1 -0
- package/dist/context-recommender.d.ts +3 -0
- package/dist/context-recommender.d.ts.map +1 -0
- package/dist/context-recommender.js +329 -0
- package/dist/context-recommender.js.map +1 -0
- package/dist/dead-references.d.ts +33 -0
- package/dist/dead-references.d.ts.map +1 -0
- package/dist/dead-references.js +607 -0
- package/dist/dead-references.js.map +1 -0
- package/dist/detectors.d.ts +11 -0
- package/dist/detectors.d.ts.map +1 -0
- package/dist/detectors.js +160 -0
- package/dist/detectors.js.map +1 -0
- package/dist/duplicates.d.ts +36 -0
- package/dist/duplicates.d.ts.map +1 -0
- package/dist/duplicates.js +436 -0
- package/dist/duplicates.js.map +1 -0
- package/dist/fix-engine.d.ts +16 -0
- package/dist/fix-engine.d.ts.map +1 -0
- package/dist/fix-engine.js +179 -0
- package/dist/fix-engine.js.map +1 -0
- package/dist/framework-packs.d.ts +8 -0
- package/dist/framework-packs.d.ts.map +1 -0
- package/dist/framework-packs.js +22 -0
- package/dist/framework-packs.js.map +1 -0
- package/dist/frameworks/dotnet.d.ts +4 -0
- package/dist/frameworks/dotnet.d.ts.map +1 -0
- package/dist/frameworks/dotnet.js +77 -0
- package/dist/frameworks/dotnet.js.map +1 -0
- package/dist/frameworks/go.d.ts +4 -0
- package/dist/frameworks/go.d.ts.map +1 -0
- package/dist/frameworks/go.js +39 -0
- package/dist/frameworks/go.js.map +1 -0
- package/dist/frameworks/nextjs.d.ts +4 -0
- package/dist/frameworks/nextjs.d.ts.map +1 -0
- package/dist/frameworks/nextjs.js +66 -0
- package/dist/frameworks/nextjs.js.map +1 -0
- package/dist/frameworks/python.d.ts +4 -0
- package/dist/frameworks/python.d.ts.map +1 -0
- package/dist/frameworks/python.js +66 -0
- package/dist/frameworks/python.js.map +1 -0
- package/dist/frameworks/rust.d.ts +4 -0
- package/dist/frameworks/rust.d.ts.map +1 -0
- package/dist/frameworks/rust.js +72 -0
- package/dist/frameworks/rust.js.map +1 -0
- package/dist/frameworks/unity.d.ts +4 -0
- package/dist/frameworks/unity.d.ts.map +1 -0
- package/dist/frameworks/unity.js +74 -0
- package/dist/frameworks/unity.js.map +1 -0
- package/dist/health-score.d.ts +37 -0
- package/dist/health-score.d.ts.map +1 -0
- package/dist/health-score.js +164 -0
- package/dist/health-score.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/llm.d.ts +6 -0
- package/dist/llm.d.ts.map +1 -0
- package/dist/llm.js +67 -0
- package/dist/llm.js.map +1 -0
- package/dist/manifest-consistency.d.ts +37 -0
- package/dist/manifest-consistency.d.ts.map +1 -0
- package/dist/manifest-consistency.js +659 -0
- package/dist/manifest-consistency.js.map +1 -0
- package/dist/mcp-detector.d.ts +4 -0
- package/dist/mcp-detector.d.ts.map +1 -0
- package/dist/mcp-detector.js +131 -0
- package/dist/mcp-detector.js.map +1 -0
- package/dist/missing-context.d.ts +15 -0
- package/dist/missing-context.d.ts.map +1 -0
- package/dist/missing-context.js +517 -0
- package/dist/missing-context.js.map +1 -0
- package/dist/native-tool-preference.d.ts +20 -0
- package/dist/native-tool-preference.d.ts.map +1 -0
- package/dist/native-tool-preference.js +94 -0
- package/dist/native-tool-preference.js.map +1 -0
- package/dist/output-verbosity.d.ts +3 -0
- package/dist/output-verbosity.d.ts.map +1 -0
- package/dist/output-verbosity.js +83 -0
- package/dist/output-verbosity.js.map +1 -0
- package/dist/product-boundary.d.ts +11 -0
- package/dist/product-boundary.d.ts.map +1 -0
- package/dist/product-boundary.js +301 -0
- package/dist/product-boundary.js.map +1 -0
- package/dist/project-type.d.ts +15 -0
- package/dist/project-type.d.ts.map +1 -0
- package/dist/project-type.js +116 -0
- package/dist/project-type.js.map +1 -0
- package/dist/prompt-cache.d.ts +3 -0
- package/dist/prompt-cache.d.ts.map +1 -0
- package/dist/prompt-cache.js +151 -0
- package/dist/prompt-cache.js.map +1 -0
- package/dist/repo-context.d.ts +37 -0
- package/dist/repo-context.d.ts.map +1 -0
- package/dist/repo-context.js +221 -0
- package/dist/repo-context.js.map +1 -0
- package/dist/report.d.ts +87 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +558 -0
- package/dist/report.js.map +1 -0
- package/dist/scan.d.ts +7 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +43 -0
- package/dist/scan.js.map +1 -0
- package/dist/scanner.d.ts +3 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +216 -0
- package/dist/scanner.js.map +1 -0
- package/dist/security-pack.d.ts +4 -0
- package/dist/security-pack.d.ts.map +1 -0
- package/dist/security-pack.js +403 -0
- package/dist/security-pack.js.map +1 -0
- package/dist/stale-instructions.d.ts +20 -0
- package/dist/stale-instructions.d.ts.map +1 -0
- package/dist/stale-instructions.js +269 -0
- package/dist/stale-instructions.js.map +1 -0
- package/dist/suppression.d.ts +64 -0
- package/dist/suppression.d.ts.map +1 -0
- package/dist/suppression.js +338 -0
- package/dist/suppression.js.map +1 -0
- package/dist/types.d.ts +128 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/vague-guidance.d.ts +12 -0
- package/dist/vague-guidance.d.ts.map +1 -0
- package/dist/vague-guidance.js +235 -0
- package/dist/vague-guidance.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplicates.js","sourceRoot":"","sources":["../src/duplicates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PromptCiIssue } from './types.js';
|
|
2
|
+
export interface FileChange {
|
|
3
|
+
filePath: string;
|
|
4
|
+
originalContent: string;
|
|
5
|
+
newContent: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Validates and resolves a path relative to the repo root to prevent path traversal.
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveSafePath(repoRoot: string, relativeOrAbsolutePath: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Computes the proposed file changes to fix a given PromptCiIssue.
|
|
13
|
+
* Returns an array of FileChanges that would be applied.
|
|
14
|
+
*/
|
|
15
|
+
export declare function applyFixRecipe(issue: PromptCiIssue, repoRoot: string): Promise<FileChange[]>;
|
|
16
|
+
//# sourceMappingURL=fix-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-engine.d.ts","sourceRoot":"","sources":["../src/fix-engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,GAAG,MAAM,CAUxF;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,EAAE,CAAC,CAsLvB"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
/**
|
|
4
|
+
* Validates and resolves a path relative to the repo root to prevent path traversal.
|
|
5
|
+
*/
|
|
6
|
+
export function resolveSafePath(repoRoot, relativeOrAbsolutePath) {
|
|
7
|
+
const resolvedRoot = path.resolve(repoRoot);
|
|
8
|
+
const resolvedPath = path.isAbsolute(relativeOrAbsolutePath)
|
|
9
|
+
? path.resolve(relativeOrAbsolutePath)
|
|
10
|
+
: path.resolve(resolvedRoot, relativeOrAbsolutePath);
|
|
11
|
+
if (!resolvedPath.startsWith(resolvedRoot)) {
|
|
12
|
+
throw new Error(`Path traversal detected: "${relativeOrAbsolutePath}" is outside repo root "${resolvedRoot}"`);
|
|
13
|
+
}
|
|
14
|
+
return resolvedPath;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Computes the proposed file changes to fix a given PromptCiIssue.
|
|
18
|
+
* Returns an array of FileChanges that would be applied.
|
|
19
|
+
*/
|
|
20
|
+
export async function applyFixRecipe(issue, repoRoot) {
|
|
21
|
+
const changes = [];
|
|
22
|
+
// 1. Missing .promptci/ in .gitignore
|
|
23
|
+
if (issue.id === 'security-pack-no-promptci-gitignore') {
|
|
24
|
+
const gitignorePath = resolveSafePath(repoRoot, '.gitignore');
|
|
25
|
+
let content = '';
|
|
26
|
+
try {
|
|
27
|
+
content = await fs.readFile(gitignorePath, 'utf-8');
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// file doesn't exist, which is fine
|
|
31
|
+
}
|
|
32
|
+
if (!content.includes('.promptci/')) {
|
|
33
|
+
const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
|
|
34
|
+
const suffix = content.endsWith('\n') || content.endsWith('\r')
|
|
35
|
+
? `.promptci/${lineEnding}`
|
|
36
|
+
: `${lineEnding}.promptci/${lineEnding}`;
|
|
37
|
+
changes.push({
|
|
38
|
+
filePath: gitignorePath,
|
|
39
|
+
originalContent: content,
|
|
40
|
+
newContent: content + suffix,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
return changes;
|
|
44
|
+
}
|
|
45
|
+
// 2. Unignored directories in .gitignore
|
|
46
|
+
if (issue.id === 'security-pack-unignored-dirs') {
|
|
47
|
+
const gitignorePath = resolveSafePath(repoRoot, '.gitignore');
|
|
48
|
+
let content = '';
|
|
49
|
+
try {
|
|
50
|
+
content = await fs.readFile(gitignorePath, 'utf-8');
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// file doesn't exist
|
|
54
|
+
}
|
|
55
|
+
let newLines = '';
|
|
56
|
+
const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
|
|
57
|
+
for (const ev of issue.evidence) {
|
|
58
|
+
const m = /Directory "([^"]+)" exists/.exec(ev);
|
|
59
|
+
if (m && m[1]) {
|
|
60
|
+
const dirName = m[1];
|
|
61
|
+
if (!content.includes(`${dirName}/`)) {
|
|
62
|
+
newLines += `${dirName}/${lineEnding}`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (newLines) {
|
|
67
|
+
const suffix = content.endsWith('\n') || content.endsWith('\r')
|
|
68
|
+
? newLines
|
|
69
|
+
: `${lineEnding}${newLines}`;
|
|
70
|
+
changes.push({
|
|
71
|
+
filePath: gitignorePath,
|
|
72
|
+
originalContent: content,
|
|
73
|
+
newContent: content + suffix,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return changes;
|
|
77
|
+
}
|
|
78
|
+
// 3. Outdated Stale Year Replacement (2019-2023 -> 2026)
|
|
79
|
+
if (issue.id.startsWith('stale-') && issue.category === 'stale_instruction') {
|
|
80
|
+
const STALE_YEAR_RE = /(?<![/-])\b(2019|2020|2021|2022|2023)\b(?![/-])/g;
|
|
81
|
+
// Check if this issue is specifically about stale years
|
|
82
|
+
const hasYearEvidence = issue.evidence.some(ev => ev.includes('Year reference(s) that may be outdated'));
|
|
83
|
+
if (hasYearEvidence && issue.locations.length > 0) {
|
|
84
|
+
const loc = issue.locations[0];
|
|
85
|
+
const filePath = resolveSafePath(repoRoot, loc.filePath);
|
|
86
|
+
let content = '';
|
|
87
|
+
try {
|
|
88
|
+
content = await fs.readFile(filePath, 'utf-8');
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
const lines = content.split(/\r?\n/);
|
|
94
|
+
const hasCRLF = content.includes('\r\n');
|
|
95
|
+
const lineEnding = hasCRLF ? '\r\n' : '\n';
|
|
96
|
+
const startIdx = (loc.startLine ?? 1) - 1;
|
|
97
|
+
const endIdx = (loc.endLine ?? lines.length) - 1;
|
|
98
|
+
let modified = false;
|
|
99
|
+
for (let i = startIdx; i <= endIdx; i++) {
|
|
100
|
+
if (i >= 0 && i < lines.length) {
|
|
101
|
+
const original = lines[i];
|
|
102
|
+
const updated = original.replace(STALE_YEAR_RE, '2026');
|
|
103
|
+
if (updated !== original) {
|
|
104
|
+
lines[i] = updated;
|
|
105
|
+
modified = true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (modified) {
|
|
110
|
+
changes.push({
|
|
111
|
+
filePath,
|
|
112
|
+
originalContent: content,
|
|
113
|
+
newContent: lines.join(lineEnding),
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return changes;
|
|
118
|
+
}
|
|
119
|
+
// 4. Duplicate Markdown Section Consolidation
|
|
120
|
+
if (issue.category === 'duplicate' && issue.locations.length >= 2) {
|
|
121
|
+
// 4a. Identify canonical path: AGENTS.md preferred, otherwise the first in location list
|
|
122
|
+
let canonicalLoc = issue.locations.find(loc => path.basename(loc.filePath).toLowerCase() === 'agents.md');
|
|
123
|
+
if (!canonicalLoc) {
|
|
124
|
+
canonicalLoc = issue.locations[0];
|
|
125
|
+
}
|
|
126
|
+
const canonicalPath = resolveSafePath(repoRoot, canonicalLoc.filePath);
|
|
127
|
+
const canonicalBase = path.basename(canonicalPath);
|
|
128
|
+
// 4b. In all other files containing duplicates, replace the section body with a pointer link
|
|
129
|
+
for (const loc of issue.locations) {
|
|
130
|
+
const filePath = resolveSafePath(repoRoot, loc.filePath);
|
|
131
|
+
if (filePath === canonicalPath)
|
|
132
|
+
continue; // skip canonical file
|
|
133
|
+
let content = '';
|
|
134
|
+
try {
|
|
135
|
+
content = await fs.readFile(filePath, 'utf-8');
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const lines = content.split(/\r?\n/);
|
|
141
|
+
const hasCRLF = content.includes('\r\n');
|
|
142
|
+
const lineEnding = hasCRLF ? '\r\n' : '\n';
|
|
143
|
+
const startIdx = (loc.startLine ?? 1) - 1;
|
|
144
|
+
const endIdx = (loc.endLine ?? lines.length) - 1;
|
|
145
|
+
// Find relative path from current file to canonical file for clean Markdown links
|
|
146
|
+
const relPath = path.relative(path.dirname(filePath), canonicalPath).replace(/\\/g, '/');
|
|
147
|
+
const linkTarget = relPath.startsWith('.') ? relPath : `./${relPath}`;
|
|
148
|
+
// Extract the section lines
|
|
149
|
+
const sectionLines = lines.slice(startIdx, endIdx + 1);
|
|
150
|
+
let headingLine = '';
|
|
151
|
+
let replaceStartIdx = startIdx;
|
|
152
|
+
// Check if the section starts with a heading line (e.g. "## Deployment")
|
|
153
|
+
// If so, we preserve the heading and replace only the body below it.
|
|
154
|
+
if (sectionLines.length > 0 && sectionLines[0].trim().startsWith('#')) {
|
|
155
|
+
headingLine = sectionLines[0];
|
|
156
|
+
replaceStartIdx = startIdx + 1;
|
|
157
|
+
}
|
|
158
|
+
const pointerText = `See canonical instructions in [${canonicalBase}](${linkTarget}) for details.`;
|
|
159
|
+
// Construct the new lines
|
|
160
|
+
const prefixLines = lines.slice(0, replaceStartIdx);
|
|
161
|
+
const suffixLines = lines.slice(endIdx + 1);
|
|
162
|
+
let newSectionContent;
|
|
163
|
+
if (headingLine) {
|
|
164
|
+
newSectionContent = [pointerText];
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
newSectionContent = [pointerText];
|
|
168
|
+
}
|
|
169
|
+
const finalLines = [...prefixLines, ...newSectionContent, ...suffixLines];
|
|
170
|
+
changes.push({
|
|
171
|
+
filePath,
|
|
172
|
+
originalContent: content,
|
|
173
|
+
newContent: finalLines.join(lineEnding),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return changes;
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=fix-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix-engine.js","sourceRoot":"","sources":["../src/fix-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RepoContext } from './repo-context.js';
|
|
2
|
+
import type { PromptCiIssue } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Framework-specific detectors are aggregated here.
|
|
5
|
+
* This allows for easy extension to new frameworks like Unity, .NET, Go, etc.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runFrameworkPacks(context: RepoContext): PromptCiIssue[];
|
|
8
|
+
//# sourceMappingURL=framework-packs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-packs.d.ts","sourceRoot":"","sources":["../src/framework-packs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAQhD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CAYvE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { detectNextJs } from './frameworks/nextjs.js';
|
|
2
|
+
import { detectPython } from './frameworks/python.js';
|
|
3
|
+
import { detectUnity } from './frameworks/unity.js';
|
|
4
|
+
import { detectDotnet } from './frameworks/dotnet.js';
|
|
5
|
+
import { detectGo } from './frameworks/go.js';
|
|
6
|
+
import { detectRust } from './frameworks/rust.js';
|
|
7
|
+
/**
|
|
8
|
+
* Framework-specific detectors are aggregated here.
|
|
9
|
+
* This allows for easy extension to new frameworks like Unity, .NET, Go, etc.
|
|
10
|
+
*/
|
|
11
|
+
export function runFrameworkPacks(context) {
|
|
12
|
+
const issues = [];
|
|
13
|
+
// Run all registered framework detectors
|
|
14
|
+
issues.push(...detectNextJs(context));
|
|
15
|
+
issues.push(...detectPython(context));
|
|
16
|
+
issues.push(...detectUnity(context));
|
|
17
|
+
issues.push(...detectDotnet(context));
|
|
18
|
+
issues.push(...detectGo(context));
|
|
19
|
+
issues.push(...detectRust(context));
|
|
20
|
+
return issues;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=framework-packs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework-packs.js","sourceRoot":"","sources":["../src/framework-packs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAoB;IACpD,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,yCAAyC;IACzC,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAEpC,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dotnet.d.ts","sourceRoot":"","sources":["../../src/frameworks/dotnet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CA+ElE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
export function detectDotnet(context) {
|
|
4
|
+
const issues = [];
|
|
5
|
+
const { repoRoot, files } = context;
|
|
6
|
+
// Detect if dotnet project
|
|
7
|
+
let hasDotnet = context.projectType === 'dotnet';
|
|
8
|
+
if (!hasDotnet) {
|
|
9
|
+
try {
|
|
10
|
+
hasDotnet = fs.readdirSync(repoRoot).some(f => f.endsWith('.sln') || f.endsWith('.csproj'));
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// ignore
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const combinedContent = files.map(f => f.content).join('\n');
|
|
17
|
+
const hasDotnetMentions = /\bdotnet\b|\.sln\b|\.csproj\b|\bxunit\b|\bnunit\b|\bmstest\b/i.test(combinedContent);
|
|
18
|
+
if (!hasDotnet && !hasDotnetMentions) {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
const allFilePaths = files.map(f => f.path);
|
|
22
|
+
// 1. Missing dotnet build/test validation commands
|
|
23
|
+
const hasDotnetCommands = /dotnet\s+(build|test|restore|run)/i.test(combinedContent);
|
|
24
|
+
if (!hasDotnetCommands) {
|
|
25
|
+
issues.push({
|
|
26
|
+
id: 'dotnet-missing-validation-commands',
|
|
27
|
+
severity: 'warning',
|
|
28
|
+
category: 'structure',
|
|
29
|
+
title: 'Missing .NET Validation Commands',
|
|
30
|
+
summary: 'The project uses .NET, but instructions do not mention dotnet validation commands like "dotnet build" or "dotnet test".',
|
|
31
|
+
filePaths: allFilePaths,
|
|
32
|
+
locations: [],
|
|
33
|
+
evidence: ['.NET detected, but no dotnet build/test commands found in instructions.'],
|
|
34
|
+
recommendation: 'Add instructions telling the agent to run "dotnet build" and "dotnet test" to verify changes.',
|
|
35
|
+
fixRecipe: 'Before saying work is complete, run dotnet build && dotnet test to verify changes.',
|
|
36
|
+
confidence: 0.85,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
// 2. Framework target mismatch against project files
|
|
40
|
+
// Let's find any csproj at the root to check target framework
|
|
41
|
+
let targetFramework;
|
|
42
|
+
try {
|
|
43
|
+
const rootFiles = fs.readdirSync(repoRoot);
|
|
44
|
+
const csprojFile = rootFiles.find(f => f.endsWith('.csproj'));
|
|
45
|
+
if (csprojFile) {
|
|
46
|
+
const csprojContent = fs.readFileSync(path.join(repoRoot, csprojFile), 'utf-8');
|
|
47
|
+
const match = /<TargetFramework>(.*?)<\/TargetFramework>/.exec(csprojContent);
|
|
48
|
+
if (match) {
|
|
49
|
+
targetFramework = match[1]?.trim();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// ignore
|
|
55
|
+
}
|
|
56
|
+
if (targetFramework) {
|
|
57
|
+
const isObsoleteMention = /\b(netcoreapp\d+\.\d+|net5\.0|netcore)\b/i.test(combinedContent);
|
|
58
|
+
const isModernProject = /^net(?:[6-9]|[1-9]\d+)\.0/.test(targetFramework);
|
|
59
|
+
if (isModernProject && isObsoleteMention) {
|
|
60
|
+
issues.push({
|
|
61
|
+
id: 'dotnet-obsolete-framework-reference',
|
|
62
|
+
severity: 'warning',
|
|
63
|
+
category: 'stale_instruction',
|
|
64
|
+
title: '.NET Obsolete Framework Reference',
|
|
65
|
+
summary: `The project targets modern .NET (${targetFramework}), but instructions still reference obsolete versions like .NET Core 3.1 or .NET 5.0.`,
|
|
66
|
+
filePaths: allFilePaths,
|
|
67
|
+
locations: [],
|
|
68
|
+
evidence: [`Project targets ${targetFramework}; obsolete framework references found in instructions.`],
|
|
69
|
+
recommendation: `Update instructions to reference the current target framework version (${targetFramework}).`,
|
|
70
|
+
fixRecipe: `Target .NET ${targetFramework} as the framework for this project. Do not use legacy .NET Core 3.1 or .NET 5.0 APIs.`,
|
|
71
|
+
confidence: 0.8,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return issues;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=dotnet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dotnet.js","sourceRoot":"","sources":["../../src/frameworks/dotnet.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../src/frameworks/go.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CAyC9D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
export function detectGo(context) {
|
|
4
|
+
const issues = [];
|
|
5
|
+
const { repoRoot, files } = context;
|
|
6
|
+
const hasGoMod = fs.existsSync(path.join(repoRoot, 'go.mod'));
|
|
7
|
+
const combinedContent = files.map(f => f.content).join('\n');
|
|
8
|
+
// FW1: "go" is an ordinary English verb ("let's go build something"), so a
|
|
9
|
+
// bare `\bgo\s+(build|test|run|get|mod)\b` match enabled the whole Go pack
|
|
10
|
+
// (and its "Missing Go Testing Commands" warning) in non-Go repos with no
|
|
11
|
+
// go.mod at all. "go.mod" (the literal filename) is unambiguous and safe
|
|
12
|
+
// to match anywhere in prose; the command-verb form only counts as a real
|
|
13
|
+
// signal when it appears in a command context (backtick-quoted).
|
|
14
|
+
const hasGoMentions = /\bgo\.mod\b/i.test(combinedContent) ||
|
|
15
|
+
/`[^`\n]*\bgo\s+(?:build|test|run|get|mod)\b[^`\n]*`/i.test(combinedContent);
|
|
16
|
+
if (!hasGoMod && !hasGoMentions) {
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
const allFilePaths = files.map(f => f.path);
|
|
20
|
+
// 1. Missing go test command in validation instructions
|
|
21
|
+
const hasGoTest = /\bgo\s+test\b/i.test(combinedContent);
|
|
22
|
+
if (!hasGoTest) {
|
|
23
|
+
issues.push({
|
|
24
|
+
id: 'go-missing-testing-commands',
|
|
25
|
+
severity: 'warning',
|
|
26
|
+
category: 'structure',
|
|
27
|
+
title: 'Missing Go Testing Commands',
|
|
28
|
+
summary: 'Go project detected, but instructions do not mention Go testing commands like "go test ./...".',
|
|
29
|
+
filePaths: allFilePaths,
|
|
30
|
+
locations: [],
|
|
31
|
+
evidence: ['Go detected, but no "go test" command found in instructions.'],
|
|
32
|
+
recommendation: 'Add instructions telling the agent to run "go test ./..." to verify changes.',
|
|
33
|
+
fixRecipe: 'Before saying work is complete, run go test ./... to verify all tests pass.',
|
|
34
|
+
confidence: 0.85,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return issues;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=go.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go.js","sourceRoot":"","sources":["../../src/frameworks/go.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,MAAM,UAAU,QAAQ,CAAC,OAAoB;IAC3C,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAEpC,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,2EAA2E;IAC3E,2EAA2E;IAC3E,0EAA0E;IAC1E,yEAAyE;IACzE,0EAA0E;IAC1E,iEAAiE;IACjE,MAAM,aAAa,GACjB,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC;QACpC,sDAAsD,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAE/E,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE5C,wDAAwD;IACxD,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACzD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC;YACV,EAAE,EAAE,6BAA6B;YACjC,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,WAAW;YACrB,KAAK,EAAE,6BAA6B;YACpC,OAAO,EAAE,gGAAgG;YACzG,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,CAAC,8DAA8D,CAAC;YAC1E,cAAc,EAAE,8EAA8E;YAC9F,SAAS,EAAE,6EAA6E;YACxF,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/frameworks/nextjs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CA4ElE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
export function detectNextJs(context) {
|
|
4
|
+
const issues = [];
|
|
5
|
+
const { packageJson, repoRoot, files } = context;
|
|
6
|
+
const hasNextDep = !!(packageJson.dependencies['next'] || packageJson.devDependencies['next']);
|
|
7
|
+
const hasNextConfig = fs.existsSync(path.join(repoRoot, 'next.config.js')) ||
|
|
8
|
+
fs.existsSync(path.join(repoRoot, 'next.config.mjs')) ||
|
|
9
|
+
fs.existsSync(path.join(repoRoot, 'next.config.ts')) ||
|
|
10
|
+
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'next.config.js')) ||
|
|
11
|
+
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'next.config.mjs')) ||
|
|
12
|
+
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'next.config.ts'));
|
|
13
|
+
if (!hasNextDep && !hasNextConfig) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
const hasAppDir = fs.existsSync(path.join(repoRoot, 'app')) ||
|
|
17
|
+
fs.existsSync(path.join(repoRoot, 'src', 'app')) ||
|
|
18
|
+
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'app')) ||
|
|
19
|
+
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'src', 'app'));
|
|
20
|
+
const hasPagesDir = fs.existsSync(path.join(repoRoot, 'pages')) ||
|
|
21
|
+
fs.existsSync(path.join(repoRoot, 'src', 'pages')) ||
|
|
22
|
+
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'pages')) ||
|
|
23
|
+
fs.existsSync(path.join(repoRoot, 'apps', 'web', 'src', 'pages'));
|
|
24
|
+
// Check for missing App Router guidance
|
|
25
|
+
if (hasAppDir) {
|
|
26
|
+
const hasAppRouterGuidance = files.some(file => file.content.toLowerCase().includes('app router') ||
|
|
27
|
+
file.content.toLowerCase().includes('server component') ||
|
|
28
|
+
file.content.toLowerCase().includes('client component'));
|
|
29
|
+
if (!hasAppRouterGuidance) {
|
|
30
|
+
issues.push({
|
|
31
|
+
id: 'nextjs-missing-app-router-guidance',
|
|
32
|
+
severity: 'warning',
|
|
33
|
+
category: 'structure',
|
|
34
|
+
title: 'Missing Next.js App Router Guidance',
|
|
35
|
+
summary: 'The project uses the App Router, but the instructions do not mention App Router specific rules like Server vs Client components.',
|
|
36
|
+
filePaths: files.map(f => f.path),
|
|
37
|
+
locations: [],
|
|
38
|
+
evidence: ['App directory detected, but no "App Router" or "Server/Client Component" mention in instructions.'],
|
|
39
|
+
recommendation: 'Add guidance for Next.js App Router, specifically regarding Server and Client Component usage.',
|
|
40
|
+
confidence: 0.9,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Check for stale Pages Router references in App Router only project
|
|
45
|
+
if (hasAppDir && !hasPagesDir) {
|
|
46
|
+
const pagesRouterFiles = files.filter(file => file.content.toLowerCase().includes('pages router') ||
|
|
47
|
+
file.content.toLowerCase().includes('getstaticprops') ||
|
|
48
|
+
file.content.toLowerCase().includes('getserversideprops'));
|
|
49
|
+
if (pagesRouterFiles.length > 0) {
|
|
50
|
+
issues.push({
|
|
51
|
+
id: 'nextjs-stale-pages-router-guidance',
|
|
52
|
+
severity: 'warning',
|
|
53
|
+
category: 'stale_instruction',
|
|
54
|
+
title: 'Stale Pages Router Guidance',
|
|
55
|
+
summary: 'The project uses the App Router exclusively, but instructions still reference Pages Router concepts like getStaticProps.',
|
|
56
|
+
filePaths: pagesRouterFiles.map(f => f.path),
|
|
57
|
+
locations: pagesRouterFiles.map(f => ({ filePath: f.path })),
|
|
58
|
+
evidence: ['Pages Router specific terms found in an App Router project.'],
|
|
59
|
+
recommendation: 'Remove or update Pages Router specific instructions to align with App Router.',
|
|
60
|
+
confidence: 0.8,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return issues;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=nextjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../src/frameworks/nextjs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../src/frameworks/python.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CAkElE"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
export function detectPython(context) {
|
|
4
|
+
const issues = [];
|
|
5
|
+
const { manifests, repoRoot, files } = context;
|
|
6
|
+
const hasPyProject = !!manifests.pyproject;
|
|
7
|
+
const hasRequirements = fs.existsSync(path.join(repoRoot, 'requirements.txt'));
|
|
8
|
+
const hasPipfile = fs.existsSync(path.join(repoRoot, 'Pipfile'));
|
|
9
|
+
const hasCondaYaml = fs.existsSync(path.join(repoRoot, 'environment.yml'));
|
|
10
|
+
if (!hasPyProject && !hasRequirements && !hasPipfile && !hasCondaYaml) {
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
// Check for missing pytest guidance if pytest is in deps
|
|
14
|
+
const isPytestInDeps = (manifests.pyproject?.includes('pytest') ||
|
|
15
|
+
(hasRequirements && fs.readFileSync(path.join(repoRoot, 'requirements.txt'), 'utf-8').includes('pytest')));
|
|
16
|
+
if (isPytestInDeps) {
|
|
17
|
+
const hasPytestGuidance = files.some(file => file.content.toLowerCase().includes('pytest') ||
|
|
18
|
+
file.content.toLowerCase().includes('test guidance'));
|
|
19
|
+
if (!hasPytestGuidance) {
|
|
20
|
+
issues.push({
|
|
21
|
+
id: 'python-missing-pytest-guidance',
|
|
22
|
+
severity: 'info',
|
|
23
|
+
category: 'structure',
|
|
24
|
+
title: 'Missing Pytest Guidance',
|
|
25
|
+
summary: 'The project uses pytest, but no testing guidance was found in the instructions.',
|
|
26
|
+
filePaths: files.map(f => f.path),
|
|
27
|
+
locations: [],
|
|
28
|
+
evidence: ['pytest detected in dependencies, but no mention in instructions.'],
|
|
29
|
+
recommendation: 'Add guidance on how to run and write tests using pytest.',
|
|
30
|
+
confidence: 0.8,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Check for environment manager mismatch
|
|
35
|
+
// If we have multiple env managers, it might be confusing
|
|
36
|
+
const envManagers = [];
|
|
37
|
+
const envManagerPaths = [];
|
|
38
|
+
if (hasPipfile)
|
|
39
|
+
envManagers.push('Pipenv (Pipfile)');
|
|
40
|
+
if (hasPipfile)
|
|
41
|
+
envManagerPaths.push(path.join(repoRoot, 'Pipfile'));
|
|
42
|
+
if (hasCondaYaml)
|
|
43
|
+
envManagers.push('Conda (environment.yml)');
|
|
44
|
+
if (hasCondaYaml)
|
|
45
|
+
envManagerPaths.push(path.join(repoRoot, 'environment.yml'));
|
|
46
|
+
if (hasPyProject && manifests.pyproject?.includes('[tool.poetry]'))
|
|
47
|
+
envManagers.push('Poetry (pyproject.toml)');
|
|
48
|
+
if (hasPyProject && manifests.pyproject?.includes('[tool.poetry]'))
|
|
49
|
+
envManagerPaths.push(path.join(repoRoot, 'pyproject.toml'));
|
|
50
|
+
if (envManagers.length > 1) {
|
|
51
|
+
issues.push({
|
|
52
|
+
id: 'python-multiple-env-managers',
|
|
53
|
+
severity: 'warning',
|
|
54
|
+
category: 'conflict',
|
|
55
|
+
title: 'Multiple Python Environment Managers',
|
|
56
|
+
summary: `Multiple environment managers detected: ${envManagers.join(', ')}. This can lead to conflicting instructions.`,
|
|
57
|
+
filePaths: envManagerPaths.length > 0 ? envManagerPaths : files.map(f => f.path),
|
|
58
|
+
locations: [],
|
|
59
|
+
evidence: [`Detected: ${envManagers.join(', ')}`],
|
|
60
|
+
recommendation: 'Decide on a single environment manager and remove the others, or clearly document when to use each.',
|
|
61
|
+
confidence: 0.9,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
return issues;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=python.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"python.js","sourceRoot":"","sources":["../../src/frameworks/python.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rust.d.ts","sourceRoot":"","sources":["../../src/frameworks/rust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,EAAE,CA0EhE"}
|