@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.
Files changed (530) hide show
  1. package/README.md +71 -2
  2. package/action.yml +1 -1
  3. package/defaults/code-refiner.yaml +114 -0
  4. package/defaults/{.visor.yaml → code-review.yaml} +35 -226
  5. package/defaults/override.yaml +52 -0
  6. package/defaults/task-refinement.yaml +624 -0
  7. package/defaults/visor.tests.yaml +685 -0
  8. package/defaults/visor.yaml +483 -0
  9. package/dist/action-cli-bridge.d.ts +11 -82
  10. package/dist/action-cli-bridge.d.ts.map +1 -1
  11. package/dist/ai-review-service.d.ts +28 -9
  12. package/dist/ai-review-service.d.ts.map +1 -1
  13. package/dist/check-execution-engine.d.ts +19 -331
  14. package/dist/check-execution-engine.d.ts.map +1 -1
  15. package/dist/cli-main.d.ts.map +1 -1
  16. package/dist/cli.d.ts +0 -1
  17. package/dist/cli.d.ts.map +1 -1
  18. package/dist/config.d.ts +16 -0
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/cron-scheduler.d.ts +3 -3
  21. package/dist/cron-scheduler.d.ts.map +1 -1
  22. package/dist/debug-visualizer/ws-server.d.ts +7 -1
  23. package/dist/debug-visualizer/ws-server.d.ts.map +1 -1
  24. package/dist/defaults/code-refiner.yaml +114 -0
  25. package/dist/defaults/{.visor.yaml → code-review.yaml} +35 -226
  26. package/dist/defaults/override.yaml +52 -0
  27. package/dist/defaults/task-refinement.yaml +624 -0
  28. package/dist/defaults/visor.tests.yaml +685 -0
  29. package/dist/defaults/visor.yaml +483 -0
  30. package/dist/docs/DEPLOYMENT.md +118 -0
  31. package/dist/docs/GITHUB_CHECKS.md +280 -0
  32. package/dist/docs/NPM_USAGE.md +208 -0
  33. package/dist/docs/action-reference.md +19 -0
  34. package/dist/docs/advanced-ai.md +237 -0
  35. package/dist/docs/ai-configuration.md +535 -0
  36. package/dist/docs/ai-custom-tools-usage.md +261 -0
  37. package/dist/docs/ai-custom-tools.md +392 -0
  38. package/dist/docs/author-permissions.md +610 -0
  39. package/dist/docs/bot-transports-rfc.md +23 -0
  40. package/dist/docs/ci-cli-mode.md +34 -0
  41. package/dist/docs/claude-code.md +74 -0
  42. package/dist/docs/command-provider.md +559 -0
  43. package/dist/docs/commands.md +8 -0
  44. package/dist/docs/configuration.md +324 -0
  45. package/dist/docs/custom-tools.md +424 -0
  46. package/dist/docs/dashboards/README.md +23 -0
  47. package/dist/docs/dashboards/grafana-visor-diagrams.json +20 -0
  48. package/dist/docs/dashboards/grafana-visor-overview.json +33 -0
  49. package/dist/docs/debug-visualizer-progress.md +572 -0
  50. package/dist/docs/debug-visualizer-rfc.md +691 -0
  51. package/dist/docs/debug-visualizer.md +114 -0
  52. package/dist/docs/debugging.md +636 -0
  53. package/dist/docs/default-output-schema.md +28 -0
  54. package/dist/docs/dependencies.md +369 -0
  55. package/dist/docs/dev-playbook.md +9 -0
  56. package/dist/docs/engine-pause-resume-rfc.md +192 -0
  57. package/dist/docs/engine-state-machine-plan.md +333 -0
  58. package/dist/docs/event-driven-github-integration-rfc.md +743 -0
  59. package/dist/docs/event-triggers.md +292 -0
  60. package/dist/docs/execution-statistics-rfc.md +290 -0
  61. package/dist/docs/fact-validator-gap-analysis.md +178 -0
  62. package/dist/docs/fact-validator-implementation-plan.md +1235 -0
  63. package/dist/docs/fail-if.md +95 -0
  64. package/dist/docs/failure-conditions-implementation.md +271 -0
  65. package/dist/docs/failure-conditions-schema.md +173 -0
  66. package/dist/docs/failure-routing-rfc.md +193 -0
  67. package/dist/docs/failure-routing.md +507 -0
  68. package/dist/docs/foreach-dependency-propagation.md +473 -0
  69. package/dist/docs/github-ops.md +89 -0
  70. package/dist/docs/goto-forward-run-plan.md +113 -0
  71. package/dist/docs/guides/criticality-modes.md +332 -0
  72. package/dist/docs/guides/fault-management-and-contracts.md +738 -0
  73. package/dist/docs/guides/workflow-style-guide.md +224 -0
  74. package/dist/docs/http.md +299 -0
  75. package/dist/docs/human-input-provider.md +372 -0
  76. package/dist/docs/lifecycle-hooks.md +253 -0
  77. package/dist/docs/limits.md +64 -0
  78. package/dist/docs/liquid-templates.md +490 -0
  79. package/dist/docs/loop-routing-refactor.md +89 -0
  80. package/dist/docs/mcp-provider.md +557 -0
  81. package/dist/docs/mcp.md +124 -0
  82. package/dist/docs/memory.md +903 -0
  83. package/dist/docs/observability.md +12 -0
  84. package/dist/docs/output-formats.md +20 -0
  85. package/dist/docs/output-formatting.md +29 -0
  86. package/dist/docs/output-history.md +383 -0
  87. package/dist/docs/performance.md +6 -0
  88. package/dist/docs/pluggable.md +124 -0
  89. package/dist/docs/proposals/snapshot-scope-execution.md +236 -0
  90. package/dist/docs/providers/git-checkout.md +589 -0
  91. package/dist/docs/recipes.md +474 -0
  92. package/dist/docs/rfc/git-checkout-step.md +601 -0
  93. package/dist/docs/rfc/on_init-hook.md +1294 -0
  94. package/dist/docs/rfc/workspace-isolation.md +216 -0
  95. package/dist/docs/roadmap/criticality-implementation-tasks.md +92 -0
  96. package/dist/docs/router-patterns.md +339 -0
  97. package/dist/docs/schema-next-pr.md +10 -0
  98. package/dist/docs/schema-templates.md +68 -0
  99. package/dist/docs/script.md +34 -0
  100. package/dist/docs/sdk.md +222 -0
  101. package/dist/docs/security.md +7 -0
  102. package/dist/docs/suppressions.md +89 -0
  103. package/dist/docs/tag-filtering.md +258 -0
  104. package/dist/docs/telemetry-setup.md +119 -0
  105. package/dist/docs/telemetry-tracing-rfc.md +275 -0
  106. package/dist/docs/test-framework-rfc.md +680 -0
  107. package/dist/docs/testing/assertions.md +85 -0
  108. package/dist/docs/testing/ci.md +44 -0
  109. package/dist/docs/testing/cli.md +41 -0
  110. package/dist/docs/testing/cookbook.md +172 -0
  111. package/dist/docs/testing/dsl-reference.md +199 -0
  112. package/dist/docs/testing/fixtures-and-mocks.md +91 -0
  113. package/dist/docs/testing/flows.md +92 -0
  114. package/dist/docs/testing/getting-started.md +93 -0
  115. package/dist/docs/testing/troubleshooting.md +55 -0
  116. package/dist/docs/timeouts.md +50 -0
  117. package/dist/docs/troubleshooting.md +7 -0
  118. package/dist/docs/visor-sdk-rfc.md +186 -0
  119. package/dist/docs/workflows.md +569 -0
  120. package/dist/engine/on-finish/orchestrator.d.ts +19 -0
  121. package/dist/engine/on-finish/orchestrator.d.ts.map +1 -0
  122. package/dist/engine/on-finish/utils.d.ts +44 -0
  123. package/dist/engine/on-finish/utils.d.ts.map +1 -0
  124. package/dist/event-bus/event-bus.d.ts +13 -0
  125. package/dist/event-bus/event-bus.d.ts.map +1 -0
  126. package/dist/event-bus/types.d.ts +71 -0
  127. package/dist/event-bus/types.d.ts.map +1 -0
  128. package/dist/examples/.claude/agents/code-reviewer.md +69 -0
  129. package/dist/examples/.mcp.json +34 -0
  130. package/dist/examples/CALCULATOR-SDK.md +364 -0
  131. package/dist/examples/README.md +384 -0
  132. package/dist/examples/ai-custom-tools-example.yaml +206 -0
  133. package/dist/examples/ai-custom-tools-simple.yaml +76 -0
  134. package/dist/examples/ai-retry-fallback-config.yaml +180 -0
  135. package/dist/examples/ai-with-bash.yaml +126 -0
  136. package/dist/examples/ai-with-mcp.yaml +82 -0
  137. package/dist/examples/basic-human-input.yaml +15 -0
  138. package/dist/examples/bedrock-config.yaml +77 -0
  139. package/dist/examples/calculator-config.yaml +133 -0
  140. package/dist/examples/calculator-json-output-guide.md +311 -0
  141. package/dist/examples/calculator-sdk-automated.ts +340 -0
  142. package/dist/examples/calculator-sdk-example.ts +275 -0
  143. package/dist/examples/calculator-sdk-json.ts +331 -0
  144. package/dist/examples/calculator-sdk-real.ts +374 -0
  145. package/dist/examples/calculator-sdk-test.ts +148 -0
  146. package/dist/examples/claude-code-config.yaml +191 -0
  147. package/dist/examples/cron-webhook-config.yaml +215 -0
  148. package/dist/examples/custom-template.liquid +57 -0
  149. package/dist/examples/custom-tools-example.yaml +281 -0
  150. package/dist/examples/enhanced-config.yaml +165 -0
  151. package/dist/examples/environments/visor.base.yaml +92 -0
  152. package/dist/examples/environments/visor.dev.yaml +33 -0
  153. package/dist/examples/environments/visor.prod.yaml +95 -0
  154. package/dist/examples/environments/visor.staging.yaml +46 -0
  155. package/dist/examples/fact-validator.yaml +361 -0
  156. package/dist/examples/fail-if-simple.yaml +90 -0
  157. package/dist/examples/failure-conditions-advanced.yaml +136 -0
  158. package/dist/examples/failure-conditions-basic.yaml +48 -0
  159. package/dist/examples/failure-conditions-github-style.yaml +119 -0
  160. package/dist/examples/failure-conditions-migration.yaml +74 -0
  161. package/dist/examples/for-loop-example.yaml +176 -0
  162. package/dist/examples/forEach-example.yaml +120 -0
  163. package/dist/examples/git-checkout-basic.yaml +32 -0
  164. package/dist/examples/git-checkout-compare.yaml +59 -0
  165. package/dist/examples/git-checkout-cross-repo.yaml +76 -0
  166. package/dist/examples/github-workflow-with-tags.yml +163 -0
  167. package/dist/examples/http-integration-config.yaml +240 -0
  168. package/dist/examples/https-server-config.yaml +209 -0
  169. package/dist/examples/human-input-example.yaml +63 -0
  170. package/dist/examples/if-conditions.yaml +173 -0
  171. package/dist/examples/jira-simple-example.yaml +56 -0
  172. package/dist/examples/jira-single-issue-workflow.yaml +166 -0
  173. package/dist/examples/jira-workflow-mcp.yaml +182 -0
  174. package/dist/examples/mcp/analyzer.py +119 -0
  175. package/dist/examples/mcp-provider-example.yaml +301 -0
  176. package/dist/examples/memory-counter.yaml +99 -0
  177. package/dist/examples/memory-error-collection.yaml +104 -0
  178. package/dist/examples/memory-exec-js.yaml +247 -0
  179. package/dist/examples/memory-namespace-isolation.yaml +184 -0
  180. package/dist/examples/memory-retry-counter.yaml +65 -0
  181. package/dist/examples/memory-state-machine.yaml +170 -0
  182. package/dist/examples/on-init-import-demo.yaml +179 -0
  183. package/dist/examples/outputs-raw-basic.yaml +26 -0
  184. package/dist/examples/project-with-tools.yaml +174 -0
  185. package/dist/examples/prompts/architecture-analysis.liquid +116 -0
  186. package/dist/examples/prompts/security-comprehensive.liquid +107 -0
  187. package/dist/examples/quick-start-tags.yaml +53 -0
  188. package/dist/examples/reusable-tools.yaml +92 -0
  189. package/dist/examples/reusable-workflows.yaml +88 -0
  190. package/dist/examples/routing-basic.yaml +35 -0
  191. package/dist/examples/routing-dynamic-js.yaml +46 -0
  192. package/dist/examples/routing-foreach.yaml +34 -0
  193. package/dist/examples/routing-goto-event.yaml +34 -0
  194. package/dist/examples/routing-on-success.yaml +25 -0
  195. package/dist/examples/run-calculator-demo.sh +71 -0
  196. package/dist/examples/sdk-basic.mjs +10 -0
  197. package/dist/examples/sdk-cjs.cjs +10 -0
  198. package/dist/examples/sdk-comprehensive.mjs +175 -0
  199. package/dist/examples/sdk-manual-config.mjs +65 -0
  200. package/dist/examples/sdk-typescript.js +81 -0
  201. package/dist/examples/sdk-typescript.ts +92 -0
  202. package/dist/examples/session-reuse-config.yaml +151 -0
  203. package/dist/examples/session-reuse-self.yaml +81 -0
  204. package/dist/examples/slack-simple-chat.yaml +775 -0
  205. package/dist/examples/templates/security-report.liquid +137 -0
  206. package/dist/examples/tools-library.yaml +281 -0
  207. package/dist/examples/transform-example.yaml +199 -0
  208. package/dist/examples/visor-with-tags.yaml +198 -0
  209. package/dist/examples/webhook-pipeline-config.yaml +218 -0
  210. package/dist/examples/workflows/calculator-workflow.yaml +163 -0
  211. package/dist/examples/workflows/code-quality.yaml +222 -0
  212. package/dist/examples/workflows/quick-pr-check.yaml +90 -0
  213. package/dist/examples/workflows/workflow-composition-example.yaml +130 -0
  214. package/dist/failure-condition-evaluator.d.ts +3 -0
  215. package/dist/failure-condition-evaluator.d.ts.map +1 -1
  216. package/dist/frontends/github-frontend.d.ts +58 -0
  217. package/dist/frontends/github-frontend.d.ts.map +1 -0
  218. package/dist/frontends/host.d.ts +47 -0
  219. package/dist/frontends/host.d.ts.map +1 -0
  220. package/dist/frontends/ndjson-sink.d.ts +12 -0
  221. package/dist/frontends/ndjson-sink.d.ts.map +1 -0
  222. package/dist/frontends/slack-frontend.d.ts +58 -0
  223. package/dist/frontends/slack-frontend.d.ts.map +1 -0
  224. package/dist/generated/config-schema.d.ts +967 -57
  225. package/dist/generated/config-schema.d.ts.map +1 -1
  226. package/dist/generated/config-schema.json +1033 -56
  227. package/dist/github-check-service.d.ts +4 -6
  228. package/dist/github-check-service.d.ts.map +1 -1
  229. package/dist/github-comments.d.ts +2 -4
  230. package/dist/github-comments.d.ts.map +1 -1
  231. package/dist/index.d.ts.map +1 -1
  232. package/dist/index.js +134327 -99004
  233. package/dist/liquid-extensions.d.ts.map +1 -1
  234. package/dist/logger.d.ts +2 -0
  235. package/dist/logger.d.ts.map +1 -1
  236. package/dist/memory-store.d.ts +6 -0
  237. package/dist/memory-store.d.ts.map +1 -1
  238. package/dist/output/assistant-json/template.liquid +0 -0
  239. package/dist/output/traces/run-2026-01-20T19-22-58-043Z.ndjson +138 -0
  240. package/dist/output/traces/run-2026-01-20T19-23-52-175Z.ndjson +1067 -0
  241. package/dist/output-formatters.d.ts +1 -1
  242. package/dist/output-formatters.d.ts.map +1 -1
  243. package/dist/providers/ai-check-provider.d.ts +12 -0
  244. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  245. package/dist/providers/check-provider-registry.d.ts +6 -0
  246. package/dist/providers/check-provider-registry.d.ts.map +1 -1
  247. package/dist/providers/check-provider.interface.d.ts +43 -1
  248. package/dist/providers/check-provider.interface.d.ts.map +1 -1
  249. package/dist/providers/claude-code-check-provider.d.ts.map +1 -1
  250. package/dist/providers/command-check-provider.d.ts +1 -1
  251. package/dist/providers/command-check-provider.d.ts.map +1 -1
  252. package/dist/providers/custom-tool-executor.d.ts +61 -0
  253. package/dist/providers/custom-tool-executor.d.ts.map +1 -0
  254. package/dist/providers/git-checkout-provider.d.ts +25 -0
  255. package/dist/providers/git-checkout-provider.d.ts.map +1 -0
  256. package/dist/providers/github-ops-provider.d.ts.map +1 -1
  257. package/dist/providers/http-client-provider.d.ts +4 -4
  258. package/dist/providers/http-client-provider.d.ts.map +1 -1
  259. package/dist/providers/human-input-check-provider.d.ts +5 -0
  260. package/dist/providers/human-input-check-provider.d.ts.map +1 -1
  261. package/dist/providers/index.d.ts +1 -0
  262. package/dist/providers/index.d.ts.map +1 -1
  263. package/dist/providers/log-check-provider.d.ts +2 -5
  264. package/dist/providers/log-check-provider.d.ts.map +1 -1
  265. package/dist/providers/mcp-check-provider.d.ts +10 -4
  266. package/dist/providers/mcp-check-provider.d.ts.map +1 -1
  267. package/dist/providers/mcp-custom-sse-server.d.ts +66 -0
  268. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -0
  269. package/dist/providers/memory-check-provider.d.ts +2 -8
  270. package/dist/providers/memory-check-provider.d.ts.map +1 -1
  271. package/dist/providers/script-check-provider.d.ts +25 -0
  272. package/dist/providers/script-check-provider.d.ts.map +1 -0
  273. package/dist/providers/workflow-check-provider.d.ts +56 -0
  274. package/dist/providers/workflow-check-provider.d.ts.map +1 -0
  275. package/dist/reviewer.d.ts +2 -1
  276. package/dist/reviewer.d.ts.map +1 -1
  277. package/dist/sdk/check-provider-registry-534KL5HT.mjs +27 -0
  278. package/dist/sdk/chunk-23L3QRYX.mjs +16872 -0
  279. package/dist/sdk/chunk-23L3QRYX.mjs.map +1 -0
  280. package/dist/sdk/{chunk-TUTOLSFV.mjs → chunk-3OMWVM6J.mjs} +11 -1
  281. package/dist/sdk/chunk-3OMWVM6J.mjs.map +1 -0
  282. package/dist/sdk/chunk-7UK3NIIT.mjs +482 -0
  283. package/dist/sdk/chunk-7UK3NIIT.mjs.map +1 -0
  284. package/dist/sdk/chunk-AGIZJ4UZ.mjs +173 -0
  285. package/dist/sdk/chunk-AGIZJ4UZ.mjs.map +1 -0
  286. package/dist/sdk/chunk-AIVFBIS4.mjs +1371 -0
  287. package/dist/sdk/chunk-AIVFBIS4.mjs.map +1 -0
  288. package/dist/sdk/chunk-AK6BVWIT.mjs +426 -0
  289. package/dist/sdk/chunk-AK6BVWIT.mjs.map +1 -0
  290. package/dist/sdk/chunk-AUT26LHW.mjs +139 -0
  291. package/dist/sdk/chunk-AUT26LHW.mjs.map +1 -0
  292. package/dist/sdk/chunk-BOVFH3LI.mjs +232 -0
  293. package/dist/sdk/chunk-BOVFH3LI.mjs.map +1 -0
  294. package/dist/sdk/chunk-CNX7V5JK.mjs +89 -0
  295. package/dist/sdk/chunk-CNX7V5JK.mjs.map +1 -0
  296. package/dist/sdk/chunk-HTOKWMPO.mjs +157 -0
  297. package/dist/sdk/chunk-HTOKWMPO.mjs.map +1 -0
  298. package/dist/sdk/chunk-NAW3DB3I.mjs +197 -0
  299. package/dist/sdk/chunk-NAW3DB3I.mjs.map +1 -0
  300. package/dist/sdk/chunk-O5EZDNYL.mjs +274 -0
  301. package/dist/sdk/chunk-O5EZDNYL.mjs.map +1 -0
  302. package/dist/sdk/chunk-QR7MOMJH.mjs +558 -0
  303. package/dist/sdk/chunk-QR7MOMJH.mjs.map +1 -0
  304. package/dist/sdk/chunk-QY2XYPEV.mjs +3556 -0
  305. package/dist/sdk/chunk-QY2XYPEV.mjs.map +1 -0
  306. package/dist/sdk/chunk-S2RUE2RG.mjs +145 -0
  307. package/dist/sdk/chunk-S2RUE2RG.mjs.map +1 -0
  308. package/dist/sdk/chunk-SIWNBRTK.mjs +800 -0
  309. package/dist/sdk/chunk-SIWNBRTK.mjs.map +1 -0
  310. package/dist/sdk/chunk-YSN4G6CI.mjs +146 -0
  311. package/dist/sdk/chunk-YSN4G6CI.mjs.map +1 -0
  312. package/dist/sdk/chunk-ZYAUYXSW.mjs +206 -0
  313. package/dist/sdk/chunk-ZYAUYXSW.mjs.map +1 -0
  314. package/dist/sdk/command-executor-TYUV6HUS.mjs +14 -0
  315. package/dist/sdk/config-YNC2EOOT.mjs +16 -0
  316. package/dist/sdk/config-merger-PX3WIT57.mjs +10 -0
  317. package/dist/sdk/event-bus-5BEVPQ6T.mjs +35 -0
  318. package/dist/sdk/event-bus-5BEVPQ6T.mjs.map +1 -0
  319. package/dist/sdk/failure-condition-evaluator-YGTF2GHG.mjs +17 -0
  320. package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs +458 -0
  321. package/dist/sdk/git-repository-analyzer-HJC4MYW4.mjs.map +1 -0
  322. package/dist/sdk/github-frontend-SIAEOCON.mjs +1420 -0
  323. package/dist/sdk/github-frontend-SIAEOCON.mjs.map +1 -0
  324. package/dist/sdk/host-DXUYTNMU.mjs +52 -0
  325. package/dist/sdk/host-DXUYTNMU.mjs.map +1 -0
  326. package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs → liquid-extensions-PKWCKK7E.mjs} +8 -2
  327. package/dist/sdk/memory-store-XGBB7LX7.mjs +12 -0
  328. package/dist/sdk/memory-store-XGBB7LX7.mjs.map +1 -0
  329. package/dist/sdk/metrics-7PP3EJUH.mjs +29 -0
  330. package/dist/sdk/metrics-7PP3EJUH.mjs.map +1 -0
  331. package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs +44 -0
  332. package/dist/sdk/ndjson-sink-B4V4NTAQ.mjs.map +1 -0
  333. package/dist/sdk/prompt-state-YRJY6QAL.mjs +16 -0
  334. package/dist/sdk/prompt-state-YRJY6QAL.mjs.map +1 -0
  335. package/dist/sdk/renderer-schema-LPKN5UJS.mjs +51 -0
  336. package/dist/sdk/renderer-schema-LPKN5UJS.mjs.map +1 -0
  337. package/dist/sdk/routing-6N45MJ4F.mjs +24 -0
  338. package/dist/sdk/routing-6N45MJ4F.mjs.map +1 -0
  339. package/dist/sdk/sdk.d.mts +541 -22
  340. package/dist/sdk/sdk.d.ts +541 -22
  341. package/dist/sdk/sdk.js +27963 -16505
  342. package/dist/sdk/sdk.js.map +1 -1
  343. package/dist/sdk/sdk.mjs +1116 -2169
  344. package/dist/sdk/sdk.mjs.map +1 -1
  345. package/dist/sdk/session-registry-4E6YRQ77.mjs +10 -0
  346. package/dist/sdk/session-registry-4E6YRQ77.mjs.map +1 -0
  347. package/dist/sdk/slack-frontend-BVKW3GD5.mjs +735 -0
  348. package/dist/sdk/slack-frontend-BVKW3GD5.mjs.map +1 -0
  349. package/dist/sdk/trace-helpers-VP6QYVBX.mjs +23 -0
  350. package/dist/sdk/trace-helpers-VP6QYVBX.mjs.map +1 -0
  351. package/dist/sdk/{tracer-init-WC75N5NW.mjs → tracer-init-GSLPPLCD.mjs} +2 -2
  352. package/dist/sdk/tracer-init-GSLPPLCD.mjs.map +1 -0
  353. package/dist/sdk/workflow-registry-R6KSACFR.mjs +12 -0
  354. package/dist/sdk/workflow-registry-R6KSACFR.mjs.map +1 -0
  355. package/dist/sdk.d.ts.map +1 -1
  356. package/dist/slack/adapter.d.ts +36 -0
  357. package/dist/slack/adapter.d.ts.map +1 -0
  358. package/dist/slack/cache-prewarmer.d.ts +31 -0
  359. package/dist/slack/cache-prewarmer.d.ts.map +1 -0
  360. package/dist/slack/client.d.ts +77 -0
  361. package/dist/slack/client.d.ts.map +1 -0
  362. package/dist/slack/markdown.d.ts +45 -0
  363. package/dist/slack/markdown.d.ts.map +1 -0
  364. package/dist/slack/prompt-state.d.ts +33 -0
  365. package/dist/slack/prompt-state.d.ts.map +1 -0
  366. package/dist/slack/rate-limiter.d.ts +56 -0
  367. package/dist/slack/rate-limiter.d.ts.map +1 -0
  368. package/dist/slack/signature.d.ts +2 -0
  369. package/dist/slack/signature.d.ts.map +1 -0
  370. package/dist/slack/socket-runner.d.ts +42 -0
  371. package/dist/slack/socket-runner.d.ts.map +1 -0
  372. package/dist/slack/thread-cache.d.ts +51 -0
  373. package/dist/slack/thread-cache.d.ts.map +1 -0
  374. package/dist/snapshot-store.d.ts +59 -0
  375. package/dist/snapshot-store.d.ts.map +1 -0
  376. package/dist/state-machine/context/build-engine-context.d.ts +17 -0
  377. package/dist/state-machine/context/build-engine-context.d.ts.map +1 -0
  378. package/dist/state-machine/dispatch/dependency-gating.d.ts +12 -0
  379. package/dist/state-machine/dispatch/dependency-gating.d.ts.map +1 -0
  380. package/dist/state-machine/dispatch/execution-invoker.d.ts +14 -0
  381. package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -0
  382. package/dist/state-machine/dispatch/foreach-processor.d.ts +8 -0
  383. package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -0
  384. package/dist/state-machine/dispatch/history-snapshot.d.ts +8 -0
  385. package/dist/state-machine/dispatch/history-snapshot.d.ts.map +1 -0
  386. package/dist/state-machine/dispatch/on-init-handlers.d.ts +43 -0
  387. package/dist/state-machine/dispatch/on-init-handlers.d.ts.map +1 -0
  388. package/dist/state-machine/dispatch/renderer-schema.d.ts +8 -0
  389. package/dist/state-machine/dispatch/renderer-schema.d.ts.map +1 -0
  390. package/dist/state-machine/dispatch/stats-manager.d.ts +15 -0
  391. package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -0
  392. package/dist/state-machine/dispatch/template-renderer.d.ts +7 -0
  393. package/dist/state-machine/dispatch/template-renderer.d.ts.map +1 -0
  394. package/dist/state-machine/execution/summary.d.ts +8 -0
  395. package/dist/state-machine/execution/summary.d.ts.map +1 -0
  396. package/dist/state-machine/runner.d.ts +79 -0
  397. package/dist/state-machine/runner.d.ts.map +1 -0
  398. package/dist/state-machine/states/check-running.d.ts +14 -0
  399. package/dist/state-machine/states/check-running.d.ts.map +1 -0
  400. package/dist/state-machine/states/completed.d.ts +12 -0
  401. package/dist/state-machine/states/completed.d.ts.map +1 -0
  402. package/dist/state-machine/states/error.d.ts +11 -0
  403. package/dist/state-machine/states/error.d.ts.map +1 -0
  404. package/dist/state-machine/states/init.d.ts +11 -0
  405. package/dist/state-machine/states/init.d.ts.map +1 -0
  406. package/dist/state-machine/states/level-dispatch.d.ts +17 -0
  407. package/dist/state-machine/states/level-dispatch.d.ts.map +1 -0
  408. package/dist/state-machine/states/plan-ready.d.ts +12 -0
  409. package/dist/state-machine/states/plan-ready.d.ts.map +1 -0
  410. package/dist/state-machine/states/routing.d.ts +52 -0
  411. package/dist/state-machine/states/routing.d.ts.map +1 -0
  412. package/dist/state-machine/states/wave-planning.d.ts +14 -0
  413. package/dist/state-machine/states/wave-planning.d.ts.map +1 -0
  414. package/dist/state-machine/workflow-projection.d.ts +47 -0
  415. package/dist/state-machine/workflow-projection.d.ts.map +1 -0
  416. package/dist/state-machine-execution-engine.d.ts +159 -0
  417. package/dist/state-machine-execution-engine.d.ts.map +1 -0
  418. package/dist/telemetry/opentelemetry.d.ts.map +1 -1
  419. package/dist/telemetry/state-capture.d.ts +5 -0
  420. package/dist/telemetry/state-capture.d.ts.map +1 -1
  421. package/dist/test-runner/assertions.d.ts +59 -0
  422. package/dist/test-runner/assertions.d.ts.map +1 -0
  423. package/dist/test-runner/core/environment.d.ts +8 -0
  424. package/dist/test-runner/core/environment.d.ts.map +1 -0
  425. package/dist/test-runner/core/fixture.d.ts +3 -0
  426. package/dist/test-runner/core/fixture.d.ts.map +1 -0
  427. package/dist/test-runner/core/flow-stage.d.ts +32 -0
  428. package/dist/test-runner/core/flow-stage.d.ts.map +1 -0
  429. package/dist/test-runner/core/mocks.d.ts +8 -0
  430. package/dist/test-runner/core/mocks.d.ts.map +1 -0
  431. package/dist/test-runner/core/test-execution-wrapper.d.ts +18 -0
  432. package/dist/test-runner/core/test-execution-wrapper.d.ts.map +1 -0
  433. package/dist/test-runner/evaluators.d.ts +45 -0
  434. package/dist/test-runner/evaluators.d.ts.map +1 -0
  435. package/dist/test-runner/fixture-loader.d.ts +30 -0
  436. package/dist/test-runner/fixture-loader.d.ts.map +1 -0
  437. package/dist/test-runner/index.d.ts +127 -0
  438. package/dist/test-runner/index.d.ts.map +1 -0
  439. package/dist/test-runner/recorders/github-recorder.d.ts +23 -0
  440. package/dist/test-runner/recorders/github-recorder.d.ts.map +1 -0
  441. package/dist/test-runner/recorders/global-recorder.d.ts +4 -0
  442. package/dist/test-runner/recorders/global-recorder.d.ts.map +1 -0
  443. package/dist/test-runner/recorders/slack-recorder.d.ts +17 -0
  444. package/dist/test-runner/recorders/slack-recorder.d.ts.map +1 -0
  445. package/dist/test-runner/utils/selectors.d.ts +2 -0
  446. package/dist/test-runner/utils/selectors.d.ts.map +1 -0
  447. package/dist/test-runner/validator.d.ts +8 -0
  448. package/dist/test-runner/validator.d.ts.map +1 -0
  449. package/dist/traces/run-2026-01-20T19-22-58-043Z.ndjson +138 -0
  450. package/dist/traces/run-2026-01-20T19-23-52-175Z.ndjson +1067 -0
  451. package/dist/types/bot.d.ts +109 -0
  452. package/dist/types/bot.d.ts.map +1 -0
  453. package/dist/types/cli.d.ts +8 -1
  454. package/dist/types/cli.d.ts.map +1 -1
  455. package/dist/types/config.d.ts +459 -9
  456. package/dist/types/config.d.ts.map +1 -1
  457. package/dist/types/engine.d.ts +177 -0
  458. package/dist/types/engine.d.ts.map +1 -0
  459. package/dist/types/execution.d.ts +73 -0
  460. package/dist/types/execution.d.ts.map +1 -0
  461. package/dist/types/git-checkout.d.ts +76 -0
  462. package/dist/types/git-checkout.d.ts.map +1 -0
  463. package/dist/types/github.d.ts +51 -0
  464. package/dist/types/github.d.ts.map +1 -0
  465. package/dist/types/workflow.d.ts +237 -0
  466. package/dist/types/workflow.d.ts.map +1 -0
  467. package/dist/utils/command-executor.d.ts +43 -0
  468. package/dist/utils/command-executor.d.ts.map +1 -0
  469. package/dist/utils/comment-metadata.d.ts +21 -0
  470. package/dist/utils/comment-metadata.d.ts.map +1 -0
  471. package/dist/utils/config-loader.d.ts.map +1 -1
  472. package/dist/utils/config-merger.d.ts.map +1 -1
  473. package/dist/utils/env-exposure.d.ts +3 -0
  474. package/dist/utils/env-exposure.d.ts.map +1 -0
  475. package/dist/utils/file-exclusion.d.ts.map +1 -1
  476. package/dist/utils/interactive-prompt.d.ts +1 -1
  477. package/dist/utils/interactive-prompt.d.ts.map +1 -1
  478. package/dist/utils/json-text-extractor.d.ts +17 -0
  479. package/dist/utils/json-text-extractor.d.ts.map +1 -0
  480. package/dist/utils/sandbox.d.ts +10 -0
  481. package/dist/utils/sandbox.d.ts.map +1 -1
  482. package/dist/utils/script-memory-ops.d.ts +21 -0
  483. package/dist/utils/script-memory-ops.d.ts.map +1 -0
  484. package/dist/utils/template-context.d.ts +8 -0
  485. package/dist/utils/template-context.d.ts.map +1 -0
  486. package/dist/utils/tracer-init.d.ts.map +1 -1
  487. package/dist/utils/workspace-manager.d.ts +118 -0
  488. package/dist/utils/workspace-manager.d.ts.map +1 -0
  489. package/dist/utils/worktree-cleanup.d.ts +33 -0
  490. package/dist/utils/worktree-cleanup.d.ts.map +1 -0
  491. package/dist/utils/worktree-manager.d.ts +153 -0
  492. package/dist/utils/worktree-manager.d.ts.map +1 -0
  493. package/dist/webhook-server.d.ts +3 -3
  494. package/dist/webhook-server.d.ts.map +1 -1
  495. package/dist/workflow-executor.d.ts +81 -0
  496. package/dist/workflow-executor.d.ts.map +1 -0
  497. package/dist/workflow-registry.d.ts +79 -0
  498. package/dist/workflow-registry.d.ts.map +1 -0
  499. package/package.json +12 -5
  500. package/dist/output/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
  501. package/dist/sdk/check-execution-engine-2YYKUUSH.mjs +0 -11
  502. package/dist/sdk/check-execution-engine-6QJXYYON.mjs +0 -11
  503. package/dist/sdk/check-execution-engine-PJZ4ZOKG.mjs +0 -11
  504. package/dist/sdk/chunk-33QVZ2D4.mjs +0 -316
  505. package/dist/sdk/chunk-33QVZ2D4.mjs.map +0 -1
  506. package/dist/sdk/chunk-B5QBV2QJ.mjs +0 -752
  507. package/dist/sdk/chunk-B5QBV2QJ.mjs.map +0 -1
  508. package/dist/sdk/chunk-BVFNRCHT.mjs +0 -14129
  509. package/dist/sdk/chunk-BVFNRCHT.mjs.map +0 -1
  510. package/dist/sdk/chunk-KWZW23FG.mjs +0 -14129
  511. package/dist/sdk/chunk-KWZW23FG.mjs.map +0 -1
  512. package/dist/sdk/chunk-O4RP4BRH.mjs +0 -14092
  513. package/dist/sdk/chunk-O4RP4BRH.mjs.map +0 -1
  514. package/dist/sdk/chunk-TUTOLSFV.mjs.map +0 -1
  515. package/dist/sdk/chunk-U5D2LY66.mjs +0 -245
  516. package/dist/sdk/chunk-U5D2LY66.mjs.map +0 -1
  517. package/dist/sdk/chunk-U7X54EMV.mjs +0 -331
  518. package/dist/sdk/chunk-U7X54EMV.mjs.map +0 -1
  519. package/dist/sdk/config-merger-TWUBWFC2.mjs +0 -8
  520. package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs +0 -61
  521. package/dist/sdk/mermaid-telemetry-SN6A2TKW.mjs.map +0 -1
  522. package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs +0 -61
  523. package/dist/sdk/mermaid-telemetry-YCTIG76M.mjs.map +0 -1
  524. package/dist/traces/run-2025-10-22T18-22-56-873Z.ndjson +0 -218
  525. /package/dist/sdk/{check-execution-engine-2YYKUUSH.mjs.map → check-provider-registry-534KL5HT.mjs.map} +0 -0
  526. /package/dist/sdk/{check-execution-engine-6QJXYYON.mjs.map → command-executor-TYUV6HUS.mjs.map} +0 -0
  527. /package/dist/sdk/{check-execution-engine-PJZ4ZOKG.mjs.map → config-YNC2EOOT.mjs.map} +0 -0
  528. /package/dist/sdk/{config-merger-TWUBWFC2.mjs.map → config-merger-PX3WIT57.mjs.map} +0 -0
  529. /package/dist/sdk/{liquid-extensions-KVL4MKRH.mjs.map → failure-condition-evaluator-YGTF2GHG.mjs.map} +0 -0
  530. /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)