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,57 @@
|
|
|
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
|
+
import { checkHardcodedAiModels } from './check-hardcoded-ai-models.js';
|
|
21
|
+
/** All available hooks */
|
|
22
|
+
export const hooks = [
|
|
23
|
+
// Security (blocking)
|
|
24
|
+
checkSecrets,
|
|
25
|
+
checkHardcodedUrls,
|
|
26
|
+
checkUnsafeHtml,
|
|
27
|
+
// Code quality (warnings)
|
|
28
|
+
checkDebugStatements,
|
|
29
|
+
checkTodoFixme,
|
|
30
|
+
checkEmptyCatch,
|
|
31
|
+
checkDryViolations,
|
|
32
|
+
checkMagicNumbers,
|
|
33
|
+
checkFunctionLength,
|
|
34
|
+
checkCommentedCode,
|
|
35
|
+
checkDeepNesting,
|
|
36
|
+
checkConsoleError,
|
|
37
|
+
checkAnyTypes,
|
|
38
|
+
checkSnakeCaseTs,
|
|
39
|
+
// Infrastructure
|
|
40
|
+
checkDockerPlatform,
|
|
41
|
+
// AI/LLM
|
|
42
|
+
checkHardcodedAiModels,
|
|
43
|
+
];
|
|
44
|
+
/** Get a hook by its ID */
|
|
45
|
+
export function getHook(id) {
|
|
46
|
+
return hooks.find((hook) => hook.id === id);
|
|
47
|
+
}
|
|
48
|
+
/** Get hooks filtered by file extension */
|
|
49
|
+
export function getHooksForFile(extension) {
|
|
50
|
+
return hooks.filter((hook) => hook.fileTypes.includes(extension));
|
|
51
|
+
}
|
|
52
|
+
/** Get all hook IDs */
|
|
53
|
+
export function getHookIds() {
|
|
54
|
+
return hooks.map((hook) => hook.id);
|
|
55
|
+
}
|
|
56
|
+
export { checkSecrets, checkHardcodedUrls, checkDebugStatements, checkTodoFixme, checkEmptyCatch, checkDryViolations, checkMagicNumbers, checkFunctionLength, checkCommentedCode, checkDeepNesting, checkConsoleError, checkAnyTypes, checkSnakeCaseTs, checkUnsafeHtml, checkDockerPlatform, checkHardcodedAiModels, };
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checks/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;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,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;IAEnB,SAAS;IACT,sBAAsB;CACvB,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,EACnB,sBAAsB,GACvB,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI entry point for vibe-check
|
|
3
|
+
*/
|
|
4
|
+
import type { CheckOptions, SummaryResult } from './utils/types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Main vibe-check function
|
|
7
|
+
*/
|
|
8
|
+
export declare function vibeCheck(files: string[], options?: CheckOptions): SummaryResult;
|
|
9
|
+
/**
|
|
10
|
+
* CLI main function
|
|
11
|
+
*/
|
|
12
|
+
export declare function main(args: string[]): Promise<void>;
|
|
13
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EACV,YAAY,EAEZ,aAAa,EAId,MAAM,kBAAkB,CAAC;AAuI1B;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,YAAiB,GAAG,aAAa,CA0CpF;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BxD"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI entry point for vibe-check
|
|
3
|
+
*/
|
|
4
|
+
import * as fs from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { resolveFiles, readFile, getExtension } from './utils/file-reader.js';
|
|
7
|
+
import { formatResults } from './utils/reporters.js';
|
|
8
|
+
import { hooks, getHooksForFile } from './checks/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Parse command line arguments
|
|
11
|
+
*/
|
|
12
|
+
function parseArgs(args) {
|
|
13
|
+
const files = [];
|
|
14
|
+
const options = {
|
|
15
|
+
format: 'pretty',
|
|
16
|
+
failOn: 'error',
|
|
17
|
+
};
|
|
18
|
+
let i = 0;
|
|
19
|
+
while (i < args.length) {
|
|
20
|
+
const arg = args[i];
|
|
21
|
+
if (arg === '--only' && args[i + 1]) {
|
|
22
|
+
options.only = args[i + 1].split(',').map((s) => s.trim());
|
|
23
|
+
i += 2;
|
|
24
|
+
}
|
|
25
|
+
else if (arg === '--skip' && args[i + 1]) {
|
|
26
|
+
options.skip = args[i + 1].split(',').map((s) => s.trim());
|
|
27
|
+
i += 2;
|
|
28
|
+
}
|
|
29
|
+
else if (arg === '--format' && args[i + 1]) {
|
|
30
|
+
const format = args[i + 1];
|
|
31
|
+
if (['pretty', 'json', 'compact'].includes(format)) {
|
|
32
|
+
options.format = format;
|
|
33
|
+
}
|
|
34
|
+
i += 2;
|
|
35
|
+
}
|
|
36
|
+
else if (arg === '--fail-on' && args[i + 1]) {
|
|
37
|
+
const failOn = args[i + 1];
|
|
38
|
+
if (['error', 'warning', 'info', 'none'].includes(failOn)) {
|
|
39
|
+
options.failOn = failOn === 'none' ? undefined : failOn;
|
|
40
|
+
}
|
|
41
|
+
i += 2;
|
|
42
|
+
}
|
|
43
|
+
else if (arg === '--fix') {
|
|
44
|
+
options.fix = true;
|
|
45
|
+
i += 1;
|
|
46
|
+
}
|
|
47
|
+
else if (arg === '--help' || arg === '-h') {
|
|
48
|
+
printHelp();
|
|
49
|
+
process.exit(0);
|
|
50
|
+
}
|
|
51
|
+
else if (arg === '--version' || arg === '-v') {
|
|
52
|
+
const pkg = JSON.parse(fs.readFileSync(new URL('../package.json', import.meta.url), 'utf-8'));
|
|
53
|
+
console.log(`vibe-check ${pkg.version}`);
|
|
54
|
+
process.exit(0);
|
|
55
|
+
}
|
|
56
|
+
else if (!arg.startsWith('-')) {
|
|
57
|
+
files.push(arg);
|
|
58
|
+
i += 1;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
console.error(`Unknown option: ${arg}`);
|
|
62
|
+
process.exit(2);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return { files, options };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Print help message
|
|
69
|
+
*/
|
|
70
|
+
function printHelp() {
|
|
71
|
+
console.log(`
|
|
72
|
+
vibe-check - Catch common AI-generated code issues
|
|
73
|
+
|
|
74
|
+
Usage:
|
|
75
|
+
vibe-check [options] <files...>
|
|
76
|
+
|
|
77
|
+
Options:
|
|
78
|
+
--only <hooks> Only run specified hooks (comma-separated)
|
|
79
|
+
--skip <hooks> Skip specified hooks (comma-separated)
|
|
80
|
+
--format <format> Output format: pretty, json, compact (default: pretty)
|
|
81
|
+
--fail-on <level> Fail on severity level: error, warning, info, none (default: error)
|
|
82
|
+
--fix Auto-fix issues where possible
|
|
83
|
+
-h, --help Show this help message
|
|
84
|
+
-v, --version Show version
|
|
85
|
+
|
|
86
|
+
Examples:
|
|
87
|
+
vibe-check .
|
|
88
|
+
vibe-check src/
|
|
89
|
+
vibe-check --only secrets,urls .
|
|
90
|
+
vibe-check --skip any-types,snake-case .
|
|
91
|
+
vibe-check --format json .
|
|
92
|
+
|
|
93
|
+
Available hooks:
|
|
94
|
+
${hooks.map((h) => ` ${h.id.padEnd(20)} ${h.description}`).join('\n')}
|
|
95
|
+
`);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Check a single file with applicable hooks
|
|
99
|
+
*/
|
|
100
|
+
function checkFile(filePath, options) {
|
|
101
|
+
const extension = getExtension(filePath);
|
|
102
|
+
const content = readFile(filePath);
|
|
103
|
+
const context = {
|
|
104
|
+
filePath,
|
|
105
|
+
content,
|
|
106
|
+
extension,
|
|
107
|
+
};
|
|
108
|
+
// Get hooks for this file type
|
|
109
|
+
let applicableHooks = getHooksForFile(extension);
|
|
110
|
+
// Filter by --only
|
|
111
|
+
if (options.only && options.only.length > 0) {
|
|
112
|
+
applicableHooks = applicableHooks.filter((h) => options.only.includes(h.id));
|
|
113
|
+
}
|
|
114
|
+
// Filter by --skip
|
|
115
|
+
if (options.skip && options.skip.length > 0) {
|
|
116
|
+
applicableHooks = applicableHooks.filter((h) => !options.skip.includes(h.id));
|
|
117
|
+
}
|
|
118
|
+
// Run all applicable hooks
|
|
119
|
+
const issues = [];
|
|
120
|
+
for (const hook of applicableHooks) {
|
|
121
|
+
try {
|
|
122
|
+
const hookIssues = hook.check(context);
|
|
123
|
+
issues.push(...hookIssues);
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
// Skip hooks that fail - don't crash the whole check
|
|
127
|
+
console.error(`Warning: Hook "${hook.id}" failed on ${filePath}: ${error}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Sort issues by line number
|
|
131
|
+
issues.sort((a, b) => a.line - b.line);
|
|
132
|
+
return {
|
|
133
|
+
filePath: path.relative(process.cwd(), filePath),
|
|
134
|
+
issues,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Main vibe-check function
|
|
139
|
+
*/
|
|
140
|
+
export function vibeCheck(files, options = {}) {
|
|
141
|
+
const resolvedFiles = resolveFiles(files);
|
|
142
|
+
const results = [];
|
|
143
|
+
for (const file of resolvedFiles) {
|
|
144
|
+
const result = checkFile(file, options);
|
|
145
|
+
results.push(result);
|
|
146
|
+
}
|
|
147
|
+
// Calculate summary
|
|
148
|
+
let errorCount = 0;
|
|
149
|
+
let warningCount = 0;
|
|
150
|
+
let infoCount = 0;
|
|
151
|
+
let filesWithIssues = 0;
|
|
152
|
+
for (const result of results) {
|
|
153
|
+
if (result.issues.length > 0) {
|
|
154
|
+
filesWithIssues++;
|
|
155
|
+
}
|
|
156
|
+
for (const issue of result.issues) {
|
|
157
|
+
switch (issue.severity) {
|
|
158
|
+
case 'error':
|
|
159
|
+
errorCount++;
|
|
160
|
+
break;
|
|
161
|
+
case 'warning':
|
|
162
|
+
warningCount++;
|
|
163
|
+
break;
|
|
164
|
+
case 'info':
|
|
165
|
+
infoCount++;
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
filesChecked: resolvedFiles.length,
|
|
172
|
+
filesWithIssues,
|
|
173
|
+
errorCount,
|
|
174
|
+
warningCount,
|
|
175
|
+
infoCount,
|
|
176
|
+
results,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* CLI main function
|
|
181
|
+
*/
|
|
182
|
+
export async function main(args) {
|
|
183
|
+
const { files, options } = parseArgs(args);
|
|
184
|
+
if (files.length === 0) {
|
|
185
|
+
console.error('Error: No files specified. Use "vibe-check ." to check current directory.');
|
|
186
|
+
process.exit(2);
|
|
187
|
+
}
|
|
188
|
+
const summary = vibeCheck(files, options);
|
|
189
|
+
const output = formatResults(summary, options.format || 'pretty');
|
|
190
|
+
console.log(output);
|
|
191
|
+
// Determine exit code based on --fail-on
|
|
192
|
+
if (options.failOn) {
|
|
193
|
+
const severityOrder = ['error', 'warning', 'info'];
|
|
194
|
+
const failIndex = severityOrder.indexOf(options.failOn);
|
|
195
|
+
let shouldFail = false;
|
|
196
|
+
if (failIndex <= 0 && summary.errorCount > 0)
|
|
197
|
+
shouldFail = true;
|
|
198
|
+
if (failIndex <= 1 && summary.warningCount > 0)
|
|
199
|
+
shouldFail = true;
|
|
200
|
+
if (failIndex <= 2 && summary.infoCount > 0)
|
|
201
|
+
shouldFail = true;
|
|
202
|
+
if (shouldFail) {
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
process.exit(0);
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentic-loop
|
|
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 './checks/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,mBAAmB,CAAC;AAG3B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agentic-loop
|
|
3
|
+
*
|
|
4
|
+
* Catch common AI-generated code issues before they hit your codebase.
|
|
5
|
+
*/
|
|
6
|
+
// Export hooks
|
|
7
|
+
export { hooks, getHook, getHooksForFile, getHookIds, } from './checks/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,mBAAmB,CAAC;AAE3B,6BAA6B;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,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 (with size limit to prevent OOM)
|
|
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;AAKD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMjD"}
|
|
@@ -0,0 +1,146 @@
|
|
|
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
|
+
// Max file size to read (10MB) - prevents OOM on huge files
|
|
135
|
+
const MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
136
|
+
/**
|
|
137
|
+
* Read file content (with size limit to prevent OOM)
|
|
138
|
+
*/
|
|
139
|
+
export function readFile(filePath) {
|
|
140
|
+
const stats = fs.statSync(filePath);
|
|
141
|
+
if (stats.size > MAX_FILE_SIZE) {
|
|
142
|
+
throw new Error(`File too large (${Math.round(stats.size / 1024 / 1024)}MB > 10MB limit): ${filePath}`);
|
|
143
|
+
}
|
|
144
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
145
|
+
}
|
|
146
|
+
//# 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"}
|