@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,610 @@
|
|
|
1
|
+
# Author Permissions
|
|
2
|
+
|
|
3
|
+
Visor provides powerful author permission checking functions that allow you to customize workflows based on the PR author's relationship to the repository. These functions use GitHub's `author_association` field to determine the author's permission level.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Overview](#overview)
|
|
8
|
+
- [Permission Hierarchy](#permission-hierarchy)
|
|
9
|
+
- [Available Functions](#available-functions)
|
|
10
|
+
- [Use Cases](#use-cases)
|
|
11
|
+
- [Local Mode Behavior](#local-mode-behavior)
|
|
12
|
+
- [Best Practices](#best-practices)
|
|
13
|
+
- [Examples](#examples)
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
Author permission functions are available in:
|
|
18
|
+
|
|
19
|
+
**JavaScript contexts:**
|
|
20
|
+
- `if` conditions - Control whether checks run
|
|
21
|
+
- `fail_if` conditions - Fail checks based on author permissions
|
|
22
|
+
- `transform_js` - Transform outputs based on permissions
|
|
23
|
+
- `goto_js` / `run_js` - Dynamic routing based on permissions
|
|
24
|
+
|
|
25
|
+
**Liquid templates:**
|
|
26
|
+
- AI prompts - Customize prompts based on author
|
|
27
|
+
- Command templates - Dynamic command generation
|
|
28
|
+
- Messages - Personalized welcome messages
|
|
29
|
+
|
|
30
|
+
These functions enable you to:
|
|
31
|
+
- Run different workflows for internal vs external contributors
|
|
32
|
+
- Apply stricter checks to first-time contributors
|
|
33
|
+
- Auto-approve PRs from trusted team members
|
|
34
|
+
- Block sensitive changes from non-members
|
|
35
|
+
- Welcome new contributors with custom messages
|
|
36
|
+
|
|
37
|
+
## Permission Hierarchy
|
|
38
|
+
|
|
39
|
+
GitHub provides the following permission levels (from highest to lowest):
|
|
40
|
+
|
|
41
|
+
| Level | Description | Includes |
|
|
42
|
+
|-------|-------------|----------|
|
|
43
|
+
| `OWNER` | Repository owner | Owner only |
|
|
44
|
+
| `MEMBER` | Organization member | Owner, Members |
|
|
45
|
+
| `COLLABORATOR` | Invited collaborator | Owner, Members, Collaborators |
|
|
46
|
+
| `CONTRIBUTOR` | Has contributed before | Owner, Members, Collaborators, Contributors |
|
|
47
|
+
| `FIRST_TIME_CONTRIBUTOR` | First PR to this repo | Everyone except FIRST_TIMER |
|
|
48
|
+
| `FIRST_TIMER` | First GitHub contribution ever | FIRST_TIMER only |
|
|
49
|
+
| `NONE` | No association | No one |
|
|
50
|
+
|
|
51
|
+
## Available Functions
|
|
52
|
+
|
|
53
|
+
### `hasMinPermission(level)`
|
|
54
|
+
|
|
55
|
+
**Check if author has AT LEAST the specified permission level** (>= logic)
|
|
56
|
+
|
|
57
|
+
```javascript
|
|
58
|
+
hasMinPermission('MEMBER') // true for OWNER, MEMBER
|
|
59
|
+
hasMinPermission('COLLABORATOR') // true for OWNER, MEMBER, COLLABORATOR
|
|
60
|
+
hasMinPermission('CONTRIBUTOR') // true for all except FIRST_TIME_CONTRIBUTOR, FIRST_TIMER
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**When to use:**
|
|
64
|
+
- Most flexible option for hierarchical permission checks
|
|
65
|
+
- Use when you want "this permission or higher"
|
|
66
|
+
- Recommended for most use cases
|
|
67
|
+
|
|
68
|
+
**Examples:**
|
|
69
|
+
```yaml
|
|
70
|
+
# Run security scan for non-members
|
|
71
|
+
if: "!hasMinPermission('MEMBER')"
|
|
72
|
+
|
|
73
|
+
# Allow auto-merge for collaborators and above
|
|
74
|
+
if: "hasMinPermission('COLLABORATOR')"
|
|
75
|
+
|
|
76
|
+
# Require manual review for new contributors
|
|
77
|
+
fail_if: "!hasMinPermission('CONTRIBUTOR') && criticalIssues > 0"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### `isOwner()`
|
|
81
|
+
|
|
82
|
+
Check if the author is the repository owner.
|
|
83
|
+
|
|
84
|
+
```yaml
|
|
85
|
+
# Only owners can deploy to production
|
|
86
|
+
deploy-prod:
|
|
87
|
+
type: command
|
|
88
|
+
exec: npm run deploy:prod
|
|
89
|
+
if: "isOwner()"
|
|
90
|
+
|
|
91
|
+
# Skip review for owner
|
|
92
|
+
skip-review:
|
|
93
|
+
type: command
|
|
94
|
+
exec: gh pr review --approve
|
|
95
|
+
if: "isOwner()"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### `isMember()`
|
|
99
|
+
|
|
100
|
+
Check if the author is an organization member or owner.
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
# Members can skip certain checks
|
|
104
|
+
quick-check:
|
|
105
|
+
type: command
|
|
106
|
+
exec: npm run test:quick
|
|
107
|
+
if: "isMember()"
|
|
108
|
+
|
|
109
|
+
# Non-members need full security scan
|
|
110
|
+
full-security-scan:
|
|
111
|
+
type: command
|
|
112
|
+
exec: npm run security:full
|
|
113
|
+
if: "!isMember()"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### `isCollaborator()`
|
|
117
|
+
|
|
118
|
+
Check if the author is an invited collaborator (or higher).
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
# Collaborators can bypass certain validations
|
|
122
|
+
bypass-format-check:
|
|
123
|
+
type: command
|
|
124
|
+
exec: echo "Skipping format check"
|
|
125
|
+
if: "!isCollaborator()"
|
|
126
|
+
|
|
127
|
+
# Auto-approve for collaborators with passing tests
|
|
128
|
+
auto-approve:
|
|
129
|
+
type: command
|
|
130
|
+
exec: gh pr review --approve
|
|
131
|
+
if: "isCollaborator() && outputs.tests.success === true"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### `isContributor()`
|
|
135
|
+
|
|
136
|
+
Check if the author has contributed to the repository before.
|
|
137
|
+
|
|
138
|
+
```yaml
|
|
139
|
+
# Welcome returning contributors
|
|
140
|
+
welcome-back:
|
|
141
|
+
type: command
|
|
142
|
+
exec: gh pr comment --body "Welcome back!"
|
|
143
|
+
if: "isContributor() && !isMember()"
|
|
144
|
+
|
|
145
|
+
# Skip CLA check for known contributors
|
|
146
|
+
cla-check:
|
|
147
|
+
type: command
|
|
148
|
+
exec: ./scripts/check-cla.sh
|
|
149
|
+
if: "!isContributor()"
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### `isFirstTimer()`
|
|
153
|
+
|
|
154
|
+
Check if this is the author's first contribution to this repo or to GitHub.
|
|
155
|
+
|
|
156
|
+
```yaml
|
|
157
|
+
# Welcome first-time contributors
|
|
158
|
+
welcome-message:
|
|
159
|
+
type: command
|
|
160
|
+
exec: |
|
|
161
|
+
gh pr comment --body "🎉 Welcome to the project! Thanks for your first contribution!"
|
|
162
|
+
if: "isFirstTimer()"
|
|
163
|
+
|
|
164
|
+
# Require extra care from first-timers
|
|
165
|
+
strict-review:
|
|
166
|
+
type: command
|
|
167
|
+
exec: gh pr review --request-changes
|
|
168
|
+
fail_if: "isFirstTimer() && (criticalIssues > 0 || errorIssues > 2)"
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Use Cases
|
|
172
|
+
|
|
173
|
+
### 1. Tiered Security Scanning
|
|
174
|
+
|
|
175
|
+
Run different levels of security scanning based on trust level:
|
|
176
|
+
|
|
177
|
+
```yaml
|
|
178
|
+
steps:
|
|
179
|
+
# Quick scan for trusted members
|
|
180
|
+
security-quick:
|
|
181
|
+
type: command
|
|
182
|
+
exec: npm run security:quick
|
|
183
|
+
if: "hasMinPermission('MEMBER')"
|
|
184
|
+
|
|
185
|
+
# Deep scan for collaborators
|
|
186
|
+
security-standard:
|
|
187
|
+
type: command
|
|
188
|
+
exec: npm run security:standard
|
|
189
|
+
if: "hasMinPermission('COLLABORATOR') && !hasMinPermission('MEMBER')"
|
|
190
|
+
|
|
191
|
+
# Full scan for external contributors
|
|
192
|
+
security-full:
|
|
193
|
+
type: command
|
|
194
|
+
exec: npm run security:full
|
|
195
|
+
if: "!hasMinPermission('COLLABORATOR')"
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 2. Protecting Sensitive Files
|
|
199
|
+
|
|
200
|
+
Block changes to sensitive files from non-members:
|
|
201
|
+
|
|
202
|
+
```yaml
|
|
203
|
+
steps:
|
|
204
|
+
protect-sensitive:
|
|
205
|
+
type: command
|
|
206
|
+
exec: echo "Checking sensitive files..."
|
|
207
|
+
fail_if: |
|
|
208
|
+
!isMember() && files.some(f =>
|
|
209
|
+
f.filename.startsWith('secrets/') ||
|
|
210
|
+
f.filename.startsWith('.github/workflows/') ||
|
|
211
|
+
f.filename === '.env' ||
|
|
212
|
+
f.filename.endsWith('.key') ||
|
|
213
|
+
f.filename.endsWith('.pem')
|
|
214
|
+
)
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### 3. Auto-Approval Workflow
|
|
218
|
+
|
|
219
|
+
Automatically approve PRs from trusted contributors when checks pass:
|
|
220
|
+
|
|
221
|
+
```yaml
|
|
222
|
+
steps:
|
|
223
|
+
tests:
|
|
224
|
+
type: command
|
|
225
|
+
exec: npm test
|
|
226
|
+
|
|
227
|
+
lint:
|
|
228
|
+
type: command
|
|
229
|
+
exec: npm run lint
|
|
230
|
+
|
|
231
|
+
auto-approve:
|
|
232
|
+
type: command
|
|
233
|
+
depends_on: [tests, lint]
|
|
234
|
+
exec: gh pr review --approve
|
|
235
|
+
if: |
|
|
236
|
+
// Only auto-approve for collaborators
|
|
237
|
+
hasMinPermission('COLLABORATOR') &&
|
|
238
|
+
// All checks must pass
|
|
239
|
+
outputs.tests.error === false &&
|
|
240
|
+
outputs.lint.error === false &&
|
|
241
|
+
// No critical issues
|
|
242
|
+
totalIssues === 0
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### 4. Welcome New Contributors
|
|
246
|
+
|
|
247
|
+
Create a welcoming experience for first-time contributors:
|
|
248
|
+
|
|
249
|
+
```yaml
|
|
250
|
+
steps:
|
|
251
|
+
welcome-first-timer:
|
|
252
|
+
type: command
|
|
253
|
+
exec: |
|
|
254
|
+
gh pr comment --body "$(cat <<'EOF'
|
|
255
|
+
👋 Welcome to the project! Thank you for your first contribution!
|
|
256
|
+
|
|
257
|
+
Here are some tips:
|
|
258
|
+
- Make sure all tests pass
|
|
259
|
+
- Follow our code style guide
|
|
260
|
+
- Ask questions in the comments if you need help
|
|
261
|
+
|
|
262
|
+
Our team will review your PR soon!
|
|
263
|
+
EOF
|
|
264
|
+
)"
|
|
265
|
+
if: "isFirstTimer()"
|
|
266
|
+
|
|
267
|
+
assign-mentor:
|
|
268
|
+
type: command
|
|
269
|
+
exec: gh pr edit --add-assignee mentor-bot
|
|
270
|
+
if: "isFirstTimer()"
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### 5. Conditional Review Requirements
|
|
274
|
+
|
|
275
|
+
Require different levels of review based on changes and author:
|
|
276
|
+
|
|
277
|
+
```yaml
|
|
278
|
+
steps:
|
|
279
|
+
require-review:
|
|
280
|
+
type: command
|
|
281
|
+
exec: gh pr review --request-changes
|
|
282
|
+
fail_if: |
|
|
283
|
+
// First-timers need approval for any PR
|
|
284
|
+
(isFirstTimer()) ||
|
|
285
|
+
// Non-collaborators need approval for large PRs
|
|
286
|
+
(!hasMinPermission('COLLABORATOR') && pr.totalAdditions > 500) ||
|
|
287
|
+
// Non-members need approval for sensitive files
|
|
288
|
+
(!isMember() && files.some(f =>
|
|
289
|
+
f.filename.includes('security') ||
|
|
290
|
+
f.filename.includes('auth')
|
|
291
|
+
))
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### 6. Deployment Gates
|
|
295
|
+
|
|
296
|
+
Control who can deploy to different environments:
|
|
297
|
+
|
|
298
|
+
```yaml
|
|
299
|
+
steps:
|
|
300
|
+
deploy-staging:
|
|
301
|
+
type: command
|
|
302
|
+
exec: ./scripts/deploy.sh staging
|
|
303
|
+
if: "hasMinPermission('COLLABORATOR')"
|
|
304
|
+
|
|
305
|
+
deploy-production:
|
|
306
|
+
type: command
|
|
307
|
+
exec: ./scripts/deploy.sh production
|
|
308
|
+
if: "hasMinPermission('MEMBER')"
|
|
309
|
+
fail_if: |
|
|
310
|
+
// Extra validation for production
|
|
311
|
+
!isOwner() && (
|
|
312
|
+
pr.title.includes('WIP') ||
|
|
313
|
+
pr.title.includes('Draft') ||
|
|
314
|
+
outputs.tests.failed > 0
|
|
315
|
+
)
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### 7. Skip Checks for Trusted Users
|
|
319
|
+
|
|
320
|
+
Save CI resources by skipping checks for trusted contributors:
|
|
321
|
+
|
|
322
|
+
```yaml
|
|
323
|
+
steps:
|
|
324
|
+
expensive-integration-tests:
|
|
325
|
+
type: command
|
|
326
|
+
exec: npm run test:integration
|
|
327
|
+
# Skip for members (they know what they're doing)
|
|
328
|
+
if: "!isMember()"
|
|
329
|
+
|
|
330
|
+
format-check:
|
|
331
|
+
type: command
|
|
332
|
+
exec: npm run format:check
|
|
333
|
+
# Members can skip (we trust them to format correctly)
|
|
334
|
+
if: "!hasMinPermission('COLLABORATOR')"
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### 8. Using in Liquid Templates
|
|
338
|
+
|
|
339
|
+
Permission filters are also available in Liquid templates for prompts, commands, and messages:
|
|
340
|
+
|
|
341
|
+
```yaml
|
|
342
|
+
steps:
|
|
343
|
+
# Customize AI prompts based on author permission
|
|
344
|
+
code-review:
|
|
345
|
+
type: ai
|
|
346
|
+
prompt: |
|
|
347
|
+
{% if pr.authorAssociation | is_member %}
|
|
348
|
+
Review this PR from team member {{ pr.author }}.
|
|
349
|
+
Focus on architecture and design patterns.
|
|
350
|
+
{% else %}
|
|
351
|
+
Review this PR from external contributor {{ pr.author }}.
|
|
352
|
+
Pay extra attention to:
|
|
353
|
+
- Security best practices
|
|
354
|
+
- Code quality and style
|
|
355
|
+
- Proper error handling
|
|
356
|
+
{% endif %}
|
|
357
|
+
|
|
358
|
+
Changed files:
|
|
359
|
+
{% for file in files %}
|
|
360
|
+
- {{ file.filename }} (+{{ file.additions }}, -{{ file.deletions }})
|
|
361
|
+
{% endfor %}
|
|
362
|
+
|
|
363
|
+
# Conditional welcome messages
|
|
364
|
+
welcome:
|
|
365
|
+
type: command
|
|
366
|
+
exec: |
|
|
367
|
+
gh pr comment --body "$(cat <<'EOF'
|
|
368
|
+
{% if pr.authorAssociation | is_first_timer %}
|
|
369
|
+
🎉 Welcome to the project! Thank you for your first contribution!
|
|
370
|
+
|
|
371
|
+
Here's what happens next:
|
|
372
|
+
1. Our CI will run automated tests
|
|
373
|
+
2. A maintainer will review your changes
|
|
374
|
+
3. We may request some changes
|
|
375
|
+
|
|
376
|
+
Feel free to ask questions in the comments!
|
|
377
|
+
{% elsif pr.authorAssociation | is_contributor %}
|
|
378
|
+
👋 Welcome back, {{ pr.author }}! Thanks for another contribution.
|
|
379
|
+
{% else %}
|
|
380
|
+
Thank you for your contribution, {{ pr.author }}!
|
|
381
|
+
{% endif %}
|
|
382
|
+
EOF
|
|
383
|
+
)"
|
|
384
|
+
|
|
385
|
+
# Dynamic command selection
|
|
386
|
+
security-scan:
|
|
387
|
+
type: command
|
|
388
|
+
exec: |
|
|
389
|
+
{% if pr.authorAssociation | has_min_permission: "MEMBER" %}
|
|
390
|
+
npm run security:quick
|
|
391
|
+
{% else %}
|
|
392
|
+
npm run security:full
|
|
393
|
+
{% endif %}
|
|
394
|
+
|
|
395
|
+
# Conditional approval message
|
|
396
|
+
auto-approve-message:
|
|
397
|
+
type: command
|
|
398
|
+
depends_on: [tests, lint]
|
|
399
|
+
exec: |
|
|
400
|
+
{% if pr.authorAssociation | has_min_permission: "COLLABORATOR" %}
|
|
401
|
+
gh pr review --approve --body "✅ Auto-approved: All checks passed for trusted contributor"
|
|
402
|
+
{% else %}
|
|
403
|
+
gh pr comment --body "✅ All checks passed! A maintainer will review soon."
|
|
404
|
+
{% endif %}
|
|
405
|
+
if: "totalIssues === 0"
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
**Available Liquid filters:**
|
|
409
|
+
- `pr.authorAssociation | has_min_permission: "LEVEL"`
|
|
410
|
+
- `pr.authorAssociation | is_owner`
|
|
411
|
+
- `pr.authorAssociation | is_member`
|
|
412
|
+
- `pr.authorAssociation | is_collaborator`
|
|
413
|
+
- `pr.authorAssociation | is_contributor`
|
|
414
|
+
- `pr.authorAssociation | is_first_timer`
|
|
415
|
+
|
|
416
|
+
See [Liquid Templates Guide](./liquid-templates.md#author-permission-filters) for more details.
|
|
417
|
+
|
|
418
|
+
## Local Mode Behavior
|
|
419
|
+
|
|
420
|
+
When running Visor locally (outside of GitHub Actions):
|
|
421
|
+
|
|
422
|
+
- **All permission checks return `true`** (treated as owner)
|
|
423
|
+
- **`isFirstTimer()` returns `false`**
|
|
424
|
+
- This prevents blocking local development and testing
|
|
425
|
+
|
|
426
|
+
Detection logic:
|
|
427
|
+
```javascript
|
|
428
|
+
// Visor detects local mode by checking for GITHUB_ACTIONS env var
|
|
429
|
+
const isLocal = !process.env.GITHUB_ACTIONS;
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
You can test permission logic locally by temporarily setting:
|
|
433
|
+
```bash
|
|
434
|
+
export GITHUB_ACTIONS=true
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
## Best Practices
|
|
438
|
+
|
|
439
|
+
### 1. Use `hasMinPermission()` for Most Cases
|
|
440
|
+
|
|
441
|
+
Prefer `hasMinPermission()` over individual checks for cleaner logic:
|
|
442
|
+
|
|
443
|
+
```yaml
|
|
444
|
+
# ✅ Good - Clear hierarchical check
|
|
445
|
+
if: "!hasMinPermission('MEMBER')"
|
|
446
|
+
|
|
447
|
+
# ❌ Less clear - Manual hierarchy
|
|
448
|
+
if: "!isOwner() && !isMember()"
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### 2. Combine with Other Conditions
|
|
452
|
+
|
|
453
|
+
Permission checks work great with other context variables:
|
|
454
|
+
|
|
455
|
+
```yaml
|
|
456
|
+
fail_if: |
|
|
457
|
+
// Non-members can't modify critical files
|
|
458
|
+
!hasMinPermission('MEMBER') && files.some(f =>
|
|
459
|
+
f.filename.startsWith('core/')
|
|
460
|
+
) ||
|
|
461
|
+
// Non-collaborators need clean builds
|
|
462
|
+
!hasMinPermission('COLLABORATOR') && outputs.build.error === true
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
### 3. Document Your Permission Requirements
|
|
466
|
+
|
|
467
|
+
Add comments to explain permission logic:
|
|
468
|
+
|
|
469
|
+
```yaml
|
|
470
|
+
steps:
|
|
471
|
+
deploy:
|
|
472
|
+
type: command
|
|
473
|
+
exec: ./deploy.sh
|
|
474
|
+
# Only members can deploy - they understand the deployment process
|
|
475
|
+
# and have been trained on rollback procedures
|
|
476
|
+
if: "hasMinPermission('MEMBER')"
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### 4. Be Welcoming to New Contributors
|
|
480
|
+
|
|
481
|
+
Use permission checks to create a positive experience:
|
|
482
|
+
|
|
483
|
+
```yaml
|
|
484
|
+
# ✅ Good - Welcoming and helpful
|
|
485
|
+
if: "isFirstTimer()"
|
|
486
|
+
exec: gh pr comment --body "Welcome! Thanks for contributing!"
|
|
487
|
+
|
|
488
|
+
# ✅ Good - Clear expectations
|
|
489
|
+
fail_if: "isFirstTimer() && criticalIssues > 0"
|
|
490
|
+
|
|
491
|
+
# ❌ Avoid - Too restrictive without guidance
|
|
492
|
+
fail_if: "!isMember()"
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
### 5. Test Your Permission Logic
|
|
496
|
+
|
|
497
|
+
Always test permission-based workflows:
|
|
498
|
+
|
|
499
|
+
```yaml
|
|
500
|
+
# Add a check that logs permission info for debugging
|
|
501
|
+
debug-permissions:
|
|
502
|
+
type: command
|
|
503
|
+
exec: |
|
|
504
|
+
echo "Author: {{ pr.author }}"
|
|
505
|
+
echo "Association: {{ pr.authorAssociation }}"
|
|
506
|
+
if: |
|
|
507
|
+
log("isOwner:", isOwner());
|
|
508
|
+
log("isMember:", isMember());
|
|
509
|
+
log("isCollaborator:", isCollaborator());
|
|
510
|
+
true // Always run this check
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
### 6. Fail Gracefully
|
|
514
|
+
|
|
515
|
+
Provide clear messages when permission checks fail:
|
|
516
|
+
|
|
517
|
+
```yaml
|
|
518
|
+
steps:
|
|
519
|
+
check-permissions:
|
|
520
|
+
type: command
|
|
521
|
+
exec: echo "Permission check"
|
|
522
|
+
fail_if: |
|
|
523
|
+
const notAllowed = !hasMinPermission('COLLABORATOR') &&
|
|
524
|
+
files.some(f => f.filename.startsWith('infrastructure/'));
|
|
525
|
+
|
|
526
|
+
if (notAllowed) {
|
|
527
|
+
log("❌ Non-collaborators cannot modify infrastructure files");
|
|
528
|
+
log("Please request review from a team member");
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
notAllowed
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
## Examples
|
|
535
|
+
|
|
536
|
+
### Complete Workflow Example
|
|
537
|
+
|
|
538
|
+
Here's a complete example showing how to use author permissions in a real workflow:
|
|
539
|
+
|
|
540
|
+
```yaml
|
|
541
|
+
version: "1.0"
|
|
542
|
+
|
|
543
|
+
steps:
|
|
544
|
+
# 1. Welcome new contributors
|
|
545
|
+
welcome:
|
|
546
|
+
type: command
|
|
547
|
+
exec: |
|
|
548
|
+
gh pr comment --body "👋 Welcome! Thanks for your first contribution.
|
|
549
|
+
A maintainer will review your PR soon."
|
|
550
|
+
if: "isFirstTimer()"
|
|
551
|
+
|
|
552
|
+
# 2. Run appropriate test suite based on trust level
|
|
553
|
+
tests-quick:
|
|
554
|
+
type: command
|
|
555
|
+
exec: npm run test:unit
|
|
556
|
+
if: "hasMinPermission('MEMBER')"
|
|
557
|
+
|
|
558
|
+
tests-full:
|
|
559
|
+
type: command
|
|
560
|
+
exec: npm run test:all
|
|
561
|
+
if: "!hasMinPermission('MEMBER')"
|
|
562
|
+
|
|
563
|
+
# 3. Security scanning for external contributors
|
|
564
|
+
security-scan:
|
|
565
|
+
type: command
|
|
566
|
+
exec: npm run security:scan
|
|
567
|
+
if: "!hasMinPermission('COLLABORATOR')"
|
|
568
|
+
|
|
569
|
+
# 4. Protect sensitive files
|
|
570
|
+
check-sensitive-files:
|
|
571
|
+
type: command
|
|
572
|
+
exec: echo "Checking sensitive files..."
|
|
573
|
+
fail_if: |
|
|
574
|
+
!isMember() && files.some(f =>
|
|
575
|
+
f.filename.includes('secrets') ||
|
|
576
|
+
f.filename.includes('.env')
|
|
577
|
+
)
|
|
578
|
+
|
|
579
|
+
# 5. Require review for significant changes from non-members
|
|
580
|
+
require-review:
|
|
581
|
+
type: command
|
|
582
|
+
depends_on: [tests-full, tests-quick]
|
|
583
|
+
exec: gh pr review --request-changes
|
|
584
|
+
fail_if: |
|
|
585
|
+
// Large PRs from non-members need review
|
|
586
|
+
(!hasMinPermission('MEMBER') && pr.totalAdditions > 300) ||
|
|
587
|
+
// Any critical issues need review
|
|
588
|
+
(criticalIssues > 0)
|
|
589
|
+
|
|
590
|
+
# 6. Auto-approve for trusted contributors
|
|
591
|
+
auto-approve:
|
|
592
|
+
type: command
|
|
593
|
+
depends_on: [tests-full, tests-quick, security-scan]
|
|
594
|
+
exec: gh pr review --approve && gh pr merge --auto --squash
|
|
595
|
+
if: |
|
|
596
|
+
// Only for collaborators and above
|
|
597
|
+
hasMinPermission('COLLABORATOR') &&
|
|
598
|
+
// All checks passed
|
|
599
|
+
totalIssues === 0 &&
|
|
600
|
+
// Tests passed (check whichever ran)
|
|
601
|
+
((outputs["tests-quick"] && outputs["tests-quick"].error === false) ||
|
|
602
|
+
(outputs["tests-full"] && outputs["tests-full"].error === false))
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
## Related Documentation
|
|
606
|
+
|
|
607
|
+
- [Liquid Templates](./liquid-templates.md) - Template syntax and variables
|
|
608
|
+
- [Debugging Guide](./debugging.md) - Debugging JavaScript expressions
|
|
609
|
+
- [Command Provider](./command-provider.md) - Command execution and transforms
|
|
610
|
+
- [Configuration Reference](./configuration.md) - Full configuration options
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# RFC: Bot Transports for Visor (Slack-first)
|
|
2
|
+
|
|
3
|
+
Status: Draft
|
|
4
|
+
|
|
5
|
+
This RFC proposes a Slack integration built on the event-bus/state-machine engine. The first iteration focuses on:
|
|
6
|
+
- A Slack frontend that subscribes to engine events and posts an evolving message per group (e.g., overview, review).
|
|
7
|
+
- Simple configuration via `frontends` in the workflow config, e.g.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
frontends:
|
|
11
|
+
- name: slack
|
|
12
|
+
config:
|
|
13
|
+
defaultChannel: C12345678
|
|
14
|
+
groupChannels:
|
|
15
|
+
overview: C87654321
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Design notes:
|
|
19
|
+
- No placeholder/queued messages are posted; only content-producing events produce/modify messages.
|
|
20
|
+
- Messages are updated in-place (using `chat.update`) keyed by group. We do not rely on hidden markers in message text.
|
|
21
|
+
- Debounce/coalescing reduces API churn during bursts; terminal state forces an immediate flush.
|
|
22
|
+
- Future work will add inbound Slack handling (webhooks) to trigger workflows and attach conversation context.
|
|
23
|
+
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Run Modes in CI (including GitHub Actions)
|
|
2
|
+
|
|
3
|
+
Visor now defaults to CLI mode everywhere (no auto-detection). To enable GitHub-specific behavior (comments, checks), pass `--mode github-actions` or set the action input `mode: github-actions`.
|
|
4
|
+
|
|
5
|
+
Examples (GitHub Actions – CLI mode):
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
jobs:
|
|
9
|
+
visor-cli:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
- run: npx -y @probelabs/visor@latest --config .visor.yaml --output json
|
|
14
|
+
env:
|
|
15
|
+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
GitHub Actions behavior (comments/checks):
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
jobs:
|
|
22
|
+
visor-cli:
|
|
23
|
+
runs-on: ubuntu-latest
|
|
24
|
+
steps:
|
|
25
|
+
- uses: actions/checkout@v4
|
|
26
|
+
- run: npx -y @probelabs/visor@latest --mode github-actions --config .visor.yaml --output json
|
|
27
|
+
env:
|
|
28
|
+
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Notes:
|
|
32
|
+
|
|
33
|
+
- In CLI mode, GitHub credentials aren’t required. Provide your AI provider keys as env vars (e.g., `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, etc.).
|
|
34
|
+
- If you want PR comments/checks, run with `--mode github-actions` or use the published action with `with: mode: github-actions`.
|