vibe-and-thrive 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/add-tests.md +240 -0
- package/.claude/commands/e2e-scaffold.md +212 -0
- package/.claude/commands/explain.md +110 -0
- package/.claude/commands/fix-types.md +238 -0
- package/.claude/commands/refactor.md +184 -0
- package/.claude/commands/review.md +136 -0
- package/.claude/commands/security-check.md +223 -0
- package/.claude/commands/styleguide.md +446 -0
- package/.claude/commands/tdd-feature.md +227 -0
- package/.claude/commands/vibe-check.md +112 -0
- package/.pre-commit-hooks.yaml +77 -0
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/bin/vibe-check.js +19 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +206 -0
- package/dist/cli.js.map +1 -0
- package/dist/eslint-plugin/index.d.ts +66 -0
- package/dist/eslint-plugin/index.d.ts.map +1 -0
- package/dist/eslint-plugin/index.js +67 -0
- package/dist/eslint-plugin/index.js.map +1 -0
- package/dist/eslint-plugin/rules/max-function-length.d.ts +8 -0
- package/dist/eslint-plugin/rules/max-function-length.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/max-function-length.js +69 -0
- package/dist/eslint-plugin/rules/max-function-length.js.map +1 -0
- package/dist/eslint-plugin/rules/no-any-type.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-any-type.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-any-type.js +29 -0
- package/dist/eslint-plugin/rules/no-any-type.js.map +1 -0
- package/dist/eslint-plugin/rules/no-debug-statements.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-debug-statements.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-debug-statements.js +59 -0
- package/dist/eslint-plugin/rules/no-debug-statements.js.map +1 -0
- package/dist/eslint-plugin/rules/no-deep-nesting.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-deep-nesting.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-deep-nesting.js +56 -0
- package/dist/eslint-plugin/rules/no-deep-nesting.js.map +1 -0
- package/dist/eslint-plugin/rules/no-empty-catch.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-empty-catch.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-empty-catch.js +31 -0
- package/dist/eslint-plugin/rules/no-empty-catch.js.map +1 -0
- package/dist/eslint-plugin/rules/no-magic-numbers.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-magic-numbers.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-magic-numbers.js +58 -0
- package/dist/eslint-plugin/rules/no-magic-numbers.js.map +1 -0
- package/dist/eslint-plugin/rules/no-snake-case-props.d.ts +8 -0
- package/dist/eslint-plugin/rules/no-snake-case-props.d.ts.map +1 -0
- package/dist/eslint-plugin/rules/no-snake-case-props.js +48 -0
- package/dist/eslint-plugin/rules/no-snake-case-props.js.map +1 -0
- package/dist/hooks/check-any-types.d.ts +6 -0
- package/dist/hooks/check-any-types.d.ts.map +1 -0
- package/dist/hooks/check-any-types.js +73 -0
- package/dist/hooks/check-any-types.js.map +1 -0
- package/dist/hooks/check-commented-code.d.ts +6 -0
- package/dist/hooks/check-commented-code.d.ts.map +1 -0
- package/dist/hooks/check-commented-code.js +81 -0
- package/dist/hooks/check-commented-code.js.map +1 -0
- package/dist/hooks/check-console-error.d.ts +6 -0
- package/dist/hooks/check-console-error.d.ts.map +1 -0
- package/dist/hooks/check-console-error.js +41 -0
- package/dist/hooks/check-console-error.js.map +1 -0
- package/dist/hooks/check-debug-statements.d.ts +6 -0
- package/dist/hooks/check-debug-statements.d.ts.map +1 -0
- package/dist/hooks/check-debug-statements.js +120 -0
- package/dist/hooks/check-debug-statements.js.map +1 -0
- package/dist/hooks/check-deep-nesting.d.ts +6 -0
- package/dist/hooks/check-deep-nesting.d.ts.map +1 -0
- package/dist/hooks/check-deep-nesting.js +116 -0
- package/dist/hooks/check-deep-nesting.js.map +1 -0
- package/dist/hooks/check-docker-platform.d.ts +6 -0
- package/dist/hooks/check-docker-platform.d.ts.map +1 -0
- package/dist/hooks/check-docker-platform.js +42 -0
- package/dist/hooks/check-docker-platform.js.map +1 -0
- package/dist/hooks/check-dry-violations.d.ts +6 -0
- package/dist/hooks/check-dry-violations.d.ts.map +1 -0
- package/dist/hooks/check-dry-violations.js +124 -0
- package/dist/hooks/check-dry-violations.js.map +1 -0
- package/dist/hooks/check-empty-catch.d.ts +6 -0
- package/dist/hooks/check-empty-catch.d.ts.map +1 -0
- package/dist/hooks/check-empty-catch.js +111 -0
- package/dist/hooks/check-empty-catch.js.map +1 -0
- package/dist/hooks/check-function-length.d.ts +6 -0
- package/dist/hooks/check-function-length.d.ts.map +1 -0
- package/dist/hooks/check-function-length.js +152 -0
- package/dist/hooks/check-function-length.js.map +1 -0
- package/dist/hooks/check-hardcoded-urls.d.ts +6 -0
- package/dist/hooks/check-hardcoded-urls.d.ts.map +1 -0
- package/dist/hooks/check-hardcoded-urls.js +124 -0
- package/dist/hooks/check-hardcoded-urls.js.map +1 -0
- package/dist/hooks/check-magic-numbers.d.ts +6 -0
- package/dist/hooks/check-magic-numbers.d.ts.map +1 -0
- package/dist/hooks/check-magic-numbers.js +116 -0
- package/dist/hooks/check-magic-numbers.js.map +1 -0
- package/dist/hooks/check-secrets.d.ts +6 -0
- package/dist/hooks/check-secrets.d.ts.map +1 -0
- package/dist/hooks/check-secrets.js +138 -0
- package/dist/hooks/check-secrets.js.map +1 -0
- package/dist/hooks/check-snake-case-ts.d.ts +6 -0
- package/dist/hooks/check-snake-case-ts.d.ts.map +1 -0
- package/dist/hooks/check-snake-case-ts.js +78 -0
- package/dist/hooks/check-snake-case-ts.js.map +1 -0
- package/dist/hooks/check-todo-fixme.d.ts +6 -0
- package/dist/hooks/check-todo-fixme.d.ts.map +1 -0
- package/dist/hooks/check-todo-fixme.js +41 -0
- package/dist/hooks/check-todo-fixme.js.map +1 -0
- package/dist/hooks/check-unsafe-html.d.ts +6 -0
- package/dist/hooks/check-unsafe-html.d.ts.map +1 -0
- package/dist/hooks/check-unsafe-html.js +101 -0
- package/dist/hooks/check-unsafe-html.js.map +1 -0
- package/dist/hooks/index.d.ts +29 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +54 -0
- package/dist/hooks/index.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/lint-staged/config.d.ts +20 -0
- package/dist/lint-staged/config.d.ts.map +1 -0
- package/dist/lint-staged/config.js +27 -0
- package/dist/lint-staged/config.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 +140 -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/integrations/cursorrules.template +147 -0
- package/integrations/eslint.config.js +34 -0
- package/integrations/lint-staged.config.js +34 -0
- package/integrations/ruff.toml +125 -0
- package/integrations/vibe-check.yml +116 -0
- package/integrations/vscode-settings.json +127 -0
- package/package.json +81 -0
|
@@ -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/hooks/check-unsafe-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
/** All available hooks */
|
|
21
|
+
export declare const hooks: Hook[];
|
|
22
|
+
/** Get a hook by its ID */
|
|
23
|
+
export declare function getHook(id: string): Hook | undefined;
|
|
24
|
+
/** Get hooks filtered by file extension */
|
|
25
|
+
export declare function getHooksForFile(extension: string): Hook[];
|
|
26
|
+
/** Get all hook IDs */
|
|
27
|
+
export declare function getHookIds(): string[];
|
|
28
|
+
export { checkSecrets, checkHardcodedUrls, checkDebugStatements, checkTodoFixme, checkEmptyCatch, checkDryViolations, checkMagicNumbers, checkFunctionLength, checkCommentedCode, checkDeepNesting, checkConsoleError, checkAnyTypes, checkSnakeCaseTs, checkUnsafeHtml, checkDockerPlatform, };
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/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;AAEjE,0BAA0B;AAC1B,eAAO,MAAM,KAAK,EAAE,IAAI,EAqBvB,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,GACpB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook registry - exports all available hooks
|
|
3
|
+
*/
|
|
4
|
+
// Import all hooks
|
|
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
|
+
/** All available hooks */
|
|
21
|
+
export const hooks = [
|
|
22
|
+
// Security (blocking)
|
|
23
|
+
checkSecrets,
|
|
24
|
+
checkHardcodedUrls,
|
|
25
|
+
checkUnsafeHtml,
|
|
26
|
+
// Code quality (warnings)
|
|
27
|
+
checkDebugStatements,
|
|
28
|
+
checkTodoFixme,
|
|
29
|
+
checkEmptyCatch,
|
|
30
|
+
checkDryViolations,
|
|
31
|
+
checkMagicNumbers,
|
|
32
|
+
checkFunctionLength,
|
|
33
|
+
checkCommentedCode,
|
|
34
|
+
checkDeepNesting,
|
|
35
|
+
checkConsoleError,
|
|
36
|
+
checkAnyTypes,
|
|
37
|
+
checkSnakeCaseTs,
|
|
38
|
+
// Infrastructure
|
|
39
|
+
checkDockerPlatform,
|
|
40
|
+
];
|
|
41
|
+
/** Get a hook by its ID */
|
|
42
|
+
export function getHook(id) {
|
|
43
|
+
return hooks.find((hook) => hook.id === id);
|
|
44
|
+
}
|
|
45
|
+
/** Get hooks filtered by file extension */
|
|
46
|
+
export function getHooksForFile(extension) {
|
|
47
|
+
return hooks.filter((hook) => hook.fileTypes.includes(extension));
|
|
48
|
+
}
|
|
49
|
+
/** Get all hook IDs */
|
|
50
|
+
export function getHookIds() {
|
|
51
|
+
return hooks.map((hook) => hook.id);
|
|
52
|
+
}
|
|
53
|
+
export { checkSecrets, checkHardcodedUrls, checkDebugStatements, checkTodoFixme, checkEmptyCatch, checkDryViolations, checkMagicNumbers, checkFunctionLength, checkCommentedCode, checkDeepNesting, checkConsoleError, checkAnyTypes, checkSnakeCaseTs, checkUnsafeHtml, checkDockerPlatform, };
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,mBAAmB;AACnB,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;AAEjE,0BAA0B;AAC1B,MAAM,CAAC,MAAM,KAAK,GAAW;IAC3B,sBAAsB;IACtB,YAAY;IACZ,kBAAkB;IAClB,eAAe;IAEf,0BAA0B;IAC1B,oBAAoB;IACpB,cAAc;IACd,eAAe;IACf,kBAAkB;IAClB,iBAAiB;IACjB,mBAAmB;IACnB,kBAAkB;IAClB,gBAAgB;IAChB,iBAAiB;IACjB,aAAa;IACb,gBAAgB;IAEhB,iBAAiB;IACjB,mBAAmB;CACpB,CAAC;AAEF,2BAA2B;AAC3B,MAAM,UAAU,OAAO,CAAC,EAAU;IAChC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,uBAAuB;AACvB,MAAM,UAAU,UAAU;IACxB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtC,CAAC;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,GACpB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vibe-and-thrive
|
|
3
|
+
*
|
|
4
|
+
* Catch common AI-generated code issues before they hit your codebase.
|
|
5
|
+
*/
|
|
6
|
+
export type { Hook, HookResult, FileContext, CheckOptions, CheckResult, SummaryResult, Severity, } from './utils/types.js';
|
|
7
|
+
export { hooks, getHook, getHooksForFile, getHookIds, } from './hooks/index.js';
|
|
8
|
+
export { vibeCheck } from './cli.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,YAAY,EACV,IAAI,EACJ,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,KAAK,EACL,OAAO,EACP,eAAe,EACf,UAAU,GACX,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vibe-and-thrive
|
|
3
|
+
*
|
|
4
|
+
* Catch common AI-generated code issues before they hit your codebase.
|
|
5
|
+
*/
|
|
6
|
+
// Export hooks
|
|
7
|
+
export { hooks, getHook, getHooksForFile, getHookIds, } from './hooks/index.js';
|
|
8
|
+
// Export main check function
|
|
9
|
+
export { vibeCheck } from './cli.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,eAAe;AACf,OAAO,EACL,KAAK,EACL,OAAO,EACP,eAAe,EACf,UAAU,GACX,MAAM,kBAAkB,CAAC;AAE1B,6BAA6B;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lint-staged configuration for vibe-and-thrive
|
|
3
|
+
*
|
|
4
|
+
* Usage in package.json:
|
|
5
|
+
* "lint-staged": {
|
|
6
|
+
* "*.{js,ts,jsx,tsx}": "vibe-check --fail-on error"
|
|
7
|
+
* }
|
|
8
|
+
*
|
|
9
|
+
* Or import this config:
|
|
10
|
+
* import lintStagedConfig from 'vibe-and-thrive/lint-staged';
|
|
11
|
+
*/
|
|
12
|
+
export interface LintStagedConfig {
|
|
13
|
+
[pattern: string]: string | string[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Default lint-staged configuration
|
|
17
|
+
*/
|
|
18
|
+
export declare const config: LintStagedConfig;
|
|
19
|
+
export default config;
|
|
20
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lint-staged/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,EAAE,gBAUpB,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* lint-staged configuration for vibe-and-thrive
|
|
3
|
+
*
|
|
4
|
+
* Usage in package.json:
|
|
5
|
+
* "lint-staged": {
|
|
6
|
+
* "*.{js,ts,jsx,tsx}": "vibe-check --fail-on error"
|
|
7
|
+
* }
|
|
8
|
+
*
|
|
9
|
+
* Or import this config:
|
|
10
|
+
* import lintStagedConfig from 'vibe-and-thrive/lint-staged';
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Default lint-staged configuration
|
|
14
|
+
*/
|
|
15
|
+
export const config = {
|
|
16
|
+
'*.{js,ts,jsx,tsx}': [
|
|
17
|
+
'vibe-check --only secrets,urls,debug,any-types,snake-case --fail-on error',
|
|
18
|
+
],
|
|
19
|
+
'*.py': [
|
|
20
|
+
'vibe-check --only secrets,urls,debug,magic-numbers --fail-on error',
|
|
21
|
+
],
|
|
22
|
+
'*.{json,yaml,yml}': [
|
|
23
|
+
'vibe-check --only secrets --fail-on error',
|
|
24
|
+
],
|
|
25
|
+
};
|
|
26
|
+
export default config;
|
|
27
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lint-staged/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAqB;IACtC,mBAAmB,EAAE;QACnB,2EAA2E;KAC5E;IACD,MAAM,EAAE;QACN,oEAAoE;KACrE;IACD,mBAAmB,EAAE;QACnB,2CAA2C;KAC5C;CACF,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File discovery and reading utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check if a file should be processed based on extension
|
|
6
|
+
*/
|
|
7
|
+
export declare function shouldProcessFile(filePath: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Get file extension (handles special cases like Dockerfile)
|
|
10
|
+
*/
|
|
11
|
+
export declare function getExtension(filePath: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Recursively discover files in a directory
|
|
14
|
+
*/
|
|
15
|
+
export declare function discoverFiles(dirPath: string): string[];
|
|
16
|
+
/**
|
|
17
|
+
* Resolve input paths to a list of files
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveFiles(inputs: string[]): string[];
|
|
20
|
+
/**
|
|
21
|
+
* Read file content
|
|
22
|
+
*/
|
|
23
|
+
export declare function readFile(filePath: string): string;
|
|
24
|
+
//# sourceMappingURL=file-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-reader.d.ts","sourceRoot":"","sources":["../../src/utils/file-reader.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyDH;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAe3D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAyBvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAuBvD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjD"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File discovery and reading utilities
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
/** Directories to always skip */
|
|
7
|
+
const SKIP_DIRS = new Set([
|
|
8
|
+
'node_modules',
|
|
9
|
+
'.git',
|
|
10
|
+
'__pycache__',
|
|
11
|
+
'.venv',
|
|
12
|
+
'venv',
|
|
13
|
+
'env',
|
|
14
|
+
'dist',
|
|
15
|
+
'build',
|
|
16
|
+
'.next',
|
|
17
|
+
'.nuxt',
|
|
18
|
+
'coverage',
|
|
19
|
+
'.pytest_cache',
|
|
20
|
+
'.mypy_cache',
|
|
21
|
+
'.tox',
|
|
22
|
+
'egg-info',
|
|
23
|
+
'.eggs',
|
|
24
|
+
]);
|
|
25
|
+
/** File extensions to check */
|
|
26
|
+
const SUPPORTED_EXTENSIONS = new Set([
|
|
27
|
+
// JavaScript/TypeScript
|
|
28
|
+
'js',
|
|
29
|
+
'jsx',
|
|
30
|
+
'ts',
|
|
31
|
+
'tsx',
|
|
32
|
+
'mjs',
|
|
33
|
+
'cjs',
|
|
34
|
+
'mts',
|
|
35
|
+
'cts',
|
|
36
|
+
// Python
|
|
37
|
+
'py',
|
|
38
|
+
'pyw',
|
|
39
|
+
// Config/Data
|
|
40
|
+
'json',
|
|
41
|
+
'jsonc',
|
|
42
|
+
'yaml',
|
|
43
|
+
'yml',
|
|
44
|
+
'toml',
|
|
45
|
+
// Web
|
|
46
|
+
'html',
|
|
47
|
+
'htm',
|
|
48
|
+
// Docker
|
|
49
|
+
'dockerfile',
|
|
50
|
+
// Other
|
|
51
|
+
'env',
|
|
52
|
+
'env.local',
|
|
53
|
+
'env.development',
|
|
54
|
+
'env.production',
|
|
55
|
+
]);
|
|
56
|
+
/**
|
|
57
|
+
* Check if a file should be processed based on extension
|
|
58
|
+
*/
|
|
59
|
+
export function shouldProcessFile(filePath) {
|
|
60
|
+
const basename = path.basename(filePath).toLowerCase();
|
|
61
|
+
// Handle Dockerfile (no extension)
|
|
62
|
+
if (basename === 'dockerfile' || basename.startsWith('dockerfile.')) {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
// Handle .env files
|
|
66
|
+
if (basename.startsWith('.env')) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
const ext = path.extname(filePath).slice(1).toLowerCase();
|
|
70
|
+
return SUPPORTED_EXTENSIONS.has(ext);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get file extension (handles special cases like Dockerfile)
|
|
74
|
+
*/
|
|
75
|
+
export function getExtension(filePath) {
|
|
76
|
+
const basename = path.basename(filePath).toLowerCase();
|
|
77
|
+
if (basename === 'dockerfile' || basename.startsWith('dockerfile.')) {
|
|
78
|
+
return 'dockerfile';
|
|
79
|
+
}
|
|
80
|
+
if (basename.startsWith('.env')) {
|
|
81
|
+
return 'env';
|
|
82
|
+
}
|
|
83
|
+
return path.extname(filePath).slice(1).toLowerCase();
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Recursively discover files in a directory
|
|
87
|
+
*/
|
|
88
|
+
export function discoverFiles(dirPath) {
|
|
89
|
+
const files = [];
|
|
90
|
+
function walk(currentPath) {
|
|
91
|
+
const entries = fs.readdirSync(currentPath, { withFileTypes: true });
|
|
92
|
+
for (const entry of entries) {
|
|
93
|
+
const fullPath = path.join(currentPath, entry.name);
|
|
94
|
+
if (entry.isDirectory()) {
|
|
95
|
+
// Skip excluded directories
|
|
96
|
+
if (SKIP_DIRS.has(entry.name) || entry.name.startsWith('.')) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
walk(fullPath);
|
|
100
|
+
}
|
|
101
|
+
else if (entry.isFile()) {
|
|
102
|
+
if (shouldProcessFile(fullPath)) {
|
|
103
|
+
files.push(fullPath);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
walk(dirPath);
|
|
109
|
+
return files;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Resolve input paths to a list of files
|
|
113
|
+
*/
|
|
114
|
+
export function resolveFiles(inputs) {
|
|
115
|
+
const files = [];
|
|
116
|
+
for (const input of inputs) {
|
|
117
|
+
const resolvedPath = path.resolve(input);
|
|
118
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
119
|
+
console.error(`Warning: Path does not exist: ${input}`);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const stat = fs.statSync(resolvedPath);
|
|
123
|
+
if (stat.isDirectory()) {
|
|
124
|
+
files.push(...discoverFiles(resolvedPath));
|
|
125
|
+
}
|
|
126
|
+
else if (stat.isFile()) {
|
|
127
|
+
if (shouldProcessFile(resolvedPath)) {
|
|
128
|
+
files.push(resolvedPath);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return [...new Set(files)]; // Deduplicate
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Read file content
|
|
136
|
+
*/
|
|
137
|
+
export function readFile(filePath) {
|
|
138
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=file-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-reader.js","sourceRoot":"","sources":["../../src/utils/file-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common regex patterns used across hooks
|
|
3
|
+
*/
|
|
4
|
+
export declare const SECRET_PATTERNS: {
|
|
5
|
+
awsAccessKey: RegExp;
|
|
6
|
+
awsSecretKey: RegExp;
|
|
7
|
+
genericApiKey: RegExp;
|
|
8
|
+
genericSecret: RegExp;
|
|
9
|
+
stripeKey: RegExp;
|
|
10
|
+
githubToken: RegExp;
|
|
11
|
+
slackToken: RegExp;
|
|
12
|
+
twilioKey: RegExp;
|
|
13
|
+
sendgridKey: RegExp;
|
|
14
|
+
privateKey: RegExp;
|
|
15
|
+
jwt: RegExp;
|
|
16
|
+
};
|
|
17
|
+
export declare const URL_PATTERNS: {
|
|
18
|
+
localhost: RegExp;
|
|
19
|
+
localIp: RegExp;
|
|
20
|
+
hardcodedUrl: RegExp;
|
|
21
|
+
};
|
|
22
|
+
export declare const DEBUG_PATTERNS: Record<string, RegExp[]>;
|
|
23
|
+
export declare const LANGUAGE_EXTENSIONS: Record<string, string[]>;
|
|
24
|
+
export declare function getLanguage(extension: string): string | undefined;
|
|
25
|
+
export declare const PLACEHOLDER_PATTERNS: RegExp[];
|
|
26
|
+
export declare function isPlaceholder(value: string): boolean;
|
|
27
|
+
//# sourceMappingURL=patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../../src/utils/patterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,eAAe;;;;;;;;;;;;CAqB3B,CAAC;AAGF,eAAO,MAAM,YAAY;;;;CAOxB,CAAC;AAGF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAgBnD,CAAC;AAGF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAQxD,CAAC;AAGF,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOjE;AAGD,eAAO,MAAM,oBAAoB,UAUhC,CAAC;AAGF,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common regex patterns used across hooks
|
|
3
|
+
*/
|
|
4
|
+
// Secret patterns
|
|
5
|
+
export const SECRET_PATTERNS = {
|
|
6
|
+
// AWS
|
|
7
|
+
awsAccessKey: /AKIA[0-9A-Z]{16}/,
|
|
8
|
+
awsSecretKey: /(?<![A-Za-z0-9/+=])[A-Za-z0-9/+=]{40}(?![A-Za-z0-9/+=])/,
|
|
9
|
+
// API keys (generic)
|
|
10
|
+
genericApiKey: /(?:api[_-]?key|apikey|api[_-]?secret)\s*[:=]\s*['"][a-zA-Z0-9_\-]{20,}['"]/i,
|
|
11
|
+
genericSecret: /(?:secret|password|passwd|pwd|token|auth)\s*[:=]\s*['"][^'"]{8,}['"]/i,
|
|
12
|
+
// Specific services
|
|
13
|
+
stripeKey: /sk_(?:live|test)_[0-9a-zA-Z]{24,}/,
|
|
14
|
+
githubToken: /gh[pousr]_[A-Za-z0-9_]{36,}/,
|
|
15
|
+
slackToken: /xox[baprs]-[0-9]{10,}-[0-9a-zA-Z]{24,}/,
|
|
16
|
+
twilioKey: /SK[0-9a-fA-F]{32}/,
|
|
17
|
+
sendgridKey: /SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}/,
|
|
18
|
+
// Private keys
|
|
19
|
+
privateKey: /-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/,
|
|
20
|
+
// JWT (only if it looks like a real token, not a placeholder)
|
|
21
|
+
jwt: /eyJ[a-zA-Z0-9_-]{10,}\.eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/,
|
|
22
|
+
};
|
|
23
|
+
// URL patterns
|
|
24
|
+
export const URL_PATTERNS = {
|
|
25
|
+
// Localhost URLs
|
|
26
|
+
localhost: /https?:\/\/localhost(?::\d+)?(?:\/[^\s'"]*)?/g,
|
|
27
|
+
localIp: /https?:\/\/127\.0\.0\.1(?::\d+)?(?:\/[^\s'"]*)?/g,
|
|
28
|
+
// Hardcoded production URLs (excluding common CDNs)
|
|
29
|
+
hardcodedUrl: /https?:\/\/(?!(?:cdn|fonts|unpkg|cdnjs|jsdelivr)\.)[a-zA-Z0-9][a-zA-Z0-9-]*\.[a-zA-Z]{2,}(?::\d+)?(?:\/[^\s'"]*)?/g,
|
|
30
|
+
};
|
|
31
|
+
// Debug statement patterns by language
|
|
32
|
+
export const DEBUG_PATTERNS = {
|
|
33
|
+
javascript: [
|
|
34
|
+
/console\.(log|debug|info|warn|error|trace|dir|table)\s*\(/,
|
|
35
|
+
/debugger\s*;?/,
|
|
36
|
+
/alert\s*\(/,
|
|
37
|
+
],
|
|
38
|
+
typescript: [
|
|
39
|
+
/console\.(log|debug|info|warn|error|trace|dir|table)\s*\(/,
|
|
40
|
+
/debugger\s*;?/,
|
|
41
|
+
],
|
|
42
|
+
python: [
|
|
43
|
+
/\bprint\s*\(/,
|
|
44
|
+
/\bbreakpoint\s*\(\s*\)/,
|
|
45
|
+
/\bpdb\.set_trace\s*\(\s*\)/,
|
|
46
|
+
/\bipdb\.set_trace\s*\(\s*\)/,
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
// File extensions by language type
|
|
50
|
+
export const LANGUAGE_EXTENSIONS = {
|
|
51
|
+
javascript: ['js', 'jsx', 'mjs', 'cjs'],
|
|
52
|
+
typescript: ['ts', 'tsx', 'mts', 'cts'],
|
|
53
|
+
python: ['py', 'pyw'],
|
|
54
|
+
json: ['json', 'jsonc'],
|
|
55
|
+
yaml: ['yaml', 'yml'],
|
|
56
|
+
docker: ['dockerfile'],
|
|
57
|
+
html: ['html', 'htm'],
|
|
58
|
+
};
|
|
59
|
+
// Get language from file extension
|
|
60
|
+
export function getLanguage(extension) {
|
|
61
|
+
for (const [lang, exts] of Object.entries(LANGUAGE_EXTENSIONS)) {
|
|
62
|
+
if (exts.includes(extension.toLowerCase())) {
|
|
63
|
+
return lang;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
// Common placeholder patterns (to ignore in secret detection)
|
|
69
|
+
export const PLACEHOLDER_PATTERNS = [
|
|
70
|
+
/example/i,
|
|
71
|
+
/placeholder/i,
|
|
72
|
+
/your[_-]?(?:api[_-]?)?key/i,
|
|
73
|
+
/xxx+/i,
|
|
74
|
+
/test/i,
|
|
75
|
+
/dummy/i,
|
|
76
|
+
/fake/i,
|
|
77
|
+
/sample/i,
|
|
78
|
+
/demo/i,
|
|
79
|
+
];
|
|
80
|
+
// Check if a string looks like a placeholder
|
|
81
|
+
export function isPlaceholder(value) {
|
|
82
|
+
return PLACEHOLDER_PATTERNS.some((pattern) => pattern.test(value));
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.js","sourceRoot":"","sources":["../../src/utils/patterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,kBAAkB;AAClB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,MAAM;IACN,YAAY,EAAE,kBAAkB;IAChC,YAAY,EAAE,yDAAyD;IAEvE,qBAAqB;IACrB,aAAa,EAAE,6EAA6E;IAC5F,aAAa,EAAE,uEAAuE;IAEtF,oBAAoB;IACpB,SAAS,EAAE,mCAAmC;IAC9C,WAAW,EAAE,6BAA6B;IAC1C,UAAU,EAAE,wCAAwC;IACpD,SAAS,EAAE,mBAAmB;IAC9B,WAAW,EAAE,0CAA0C;IAEvD,eAAe;IACf,UAAU,EAAE,wDAAwD;IAEpE,8DAA8D;IAC9D,GAAG,EAAE,kEAAkE;CACxE,CAAC;AAEF,eAAe;AACf,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,iBAAiB;IACjB,SAAS,EAAE,+CAA+C;IAC1D,OAAO,EAAE,kDAAkD;IAE3D,oDAAoD;IACpD,YAAY,EAAE,oHAAoH;CACnI,CAAC;AAEF,uCAAuC;AACvC,MAAM,CAAC,MAAM,cAAc,GAA6B;IACtD,UAAU,EAAE;QACV,2DAA2D;QAC3D,eAAe;QACf,YAAY;KACb;IACD,UAAU,EAAE;QACV,2DAA2D;QAC3D,eAAe;KAChB;IACD,MAAM,EAAE;QACN,cAAc;QACd,wBAAwB;QACxB,4BAA4B;QAC5B,6BAA6B;KAC9B;CACF,CAAC;AAEF,mCAAmC;AACnC,MAAM,CAAC,MAAM,mBAAmB,GAA6B;IAC3D,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IACvC,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;IACvC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IACvB,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;IACrB,MAAM,EAAE,CAAC,YAAY,CAAC;IACtB,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;CACtB,CAAC;AAEF,mCAAmC;AACnC,MAAM,UAAU,WAAW,CAAC,SAAiB;IAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC/D,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU;IACV,cAAc;IACd,4BAA4B;IAC5B,OAAO;IACP,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;IACT,OAAO;CACR,CAAC;AAEF,6CAA6C;AAC7C,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatters for CLI results
|
|
3
|
+
*/
|
|
4
|
+
import type { SummaryResult } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Pretty format - colored terminal output
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatPretty(summary: SummaryResult): string;
|
|
9
|
+
/**
|
|
10
|
+
* JSON format - machine-readable output
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatJson(summary: SummaryResult): string;
|
|
13
|
+
/**
|
|
14
|
+
* Compact format - one line per issue
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatCompact(summary: SummaryResult): string;
|
|
17
|
+
/**
|
|
18
|
+
* Format results based on output format option
|
|
19
|
+
*/
|
|
20
|
+
export declare function formatResults(summary: SummaryResult, format: 'pretty' | 'json' | 'compact'): string;
|
|
21
|
+
//# sourceMappingURL=reporters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporters.d.ts","sourceRoot":"","sources":["../../src/utils/reporters.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAY,MAAM,YAAY,CAAC;AAoC1D;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAoD3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAgB5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,GACpC,MAAM,CASR"}
|