@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,903 @@
|
|
|
1
|
+
# Memory Provider
|
|
2
|
+
|
|
3
|
+
The Memory provider enables persistent key-value storage across checks, allowing you to implement stateful workflows, retry logic with counters, error aggregation, and complex orchestration patterns.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Overview](#overview)
|
|
8
|
+
- [Configuration](#configuration)
|
|
9
|
+
- [Operations](#operations)
|
|
10
|
+
- [Namespaces](#namespaces)
|
|
11
|
+
- [Storage Formats](#storage-formats)
|
|
12
|
+
- [Access Patterns](#access-patterns)
|
|
13
|
+
- [Examples](#examples)
|
|
14
|
+
- [Best Practices](#best-practices)
|
|
15
|
+
|
|
16
|
+
## Overview
|
|
17
|
+
|
|
18
|
+
The Memory provider acts as a shared data store that persists across check executions. It supports:
|
|
19
|
+
|
|
20
|
+
- **Multiple operations**: get, set, append, increment, delete, clear, list
|
|
21
|
+
- **Namespace isolation**: Separate data contexts for different workflows
|
|
22
|
+
- **In-memory or file-based storage**: Choose between speed or persistence
|
|
23
|
+
- **Multiple formats**: JSON or CSV for file storage
|
|
24
|
+
- **Template and JavaScript access**: Use memory in Liquid templates and JS expressions
|
|
25
|
+
|
|
26
|
+
## Configuration
|
|
27
|
+
|
|
28
|
+
### Root-Level Configuration
|
|
29
|
+
|
|
30
|
+
Configure memory storage at the root level of your `.visor.yaml`:
|
|
31
|
+
|
|
32
|
+
```yaml
|
|
33
|
+
version: "1.0"
|
|
34
|
+
|
|
35
|
+
# Global memory configuration
|
|
36
|
+
memory:
|
|
37
|
+
# Storage mode: "memory" (in-memory, default) or "file" (persistent)
|
|
38
|
+
storage: memory | file
|
|
39
|
+
|
|
40
|
+
# Storage format (only for file storage, default: json)
|
|
41
|
+
format: json | csv
|
|
42
|
+
|
|
43
|
+
# File path (required if storage: file)
|
|
44
|
+
file: ./memory.json
|
|
45
|
+
|
|
46
|
+
# Default namespace (default: "default")
|
|
47
|
+
namespace: default
|
|
48
|
+
|
|
49
|
+
# Auto-load on startup (default: true if storage: file)
|
|
50
|
+
auto_load: true
|
|
51
|
+
|
|
52
|
+
# Auto-save after operations (default: true if storage: file)
|
|
53
|
+
auto_save: true
|
|
54
|
+
|
|
55
|
+
steps:
|
|
56
|
+
# ... your checks
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Check-Level Configuration
|
|
60
|
+
|
|
61
|
+
Each memory check requires:
|
|
62
|
+
|
|
63
|
+
```yaml
|
|
64
|
+
steps:
|
|
65
|
+
my-memory-check:
|
|
66
|
+
type: memory
|
|
67
|
+
|
|
68
|
+
# Operation (required)
|
|
69
|
+
operation: get | set | append | increment | delete | clear | list
|
|
70
|
+
|
|
71
|
+
# Key (required for get/set/append/increment/delete)
|
|
72
|
+
key: string
|
|
73
|
+
|
|
74
|
+
# Value (required for set/append, optional for increment)
|
|
75
|
+
value: any
|
|
76
|
+
|
|
77
|
+
# OR compute value dynamically
|
|
78
|
+
value_js: "javascript_expression"
|
|
79
|
+
|
|
80
|
+
# Or run custom JavaScript as a separate step
|
|
81
|
+
my-script-step:
|
|
82
|
+
type: script
|
|
83
|
+
content: |
|
|
84
|
+
// Full JavaScript with statements, loops, conditionals
|
|
85
|
+
memory.set('key', 'value');
|
|
86
|
+
return result;
|
|
87
|
+
|
|
88
|
+
# Transform value (optional)
|
|
89
|
+
transform: "{{ liquid_template }}"
|
|
90
|
+
transform_js: "javascript_expression"
|
|
91
|
+
|
|
92
|
+
# Override namespace (optional)
|
|
93
|
+
namespace: custom-namespace
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Operations
|
|
97
|
+
|
|
98
|
+
### get
|
|
99
|
+
|
|
100
|
+
Retrieve a value from memory.
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
steps:
|
|
104
|
+
get-counter:
|
|
105
|
+
type: memory
|
|
106
|
+
operation: get
|
|
107
|
+
key: counter
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Returns the value, or `undefined` if the key doesn't exist.
|
|
111
|
+
|
|
112
|
+
### set
|
|
113
|
+
|
|
114
|
+
Set or override a value in memory.
|
|
115
|
+
|
|
116
|
+
```yaml
|
|
117
|
+
steps:
|
|
118
|
+
set-counter:
|
|
119
|
+
type: memory
|
|
120
|
+
operation: set
|
|
121
|
+
key: counter
|
|
122
|
+
value: 0
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### append
|
|
126
|
+
|
|
127
|
+
Append a value to an array. Creates a new array if the key doesn't exist.
|
|
128
|
+
|
|
129
|
+
```yaml
|
|
130
|
+
steps:
|
|
131
|
+
append-error:
|
|
132
|
+
type: memory
|
|
133
|
+
operation: append
|
|
134
|
+
key: errors
|
|
135
|
+
value: "Error message"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### increment
|
|
139
|
+
|
|
140
|
+
Increment a numeric value. Creates a new counter starting at 0 if the key doesn't exist.
|
|
141
|
+
|
|
142
|
+
```yaml
|
|
143
|
+
steps:
|
|
144
|
+
# Increment by 1 (default)
|
|
145
|
+
increment-counter:
|
|
146
|
+
type: memory
|
|
147
|
+
operation: increment
|
|
148
|
+
key: counter
|
|
149
|
+
|
|
150
|
+
# Increment by custom amount
|
|
151
|
+
increment-score:
|
|
152
|
+
type: memory
|
|
153
|
+
operation: increment
|
|
154
|
+
key: score
|
|
155
|
+
value: 10
|
|
156
|
+
|
|
157
|
+
# Decrement (negative increment)
|
|
158
|
+
decrement-remaining:
|
|
159
|
+
type: memory
|
|
160
|
+
operation: increment
|
|
161
|
+
key: remaining
|
|
162
|
+
value: -1
|
|
163
|
+
|
|
164
|
+
# Dynamic increment amount
|
|
165
|
+
increment-by-pr:
|
|
166
|
+
type: memory
|
|
167
|
+
operation: increment
|
|
168
|
+
key: total_changes
|
|
169
|
+
value_js: "pr.totalAdditions + pr.totalDeletions"
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Returns the new value after increment. Throws an error if the existing value is not a number.
|
|
173
|
+
|
|
174
|
+
### delete
|
|
175
|
+
|
|
176
|
+
Delete a key from memory.
|
|
177
|
+
|
|
178
|
+
```yaml
|
|
179
|
+
steps:
|
|
180
|
+
delete-temp:
|
|
181
|
+
type: memory
|
|
182
|
+
operation: delete
|
|
183
|
+
key: temp_data
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Returns `true` if deleted, `false` if key didn't exist.
|
|
187
|
+
|
|
188
|
+
### clear
|
|
189
|
+
|
|
190
|
+
Clear all keys in a namespace.
|
|
191
|
+
|
|
192
|
+
```yaml
|
|
193
|
+
steps:
|
|
194
|
+
clear-all:
|
|
195
|
+
type: memory
|
|
196
|
+
operation: clear
|
|
197
|
+
# Optional: specify namespace
|
|
198
|
+
namespace: staging
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### list
|
|
202
|
+
|
|
203
|
+
List all keys in a namespace.
|
|
204
|
+
|
|
205
|
+
```yaml
|
|
206
|
+
steps:
|
|
207
|
+
list-keys:
|
|
208
|
+
type: memory
|
|
209
|
+
operation: list
|
|
210
|
+
# Optional: specify namespace
|
|
211
|
+
namespace: production
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Returns an array of key names.
|
|
215
|
+
|
|
216
|
+
### Script
|
|
217
|
+
|
|
218
|
+
Execute custom JavaScript with full memory access. Useful for complex logic, loops, conditionals, and direct manipulation of memory state via the `memory` helper.
|
|
219
|
+
|
|
220
|
+
```yaml
|
|
221
|
+
steps:
|
|
222
|
+
complex-logic:
|
|
223
|
+
type: script
|
|
224
|
+
content: |
|
|
225
|
+
// Access existing values
|
|
226
|
+
const errors = memory.get('errors') || [];
|
|
227
|
+
const warnings = memory.get('warnings') || [];
|
|
228
|
+
|
|
229
|
+
// Complex calculations
|
|
230
|
+
const total = errors.length + warnings.length;
|
|
231
|
+
const severity = total > 10 ? 'critical' : total > 5 ? 'warning' : 'ok';
|
|
232
|
+
|
|
233
|
+
// Store results
|
|
234
|
+
memory.set('total_issues', total);
|
|
235
|
+
memory.set('severity', severity);
|
|
236
|
+
|
|
237
|
+
// Return custom object
|
|
238
|
+
return {
|
|
239
|
+
total,
|
|
240
|
+
severity,
|
|
241
|
+
hasErrors: errors.length > 0
|
|
242
|
+
};
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
**Available memory operations (in script context):**
|
|
248
|
+
- `memory.get(key, namespace?)` - Get value
|
|
249
|
+
- `memory.set(key, value, namespace?)` - Set value
|
|
250
|
+
- `memory.append(key, value, namespace?)` - Append to array
|
|
251
|
+
- `memory.increment(key, amount?, namespace?)` - Increment numeric value (default amount: 1)
|
|
252
|
+
- `memory.delete(key, namespace?)` - Delete key
|
|
253
|
+
- `memory.clear(namespace?)` - Clear namespace
|
|
254
|
+
- `memory.list(namespace?)` - List keys
|
|
255
|
+
- `memory.has(key, namespace?)` - Check if key exists
|
|
256
|
+
- `memory.getAll(namespace?)` - Get all key-value pairs
|
|
257
|
+
- `memory.listNamespaces()` - List all namespaces
|
|
258
|
+
|
|
259
|
+
**Context available in script content:**
|
|
260
|
+
- `memory` - Memory operations object
|
|
261
|
+
- `pr` - PR information (number, title, author, etc.)
|
|
262
|
+
- `outputs` - Previous check outputs (current values)
|
|
263
|
+
- `outputs.history` - All previous outputs from each check (arrays). See [Output History](./output-history.md)
|
|
264
|
+
- `env` - Environment variables
|
|
265
|
+
- `log(...args)` - Debug logging function
|
|
266
|
+
|
|
267
|
+
## Namespaces
|
|
268
|
+
|
|
269
|
+
Namespaces provide isolation between different memory contexts.
|
|
270
|
+
|
|
271
|
+
### Default Namespace
|
|
272
|
+
|
|
273
|
+
If not specified, the global `memory.namespace` setting is used (defaults to "default"):
|
|
274
|
+
|
|
275
|
+
```yaml
|
|
276
|
+
memory:
|
|
277
|
+
namespace: production
|
|
278
|
+
|
|
279
|
+
steps:
|
|
280
|
+
set-counter:
|
|
281
|
+
type: memory
|
|
282
|
+
operation: set
|
|
283
|
+
key: counter
|
|
284
|
+
value: 10
|
|
285
|
+
# Uses "production" namespace
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### Per-Check Namespace Override
|
|
289
|
+
|
|
290
|
+
Override the namespace for specific checks:
|
|
291
|
+
|
|
292
|
+
```yaml
|
|
293
|
+
steps:
|
|
294
|
+
set-prod:
|
|
295
|
+
type: memory
|
|
296
|
+
operation: set
|
|
297
|
+
key: counter
|
|
298
|
+
value: 100
|
|
299
|
+
namespace: production
|
|
300
|
+
|
|
301
|
+
set-stage:
|
|
302
|
+
type: memory
|
|
303
|
+
operation: set
|
|
304
|
+
key: counter
|
|
305
|
+
value: 50
|
|
306
|
+
namespace: staging
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Accessing Different Namespaces
|
|
310
|
+
|
|
311
|
+
Access data from specific namespaces in templates and JavaScript:
|
|
312
|
+
|
|
313
|
+
```liquid
|
|
314
|
+
<!-- Liquid -->
|
|
315
|
+
{{ memory.get('counter', 'production') }}
|
|
316
|
+
{{ memory.get('counter', 'staging') }}
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
```javascript
|
|
320
|
+
// JavaScript
|
|
321
|
+
memory.get('counter', 'production')
|
|
322
|
+
memory.get('counter', 'staging')
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
## Storage Formats
|
|
326
|
+
|
|
327
|
+
### In-Memory Storage (Default)
|
|
328
|
+
|
|
329
|
+
Fast but not persistent across restarts:
|
|
330
|
+
|
|
331
|
+
```yaml
|
|
332
|
+
memory:
|
|
333
|
+
storage: memory
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### File Storage - JSON
|
|
337
|
+
|
|
338
|
+
Persistent, human-readable, supports complex objects:
|
|
339
|
+
|
|
340
|
+
```yaml
|
|
341
|
+
memory:
|
|
342
|
+
storage: file
|
|
343
|
+
file: ./data/memory.json
|
|
344
|
+
format: json
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**JSON Structure:**
|
|
348
|
+
```json
|
|
349
|
+
{
|
|
350
|
+
"default": {
|
|
351
|
+
"counter": 5,
|
|
352
|
+
"errors": ["error1", "error2"],
|
|
353
|
+
"metadata": {
|
|
354
|
+
"version": "1.0"
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
"production": {
|
|
358
|
+
"counter": 100
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### File Storage - CSV
|
|
364
|
+
|
|
365
|
+
Persistent, tabular format, good for simple data:
|
|
366
|
+
|
|
367
|
+
```yaml
|
|
368
|
+
memory:
|
|
369
|
+
storage: file
|
|
370
|
+
file: ./data/memory.csv
|
|
371
|
+
format: csv
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
**CSV Structure:**
|
|
375
|
+
```csv
|
|
376
|
+
namespace,key,value,type
|
|
377
|
+
default,counter,"5",number
|
|
378
|
+
default,errors,"error1",string
|
|
379
|
+
default,errors,"error2",string
|
|
380
|
+
production,counter,"100",number
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
## Access Patterns
|
|
384
|
+
|
|
385
|
+
### In Liquid Templates
|
|
386
|
+
|
|
387
|
+
Use `memory_get`, `memory_has`, and `memory_list` filters:
|
|
388
|
+
|
|
389
|
+
```yaml
|
|
390
|
+
steps:
|
|
391
|
+
log-status:
|
|
392
|
+
type: log
|
|
393
|
+
message: |
|
|
394
|
+
Counter: {{ "counter" | memory_get }}
|
|
395
|
+
Has errors: {{ "errors" | memory_has }}
|
|
396
|
+
All keys: {{ "" | memory_list | json }}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### In JavaScript Expressions
|
|
400
|
+
|
|
401
|
+
The `memory` object is available in `value_js`, `transform_js`, `fail_if`, etc.:
|
|
402
|
+
|
|
403
|
+
```yaml
|
|
404
|
+
steps:
|
|
405
|
+
increment:
|
|
406
|
+
type: memory
|
|
407
|
+
operation: set
|
|
408
|
+
key: counter
|
|
409
|
+
value_js: "memory.get('counter') + 1"
|
|
410
|
+
|
|
411
|
+
check-limit:
|
|
412
|
+
type: noop
|
|
413
|
+
fail_if: "memory.get('counter') > 10"
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
**Available Methods:**
|
|
417
|
+
- `memory.get(key, namespace?)` - Get value
|
|
418
|
+
- `memory.has(key, namespace?)` - Check if key exists
|
|
419
|
+
- `memory.list(namespace?)` - List all keys
|
|
420
|
+
- `memory.getAll(namespace?)` - Get all key-value pairs
|
|
421
|
+
|
|
422
|
+
### Access Dependency Outputs
|
|
423
|
+
|
|
424
|
+
```yaml
|
|
425
|
+
steps:
|
|
426
|
+
run-test:
|
|
427
|
+
type: command
|
|
428
|
+
exec: npm test
|
|
429
|
+
|
|
430
|
+
store-result:
|
|
431
|
+
type: memory
|
|
432
|
+
operation: set
|
|
433
|
+
key: test_result
|
|
434
|
+
value_js: 'outputs["run-test"].exitCode'
|
|
435
|
+
depends_on: [run-test]
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Access PR Information
|
|
439
|
+
|
|
440
|
+
```yaml
|
|
441
|
+
steps:
|
|
442
|
+
store-pr-number:
|
|
443
|
+
type: memory
|
|
444
|
+
operation: set
|
|
445
|
+
key: pr_number
|
|
446
|
+
value_js: "pr.number"
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
## Examples
|
|
450
|
+
|
|
451
|
+
### Retry Counter with goto
|
|
452
|
+
|
|
453
|
+
```yaml
|
|
454
|
+
memory:
|
|
455
|
+
storage: memory
|
|
456
|
+
|
|
457
|
+
steps:
|
|
458
|
+
init-retry:
|
|
459
|
+
type: memory
|
|
460
|
+
operation: set
|
|
461
|
+
key: retry_count
|
|
462
|
+
value: 0
|
|
463
|
+
|
|
464
|
+
run-test:
|
|
465
|
+
type: command
|
|
466
|
+
exec: npm test
|
|
467
|
+
depends_on: [init-retry]
|
|
468
|
+
on_fail:
|
|
469
|
+
run: [increment-retry]
|
|
470
|
+
goto_js: "memory.get('retry_count') < 3 ? 'run-test' : null"
|
|
471
|
+
|
|
472
|
+
increment-retry:
|
|
473
|
+
type: memory
|
|
474
|
+
operation: increment
|
|
475
|
+
key: retry_count
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
**Note:** You can also track retry history using `outputs.history['increment-retry']` to see all previous retry count values. See [Output History](./output-history.md) for tracking outputs across loop iterations.
|
|
479
|
+
|
|
480
|
+
### Error Collection
|
|
481
|
+
|
|
482
|
+
```yaml
|
|
483
|
+
memory:
|
|
484
|
+
storage: file
|
|
485
|
+
file: ./errors.json
|
|
486
|
+
|
|
487
|
+
steps:
|
|
488
|
+
init-errors:
|
|
489
|
+
type: memory
|
|
490
|
+
operation: set
|
|
491
|
+
key: errors
|
|
492
|
+
value: []
|
|
493
|
+
|
|
494
|
+
validate-code:
|
|
495
|
+
type: command
|
|
496
|
+
exec: eslint src/
|
|
497
|
+
on_fail:
|
|
498
|
+
run: [collect-error]
|
|
499
|
+
|
|
500
|
+
collect-error:
|
|
501
|
+
type: memory
|
|
502
|
+
operation: append
|
|
503
|
+
key: errors
|
|
504
|
+
value: "{{ outputs['validate-code'].stderr }}"
|
|
505
|
+
|
|
506
|
+
report-errors:
|
|
507
|
+
type: log
|
|
508
|
+
depends_on: [collect-error]
|
|
509
|
+
message: |
|
|
510
|
+
Found {{ "errors" | memory_get | size }} errors:
|
|
511
|
+
{% for error in "errors" | memory_get %}
|
|
512
|
+
- {{ error }}
|
|
513
|
+
{% endfor %}
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
### Workflow State Machine
|
|
517
|
+
|
|
518
|
+
```yaml
|
|
519
|
+
memory:
|
|
520
|
+
storage: file
|
|
521
|
+
file: ./workflow.json
|
|
522
|
+
|
|
523
|
+
steps:
|
|
524
|
+
init-state:
|
|
525
|
+
type: memory
|
|
526
|
+
operation: set
|
|
527
|
+
key: state
|
|
528
|
+
value: "pending"
|
|
529
|
+
|
|
530
|
+
step1:
|
|
531
|
+
type: command
|
|
532
|
+
exec: ./scripts/step1.sh
|
|
533
|
+
depends_on: [init-state]
|
|
534
|
+
on_success:
|
|
535
|
+
run: [set-state-step1]
|
|
536
|
+
|
|
537
|
+
set-state-step1:
|
|
538
|
+
type: memory
|
|
539
|
+
operation: set
|
|
540
|
+
key: state
|
|
541
|
+
value: "step1_complete"
|
|
542
|
+
|
|
543
|
+
step2:
|
|
544
|
+
type: command
|
|
545
|
+
exec: ./scripts/step2.sh
|
|
546
|
+
depends_on: [set-state-step1]
|
|
547
|
+
if: 'memory.get("state") === "step1_complete"'
|
|
548
|
+
on_success:
|
|
549
|
+
run: [set-state-step2]
|
|
550
|
+
|
|
551
|
+
set-state-step2:
|
|
552
|
+
type: memory
|
|
553
|
+
operation: set
|
|
554
|
+
key: state
|
|
555
|
+
value: "completed"
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
### Multi-Namespace Configuration
|
|
559
|
+
|
|
560
|
+
```yaml
|
|
561
|
+
memory:
|
|
562
|
+
storage: file
|
|
563
|
+
file: ./memory.json
|
|
564
|
+
namespace: production
|
|
565
|
+
|
|
566
|
+
steps:
|
|
567
|
+
# Production counter
|
|
568
|
+
prod-init:
|
|
569
|
+
type: memory
|
|
570
|
+
operation: set
|
|
571
|
+
key: counter
|
|
572
|
+
value: 100
|
|
573
|
+
|
|
574
|
+
# Staging counter (different namespace)
|
|
575
|
+
stage-init:
|
|
576
|
+
type: memory
|
|
577
|
+
operation: set
|
|
578
|
+
key: counter
|
|
579
|
+
value: 10
|
|
580
|
+
namespace: staging
|
|
581
|
+
|
|
582
|
+
# Compare values
|
|
583
|
+
compare:
|
|
584
|
+
type: log
|
|
585
|
+
depends_on: [prod-init, stage-init]
|
|
586
|
+
message: |
|
|
587
|
+
Production: {{ "counter" | memory_get: "production" }}
|
|
588
|
+
Staging: {{ "counter" | memory_get: "staging" }}
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
### Dynamic Value Computation
|
|
592
|
+
|
|
593
|
+
```yaml
|
|
594
|
+
steps:
|
|
595
|
+
calculate-score:
|
|
596
|
+
type: memory
|
|
597
|
+
operation: set
|
|
598
|
+
key: score
|
|
599
|
+
value_js: |
|
|
600
|
+
const errors = outputs["lint"].issues?.length || 0;
|
|
601
|
+
const warnings = outputs["test"].failures || 0;
|
|
602
|
+
return Math.max(0, 100 - (errors * 10) - (warnings * 5));
|
|
603
|
+
depends_on: [lint, test]
|
|
604
|
+
|
|
605
|
+
check-score:
|
|
606
|
+
type: noop
|
|
607
|
+
fail_if: "memory.get('score') < 70"
|
|
608
|
+
depends_on: [calculate-score]
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
### Complex Logic with script
|
|
612
|
+
|
|
613
|
+
```yaml
|
|
614
|
+
memory:
|
|
615
|
+
storage: memory
|
|
616
|
+
|
|
617
|
+
steps:
|
|
618
|
+
# Collect test results
|
|
619
|
+
run-tests:
|
|
620
|
+
type: command
|
|
621
|
+
exec: npm test -- --json
|
|
622
|
+
transform_js: "JSON.parse(output)"
|
|
623
|
+
|
|
624
|
+
# Analyze results with complex logic
|
|
625
|
+
analyze-results:
|
|
626
|
+
type: script
|
|
627
|
+
depends_on: [run-tests]
|
|
628
|
+
content: |
|
|
629
|
+
// Get test results
|
|
630
|
+
const results = outputs['run-tests'];
|
|
631
|
+
|
|
632
|
+
// Calculate statistics
|
|
633
|
+
const stats = {
|
|
634
|
+
total: results.numTotalTests || 0,
|
|
635
|
+
passed: results.numPassedTests || 0,
|
|
636
|
+
failed: results.numFailedTests || 0,
|
|
637
|
+
skipped: results.numPendingTests || 0
|
|
638
|
+
};
|
|
639
|
+
|
|
640
|
+
// Calculate pass rate
|
|
641
|
+
stats.passRate = stats.total > 0
|
|
642
|
+
? (stats.passed / stats.total * 100).toFixed(2)
|
|
643
|
+
: 0;
|
|
644
|
+
|
|
645
|
+
// Determine status
|
|
646
|
+
let status;
|
|
647
|
+
if (stats.failed === 0 && stats.total > 0) {
|
|
648
|
+
status = 'excellent';
|
|
649
|
+
} else if (stats.passRate >= 90) {
|
|
650
|
+
status = 'good';
|
|
651
|
+
} else if (stats.passRate >= 70) {
|
|
652
|
+
status = 'acceptable';
|
|
653
|
+
} else {
|
|
654
|
+
status = 'poor';
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// Store analysis
|
|
658
|
+
memory.set('test_stats', stats);
|
|
659
|
+
memory.set('test_status', status);
|
|
660
|
+
|
|
661
|
+
// Collect failed test names
|
|
662
|
+
if (results.testResults) {
|
|
663
|
+
const failures = [];
|
|
664
|
+
for (const suite of results.testResults) {
|
|
665
|
+
for (const test of suite.assertionResults || []) {
|
|
666
|
+
if (test.status === 'failed') {
|
|
667
|
+
failures.push({
|
|
668
|
+
suite: suite.name,
|
|
669
|
+
test: test.fullName,
|
|
670
|
+
message: test.failureMessages?.[0]
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
memory.set('test_failures', failures);
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
// Return summary
|
|
679
|
+
return {
|
|
680
|
+
stats,
|
|
681
|
+
status,
|
|
682
|
+
failureCount: stats.failed
|
|
683
|
+
};
|
|
684
|
+
|
|
685
|
+
# Report results
|
|
686
|
+
report:
|
|
687
|
+
type: log
|
|
688
|
+
depends_on: [analyze-results]
|
|
689
|
+
message: |
|
|
690
|
+
## Test Results
|
|
691
|
+
|
|
692
|
+
Status: **{{ "test_status" | memory_get | upcase }}**
|
|
693
|
+
|
|
694
|
+
{% assign stats = "test_stats" | memory_get %}
|
|
695
|
+
- Total: {{ stats.total }}
|
|
696
|
+
- Passed: {{ stats.passed }}
|
|
697
|
+
- Failed: {{ stats.failed }}
|
|
698
|
+
- Pass Rate: {{ stats.passRate }}%
|
|
699
|
+
|
|
700
|
+
{% assign failures = "test_failures" | memory_get %}
|
|
701
|
+
{% if failures.size > 0 %}
|
|
702
|
+
### Failed Tests
|
|
703
|
+
{% for failure in failures %}
|
|
704
|
+
- **{{ failure.test }}**
|
|
705
|
+
- Suite: {{ failure.suite }}
|
|
706
|
+
- Error: {{ failure.message | truncate: 100 }}
|
|
707
|
+
{% endfor %}
|
|
708
|
+
{% endif %}
|
|
709
|
+
|
|
710
|
+
# Fail if status is poor
|
|
711
|
+
check-quality:
|
|
712
|
+
type: noop
|
|
713
|
+
depends_on: [report]
|
|
714
|
+
fail_if: "memory.get('test_status') === 'poor'"
|
|
715
|
+
```
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
|
|
719
|
+
## Best Practices
|
|
720
|
+
|
|
721
|
+
### 1. Choose the Right Storage Mode
|
|
722
|
+
|
|
723
|
+
- **Use in-memory** for temporary data within a single run
|
|
724
|
+
- **Use file storage** for data that needs to persist across runs
|
|
725
|
+
|
|
726
|
+
### 2. Use Namespaces for Isolation
|
|
727
|
+
|
|
728
|
+
- Separate production/staging/development data
|
|
729
|
+
- Isolate different workflow contexts
|
|
730
|
+
- Avoid key collisions between independent workflows
|
|
731
|
+
|
|
732
|
+
### 3. Initialize Before Use
|
|
733
|
+
|
|
734
|
+
Always initialize memory values before using them:
|
|
735
|
+
|
|
736
|
+
```yaml
|
|
737
|
+
steps:
|
|
738
|
+
init:
|
|
739
|
+
type: memory
|
|
740
|
+
operation: set
|
|
741
|
+
key: counter
|
|
742
|
+
value: 0
|
|
743
|
+
|
|
744
|
+
use:
|
|
745
|
+
type: memory
|
|
746
|
+
operation: set
|
|
747
|
+
key: counter
|
|
748
|
+
value_js: "memory.get('counter') + 1"
|
|
749
|
+
depends_on: [init]
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
### 4. Use Meaningful Key Names
|
|
753
|
+
|
|
754
|
+
Use descriptive, namespaced keys:
|
|
755
|
+
|
|
756
|
+
```yaml
|
|
757
|
+
# Good
|
|
758
|
+
key: workflow_retry_count
|
|
759
|
+
key: validation_errors
|
|
760
|
+
key: deployment_state
|
|
761
|
+
|
|
762
|
+
# Avoid
|
|
763
|
+
key: count
|
|
764
|
+
key: data
|
|
765
|
+
key: temp
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
### 5. Clean Up When Done
|
|
769
|
+
|
|
770
|
+
Clear temporary data when the workflow completes:
|
|
771
|
+
|
|
772
|
+
```yaml
|
|
773
|
+
steps:
|
|
774
|
+
cleanup:
|
|
775
|
+
type: memory
|
|
776
|
+
operation: clear
|
|
777
|
+
namespace: temporary
|
|
778
|
+
```
|
|
779
|
+
|
|
780
|
+
### 6. Handle Missing Keys
|
|
781
|
+
|
|
782
|
+
Always check if a key exists before using it:
|
|
783
|
+
|
|
784
|
+
```javascript
|
|
785
|
+
// Check existence
|
|
786
|
+
if (memory.has('counter')) {
|
|
787
|
+
return memory.get('counter') + 1;
|
|
788
|
+
}
|
|
789
|
+
return 1;
|
|
790
|
+
|
|
791
|
+
// Or use default
|
|
792
|
+
const count = memory.get('counter') || 0;
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
### 7. Use append for Collections
|
|
796
|
+
|
|
797
|
+
For collecting multiple values, use `append` instead of manual array management:
|
|
798
|
+
|
|
799
|
+
```yaml
|
|
800
|
+
# Good
|
|
801
|
+
steps:
|
|
802
|
+
collect-error:
|
|
803
|
+
type: memory
|
|
804
|
+
operation: append
|
|
805
|
+
key: errors
|
|
806
|
+
value: "{{ error_message }}"
|
|
807
|
+
|
|
808
|
+
# Avoid
|
|
809
|
+
steps:
|
|
810
|
+
collect-error-manual:
|
|
811
|
+
type: memory
|
|
812
|
+
operation: set
|
|
813
|
+
key: errors
|
|
814
|
+
value_js: "[...(memory.get('errors') || []), '{{ error_message }}']"
|
|
815
|
+
```
|
|
816
|
+
|
|
817
|
+
### 8. Version Your Storage Files
|
|
818
|
+
|
|
819
|
+
For file-based storage, use versioning to avoid conflicts:
|
|
820
|
+
|
|
821
|
+
```yaml
|
|
822
|
+
memory:
|
|
823
|
+
storage: file
|
|
824
|
+
file: ./memory-v1.json # Version in filename
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
### 9. Monitor Memory Size
|
|
828
|
+
|
|
829
|
+
For long-running workflows, periodically clear or archive old data to prevent unbounded growth.
|
|
830
|
+
|
|
831
|
+
### 10. Document Your Memory Schema
|
|
832
|
+
|
|
833
|
+
Add comments documenting the memory keys your workflow uses:
|
|
834
|
+
|
|
835
|
+
```yaml
|
|
836
|
+
# Memory keys used:
|
|
837
|
+
# - retry_count: number - Current retry attempt (0-3)
|
|
838
|
+
# - errors: string[] - Collected error messages
|
|
839
|
+
# - workflow_state: string - Current state (pending|running|complete)
|
|
840
|
+
|
|
841
|
+
steps:
|
|
842
|
+
# ...
|
|
843
|
+
```
|
|
844
|
+
|
|
845
|
+
## Troubleshooting
|
|
846
|
+
|
|
847
|
+
### Key Not Found
|
|
848
|
+
|
|
849
|
+
If `memory.get()` returns `undefined`, the key may not be initialized:
|
|
850
|
+
|
|
851
|
+
```yaml
|
|
852
|
+
# Add initialization
|
|
853
|
+
steps:
|
|
854
|
+
init:
|
|
855
|
+
type: memory
|
|
856
|
+
operation: set
|
|
857
|
+
key: my_key
|
|
858
|
+
value: default_value
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
### File Not Persisting
|
|
862
|
+
|
|
863
|
+
Ensure `auto_save` is enabled:
|
|
864
|
+
|
|
865
|
+
```yaml
|
|
866
|
+
memory:
|
|
867
|
+
storage: file
|
|
868
|
+
file: ./memory.json
|
|
869
|
+
auto_save: true # Must be true for auto-persistence
|
|
870
|
+
```
|
|
871
|
+
|
|
872
|
+
### Namespace Confusion
|
|
873
|
+
|
|
874
|
+
Always specify the namespace when accessing data:
|
|
875
|
+
|
|
876
|
+
```javascript
|
|
877
|
+
// Explicit namespace
|
|
878
|
+
memory.get('counter', 'production')
|
|
879
|
+
|
|
880
|
+
// Or use the default
|
|
881
|
+
memory.get('counter') // Uses global memory.namespace
|
|
882
|
+
```
|
|
883
|
+
|
|
884
|
+
### Value Not Updating
|
|
885
|
+
|
|
886
|
+
Ensure dependencies are set correctly:
|
|
887
|
+
|
|
888
|
+
```yaml
|
|
889
|
+
steps:
|
|
890
|
+
update:
|
|
891
|
+
type: memory
|
|
892
|
+
operation: set
|
|
893
|
+
key: value
|
|
894
|
+
value: 10
|
|
895
|
+
depends_on: [init] # Wait for init first
|
|
896
|
+
```
|
|
897
|
+
|
|
898
|
+
## Related Documentation
|
|
899
|
+
|
|
900
|
+
- [Liquid Templates](./liquid-templates.md)
|
|
901
|
+
- [Failure Routing](./failure-routing.md)
|
|
902
|
+
- [Commands](./commands.md)
|
|
903
|
+
- [Recipes](./recipes.md)
|