@probelabs/visor 0.1.106 → 0.1.111
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 +71 -2
- package/action.yml +1 -1
- package/defaults/code-refiner.yaml +114 -0
- package/defaults/{.visor.yaml → code-review.yaml} +35 -226
- package/defaults/override.yaml +52 -0
- package/defaults/task-refinement.yaml +624 -0
- package/defaults/visor.tests.yaml +685 -0
- package/defaults/visor.yaml +483 -0
- package/dist/action-cli-bridge.d.ts +11 -82
- package/dist/action-cli-bridge.d.ts.map +1 -1
- package/dist/ai-review-service.d.ts +28 -9
- package/dist/ai-review-service.d.ts.map +1 -1
- package/dist/check-execution-engine.d.ts +19 -331
- package/dist/check-execution-engine.d.ts.map +1 -1
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/cron-scheduler.d.ts +3 -3
- package/dist/cron-scheduler.d.ts.map +1 -1
- package/dist/debug-visualizer/ws-server.d.ts +7 -1
- package/dist/debug-visualizer/ws-server.d.ts.map +1 -1
- package/dist/defaults/code-refiner.yaml +114 -0
- package/dist/defaults/{.visor.yaml → code-review.yaml} +35 -226
- package/dist/defaults/override.yaml +52 -0
- package/dist/defaults/task-refinement.yaml +624 -0
- package/dist/defaults/visor.tests.yaml +685 -0
- package/dist/defaults/visor.yaml +483 -0
- package/dist/docs/DEPLOYMENT.md +118 -0
- package/dist/docs/GITHUB_CHECKS.md +280 -0
- package/dist/docs/NPM_USAGE.md +208 -0
- package/dist/docs/action-reference.md +19 -0
- package/dist/docs/advanced-ai.md +237 -0
- package/dist/docs/ai-configuration.md +535 -0
- package/dist/docs/ai-custom-tools-usage.md +261 -0
- package/dist/docs/ai-custom-tools.md +392 -0
- package/dist/docs/author-permissions.md +610 -0
- package/dist/docs/bot-transports-rfc.md +23 -0
- package/dist/docs/ci-cli-mode.md +34 -0
- package/dist/docs/claude-code.md +74 -0
- package/dist/docs/command-provider.md +559 -0
- package/dist/docs/commands.md +8 -0
- package/dist/docs/configuration.md +324 -0
- package/dist/docs/custom-tools.md +424 -0
- package/dist/docs/dashboards/README.md +23 -0
- package/dist/docs/dashboards/grafana-visor-diagrams.json +20 -0
- package/dist/docs/dashboards/grafana-visor-overview.json +33 -0
- package/dist/docs/debug-visualizer-progress.md +572 -0
- package/dist/docs/debug-visualizer-rfc.md +691 -0
- package/dist/docs/debug-visualizer.md +114 -0
- package/dist/docs/debugging.md +636 -0
- package/dist/docs/default-output-schema.md +28 -0
- package/dist/docs/dependencies.md +369 -0
- package/dist/docs/dev-playbook.md +9 -0
- package/dist/docs/engine-pause-resume-rfc.md +192 -0
- package/dist/docs/engine-state-machine-plan.md +333 -0
- package/dist/docs/event-driven-github-integration-rfc.md +743 -0
- package/dist/docs/event-triggers.md +292 -0
- package/dist/docs/execution-statistics-rfc.md +290 -0
- package/dist/docs/fact-validator-gap-analysis.md +178 -0
- package/dist/docs/fact-validator-implementation-plan.md +1235 -0
- package/dist/docs/fail-if.md +95 -0
- package/dist/docs/failure-conditions-implementation.md +271 -0
- package/dist/docs/failure-conditions-schema.md +173 -0
- package/dist/docs/failure-routing-rfc.md +193 -0
- package/dist/docs/failure-routing.md +507 -0
- package/dist/docs/foreach-dependency-propagation.md +473 -0
- package/dist/docs/github-ops.md +89 -0
- package/dist/docs/goto-forward-run-plan.md +113 -0
- package/dist/docs/guides/criticality-modes.md +332 -0
- package/dist/docs/guides/fault-management-and-contracts.md +738 -0
- package/dist/docs/guides/workflow-style-guide.md +224 -0
- package/dist/docs/http.md +299 -0
- package/dist/docs/human-input-provider.md +372 -0
- package/dist/docs/lifecycle-hooks.md +253 -0
- package/dist/docs/limits.md +64 -0
- package/dist/docs/liquid-templates.md +490 -0
- package/dist/docs/loop-routing-refactor.md +89 -0
- package/dist/docs/mcp-provider.md +557 -0
- package/dist/docs/mcp.md +124 -0
- package/dist/docs/memory.md +903 -0
- package/dist/docs/observability.md +12 -0
- package/dist/docs/output-formats.md +20 -0
- package/dist/docs/output-formatting.md +29 -0
- package/dist/docs/output-history.md +383 -0
- package/dist/docs/performance.md +6 -0
- package/dist/docs/pluggable.md +124 -0
- package/dist/docs/proposals/snapshot-scope-execution.md +236 -0
- package/dist/docs/providers/git-checkout.md +589 -0
- package/dist/docs/recipes.md +474 -0
- package/dist/docs/rfc/git-checkout-step.md +601 -0
- package/dist/docs/rfc/on_init-hook.md +1294 -0
- package/dist/docs/rfc/workspace-isolation.md +216 -0
- package/dist/docs/roadmap/criticality-implementation-tasks.md +92 -0
- package/dist/docs/router-patterns.md +339 -0
- package/dist/docs/schema-next-pr.md +10 -0
- package/dist/docs/schema-templates.md +68 -0
- package/dist/docs/script.md +34 -0
- package/dist/docs/sdk.md +222 -0
- package/dist/docs/security.md +7 -0
- package/dist/docs/suppressions.md +89 -0
- package/dist/docs/tag-filtering.md +258 -0
- package/dist/docs/telemetry-setup.md +119 -0
- package/dist/docs/telemetry-tracing-rfc.md +275 -0
- package/dist/docs/test-framework-rfc.md +680 -0
- package/dist/docs/testing/assertions.md +85 -0
- package/dist/docs/testing/ci.md +44 -0
- package/dist/docs/testing/cli.md +41 -0
- package/dist/docs/testing/cookbook.md +172 -0
- package/dist/docs/testing/dsl-reference.md +199 -0
- package/dist/docs/testing/fixtures-and-mocks.md +91 -0
- package/dist/docs/testing/flows.md +92 -0
- package/dist/docs/testing/getting-started.md +93 -0
- package/dist/docs/testing/troubleshooting.md +55 -0
- package/dist/docs/timeouts.md +50 -0
- package/dist/docs/troubleshooting.md +7 -0
- package/dist/docs/visor-sdk-rfc.md +186 -0
- package/dist/docs/workflows.md +569 -0
- package/dist/engine/on-finish/orchestrator.d.ts +19 -0
- package/dist/engine/on-finish/orchestrator.d.ts.map +1 -0
- package/dist/engine/on-finish/utils.d.ts +44 -0
- package/dist/engine/on-finish/utils.d.ts.map +1 -0
- package/dist/event-bus/event-bus.d.ts +13 -0
- package/dist/event-bus/event-bus.d.ts.map +1 -0
- package/dist/event-bus/types.d.ts +71 -0
- package/dist/event-bus/types.d.ts.map +1 -0
- package/dist/examples/.claude/agents/code-reviewer.md +69 -0
- package/dist/examples/.mcp.json +34 -0
- package/dist/examples/CALCULATOR-SDK.md +364 -0
- package/dist/examples/README.md +384 -0
- package/dist/examples/ai-custom-tools-example.yaml +206 -0
- package/dist/examples/ai-custom-tools-simple.yaml +76 -0
- package/dist/examples/ai-retry-fallback-config.yaml +180 -0
- package/dist/examples/ai-with-bash.yaml +126 -0
- package/dist/examples/ai-with-mcp.yaml +82 -0
- package/dist/examples/basic-human-input.yaml +15 -0
- package/dist/examples/bedrock-config.yaml +77 -0
- package/dist/examples/calculator-config.yaml +133 -0
- package/dist/examples/calculator-json-output-guide.md +311 -0
- package/dist/examples/calculator-sdk-automated.ts +340 -0
- package/dist/examples/calculator-sdk-example.ts +275 -0
- package/dist/examples/calculator-sdk-json.ts +331 -0
- package/dist/examples/calculator-sdk-real.ts +374 -0
- package/dist/examples/calculator-sdk-test.ts +148 -0
- package/dist/examples/claude-code-config.yaml +191 -0
- package/dist/examples/cron-webhook-config.yaml +215 -0
- package/dist/examples/custom-template.liquid +57 -0
- package/dist/examples/custom-tools-example.yaml +281 -0
- package/dist/examples/enhanced-config.yaml +165 -0
- package/dist/examples/environments/visor.base.yaml +92 -0
- package/dist/examples/environments/visor.dev.yaml +33 -0
- package/dist/examples/environments/visor.prod.yaml +95 -0
- package/dist/examples/environments/visor.staging.yaml +46 -0
- package/dist/examples/fact-validator.yaml +361 -0
- package/dist/examples/fail-if-simple.yaml +90 -0
- package/dist/examples/failure-conditions-advanced.yaml +136 -0
- package/dist/examples/failure-conditions-basic.yaml +48 -0
- package/dist/examples/failure-conditions-github-style.yaml +119 -0
- package/dist/examples/failure-conditions-migration.yaml +74 -0
- package/dist/examples/for-loop-example.yaml +176 -0
- package/dist/examples/forEach-example.yaml +120 -0
- package/dist/examples/git-checkout-basic.yaml +32 -0
- package/dist/examples/git-checkout-compare.yaml +59 -0
- package/dist/examples/git-checkout-cross-repo.yaml +76 -0
- package/dist/examples/github-workflow-with-tags.yml +163 -0
- package/dist/examples/http-integration-config.yaml +240 -0
- package/dist/examples/https-server-config.yaml +209 -0
- package/dist/examples/human-input-example.yaml +63 -0
- package/dist/examples/if-conditions.yaml +173 -0
- package/dist/examples/jira-simple-example.yaml +56 -0
- package/dist/examples/jira-single-issue-workflow.yaml +166 -0
- package/dist/examples/jira-workflow-mcp.yaml +182 -0
- package/dist/examples/mcp/analyzer.py +119 -0
- package/dist/examples/mcp-provider-example.yaml +301 -0
- package/dist/examples/memory-counter.yaml +99 -0
- package/dist/examples/memory-error-collection.yaml +104 -0
- package/dist/examples/memory-exec-js.yaml +247 -0
- package/dist/examples/memory-namespace-isolation.yaml +184 -0
- package/dist/examples/memory-retry-counter.yaml +65 -0
- package/dist/examples/memory-state-machine.yaml +170 -0
- package/dist/examples/on-init-import-demo.yaml +179 -0
- package/dist/examples/outputs-raw-basic.yaml +26 -0
- package/dist/examples/project-with-tools.yaml +174 -0
- package/dist/examples/prompts/architecture-analysis.liquid +116 -0
- package/dist/examples/prompts/security-comprehensive.liquid +107 -0
- package/dist/examples/quick-start-tags.yaml +53 -0
- package/dist/examples/reusable-tools.yaml +92 -0
- package/dist/examples/reusable-workflows.yaml +88 -0
- package/dist/examples/routing-basic.yaml +35 -0
- package/dist/examples/routing-dynamic-js.yaml +46 -0
- package/dist/examples/routing-foreach.yaml +34 -0
- package/dist/examples/routing-goto-event.yaml +34 -0
- package/dist/examples/routing-on-success.yaml +25 -0
- package/dist/examples/run-calculator-demo.sh +71 -0
- package/dist/examples/sdk-basic.mjs +10 -0
- package/dist/examples/sdk-cjs.cjs +10 -0
- package/dist/examples/sdk-comprehensive.mjs +175 -0
- package/dist/examples/sdk-manual-config.mjs +65 -0
- package/dist/examples/sdk-typescript.js +81 -0
- package/dist/examples/sdk-typescript.ts +92 -0
- package/dist/examples/session-reuse-config.yaml +151 -0
- package/dist/examples/session-reuse-self.yaml +81 -0
- package/dist/examples/slack-simple-chat.yaml +775 -0
- package/dist/examples/templates/security-report.liquid +137 -0
- package/dist/examples/tools-library.yaml +281 -0
- package/dist/examples/transform-example.yaml +199 -0
- package/dist/examples/visor-with-tags.yaml +198 -0
- package/dist/examples/webhook-pipeline-config.yaml +218 -0
- package/dist/examples/workflows/calculator-workflow.yaml +163 -0
- package/dist/examples/workflows/code-quality.yaml +222 -0
- package/dist/examples/workflows/quick-pr-check.yaml +90 -0
- package/dist/examples/workflows/workflow-composition-example.yaml +130 -0
- package/dist/failure-condition-evaluator.d.ts +3 -0
- package/dist/failure-condition-evaluator.d.ts.map +1 -1
- package/dist/frontends/github-frontend.d.ts +58 -0
- package/dist/frontends/github-frontend.d.ts.map +1 -0
- package/dist/frontends/host.d.ts +47 -0
- package/dist/frontends/host.d.ts.map +1 -0
- package/dist/frontends/ndjson-sink.d.ts +12 -0
- package/dist/frontends/ndjson-sink.d.ts.map +1 -0
- package/dist/frontends/slack-frontend.d.ts +58 -0
- package/dist/frontends/slack-frontend.d.ts.map +1 -0
- package/dist/generated/config-schema.d.ts +967 -57
- package/dist/generated/config-schema.d.ts.map +1 -1
- package/dist/generated/config-schema.json +1033 -56
- package/dist/github-check-service.d.ts +4 -6
- package/dist/github-check-service.d.ts.map +1 -1
- package/dist/github-comments.d.ts +2 -4
- package/dist/github-comments.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +134327 -99004
- package/dist/liquid-extensions.d.ts.map +1 -1
- package/dist/logger.d.ts +2 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/memory-store.d.ts +6 -0
- package/dist/memory-store.d.ts.map +1 -1
- package/dist/output/assistant-json/template.liquid +0 -0
- package/dist/output/traces/run-2026-01-20T19-22-58-043Z.ndjson +138 -0
- package/dist/output/traces/run-2026-01-20T19-23-52-175Z.ndjson +1067 -0
- package/dist/output-formatters.d.ts +1 -1
- package/dist/output-formatters.d.ts.map +1 -1
- package/dist/providers/ai-check-provider.d.ts +12 -0
- package/dist/providers/ai-check-provider.d.ts.map +1 -1
- package/dist/providers/check-provider-registry.d.ts +6 -0
- package/dist/providers/check-provider-registry.d.ts.map +1 -1
- package/dist/providers/check-provider.interface.d.ts +43 -1
- package/dist/providers/check-provider.interface.d.ts.map +1 -1
- package/dist/providers/claude-code-check-provider.d.ts.map +1 -1
- package/dist/providers/command-check-provider.d.ts +1 -1
- package/dist/providers/command-check-provider.d.ts.map +1 -1
- package/dist/providers/custom-tool-executor.d.ts +61 -0
- package/dist/providers/custom-tool-executor.d.ts.map +1 -0
- package/dist/providers/git-checkout-provider.d.ts +25 -0
- package/dist/providers/git-checkout-provider.d.ts.map +1 -0
- package/dist/providers/github-ops-provider.d.ts.map +1 -1
- package/dist/providers/http-client-provider.d.ts +4 -4
- package/dist/providers/http-client-provider.d.ts.map +1 -1
- package/dist/providers/human-input-check-provider.d.ts +5 -0
- package/dist/providers/human-input-check-provider.d.ts.map +1 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/log-check-provider.d.ts +2 -5
- package/dist/providers/log-check-provider.d.ts.map +1 -1
- package/dist/providers/mcp-check-provider.d.ts +10 -4
- package/dist/providers/mcp-check-provider.d.ts.map +1 -1
- package/dist/providers/mcp-custom-sse-server.d.ts +66 -0
- package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -0
- package/dist/providers/memory-check-provider.d.ts +2 -8
- package/dist/providers/memory-check-provider.d.ts.map +1 -1
- package/dist/providers/script-check-provider.d.ts +25 -0
- package/dist/providers/script-check-provider.d.ts.map +1 -0
- package/dist/providers/workflow-check-provider.d.ts +56 -0
- package/dist/providers/workflow-check-provider.d.ts.map +1 -0
- package/dist/reviewer.d.ts +2 -1
- package/dist/reviewer.d.ts.map +1 -1
- package/dist/sdk/check-provider-registry-534KL5HT.mjs +27 -0
- package/dist/sdk/chunk-23L3QRYX.mjs +16872 -0
- package/dist/sdk/chunk-23L3QRYX.mjs.map +1 -0
- package/dist/sdk/{chunk-TUTOLSFV.mjs → chunk-3OMWVM6J.mjs} +11 -1
- package/dist/sdk/chunk-3OMWVM6J.mjs.map +1 -0
- package/dist/sdk/chunk-7UK3NIIT.mjs +482 -0
- package/dist/sdk/chunk-7UK3NIIT.mjs.map +1 -0
- package/dist/sdk/chunk-AGIZJ4UZ.mjs +173 -0
- package/dist/sdk/chunk-AGIZJ4UZ.mjs.map +1 -0
- package/dist/sdk/chunk-AIVFBIS4.mjs +1371 -0
- package/dist/sdk/chunk-AIVFBIS4.mjs.map +1 -0
- package/dist/sdk/chunk-AK6BVWIT.mjs +426 -0
- package/dist/sdk/chunk-AK6BVWIT.mjs.map +1 -0
- package/dist/sdk/chunk-AUT26LHW.mjs +139 -0
- package/dist/sdk/chunk-AUT26LHW.mjs.map +1 -0
- package/dist/sdk/chunk-BOVFH3LI.mjs +232 -0
- package/dist/sdk/chunk-BOVFH3LI.mjs.map +1 -0
- package/dist/sdk/chunk-CNX7V5JK.mjs +89 -0
- package/dist/sdk/chunk-CNX7V5JK.mjs.map +1 -0
- package/dist/sdk/chunk-HTOKWMPO.mjs +157 -0
- package/dist/sdk/chunk-HTOKWMPO.mjs.map +1 -0
- package/dist/sdk/chunk-NAW3DB3I.mjs +197 -0
- package/dist/sdk/chunk-NAW3DB3I.mjs.map +1 -0
- package/dist/sdk/chunk-O5EZDNYL.mjs +274 -0
- package/dist/sdk/chunk-O5EZDNYL.mjs.map +1 -0
- package/dist/sdk/chunk-QR7MOMJH.mjs +558 -0
- package/dist/sdk/chunk-QR7MOMJH.mjs.map +1 -0
- package/dist/sdk/chunk-QY2XYPEV.mjs +3556 -0
- package/dist/sdk/chunk-QY2XYPEV.mjs.map +1 -0
- package/dist/sdk/chunk-S2RUE2RG.mjs +145 -0
- package/dist/sdk/chunk-S2RUE2RG.mjs.map +1 -0
- package/dist/sdk/chunk-SIWNBRTK.mjs +800 -0
- package/dist/sdk/chunk-SIWNBRTK.mjs.map +1 -0
- package/dist/sdk/chunk-YSN4G6CI.mjs +146 -0
- package/dist/sdk/chunk-YSN4G6CI.mjs.map +1 -0
- package/dist/sdk/chunk-ZYAUYXSW.mjs +206 -0
- package/dist/sdk/chunk-ZYAUYXSW.mjs.map +1 -0
- package/dist/sdk/command-executor-TYUV6HUS.mjs +14 -0
- package/dist/sdk/config-YNC2EOOT.mjs +16 -0
- package/dist/sdk/config-merger-PX3WIT57.mjs +10 -0
- package/dist/sdk/event-bus-5BEVPQ6T.mjs +35 -0
- package/dist/sdk/event-bus-5BEVPQ6T.mjs.map +1 -0
- package/dist/sdk/failure-condition-evaluator-YGTF2GHG.mjs +17 -0
- package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs +458 -0
- package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs.map +1 -0
- package/dist/sdk/github-frontend-SIAEOCON.mjs +1420 -0
- package/dist/sdk/github-frontend-SIAEOCON.mjs.map +1 -0
- package/dist/sdk/host-DXUYTNMU.mjs +52 -0
- package/dist/sdk/host-DXUYTNMU.mjs.map +1 -0
- package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs → liquid-extensions-PKWCKK7E.mjs} +8 -2
- package/dist/sdk/memory-store-XGBB7LX7.mjs +12 -0
- package/dist/sdk/memory-store-XGBB7LX7.mjs.map +1 -0
- package/dist/sdk/metrics-7PP3EJUH.mjs +29 -0
- package/dist/sdk/metrics-7PP3EJUH.mjs.map +1 -0
- package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs +44 -0
- package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs.map +1 -0
- package/dist/sdk/prompt-state-YRJY6QAL.mjs +16 -0
- package/dist/sdk/prompt-state-YRJY6QAL.mjs.map +1 -0
- package/dist/sdk/renderer-schema-LPKN5UJS.mjs +51 -0
- package/dist/sdk/renderer-schema-LPKN5UJS.mjs.map +1 -0
- package/dist/sdk/routing-6N45MJ4F.mjs +24 -0
- package/dist/sdk/routing-6N45MJ4F.mjs.map +1 -0
- package/dist/sdk/sdk.d.mts +541 -22
- package/dist/sdk/sdk.d.ts +541 -22
- package/dist/sdk/sdk.js +27963 -16505
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +1116 -2169
- package/dist/sdk/sdk.mjs.map +1 -1
- package/dist/sdk/session-registry-4E6YRQ77.mjs +10 -0
- package/dist/sdk/session-registry-4E6YRQ77.mjs.map +1 -0
- package/dist/sdk/slack-frontend-BVKW3GD5.mjs +735 -0
- package/dist/sdk/slack-frontend-BVKW3GD5.mjs.map +1 -0
- package/dist/sdk/trace-helpers-VP6QYVBX.mjs +23 -0
- package/dist/sdk/trace-helpers-VP6QYVBX.mjs.map +1 -0
- package/dist/sdk/{tracer-init-WC75N5NW.mjs → tracer-init-GSLPPLCD.mjs} +2 -2
- package/dist/sdk/tracer-init-GSLPPLCD.mjs.map +1 -0
- package/dist/sdk/workflow-registry-R6KSACFR.mjs +12 -0
- package/dist/sdk/workflow-registry-R6KSACFR.mjs.map +1 -0
- package/dist/sdk.d.ts.map +1 -1
- package/dist/slack/adapter.d.ts +36 -0
- package/dist/slack/adapter.d.ts.map +1 -0
- package/dist/slack/cache-prewarmer.d.ts +31 -0
- package/dist/slack/cache-prewarmer.d.ts.map +1 -0
- package/dist/slack/client.d.ts +77 -0
- package/dist/slack/client.d.ts.map +1 -0
- package/dist/slack/markdown.d.ts +45 -0
- package/dist/slack/markdown.d.ts.map +1 -0
- package/dist/slack/prompt-state.d.ts +33 -0
- package/dist/slack/prompt-state.d.ts.map +1 -0
- package/dist/slack/rate-limiter.d.ts +56 -0
- package/dist/slack/rate-limiter.d.ts.map +1 -0
- package/dist/slack/signature.d.ts +2 -0
- package/dist/slack/signature.d.ts.map +1 -0
- package/dist/slack/socket-runner.d.ts +42 -0
- package/dist/slack/socket-runner.d.ts.map +1 -0
- package/dist/slack/thread-cache.d.ts +51 -0
- package/dist/slack/thread-cache.d.ts.map +1 -0
- package/dist/snapshot-store.d.ts +59 -0
- package/dist/snapshot-store.d.ts.map +1 -0
- package/dist/state-machine/context/build-engine-context.d.ts +17 -0
- package/dist/state-machine/context/build-engine-context.d.ts.map +1 -0
- package/dist/state-machine/dispatch/dependency-gating.d.ts +12 -0
- package/dist/state-machine/dispatch/dependency-gating.d.ts.map +1 -0
- package/dist/state-machine/dispatch/execution-invoker.d.ts +14 -0
- package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -0
- package/dist/state-machine/dispatch/foreach-processor.d.ts +8 -0
- package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -0
- package/dist/state-machine/dispatch/history-snapshot.d.ts +8 -0
- package/dist/state-machine/dispatch/history-snapshot.d.ts.map +1 -0
- package/dist/state-machine/dispatch/on-init-handlers.d.ts +43 -0
- package/dist/state-machine/dispatch/on-init-handlers.d.ts.map +1 -0
- package/dist/state-machine/dispatch/renderer-schema.d.ts +8 -0
- package/dist/state-machine/dispatch/renderer-schema.d.ts.map +1 -0
- package/dist/state-machine/dispatch/stats-manager.d.ts +15 -0
- package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -0
- package/dist/state-machine/dispatch/template-renderer.d.ts +7 -0
- package/dist/state-machine/dispatch/template-renderer.d.ts.map +1 -0
- package/dist/state-machine/execution/summary.d.ts +8 -0
- package/dist/state-machine/execution/summary.d.ts.map +1 -0
- package/dist/state-machine/runner.d.ts +79 -0
- package/dist/state-machine/runner.d.ts.map +1 -0
- package/dist/state-machine/states/check-running.d.ts +14 -0
- package/dist/state-machine/states/check-running.d.ts.map +1 -0
- package/dist/state-machine/states/completed.d.ts +12 -0
- package/dist/state-machine/states/completed.d.ts.map +1 -0
- package/dist/state-machine/states/error.d.ts +11 -0
- package/dist/state-machine/states/error.d.ts.map +1 -0
- package/dist/state-machine/states/init.d.ts +11 -0
- package/dist/state-machine/states/init.d.ts.map +1 -0
- package/dist/state-machine/states/level-dispatch.d.ts +17 -0
- package/dist/state-machine/states/level-dispatch.d.ts.map +1 -0
- package/dist/state-machine/states/plan-ready.d.ts +12 -0
- package/dist/state-machine/states/plan-ready.d.ts.map +1 -0
- package/dist/state-machine/states/routing.d.ts +52 -0
- package/dist/state-machine/states/routing.d.ts.map +1 -0
- package/dist/state-machine/states/wave-planning.d.ts +14 -0
- package/dist/state-machine/states/wave-planning.d.ts.map +1 -0
- package/dist/state-machine/workflow-projection.d.ts +47 -0
- package/dist/state-machine/workflow-projection.d.ts.map +1 -0
- package/dist/state-machine-execution-engine.d.ts +159 -0
- package/dist/state-machine-execution-engine.d.ts.map +1 -0
- package/dist/telemetry/opentelemetry.d.ts.map +1 -1
- package/dist/telemetry/state-capture.d.ts +5 -0
- package/dist/telemetry/state-capture.d.ts.map +1 -1
- package/dist/test-runner/assertions.d.ts +59 -0
- package/dist/test-runner/assertions.d.ts.map +1 -0
- package/dist/test-runner/core/environment.d.ts +8 -0
- package/dist/test-runner/core/environment.d.ts.map +1 -0
- package/dist/test-runner/core/fixture.d.ts +3 -0
- package/dist/test-runner/core/fixture.d.ts.map +1 -0
- package/dist/test-runner/core/flow-stage.d.ts +32 -0
- package/dist/test-runner/core/flow-stage.d.ts.map +1 -0
- package/dist/test-runner/core/mocks.d.ts +8 -0
- package/dist/test-runner/core/mocks.d.ts.map +1 -0
- package/dist/test-runner/core/test-execution-wrapper.d.ts +18 -0
- package/dist/test-runner/core/test-execution-wrapper.d.ts.map +1 -0
- package/dist/test-runner/evaluators.d.ts +45 -0
- package/dist/test-runner/evaluators.d.ts.map +1 -0
- package/dist/test-runner/fixture-loader.d.ts +30 -0
- package/dist/test-runner/fixture-loader.d.ts.map +1 -0
- package/dist/test-runner/index.d.ts +127 -0
- package/dist/test-runner/index.d.ts.map +1 -0
- package/dist/test-runner/recorders/github-recorder.d.ts +23 -0
- package/dist/test-runner/recorders/github-recorder.d.ts.map +1 -0
- package/dist/test-runner/recorders/global-recorder.d.ts +4 -0
- package/dist/test-runner/recorders/global-recorder.d.ts.map +1 -0
- package/dist/test-runner/recorders/slack-recorder.d.ts +17 -0
- package/dist/test-runner/recorders/slack-recorder.d.ts.map +1 -0
- package/dist/test-runner/utils/selectors.d.ts +2 -0
- package/dist/test-runner/utils/selectors.d.ts.map +1 -0
- package/dist/test-runner/validator.d.ts +8 -0
- package/dist/test-runner/validator.d.ts.map +1 -0
- package/dist/traces/run-2026-01-20T19-22-58-043Z.ndjson +138 -0
- package/dist/traces/run-2026-01-20T19-23-52-175Z.ndjson +1067 -0
- package/dist/types/bot.d.ts +109 -0
- package/dist/types/bot.d.ts.map +1 -0
- package/dist/types/cli.d.ts +8 -1
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/config.d.ts +459 -9
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/engine.d.ts +177 -0
- package/dist/types/engine.d.ts.map +1 -0
- package/dist/types/execution.d.ts +73 -0
- package/dist/types/execution.d.ts.map +1 -0
- package/dist/types/git-checkout.d.ts +76 -0
- package/dist/types/git-checkout.d.ts.map +1 -0
- package/dist/types/github.d.ts +51 -0
- package/dist/types/github.d.ts.map +1 -0
- package/dist/types/workflow.d.ts +237 -0
- package/dist/types/workflow.d.ts.map +1 -0
- package/dist/utils/command-executor.d.ts +43 -0
- package/dist/utils/command-executor.d.ts.map +1 -0
- package/dist/utils/comment-metadata.d.ts +21 -0
- package/dist/utils/comment-metadata.d.ts.map +1 -0
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-merger.d.ts.map +1 -1
- package/dist/utils/env-exposure.d.ts +3 -0
- package/dist/utils/env-exposure.d.ts.map +1 -0
- package/dist/utils/file-exclusion.d.ts.map +1 -1
- package/dist/utils/interactive-prompt.d.ts +1 -1
- package/dist/utils/interactive-prompt.d.ts.map +1 -1
- package/dist/utils/json-text-extractor.d.ts +17 -0
- package/dist/utils/json-text-extractor.d.ts.map +1 -0
- package/dist/utils/sandbox.d.ts +10 -0
- package/dist/utils/sandbox.d.ts.map +1 -1
- package/dist/utils/script-memory-ops.d.ts +21 -0
- package/dist/utils/script-memory-ops.d.ts.map +1 -0
- package/dist/utils/template-context.d.ts +8 -0
- package/dist/utils/template-context.d.ts.map +1 -0
- package/dist/utils/tracer-init.d.ts.map +1 -1
- package/dist/utils/workspace-manager.d.ts +118 -0
- package/dist/utils/workspace-manager.d.ts.map +1 -0
- package/dist/utils/worktree-cleanup.d.ts +33 -0
- package/dist/utils/worktree-cleanup.d.ts.map +1 -0
- package/dist/utils/worktree-manager.d.ts +153 -0
- package/dist/utils/worktree-manager.d.ts.map +1 -0
- package/dist/webhook-server.d.ts +3 -3
- package/dist/webhook-server.d.ts.map +1 -1
- package/dist/workflow-executor.d.ts +81 -0
- package/dist/workflow-executor.d.ts.map +1 -0
- package/dist/workflow-registry.d.ts +79 -0
- package/dist/workflow-registry.d.ts.map +1 -0
- package/package.json +12 -5
- package/dist/output/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
- package/dist/sdk/check-execution-engine-2YYKUUSH.mjs +0 -11
- package/dist/sdk/check-execution-engine-6QJXYYON.mjs +0 -11
- package/dist/sdk/check-execution-engine-PJZ4ZOKG.mjs +0 -11
- package/dist/sdk/chunk-33QVZ2D4.mjs +0 -316
- package/dist/sdk/chunk-33QVZ2D4.mjs.map +0 -1
- package/dist/sdk/chunk-B5QBV2QJ.mjs +0 -752
- package/dist/sdk/chunk-B5QBV2QJ.mjs.map +0 -1
- package/dist/sdk/chunk-BVFNRCHT.mjs +0 -14129
- package/dist/sdk/chunk-BVFNRCHT.mjs.map +0 -1
- package/dist/sdk/chunk-KWZW23FG.mjs +0 -14129
- package/dist/sdk/chunk-KWZW23FG.mjs.map +0 -1
- package/dist/sdk/chunk-O4RP4BRH.mjs +0 -14092
- package/dist/sdk/chunk-O4RP4BRH.mjs.map +0 -1
- package/dist/sdk/chunk-TUTOLSFV.mjs.map +0 -1
- package/dist/sdk/chunk-U5D2LY66.mjs +0 -245
- package/dist/sdk/chunk-U5D2LY66.mjs.map +0 -1
- package/dist/sdk/chunk-U7X54EMV.mjs +0 -331
- package/dist/sdk/chunk-U7X54EMV.mjs.map +0 -1
- package/dist/sdk/config-merger-TWUBWFC2.mjs +0 -8
- package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs +0 -61
- package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs.map +0 -1
- package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs +0 -61
- package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs.map +0 -1
- package/dist/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
- /package/dist/sdk/{check-execution-engine-2YYKUUSH.mjs.map → check-provider-registry-534KL5HT.mjs.map} +0 -0
- /package/dist/sdk/{check-execution-engine-6QJXYYON.mjs.map → command-executor-TYUV6HUS.mjs.map} +0 -0
- /package/dist/sdk/{check-execution-engine-PJZ4ZOKG.mjs.map → config-YNC2EOOT.mjs.map} +0 -0
- /package/dist/sdk/{config-merger-TWUBWFC2.mjs.map → config-merger-PX3WIT57.mjs.map} +0 -0
- /package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs.map → failure-condition-evaluator-YGTF2GHG.mjs.map} +0 -0
- /package/dist/sdk/{tracer-init-WC75N5NW.mjs.map → liquid-extensions-PKWCKK7E.mjs.map} +0 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Fail If: Turning conditions into failures
|
|
2
|
+
|
|
3
|
+
Visor lets you declare simple expressions that fail a check when they evaluate to true. This works for any provider (ai, command, http_*, etc.) and is evaluated as part of the execution engine so dependents can be skipped reliably.
|
|
4
|
+
|
|
5
|
+
## Where to configure
|
|
6
|
+
|
|
7
|
+
- Per check:
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
steps:
|
|
11
|
+
analyze-bug:
|
|
12
|
+
type: ai
|
|
13
|
+
schema: ./schemas/ticket-analysis.json
|
|
14
|
+
fail_if: output.error
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- Global (applies to all checks unless the check overrides with its own `fail_if`):
|
|
18
|
+
|
|
19
|
+
```yaml
|
|
20
|
+
fail_if: outputs["fetch-tickets"].error
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Evaluation context
|
|
24
|
+
|
|
25
|
+
Inside the expression you can use:
|
|
26
|
+
|
|
27
|
+
- `output`: the current check's structured output.
|
|
28
|
+
- Includes `issues` and any other fields produced by the provider.
|
|
29
|
+
- For custom schemas, all top‑level JSON fields are preserved and exposed here.
|
|
30
|
+
- For command output that is JSON, fields are available directly; for plain text, treat `output` as a string.
|
|
31
|
+
- `outputs`: a map of dependency outputs keyed by check name. Each value is that check's `output` if present; otherwise the whole check result.
|
|
32
|
+
|
|
33
|
+
**Helper functions:**
|
|
34
|
+
- String: `contains(haystack, needle)`, `startsWith(s,prefix)`, `endsWith(s,suffix)`, `length(x)`
|
|
35
|
+
- Control: `always()`, `success()`, `failure()`
|
|
36
|
+
- Author permissions: `hasMinPermission(level)`, `isOwner()`, `isMember()`, `isCollaborator()`, `isContributor()`, `isFirstTimer()` - See [Author Permissions](./author-permissions.md)
|
|
37
|
+
- Issue/file matching helpers (see source FailureConditionEvaluator for the full list)
|
|
38
|
+
|
|
39
|
+
Truthiness rules follow JavaScript: non‑empty strings are truthy, `""` and `null`/`undefined` are falsy, `0` is falsy.
|
|
40
|
+
|
|
41
|
+
## What happens when a condition is met
|
|
42
|
+
|
|
43
|
+
- The engine adds an error‑severity issue to the check with ruleId `<checkName>_fail_if` (or `global_fail_if` for the global rule).
|
|
44
|
+
- Direct dependents of that check are skipped with reason `dependency_failed`.
|
|
45
|
+
- Skipped checks do not execute their providers; they appear as ⏭ in the details table.
|
|
46
|
+
|
|
47
|
+
Only direct dependencies gate execution. Transitive checks are gated through the chain (i.e., if A fails B, and C depends on B, C will also be skipped once B is skipped).
|
|
48
|
+
|
|
49
|
+
## Examples
|
|
50
|
+
|
|
51
|
+
Fail when AI (custom schema) reports an error:
|
|
52
|
+
|
|
53
|
+
```yaml
|
|
54
|
+
steps:
|
|
55
|
+
analyze-bug:
|
|
56
|
+
type: ai
|
|
57
|
+
schema: ./schemas/ticket-analysis.json
|
|
58
|
+
fail_if: output.error
|
|
59
|
+
log-results:
|
|
60
|
+
type: command
|
|
61
|
+
depends_on: [analyze-bug]
|
|
62
|
+
exec: echo "OK"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Fail when a dependency produced an error flag:
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
fail_if: outputs["fetch-tickets"].error
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Fail on text output pattern:
|
|
72
|
+
|
|
73
|
+
```yaml
|
|
74
|
+
steps:
|
|
75
|
+
lint:
|
|
76
|
+
type: command
|
|
77
|
+
exec: run-linter
|
|
78
|
+
fail_if: contains(output, "ERROR:")
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## ForEach and fail_if
|
|
82
|
+
|
|
83
|
+
When a check uses `forEach: true`, the engine evaluates `fail_if` once on the aggregated result (after all items complete). You can write expressions against the aggregated `output` (often an array), e.g.:
|
|
84
|
+
|
|
85
|
+
```yaml
|
|
86
|
+
fail_if: output.some(x => x.status === 'fail')
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Per‑item fail logic is not evaluated via `fail_if`; use `if:` to skip item work or emit issues inside the per‑item action.
|
|
90
|
+
|
|
91
|
+
## Notes
|
|
92
|
+
|
|
93
|
+
- Fail conditions are evaluated during dependency‑aware execution as part of the engine (not only in providers), ensuring dependents are reliably skipped even if a provider path didn’t attach issues.
|
|
94
|
+
- Issue ruleIds are consistent: `<checkName>_fail_if` for per‑check and `global_fail_if` for global.
|
|
95
|
+
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# Enhanced Failure Condition System for Visor
|
|
2
|
+
|
|
3
|
+
This document provides a complete overview of the enhanced failure condition configuration system implemented for the Visor code review tool.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The enhanced failure condition system allows users to define flexible, powerful conditions using JavaScript expressions that determine when code reviews should fail or generate warnings. It supports both global conditions (applied to all checks) and check-specific conditions, with comprehensive metadata access.
|
|
8
|
+
|
|
9
|
+
## Architecture
|
|
10
|
+
|
|
11
|
+
### Key Components
|
|
12
|
+
|
|
13
|
+
1. **FailureConditionEvaluator** (`src/failure-condition-evaluator.ts`)
|
|
14
|
+
- Core expression evaluation engine using Function Constructor with custom helper functions
|
|
15
|
+
- Processes conditions and generates structured results
|
|
16
|
+
|
|
17
|
+
2. **Enhanced Configuration Types** (`src/types/config.ts`)
|
|
18
|
+
- TypeScript interfaces for failure conditions
|
|
19
|
+
- Context object definition for expression evaluation
|
|
20
|
+
|
|
21
|
+
3. **CheckExecutionEngine Integration** (`src/check-execution-engine.ts`)
|
|
22
|
+
- Integration with existing check execution pipeline
|
|
23
|
+
- Automated evaluation after check completion
|
|
24
|
+
|
|
25
|
+
## Configuration Schema
|
|
26
|
+
|
|
27
|
+
### Simple Conditions (String Format)
|
|
28
|
+
```yaml
|
|
29
|
+
failure_conditions:
|
|
30
|
+
critical_blocker: "metadata.criticalIssues > 0"
|
|
31
|
+
quality_gate: "metadata.totalIssues > 10"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Complex Conditions (Object Format)
|
|
35
|
+
```yaml
|
|
36
|
+
failure_conditions:
|
|
37
|
+
deployment_blocker:
|
|
38
|
+
condition: "metadata.criticalIssues > 0"
|
|
39
|
+
message: "Critical issues block deployment"
|
|
40
|
+
severity: error
|
|
41
|
+
halt_execution: true
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Check-Specific Conditions
|
|
45
|
+
```yaml
|
|
46
|
+
steps:
|
|
47
|
+
security:
|
|
48
|
+
type: ai
|
|
49
|
+
prompt: "Security analysis..."
|
|
50
|
+
on: [pr_opened, pr_updated]
|
|
51
|
+
failure_conditions:
|
|
52
|
+
security_gate: "metadata.errorIssues >= 1"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## JavaScript Expression Context
|
|
56
|
+
|
|
57
|
+
The context object available to all JavaScript expressions (evaluated in a secure sandbox) includes:
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
{
|
|
61
|
+
// Check results
|
|
62
|
+
issues: Issue[], // Array of found issues
|
|
63
|
+
|
|
64
|
+
// Aggregated metadata
|
|
65
|
+
metadata: {
|
|
66
|
+
checkName: string, // e.g., "security-check"
|
|
67
|
+
schema: string, // e.g., "code-review", "plain"
|
|
68
|
+
group: string, // e.g., "security-analysis"
|
|
69
|
+
totalIssues: number,
|
|
70
|
+
criticalIssues: number,
|
|
71
|
+
errorIssues: number,
|
|
72
|
+
warningIssues: number,
|
|
73
|
+
infoIssues: number
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
// Debug information (if available)
|
|
77
|
+
debug: {
|
|
78
|
+
errors: string[],
|
|
79
|
+
processingTime: number,
|
|
80
|
+
provider: string,
|
|
81
|
+
model: string
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Available Helper Functions
|
|
87
|
+
|
|
88
|
+
### Issue Analysis
|
|
89
|
+
- `hasIssueWith(issues, field, value)` - Check if any issue has field matching value
|
|
90
|
+
- `countIssues(issues, field, value)` - Count issues with field matching value
|
|
91
|
+
- `hasFileWith(issues, text)` - Check if any issue file path contains text
|
|
92
|
+
|
|
93
|
+
## Example Use Cases
|
|
94
|
+
|
|
95
|
+
### Basic Quality Gates
|
|
96
|
+
```yaml
|
|
97
|
+
failure_conditions:
|
|
98
|
+
# Block on any critical issues
|
|
99
|
+
critical_blocker: "metadata.criticalIssues > 0"
|
|
100
|
+
|
|
101
|
+
# Warn on too many issues
|
|
102
|
+
quality_threshold: "metadata.totalIssues > 15"
|
|
103
|
+
|
|
104
|
+
# Schema-specific rules
|
|
105
|
+
code_review_gate: "metadata.schema == 'code-review' && metadata.errorIssues > 5"
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Security-Focused Conditions
|
|
109
|
+
```yaml
|
|
110
|
+
failure_conditions:
|
|
111
|
+
# Critical security issues
|
|
112
|
+
security_critical:
|
|
113
|
+
condition: "hasIssueWith(issues, 'category', 'security') && hasIssueWith(issues, 'severity', 'critical')"
|
|
114
|
+
message: "Critical security vulnerabilities detected"
|
|
115
|
+
severity: error
|
|
116
|
+
halt_execution: true
|
|
117
|
+
|
|
118
|
+
# Sensitive file changes
|
|
119
|
+
sensitive_files:
|
|
120
|
+
condition: "hasFileWith(issues, 'auth') || hasFileWith(issues, 'password')"
|
|
121
|
+
message: "Changes in sensitive files require extra review"
|
|
122
|
+
severity: warning
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Performance Monitoring
|
|
126
|
+
```yaml
|
|
127
|
+
failure_conditions:
|
|
128
|
+
# Slow analysis with issues
|
|
129
|
+
performance_concern:
|
|
130
|
+
condition: "debug && debug.processingTime > 30000 && metadata.errorIssues > 2"
|
|
131
|
+
message: "Analysis was slow and found multiple issues"
|
|
132
|
+
severity: info
|
|
133
|
+
|
|
134
|
+
# Database-related issues
|
|
135
|
+
database_issues:
|
|
136
|
+
condition: "hasFileWith(issues, 'database') && hasIssueWith(issues, 'category', 'performance')"
|
|
137
|
+
message: "Database performance issues detected"
|
|
138
|
+
severity: warning
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Implementation Details
|
|
142
|
+
|
|
143
|
+
### Priority and Inheritance
|
|
144
|
+
1. **Check-specific conditions** override global conditions with the same name
|
|
145
|
+
2. **Global conditions** apply to all checks unless specifically overridden
|
|
146
|
+
3. **Multiple conditions** are evaluated independently
|
|
147
|
+
|
|
148
|
+
### Error Handling
|
|
149
|
+
- Malformed JavaScript expressions result in error-level condition results
|
|
150
|
+
- Missing helper functions gracefully degrade to basic JavaScript evaluation
|
|
151
|
+
- All evaluation errors are captured and reported
|
|
152
|
+
|
|
153
|
+
### Performance Considerations
|
|
154
|
+
- JavaScript evaluation in sandbox is fast for typical expressions
|
|
155
|
+
- Helper functions are optimized for common use cases
|
|
156
|
+
- Condition evaluation happens after check completion (non-blocking)
|
|
157
|
+
|
|
158
|
+
## Integration Points
|
|
159
|
+
|
|
160
|
+
### CheckExecutionEngine
|
|
161
|
+
```typescript
|
|
162
|
+
// Evaluate conditions after check completion
|
|
163
|
+
const results = await engine.evaluateFailureConditions(
|
|
164
|
+
checkName,
|
|
165
|
+
reviewSummary,
|
|
166
|
+
config
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
// Check if execution should halt
|
|
170
|
+
if (FailureConditionEvaluator.shouldHaltExecution(results)) {
|
|
171
|
+
// Handle execution halt
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### GitHub Action Integration
|
|
176
|
+
Failure conditions can be used to:
|
|
177
|
+
- Set action exit codes
|
|
178
|
+
- Control PR approval requirements
|
|
179
|
+
- Generate status check results
|
|
180
|
+
- Customize comment formatting
|
|
181
|
+
|
|
182
|
+
### CLI Integration
|
|
183
|
+
- Display failure condition results in CLI output
|
|
184
|
+
- Use for exit code determination
|
|
185
|
+
- Support debug mode for condition testing
|
|
186
|
+
|
|
187
|
+
## Migration Guide
|
|
188
|
+
|
|
189
|
+
### From Basic Configuration
|
|
190
|
+
```yaml
|
|
191
|
+
# Before
|
|
192
|
+
steps:
|
|
193
|
+
security:
|
|
194
|
+
type: ai
|
|
195
|
+
prompt: "Security analysis..."
|
|
196
|
+
on: [pr_opened]
|
|
197
|
+
|
|
198
|
+
# After - add failure conditions
|
|
199
|
+
failure_conditions:
|
|
200
|
+
critical_gate: "metadata.criticalIssues > 0"
|
|
201
|
+
|
|
202
|
+
steps:
|
|
203
|
+
security:
|
|
204
|
+
type: ai
|
|
205
|
+
prompt: "Security analysis..."
|
|
206
|
+
group: security-analysis
|
|
207
|
+
schema: code-review
|
|
208
|
+
on: [pr_opened]
|
|
209
|
+
failure_conditions:
|
|
210
|
+
security_specific: "metadata.errorIssues >= 1"
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Testing Conditions
|
|
214
|
+
1. Use debug mode to see evaluation results
|
|
215
|
+
2. Start with simple conditions and gradually add complexity
|
|
216
|
+
3. Test with various issue scenarios
|
|
217
|
+
4. Validate JavaScript expressions before deployment
|
|
218
|
+
|
|
219
|
+
## Best Practices
|
|
220
|
+
|
|
221
|
+
### Condition Design
|
|
222
|
+
- Start with simple metadata-based conditions
|
|
223
|
+
- Use descriptive condition names
|
|
224
|
+
- Include helpful messages for complex conditions
|
|
225
|
+
- Consider whether conditions should halt execution
|
|
226
|
+
|
|
227
|
+
### Organization
|
|
228
|
+
- Group related conditions logically
|
|
229
|
+
- Use global conditions for organization-wide policies
|
|
230
|
+
- Override with check-specific conditions for specialized rules
|
|
231
|
+
- Document complex expressions with comments
|
|
232
|
+
|
|
233
|
+
### Performance
|
|
234
|
+
- Prefer metadata conditions over issue iteration
|
|
235
|
+
- Use helper functions for common patterns
|
|
236
|
+
- Avoid overly complex nested expressions
|
|
237
|
+
- Test condition performance with large result sets
|
|
238
|
+
|
|
239
|
+
## Testing
|
|
240
|
+
|
|
241
|
+
### Unit Tests
|
|
242
|
+
- Comprehensive coverage of FailureConditionEvaluator
|
|
243
|
+
- Test various JavaScript expression patterns
|
|
244
|
+
- Validate helper function behavior
|
|
245
|
+
- Error handling scenarios
|
|
246
|
+
|
|
247
|
+
### Integration Tests
|
|
248
|
+
- End-to-end condition evaluation in CheckExecutionEngine
|
|
249
|
+
- Configuration loading and validation
|
|
250
|
+
- Real-world scenario testing
|
|
251
|
+
- Backward compatibility verification
|
|
252
|
+
|
|
253
|
+
## Future Enhancements
|
|
254
|
+
|
|
255
|
+
### Potential Additions
|
|
256
|
+
- Time-based conditions (e.g., business hours)
|
|
257
|
+
- Environment-specific conditions (e.g., production vs staging)
|
|
258
|
+
- Team-based conditions (e.g., author experience level)
|
|
259
|
+
- Historical trend analysis (e.g., issue count over time)
|
|
260
|
+
|
|
261
|
+
### Advanced Features
|
|
262
|
+
- Condition templates and reusable expressions
|
|
263
|
+
- Dynamic condition loading from external sources
|
|
264
|
+
- Conditional condition evaluation based on PR metadata
|
|
265
|
+
- Integration with external policy engines
|
|
266
|
+
|
|
267
|
+
## Summary
|
|
268
|
+
|
|
269
|
+
The enhanced failure condition system provides a flexible, powerful foundation for implementing custom quality gates and policies in Visor. By leveraging JavaScript expressions (evaluated in a secure sandbox) with comprehensive context access, teams can create sophisticated review workflows that adapt to their specific needs and standards.
|
|
270
|
+
|
|
271
|
+
The system maintains full backward compatibility while opening new possibilities for automated code quality enforcement and intelligent review assistance.
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# Enhanced Failure Condition Configuration Schema
|
|
2
|
+
|
|
3
|
+
This document describes the enhanced failure condition configuration system for Visor that supports JavaScript expressions (evaluated in a secure sandbox) for flexible and powerful failure evaluation.
|
|
4
|
+
|
|
5
|
+
## YAML Configuration Schema
|
|
6
|
+
|
|
7
|
+
### Global Failure Conditions
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
version: "1.0"
|
|
11
|
+
|
|
12
|
+
# Global failure conditions apply to all checks
|
|
13
|
+
failure_conditions:
|
|
14
|
+
# Simple JavaScript expression for basic failure conditions
|
|
15
|
+
critical_threshold: "metadata.criticalIssues > 0"
|
|
16
|
+
|
|
17
|
+
# Complex conditions with multiple criteria
|
|
18
|
+
security_gate: "metadata.checkName == 'security' && metadata.criticalIssues > 0"
|
|
19
|
+
|
|
20
|
+
# Schema-based conditions
|
|
21
|
+
code_review_quality: "metadata.schema == 'code-review' && metadata.totalIssues > 10"
|
|
22
|
+
|
|
23
|
+
# Combined conditions with logical operators
|
|
24
|
+
deployment_blocker: "metadata.criticalIssues > 0 || (metadata.errorIssues > 5 && metadata.checkName == 'security')"
|
|
25
|
+
|
|
26
|
+
# Alternative object syntax for more complex conditions
|
|
27
|
+
failure_conditions:
|
|
28
|
+
critical_security_issues:
|
|
29
|
+
condition: "metadata.criticalIssues > 0 && metadata.checkName == 'security'"
|
|
30
|
+
message: "Critical security issues detected - deployment blocked"
|
|
31
|
+
severity: "error"
|
|
32
|
+
|
|
33
|
+
performance_degradation:
|
|
34
|
+
condition: "metadata.checkName == 'performance' && metadata.errorIssues >= 3"
|
|
35
|
+
message: "Performance issues detected that may impact production"
|
|
36
|
+
severity: "warning"
|
|
37
|
+
|
|
38
|
+
insufficient_coverage:
|
|
39
|
+
condition: "metadata.schema == 'code-review' && metadata.totalIssues > 15"
|
|
40
|
+
message: "Too many code quality issues - consider additional review"
|
|
41
|
+
severity: "info"
|
|
42
|
+
|
|
43
|
+
steps:
|
|
44
|
+
security:
|
|
45
|
+
type: ai
|
|
46
|
+
prompt: "Analyze for security vulnerabilities..."
|
|
47
|
+
group: review
|
|
48
|
+
schema: code-review
|
|
49
|
+
on:
|
|
50
|
+
- pr_opened
|
|
51
|
+
- pr_updated
|
|
52
|
+
|
|
53
|
+
# Check-specific failure conditions override global ones
|
|
54
|
+
failure_conditions:
|
|
55
|
+
block_on_any_critical: "metadata.criticalIssues > 0"
|
|
56
|
+
warn_on_multiple_errors: "metadata.errorIssues >= 2"
|
|
57
|
+
|
|
58
|
+
performance:
|
|
59
|
+
type: ai
|
|
60
|
+
prompt: "Analyze performance implications..."
|
|
61
|
+
group: review
|
|
62
|
+
schema: code-review
|
|
63
|
+
on:
|
|
64
|
+
- pr_opened
|
|
65
|
+
- pr_updated
|
|
66
|
+
|
|
67
|
+
# Inherits global failure conditions unless overridden
|
|
68
|
+
failure_conditions:
|
|
69
|
+
performance_regression: "metadata.errorIssues > 1 && issues.some(i => i.category == 'performance')"
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Advanced JavaScript Expression Examples
|
|
73
|
+
|
|
74
|
+
```yaml
|
|
75
|
+
failure_conditions:
|
|
76
|
+
# Issue analysis with helper functions
|
|
77
|
+
sql_injection_check: "hasFileWith(issues, 'sql') && hasIssueWith(issues, 'severity', 'critical')"
|
|
78
|
+
|
|
79
|
+
# Multiple file types analysis
|
|
80
|
+
critical_files_affected: "hasFileWith(issues, '.ts') || hasFileWith(issues, '.js') && hasIssueWith(issues, 'severity', 'critical')"
|
|
81
|
+
|
|
82
|
+
# Complex metadata-based conditions
|
|
83
|
+
large_change_with_issues: "metadata.totalIssues > 5 && debug && debug.processingTime > 30000"
|
|
84
|
+
|
|
85
|
+
# Schema and group combinations
|
|
86
|
+
review_blocking_issues: "metadata.schema == 'code-review' && metadata.group == 'review' && metadata.criticalIssues > 0"
|
|
87
|
+
|
|
88
|
+
# Time-based conditions (if debug info is available)
|
|
89
|
+
slow_analysis_with_errors: "debug && debug.processingTime > 60000 && metadata.errorIssues > 0"
|
|
90
|
+
|
|
91
|
+
# File-specific security checks
|
|
92
|
+
sensitive_file_changes: "hasFileWith(issues, 'auth') || hasFileWith(issues, 'password') || hasFileWith(issues, 'secret')"
|
|
93
|
+
|
|
94
|
+
# Count-based conditions
|
|
95
|
+
multiple_security_issues: "countIssues(issues, 'category', 'security') >= 3"
|
|
96
|
+
|
|
97
|
+
# Combined conditions
|
|
98
|
+
critical_auth_issues: "hasFileWith(issues, 'auth') && countIssues(issues, 'severity', 'critical') > 0"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Configuration Priority and Inheritance
|
|
102
|
+
|
|
103
|
+
1. **Check-specific conditions** override global conditions with the same name
|
|
104
|
+
2. **Global conditions** apply to all checks unless specifically overridden
|
|
105
|
+
3. **Built-in conditions** (if any) have the lowest priority
|
|
106
|
+
4. **Multiple conditions** are evaluated independently - any true condition triggers a failure
|
|
107
|
+
|
|
108
|
+
## Backward Compatibility
|
|
109
|
+
|
|
110
|
+
The enhanced system maintains full backward compatibility:
|
|
111
|
+
|
|
112
|
+
```yaml
|
|
113
|
+
# Legacy format (still supported)
|
|
114
|
+
version: "1.0"
|
|
115
|
+
steps:
|
|
116
|
+
security:
|
|
117
|
+
type: ai
|
|
118
|
+
prompt: "Security analysis..."
|
|
119
|
+
on:
|
|
120
|
+
- pr_opened
|
|
121
|
+
- pr_updated
|
|
122
|
+
|
|
123
|
+
# Enhanced format with failure conditions
|
|
124
|
+
version: "1.0"
|
|
125
|
+
failure_conditions:
|
|
126
|
+
default_critical: "metadata.criticalIssues > 0"
|
|
127
|
+
|
|
128
|
+
steps:
|
|
129
|
+
security:
|
|
130
|
+
type: ai
|
|
131
|
+
prompt: "Security analysis..."
|
|
132
|
+
on:
|
|
133
|
+
- pr_opened
|
|
134
|
+
- pr_updated
|
|
135
|
+
|
|
136
|
+
## Interaction with Criticality
|
|
137
|
+
|
|
138
|
+
Failure conditions (`fail_if`) and design‑by‑contract (`assume`, `guarantee`) work together with criticality:
|
|
139
|
+
|
|
140
|
+
- Critical steps (external/control‑plane/policy):
|
|
141
|
+
- Require meaningful `assume` and `guarantee`.
|
|
142
|
+
- `continue_on_failure: false` by default; dependents skip when this step fails.
|
|
143
|
+
- Retries only for transient provider faults; no auto‑retry for logical failures (`fail_if`/`guarantee`).
|
|
144
|
+
- Non‑critical steps:
|
|
145
|
+
- Contracts recommended; may allow `continue_on_failure: true`.
|
|
146
|
+
- Same retry bounds; tolerant gating.
|
|
147
|
+
|
|
148
|
+
See docs/guides/fault-management-and-contracts.md for the full policy checklist and examples.
|
|
149
|
+
failure_conditions:
|
|
150
|
+
security_specific: "metadata.errorIssues >= 1"
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Migration Guide
|
|
154
|
+
|
|
155
|
+
### Step 1: Add Global Conditions
|
|
156
|
+
```yaml
|
|
157
|
+
# Add to existing configuration
|
|
158
|
+
failure_conditions:
|
|
159
|
+
critical_blocker: "metadata.criticalIssues > 0"
|
|
160
|
+
quality_gate: "metadata.totalIssues > 10"
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Step 2: Add Check-Specific Conditions
|
|
164
|
+
```yaml
|
|
165
|
+
steps:
|
|
166
|
+
security:
|
|
167
|
+
# existing configuration...
|
|
168
|
+
failure_conditions:
|
|
169
|
+
security_gate: "metadata.errorIssues >= 1"
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Step 3: Test and Refine
|
|
173
|
+
Use debug mode to test conditions and refine expressions based on actual results.
|