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,103 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parse as parseYaml, YAMLParseError } from 'yaml';
|
|
4
|
+
import { repoConfigSchema } from '../types/repo-config.js';
|
|
5
|
+
export class ConfigParseError extends Error {
|
|
6
|
+
cause;
|
|
7
|
+
constructor(message, cause) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.cause = cause;
|
|
10
|
+
this.name = 'ConfigParseError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ConfigValidationError extends Error {
|
|
14
|
+
issues;
|
|
15
|
+
constructor(message, issues) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.issues = issues;
|
|
18
|
+
this.name = 'ConfigValidationError';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
const CONFIG_FILE_NAMES = ['.prism.yml', '.prism.yaml', 'prism.config.yml', 'prism.config.yaml'];
|
|
22
|
+
export class RepoConfigLoader {
|
|
23
|
+
/**
|
|
24
|
+
* Load repo config from the first matching config file in rootPath.
|
|
25
|
+
* Returns {} if no config file is found.
|
|
26
|
+
*/
|
|
27
|
+
async load(rootPath) {
|
|
28
|
+
for (const name of CONFIG_FILE_NAMES) {
|
|
29
|
+
const filePath = path.join(rootPath, name);
|
|
30
|
+
try {
|
|
31
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
32
|
+
return this.loadFromString(content);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
// File not found — try next
|
|
36
|
+
if (err.code === 'ENOENT') {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Re-throw ConfigParseError / ConfigValidationError as-is
|
|
40
|
+
if (err instanceof ConfigParseError || err instanceof ConfigValidationError) {
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return {};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Parse and validate a YAML string as a RepoConfig.
|
|
50
|
+
* Throws ConfigParseError on invalid YAML, ConfigValidationError on schema failure.
|
|
51
|
+
*/
|
|
52
|
+
loadFromString(yaml) {
|
|
53
|
+
let parsed;
|
|
54
|
+
try {
|
|
55
|
+
parsed = parseYaml(yaml);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (err instanceof YAMLParseError) {
|
|
59
|
+
throw new ConfigParseError(`Invalid YAML: ${err.message}`, err);
|
|
60
|
+
}
|
|
61
|
+
throw new ConfigParseError(`Failed to parse YAML`, err);
|
|
62
|
+
}
|
|
63
|
+
// Empty YAML (null / undefined) → treat as empty config
|
|
64
|
+
if (parsed === null || parsed === undefined) {
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
const result = repoConfigSchema.safeParse(parsed);
|
|
68
|
+
if (!result.success) {
|
|
69
|
+
const issues = result.error.issues.map((issue) => ({
|
|
70
|
+
path: issue.path,
|
|
71
|
+
message: issue.message,
|
|
72
|
+
}));
|
|
73
|
+
throw new ConfigValidationError(`Invalid repo config: ${issues.map((i) => `${i.path.join('.')}: ${i.message}`).join(', ')}`, issues);
|
|
74
|
+
}
|
|
75
|
+
return result.data;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Merge global PrismConfig with repo-level RepoConfig.
|
|
80
|
+
* Repo config fields take precedence over global config defaults.
|
|
81
|
+
*/
|
|
82
|
+
export function mergeConfigs(global, repo) {
|
|
83
|
+
const merged = { ...global };
|
|
84
|
+
if (repo.model !== undefined) {
|
|
85
|
+
merged.defaultModel = repo.model;
|
|
86
|
+
}
|
|
87
|
+
if (repo.maxDiffLines !== undefined) {
|
|
88
|
+
merged.maxDiffLines = repo.maxDiffLines;
|
|
89
|
+
}
|
|
90
|
+
// Pass through all repo-specific fields
|
|
91
|
+
if (repo.agents !== undefined)
|
|
92
|
+
merged.agents = repo.agents;
|
|
93
|
+
if (repo.conventions !== undefined)
|
|
94
|
+
merged.conventions = repo.conventions;
|
|
95
|
+
if (repo.conventionsFile !== undefined)
|
|
96
|
+
merged.conventionsFile = repo.conventionsFile;
|
|
97
|
+
if (repo.skills !== undefined)
|
|
98
|
+
merged.skills = repo.skills;
|
|
99
|
+
if (repo.excludePatterns !== undefined)
|
|
100
|
+
merged.excludePatterns = repo.excludePatterns;
|
|
101
|
+
return merged;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=repo-config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-config-loader.js","sourceRoot":"","sources":["../../src/config/repo-config-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import readline from 'node:readline';
|
|
2
|
+
import type { PRMetadata } from '../types/index.js';
|
|
3
|
+
import type { WorkflowCallbacks, CostWarningInfo, ReviewSummary, PublishResult, FinalReport, IntegrityReport, SummaryPostResult } from './workflow-callbacks.js';
|
|
4
|
+
/**
|
|
5
|
+
* CLI implementation of WorkflowCallbacks.
|
|
6
|
+
*
|
|
7
|
+
* Reproduces the exact terminal output that ReviewWorkflow originally produced:
|
|
8
|
+
* - stderr for progress/status messages
|
|
9
|
+
* - stdout for user-facing tables and final reports
|
|
10
|
+
* - readline for interactive prompts
|
|
11
|
+
*/
|
|
12
|
+
export declare class CLIWorkflowCallbacks implements WorkflowCallbacks {
|
|
13
|
+
private readonly rl;
|
|
14
|
+
constructor(readlineFn?: () => readline.Interface);
|
|
15
|
+
onPRFetched(pr: PRMetadata): void;
|
|
16
|
+
onProgress(_step: number, _totalSteps: number, message: string): void;
|
|
17
|
+
onAgentsPlanReady(_agentIds: string[], totalAgents: number): void;
|
|
18
|
+
onAgentStart(_agentId: string, _agentIndex: number, _totalAgents: number): void;
|
|
19
|
+
onAgentComplete(agentId: string, agentIndex: number, totalAgents: number, findingsCount?: number, _durationMs?: number): void;
|
|
20
|
+
onAgentFailed(agentId: string, agentIndex: number, totalAgents: number, error?: string): void;
|
|
21
|
+
onCostWarning(info: CostWarningInfo): Promise<boolean>;
|
|
22
|
+
onReviewSummary(summary: ReviewSummary): void;
|
|
23
|
+
onPublishPrompt(findingsCount: number): Promise<boolean>;
|
|
24
|
+
onPublishProgress(current: number, total: number, filePath: string): void;
|
|
25
|
+
onPublishComplete(result: PublishResult): void;
|
|
26
|
+
onNoReviewableFiles(): void;
|
|
27
|
+
onIntegrityReport(report: IntegrityReport): void;
|
|
28
|
+
onCleanPR(): void;
|
|
29
|
+
onSummaryPosted(result: SummaryPostResult): void;
|
|
30
|
+
onAutoApproved(): void;
|
|
31
|
+
onComplete(report: FinalReport): void;
|
|
32
|
+
private prompt;
|
|
33
|
+
private isYes;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=cli-workflow-callbacks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-workflow-callbacks.d.ts","sourceRoot":"","sources":["../../src/core/cli-workflow-callbacks.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,aAAa,EACb,WAAW,EACX,eAAe,EACf,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AASjC;;;;;;;GAOG;AACH,qBAAa,oBAAqB,YAAW,iBAAiB;IAC5D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA2B;gBAElC,UAAU,CAAC,EAAE,MAAM,QAAQ,CAAC,SAAS;IAUjD,WAAW,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI;IAIjC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIrE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAIjE,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAI/E,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAI7H,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAIvF,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ5D,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IA8BvC,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK9D,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKzE,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAM9C,mBAAmB,IAAI,IAAI;IAI3B,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IAmBhD,SAAS,IAAI,IAAI;IAIjB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAOhD,cAAc,IAAI,IAAI;IAItB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAWrC,OAAO,CAAC,MAAM;IAUd,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import readline from 'node:readline';
|
|
2
|
+
import Table from 'cli-table3';
|
|
3
|
+
import { formatCost } from '../utils/cost-estimator.js';
|
|
4
|
+
const SEV_LABELS = {
|
|
5
|
+
critical: 'CRITICAL',
|
|
6
|
+
high: 'HIGH',
|
|
7
|
+
medium: 'MEDIUM',
|
|
8
|
+
low: 'LOW',
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* CLI implementation of WorkflowCallbacks.
|
|
12
|
+
*
|
|
13
|
+
* Reproduces the exact terminal output that ReviewWorkflow originally produced:
|
|
14
|
+
* - stderr for progress/status messages
|
|
15
|
+
* - stdout for user-facing tables and final reports
|
|
16
|
+
* - readline for interactive prompts
|
|
17
|
+
*/
|
|
18
|
+
export class CLIWorkflowCallbacks {
|
|
19
|
+
rl;
|
|
20
|
+
constructor(readlineFn) {
|
|
21
|
+
this.rl =
|
|
22
|
+
readlineFn ??
|
|
23
|
+
(() => readline.createInterface({
|
|
24
|
+
input: process.stdin,
|
|
25
|
+
output: process.stderr,
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
onPRFetched(pr) {
|
|
29
|
+
process.stderr.write(` PR: ${pr.title}\n`);
|
|
30
|
+
}
|
|
31
|
+
onProgress(_step, _totalSteps, message) {
|
|
32
|
+
process.stderr.write(`${message}\n`);
|
|
33
|
+
}
|
|
34
|
+
onAgentsPlanReady(_agentIds, totalAgents) {
|
|
35
|
+
process.stderr.write(`Running ${totalAgents} agents...\n`);
|
|
36
|
+
}
|
|
37
|
+
onAgentStart(_agentId, _agentIndex, _totalAgents) {
|
|
38
|
+
// no-op — too noisy for CI
|
|
39
|
+
}
|
|
40
|
+
onAgentComplete(agentId, agentIndex, totalAgents, findingsCount, _durationMs) {
|
|
41
|
+
process.stderr.write(` ✓ ${agentId} (${agentIndex + 1}/${totalAgents})${findingsCount !== undefined ? ' — ' + findingsCount + ' findings' : ''}\n`);
|
|
42
|
+
}
|
|
43
|
+
onAgentFailed(agentId, agentIndex, totalAgents, error) {
|
|
44
|
+
process.stderr.write(` ✗ ${agentId} (${agentIndex + 1}/${totalAgents})${error !== undefined ? ' — ' + error : ''}\n`);
|
|
45
|
+
}
|
|
46
|
+
async onCostWarning(info) {
|
|
47
|
+
const costStr = `~$${info.estimatedCost.toFixed(2)}`;
|
|
48
|
+
const answer = await this.prompt(`⚠ Large diff detected (${info.totalLines} lines). Estimated cost: ${costStr}. Continue? [y/N]: `);
|
|
49
|
+
return this.isYes(answer);
|
|
50
|
+
}
|
|
51
|
+
onReviewSummary(summary) {
|
|
52
|
+
const { findings, dedupedCount, severityCounts } = summary;
|
|
53
|
+
const table = new Table({
|
|
54
|
+
head: ['File', 'Line', 'Sev', 'Title'],
|
|
55
|
+
style: { head: [] },
|
|
56
|
+
colWidths: [40, 8, 10, 35],
|
|
57
|
+
});
|
|
58
|
+
for (const f of findings) {
|
|
59
|
+
table.push([
|
|
60
|
+
f.filePath.length > 38 ? '...' + f.filePath.slice(-35) : f.filePath,
|
|
61
|
+
String(f.lineNumber),
|
|
62
|
+
SEV_LABELS[f.severity] ?? f.severity.toUpperCase(),
|
|
63
|
+
f.title.length > 33 ? f.title.slice(0, 30) + '...' : f.title,
|
|
64
|
+
]);
|
|
65
|
+
}
|
|
66
|
+
process.stdout.write(table.toString() + '\n');
|
|
67
|
+
process.stdout.write(`\nTotal: ${findings.length} findings (${severityCounts.critical} critical, ${severityCounts.high} high, ${severityCounts.medium} medium, ${severityCounts.low} low)\n`);
|
|
68
|
+
if (dedupedCount > 0) {
|
|
69
|
+
process.stdout.write(`Deduped: ${dedupedCount} (already posted)\n`);
|
|
70
|
+
}
|
|
71
|
+
process.stdout.write('\n');
|
|
72
|
+
}
|
|
73
|
+
async onPublishPrompt(findingsCount) {
|
|
74
|
+
const answer = await this.prompt(`Publish ${findingsCount} findings? [y/N]: `);
|
|
75
|
+
return this.isYes(answer);
|
|
76
|
+
}
|
|
77
|
+
onPublishProgress(current, total, filePath) {
|
|
78
|
+
if (current === 0)
|
|
79
|
+
return;
|
|
80
|
+
process.stderr.write(` Publishing comment ${current}/${total}: ${filePath}\n`);
|
|
81
|
+
}
|
|
82
|
+
onPublishComplete(result) {
|
|
83
|
+
process.stderr.write(`Published: ${result.publishedCount} | Skipped: ${result.skippedCount} | Failed: ${result.failedCount}\n`);
|
|
84
|
+
}
|
|
85
|
+
onNoReviewableFiles() {
|
|
86
|
+
process.stdout.write('No reviewable files found after applying exclusion filters\n');
|
|
87
|
+
}
|
|
88
|
+
onIntegrityReport(report) {
|
|
89
|
+
if (report.totalChecked === 0)
|
|
90
|
+
return;
|
|
91
|
+
if (report.allLegacy) {
|
|
92
|
+
process.stderr.write(`Comment integrity: ${report.untrackableCount} prior findings have no tracked IDs (pre-fix data)\n`);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (report.deletedCount > 0) {
|
|
96
|
+
process.stderr.write(`⚠ Comment integrity: ${report.deletedCount} comment(s) were deleted from Bitbucket\n`);
|
|
97
|
+
for (const f of report.deletedFindings) {
|
|
98
|
+
process.stderr.write(` • ${f.filePath}:${f.lineNumber} [${f.severity}] ${f.title}\n`);
|
|
99
|
+
}
|
|
100
|
+
process.stderr.write(' These findings will be re-reviewed.\n');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (report.verifiedCount > 0) {
|
|
104
|
+
process.stderr.write(`✓ Comment integrity: ${report.verifiedCount} prior comment(s) verified\n`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
onCleanPR() {
|
|
108
|
+
process.stdout.write('✓ No issues found — the PR looks good!\n');
|
|
109
|
+
}
|
|
110
|
+
onSummaryPosted(result) {
|
|
111
|
+
process.stderr.write(`✓ Review summary posted (comment #${result.commentId})\n`);
|
|
112
|
+
if (result.approved) {
|
|
113
|
+
process.stderr.write('✓ PR auto-approved\n');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
onAutoApproved() {
|
|
117
|
+
// no-op — approval info already surfaced in onSummaryPosted
|
|
118
|
+
}
|
|
119
|
+
onComplete(report) {
|
|
120
|
+
process.stdout.write('\nReview complete.\n');
|
|
121
|
+
process.stdout.write(`Cost estimate: ${formatCost(report.cost, report.usage)}\n`);
|
|
122
|
+
if (report.sessionId) {
|
|
123
|
+
process.stdout.write(`Session ID: ${report.sessionId} (saved to local DB)\n`);
|
|
124
|
+
}
|
|
125
|
+
process.stdout.write('Memory: ✓ Saved to local DB\n');
|
|
126
|
+
}
|
|
127
|
+
// ── Private helpers ──────────────────────────────────────────────────────────
|
|
128
|
+
prompt(question) {
|
|
129
|
+
return new Promise((resolve) => {
|
|
130
|
+
const rl = this.rl();
|
|
131
|
+
rl.question(question, (answer) => {
|
|
132
|
+
rl.close();
|
|
133
|
+
resolve(answer.trim());
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
isYes(answer) {
|
|
138
|
+
return /^y(es)?$/i.test(answer.trim());
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=cli-workflow-callbacks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-workflow-callbacks.js","sourceRoot":"","sources":["../../src/core/cli-workflow-callbacks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { BitbucketClient } from '../bitbucket/client.js';
|
|
2
|
+
import type { Logger } from '../utils/logger.js';
|
|
3
|
+
import type { ReviewFinding, DiffFile } from '../types/index.js';
|
|
4
|
+
/** Result returned by `CommentPublisher.publish()`. */
|
|
5
|
+
export interface PublishResult {
|
|
6
|
+
publishedCount: number;
|
|
7
|
+
skippedCount: number;
|
|
8
|
+
failedCount: number;
|
|
9
|
+
/** Maps skip reason → count (e.g. 'excluded-file' → 2). */
|
|
10
|
+
skippedReasons: Map<string, number>;
|
|
11
|
+
/** True when an unrecoverable error forced early termination. */
|
|
12
|
+
aborted: boolean;
|
|
13
|
+
/** Maps dedupHash → Bitbucket comment ID for every successfully published finding. */
|
|
14
|
+
commentIds: Map<string, number>;
|
|
15
|
+
}
|
|
16
|
+
/** Options for controlling behavior in tests (sleep duration, custom sleep fn). */
|
|
17
|
+
export interface CommentPublisherOptions {
|
|
18
|
+
/** Milliseconds to wait between successful posts (default: 500). */
|
|
19
|
+
sleepMs?: number;
|
|
20
|
+
/** Injectable sleep function — defaults to a real setTimeout-based delay. */
|
|
21
|
+
sleepFn?: (ms: number) => Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Publishes `ReviewFinding[]` as inline comments on a Bitbucket pull request.
|
|
25
|
+
*
|
|
26
|
+
* Each finding is validated before posting. Errors are handled per spec 10.3.2:
|
|
27
|
+
* - 400 → skip finding, continue
|
|
28
|
+
* - 429 → wait retryAfter + retry once; second 429 → abort
|
|
29
|
+
* - 401 / 403 / 404 / 5xx → abort all remaining
|
|
30
|
+
*/
|
|
31
|
+
export declare class CommentPublisher {
|
|
32
|
+
private readonly client;
|
|
33
|
+
private readonly logger;
|
|
34
|
+
private readonly sleepMs;
|
|
35
|
+
private readonly sleepFn;
|
|
36
|
+
constructor(client: BitbucketClient, logger: Logger, options?: CommentPublisherOptions);
|
|
37
|
+
publish(workspace: string, repo: string, prId: number, findings: ReviewFinding[], parsedFiles: DiffFile[], onProgress?: (current: number, total: number, filePath: string) => void, dedupHashes?: Map<string, string>): Promise<PublishResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Validates a finding before posting.
|
|
40
|
+
* Returns a skip reason string, or null if valid.
|
|
41
|
+
*
|
|
42
|
+
* Validation order (spec 10.2.2):
|
|
43
|
+
* 1. excluded file
|
|
44
|
+
* 2. invalid line (lineNumber <= 0 or not an addition line in parsed diff)
|
|
45
|
+
* 3. empty comment (formatFinding produces empty string)
|
|
46
|
+
*/
|
|
47
|
+
private validate;
|
|
48
|
+
/**
|
|
49
|
+
* Returns true if `lineNumber` corresponds to an addition line for `filePath`
|
|
50
|
+
* in the provided parsed diff files.
|
|
51
|
+
*/
|
|
52
|
+
private isValidAdditionLine;
|
|
53
|
+
/**
|
|
54
|
+
* Attempts to post a single finding comment, including 429 retry logic.
|
|
55
|
+
*
|
|
56
|
+
* Returns `{ continue: true, commentId }` when the loop should continue.
|
|
57
|
+
* Returns `{ continue: false, commentId: null }` when processing must stop (abort set on result).
|
|
58
|
+
*/
|
|
59
|
+
private attemptPost;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=comment-publisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-publisher.d.ts","sourceRoot":"","sources":["../../src/core/comment-publisher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAW9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAmB,MAAM,mBAAmB,CAAC;AAElF,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,iEAAiE;IACjE,OAAO,EAAE,OAAO,CAAC;IACjB,sFAAsF;IACtF,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,mFAAmF;AACnF,MAAM,WAAW,uBAAuB;IACtC,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;gBAGrC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,EAC/B,OAAO,GAAE,uBAA4B;IAUjC,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,EAAE,EACzB,WAAW,EAAE,QAAQ,EAAE,EACvB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,EACvE,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,aAAa,CAAC;IA+DzB;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ;IAoBhB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;;;;OAKG;YACW,WAAW;CAkF1B"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { BitbucketValidationError, BitbucketAuthError, BitbucketForbiddenError, BitbucketNotFoundError, BitbucketRateLimitError, BitbucketServerError, } from '../bitbucket/errors.js';
|
|
2
|
+
import { formatFinding } from '../utils/comment-formatter.js';
|
|
3
|
+
import { isExcluded } from '../utils/file-filter.js';
|
|
4
|
+
/**
|
|
5
|
+
* Publishes `ReviewFinding[]` as inline comments on a Bitbucket pull request.
|
|
6
|
+
*
|
|
7
|
+
* Each finding is validated before posting. Errors are handled per spec 10.3.2:
|
|
8
|
+
* - 400 → skip finding, continue
|
|
9
|
+
* - 429 → wait retryAfter + retry once; second 429 → abort
|
|
10
|
+
* - 401 / 403 / 404 / 5xx → abort all remaining
|
|
11
|
+
*/
|
|
12
|
+
export class CommentPublisher {
|
|
13
|
+
client;
|
|
14
|
+
logger;
|
|
15
|
+
sleepMs;
|
|
16
|
+
sleepFn;
|
|
17
|
+
constructor(client, logger, options = {}) {
|
|
18
|
+
this.client = client;
|
|
19
|
+
this.logger = logger;
|
|
20
|
+
this.sleepMs = options.sleepMs ?? 500;
|
|
21
|
+
this.sleepFn =
|
|
22
|
+
options.sleepFn ??
|
|
23
|
+
((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
24
|
+
}
|
|
25
|
+
// ── Public API ──────────────────────────────────────────────────────────────
|
|
26
|
+
async publish(workspace, repo, prId, findings, parsedFiles, onProgress, dedupHashes) {
|
|
27
|
+
const result = {
|
|
28
|
+
publishedCount: 0,
|
|
29
|
+
skippedCount: 0,
|
|
30
|
+
failedCount: 0,
|
|
31
|
+
skippedReasons: new Map(),
|
|
32
|
+
aborted: false,
|
|
33
|
+
commentIds: new Map(),
|
|
34
|
+
};
|
|
35
|
+
const total = findings.length;
|
|
36
|
+
let current = 0;
|
|
37
|
+
for (const finding of findings) {
|
|
38
|
+
if (result.aborted)
|
|
39
|
+
break;
|
|
40
|
+
// Validate before attempting to post
|
|
41
|
+
const skipReason = this.validate(finding, parsedFiles);
|
|
42
|
+
if (skipReason !== null) {
|
|
43
|
+
result.skippedCount++;
|
|
44
|
+
result.skippedReasons.set(skipReason, (result.skippedReasons.get(skipReason) ?? 0) + 1);
|
|
45
|
+
this.logger.debug(`[publisher] Skipping ${finding.filePath}:${finding.lineNumber} — ${skipReason}`);
|
|
46
|
+
current++;
|
|
47
|
+
onProgress?.(current, total, finding.filePath);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
// Attempt to post (handles retry + abort logic)
|
|
51
|
+
const { continue: shouldContinue, commentId } = await this.attemptPost(workspace, repo, prId, finding, result);
|
|
52
|
+
// Capture comment ID if provided and the post succeeded
|
|
53
|
+
if (commentId !== null && dedupHashes !== undefined) {
|
|
54
|
+
const key = `${finding.filePath}:${finding.lineNumber}`;
|
|
55
|
+
const hash = dedupHashes.get(key);
|
|
56
|
+
if (hash !== undefined) {
|
|
57
|
+
result.commentIds.set(hash, commentId);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (!shouldContinue)
|
|
61
|
+
break;
|
|
62
|
+
// Delay between posts (spec 10.3.1: 500ms between each successful post)
|
|
63
|
+
if (this.sleepMs > 0) {
|
|
64
|
+
await this.sleepFn(this.sleepMs);
|
|
65
|
+
}
|
|
66
|
+
current++;
|
|
67
|
+
onProgress?.(current, total, finding.filePath);
|
|
68
|
+
}
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
// ── Private helpers ─────────────────────────────────────────────────────────
|
|
72
|
+
/**
|
|
73
|
+
* Validates a finding before posting.
|
|
74
|
+
* Returns a skip reason string, or null if valid.
|
|
75
|
+
*
|
|
76
|
+
* Validation order (spec 10.2.2):
|
|
77
|
+
* 1. excluded file
|
|
78
|
+
* 2. invalid line (lineNumber <= 0 or not an addition line in parsed diff)
|
|
79
|
+
* 3. empty comment (formatFinding produces empty string)
|
|
80
|
+
*/
|
|
81
|
+
validate(finding, files) {
|
|
82
|
+
// 1. Excluded file
|
|
83
|
+
if (isExcluded(finding.filePath)) {
|
|
84
|
+
return 'excluded-file';
|
|
85
|
+
}
|
|
86
|
+
// 2. Invalid line number
|
|
87
|
+
if (finding.lineNumber <= 0 || !this.isValidAdditionLine(finding.filePath, finding.lineNumber, files)) {
|
|
88
|
+
return 'invalid-line';
|
|
89
|
+
}
|
|
90
|
+
// 3. Empty comment
|
|
91
|
+
const formatted = formatFinding(finding);
|
|
92
|
+
if (!formatted || formatted.trim().length === 0) {
|
|
93
|
+
return 'empty-comment';
|
|
94
|
+
}
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Returns true if `lineNumber` corresponds to an addition line for `filePath`
|
|
99
|
+
* in the provided parsed diff files.
|
|
100
|
+
*/
|
|
101
|
+
isValidAdditionLine(filePath, lineNumber, files) {
|
|
102
|
+
const file = files.find((f) => f.newPath === filePath);
|
|
103
|
+
if (!file)
|
|
104
|
+
return false;
|
|
105
|
+
return file.hunks.some((hunk) => hunk.lines.some((line) => line.type === 'addition' && line.lineNumber === lineNumber));
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Attempts to post a single finding comment, including 429 retry logic.
|
|
109
|
+
*
|
|
110
|
+
* Returns `{ continue: true, commentId }` when the loop should continue.
|
|
111
|
+
* Returns `{ continue: false, commentId: null }` when processing must stop (abort set on result).
|
|
112
|
+
*/
|
|
113
|
+
async attemptPost(workspace, repo, prId, finding, result) {
|
|
114
|
+
const body = {
|
|
115
|
+
content: { raw: formatFinding(finding) },
|
|
116
|
+
inline: {
|
|
117
|
+
to: finding.lineNumber,
|
|
118
|
+
path: finding.filePath,
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
try {
|
|
122
|
+
const comment = await this.client.postInlineComment(workspace, repo, prId, body);
|
|
123
|
+
result.publishedCount++;
|
|
124
|
+
this.logger.debug(`[publisher] Published ${finding.filePath}:${finding.lineNumber}`);
|
|
125
|
+
return { continue: true, commentId: comment.id };
|
|
126
|
+
}
|
|
127
|
+
catch (firstErr) {
|
|
128
|
+
// 400 — skip this finding, continue
|
|
129
|
+
if (firstErr instanceof BitbucketValidationError) {
|
|
130
|
+
result.skippedCount++;
|
|
131
|
+
result.skippedReasons.set('api-validation', (result.skippedReasons.get('api-validation') ?? 0) + 1);
|
|
132
|
+
this.logger.warn(`[publisher] Skipped ${finding.filePath}:${finding.lineNumber} — Bitbucket 400: ${firstErr.detail}`);
|
|
133
|
+
return { continue: true, commentId: null };
|
|
134
|
+
}
|
|
135
|
+
// 429 — wait retryAfter and retry once
|
|
136
|
+
if (firstErr instanceof BitbucketRateLimitError) {
|
|
137
|
+
const waitMs = firstErr.retryAfter * 1000;
|
|
138
|
+
this.logger.warn(`[publisher] Rate limited — waiting ${firstErr.retryAfter}s before retry`);
|
|
139
|
+
await this.sleepFn(waitMs);
|
|
140
|
+
try {
|
|
141
|
+
const comment = await this.client.postInlineComment(workspace, repo, prId, body);
|
|
142
|
+
result.publishedCount++;
|
|
143
|
+
this.logger.debug(`[publisher] Published (after retry) ${finding.filePath}:${finding.lineNumber}`);
|
|
144
|
+
return { continue: true, commentId: comment.id };
|
|
145
|
+
}
|
|
146
|
+
catch (_retryErr) {
|
|
147
|
+
// Second failure (another 429 or anything else) → abort
|
|
148
|
+
result.failedCount++;
|
|
149
|
+
result.aborted = true;
|
|
150
|
+
this.logger.error(`[publisher] Rate limit retry failed — aborting remaining findings`);
|
|
151
|
+
return { continue: false, commentId: null };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// 401, 403, 404, 5xx — abort all remaining
|
|
155
|
+
if (firstErr instanceof BitbucketAuthError ||
|
|
156
|
+
firstErr instanceof BitbucketForbiddenError ||
|
|
157
|
+
firstErr instanceof BitbucketNotFoundError ||
|
|
158
|
+
firstErr instanceof BitbucketServerError) {
|
|
159
|
+
result.failedCount++;
|
|
160
|
+
result.aborted = true;
|
|
161
|
+
this.logger.error(`[publisher] Fatal error on ${finding.filePath}:${finding.lineNumber} — aborting: ${firstErr.message}`);
|
|
162
|
+
return { continue: false, commentId: null };
|
|
163
|
+
}
|
|
164
|
+
// Unknown error — abort
|
|
165
|
+
result.failedCount++;
|
|
166
|
+
result.aborted = true;
|
|
167
|
+
this.logger.error(`[publisher] Unexpected error — aborting: ${String(firstErr)}`);
|
|
168
|
+
return { continue: false, commentId: null };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=comment-publisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-publisher.js","sourceRoot":"","sources":["../../src/core/comment-publisher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { BitbucketComment } from '../types/bitbucket.js';
|
|
2
|
+
import type { IntegrityReport } from './workflow-callbacks.js';
|
|
3
|
+
export interface FindingRecord {
|
|
4
|
+
dedupHash: string;
|
|
5
|
+
bitbucketCommentId: number | null;
|
|
6
|
+
filePath: string;
|
|
7
|
+
lineNumber: number;
|
|
8
|
+
severity: string;
|
|
9
|
+
title: string;
|
|
10
|
+
agentId: string;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
createdAt: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Pure function — no I/O, no side effects.
|
|
16
|
+
*
|
|
17
|
+
* Given the findings stored in the DB for a PR and the live BB comment list,
|
|
18
|
+
* returns an IntegrityReport describing which findings are still present,
|
|
19
|
+
* which were deleted, and which cannot be tracked (legacy null IDs).
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkCommentIntegrity(priorFindings: FindingRecord[], existingComments: BitbucketComment[]): IntegrityReport;
|
|
22
|
+
//# sourceMappingURL=integrity-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrity-checker.d.ts","sourceRoot":"","sources":["../../src/core/integrity-checker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAsB,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEnF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,aAAa,EAAE,EAC9B,gBAAgB,EAAE,gBAAgB,EAAE,GACnC,eAAe,CAkFjB"}
|