superkit-mcp-server 1.2.1 → 1.2.3
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/ARCHITECTURE.md +102 -102
- package/README.md +71 -71
- package/SUPERKIT.md +168 -168
- package/agents/code-archaeologist.md +106 -106
- package/agents/coder.md +90 -90
- package/agents/data-engineer.md +28 -28
- package/agents/devops-engineer.md +242 -242
- package/agents/git-manager.md +203 -203
- package/agents/orchestrator.md +420 -420
- package/agents/penetration-tester.md +188 -188
- package/agents/performance-optimizer.md +187 -187
- package/agents/planner.md +270 -270
- package/agents/qa-automation-engineer.md +103 -103
- package/agents/quant-developer.md +32 -32
- package/agents/reviewer.md +100 -100
- package/agents/scout.md +222 -222
- package/agents/security-auditor.md +3 -2
- package/agents/tester.md +274 -274
- package/agents/ui-designer.md +208 -208
- package/build/index.js +21 -2
- package/build/tools/__tests__/loggerTools.test.js +5 -5
- package/build/tools/archTools.js +2 -19
- package/build/tools/autoPreview.js +2 -2
- package/build/tools/compoundTools.js +4 -4
- package/build/tools/docsTools.js +5 -10
- package/build/tools/loggerTools.js +1 -1
- package/build/tools/todoTools.js +39 -39
- package/build/tools/validators/__tests__/apiSchema.test.js +23 -23
- package/build/tools/validators/__tests__/convertRules.test.js +5 -5
- package/build/tools/validators/__tests__/frontendDesign.test.js +12 -12
- package/build/tools/validators/__tests__/geoChecker.test.js +19 -19
- package/build/tools/validators/__tests__/mobileAudit.test.js +12 -12
- package/build/tools/validators/__tests__/reactPerformanceChecker.test.js +17 -17
- package/build/tools/validators/__tests__/securityScan.test.js +6 -6
- package/build/tools/validators/__tests__/seoChecker.test.js +16 -16
- package/build/tools/validators/__tests__/typeCoverage.test.js +14 -14
- package/build/tools/validators/convertRules.js +2 -2
- package/commands/README.md +122 -122
- package/commands/ask.toml +72 -72
- package/commands/brainstorm.toml +119 -119
- package/commands/chat.toml +77 -77
- package/commands/code-preview.toml +37 -37
- package/commands/code.toml +28 -28
- package/commands/content.toml +200 -200
- package/commands/cook.toml +77 -77
- package/commands/copywrite.toml +131 -131
- package/commands/db.toml +192 -192
- package/commands/debug.toml +166 -166
- package/commands/design.toml +158 -158
- package/commands/dev-rules.toml +14 -14
- package/commands/do.toml +117 -117
- package/commands/doc-rules.toml +14 -14
- package/commands/docs.toml +148 -148
- package/commands/fix.toml +440 -440
- package/commands/fullstack.toml +175 -175
- package/commands/git.toml +235 -235
- package/commands/help.toml +84 -84
- package/commands/integrate.toml +127 -127
- package/commands/journal.toml +136 -136
- package/commands/kit-setup.toml +40 -40
- package/commands/mcp.toml +183 -183
- package/commands/orchestration.toml +15 -15
- package/commands/plan.toml +171 -171
- package/commands/pm.toml +148 -148
- package/commands/pr.toml +50 -50
- package/commands/project.toml +32 -32
- package/commands/research.toml +117 -117
- package/commands/review-pr.toml +63 -63
- package/commands/review.toml +190 -190
- package/commands/scout-ext.toml +97 -97
- package/commands/scout.toml +79 -79
- package/commands/screenshot.toml +65 -65
- package/commands/session.toml +102 -102
- package/commands/skill.toml +384 -384
- package/commands/status.toml +22 -22
- package/commands/team.toml +56 -56
- package/commands/test.toml +164 -164
- package/commands/ticket.toml +70 -70
- package/commands/use.toml +106 -106
- package/commands/video.toml +83 -83
- package/commands/watzup.toml +71 -71
- package/commands/workflow.toml +14 -14
- package/package.json +35 -35
- package/skills/meta/README.md +30 -30
- package/skills/meta/api-design/SKILL.md +134 -134
- package/skills/meta/code-review/SKILL.md +44 -44
- package/skills/meta/code-review/checklists/pre-merge.md +25 -25
- package/skills/meta/code-review/workflows/architecture-pass.md +26 -26
- package/skills/meta/code-review/workflows/performance-pass.md +27 -27
- package/skills/meta/code-review/workflows/security-pass.md +29 -29
- package/skills/meta/compound-docs/SKILL.md +133 -133
- package/skills/meta/debug/SKILL.md +40 -40
- package/skills/meta/debug/templates/bug-report.template.md +31 -31
- package/skills/meta/debug/workflows/reproduce-issue.md +20 -20
- package/skills/meta/docker/SKILL.md +126 -126
- package/skills/meta/examples/supabase/SKILL.md +46 -46
- package/skills/meta/examples/supabase/references/best-practices.md +319 -319
- package/skills/meta/examples/supabase/references/common-patterns.md +373 -373
- package/skills/meta/examples/supabase/templates/migration-template.sql +49 -49
- package/skills/meta/examples/supabase/templates/rls-policy-template.sql +77 -77
- package/skills/meta/examples/supabase/workflows/debugging.md +260 -260
- package/skills/meta/examples/supabase/workflows/migration-workflow.md +211 -211
- package/skills/meta/examples/supabase/workflows/rls-policies.md +244 -244
- package/skills/meta/examples/supabase/workflows/schema-design.md +321 -321
- package/skills/meta/file-todos/SKILL.md +88 -88
- package/skills/meta/mobile/SKILL.md +140 -140
- package/skills/meta/nextjs/SKILL.md +101 -101
- package/skills/meta/performance/SKILL.md +130 -130
- package/skills/meta/react-patterns/SKILL.md +83 -83
- package/skills/meta/security/SKILL.md +114 -114
- package/skills/meta/session-resume/SKILL.md +96 -96
- package/skills/meta/tailwind/SKILL.md +139 -139
- package/skills/meta/testing/SKILL.md +43 -43
- package/skills/meta/testing/references/vitest-patterns.md +45 -45
- package/skills/meta/testing/templates/component-test.template.tsx +37 -37
- package/skills/tech/alpha-vantage/SKILL.md +142 -142
- package/skills/tech/alpha-vantage/references/commodities.md +153 -153
- package/skills/tech/alpha-vantage/references/economic-indicators.md +158 -158
- package/skills/tech/alpha-vantage/references/forex-crypto.md +154 -154
- package/skills/tech/alpha-vantage/references/fundamentals.md +223 -223
- package/skills/tech/alpha-vantage/references/intelligence.md +138 -138
- package/skills/tech/alpha-vantage/references/options.md +93 -93
- package/skills/tech/alpha-vantage/references/technical-indicators.md +374 -374
- package/skills/tech/alpha-vantage/references/time-series.md +157 -157
- package/skills/tech/doc.md +6 -6
- package/skills/tech/financial-modeling/SKILL.md +18 -18
- package/skills/tech/financial-modeling/skills/3-statements/SKILL.md +368 -368
- package/skills/tech/financial-modeling/skills/3-statements/references/formatting.md +118 -118
- package/skills/tech/financial-modeling/skills/3-statements/references/formulas.md +292 -292
- package/skills/tech/financial-modeling/skills/3-statements/references/sec-filings.md +125 -125
- package/skills/tech/financial-modeling/skills/dcf-model/SKILL.md +1210 -1210
- package/skills/tech/financial-modeling/skills/dcf-model/TROUBLESHOOTING.md +40 -40
- package/skills/tech/financial-modeling/skills/dcf-model/requirements.txt +8 -8
- package/skills/tech/financial-modeling/skills/dcf-model/scripts/validate_dcf.py +292 -292
- package/skills/tech/financial-modeling/skills/lbo-model/SKILL.md +236 -236
- package/skills/tech/financial-modeling/skills/merger-model/SKILL.md +108 -108
- package/skills/workflows/README.md +203 -203
- package/skills/workflows/adr.md +174 -174
- package/skills/workflows/changelog.md +74 -74
- package/skills/workflows/compound.md +323 -323
- package/skills/workflows/compound_health.md +74 -74
- package/skills/workflows/create-agent-skill.md +138 -139
- package/skills/workflows/cycle.md +144 -144
- package/skills/workflows/deploy-docs.md +84 -84
- package/skills/workflows/development-rules.md +42 -42
- package/skills/workflows/doc.md +95 -95
- package/skills/workflows/documentation-management.md +34 -34
- package/skills/workflows/explore.md +146 -146
- package/skills/workflows/generate_command.md +106 -106
- package/skills/workflows/heal-skill.md +97 -97
- package/skills/workflows/housekeeping.md +229 -229
- package/skills/workflows/kit-setup.md +102 -102
- package/skills/workflows/map-codebase.md +78 -78
- package/skills/workflows/orchestration-protocol.md +43 -43
- package/skills/workflows/plan-compound.md +439 -439
- package/skills/workflows/plan_review.md +269 -269
- package/skills/workflows/primary-workflow.md +37 -37
- package/skills/workflows/promote_pattern.md +86 -86
- package/skills/workflows/release-docs.md +82 -82
- package/skills/workflows/report-bug.md +135 -135
- package/skills/workflows/reproduce-bug.md +118 -118
- package/skills/workflows/resolve_pr.md +133 -133
- package/skills/workflows/resolve_todo.md +128 -128
- package/skills/workflows/review-compound.md +376 -376
- package/skills/workflows/skill-review.md +127 -127
- package/skills/workflows/specs.md +257 -257
- package/skills/workflows/triage-sprint.md +102 -102
- package/skills/workflows/triage.md +152 -152
- package/skills/workflows/work.md +399 -399
- package/skills/workflows/xcode-test.md +93 -93
package/build/tools/todoTools.js
CHANGED
|
@@ -35,49 +35,49 @@ export async function createTodo(priority, title, problemStatement, criteriaArgs
|
|
|
35
35
|
const filename = `${nextId}-pending-${priority}-${sanitizedDesc}.md`;
|
|
36
36
|
const filePath = path.join(todosDir, filename);
|
|
37
37
|
const dateStr = new Date().toISOString().split('T')[0];
|
|
38
|
-
let content = `---
|
|
39
|
-
status: pending
|
|
40
|
-
priority: ${priority}
|
|
41
|
-
issue_id: "${nextId}"
|
|
42
|
-
tags: [generated, cleanup]
|
|
43
|
-
dependencies: []
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
# ${title}
|
|
47
|
-
|
|
48
|
-
## Problem Statement
|
|
49
|
-
|
|
50
|
-
**What's broken/missing:**
|
|
51
|
-
${problemStatement}
|
|
52
|
-
|
|
53
|
-
**Impact:**
|
|
54
|
-
This issue currently affects the system quality or functionality and needs to be addressed.
|
|
55
|
-
|
|
56
|
-
## Findings
|
|
57
|
-
- **Status:** Identified during workflow execution.
|
|
58
|
-
- **Priority:** ${priority}
|
|
59
|
-
- **System Impact:** This item is tracked to ensure continuous improvement of the codebase. Addressing it will contribute to overall system stability and feature completeness. The findings section provides context on origin and importance.
|
|
60
|
-
|
|
61
|
-
## Recommended Action
|
|
62
|
-
Implement the solution according to the acceptance criteria below.
|
|
63
|
-
|
|
64
|
-
## Acceptance Criteria
|
|
38
|
+
let content = `---
|
|
39
|
+
status: pending
|
|
40
|
+
priority: ${priority}
|
|
41
|
+
issue_id: "${nextId}"
|
|
42
|
+
tags: [generated, cleanup]
|
|
43
|
+
dependencies: []
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
# ${title}
|
|
47
|
+
|
|
48
|
+
## Problem Statement
|
|
49
|
+
|
|
50
|
+
**What's broken/missing:**
|
|
51
|
+
${problemStatement}
|
|
52
|
+
|
|
53
|
+
**Impact:**
|
|
54
|
+
This issue currently affects the system quality or functionality and needs to be addressed.
|
|
55
|
+
|
|
56
|
+
## Findings
|
|
57
|
+
- **Status:** Identified during workflow execution.
|
|
58
|
+
- **Priority:** ${priority}
|
|
59
|
+
- **System Impact:** This item is tracked to ensure continuous improvement of the codebase. Addressing it will contribute to overall system stability and feature completeness. The findings section provides context on origin and importance.
|
|
60
|
+
|
|
61
|
+
## Recommended Action
|
|
62
|
+
Implement the solution according to the acceptance criteria below.
|
|
63
|
+
|
|
64
|
+
## Acceptance Criteria
|
|
65
65
|
`;
|
|
66
66
|
for (const criteria of criteriaArgs) {
|
|
67
67
|
content += `- [ ] ${criteria}\n`;
|
|
68
68
|
}
|
|
69
|
-
content += `
|
|
70
|
-
|
|
71
|
-
## Work Log
|
|
72
|
-
|
|
73
|
-
### ${dateStr} - Created
|
|
74
|
-
|
|
75
|
-
**By:** Agent
|
|
76
|
-
**Actions:**
|
|
77
|
-
- Auto-generated via createTodo MCP tool
|
|
78
|
-
|
|
79
|
-
## Notes
|
|
80
|
-
Source: Workflow automation
|
|
69
|
+
content += `
|
|
70
|
+
|
|
71
|
+
## Work Log
|
|
72
|
+
|
|
73
|
+
### ${dateStr} - Created
|
|
74
|
+
|
|
75
|
+
**By:** Agent
|
|
76
|
+
**Actions:**
|
|
77
|
+
- Auto-generated via createTodo MCP tool
|
|
78
|
+
|
|
79
|
+
## Notes
|
|
80
|
+
Source: Workflow automation
|
|
81
81
|
`;
|
|
82
82
|
await fs.writeFile(filePath, content);
|
|
83
83
|
return `✅ Created todo: ${filePath}\n ID: ${nextId}\n Priority: ${priority}\n Title: ${title}`;
|
|
@@ -9,16 +9,16 @@ describe('schemaValidator', () => {
|
|
|
9
9
|
});
|
|
10
10
|
describe('validatePrismaSchema', () => {
|
|
11
11
|
it('should detect bad model names and missing fields', async () => {
|
|
12
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
13
|
-
model user {
|
|
14
|
-
name String
|
|
15
|
-
}
|
|
16
|
-
model Post {
|
|
17
|
-
id String @id
|
|
18
|
-
userId String
|
|
19
|
-
createdAt DateTime
|
|
20
|
-
}
|
|
21
|
-
enum role { ADMIN, USER }
|
|
12
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
13
|
+
model user {
|
|
14
|
+
name String
|
|
15
|
+
}
|
|
16
|
+
model Post {
|
|
17
|
+
id String @id
|
|
18
|
+
userId String
|
|
19
|
+
createdAt DateTime
|
|
20
|
+
}
|
|
21
|
+
enum role { ADMIN, USER }
|
|
22
22
|
`);
|
|
23
23
|
const issues = await validatePrismaSchema('/mock.prisma');
|
|
24
24
|
expect(issues.some(i => i.includes("Model 'user' should be PascalCase"))).toBe(true);
|
|
@@ -47,11 +47,11 @@ describe('apiValidator', () => {
|
|
|
47
47
|
});
|
|
48
48
|
describe('checkApiCode', () => {
|
|
49
49
|
it('should detect missing api practices', async () => {
|
|
50
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
51
|
-
function handler() {
|
|
52
|
-
// no try, no status, no security check
|
|
53
|
-
return "hello";
|
|
54
|
-
}
|
|
50
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
51
|
+
function handler() {
|
|
52
|
+
// no try, no status, no security check
|
|
53
|
+
return "hello";
|
|
54
|
+
}
|
|
55
55
|
`);
|
|
56
56
|
const res = await checkApiCode('route.ts');
|
|
57
57
|
expect(res.issues.some(i => i.includes('No error handling'))).toBe(true);
|
|
@@ -59,14 +59,14 @@ describe('apiValidator', () => {
|
|
|
59
59
|
expect(res.passed.length).toBe(0);
|
|
60
60
|
});
|
|
61
61
|
it('should pass good practices', async () => {
|
|
62
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
63
|
-
import { z } from 'zod';
|
|
64
|
-
function handler(req, res) {
|
|
65
|
-
try {
|
|
66
|
-
const jwtToken = "123";
|
|
67
|
-
return res.status(200).send("hello");
|
|
68
|
-
} catch(e) {}
|
|
69
|
-
}
|
|
62
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
63
|
+
import { z } from 'zod';
|
|
64
|
+
function handler(req, res) {
|
|
65
|
+
try {
|
|
66
|
+
const jwtToken = "123";
|
|
67
|
+
return res.status(200).send("hello");
|
|
68
|
+
} catch(e) {}
|
|
69
|
+
}
|
|
70
70
|
`);
|
|
71
71
|
const res = await checkApiCode('route.ts');
|
|
72
72
|
expect(res.passed.some(i => i.includes('Error handling'))).toBe(true);
|
|
@@ -15,11 +15,11 @@ describe('convertRules', () => {
|
|
|
15
15
|
it('should correctly parse frontmatter and generate rules', async () => {
|
|
16
16
|
vi.mocked(fs.stat).mockResolvedValue({ isDirectory: () => true });
|
|
17
17
|
vi.mocked(fs.readdir).mockResolvedValue(['async-waterfall.md']);
|
|
18
|
-
vi.mocked(fs.readFile).mockResolvedValue(`---
|
|
19
|
-
title: Waterfall check
|
|
20
|
-
impact: HIGH
|
|
21
|
-
tags: perf
|
|
22
|
-
---
|
|
18
|
+
vi.mocked(fs.readFile).mockResolvedValue(`---
|
|
19
|
+
title: Waterfall check
|
|
20
|
+
impact: HIGH
|
|
21
|
+
tags: perf
|
|
22
|
+
---
|
|
23
23
|
Content body of the rule here.`);
|
|
24
24
|
vi.mocked(fs.mkdir).mockResolvedValue(undefined);
|
|
25
25
|
vi.mocked(fs.writeFile).mockResolvedValue(undefined);
|
|
@@ -9,20 +9,20 @@ describe('accessibilityChecker', () => {
|
|
|
9
9
|
});
|
|
10
10
|
describe('checkAccessibility', () => {
|
|
11
11
|
it('should detect input without label and img without alt', async () => {
|
|
12
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
13
|
-
<input type="text" name="bad" />
|
|
14
|
-
<button>Click me</button>
|
|
12
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
13
|
+
<input type="text" name="bad" />
|
|
14
|
+
<button>Click me</button>
|
|
15
15
|
`);
|
|
16
16
|
const issues = await checkAccessibility('test.html');
|
|
17
17
|
expect(issues.some(i => i.includes('Input without label'))).toBe(true);
|
|
18
18
|
expect(issues.some(i => i.includes('Missing lang'))).toBe(false); // only checks if <html> exists
|
|
19
19
|
});
|
|
20
20
|
it('should pass good inputs', async () => {
|
|
21
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
22
|
-
<html lang="en">
|
|
23
|
-
<input type="text" aria-label="Good" />
|
|
24
|
-
<button aria-label="Close">X</button>
|
|
25
|
-
</html>
|
|
21
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
22
|
+
<html lang="en">
|
|
23
|
+
<input type="text" aria-label="Good" />
|
|
24
|
+
<button aria-label="Close">X</button>
|
|
25
|
+
</html>
|
|
26
26
|
`);
|
|
27
27
|
const issues = await checkAccessibility('test.html');
|
|
28
28
|
expect(issues).toEqual([]); // Skip link is only requested if <main> or <body> is present
|
|
@@ -39,10 +39,10 @@ describe('uxAudit', () => {
|
|
|
39
39
|
name: 'test.tsx',
|
|
40
40
|
isDirectory: () => false
|
|
41
41
|
}]);
|
|
42
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
43
|
-
<button onClick={() => {}}>Submit</button>
|
|
44
|
-
<img src="foo.jpg">
|
|
45
|
-
<p style="color: #000000; font-family: purple;">Hello</p>
|
|
42
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
43
|
+
<button onClick={() => {}}>Submit</button>
|
|
44
|
+
<img src="foo.jpg">
|
|
45
|
+
<p style="color: #000000; font-family: purple;">Hello</p>
|
|
46
46
|
`);
|
|
47
47
|
const res = await runUxAudit('.');
|
|
48
48
|
expect(res.passed).toBe(false);
|
|
@@ -8,21 +8,21 @@ describe('geoChecker', () => {
|
|
|
8
8
|
});
|
|
9
9
|
describe('checkGeoPage', () => {
|
|
10
10
|
it('should detect structured schema and H1s', async () => {
|
|
11
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
12
|
-
<html lang="en">
|
|
13
|
-
<head>
|
|
14
|
-
<script type="application/ld+json">
|
|
15
|
-
{
|
|
16
|
-
"@type": "Article",
|
|
17
|
-
"author": "Test Author"
|
|
18
|
-
}
|
|
19
|
-
</script>
|
|
20
|
-
</head>
|
|
21
|
-
<body>
|
|
22
|
-
<h1>Main Title</h1>
|
|
23
|
-
<p>Some content with numbers like 50% and $100.</p>
|
|
24
|
-
</body>
|
|
25
|
-
</html>
|
|
11
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
12
|
+
<html lang="en">
|
|
13
|
+
<head>
|
|
14
|
+
<script type="application/ld+json">
|
|
15
|
+
{
|
|
16
|
+
"@type": "Article",
|
|
17
|
+
"author": "Test Author"
|
|
18
|
+
}
|
|
19
|
+
</script>
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<h1>Main Title</h1>
|
|
23
|
+
<p>Some content with numbers like 50% and $100.</p>
|
|
24
|
+
</body>
|
|
25
|
+
</html>
|
|
26
26
|
`);
|
|
27
27
|
const result = await checkGeoPage('/mock/page.html');
|
|
28
28
|
expect(result.passed.some(m => m.includes('JSON-LD structured data'))).toBe(true);
|
|
@@ -31,10 +31,10 @@ describe('geoChecker', () => {
|
|
|
31
31
|
expect(result.score).toBeGreaterThan(0);
|
|
32
32
|
});
|
|
33
33
|
it('should flag missing structural tags', async () => {
|
|
34
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
35
|
-
<body>
|
|
36
|
-
<p>No headings, no structure, no stats.</p>
|
|
37
|
-
</body>
|
|
34
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
35
|
+
<body>
|
|
36
|
+
<p>No headings, no structure, no stats.</p>
|
|
37
|
+
</body>
|
|
38
38
|
`);
|
|
39
39
|
const result = await checkGeoPage('/mock/bad.html');
|
|
40
40
|
expect(result.issues.some(m => m.includes('No JSON-LD'))).toBe(true);
|
|
@@ -11,16 +11,16 @@ describe('mobileAudit', () => {
|
|
|
11
11
|
name: 'Screen.tsx',
|
|
12
12
|
isDirectory: () => false
|
|
13
13
|
}]);
|
|
14
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
-
import React from 'react';
|
|
16
|
-
import { View, ScrollView } from 'react-native';
|
|
17
|
-
export const Screen = () => {
|
|
18
|
-
return (
|
|
19
|
-
<ScrollView>
|
|
20
|
-
{data.map(d => <View key={index} />)}
|
|
21
|
-
</ScrollView>
|
|
22
|
-
)
|
|
23
|
-
}
|
|
14
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
+
import React from 'react';
|
|
16
|
+
import { View, ScrollView } from 'react-native';
|
|
17
|
+
export const Screen = () => {
|
|
18
|
+
return (
|
|
19
|
+
<ScrollView>
|
|
20
|
+
{data.map(d => <View key={index} />)}
|
|
21
|
+
</ScrollView>
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
24
|
`);
|
|
25
25
|
const res = await runMobileAudit('.');
|
|
26
26
|
expect(res.passed).toBe(false);
|
|
@@ -31,8 +31,8 @@ describe('mobileAudit', () => {
|
|
|
31
31
|
name: 'regular.tsx',
|
|
32
32
|
isDirectory: () => false
|
|
33
33
|
}]);
|
|
34
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
35
|
-
export const App = () => <div>Hello Web</div>
|
|
34
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
35
|
+
export const App = () => <div>Hello Web</div>
|
|
36
36
|
`);
|
|
37
37
|
const res = await runMobileAudit('.');
|
|
38
38
|
expect(res.passed).toBe(true);
|
|
@@ -11,14 +11,14 @@ describe('reactPerformanceChecker', () => {
|
|
|
11
11
|
name: 'Home.tsx',
|
|
12
12
|
isDirectory: () => false
|
|
13
13
|
}]);
|
|
14
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
-
import { something } from '@/components/index';
|
|
16
|
-
|
|
17
|
-
async function loadData() {
|
|
18
|
-
const a = await fetchA();
|
|
19
|
-
const b = await fetchB();
|
|
20
|
-
return { a, b };
|
|
21
|
-
}
|
|
14
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
+
import { something } from '@/components/index';
|
|
16
|
+
|
|
17
|
+
async function loadData() {
|
|
18
|
+
const a = await fetchA();
|
|
19
|
+
const b = await fetchB();
|
|
20
|
+
return { a, b };
|
|
21
|
+
}
|
|
22
22
|
`);
|
|
23
23
|
const res = await runReactPerformanceChecker('.');
|
|
24
24
|
console.log("RPC BAD REPORT:", res.report);
|
|
@@ -31,15 +31,15 @@ describe('reactPerformanceChecker', () => {
|
|
|
31
31
|
name: 'App.tsx',
|
|
32
32
|
isDirectory: () => false
|
|
33
33
|
}]);
|
|
34
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
35
|
-
import { useQuery } from '@tanstack/react-query';
|
|
36
|
-
import Image from 'next/image';
|
|
37
|
-
|
|
38
|
-
const App = React.memo((props: Props) => {
|
|
39
|
-
const q = useQuery('data', fetchParallel);
|
|
40
|
-
return <Image src="foo" alt="bar" />
|
|
41
|
-
});
|
|
42
|
-
export default App;
|
|
34
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
35
|
+
import { useQuery } from '@tanstack/react-query';
|
|
36
|
+
import Image from 'next/image';
|
|
37
|
+
|
|
38
|
+
const App = React.memo((props: Props) => {
|
|
39
|
+
const q = useQuery('data', fetchParallel);
|
|
40
|
+
return <Image src="foo" alt="bar" />
|
|
41
|
+
});
|
|
42
|
+
export default App;
|
|
43
43
|
`);
|
|
44
44
|
const res = await runReactPerformanceChecker('.');
|
|
45
45
|
console.log("RPC GOOD REPORT:", res.report);
|
|
@@ -13,8 +13,8 @@ describe('securityScan', () => {
|
|
|
13
13
|
name: 'config.json',
|
|
14
14
|
isDirectory: () => false
|
|
15
15
|
}]);
|
|
16
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
17
|
-
{ "aws_key": "AKIA1234567890123456" }
|
|
16
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
17
|
+
{ "aws_key": "AKIA1234567890123456" }
|
|
18
18
|
`);
|
|
19
19
|
const result = await scanSecrets('/mock');
|
|
20
20
|
expect(result.findings).toBeDefined();
|
|
@@ -28,10 +28,10 @@ describe('securityScan', () => {
|
|
|
28
28
|
name: 'bad_code.js',
|
|
29
29
|
isDirectory: () => false
|
|
30
30
|
}]);
|
|
31
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
32
|
-
eval('2 + 2');
|
|
33
|
-
import { exec } from 'child_process';
|
|
34
|
-
child_process.exec('rm -rf /');
|
|
31
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
32
|
+
eval('2 + 2');
|
|
33
|
+
import { exec } from 'child_process';
|
|
34
|
+
child_process.exec('rm -rf /');
|
|
35
35
|
`);
|
|
36
36
|
const result = await scanCodePatterns('/mock');
|
|
37
37
|
expect(result.findings.length).toBeGreaterThan(1);
|
|
@@ -11,22 +11,22 @@ describe('seoChecker', () => {
|
|
|
11
11
|
name: 'index.tsx', // valid page layout file
|
|
12
12
|
isDirectory: () => false
|
|
13
13
|
}]);
|
|
14
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
-
export default function Index() {
|
|
16
|
-
return (
|
|
17
|
-
<html>
|
|
18
|
-
<head>
|
|
19
|
-
<title>Oops missing description and og</title>
|
|
20
|
-
</head>
|
|
21
|
-
<body>
|
|
22
|
-
<h1>Title</h1>
|
|
23
|
-
<h1>Duplicate Title</h1>
|
|
24
|
-
<img src="foo" />
|
|
25
|
-
<img src="bar" alt="" />
|
|
26
|
-
</body>
|
|
27
|
-
</html>
|
|
28
|
-
)
|
|
29
|
-
}
|
|
14
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
15
|
+
export default function Index() {
|
|
16
|
+
return (
|
|
17
|
+
<html>
|
|
18
|
+
<head>
|
|
19
|
+
<title>Oops missing description and og</title>
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<h1>Title</h1>
|
|
23
|
+
<h1>Duplicate Title</h1>
|
|
24
|
+
<img src="foo" />
|
|
25
|
+
<img src="bar" alt="" />
|
|
26
|
+
</body>
|
|
27
|
+
</html>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
30
|
`);
|
|
31
31
|
const res = await runSeoChecker('.');
|
|
32
32
|
expect(res.passed).toBe(false);
|
|
@@ -14,9 +14,9 @@ describe('typeCoverage', () => {
|
|
|
14
14
|
isDirectory: () => false
|
|
15
15
|
}]);
|
|
16
16
|
// Mock readFile to return a snippet with an untyped function and an "any"
|
|
17
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
18
|
-
function test(): any { return 1; }
|
|
19
|
-
const test2 = (x) => console.log(x);
|
|
17
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
18
|
+
function test(): any { return 1; }
|
|
19
|
+
const test2 = (x) => console.log(x);
|
|
20
20
|
`);
|
|
21
21
|
const result = await checkTypescriptCoverage('/mock/folder');
|
|
22
22
|
expect(result.type).toBe('typescript');
|
|
@@ -29,8 +29,8 @@ describe('typeCoverage', () => {
|
|
|
29
29
|
name: 'good.ts',
|
|
30
30
|
isDirectory: () => false
|
|
31
31
|
}]);
|
|
32
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
33
|
-
function typedFunc(val: string): number { return val.length; }
|
|
32
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
33
|
+
function typedFunc(val: string): number { return val.length; }
|
|
34
34
|
`);
|
|
35
35
|
const result = await checkTypescriptCoverage('/mock/good');
|
|
36
36
|
expect(result.stats.any_count).toBe(0);
|
|
@@ -44,15 +44,15 @@ describe('typeCoverage', () => {
|
|
|
44
44
|
name: 'script.py',
|
|
45
45
|
isDirectory: () => false
|
|
46
46
|
}]);
|
|
47
|
-
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
48
|
-
def bad_func(arg):
|
|
49
|
-
pass
|
|
50
|
-
|
|
51
|
-
def good_func(arg: str) -> bool:
|
|
52
|
-
return True
|
|
53
|
-
|
|
54
|
-
def any_func(arg: Any) -> Any:
|
|
55
|
-
pass
|
|
47
|
+
vi.mocked(fs.readFile).mockResolvedValue(`
|
|
48
|
+
def bad_func(arg):
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
def good_func(arg: str) -> bool:
|
|
52
|
+
return True
|
|
53
|
+
|
|
54
|
+
def any_func(arg: Any) -> Any:
|
|
55
|
+
pass
|
|
56
56
|
`);
|
|
57
57
|
const result = await checkPythonCoverage('/mock/py');
|
|
58
58
|
expect(result.stats.any_count).toBeGreaterThan(0);
|
|
@@ -135,12 +135,12 @@ async function generateSectionFile(sectionPrefix, rules, outputDir, getOutputOnl
|
|
|
135
135
|
}
|
|
136
136
|
export async function runConvertRules(projectPath = ".") {
|
|
137
137
|
let report = `============================================================\n`;
|
|
138
|
-
report += `CONVERSION SCRIPT: React Best Practices ->
|
|
138
|
+
report += `CONVERSION SCRIPT: React Best Practices -> Skills Format\n`;
|
|
139
139
|
report += `============================================================\n`;
|
|
140
140
|
const baseDir = path.resolve(projectPath);
|
|
141
141
|
// Mimic the python logic for paths if run from anywhere, or adapt to superkit structure
|
|
142
142
|
const rulesDir = path.join(baseDir, "skills", "react-best-practices", "rules");
|
|
143
|
-
const outputDir = path.join(baseDir, "
|
|
143
|
+
const outputDir = path.join(baseDir, "skills", "react-best-practices");
|
|
144
144
|
report += `[*] Reading rules from: ${rulesDir}\n[*] Output to: ${outputDir}\n\n`;
|
|
145
145
|
try {
|
|
146
146
|
const stat = await fs.stat(rulesDir);
|