prism-pr 1.0.0-alpha.47
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/README.md +964 -0
- package/bin/run.js +9 -0
- package/dist/ai/agents/architecture-reviewer.d.ts +3 -0
- package/dist/ai/agents/architecture-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/architecture-reviewer.js +67 -0
- package/dist/ai/agents/architecture-reviewer.js.map +1 -0
- package/dist/ai/agents/blade-reviewer.d.ts +3 -0
- package/dist/ai/agents/blade-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/blade-reviewer.js +59 -0
- package/dist/ai/agents/blade-reviewer.js.map +1 -0
- package/dist/ai/agents/config-reviewer.d.ts +3 -0
- package/dist/ai/agents/config-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/config-reviewer.js +106 -0
- package/dist/ai/agents/config-reviewer.js.map +1 -0
- package/dist/ai/agents/csharp-reviewer.d.ts +3 -0
- package/dist/ai/agents/csharp-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/csharp-reviewer.js +59 -0
- package/dist/ai/agents/csharp-reviewer.js.map +1 -0
- package/dist/ai/agents/css-reviewer.d.ts +3 -0
- package/dist/ai/agents/css-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/css-reviewer.js +65 -0
- package/dist/ai/agents/css-reviewer.js.map +1 -0
- package/dist/ai/agents/framework-rules/index.d.ts +33 -0
- package/dist/ai/agents/framework-rules/index.d.ts.map +1 -0
- package/dist/ai/agents/framework-rules/index.js +67 -0
- package/dist/ai/agents/framework-rules/index.js.map +1 -0
- package/dist/ai/agents/framework-rules/normalize.d.ts +40 -0
- package/dist/ai/agents/framework-rules/normalize.d.ts.map +1 -0
- package/dist/ai/agents/framework-rules/normalize.js +102 -0
- package/dist/ai/agents/framework-rules/normalize.js.map +1 -0
- package/dist/ai/agents/framework-rules/routing-map.d.ts +3 -0
- package/dist/ai/agents/framework-rules/routing-map.d.ts.map +1 -0
- package/dist/ai/agents/framework-rules/routing-map.js +15 -0
- package/dist/ai/agents/framework-rules/routing-map.js.map +1 -0
- package/dist/ai/agents/html-reviewer.d.ts +3 -0
- package/dist/ai/agents/html-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/html-reviewer.js +61 -0
- package/dist/ai/agents/html-reviewer.js.map +1 -0
- package/dist/ai/agents/performance-reviewer.d.ts +3 -0
- package/dist/ai/agents/performance-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/performance-reviewer.js +60 -0
- package/dist/ai/agents/performance-reviewer.js.map +1 -0
- package/dist/ai/agents/php-reviewer.d.ts +3 -0
- package/dist/ai/agents/php-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/php-reviewer.js +62 -0
- package/dist/ai/agents/php-reviewer.js.map +1 -0
- package/dist/ai/agents/prompts/architecture-reviewer.txt +39 -0
- package/dist/ai/agents/prompts/blade-reviewer.txt +39 -0
- package/dist/ai/agents/prompts/config-reviewer.txt +47 -0
- package/dist/ai/agents/prompts/csharp-reviewer.txt +39 -0
- package/dist/ai/agents/prompts/css-reviewer.txt +41 -0
- package/dist/ai/agents/prompts/html-reviewer.txt +43 -0
- package/dist/ai/agents/prompts/performance-reviewer.txt +38 -0
- package/dist/ai/agents/prompts/php-reviewer.txt +87 -0
- package/dist/ai/agents/prompts/python-reviewer.txt +42 -0
- package/dist/ai/agents/prompts/security-reviewer.txt +36 -0
- package/dist/ai/agents/prompts/sql-reviewer.txt +43 -0
- package/dist/ai/agents/prompts/testing-reviewer.txt +38 -0
- package/dist/ai/agents/prompts/ts-reviewer.txt +54 -0
- package/dist/ai/agents/prompts/ux-text-reviewer.txt +68 -0
- package/dist/ai/agents/python-reviewer.d.ts +3 -0
- package/dist/ai/agents/python-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/python-reviewer.js +59 -0
- package/dist/ai/agents/python-reviewer.js.map +1 -0
- package/dist/ai/agents/registry.d.ts +20 -0
- package/dist/ai/agents/registry.d.ts.map +1 -0
- package/dist/ai/agents/registry.js +65 -0
- package/dist/ai/agents/registry.js.map +1 -0
- package/dist/ai/agents/security-reviewer.d.ts +3 -0
- package/dist/ai/agents/security-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/security-reviewer.js +69 -0
- package/dist/ai/agents/security-reviewer.js.map +1 -0
- package/dist/ai/agents/shared/content-builder.d.ts +14 -0
- package/dist/ai/agents/shared/content-builder.d.ts.map +1 -0
- package/dist/ai/agents/shared/content-builder.js +158 -0
- package/dist/ai/agents/shared/content-builder.js.map +1 -0
- package/dist/ai/agents/shared/finding-schema.d.ts +54 -0
- package/dist/ai/agents/shared/finding-schema.d.ts.map +1 -0
- package/dist/ai/agents/shared/finding-schema.js +65 -0
- package/dist/ai/agents/shared/finding-schema.js.map +1 -0
- package/dist/ai/agents/shared/line-validator.d.ts +8 -0
- package/dist/ai/agents/shared/line-validator.d.ts.map +1 -0
- package/dist/ai/agents/shared/line-validator.js +12 -0
- package/dist/ai/agents/shared/line-validator.js.map +1 -0
- package/dist/ai/agents/shared/prompt-builder.d.ts +3 -0
- package/dist/ai/agents/shared/prompt-builder.d.ts.map +1 -0
- package/dist/ai/agents/shared/prompt-builder.js +68 -0
- package/dist/ai/agents/shared/prompt-builder.js.map +1 -0
- package/dist/ai/agents/sql-reviewer.d.ts +3 -0
- package/dist/ai/agents/sql-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/sql-reviewer.js +61 -0
- package/dist/ai/agents/sql-reviewer.js.map +1 -0
- package/dist/ai/agents/testing-reviewer.d.ts +3 -0
- package/dist/ai/agents/testing-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/testing-reviewer.js +80 -0
- package/dist/ai/agents/testing-reviewer.js.map +1 -0
- package/dist/ai/agents/ts-reviewer.d.ts +3 -0
- package/dist/ai/agents/ts-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/ts-reviewer.js +63 -0
- package/dist/ai/agents/ts-reviewer.js.map +1 -0
- package/dist/ai/agents/ux-text-reviewer.d.ts +3 -0
- package/dist/ai/agents/ux-text-reviewer.d.ts.map +1 -0
- package/dist/ai/agents/ux-text-reviewer.js +116 -0
- package/dist/ai/agents/ux-text-reviewer.js.map +1 -0
- package/dist/ai/orchestrator/agent-classifier.d.ts +28 -0
- package/dist/ai/orchestrator/agent-classifier.d.ts.map +1 -0
- package/dist/ai/orchestrator/agent-classifier.js +137 -0
- package/dist/ai/orchestrator/agent-classifier.js.map +1 -0
- package/dist/ai/orchestrator/consolidation.d.ts +12 -0
- package/dist/ai/orchestrator/consolidation.d.ts.map +1 -0
- package/dist/ai/orchestrator/consolidation.js +34 -0
- package/dist/ai/orchestrator/consolidation.js.map +1 -0
- package/dist/ai/orchestrator/context-analyzer.d.ts +47 -0
- package/dist/ai/orchestrator/context-analyzer.d.ts.map +1 -0
- package/dist/ai/orchestrator/context-analyzer.js +368 -0
- package/dist/ai/orchestrator/context-analyzer.js.map +1 -0
- package/dist/ai/orchestrator/deduplicator.d.ts +43 -0
- package/dist/ai/orchestrator/deduplicator.d.ts.map +1 -0
- package/dist/ai/orchestrator/deduplicator.js +97 -0
- package/dist/ai/orchestrator/deduplicator.js.map +1 -0
- package/dist/ai/orchestrator/orchestrator.d.ts +57 -0
- package/dist/ai/orchestrator/orchestrator.d.ts.map +1 -0
- package/dist/ai/orchestrator/orchestrator.js +181 -0
- package/dist/ai/orchestrator/orchestrator.js.map +1 -0
- package/dist/ai/orchestrator/rule-based-strategy.d.ts +20 -0
- package/dist/ai/orchestrator/rule-based-strategy.d.ts.map +1 -0
- package/dist/ai/orchestrator/rule-based-strategy.js +55 -0
- package/dist/ai/orchestrator/rule-based-strategy.js.map +1 -0
- package/dist/ai/orchestrator/semaphore.d.ts +25 -0
- package/dist/ai/orchestrator/semaphore.d.ts.map +1 -0
- package/dist/ai/orchestrator/semaphore.js +52 -0
- package/dist/ai/orchestrator/semaphore.js.map +1 -0
- package/dist/ai/orchestrator/severity-pipeline.d.ts +21 -0
- package/dist/ai/orchestrator/severity-pipeline.d.ts.map +1 -0
- package/dist/ai/orchestrator/severity-pipeline.js +69 -0
- package/dist/ai/orchestrator/severity-pipeline.js.map +1 -0
- package/dist/ai/orchestrator/strategy.d.ts +20 -0
- package/dist/ai/orchestrator/strategy.d.ts.map +1 -0
- package/dist/ai/orchestrator/strategy.js +2 -0
- package/dist/ai/orchestrator/strategy.js.map +1 -0
- package/dist/ai/providers/anthropic-provider.d.ts +14 -0
- package/dist/ai/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/ai/providers/anthropic-provider.js +108 -0
- package/dist/ai/providers/anthropic-provider.js.map +1 -0
- package/dist/ai/providers/claude-code-provider.d.ts +12 -0
- package/dist/ai/providers/claude-code-provider.d.ts.map +1 -0
- package/dist/ai/providers/claude-code-provider.js +103 -0
- package/dist/ai/providers/claude-code-provider.js.map +1 -0
- package/dist/ai/providers/errors.d.ts +22 -0
- package/dist/ai/providers/errors.d.ts.map +1 -0
- package/dist/ai/providers/errors.js +44 -0
- package/dist/ai/providers/errors.js.map +1 -0
- package/dist/ai/skills/skill-registry.d.ts +21 -0
- package/dist/ai/skills/skill-registry.d.ts.map +1 -0
- package/dist/ai/skills/skill-registry.js +27 -0
- package/dist/ai/skills/skill-registry.js.map +1 -0
- package/dist/ai/text-extractor/extractor.d.ts +15 -0
- package/dist/ai/text-extractor/extractor.d.ts.map +1 -0
- package/dist/ai/text-extractor/extractor.js +63 -0
- package/dist/ai/text-extractor/extractor.js.map +1 -0
- package/dist/ai/text-extractor/index.d.ts +4 -0
- package/dist/ai/text-extractor/index.d.ts.map +1 -0
- package/dist/ai/text-extractor/index.js +3 -0
- package/dist/ai/text-extractor/index.js.map +1 -0
- package/dist/ai/text-extractor/patterns.d.ts +21 -0
- package/dist/ai/text-extractor/patterns.d.ts.map +1 -0
- package/dist/ai/text-extractor/patterns.js +169 -0
- package/dist/ai/text-extractor/patterns.js.map +1 -0
- package/dist/ai/text-extractor/types.d.ts +47 -0
- package/dist/ai/text-extractor/types.d.ts.map +1 -0
- package/dist/ai/text-extractor/types.js +2 -0
- package/dist/ai/text-extractor/types.js.map +1 -0
- package/dist/bitbucket/client.d.ts +38 -0
- package/dist/bitbucket/client.d.ts.map +1 -0
- package/dist/bitbucket/client.js +448 -0
- package/dist/bitbucket/client.js.map +1 -0
- package/dist/bitbucket/errors.d.ts +75 -0
- package/dist/bitbucket/errors.d.ts.map +1 -0
- package/dist/bitbucket/errors.js +127 -0
- package/dist/bitbucket/errors.js.map +1 -0
- package/dist/bitbucket/mappers.d.ts +3 -0
- package/dist/bitbucket/mappers.d.ts.map +1 -0
- package/dist/bitbucket/mappers.js +14 -0
- package/dist/bitbucket/mappers.js.map +1 -0
- package/dist/commands/guard/check.d.ts +19 -0
- package/dist/commands/guard/check.d.ts.map +1 -0
- package/dist/commands/guard/check.js +224 -0
- package/dist/commands/guard/check.js.map +1 -0
- package/dist/commands/guard/index.d.ts +7 -0
- package/dist/commands/guard/index.d.ts.map +1 -0
- package/dist/commands/guard/index.js +65 -0
- package/dist/commands/guard/index.js.map +1 -0
- package/dist/commands/interactive.d.ts +10 -0
- package/dist/commands/interactive.d.ts.map +1 -0
- package/dist/commands/interactive.js +88 -0
- package/dist/commands/interactive.js.map +1 -0
- package/dist/commands/login.d.ts +35 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +164 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +12 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +23 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/review/start.d.ts +22 -0
- package/dist/commands/review/start.d.ts.map +1 -0
- package/dist/commands/review/start.js +120 -0
- package/dist/commands/review/start.js.map +1 -0
- package/dist/commands/rules/push.d.ts +13 -0
- package/dist/commands/rules/push.d.ts.map +1 -0
- package/dist/commands/rules/push.js +75 -0
- package/dist/commands/rules/push.js.map +1 -0
- package/dist/commands/rules/stats.d.ts +14 -0
- package/dist/commands/rules/stats.d.ts.map +1 -0
- package/dist/commands/rules/stats.js +101 -0
- package/dist/commands/rules/stats.js.map +1 -0
- package/dist/commands/rules/sync.d.ts +15 -0
- package/dist/commands/rules/sync.d.ts.map +1 -0
- package/dist/commands/rules/sync.js +144 -0
- package/dist/commands/rules/sync.js.map +1 -0
- package/dist/config/config-manager.d.ts +14 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +85 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/convention-builder.d.ts +13 -0
- package/dist/config/convention-builder.d.ts.map +1 -0
- package/dist/config/convention-builder.js +31 -0
- package/dist/config/convention-builder.js.map +1 -0
- package/dist/config/credentials.d.ts +14 -0
- package/dist/config/credentials.d.ts.map +1 -0
- package/dist/config/credentials.js +85 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/encryption.d.ts +20 -0
- package/dist/config/encryption.d.ts.map +1 -0
- package/dist/config/encryption.js +94 -0
- package/dist/config/encryption.js.map +1 -0
- package/dist/config/repo-config-loader.d.ts +34 -0
- package/dist/config/repo-config-loader.d.ts.map +1 -0
- package/dist/config/repo-config-loader.js +103 -0
- package/dist/config/repo-config-loader.js.map +1 -0
- package/dist/core/cli-workflow-callbacks.d.ts +35 -0
- package/dist/core/cli-workflow-callbacks.d.ts.map +1 -0
- package/dist/core/cli-workflow-callbacks.js +141 -0
- package/dist/core/cli-workflow-callbacks.js.map +1 -0
- package/dist/core/comment-publisher.d.ts +61 -0
- package/dist/core/comment-publisher.d.ts.map +1 -0
- package/dist/core/comment-publisher.js +172 -0
- package/dist/core/comment-publisher.js.map +1 -0
- package/dist/core/integrity-checker.d.ts +22 -0
- package/dist/core/integrity-checker.d.ts.map +1 -0
- package/dist/core/integrity-checker.js +83 -0
- package/dist/core/integrity-checker.js.map +1 -0
- package/dist/core/review-workflow.d.ts +34 -0
- package/dist/core/review-workflow.d.ts.map +1 -0
- package/dist/core/review-workflow.js +21 -0
- package/dist/core/review-workflow.js.map +1 -0
- package/dist/core/session-manager.d.ts +107 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +164 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/workflow-callbacks.d.ts +74 -0
- package/dist/core/workflow-callbacks.d.ts.map +1 -0
- package/dist/core/workflow-callbacks.js +2 -0
- package/dist/core/workflow-callbacks.js.map +1 -0
- package/dist/core/workflow-engine.d.ts +48 -0
- package/dist/core/workflow-engine.d.ts.map +1 -0
- package/dist/core/workflow-engine.js +442 -0
- package/dist/core/workflow-engine.js.map +1 -0
- package/dist/errors/base.d.ts +6 -0
- package/dist/errors/base.d.ts.map +1 -0
- package/dist/errors/base.js +13 -0
- package/dist/errors/base.js.map +1 -0
- package/dist/errors/config-error.d.ts +5 -0
- package/dist/errors/config-error.d.ts.map +1 -0
- package/dist/errors/config-error.js +9 -0
- package/dist/errors/config-error.js.map +1 -0
- package/dist/errors/index.d.ts +5 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +5 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/validation-error.d.ts +5 -0
- package/dist/errors/validation-error.d.ts.map +1 -0
- package/dist/errors/validation-error.js +9 -0
- package/dist/errors/validation-error.js.map +1 -0
- package/dist/errors/workflow-error.d.ts +6 -0
- package/dist/errors/workflow-error.d.ts.map +1 -0
- package/dist/errors/workflow-error.js +11 -0
- package/dist/errors/workflow-error.js.map +1 -0
- package/dist/guard/ast-grep-strategy.d.ts +25 -0
- package/dist/guard/ast-grep-strategy.d.ts.map +1 -0
- package/dist/guard/ast-grep-strategy.js +112 -0
- package/dist/guard/ast-grep-strategy.js.map +1 -0
- package/dist/guard/diff-pattern-matcher.d.ts +52 -0
- package/dist/guard/diff-pattern-matcher.d.ts.map +1 -0
- package/dist/guard/diff-pattern-matcher.js +325 -0
- package/dist/guard/diff-pattern-matcher.js.map +1 -0
- package/dist/guard/file-fetcher.d.ts +3 -0
- package/dist/guard/file-fetcher.d.ts.map +1 -0
- package/dist/guard/file-fetcher.js +21 -0
- package/dist/guard/file-fetcher.js.map +1 -0
- package/dist/guard/guard-engine.d.ts +8 -0
- package/dist/guard/guard-engine.d.ts.map +1 -0
- package/dist/guard/guard-engine.js +78 -0
- package/dist/guard/guard-engine.js.map +1 -0
- package/dist/guard/match-strategy.d.ts +14 -0
- package/dist/guard/match-strategy.d.ts.map +1 -0
- package/dist/guard/match-strategy.js +7 -0
- package/dist/guard/match-strategy.js.map +1 -0
- package/dist/guard/patterns-loader.d.ts +16 -0
- package/dist/guard/patterns-loader.d.ts.map +1 -0
- package/dist/guard/patterns-loader.js +61 -0
- package/dist/guard/patterns-loader.js.map +1 -0
- package/dist/guard/types.d.ts +61 -0
- package/dist/guard/types.d.ts.map +1 -0
- package/dist/guard/types.js +2 -0
- package/dist/guard/types.js.map +1 -0
- package/dist/memory/engram-client.d.ts +15 -0
- package/dist/memory/engram-client.d.ts.map +1 -0
- package/dist/memory/engram-client.js +167 -0
- package/dist/memory/engram-client.js.map +1 -0
- package/dist/memory/review-memory-service.d.ts +13 -0
- package/dist/memory/review-memory-service.d.ts.map +1 -0
- package/dist/memory/review-memory-service.js +43 -0
- package/dist/memory/review-memory-service.js.map +1 -0
- package/dist/persistence/database.d.ts +8 -0
- package/dist/persistence/database.d.ts.map +1 -0
- package/dist/persistence/database.js +58 -0
- package/dist/persistence/database.js.map +1 -0
- package/dist/persistence/false-positive-repository.d.ts +12 -0
- package/dist/persistence/false-positive-repository.d.ts.map +1 -0
- package/dist/persistence/false-positive-repository.js +58 -0
- package/dist/persistence/false-positive-repository.js.map +1 -0
- package/dist/persistence/migrations/0000_peaceful_blur.sql +66 -0
- package/dist/persistence/migrations/0001_phase3a_schema.sql +15 -0
- package/dist/persistence/migrations/0002_stack_profile.sql +1 -0
- package/dist/persistence/migrations/0003_known_workspaces.sql +5 -0
- package/dist/persistence/migrations/0004_review_memory.sql +24 -0
- package/dist/persistence/migrations/meta/0000_snapshot.json +468 -0
- package/dist/persistence/migrations/meta/_journal.json +41 -0
- package/dist/persistence/profile-repository.d.ts +33 -0
- package/dist/persistence/profile-repository.d.ts.map +1 -0
- package/dist/persistence/profile-repository.js +94 -0
- package/dist/persistence/profile-repository.js.map +1 -0
- package/dist/persistence/repository.d.ts +70 -0
- package/dist/persistence/repository.d.ts.map +1 -0
- package/dist/persistence/repository.js +225 -0
- package/dist/persistence/repository.js.map +1 -0
- package/dist/persistence/schema.d.ts +1333 -0
- package/dist/persistence/schema.d.ts.map +1 -0
- package/dist/persistence/schema.js +92 -0
- package/dist/persistence/schema.js.map +1 -0
- package/dist/persistence/workspace-repository.d.ts +14 -0
- package/dist/persistence/workspace-repository.d.ts.map +1 -0
- package/dist/persistence/workspace-repository.js +30 -0
- package/dist/persistence/workspace-repository.js.map +1 -0
- package/dist/rules-engine/finding-aggregator.d.ts +13 -0
- package/dist/rules-engine/finding-aggregator.d.ts.map +1 -0
- package/dist/rules-engine/finding-aggregator.js +135 -0
- package/dist/rules-engine/finding-aggregator.js.map +1 -0
- package/dist/rules-engine/pattern-generator.d.ts +26 -0
- package/dist/rules-engine/pattern-generator.d.ts.map +1 -0
- package/dist/rules-engine/pattern-generator.js +116 -0
- package/dist/rules-engine/pattern-generator.js.map +1 -0
- package/dist/rules-engine/rule-prompt-builder.d.ts +32 -0
- package/dist/rules-engine/rule-prompt-builder.d.ts.map +1 -0
- package/dist/rules-engine/rule-prompt-builder.js +124 -0
- package/dist/rules-engine/rule-prompt-builder.js.map +1 -0
- package/dist/rules-engine/types.d.ts +80 -0
- package/dist/rules-engine/types.d.ts.map +1 -0
- package/dist/rules-engine/types.js +18 -0
- package/dist/rules-engine/types.js.map +1 -0
- package/dist/rules-repo/rules-cache.d.ts +14 -0
- package/dist/rules-repo/rules-cache.d.ts.map +1 -0
- package/dist/rules-repo/rules-cache.js +43 -0
- package/dist/rules-repo/rules-cache.js.map +1 -0
- package/dist/rules-repo/rules-repo-client.d.ts +27 -0
- package/dist/rules-repo/rules-repo-client.d.ts.map +1 -0
- package/dist/rules-repo/rules-repo-client.js +85 -0
- package/dist/rules-repo/rules-repo-client.js.map +1 -0
- package/dist/rules-repo/types.d.ts +16 -0
- package/dist/rules-repo/types.d.ts.map +1 -0
- package/dist/rules-repo/types.js +10 -0
- package/dist/rules-repo/types.js.map +1 -0
- package/dist/stack-detector/ai-stack-fallback.d.ts +12 -0
- package/dist/stack-detector/ai-stack-fallback.d.ts.map +1 -0
- package/dist/stack-detector/ai-stack-fallback.js +67 -0
- package/dist/stack-detector/ai-stack-fallback.js.map +1 -0
- package/dist/stack-detector/ai-stack-schema.d.ts +28 -0
- package/dist/stack-detector/ai-stack-schema.d.ts.map +1 -0
- package/dist/stack-detector/ai-stack-schema.js +13 -0
- package/dist/stack-detector/ai-stack-schema.js.map +1 -0
- package/dist/stack-detector/formatter.d.ts +7 -0
- package/dist/stack-detector/formatter.d.ts.map +1 -0
- package/dist/stack-detector/formatter.js +37 -0
- package/dist/stack-detector/formatter.js.map +1 -0
- package/dist/stack-detector/index.d.ts +7 -0
- package/dist/stack-detector/index.d.ts.map +1 -0
- package/dist/stack-detector/index.js +5 -0
- package/dist/stack-detector/index.js.map +1 -0
- package/dist/stack-detector/merge-profiles.d.ts +5 -0
- package/dist/stack-detector/merge-profiles.d.ts.map +1 -0
- package/dist/stack-detector/merge-profiles.js +36 -0
- package/dist/stack-detector/merge-profiles.js.map +1 -0
- package/dist/stack-detector/parsers.d.ts +12 -0
- package/dist/stack-detector/parsers.d.ts.map +1 -0
- package/dist/stack-detector/parsers.js +259 -0
- package/dist/stack-detector/parsers.js.map +1 -0
- package/dist/stack-detector/stack-detector.d.ts +11 -0
- package/dist/stack-detector/stack-detector.d.ts.map +1 -0
- package/dist/stack-detector/stack-detector.js +83 -0
- package/dist/stack-detector/stack-detector.js.map +1 -0
- package/dist/stack-detector/types.d.ts +13 -0
- package/dist/stack-detector/types.d.ts.map +1 -0
- package/dist/stack-detector/types.js +2 -0
- package/dist/stack-detector/types.js.map +1 -0
- package/dist/tui/app.d.ts +9 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +45 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/callbacks/tui-workflow-callbacks.d.ts +32 -0
- package/dist/tui/callbacks/tui-workflow-callbacks.d.ts.map +1 -0
- package/dist/tui/callbacks/tui-workflow-callbacks.js +88 -0
- package/dist/tui/callbacks/tui-workflow-callbacks.js.map +1 -0
- package/dist/tui/components/key-hint.d.ts +7 -0
- package/dist/tui/components/key-hint.d.ts.map +1 -0
- package/dist/tui/components/key-hint.js +6 -0
- package/dist/tui/components/key-hint.js.map +1 -0
- package/dist/tui/components/scroll-list.d.ts +20 -0
- package/dist/tui/components/scroll-list.d.ts.map +1 -0
- package/dist/tui/components/scroll-list.js +85 -0
- package/dist/tui/components/scroll-list.js.map +1 -0
- package/dist/tui/components/searchable-list.d.ts +15 -0
- package/dist/tui/components/searchable-list.d.ts.map +1 -0
- package/dist/tui/components/searchable-list.js +97 -0
- package/dist/tui/components/searchable-list.js.map +1 -0
- package/dist/tui/components/severity-badge.d.ts +6 -0
- package/dist/tui/components/severity-badge.d.ts.map +1 -0
- package/dist/tui/components/severity-badge.js +17 -0
- package/dist/tui/components/severity-badge.js.map +1 -0
- package/dist/tui/components/severity-selector.d.ts +9 -0
- package/dist/tui/components/severity-selector.d.ts.map +1 -0
- package/dist/tui/components/severity-selector.js +29 -0
- package/dist/tui/components/severity-selector.js.map +1 -0
- package/dist/tui/components/spinner.d.ts +6 -0
- package/dist/tui/components/spinner.d.ts.map +1 -0
- package/dist/tui/components/spinner.js +19 -0
- package/dist/tui/components/spinner.js.map +1 -0
- package/dist/tui/components/status-bar.d.ts +10 -0
- package/dist/tui/components/status-bar.d.ts.map +1 -0
- package/dist/tui/components/status-bar.js +7 -0
- package/dist/tui/components/status-bar.js.map +1 -0
- package/dist/tui/deps-context.d.ts +27 -0
- package/dist/tui/deps-context.d.ts.map +1 -0
- package/dist/tui/deps-context.js +9 -0
- package/dist/tui/deps-context.js.map +1 -0
- package/dist/tui/error-boundary.d.ts +16 -0
- package/dist/tui/error-boundary.d.ts.map +1 -0
- package/dist/tui/error-boundary.js +30 -0
- package/dist/tui/error-boundary.js.map +1 -0
- package/dist/tui/hooks/use-agent-recommendations.d.ts +10 -0
- package/dist/tui/hooks/use-agent-recommendations.d.ts.map +1 -0
- package/dist/tui/hooks/use-agent-recommendations.js +66 -0
- package/dist/tui/hooks/use-agent-recommendations.js.map +1 -0
- package/dist/tui/hooks/use-auth.d.ts +14 -0
- package/dist/tui/hooks/use-auth.d.ts.map +1 -0
- package/dist/tui/hooks/use-auth.js +32 -0
- package/dist/tui/hooks/use-auth.js.map +1 -0
- package/dist/tui/hooks/use-bitbucket.d.ts +18 -0
- package/dist/tui/hooks/use-bitbucket.d.ts.map +1 -0
- package/dist/tui/hooks/use-bitbucket.js +31 -0
- package/dist/tui/hooks/use-bitbucket.js.map +1 -0
- package/dist/tui/hooks/use-review.d.ts +6 -0
- package/dist/tui/hooks/use-review.d.ts.map +1 -0
- package/dist/tui/hooks/use-review.js +24 -0
- package/dist/tui/hooks/use-review.js.map +1 -0
- package/dist/tui/hooks/use-session.d.ts +47 -0
- package/dist/tui/hooks/use-session.d.ts.map +1 -0
- package/dist/tui/hooks/use-session.js +17 -0
- package/dist/tui/hooks/use-session.js.map +1 -0
- package/dist/tui/screen-router.d.ts +3 -0
- package/dist/tui/screen-router.d.ts.map +1 -0
- package/dist/tui/screen-router.js +73 -0
- package/dist/tui/screen-router.js.map +1 -0
- package/dist/tui/screens/agent-select.d.ts +3 -0
- package/dist/tui/screens/agent-select.d.ts.map +1 -0
- package/dist/tui/screens/agent-select.js +173 -0
- package/dist/tui/screens/agent-select.js.map +1 -0
- package/dist/tui/screens/finding-detail.d.ts +3 -0
- package/dist/tui/screens/finding-detail.d.ts.map +1 -0
- package/dist/tui/screens/finding-detail.js +48 -0
- package/dist/tui/screens/finding-detail.js.map +1 -0
- package/dist/tui/screens/findings-list.d.ts +3 -0
- package/dist/tui/screens/findings-list.d.ts.map +1 -0
- package/dist/tui/screens/findings-list.js +108 -0
- package/dist/tui/screens/findings-list.js.map +1 -0
- package/dist/tui/screens/guard-detail.d.ts +3 -0
- package/dist/tui/screens/guard-detail.d.ts.map +1 -0
- package/dist/tui/screens/guard-detail.js +41 -0
- package/dist/tui/screens/guard-detail.js.map +1 -0
- package/dist/tui/screens/guard-home.d.ts +3 -0
- package/dist/tui/screens/guard-home.d.ts.map +1 -0
- package/dist/tui/screens/guard-home.js +81 -0
- package/dist/tui/screens/guard-home.js.map +1 -0
- package/dist/tui/screens/guard-results.d.ts +3 -0
- package/dist/tui/screens/guard-results.d.ts.map +1 -0
- package/dist/tui/screens/guard-results.js +103 -0
- package/dist/tui/screens/guard-results.js.map +1 -0
- package/dist/tui/screens/guard-running.d.ts +3 -0
- package/dist/tui/screens/guard-running.d.ts.map +1 -0
- package/dist/tui/screens/guard-running.js +92 -0
- package/dist/tui/screens/guard-running.js.map +1 -0
- package/dist/tui/screens/home.d.ts +3 -0
- package/dist/tui/screens/home.d.ts.map +1 -0
- package/dist/tui/screens/home.js +44 -0
- package/dist/tui/screens/home.js.map +1 -0
- package/dist/tui/screens/integrity-report.d.ts +3 -0
- package/dist/tui/screens/integrity-report.d.ts.map +1 -0
- package/dist/tui/screens/integrity-report.js +29 -0
- package/dist/tui/screens/integrity-report.js.map +1 -0
- package/dist/tui/screens/login.d.ts +3 -0
- package/dist/tui/screens/login.d.ts.map +1 -0
- package/dist/tui/screens/login.js +81 -0
- package/dist/tui/screens/login.js.map +1 -0
- package/dist/tui/screens/pr-list.d.ts +3 -0
- package/dist/tui/screens/pr-list.d.ts.map +1 -0
- package/dist/tui/screens/pr-list.js +76 -0
- package/dist/tui/screens/pr-list.js.map +1 -0
- package/dist/tui/screens/publish-confirm.d.ts +3 -0
- package/dist/tui/screens/publish-confirm.d.ts.map +1 -0
- package/dist/tui/screens/publish-confirm.js +42 -0
- package/dist/tui/screens/publish-confirm.js.map +1 -0
- package/dist/tui/screens/publishing.d.ts +3 -0
- package/dist/tui/screens/publishing.d.ts.map +1 -0
- package/dist/tui/screens/publishing.js +50 -0
- package/dist/tui/screens/publishing.js.map +1 -0
- package/dist/tui/screens/repo-select.d.ts +3 -0
- package/dist/tui/screens/repo-select.d.ts.map +1 -0
- package/dist/tui/screens/repo-select.js +76 -0
- package/dist/tui/screens/repo-select.js.map +1 -0
- package/dist/tui/screens/review-running.d.ts +3 -0
- package/dist/tui/screens/review-running.d.ts.map +1 -0
- package/dist/tui/screens/review-running.js +187 -0
- package/dist/tui/screens/review-running.js.map +1 -0
- package/dist/tui/screens/session-detail.d.ts +7 -0
- package/dist/tui/screens/session-detail.d.ts.map +1 -0
- package/dist/tui/screens/session-detail.js +28 -0
- package/dist/tui/screens/session-detail.js.map +1 -0
- package/dist/tui/screens/session-list.d.ts +7 -0
- package/dist/tui/screens/session-list.d.ts.map +1 -0
- package/dist/tui/screens/session-list.js +38 -0
- package/dist/tui/screens/session-list.js.map +1 -0
- package/dist/tui/screens/url-input.d.ts +3 -0
- package/dist/tui/screens/url-input.d.ts.map +1 -0
- package/dist/tui/screens/url-input.js +111 -0
- package/dist/tui/screens/url-input.js.map +1 -0
- package/dist/tui/screens/welcome.d.ts +3 -0
- package/dist/tui/screens/welcome.d.ts.map +1 -0
- package/dist/tui/screens/welcome.js +48 -0
- package/dist/tui/screens/welcome.js.map +1 -0
- package/dist/tui/screens/workspace-select.d.ts +3 -0
- package/dist/tui/screens/workspace-select.d.ts.map +1 -0
- package/dist/tui/screens/workspace-select.js +128 -0
- package/dist/tui/screens/workspace-select.js.map +1 -0
- package/dist/tui/state/router-context.d.ts +14 -0
- package/dist/tui/state/router-context.d.ts.map +1 -0
- package/dist/tui/state/router-context.js +9 -0
- package/dist/tui/state/router-context.js.map +1 -0
- package/dist/tui/state/router-reducer.d.ts +23 -0
- package/dist/tui/state/router-reducer.d.ts.map +1 -0
- package/dist/tui/state/router-reducer.js +21 -0
- package/dist/tui/state/router-reducer.js.map +1 -0
- package/dist/tui/state/tui-context.d.ts +11 -0
- package/dist/tui/state/tui-context.d.ts.map +1 -0
- package/dist/tui/state/tui-context.js +9 -0
- package/dist/tui/state/tui-context.js.map +1 -0
- package/dist/tui/state/tui-reducer.d.ts +212 -0
- package/dist/tui/state/tui-reducer.d.ts.map +1 -0
- package/dist/tui/state/tui-reducer.js +321 -0
- package/dist/tui/state/tui-reducer.js.map +1 -0
- package/dist/tui/utils/group-by-file.d.ts +7 -0
- package/dist/tui/utils/group-by-file.d.ts.map +1 -0
- package/dist/tui/utils/group-by-file.js +18 -0
- package/dist/tui/utils/group-by-file.js.map +1 -0
- package/dist/tui/utils/group-matches-by-file.d.ts +7 -0
- package/dist/tui/utils/group-matches-by-file.d.ts.map +1 -0
- package/dist/tui/utils/group-matches-by-file.js +18 -0
- package/dist/tui/utils/group-matches-by-file.js.map +1 -0
- package/dist/tui/utils/group-repos-by-project.d.ts +9 -0
- package/dist/tui/utils/group-repos-by-project.d.ts.map +1 -0
- package/dist/tui/utils/group-repos-by-project.js +48 -0
- package/dist/tui/utils/group-repos-by-project.js.map +1 -0
- package/dist/types/agent.d.ts +46 -0
- package/dist/types/agent.d.ts.map +1 -0
- package/dist/types/agent.js +2 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/bitbucket.d.ts +90 -0
- package/dist/types/bitbucket.d.ts.map +1 -0
- package/dist/types/bitbucket.js +2 -0
- package/dist/types/bitbucket.js.map +1 -0
- package/dist/types/config.d.ts +17 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/diff.d.ts +24 -0
- package/dist/types/diff.d.ts.map +1 -0
- package/dist/types/diff.js +2 -0
- package/dist/types/diff.js.map +1 -0
- package/dist/types/engram.d.ts +29 -0
- package/dist/types/engram.d.ts.map +1 -0
- package/dist/types/engram.js +2 -0
- package/dist/types/engram.js.map +1 -0
- package/dist/types/false-positive.d.ts +12 -0
- package/dist/types/false-positive.d.ts.map +1 -0
- package/dist/types/false-positive.js +2 -0
- package/dist/types/false-positive.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/provider.d.ts +31 -0
- package/dist/types/provider.d.ts.map +1 -0
- package/dist/types/provider.js +2 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/repo-config.d.ts +336 -0
- package/dist/types/repo-config.d.ts.map +1 -0
- package/dist/types/repo-config.js +62 -0
- package/dist/types/repo-config.js.map +1 -0
- package/dist/types/review-finding.d.ts +34 -0
- package/dist/types/review-finding.d.ts.map +1 -0
- package/dist/types/review-finding.js +11 -0
- package/dist/types/review-finding.js.map +1 -0
- package/dist/types/review-session.d.ts +21 -0
- package/dist/types/review-session.d.ts.map +1 -0
- package/dist/types/review-session.js +2 -0
- package/dist/types/review-session.js.map +1 -0
- package/dist/types/skill.d.ts +7 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +2 -0
- package/dist/types/skill.js.map +1 -0
- package/dist/utils/comment-formatter.d.ts +19 -0
- package/dist/utils/comment-formatter.d.ts.map +1 -0
- package/dist/utils/comment-formatter.js +53 -0
- package/dist/utils/comment-formatter.js.map +1 -0
- package/dist/utils/cost-estimator.d.ts +19 -0
- package/dist/utils/cost-estimator.d.ts.map +1 -0
- package/dist/utils/cost-estimator.js +32 -0
- package/dist/utils/cost-estimator.js.map +1 -0
- package/dist/utils/diff-parser.d.ts +7 -0
- package/dist/utils/diff-parser.d.ts.map +1 -0
- package/dist/utils/diff-parser.js +175 -0
- package/dist/utils/diff-parser.js.map +1 -0
- package/dist/utils/file-filter.d.ts +16 -0
- package/dist/utils/file-filter.d.ts.map +1 -0
- package/dist/utils/file-filter.js +64 -0
- package/dist/utils/file-filter.js.map +1 -0
- package/dist/utils/hash.d.ts +25 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +45 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/parse-bitbucket-url.d.ts +12 -0
- package/dist/utils/parse-bitbucket-url.d.ts.map +1 -0
- package/dist/utils/parse-bitbucket-url.js +41 -0
- package/dist/utils/parse-bitbucket-url.js.map +1 -0
- package/dist/utils/paths.d.ts +6 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +27 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/summary-generator.d.ts +17 -0
- package/dist/utils/summary-generator.d.ts.map +1 -0
- package/dist/utils/summary-generator.js +76 -0
- package/dist/utils/summary-generator.js.map +1 -0
- package/oclif.manifest.json +467 -0
- package/package.json +100 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { Lang, parse as sgParse } from '@ast-grep/napi';
|
|
3
|
+
// Map our AstGrepLanguage strings to ast-grep string values.
|
|
4
|
+
// Lang enum only covers Html, JavaScript, Tsx, Css, TypeScript.
|
|
5
|
+
// All others are passed as CustomLang (string & {}) — structurally valid per string.
|
|
6
|
+
const LANG_MAP = {
|
|
7
|
+
typescript: Lang.TypeScript,
|
|
8
|
+
javascript: Lang.JavaScript,
|
|
9
|
+
tsx: Lang.Tsx,
|
|
10
|
+
// jsx is not in Lang enum — fall back to JavaScript
|
|
11
|
+
jsx: Lang.JavaScript,
|
|
12
|
+
css: Lang.Css,
|
|
13
|
+
html: Lang.Html,
|
|
14
|
+
// The following are CustomLang strings (supported at runtime via dynamic language loading)
|
|
15
|
+
python: 'Python',
|
|
16
|
+
go: 'Go',
|
|
17
|
+
java: 'Java',
|
|
18
|
+
rust: 'Rust',
|
|
19
|
+
c: 'C',
|
|
20
|
+
cpp: 'Cpp',
|
|
21
|
+
php: 'Php',
|
|
22
|
+
'c-sharp': 'CSharp',
|
|
23
|
+
};
|
|
24
|
+
// Map file extensions to our AstGrepLanguage strings
|
|
25
|
+
const EXT_MAP = {
|
|
26
|
+
'.ts': 'typescript',
|
|
27
|
+
'.tsx': 'tsx',
|
|
28
|
+
'.js': 'javascript',
|
|
29
|
+
'.mjs': 'javascript',
|
|
30
|
+
'.cjs': 'javascript',
|
|
31
|
+
'.jsx': 'jsx',
|
|
32
|
+
'.py': 'python',
|
|
33
|
+
'.go': 'go',
|
|
34
|
+
'.java': 'java',
|
|
35
|
+
'.rs': 'rust',
|
|
36
|
+
'.c': 'c',
|
|
37
|
+
'.cpp': 'cpp',
|
|
38
|
+
'.cc': 'cpp',
|
|
39
|
+
'.cxx': 'cpp',
|
|
40
|
+
'.cs': 'c-sharp',
|
|
41
|
+
'.php': 'php',
|
|
42
|
+
'.css': 'css',
|
|
43
|
+
'.html': 'html',
|
|
44
|
+
'.htm': 'html',
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Infer the AstGrepLanguage from a file path or extension.
|
|
48
|
+
* Accepts either a full path (e.g. "src/foo.ts") or a bare extension (e.g. ".ts").
|
|
49
|
+
* Returns null when the extension is not recognized.
|
|
50
|
+
*/
|
|
51
|
+
export function inferLanguage(filePath) {
|
|
52
|
+
const ext = filePath.startsWith('.')
|
|
53
|
+
? filePath.toLowerCase()
|
|
54
|
+
: path.extname(filePath).toLowerCase();
|
|
55
|
+
return EXT_MAP[ext] ?? null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Error type for ast-grep parse failures. Exported for consumer use but never
|
|
59
|
+
* thrown by AstGrepMatchStrategy — errors are swallowed and [] is returned.
|
|
60
|
+
*/
|
|
61
|
+
export class AstGrepParseError extends Error {
|
|
62
|
+
filePath;
|
|
63
|
+
cause;
|
|
64
|
+
constructor(message, filePath, cause) {
|
|
65
|
+
super(message);
|
|
66
|
+
this.filePath = filePath;
|
|
67
|
+
this.cause = cause;
|
|
68
|
+
this.name = 'AstGrepParseError';
|
|
69
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Async match strategy that uses ast-grep's structural search.
|
|
74
|
+
* Returns 1-based start line numbers for each match, sorted and deduplicated.
|
|
75
|
+
*/
|
|
76
|
+
export class AstGrepMatchStrategy {
|
|
77
|
+
async matchFile(fileContent, filePath, pattern) {
|
|
78
|
+
// Short-circuit: empty or whitespace-only content
|
|
79
|
+
if (!fileContent.trim()) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
// Short-circuit: no rule defined
|
|
83
|
+
if (!pattern.rule) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
// Resolve language: explicit pattern.language takes precedence
|
|
87
|
+
const lang = pattern.language ?? inferLanguage(filePath);
|
|
88
|
+
if (lang === null) {
|
|
89
|
+
return [];
|
|
90
|
+
}
|
|
91
|
+
// Map to native lang
|
|
92
|
+
const nativeLang = LANG_MAP[lang];
|
|
93
|
+
if (nativeLang === undefined) {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const root = sgParse(nativeLang, fileContent).root();
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
99
|
+
const nodes = root.findAll({ rule: pattern.rule });
|
|
100
|
+
const lineSet = new Set();
|
|
101
|
+
for (const node of nodes) {
|
|
102
|
+
const startLine = node.range().start.line + 1;
|
|
103
|
+
lineSet.add(startLine);
|
|
104
|
+
}
|
|
105
|
+
return Array.from(lineSet).sort((a, b) => a - b);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=ast-grep-strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-grep-strategy.js","sourceRoot":"","sources":["../../src/guard/ast-grep-strategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { DiffFile } from '../types/index.js';
|
|
2
|
+
import type { PrismPattern } from '../rules-engine/types.js';
|
|
3
|
+
import type { FindingSeverity } from '../types/review-finding.js';
|
|
4
|
+
import type { GuardMatch, GuardContextLine } from './types.js';
|
|
5
|
+
export interface MatchStrategy {
|
|
6
|
+
matches(lineContent: string, pattern: PrismPattern): boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Keyword-based matching with three signal sources:
|
|
10
|
+
* 1. Enriched code indicators (highest precision — known code patterns)
|
|
11
|
+
* 2. Identifiers from description backtick code (high precision — actual code snippets)
|
|
12
|
+
* 3. Long tokens from patternKey (moderate precision — likely function/class names)
|
|
13
|
+
*
|
|
14
|
+
* Patterns without any matchable keywords produce no matches by design —
|
|
15
|
+
* better to miss an abstract pattern than to falsely flag every line.
|
|
16
|
+
*/
|
|
17
|
+
export declare class KeywordMatchStrategy implements MatchStrategy {
|
|
18
|
+
private readonly keywordMap;
|
|
19
|
+
constructor(patterns: PrismPattern[]);
|
|
20
|
+
matches(lineContent: string, pattern: PrismPattern): boolean;
|
|
21
|
+
private extractKeywords;
|
|
22
|
+
/**
|
|
23
|
+
* Extract code identifiers from backtick-delimited snippets in description.
|
|
24
|
+
* Only keeps identifiers that are specific enough to be function/class/variable names.
|
|
25
|
+
*/
|
|
26
|
+
private extractCodeFromDescription;
|
|
27
|
+
private enrichWithCodeIndicators;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a file path matches any of the given globs.
|
|
31
|
+
* Globs are in `*.ext` format — uses simple endsWith matching.
|
|
32
|
+
*/
|
|
33
|
+
export declare function fileMatchesGlobs(filePath: string, globs: string[]): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Collect all addition line numbers from all hunks in a file.
|
|
36
|
+
* Returns a Set of 1-based line numbers.
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildAdditionLineSet(file: DiffFile): Set<number>;
|
|
39
|
+
/**
|
|
40
|
+
* Build context lines from all hunks for a given match line number.
|
|
41
|
+
* Searches all hunks for the line, then grabs CONTEXT_RADIUS lines before/after.
|
|
42
|
+
* Returns [] if the line is not found in any hunk.
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildContextFromHunk(file: DiffFile, matchLineNumber: number, contextRadius: number): GuardContextLine[];
|
|
45
|
+
/**
|
|
46
|
+
* Match patterns against addition lines in parsed diff files.
|
|
47
|
+
* Supports dual-mode matching: ast-grep (when fileContentMap is provided and has the file)
|
|
48
|
+
* and keyword fallback (when file is absent from map or pattern has no rule).
|
|
49
|
+
* Returns deduplicated, sorted GuardMatch array.
|
|
50
|
+
*/
|
|
51
|
+
export declare function matchPatterns(files: DiffFile[], patterns: PrismPattern[], minSeverity?: FindingSeverity, fileContentMap?: ReadonlyMap<string, string>): Promise<GuardMatch[]>;
|
|
52
|
+
//# sourceMappingURL=diff-pattern-matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-pattern-matcher.d.ts","sourceRoot":"","sources":["../../src/guard/diff-pattern-matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAsC/D,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC;CAC9D;AAED;;;;;;;;GAQG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;gBAE9C,QAAQ,EAAE,YAAY,EAAE;IAMpC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO;IAa5D,OAAO,CAAC,eAAe;IAiBvB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAkBlC,OAAO,CAAC,wBAAwB;CA+BjC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAS3E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,CAUhE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,eAAe,EAAE,MAAM,EACvB,aAAa,EAAE,MAAM,GACpB,gBAAgB,EAAE,CAqBpB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,QAAQ,EAAE,EACjB,QAAQ,EAAE,YAAY,EAAE,EACxB,WAAW,CAAC,EAAE,eAAe,EAC7B,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3C,OAAO,CAAC,UAAU,EAAE,CAAC,CAyJvB"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { resolveStrategy } from './match-strategy.js';
|
|
2
|
+
import { AstGrepMatchStrategy } from './ast-grep-strategy.js';
|
|
3
|
+
const NOISE_WORDS = new Set([
|
|
4
|
+
// English common words
|
|
5
|
+
'with', 'that', 'this', 'from', 'have', 'will', 'your', 'they',
|
|
6
|
+
'been', 'type', 'the', 'for', 'and', 'not', 'are', 'use',
|
|
7
|
+
// Spanish common words
|
|
8
|
+
'sin', 'del', 'los', 'las', 'una', 'por', 'como', 'para',
|
|
9
|
+
'cuando', 'lugar', 'campo', 'nuevo', 'archivo',
|
|
10
|
+
// Programming keywords (too generic for code matching)
|
|
11
|
+
'return', 'function', 'method', 'class', 'const', 'null',
|
|
12
|
+
'void', 'result', 'value', 'query', 'error', 'throw', 'catch',
|
|
13
|
+
'async', 'await', 'fetch', 'data', 'list', 'item', 'count',
|
|
14
|
+
'index', 'array', 'object', 'string', 'number', 'boolean',
|
|
15
|
+
'public', 'private', 'protected', 'static', 'final', 'abstract',
|
|
16
|
+
'import', 'export', 'require', 'module', 'default', 'extends',
|
|
17
|
+
'implements', 'interface', 'package', 'select', 'where', 'limit',
|
|
18
|
+
'order', 'group', 'table', 'column', 'field', 'param', 'props',
|
|
19
|
+
]);
|
|
20
|
+
/** Minimum length for tokens extracted from patternKey (filters generic words) */
|
|
21
|
+
const MIN_PATTERN_TOKEN_LENGTH = 10;
|
|
22
|
+
/** Minimum length for identifiers extracted from description backtick code.
|
|
23
|
+
* Set high enough to filter framework names (Illuminate=10, Collection=10)
|
|
24
|
+
* while keeping specific identifiers (fetchAuthorizationRows=22). */
|
|
25
|
+
const MIN_DESC_IDENTIFIER_LENGTH = 12;
|
|
26
|
+
/** Lines of diff context to show before and after each match */
|
|
27
|
+
const CONTEXT_RADIUS = 2;
|
|
28
|
+
const SEV_ORDER = {
|
|
29
|
+
critical: 0, high: 1, medium: 2, low: 3, info: 4,
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Keyword-based matching with three signal sources:
|
|
33
|
+
* 1. Enriched code indicators (highest precision — known code patterns)
|
|
34
|
+
* 2. Identifiers from description backtick code (high precision — actual code snippets)
|
|
35
|
+
* 3. Long tokens from patternKey (moderate precision — likely function/class names)
|
|
36
|
+
*
|
|
37
|
+
* Patterns without any matchable keywords produce no matches by design —
|
|
38
|
+
* better to miss an abstract pattern than to falsely flag every line.
|
|
39
|
+
*/
|
|
40
|
+
export class KeywordMatchStrategy {
|
|
41
|
+
keywordMap = new Map();
|
|
42
|
+
constructor(patterns) {
|
|
43
|
+
for (const p of patterns) {
|
|
44
|
+
this.keywordMap.set(p.id, this.extractKeywords(p));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
matches(lineContent, pattern) {
|
|
48
|
+
const keywords = this.keywordMap.get(pattern.id);
|
|
49
|
+
if (!keywords || keywords.length === 0)
|
|
50
|
+
return false;
|
|
51
|
+
const trimmed = lineContent.trim();
|
|
52
|
+
if (trimmed.length === 0)
|
|
53
|
+
return false;
|
|
54
|
+
const lower = trimmed.toLowerCase();
|
|
55
|
+
return keywords.some((kw) => kw === kw.toLowerCase() ? lower.includes(kw) : trimmed.includes(kw));
|
|
56
|
+
}
|
|
57
|
+
extractKeywords(pattern) {
|
|
58
|
+
// 1. Enriched code indicators (highest priority)
|
|
59
|
+
const indicators = this.enrichWithCodeIndicators([], pattern);
|
|
60
|
+
// 2. Identifiers from description backtick code
|
|
61
|
+
const descIds = this.extractCodeFromDescription(pattern.description);
|
|
62
|
+
indicators.push(...descIds);
|
|
63
|
+
// 3. Long tokens from patternKey (only very specific identifiers)
|
|
64
|
+
const tokens = pattern.patternKey
|
|
65
|
+
.split('-')
|
|
66
|
+
.filter((t) => t.length >= MIN_PATTERN_TOKEN_LENGTH && !NOISE_WORDS.has(t));
|
|
67
|
+
indicators.push(...tokens);
|
|
68
|
+
return [...new Set(indicators)];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extract code identifiers from backtick-delimited snippets in description.
|
|
72
|
+
* Only keeps identifiers that are specific enough to be function/class/variable names.
|
|
73
|
+
*/
|
|
74
|
+
extractCodeFromDescription(description) {
|
|
75
|
+
const identifiers = [];
|
|
76
|
+
const backtickRegex = /`([^`]+)`/g;
|
|
77
|
+
let m;
|
|
78
|
+
while ((m = backtickRegex.exec(description)) !== null) {
|
|
79
|
+
const snippet = m[1] ?? '';
|
|
80
|
+
const ids = snippet.match(new RegExp(`[a-zA-Z_]\\w{${MIN_DESC_IDENTIFIER_LENGTH - 1},}`, 'g'));
|
|
81
|
+
if (ids) {
|
|
82
|
+
for (const id of ids) {
|
|
83
|
+
if (!NOISE_WORDS.has(id.toLowerCase())) {
|
|
84
|
+
identifiers.push(id);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return [...new Set(identifiers)];
|
|
90
|
+
}
|
|
91
|
+
enrichWithCodeIndicators(tokens, pattern) {
|
|
92
|
+
const indicators = [...tokens];
|
|
93
|
+
const key = pattern.patternKey.toLowerCase();
|
|
94
|
+
if (key.includes('explicit-any') || key.includes('no-any') || key.includes('tipo-any')) {
|
|
95
|
+
indicators.push(': any', 'as any', ': Any');
|
|
96
|
+
}
|
|
97
|
+
if (key.includes('console-log') || (key.includes('console') && key.includes('log'))) {
|
|
98
|
+
indicators.push('console.log', 'console.warn', 'console.error');
|
|
99
|
+
}
|
|
100
|
+
if (key.includes('debugger')) {
|
|
101
|
+
indicators.push('debugger');
|
|
102
|
+
}
|
|
103
|
+
// Use title words to avoid false match from slugified Spanish
|
|
104
|
+
// (e.g. "método" → "m-todo" triggering TODO enrichment)
|
|
105
|
+
const titleWords = pattern.title.toLowerCase().split(/\s+/);
|
|
106
|
+
if (titleWords.includes('todo') || titleWords.includes('fixme')) {
|
|
107
|
+
indicators.push('TODO', 'FIXME', 'HACK', 'XXX');
|
|
108
|
+
}
|
|
109
|
+
if (key.includes('eval')) {
|
|
110
|
+
indicators.push('eval(', 'new Function(');
|
|
111
|
+
}
|
|
112
|
+
if (key.includes('strict-types') || key.includes('strict_types')) {
|
|
113
|
+
indicators.push('strict_types');
|
|
114
|
+
}
|
|
115
|
+
if (key.includes('construct')) {
|
|
116
|
+
indicators.push('__construct');
|
|
117
|
+
}
|
|
118
|
+
return indicators;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if a file path matches any of the given globs.
|
|
123
|
+
* Globs are in `*.ext` format — uses simple endsWith matching.
|
|
124
|
+
*/
|
|
125
|
+
export function fileMatchesGlobs(filePath, globs) {
|
|
126
|
+
if (globs.length === 0)
|
|
127
|
+
return true;
|
|
128
|
+
return globs.some((glob) => {
|
|
129
|
+
if (glob.startsWith('*.')) {
|
|
130
|
+
const ext = glob.slice(1); // e.g. ".ts"
|
|
131
|
+
return filePath.endsWith(ext);
|
|
132
|
+
}
|
|
133
|
+
return filePath === glob;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Collect all addition line numbers from all hunks in a file.
|
|
138
|
+
* Returns a Set of 1-based line numbers.
|
|
139
|
+
*/
|
|
140
|
+
export function buildAdditionLineSet(file) {
|
|
141
|
+
const lineSet = new Set();
|
|
142
|
+
for (const hunk of file.hunks) {
|
|
143
|
+
for (const line of hunk.lines) {
|
|
144
|
+
if (line.type === 'addition' && line.lineNumber !== null) {
|
|
145
|
+
lineSet.add(line.lineNumber);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return lineSet;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Build context lines from all hunks for a given match line number.
|
|
153
|
+
* Searches all hunks for the line, then grabs CONTEXT_RADIUS lines before/after.
|
|
154
|
+
* Returns [] if the line is not found in any hunk.
|
|
155
|
+
*/
|
|
156
|
+
export function buildContextFromHunk(file, matchLineNumber, contextRadius) {
|
|
157
|
+
for (const hunk of file.hunks) {
|
|
158
|
+
const hunkLines = hunk.lines;
|
|
159
|
+
const lineIdx = hunkLines.findIndex((l) => l.lineNumber === matchLineNumber);
|
|
160
|
+
if (lineIdx === -1)
|
|
161
|
+
continue;
|
|
162
|
+
const ctxStart = Math.max(0, lineIdx - contextRadius);
|
|
163
|
+
const ctxEnd = Math.min(hunkLines.length - 1, lineIdx + contextRadius);
|
|
164
|
+
const contextLines = [];
|
|
165
|
+
for (let ci = ctxStart; ci <= ctxEnd; ci++) {
|
|
166
|
+
const cl = hunkLines[ci];
|
|
167
|
+
contextLines.push({
|
|
168
|
+
type: cl.type,
|
|
169
|
+
content: cl.content,
|
|
170
|
+
lineNumber: cl.lineNumber,
|
|
171
|
+
isMatch: ci === lineIdx,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
return contextLines;
|
|
175
|
+
}
|
|
176
|
+
return [];
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Match patterns against addition lines in parsed diff files.
|
|
180
|
+
* Supports dual-mode matching: ast-grep (when fileContentMap is provided and has the file)
|
|
181
|
+
* and keyword fallback (when file is absent from map or pattern has no rule).
|
|
182
|
+
* Returns deduplicated, sorted GuardMatch array.
|
|
183
|
+
*/
|
|
184
|
+
export async function matchPatterns(files, patterns, minSeverity, fileContentMap) {
|
|
185
|
+
if (patterns.length === 0)
|
|
186
|
+
return [];
|
|
187
|
+
// Filter patterns by minimum severity
|
|
188
|
+
const minSevIdx = minSeverity ? (SEV_ORDER[minSeverity] ?? 4) : 4;
|
|
189
|
+
const activePatterns = patterns.filter((p) => {
|
|
190
|
+
const idx = SEV_ORDER[p.severity] ?? 4;
|
|
191
|
+
return idx <= minSevIdx;
|
|
192
|
+
});
|
|
193
|
+
if (activePatterns.length === 0)
|
|
194
|
+
return [];
|
|
195
|
+
// Partition patterns by strategy
|
|
196
|
+
const astPatterns = activePatterns.filter((p) => resolveStrategy(p) === 'ast-grep');
|
|
197
|
+
const kwPatterns = activePatterns.filter((p) => resolveStrategy(p) === 'keyword');
|
|
198
|
+
const astStrategy = new AstGrepMatchStrategy();
|
|
199
|
+
const matches = [];
|
|
200
|
+
const seen = new Set();
|
|
201
|
+
for (const file of files) {
|
|
202
|
+
if (file.isBinary || file.isDeleted)
|
|
203
|
+
continue;
|
|
204
|
+
const filePath = file.newPath;
|
|
205
|
+
// Pre-build addition line set for this file (used by both paths)
|
|
206
|
+
const additionLines = buildAdditionLineSet(file);
|
|
207
|
+
// Collect ast patterns that fall back to keyword for this file
|
|
208
|
+
const astFallbackPatterns = [];
|
|
209
|
+
// -----------------------------------------------------------------------
|
|
210
|
+
// AST-grep path: only when fileContentMap is provided and has this file
|
|
211
|
+
// -----------------------------------------------------------------------
|
|
212
|
+
if (fileContentMap !== undefined) {
|
|
213
|
+
const fileContent = fileContentMap.get(filePath);
|
|
214
|
+
for (const pattern of astPatterns) {
|
|
215
|
+
if (!fileMatchesGlobs(filePath, pattern.fileGlobs))
|
|
216
|
+
continue;
|
|
217
|
+
if (fileContent !== undefined) {
|
|
218
|
+
// File is available → use ast-grep
|
|
219
|
+
const matchedLines = await astStrategy.matchFile(fileContent, filePath, pattern);
|
|
220
|
+
for (const matchedLine of matchedLines) {
|
|
221
|
+
// Only report if the line is an addition in the diff
|
|
222
|
+
if (!additionLines.has(matchedLine))
|
|
223
|
+
continue;
|
|
224
|
+
const dedupKey = `${filePath}:${matchedLine}:${pattern.id}`;
|
|
225
|
+
if (seen.has(dedupKey))
|
|
226
|
+
continue;
|
|
227
|
+
seen.add(dedupKey);
|
|
228
|
+
const contextLines = buildContextFromHunk(file, matchedLine, CONTEXT_RADIUS);
|
|
229
|
+
// Find the matched line content from contextLines (isMatch === true)
|
|
230
|
+
const matchCtxLine = contextLines.find((cl) => cl.isMatch);
|
|
231
|
+
const lineContent = matchCtxLine?.content.trim() ?? '';
|
|
232
|
+
matches.push({
|
|
233
|
+
id: dedupKey,
|
|
234
|
+
patternId: pattern.id,
|
|
235
|
+
patternTitle: pattern.title,
|
|
236
|
+
patternDescription: pattern.description,
|
|
237
|
+
severity: pattern.severity,
|
|
238
|
+
category: pattern.category,
|
|
239
|
+
agentId: pattern.agentId,
|
|
240
|
+
filePath,
|
|
241
|
+
lineNumber: matchedLine,
|
|
242
|
+
lineContent,
|
|
243
|
+
matchedGlob: pattern.fileGlobs.find((g) => fileMatchesGlobs(filePath, [g])) ?? '*',
|
|
244
|
+
contextLines,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
// File NOT in map → fall back to keyword for this pattern
|
|
250
|
+
astFallbackPatterns.push(pattern);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// When fileContentMap is undefined: astFallbackPatterns stays empty — all patterns
|
|
255
|
+
// (including astPatterns) are handled via activePatterns in kwPatternsForFile below.
|
|
256
|
+
// -----------------------------------------------------------------------
|
|
257
|
+
// Keyword path: kwPatterns + ast fallbacks
|
|
258
|
+
// -----------------------------------------------------------------------
|
|
259
|
+
// When fileContentMap is undefined all patterns fall through to keyword.
|
|
260
|
+
// When fileContentMap is provided, only kwPatterns + ast fallbacks run here.
|
|
261
|
+
const kwPatternsForFile = fileContentMap === undefined
|
|
262
|
+
? activePatterns
|
|
263
|
+
: [...kwPatterns, ...astFallbackPatterns];
|
|
264
|
+
const strategy = new KeywordMatchStrategy(kwPatternsForFile);
|
|
265
|
+
for (const pattern of kwPatternsForFile) {
|
|
266
|
+
if (!fileMatchesGlobs(filePath, pattern.fileGlobs))
|
|
267
|
+
continue;
|
|
268
|
+
for (const hunk of file.hunks) {
|
|
269
|
+
const hunkLines = hunk.lines;
|
|
270
|
+
for (let lineIdx = 0; lineIdx < hunkLines.length; lineIdx++) {
|
|
271
|
+
const line = hunkLines[lineIdx];
|
|
272
|
+
if (line.type !== 'addition')
|
|
273
|
+
continue;
|
|
274
|
+
if (line.lineNumber === null)
|
|
275
|
+
continue;
|
|
276
|
+
if (strategy.matches(line.content, pattern)) {
|
|
277
|
+
const dedupKey = `${filePath}:${line.lineNumber}:${pattern.id}`;
|
|
278
|
+
if (seen.has(dedupKey))
|
|
279
|
+
continue;
|
|
280
|
+
seen.add(dedupKey);
|
|
281
|
+
// Capture surrounding context lines (2 before, 2 after)
|
|
282
|
+
const ctxStart = Math.max(0, lineIdx - CONTEXT_RADIUS);
|
|
283
|
+
const ctxEnd = Math.min(hunkLines.length - 1, lineIdx + CONTEXT_RADIUS);
|
|
284
|
+
const contextLines = [];
|
|
285
|
+
for (let ci = ctxStart; ci <= ctxEnd; ci++) {
|
|
286
|
+
const cl = hunkLines[ci];
|
|
287
|
+
contextLines.push({
|
|
288
|
+
type: cl.type,
|
|
289
|
+
content: cl.content,
|
|
290
|
+
lineNumber: cl.lineNumber,
|
|
291
|
+
isMatch: ci === lineIdx,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
matches.push({
|
|
295
|
+
id: dedupKey,
|
|
296
|
+
patternId: pattern.id,
|
|
297
|
+
patternTitle: pattern.title,
|
|
298
|
+
patternDescription: pattern.description,
|
|
299
|
+
severity: pattern.severity,
|
|
300
|
+
category: pattern.category,
|
|
301
|
+
agentId: pattern.agentId,
|
|
302
|
+
filePath,
|
|
303
|
+
lineNumber: line.lineNumber,
|
|
304
|
+
lineContent: line.content.trim(),
|
|
305
|
+
matchedGlob: pattern.fileGlobs.find((g) => fileMatchesGlobs(filePath, [g])) ?? '*',
|
|
306
|
+
contextLines,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// Sort: severity DESC (lower index = higher severity), filePath ASC, lineNumber ASC
|
|
314
|
+
matches.sort((a, b) => {
|
|
315
|
+
const sevDiff = (SEV_ORDER[a.severity] ?? 4) - (SEV_ORDER[b.severity] ?? 4);
|
|
316
|
+
if (sevDiff !== 0)
|
|
317
|
+
return sevDiff;
|
|
318
|
+
const fileDiff = a.filePath.localeCompare(b.filePath);
|
|
319
|
+
if (fileDiff !== 0)
|
|
320
|
+
return fileDiff;
|
|
321
|
+
return a.lineNumber - b.lineNumber;
|
|
322
|
+
});
|
|
323
|
+
return matches;
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=diff-pattern-matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-pattern-matcher.js","sourceRoot":"","sources":["../../src/guard/diff-pattern-matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-fetcher.d.ts","sourceRoot":"","sources":["../../src/guard/file-fetcher.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAChD,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwBtC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const MAX_CONCURRENT_FETCHES = 5;
|
|
2
|
+
export async function fetchFileContents(filePaths, fetcher) {
|
|
3
|
+
const result = new Map();
|
|
4
|
+
if (filePaths.length === 0)
|
|
5
|
+
return result;
|
|
6
|
+
let idx = 0;
|
|
7
|
+
async function next() {
|
|
8
|
+
while (idx < filePaths.length) {
|
|
9
|
+
const currentIdx = idx++;
|
|
10
|
+
const filePath = filePaths[currentIdx];
|
|
11
|
+
const content = await fetcher(filePath).catch(() => null);
|
|
12
|
+
if (content !== null) {
|
|
13
|
+
result.set(filePath, content);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const workers = Array.from({ length: Math.min(MAX_CONCURRENT_FETCHES, filePaths.length) }, () => next());
|
|
18
|
+
await Promise.all(workers);
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=file-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-fetcher.js","sourceRoot":"","sources":["../../src/guard/file-fetcher.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAmB,EACnB,OAAiD;IAEjD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAE1C,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,KAAK,UAAU,IAAI;QACjB,OAAO,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAE,CAAC;YACxC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACxB,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,EAC9D,GAAG,EAAE,CAAC,IAAI,EAAE,CACb,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3B,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { GuardInput, GuardResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run the guard engine: load patterns → parse diff → match → build result.
|
|
4
|
+
* Throws PatternsFileError if patterns file is missing or invalid.
|
|
5
|
+
* Never throws on malformed diff — returns empty matches.
|
|
6
|
+
*/
|
|
7
|
+
export declare function runGuard(input: GuardInput): Promise<GuardResult>;
|
|
8
|
+
//# sourceMappingURL=guard-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guard-engine.d.ts","sourceRoot":"","sources":["../../src/guard/guard-engine.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAC;AAExE;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAmEtE"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { parseDiff } from '../utils/diff-parser.js';
|
|
2
|
+
import { loadPatterns } from './patterns-loader.js';
|
|
3
|
+
import { PatternsFileError } from './patterns-loader.js';
|
|
4
|
+
import { matchPatterns, fileMatchesGlobs } from './diff-pattern-matcher.js';
|
|
5
|
+
import { fetchFileContents } from './file-fetcher.js';
|
|
6
|
+
import { resolveStrategy } from './match-strategy.js';
|
|
7
|
+
/**
|
|
8
|
+
* Run the guard engine: load patterns → parse diff → match → build result.
|
|
9
|
+
* Throws PatternsFileError if patterns file is missing or invalid.
|
|
10
|
+
* Never throws on malformed diff — returns empty matches.
|
|
11
|
+
*/
|
|
12
|
+
export async function runGuard(input) {
|
|
13
|
+
const startMs = performance.now();
|
|
14
|
+
// 1. Resolve patterns source
|
|
15
|
+
if (!input.patternsPath && !input.remoteRules) {
|
|
16
|
+
throw new PatternsFileError('No patterns source: set patternsPath or remoteRules.');
|
|
17
|
+
}
|
|
18
|
+
let patternsFile;
|
|
19
|
+
if (input.remoteRules) {
|
|
20
|
+
if (!input.rulesRepoClient) {
|
|
21
|
+
throw new PatternsFileError('remoteRules requires a rulesRepoClient.');
|
|
22
|
+
}
|
|
23
|
+
const result = await input.rulesRepoClient.fetchPatterns(input.remoteRules.workspace, input.remoteRules.repo);
|
|
24
|
+
patternsFile = result.patternsFile;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
patternsFile = await loadPatterns(input.patternsPath);
|
|
28
|
+
}
|
|
29
|
+
// 2. Parse diff (never throws)
|
|
30
|
+
const files = parseDiff(input.rawDiff);
|
|
31
|
+
// 3. Filter to scannable files
|
|
32
|
+
const scannable = files.filter((f) => !f.isBinary && !f.isDeleted);
|
|
33
|
+
// 4. Identify files needing full content (ast-grep patterns)
|
|
34
|
+
const activePatterns = patternsFile.patterns;
|
|
35
|
+
const astGrepPatterns = activePatterns.filter((p) => resolveStrategy(p) === 'ast-grep');
|
|
36
|
+
let fileContentMap;
|
|
37
|
+
if (input.fileContentFetcher !== undefined && astGrepPatterns.length > 0) {
|
|
38
|
+
const eligiblePaths = scannable
|
|
39
|
+
.map((f) => f.newPath)
|
|
40
|
+
.filter((filePath) => astGrepPatterns.some((p) => fileMatchesGlobs(filePath, p.fileGlobs)));
|
|
41
|
+
if (eligiblePaths.length > 0) {
|
|
42
|
+
fileContentMap = await fetchFileContents(eligiblePaths, input.fileContentFetcher);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// 5. Match patterns against added lines
|
|
46
|
+
const matches = await matchPatterns(scannable, activePatterns, input.minSeverity, fileContentMap);
|
|
47
|
+
// 6. Build summary
|
|
48
|
+
const summary = buildSummary(matches);
|
|
49
|
+
const duration = Math.round(performance.now() - startMs);
|
|
50
|
+
return {
|
|
51
|
+
matches,
|
|
52
|
+
patternsLoaded: activePatterns.length,
|
|
53
|
+
filesScanned: scannable.length,
|
|
54
|
+
duration,
|
|
55
|
+
summary,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function buildSummary(matches) {
|
|
59
|
+
const bySeverity = {
|
|
60
|
+
critical: 0,
|
|
61
|
+
high: 0,
|
|
62
|
+
medium: 0,
|
|
63
|
+
low: 0,
|
|
64
|
+
info: 0,
|
|
65
|
+
};
|
|
66
|
+
const fileCountMap = new Map();
|
|
67
|
+
for (const m of matches) {
|
|
68
|
+
bySeverity[m.severity]++;
|
|
69
|
+
fileCountMap.set(m.filePath, (fileCountMap.get(m.filePath) ?? 0) + 1);
|
|
70
|
+
}
|
|
71
|
+
const byFile = [...fileCountMap.entries()].map(([filePath, count]) => ({ filePath, count }));
|
|
72
|
+
return {
|
|
73
|
+
total: matches.length,
|
|
74
|
+
bySeverity,
|
|
75
|
+
byFile,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=guard-engine.js.map
|