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 @@
|
|
|
1
|
+
{"version":3,"file":"guard-engine.js","sourceRoot":"","sources":["../../src/guard/guard-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PrismPattern } from '../rules-engine/types.js';
|
|
2
|
+
/** Synchronous single-line match — used by KeywordMatchStrategy (diff-hunk path) */
|
|
3
|
+
export interface SyncMatchStrategy {
|
|
4
|
+
matches(lineContent: string, pattern: PrismPattern): boolean;
|
|
5
|
+
}
|
|
6
|
+
/** Async full-file match — used by AstGrepMatchStrategy */
|
|
7
|
+
export interface AsyncMatchStrategy {
|
|
8
|
+
matchFile(fileContent: string, filePath: string, pattern: PrismPattern): Promise<number[]>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Returns 'ast-grep' if pattern.rule is defined and truthy, 'keyword' otherwise.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveStrategy(pattern: PrismPattern): 'ast-grep' | 'keyword';
|
|
14
|
+
//# sourceMappingURL=match-strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match-strategy.d.ts","sourceRoot":"","sources":["../../src/guard/match-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,oFAAoF;AACpF,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC;CAC9D;AAED,2DAA2D;AAC3D,MAAM,WAAW,kBAAkB;IACjC,SAAS,CACP,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,SAAS,CAE7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"match-strategy.js","sourceRoot":"","sources":["../../src/guard/match-strategy.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAqB;IACnD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PrismPatternsFile } from '../rules-engine/types.js';
|
|
2
|
+
export declare const DEFAULT_PATTERNS_PATH = ".prism-patterns.json";
|
|
3
|
+
export declare class PatternsFileError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Load and validate a .prism-patterns.json file (async).
|
|
8
|
+
* Throws PatternsFileError on missing file, bad JSON, or wrong version.
|
|
9
|
+
*/
|
|
10
|
+
export declare function loadPatterns(filePath: string): Promise<PrismPatternsFile>;
|
|
11
|
+
/**
|
|
12
|
+
* Load patterns synchronously, returning null if file doesn't exist.
|
|
13
|
+
* Still throws on parse/validation errors.
|
|
14
|
+
*/
|
|
15
|
+
export declare function tryLoadPatterns(filePath: string): PrismPatternsFile | null;
|
|
16
|
+
//# sourceMappingURL=patterns-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns-loader.d.ts","sourceRoot":"","sources":["../../src/guard/patterns-loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,eAAO,MAAM,qBAAqB,yBAAyB,CAAC;AAE5D,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAK5B;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAW/E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAK1E"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
3
|
+
export const DEFAULT_PATTERNS_PATH = '.prism-patterns.json';
|
|
4
|
+
export class PatternsFileError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'PatternsFileError';
|
|
8
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Load and validate a .prism-patterns.json file (async).
|
|
13
|
+
* Throws PatternsFileError on missing file, bad JSON, or wrong version.
|
|
14
|
+
*/
|
|
15
|
+
export async function loadPatterns(filePath) {
|
|
16
|
+
let raw;
|
|
17
|
+
try {
|
|
18
|
+
raw = await readFile(filePath, 'utf-8');
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new PatternsFileError(`Patterns file not found: ${filePath}\nRun 'prism rules sync --workspace <ws> --repo <repo>' to generate it.`);
|
|
22
|
+
}
|
|
23
|
+
return parseAndValidate(raw, filePath);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load patterns synchronously, returning null if file doesn't exist.
|
|
27
|
+
* Still throws on parse/validation errors.
|
|
28
|
+
*/
|
|
29
|
+
export function tryLoadPatterns(filePath) {
|
|
30
|
+
if (!existsSync(filePath))
|
|
31
|
+
return null;
|
|
32
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
33
|
+
return parseAndValidate(raw, filePath);
|
|
34
|
+
}
|
|
35
|
+
function parseAndValidate(raw, filePath) {
|
|
36
|
+
let parsed;
|
|
37
|
+
try {
|
|
38
|
+
parsed = JSON.parse(raw);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
throw new PatternsFileError(`Failed to parse patterns file: ${filePath}`);
|
|
42
|
+
}
|
|
43
|
+
const obj = parsed;
|
|
44
|
+
const version = obj['version'];
|
|
45
|
+
if (version !== 1 && version !== 2) {
|
|
46
|
+
throw new PatternsFileError(`Unsupported patterns file version: ${String(version)}. Expected 1 or 2.`);
|
|
47
|
+
}
|
|
48
|
+
if (!Array.isArray(obj['patterns'])) {
|
|
49
|
+
throw new PatternsFileError('Invalid patterns file: "patterns" must be an array.');
|
|
50
|
+
}
|
|
51
|
+
if (version === 2) {
|
|
52
|
+
const patterns = obj['patterns'];
|
|
53
|
+
for (const pattern of patterns) {
|
|
54
|
+
if (pattern['rule'] !== undefined && pattern['language'] === undefined) {
|
|
55
|
+
console.warn(`Pattern '${String(pattern['id'])}' has 'rule' but no 'language' — falling back to keyword matching`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return parsed;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=patterns-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns-loader.js","sourceRoot":"","sources":["../../src/guard/patterns-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAU,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGnD,MAAM,CAAC,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AAE5D,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAiB,CACzB,4BAA4B,QAAQ,yEAAyE,CAC9G,CAAC;IACJ,CAAC;IAED,OAAO,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,QAAgB;IACrD,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,iBAAiB,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,GAAG,GAAG,MAAiC,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,iBAAiB,CACzB,sCAAsC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAC1E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,iBAAiB,CAAC,qDAAqD,CAAC,CAAC;IACrF,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAmC,CAAC;QACnE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;gBACvE,OAAO,CAAC,IAAI,CACV,YAAY,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,mEAAmE,CACrG,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAA2B,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { FindingSeverity } from '../types/review-finding.js';
|
|
2
|
+
import type { RulesRepoClient } from '../rules-repo/rules-repo-client.js';
|
|
3
|
+
export type GuardStatus = 'idle' | 'loading-patterns' | 'fetching-diff' | 'fetching-files' | 'matching' | 'complete' | 'error';
|
|
4
|
+
export interface GuardInput {
|
|
5
|
+
rawDiff: string;
|
|
6
|
+
patternsPath?: string;
|
|
7
|
+
minSeverity?: FindingSeverity;
|
|
8
|
+
remoteRules?: {
|
|
9
|
+
workspace: string;
|
|
10
|
+
repo: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Client for fetching patterns from the remote rules repository.
|
|
14
|
+
* Required when `remoteRules` is set.
|
|
15
|
+
*/
|
|
16
|
+
rulesRepoClient?: RulesRepoClient;
|
|
17
|
+
/**
|
|
18
|
+
* Fetches full source file content for AST parsing.
|
|
19
|
+
* Called only for files where a matched pattern has a `rule` field.
|
|
20
|
+
* Returns null if the file cannot be fetched.
|
|
21
|
+
*/
|
|
22
|
+
fileContentFetcher?: (filePath: string) => Promise<string | null>;
|
|
23
|
+
}
|
|
24
|
+
export interface GuardContextLine {
|
|
25
|
+
type: 'addition' | 'deletion' | 'context';
|
|
26
|
+
content: string;
|
|
27
|
+
lineNumber: number | null;
|
|
28
|
+
isMatch: boolean;
|
|
29
|
+
}
|
|
30
|
+
export interface GuardMatch {
|
|
31
|
+
/** Unique ID: `${filePath}:${lineNumber}:${patternId}` */
|
|
32
|
+
id: string;
|
|
33
|
+
patternId: string;
|
|
34
|
+
patternTitle: string;
|
|
35
|
+
patternDescription: string;
|
|
36
|
+
severity: FindingSeverity;
|
|
37
|
+
category: string;
|
|
38
|
+
agentId: string;
|
|
39
|
+
filePath: string;
|
|
40
|
+
lineNumber: number;
|
|
41
|
+
lineContent: string;
|
|
42
|
+
matchedGlob: string;
|
|
43
|
+
/** Surrounding diff lines for display context */
|
|
44
|
+
contextLines: GuardContextLine[];
|
|
45
|
+
}
|
|
46
|
+
export interface GuardSummary {
|
|
47
|
+
total: number;
|
|
48
|
+
bySeverity: Record<FindingSeverity, number>;
|
|
49
|
+
byFile: Array<{
|
|
50
|
+
filePath: string;
|
|
51
|
+
count: number;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
54
|
+
export interface GuardResult {
|
|
55
|
+
matches: GuardMatch[];
|
|
56
|
+
patternsLoaded: number;
|
|
57
|
+
filesScanned: number;
|
|
58
|
+
duration: number;
|
|
59
|
+
summary: GuardSummary;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAE1E,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,kBAAkB,GAClB,eAAe,GACf,gBAAgB,GAChB,UAAU,GACV,UAAU,GACV,OAAO,CAAC;AAEZ,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,WAAW,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD;;;OAGG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,eAAe,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,CAAC;CACvB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/guard/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { EngramClient, SaveReviewParams, PriorReview } from '../types/index.js';
|
|
2
|
+
import type { Logger } from '../utils/logger.js';
|
|
3
|
+
export declare class EngramHttpClient implements EngramClient {
|
|
4
|
+
private readonly baseUrl;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(baseUrl: string | undefined, logger: Logger);
|
|
7
|
+
isAvailable(): Promise<boolean>;
|
|
8
|
+
saveReview(params: SaveReviewParams): Promise<void>;
|
|
9
|
+
searchPriorReviews(prId: number, repo: string): Promise<PriorReview[]>;
|
|
10
|
+
saveProjectContext(ws: string, repo: string, context: string): Promise<void>;
|
|
11
|
+
getProjectContext(ws: string, repo: string): Promise<string | null>;
|
|
12
|
+
private fetchWithTimeout;
|
|
13
|
+
private buildFileSummary;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=engram-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engram-client.d.ts","sourceRoot":"","sources":["../../src/memory/engram-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAKjD,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM;IAKjD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CnD,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA8CtE,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5E,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YA2B3D,gBAAgB;IAe9B,OAAO,CAAC,gBAAgB;CASzB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
const DEFAULT_BASE_URL = 'http://localhost:7437';
|
|
2
|
+
const TIMEOUT_MS = 5000;
|
|
3
|
+
export class EngramHttpClient {
|
|
4
|
+
baseUrl;
|
|
5
|
+
logger;
|
|
6
|
+
constructor(baseUrl, logger) {
|
|
7
|
+
this.baseUrl = baseUrl ?? DEFAULT_BASE_URL;
|
|
8
|
+
this.logger = logger;
|
|
9
|
+
}
|
|
10
|
+
async isAvailable() {
|
|
11
|
+
try {
|
|
12
|
+
const res = await this.fetchWithTimeout('/health');
|
|
13
|
+
return res.ok;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
async saveReview(params) {
|
|
20
|
+
try {
|
|
21
|
+
const topicKey = `prism-cli/reviews/${params.workspace}/${params.repo}/pr-${params.prId}`;
|
|
22
|
+
const fileSummary = this.buildFileSummary(params.findings);
|
|
23
|
+
const content = JSON.stringify({
|
|
24
|
+
prId: params.prId,
|
|
25
|
+
repo: params.repo,
|
|
26
|
+
workspace: params.workspace,
|
|
27
|
+
prTitle: params.prTitle,
|
|
28
|
+
findingsCount: params.findingsCount,
|
|
29
|
+
publishedCount: params.publishedCount,
|
|
30
|
+
costUsd: params.costUsd,
|
|
31
|
+
fileSummary,
|
|
32
|
+
findings: params.findings.map((f) => ({
|
|
33
|
+
filePath: f.filePath,
|
|
34
|
+
lineNumber: f.lineNumber,
|
|
35
|
+
formattedComment: `**${f.severity.toUpperCase()}** [${f.category}]: ${f.title}`,
|
|
36
|
+
})),
|
|
37
|
+
});
|
|
38
|
+
const res = await this.fetchWithTimeout('/observations', {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: { 'Content-Type': 'application/json' },
|
|
41
|
+
body: JSON.stringify({
|
|
42
|
+
title: topicKey,
|
|
43
|
+
content,
|
|
44
|
+
type: 'architecture',
|
|
45
|
+
project: 'prism-cli',
|
|
46
|
+
topic_key: topicKey,
|
|
47
|
+
}),
|
|
48
|
+
});
|
|
49
|
+
if (!res.ok) {
|
|
50
|
+
throw new Error(`HTTP ${res.status}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
55
|
+
this.logger.warn(`[engram] Operation failed: ${message} — continuing without memory`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async searchPriorReviews(prId, repo) {
|
|
59
|
+
try {
|
|
60
|
+
const query = `prism-cli/reviews/${repo}/pr-${prId}`;
|
|
61
|
+
const res = await this.fetchWithTimeout('/search', {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
headers: { 'Content-Type': 'application/json' },
|
|
64
|
+
body: JSON.stringify({ query, project: 'prism-cli', limit: 10 }),
|
|
65
|
+
});
|
|
66
|
+
if (!res.ok) {
|
|
67
|
+
throw new Error(`HTTP ${res.status}`);
|
|
68
|
+
}
|
|
69
|
+
const data = (await res.json());
|
|
70
|
+
if (!data.results || !Array.isArray(data.results)) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
const reviews = [];
|
|
74
|
+
for (const item of data.results) {
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(item.content);
|
|
77
|
+
if (parsed.prId !== undefined && Array.isArray(parsed.findings)) {
|
|
78
|
+
reviews.push({
|
|
79
|
+
prId: parsed.prId,
|
|
80
|
+
repo: parsed.repo ?? repo,
|
|
81
|
+
findings: parsed.findings,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Skip malformed entries
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return reviews;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
93
|
+
this.logger.warn(`[engram] Operation failed: ${message} — continuing without memory`);
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async saveProjectContext(ws, repo, context) {
|
|
98
|
+
try {
|
|
99
|
+
const topicKey = `prism-cli/projects/${ws}/${repo}`;
|
|
100
|
+
const res = await this.fetchWithTimeout('/observations', {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
headers: { 'Content-Type': 'application/json' },
|
|
103
|
+
body: JSON.stringify({
|
|
104
|
+
title: topicKey,
|
|
105
|
+
content: context,
|
|
106
|
+
type: 'architecture',
|
|
107
|
+
project: 'prism-cli',
|
|
108
|
+
topic_key: topicKey,
|
|
109
|
+
}),
|
|
110
|
+
});
|
|
111
|
+
if (!res.ok) {
|
|
112
|
+
throw new Error(`HTTP ${res.status}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
117
|
+
this.logger.warn(`[engram] Operation failed: ${message} — continuing without memory`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async getProjectContext(ws, repo) {
|
|
121
|
+
try {
|
|
122
|
+
const query = `prism-cli/projects/${ws}/${repo}`;
|
|
123
|
+
const res = await this.fetchWithTimeout('/search', {
|
|
124
|
+
method: 'POST',
|
|
125
|
+
headers: { 'Content-Type': 'application/json' },
|
|
126
|
+
body: JSON.stringify({ query, project: 'prism-cli', limit: 1 }),
|
|
127
|
+
});
|
|
128
|
+
if (!res.ok) {
|
|
129
|
+
throw new Error(`HTTP ${res.status}`);
|
|
130
|
+
}
|
|
131
|
+
const data = (await res.json());
|
|
132
|
+
if (!data.results || data.results.length === 0) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
return data.results[0]?.content ?? null;
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
139
|
+
this.logger.warn(`[engram] Operation failed: ${message} — continuing without memory`);
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
async fetchWithTimeout(endpoint, options) {
|
|
144
|
+
const controller = new AbortController();
|
|
145
|
+
const timer = setTimeout(() => controller.abort(), TIMEOUT_MS);
|
|
146
|
+
try {
|
|
147
|
+
const response = await fetch(`${this.baseUrl}${endpoint}`, {
|
|
148
|
+
...options,
|
|
149
|
+
signal: controller.signal,
|
|
150
|
+
});
|
|
151
|
+
return response;
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
clearTimeout(timer);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
buildFileSummary(findings) {
|
|
158
|
+
const byFile = new Map();
|
|
159
|
+
for (const f of findings) {
|
|
160
|
+
byFile.set(f.filePath, (byFile.get(f.filePath) ?? 0) + 1);
|
|
161
|
+
}
|
|
162
|
+
return Array.from(byFile.entries())
|
|
163
|
+
.map(([file, count]) => `${file}: ${count} finding${count === 1 ? '' : 's'}`)
|
|
164
|
+
.join('\n');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=engram-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engram-client.js","sourceRoot":"","sources":["../../src/memory/engram-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SessionRepository } from '../persistence/repository.js';
|
|
2
|
+
import type { ReviewFinding } from '../types/index.js';
|
|
3
|
+
import type { PriorFinding } from '../types/review-finding.js';
|
|
4
|
+
export type { PriorFinding };
|
|
5
|
+
export declare class ReviewMemoryService {
|
|
6
|
+
private readonly repository;
|
|
7
|
+
constructor(repository: SessionRepository | null);
|
|
8
|
+
saveFindings(sessionId: string, findings: ReviewFinding[]): void;
|
|
9
|
+
getPriorFindings(workspace: string, repo: string, prId: number): PriorFinding[];
|
|
10
|
+
getProjectContext(workspace: string, repo: string): string | null;
|
|
11
|
+
saveProjectContext(workspace: string, repo: string, context: string): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=review-memory-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-memory-service.d.ts","sourceRoot":"","sources":["../../src/memory/review-memory-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAmB,MAAM,4BAA4B,CAAC;AAGhF,YAAY,EAAE,YAAY,EAAE,CAAC;AAE7B,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAEjE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI;IAKhE,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE;IAoB/E,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKjE,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;CAI3E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { formatFinding } from '../utils/comment-formatter.js';
|
|
2
|
+
export class ReviewMemoryService {
|
|
3
|
+
repository;
|
|
4
|
+
constructor(repository) {
|
|
5
|
+
this.repository = repository;
|
|
6
|
+
}
|
|
7
|
+
saveFindings(sessionId, findings) {
|
|
8
|
+
if (findings.length === 0 || this.repository === null)
|
|
9
|
+
return;
|
|
10
|
+
this.repository.saveFindings(sessionId, findings);
|
|
11
|
+
}
|
|
12
|
+
getPriorFindings(workspace, repo, prId) {
|
|
13
|
+
if (this.repository === null)
|
|
14
|
+
return [];
|
|
15
|
+
const rows = this.repository.getPriorFindingsForPR(workspace, repo, prId);
|
|
16
|
+
return rows.map((row) => ({
|
|
17
|
+
filePath: row.filePath,
|
|
18
|
+
lineNumber: row.lineNumber,
|
|
19
|
+
formattedComment: formatFinding({
|
|
20
|
+
filePath: row.filePath,
|
|
21
|
+
lineNumber: row.lineNumber,
|
|
22
|
+
severity: row.severity,
|
|
23
|
+
category: row.category,
|
|
24
|
+
title: row.title,
|
|
25
|
+
problem: row.problem,
|
|
26
|
+
rationale: row.rationale,
|
|
27
|
+
suggestion: row.suggestion,
|
|
28
|
+
agentId: row.agentId,
|
|
29
|
+
}),
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
getProjectContext(workspace, repo) {
|
|
33
|
+
if (this.repository === null)
|
|
34
|
+
return null;
|
|
35
|
+
return this.repository.getProjectContext(workspace, repo);
|
|
36
|
+
}
|
|
37
|
+
saveProjectContext(workspace, repo, context) {
|
|
38
|
+
if (this.repository === null)
|
|
39
|
+
return;
|
|
40
|
+
this.repository.saveProjectContext(workspace, repo, context);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=review-memory-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review-memory-service.js","sourceRoot":"","sources":["../../src/memory/review-memory-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAI9D,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,UAAoC;QAApC,eAAU,GAAV,UAAU,CAA0B;IAAG,CAAC;IAErE,YAAY,CAAC,SAAiB,EAAE,QAAyB;QACvD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,OAAO;QAC9D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,gBAAgB,CAAC,SAAiB,EAAE,IAAY,EAAE,IAAY;QAC5D,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,gBAAgB,EAAE,aAAa,CAAC;gBAC9B,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,QAAQ,EAAE,GAAG,CAAC,QAA2B;gBACzC,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,CAAC;SACH,CAAC,CAAC,CAAC;IACN,CAAC;IAED,iBAAiB,CAAC,SAAiB,EAAE,IAAY;QAC/C,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC1C,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,kBAAkB,CAAC,SAAiB,EAAE,IAAY,EAAE,OAAe;QACjE,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,OAAO;QACrC,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
2
|
+
import * as schema from './schema.js';
|
|
3
|
+
import type { Logger } from '../utils/logger.js';
|
|
4
|
+
export type DrizzleDb = ReturnType<typeof drizzle<typeof schema>>;
|
|
5
|
+
export declare function getDatabase(logger: Logger, dbPath?: string): DrizzleDb | null;
|
|
6
|
+
/** Reset the singleton — only used in tests via vi.resetModules() */
|
|
7
|
+
export declare function _resetDbInstance(): void;
|
|
8
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/persistence/database.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAErD,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAEtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC;AAuBlE,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CA6B7E;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
import { drizzle } from 'drizzle-orm/better-sqlite3';
|
|
6
|
+
import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
|
|
7
|
+
import * as schema from './schema.js';
|
|
8
|
+
import { ensureConfigDir, getDbPath } from '../utils/paths.js';
|
|
9
|
+
let dbInstance = null;
|
|
10
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
/**
|
|
12
|
+
* Resolve the migrations folder. Prefers dist/ (postbuild copy), falls back to src/.
|
|
13
|
+
* This handles both `npm run build` (postbuild copies files) and `tsc -b` (no copy).
|
|
14
|
+
*/
|
|
15
|
+
function resolveMigrationsFolder() {
|
|
16
|
+
const distMigrations = path.join(__dirname, 'migrations');
|
|
17
|
+
const journal = path.join(distMigrations, 'meta', '_journal.json');
|
|
18
|
+
if (fs.existsSync(journal))
|
|
19
|
+
return distMigrations;
|
|
20
|
+
// Fallback: resolve from src/ relative to project root
|
|
21
|
+
const projectRoot = path.resolve(__dirname, '..', '..');
|
|
22
|
+
const srcMigrations = path.join(projectRoot, 'src', 'persistence', 'migrations');
|
|
23
|
+
if (fs.existsSync(path.join(srcMigrations, 'meta', '_journal.json')))
|
|
24
|
+
return srcMigrations;
|
|
25
|
+
throw new Error(`Migrations not found in ${distMigrations} or ${srcMigrations}`);
|
|
26
|
+
}
|
|
27
|
+
export function getDatabase(logger, dbPath) {
|
|
28
|
+
if (dbInstance !== null)
|
|
29
|
+
return dbInstance;
|
|
30
|
+
try {
|
|
31
|
+
const resolvedPath = dbPath ?? getDbPath();
|
|
32
|
+
if (dbPath) {
|
|
33
|
+
// Custom path (used in tests) — ensure parent directory exists
|
|
34
|
+
fs.mkdirSync(path.dirname(resolvedPath), { recursive: true });
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
ensureConfigDir();
|
|
38
|
+
}
|
|
39
|
+
const sqlite = new Database(resolvedPath);
|
|
40
|
+
sqlite.pragma('journal_mode = WAL');
|
|
41
|
+
sqlite.pragma('foreign_keys = ON');
|
|
42
|
+
const db = drizzle(sqlite, { schema });
|
|
43
|
+
const migrationsFolder = resolveMigrationsFolder();
|
|
44
|
+
migrate(db, { migrationsFolder });
|
|
45
|
+
dbInstance = db;
|
|
46
|
+
return db;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
50
|
+
logger.warn(`[persistence] DB init failed: ${message} — persistence disabled`);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Reset the singleton — only used in tests via vi.resetModules() */
|
|
55
|
+
export function _resetDbInstance() {
|
|
56
|
+
dbInstance = null;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/persistence/database.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAK/D,IAAI,UAAU,GAAqB,IAAI,CAAC;AAExC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D;;;GAGG;AACH,SAAS,uBAAuB;IAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IACnE,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,cAAc,CAAC;IAElD,uDAAuD;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;IACjF,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;QAAE,OAAO,aAAa,CAAC;IAE3F,MAAM,IAAI,KAAK,CAAC,2BAA2B,cAAc,OAAO,aAAa,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,MAAe;IACzD,IAAI,UAAU,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC;QAE3C,IAAI,MAAM,EAAE,CAAC;YACX,+DAA+D;YAC/D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,eAAe,EAAE,CAAC;QACpB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAEnC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAEvC,MAAM,gBAAgB,GAAG,uBAAuB,EAAE,CAAC;QACnD,OAAO,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAElC,UAAU,GAAG,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,iCAAiC,OAAO,yBAAyB,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,gBAAgB;IAC9B,UAAU,GAAG,IAAI,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { falsePositives } from './schema.js';
|
|
2
|
+
import type { DrizzleDb } from './database.js';
|
|
3
|
+
import type { FalsePositive } from '../types/false-positive.js';
|
|
4
|
+
export type FalsePositiveRow = typeof falsePositives.$inferSelect;
|
|
5
|
+
export declare class FalsePositiveRepository {
|
|
6
|
+
private readonly db;
|
|
7
|
+
constructor(db: DrizzleDb);
|
|
8
|
+
saveFP(fp: Omit<FalsePositive, 'id' | 'createdAt'>): FalsePositive;
|
|
9
|
+
listFPs(workspace: string, repo: string): FalsePositive[];
|
|
10
|
+
removeFP(id: number): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=false-positive-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"false-positive-repository.d.ts","sourceRoot":"","sources":["../../src/persistence/false-positive-repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG,OAAO,cAAc,CAAC,YAAY,CAAC;AAElE,qBAAa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,SAAS;IAE1C,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,GAAG,aAAa;IA8BlE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE;IAoBzD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAG3B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { eq, and } from 'drizzle-orm';
|
|
2
|
+
import { falsePositives } from './schema.js';
|
|
3
|
+
export class FalsePositiveRepository {
|
|
4
|
+
db;
|
|
5
|
+
constructor(db) {
|
|
6
|
+
this.db = db;
|
|
7
|
+
}
|
|
8
|
+
saveFP(fp) {
|
|
9
|
+
const createdAt = new Date().toISOString();
|
|
10
|
+
const result = this.db
|
|
11
|
+
.insert(falsePositives)
|
|
12
|
+
.values({
|
|
13
|
+
filePath: fp.filePath,
|
|
14
|
+
lineNumber: fp.lineNumber ?? null,
|
|
15
|
+
category: fp.category,
|
|
16
|
+
agentId: fp.agentId ?? null,
|
|
17
|
+
workspace: fp.workspace,
|
|
18
|
+
repo: fp.repo,
|
|
19
|
+
reason: fp.reason ?? null,
|
|
20
|
+
createdAt,
|
|
21
|
+
})
|
|
22
|
+
.returning()
|
|
23
|
+
.get();
|
|
24
|
+
return {
|
|
25
|
+
id: result.id,
|
|
26
|
+
filePath: result.filePath,
|
|
27
|
+
...(result.lineNumber !== null ? { lineNumber: result.lineNumber } : {}),
|
|
28
|
+
category: result.category,
|
|
29
|
+
...(result.agentId !== null ? { agentId: result.agentId } : {}),
|
|
30
|
+
workspace: result.workspace,
|
|
31
|
+
repo: result.repo,
|
|
32
|
+
...(result.reason !== null ? { reason: result.reason } : {}),
|
|
33
|
+
createdAt: result.createdAt,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
listFPs(workspace, repo) {
|
|
37
|
+
const rows = this.db
|
|
38
|
+
.select()
|
|
39
|
+
.from(falsePositives)
|
|
40
|
+
.where(and(eq(falsePositives.workspace, workspace), eq(falsePositives.repo, repo)))
|
|
41
|
+
.all();
|
|
42
|
+
return rows.map(row => ({
|
|
43
|
+
id: row.id,
|
|
44
|
+
filePath: row.filePath,
|
|
45
|
+
...(row.lineNumber !== null ? { lineNumber: row.lineNumber } : {}),
|
|
46
|
+
category: row.category,
|
|
47
|
+
...(row.agentId !== null ? { agentId: row.agentId } : {}),
|
|
48
|
+
workspace: row.workspace,
|
|
49
|
+
repo: row.repo,
|
|
50
|
+
...(row.reason !== null ? { reason: row.reason } : {}),
|
|
51
|
+
createdAt: row.createdAt,
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
removeFP(id) {
|
|
55
|
+
this.db.delete(falsePositives).where(eq(falsePositives.id, id)).run();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=false-positive-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"false-positive-repository.js","sourceRoot":"","sources":["../../src/persistence/false-positive-repository.ts"],"names":[],"mappings":"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"}
|