agentic-loop 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/commands/explain.md +114 -0
- package/.claude/commands/idea.md +398 -0
- package/.claude/commands/my-dna.md +122 -0
- package/.claude/commands/prd.md +286 -0
- package/.claude/commands/review.md +167 -0
- package/.claude/commands/sign.md +32 -0
- package/.claude/commands/styleguide.md +450 -0
- package/.claude/commands/tour.md +301 -0
- package/.claude/commands/vibe-check.md +116 -0
- package/.claude/commands/vibe-help.md +47 -0
- package/.claude/commands/vibe-list.md +203 -0
- package/.pre-commit-hooks.yaml +102 -0
- package/LICENSE +21 -0
- package/README.md +238 -0
- package/bin/agentic-loop.sh +24 -0
- package/bin/postinstall.sh +29 -0
- package/bin/ralph.sh +171 -0
- package/bin/vibe-check.js +19 -0
- package/dist/checks/check-any-types.d.ts +6 -0
- package/dist/checks/check-any-types.d.ts.map +1 -0
- package/dist/checks/check-any-types.js +73 -0
- package/dist/checks/check-any-types.js.map +1 -0
- package/dist/checks/check-commented-code.d.ts +6 -0
- package/dist/checks/check-commented-code.d.ts.map +1 -0
- package/dist/checks/check-commented-code.js +81 -0
- package/dist/checks/check-commented-code.js.map +1 -0
- package/dist/checks/check-console-error.d.ts +6 -0
- package/dist/checks/check-console-error.d.ts.map +1 -0
- package/dist/checks/check-console-error.js +41 -0
- package/dist/checks/check-console-error.js.map +1 -0
- package/dist/checks/check-debug-statements.d.ts +6 -0
- package/dist/checks/check-debug-statements.d.ts.map +1 -0
- package/dist/checks/check-debug-statements.js +120 -0
- package/dist/checks/check-debug-statements.js.map +1 -0
- package/dist/checks/check-deep-nesting.d.ts +6 -0
- package/dist/checks/check-deep-nesting.d.ts.map +1 -0
- package/dist/checks/check-deep-nesting.js +116 -0
- package/dist/checks/check-deep-nesting.js.map +1 -0
- package/dist/checks/check-docker-platform.d.ts +6 -0
- package/dist/checks/check-docker-platform.d.ts.map +1 -0
- package/dist/checks/check-docker-platform.js +42 -0
- package/dist/checks/check-docker-platform.js.map +1 -0
- package/dist/checks/check-dry-violations.d.ts +6 -0
- package/dist/checks/check-dry-violations.d.ts.map +1 -0
- package/dist/checks/check-dry-violations.js +124 -0
- package/dist/checks/check-dry-violations.js.map +1 -0
- package/dist/checks/check-empty-catch.d.ts +6 -0
- package/dist/checks/check-empty-catch.d.ts.map +1 -0
- package/dist/checks/check-empty-catch.js +111 -0
- package/dist/checks/check-empty-catch.js.map +1 -0
- package/dist/checks/check-function-length.d.ts +6 -0
- package/dist/checks/check-function-length.d.ts.map +1 -0
- package/dist/checks/check-function-length.js +152 -0
- package/dist/checks/check-function-length.js.map +1 -0
- package/dist/checks/check-hardcoded-ai-models.d.ts +10 -0
- package/dist/checks/check-hardcoded-ai-models.d.ts.map +1 -0
- package/dist/checks/check-hardcoded-ai-models.js +102 -0
- package/dist/checks/check-hardcoded-ai-models.js.map +1 -0
- package/dist/checks/check-hardcoded-urls.d.ts +6 -0
- package/dist/checks/check-hardcoded-urls.d.ts.map +1 -0
- package/dist/checks/check-hardcoded-urls.js +124 -0
- package/dist/checks/check-hardcoded-urls.js.map +1 -0
- package/dist/checks/check-magic-numbers.d.ts +6 -0
- package/dist/checks/check-magic-numbers.d.ts.map +1 -0
- package/dist/checks/check-magic-numbers.js +116 -0
- package/dist/checks/check-magic-numbers.js.map +1 -0
- package/dist/checks/check-secrets.d.ts +6 -0
- package/dist/checks/check-secrets.d.ts.map +1 -0
- package/dist/checks/check-secrets.js +138 -0
- package/dist/checks/check-secrets.js.map +1 -0
- package/dist/checks/check-snake-case-ts.d.ts +6 -0
- package/dist/checks/check-snake-case-ts.d.ts.map +1 -0
- package/dist/checks/check-snake-case-ts.js +78 -0
- package/dist/checks/check-snake-case-ts.js.map +1 -0
- package/dist/checks/check-todo-fixme.d.ts +6 -0
- package/dist/checks/check-todo-fixme.d.ts.map +1 -0
- package/dist/checks/check-todo-fixme.js +41 -0
- package/dist/checks/check-todo-fixme.js.map +1 -0
- package/dist/checks/check-unsafe-html.d.ts +6 -0
- package/dist/checks/check-unsafe-html.d.ts.map +1 -0
- package/dist/checks/check-unsafe-html.js +101 -0
- package/dist/checks/check-unsafe-html.js.map +1 -0
- package/dist/checks/index.d.ts +30 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +57 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +208 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/file-reader.d.ts +24 -0
- package/dist/utils/file-reader.d.ts.map +1 -0
- package/dist/utils/file-reader.js +146 -0
- package/dist/utils/file-reader.js.map +1 -0
- package/dist/utils/patterns.d.ts +27 -0
- package/dist/utils/patterns.d.ts.map +1 -0
- package/dist/utils/patterns.js +84 -0
- package/dist/utils/patterns.js.map +1 -0
- package/dist/utils/reporters.d.ts +21 -0
- package/dist/utils/reporters.d.ts.map +1 -0
- package/dist/utils/reporters.js +115 -0
- package/dist/utils/reporters.js.map +1 -0
- package/dist/utils/types.d.ts +71 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +5 -0
- package/dist/utils/types.js.map +1 -0
- package/package.json +83 -0
- package/ralph/api.sh +216 -0
- package/ralph/backup.sh +838 -0
- package/ralph/browser-verify/README.md +135 -0
- package/ralph/browser-verify/verify.ts +450 -0
- package/ralph/checks/check-fastapi-responses.py +155 -0
- package/ralph/hooks/hooks-config.json +72 -0
- package/ralph/hooks/inject-context.sh +44 -0
- package/ralph/hooks/install.sh +207 -0
- package/ralph/hooks/log-tools.sh +45 -0
- package/ralph/hooks/protect-prd.sh +27 -0
- package/ralph/hooks/save-learnings.sh +36 -0
- package/ralph/hooks/warn-debug.sh +54 -0
- package/ralph/hooks/warn-empty-catch.sh +63 -0
- package/ralph/hooks/warn-secrets.sh +89 -0
- package/ralph/hooks/warn-urls.sh +77 -0
- package/ralph/init.sh +515 -0
- package/ralph/loop.sh +730 -0
- package/ralph/playwright.sh +238 -0
- package/ralph/prd.sh +295 -0
- package/ralph/setup/feature-tour.sh +155 -0
- package/ralph/setup/quick-setup.sh +239 -0
- package/ralph/setup/tutorial.sh +159 -0
- package/ralph/setup/ui.sh +136 -0
- package/ralph/setup.sh +401 -0
- package/ralph/signs.sh +150 -0
- package/ralph/utils.sh +682 -0
- package/ralph/verify/browser.sh +324 -0
- package/ralph/verify/lint.sh +363 -0
- package/ralph/verify/review.sh +152 -0
- package/ralph/verify/tests.sh +81 -0
- package/ralph/verify.sh +268 -0
- package/templates/PROMPT.md +235 -0
- package/templates/config/fullstack.json +86 -0
- package/templates/config/go.json +81 -0
- package/templates/config/minimal.json +76 -0
- package/templates/config/node.json +81 -0
- package/templates/config/python.json +81 -0
- package/templates/config/rust.json +81 -0
- package/templates/examples/CLAUDE-django.md +174 -0
- package/templates/examples/CLAUDE-fastapi.md +270 -0
- package/templates/examples/CLAUDE-fastmcp.md +352 -0
- package/templates/examples/CLAUDE-fullstack.md +256 -0
- package/templates/examples/CLAUDE-node.md +246 -0
- package/templates/examples/CLAUDE-react.md +138 -0
- package/templates/optional/cursorrules.template +147 -0
- package/templates/optional/eslint.config.js +34 -0
- package/templates/optional/lint-staged.config.js +34 -0
- package/templates/optional/ruff.toml +125 -0
- package/templates/optional/vibe-check.yml +116 -0
- package/templates/optional/vscode-settings.json +127 -0
- package/templates/signs.json +46 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check for magic numbers that should be named constants
|
|
3
|
+
*/
|
|
4
|
+
// Numbers that are commonly acceptable and don't need constants
|
|
5
|
+
const ACCEPTABLE_NUMBERS = new Set([
|
|
6
|
+
-1, 0, 1, 2, 10, 100, 1000,
|
|
7
|
+
// Common time values
|
|
8
|
+
60, 1000, 3600, 86400,
|
|
9
|
+
// Array/string indices
|
|
10
|
+
0, 1, 2,
|
|
11
|
+
]);
|
|
12
|
+
// Contexts where magic numbers are acceptable
|
|
13
|
+
const ACCEPTABLE_CONTEXTS = [
|
|
14
|
+
/\.length\s*[<>=!]/, // array length comparisons
|
|
15
|
+
/\[\s*\d+\s*\]/, // array indexing
|
|
16
|
+
/slice\s*\(\s*\d+/, // slice operations
|
|
17
|
+
/substring\s*\(\s*\d+/, // substring operations
|
|
18
|
+
/repeat\s*\(\s*\d+/, // repeat operations
|
|
19
|
+
/^\s*(?:return|throw)\s+\d+/, // return/throw numeric values
|
|
20
|
+
/port\s*[:=]/i, // port numbers
|
|
21
|
+
/\.toFixed\s*\(\s*\d+/, // decimal places
|
|
22
|
+
/Math\./, // Math operations
|
|
23
|
+
/parseInt|parseFloat/, // parsing functions
|
|
24
|
+
/0x[0-9a-fA-F]+/, // hex numbers (color codes, etc.)
|
|
25
|
+
/rgba?\s*\(/, // CSS colors
|
|
26
|
+
/version/i, // version numbers
|
|
27
|
+
/new Date\(/, // date constructors
|
|
28
|
+
/setTimeout|setInterval/, // timer functions (often have inline ms)
|
|
29
|
+
/padding|margin|width|height/i, // CSS-related
|
|
30
|
+
];
|
|
31
|
+
// Paths that indicate frontend component files (skip these)
|
|
32
|
+
const FRONTEND_PATH_PATTERNS = [
|
|
33
|
+
/\/components\//i,
|
|
34
|
+
/\/pages\//i,
|
|
35
|
+
/\/views\//i,
|
|
36
|
+
/\/layouts\//i,
|
|
37
|
+
/\/ui\//i,
|
|
38
|
+
/\.styled\./i,
|
|
39
|
+
/\.styles\./i,
|
|
40
|
+
];
|
|
41
|
+
export const checkMagicNumbers = {
|
|
42
|
+
id: 'magic-numbers',
|
|
43
|
+
name: 'Check Magic Numbers',
|
|
44
|
+
description: 'Detect magic numbers that should be named constants',
|
|
45
|
+
severity: 'warning',
|
|
46
|
+
// Skip JSX/TSX - too many false positives with CSS values
|
|
47
|
+
fileTypes: ['js', 'ts', 'mjs', 'cjs', 'py'],
|
|
48
|
+
check(context) {
|
|
49
|
+
const results = [];
|
|
50
|
+
// Skip frontend component files even if they're .js/.ts
|
|
51
|
+
if (FRONTEND_PATH_PATTERNS.some((pattern) => pattern.test(context.filePath))) {
|
|
52
|
+
return results;
|
|
53
|
+
}
|
|
54
|
+
const lines = context.content.split('\n');
|
|
55
|
+
for (let i = 0; i < lines.length; i++) {
|
|
56
|
+
const line = lines[i];
|
|
57
|
+
const lineNum = i + 1;
|
|
58
|
+
// Skip comments
|
|
59
|
+
if (isCommentLine(line, context.extension)) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// Skip constant/variable declarations with descriptive names
|
|
63
|
+
if (isConstantDeclaration(line)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
// Find all numbers in the line
|
|
67
|
+
const numberMatches = line.matchAll(/(?<![a-zA-Z_])(-?\d+(?:\.\d+)?)\b/g);
|
|
68
|
+
for (const match of numberMatches) {
|
|
69
|
+
const numStr = match[1];
|
|
70
|
+
const num = parseFloat(numStr);
|
|
71
|
+
// Skip acceptable numbers
|
|
72
|
+
if (ACCEPTABLE_NUMBERS.has(num)) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
// Skip if in acceptable context
|
|
76
|
+
if (ACCEPTABLE_CONTEXTS.some((pattern) => pattern.test(line))) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
// Skip very small numbers (likely not magic)
|
|
80
|
+
if (num >= -10 && num <= 10 && Number.isInteger(num)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
results.push({
|
|
84
|
+
line: lineNum,
|
|
85
|
+
column: match.index || 0,
|
|
86
|
+
message: `Magic number ${numStr} - consider using a named constant`,
|
|
87
|
+
severity: 'warning',
|
|
88
|
+
ruleId: 'magic-numbers/unnamed',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return results;
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
function isCommentLine(line, extension) {
|
|
96
|
+
const trimmed = line.trim();
|
|
97
|
+
if (['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs'].includes(extension)) {
|
|
98
|
+
return trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*');
|
|
99
|
+
}
|
|
100
|
+
if (['py', 'pyw'].includes(extension)) {
|
|
101
|
+
return trimmed.startsWith('#');
|
|
102
|
+
}
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
function isConstantDeclaration(line) {
|
|
106
|
+
// JavaScript/TypeScript const with UPPER_CASE name
|
|
107
|
+
if (/const\s+[A-Z][A-Z0-9_]+\s*=/.test(line)) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
// Python uppercase variable (convention for constants)
|
|
111
|
+
if (/^[A-Z][A-Z0-9_]+\s*=/.test(line.trim())) {
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=check-magic-numbers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-magic-numbers.js","sourceRoot":"","sources":["../../src/checks/check-magic-numbers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-secrets.d.ts","sourceRoot":"","sources":["../../src/checks/check-secrets.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAGvE,eAAO,MAAM,YAAY,EAAE,IAkI1B,CAAC"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check for hardcoded secrets, API keys, and tokens
|
|
3
|
+
*/
|
|
4
|
+
import { SECRET_PATTERNS, isPlaceholder } from '../utils/patterns.js';
|
|
5
|
+
export const checkSecrets = {
|
|
6
|
+
id: 'secrets',
|
|
7
|
+
name: 'Check Secrets',
|
|
8
|
+
description: 'Detect hardcoded API keys, passwords, and tokens',
|
|
9
|
+
severity: 'error',
|
|
10
|
+
fileTypes: ['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs', 'py', 'json', 'yaml', 'yml', 'toml', 'env'],
|
|
11
|
+
check(context) {
|
|
12
|
+
const results = [];
|
|
13
|
+
const lines = context.content.split('\n');
|
|
14
|
+
for (let i = 0; i < lines.length; i++) {
|
|
15
|
+
const line = lines[i];
|
|
16
|
+
const lineNum = i + 1;
|
|
17
|
+
// Skip comments
|
|
18
|
+
if (isCommentLine(line, context.extension)) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
// AWS Access Key
|
|
22
|
+
const awsMatch = line.match(SECRET_PATTERNS.awsAccessKey);
|
|
23
|
+
if (awsMatch && !isPlaceholder(awsMatch[0])) {
|
|
24
|
+
results.push({
|
|
25
|
+
line: lineNum,
|
|
26
|
+
column: line.indexOf(awsMatch[0]),
|
|
27
|
+
message: 'Possible AWS Access Key detected',
|
|
28
|
+
severity: 'error',
|
|
29
|
+
ruleId: 'secrets/aws-key',
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
// Stripe Key
|
|
33
|
+
const stripeMatch = line.match(SECRET_PATTERNS.stripeKey);
|
|
34
|
+
if (stripeMatch && !isPlaceholder(stripeMatch[0])) {
|
|
35
|
+
results.push({
|
|
36
|
+
line: lineNum,
|
|
37
|
+
column: line.indexOf(stripeMatch[0]),
|
|
38
|
+
message: 'Stripe API key detected',
|
|
39
|
+
severity: 'error',
|
|
40
|
+
ruleId: 'secrets/stripe-key',
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
// GitHub Token
|
|
44
|
+
const githubMatch = line.match(SECRET_PATTERNS.githubToken);
|
|
45
|
+
if (githubMatch && !isPlaceholder(githubMatch[0])) {
|
|
46
|
+
results.push({
|
|
47
|
+
line: lineNum,
|
|
48
|
+
column: line.indexOf(githubMatch[0]),
|
|
49
|
+
message: 'GitHub token detected',
|
|
50
|
+
severity: 'error',
|
|
51
|
+
ruleId: 'secrets/github-token',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Slack Token
|
|
55
|
+
const slackMatch = line.match(SECRET_PATTERNS.slackToken);
|
|
56
|
+
if (slackMatch && !isPlaceholder(slackMatch[0])) {
|
|
57
|
+
results.push({
|
|
58
|
+
line: lineNum,
|
|
59
|
+
column: line.indexOf(slackMatch[0]),
|
|
60
|
+
message: 'Slack token detected',
|
|
61
|
+
severity: 'error',
|
|
62
|
+
ruleId: 'secrets/slack-token',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// SendGrid Key
|
|
66
|
+
const sendgridMatch = line.match(SECRET_PATTERNS.sendgridKey);
|
|
67
|
+
if (sendgridMatch && !isPlaceholder(sendgridMatch[0])) {
|
|
68
|
+
results.push({
|
|
69
|
+
line: lineNum,
|
|
70
|
+
column: line.indexOf(sendgridMatch[0]),
|
|
71
|
+
message: 'SendGrid API key detected',
|
|
72
|
+
severity: 'error',
|
|
73
|
+
ruleId: 'secrets/sendgrid-key',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Private Key
|
|
77
|
+
if (SECRET_PATTERNS.privateKey.test(line)) {
|
|
78
|
+
results.push({
|
|
79
|
+
line: lineNum,
|
|
80
|
+
column: 0,
|
|
81
|
+
message: 'Private key detected - never commit private keys',
|
|
82
|
+
severity: 'error',
|
|
83
|
+
ruleId: 'secrets/private-key',
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Generic API key patterns
|
|
87
|
+
const genericApiMatch = line.match(SECRET_PATTERNS.genericApiKey);
|
|
88
|
+
if (genericApiMatch && !isPlaceholder(genericApiMatch[0])) {
|
|
89
|
+
// Only flag if it looks like a real key (long enough, not a placeholder)
|
|
90
|
+
const value = genericApiMatch[0];
|
|
91
|
+
if (value.length > 30) {
|
|
92
|
+
results.push({
|
|
93
|
+
line: lineNum,
|
|
94
|
+
column: line.indexOf(value),
|
|
95
|
+
message: 'Possible hardcoded API key - use environment variables',
|
|
96
|
+
severity: 'error',
|
|
97
|
+
ruleId: 'secrets/generic-api-key',
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Generic secrets (password, token, etc.)
|
|
102
|
+
const secretMatch = line.match(SECRET_PATTERNS.genericSecret);
|
|
103
|
+
if (secretMatch && !isPlaceholder(secretMatch[0])) {
|
|
104
|
+
// Skip obvious non-secrets
|
|
105
|
+
const value = secretMatch[0].toLowerCase();
|
|
106
|
+
if (!value.includes('password:') && // Not a type annotation
|
|
107
|
+
!value.includes('password =') && // Assignment with placeholder
|
|
108
|
+
value.length > 20) {
|
|
109
|
+
results.push({
|
|
110
|
+
line: lineNum,
|
|
111
|
+
column: line.indexOf(secretMatch[0]),
|
|
112
|
+
message: 'Possible hardcoded secret - use environment variables',
|
|
113
|
+
severity: 'warning',
|
|
114
|
+
ruleId: 'secrets/generic-secret',
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return results;
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
function isCommentLine(line, extension) {
|
|
123
|
+
const trimmed = line.trim();
|
|
124
|
+
// JavaScript/TypeScript style comments
|
|
125
|
+
if (['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs'].includes(extension)) {
|
|
126
|
+
return trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*');
|
|
127
|
+
}
|
|
128
|
+
// Python style comments
|
|
129
|
+
if (['py', 'pyw'].includes(extension)) {
|
|
130
|
+
return trimmed.startsWith('#');
|
|
131
|
+
}
|
|
132
|
+
// YAML style comments
|
|
133
|
+
if (['yaml', 'yml'].includes(extension)) {
|
|
134
|
+
return trimmed.startsWith('#');
|
|
135
|
+
}
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=check-secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-secrets.js","sourceRoot":"","sources":["../../src/checks/check-secrets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-snake-case-ts.d.ts","sourceRoot":"","sources":["../../src/checks/check-snake-case-ts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAEvE,eAAO,MAAM,gBAAgB,EAAE,IAmF9B,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check for snake_case property names in TypeScript interfaces/types
|
|
3
|
+
*/
|
|
4
|
+
export const checkSnakeCaseTs = {
|
|
5
|
+
id: 'snake-case',
|
|
6
|
+
name: 'Check Snake Case',
|
|
7
|
+
description: 'Detect snake_case properties in TypeScript that should be camelCase',
|
|
8
|
+
severity: 'warning',
|
|
9
|
+
fileTypes: ['ts', 'tsx', 'mts', 'cts'],
|
|
10
|
+
check(context) {
|
|
11
|
+
const results = [];
|
|
12
|
+
const lines = context.content.split('\n');
|
|
13
|
+
// Track if we're inside an interface or type definition
|
|
14
|
+
let inInterfaceOrType = false;
|
|
15
|
+
let braceDepth = 0;
|
|
16
|
+
for (let i = 0; i < lines.length; i++) {
|
|
17
|
+
const line = lines[i];
|
|
18
|
+
const lineNum = i + 1;
|
|
19
|
+
// Skip comments
|
|
20
|
+
if (line.trim().startsWith('//') || line.trim().startsWith('*')) {
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
// Detect interface or type start
|
|
24
|
+
if (/^\s*(?:export\s+)?(?:interface|type)\s+\w+/.test(line)) {
|
|
25
|
+
inInterfaceOrType = true;
|
|
26
|
+
braceDepth = 0;
|
|
27
|
+
}
|
|
28
|
+
// Track brace depth
|
|
29
|
+
const openBraces = (line.match(/\{/g) || []).length;
|
|
30
|
+
const closeBraces = (line.match(/\}/g) || []).length;
|
|
31
|
+
if (inInterfaceOrType) {
|
|
32
|
+
braceDepth += openBraces - closeBraces;
|
|
33
|
+
// Check for snake_case properties
|
|
34
|
+
// Match property names in interface/type definitions
|
|
35
|
+
const propertyMatch = line.match(/^\s*['"]?([a-z][a-z0-9]*(?:_[a-z0-9]+)+)['"]?\s*[?]?\s*:/);
|
|
36
|
+
if (propertyMatch) {
|
|
37
|
+
const propertyName = propertyMatch[1];
|
|
38
|
+
const suggestedName = toCamelCase(propertyName);
|
|
39
|
+
results.push({
|
|
40
|
+
line: lineNum,
|
|
41
|
+
column: line.indexOf(propertyName),
|
|
42
|
+
message: `Property "${propertyName}" uses snake_case - consider using camelCase "${suggestedName}"`,
|
|
43
|
+
severity: 'warning',
|
|
44
|
+
ruleId: 'snake-case/property',
|
|
45
|
+
fix: suggestedName,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
// End of interface/type
|
|
49
|
+
if (braceDepth <= 0 && closeBraces > 0) {
|
|
50
|
+
inInterfaceOrType = false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Also check for snake_case in object destructuring from API responses
|
|
54
|
+
// This is a common issue when copying from API response types
|
|
55
|
+
const destructMatch = line.match(/const\s*\{\s*([^}]+)\s*\}\s*=/);
|
|
56
|
+
if (destructMatch) {
|
|
57
|
+
const props = destructMatch[1].split(',');
|
|
58
|
+
for (const prop of props) {
|
|
59
|
+
const propName = prop.trim().split(':')[0].trim();
|
|
60
|
+
if (/^[a-z][a-z0-9]*(?:_[a-z0-9]+)+$/.test(propName)) {
|
|
61
|
+
results.push({
|
|
62
|
+
line: lineNum,
|
|
63
|
+
column: line.indexOf(propName),
|
|
64
|
+
message: `Destructured property "${propName}" uses snake_case - API response may need transformation`,
|
|
65
|
+
severity: 'info',
|
|
66
|
+
ruleId: 'snake-case/destructure',
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return results;
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
function toCamelCase(snakeCase) {
|
|
76
|
+
return snakeCase.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=check-snake-case-ts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-snake-case-ts.js","sourceRoot":"","sources":["../../src/checks/check-snake-case-ts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-todo-fixme.d.ts","sourceRoot":"","sources":["../../src/checks/check-todo-fixme.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAKvE,eAAO,MAAM,cAAc,EAAE,IAwC5B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check for TODO/FIXME comments that indicate incomplete work
|
|
3
|
+
*/
|
|
4
|
+
// Patterns to match TODO/FIXME comments
|
|
5
|
+
const TODO_PATTERN = /\b(TODO|FIXME|XXX|HACK|BUG|OPTIMIZE)\b[:\s]*(.*)/i;
|
|
6
|
+
export const checkTodoFixme = {
|
|
7
|
+
id: 'todo',
|
|
8
|
+
name: 'Check TODO/FIXME',
|
|
9
|
+
description: 'Detect TODO, FIXME, and other incomplete work markers',
|
|
10
|
+
severity: 'info',
|
|
11
|
+
fileTypes: ['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs', 'py', 'html', 'css'],
|
|
12
|
+
check(context) {
|
|
13
|
+
const results = [];
|
|
14
|
+
const lines = context.content.split('\n');
|
|
15
|
+
for (let i = 0; i < lines.length; i++) {
|
|
16
|
+
const line = lines[i];
|
|
17
|
+
const lineNum = i + 1;
|
|
18
|
+
const match = line.match(TODO_PATTERN);
|
|
19
|
+
if (match) {
|
|
20
|
+
const type = match[1].toUpperCase();
|
|
21
|
+
const description = match[2]?.trim() || '';
|
|
22
|
+
// Determine severity based on type
|
|
23
|
+
let severity = 'info';
|
|
24
|
+
if (type === 'FIXME' || type === 'BUG') {
|
|
25
|
+
severity = 'warning';
|
|
26
|
+
}
|
|
27
|
+
results.push({
|
|
28
|
+
line: lineNum,
|
|
29
|
+
column: line.indexOf(match[0]),
|
|
30
|
+
message: description
|
|
31
|
+
? `${type}: ${description}`
|
|
32
|
+
: `${type} marker without description`,
|
|
33
|
+
severity,
|
|
34
|
+
ruleId: `todo/${type.toLowerCase()}`,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return results;
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=check-todo-fixme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-todo-fixme.js","sourceRoot":"","sources":["../../src/checks/check-todo-fixme.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,wCAAwC;AACxC,MAAM,YAAY,GAAG,mDAAmD,CAAC;AAEzE,MAAM,CAAC,MAAM,cAAc,GAAS;IAClC,EAAE,EAAE,MAAM;IACV,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,uDAAuD;IACpE,QAAQ,EAAE,MAAM;IAChB,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC;IAExE,KAAK,CAAC,OAAoB;QACxB,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YACvC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;gBACpC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAE3C,mCAAmC;gBACnC,IAAI,QAAQ,GAAuB,MAAM,CAAC;gBAC1C,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;oBACvC,QAAQ,GAAG,SAAS,CAAC;gBACvB,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC9B,OAAO,EAAE,WAAW;wBAClB,CAAC,CAAC,GAAG,IAAI,KAAK,WAAW,EAAE;wBAC3B,CAAC,CAAC,GAAG,IAAI,6BAA6B;oBACxC,QAAQ;oBACR,MAAM,EAAE,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE;iBACrC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-unsafe-html.d.ts","sourceRoot":"","sources":["../../src/checks/check-unsafe-html.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAA2B,MAAM,mBAAmB,CAAC;AAEvE,eAAO,MAAM,eAAe,EAAE,IA6G7B,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check for unsafe HTML/DOM manipulation that could lead to XSS
|
|
3
|
+
*/
|
|
4
|
+
export const checkUnsafeHtml = {
|
|
5
|
+
id: 'unsafe-html',
|
|
6
|
+
name: 'Check Unsafe HTML',
|
|
7
|
+
description: 'Detect unsafe innerHTML/DOM manipulation that could lead to XSS',
|
|
8
|
+
severity: 'error',
|
|
9
|
+
fileTypes: ['js', 'jsx', 'ts', 'tsx', 'mjs', 'cjs', 'html'],
|
|
10
|
+
check(context) {
|
|
11
|
+
const results = [];
|
|
12
|
+
const lines = context.content.split('\n');
|
|
13
|
+
for (let i = 0; i < lines.length; i++) {
|
|
14
|
+
const line = lines[i];
|
|
15
|
+
const lineNum = i + 1;
|
|
16
|
+
// Skip comments
|
|
17
|
+
if (line.trim().startsWith('//') || line.trim().startsWith('*')) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
// Check for innerHTML assignment
|
|
21
|
+
if (/\.innerHTML\s*=/.test(line)) {
|
|
22
|
+
// Check if it's a static string (less dangerous)
|
|
23
|
+
const isStaticString = /\.innerHTML\s*=\s*['"`][^'"`]*['"`]\s*;?\s*$/.test(line);
|
|
24
|
+
if (!isStaticString) {
|
|
25
|
+
results.push({
|
|
26
|
+
line: lineNum,
|
|
27
|
+
column: line.indexOf('innerHTML'),
|
|
28
|
+
message: 'Unsafe innerHTML assignment - use textContent or sanitize input',
|
|
29
|
+
severity: 'error',
|
|
30
|
+
ruleId: 'unsafe-html/innerHTML',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Check for outerHTML assignment
|
|
35
|
+
if (/\.outerHTML\s*=/.test(line)) {
|
|
36
|
+
results.push({
|
|
37
|
+
line: lineNum,
|
|
38
|
+
column: line.indexOf('outerHTML'),
|
|
39
|
+
message: 'Unsafe outerHTML assignment - consider safer alternatives',
|
|
40
|
+
severity: 'error',
|
|
41
|
+
ruleId: 'unsafe-html/outerHTML',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Check for document.write
|
|
45
|
+
if (/document\.write\s*\(/.test(line)) {
|
|
46
|
+
results.push({
|
|
47
|
+
line: lineNum,
|
|
48
|
+
column: line.indexOf('document.write'),
|
|
49
|
+
message: 'document.write() is unsafe - use DOM manipulation instead',
|
|
50
|
+
severity: 'error',
|
|
51
|
+
ruleId: 'unsafe-html/document-write',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Check for insertAdjacentHTML with non-static content
|
|
55
|
+
if (/\.insertAdjacentHTML\s*\([^,]+,/.test(line)) {
|
|
56
|
+
const isStaticString = /\.insertAdjacentHTML\s*\([^,]+,\s*['"`][^'"`]*['"`]\s*\)/.test(line);
|
|
57
|
+
if (!isStaticString) {
|
|
58
|
+
results.push({
|
|
59
|
+
line: lineNum,
|
|
60
|
+
column: line.indexOf('insertAdjacentHTML'),
|
|
61
|
+
message: 'Unsafe insertAdjacentHTML - sanitize input before insertion',
|
|
62
|
+
severity: 'warning',
|
|
63
|
+
ruleId: 'unsafe-html/insertAdjacentHTML',
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Check for dangerouslySetInnerHTML in React
|
|
68
|
+
if (/dangerouslySetInnerHTML\s*=/.test(line)) {
|
|
69
|
+
results.push({
|
|
70
|
+
line: lineNum,
|
|
71
|
+
column: line.indexOf('dangerouslySetInnerHTML'),
|
|
72
|
+
message: 'dangerouslySetInnerHTML requires careful sanitization',
|
|
73
|
+
severity: 'warning',
|
|
74
|
+
ruleId: 'unsafe-html/react-dangerously',
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Check for eval
|
|
78
|
+
if (/\beval\s*\(/.test(line)) {
|
|
79
|
+
results.push({
|
|
80
|
+
line: lineNum,
|
|
81
|
+
column: line.indexOf('eval'),
|
|
82
|
+
message: 'eval() is unsafe - avoid using eval with dynamic content',
|
|
83
|
+
severity: 'error',
|
|
84
|
+
ruleId: 'unsafe-html/eval',
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// Check for Function constructor with dynamic content
|
|
88
|
+
if (/new\s+Function\s*\(/.test(line)) {
|
|
89
|
+
results.push({
|
|
90
|
+
line: lineNum,
|
|
91
|
+
column: line.indexOf('Function'),
|
|
92
|
+
message: 'new Function() with dynamic content is similar to eval()',
|
|
93
|
+
severity: 'warning',
|
|
94
|
+
ruleId: 'unsafe-html/function-constructor',
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return results;
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=check-unsafe-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-unsafe-html.js","sourceRoot":"","sources":["../../src/checks/check-unsafe-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook registry - exports all available hooks
|
|
3
|
+
*/
|
|
4
|
+
import type { Hook } from '../utils/types.js';
|
|
5
|
+
import { checkSecrets } from './check-secrets.js';
|
|
6
|
+
import { checkHardcodedUrls } from './check-hardcoded-urls.js';
|
|
7
|
+
import { checkDebugStatements } from './check-debug-statements.js';
|
|
8
|
+
import { checkTodoFixme } from './check-todo-fixme.js';
|
|
9
|
+
import { checkEmptyCatch } from './check-empty-catch.js';
|
|
10
|
+
import { checkDryViolations } from './check-dry-violations.js';
|
|
11
|
+
import { checkMagicNumbers } from './check-magic-numbers.js';
|
|
12
|
+
import { checkFunctionLength } from './check-function-length.js';
|
|
13
|
+
import { checkCommentedCode } from './check-commented-code.js';
|
|
14
|
+
import { checkDeepNesting } from './check-deep-nesting.js';
|
|
15
|
+
import { checkConsoleError } from './check-console-error.js';
|
|
16
|
+
import { checkAnyTypes } from './check-any-types.js';
|
|
17
|
+
import { checkSnakeCaseTs } from './check-snake-case-ts.js';
|
|
18
|
+
import { checkUnsafeHtml } from './check-unsafe-html.js';
|
|
19
|
+
import { checkDockerPlatform } from './check-docker-platform.js';
|
|
20
|
+
import { checkHardcodedAiModels } from './check-hardcoded-ai-models.js';
|
|
21
|
+
/** All available hooks */
|
|
22
|
+
export declare const hooks: Hook[];
|
|
23
|
+
/** Get a hook by its ID */
|
|
24
|
+
export declare function getHook(id: string): Hook | undefined;
|
|
25
|
+
/** Get hooks filtered by file extension */
|
|
26
|
+
export declare function getHooksForFile(extension: string): Hook[];
|
|
27
|
+
/** Get all hook IDs */
|
|
28
|
+
export declare function getHookIds(): string[];
|
|
29
|
+
export { checkSecrets, checkHardcodedUrls, checkDebugStatements, checkTodoFixme, checkEmptyCatch, checkDryViolations, checkMagicNumbers, checkFunctionLength, checkCommentedCode, checkDeepNesting, checkConsoleError, checkAnyTypes, checkSnakeCaseTs, checkUnsafeHtml, checkDockerPlatform, checkHardcodedAiModels, };
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,0BAA0B;AAC1B,eAAO,MAAM,KAAK,EAAE,IAAI,EAwBvB,CAAC;AAEF,2BAA2B;AAC3B,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAEpD;AAED,2CAA2C;AAC3C,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,CAEzD;AAED,uBAAuB;AACvB,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAErC;AAED,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,sBAAsB,GACvB,CAAC"}
|