@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,119 @@
1
+ version: "1.0"
2
+
3
+ # Failure conditions using GitHub Actions-like syntax
4
+ # This example shows how to use familiar GitHub Actions expression functions
5
+
6
+ # Global failure conditions that apply to all checks
7
+ failure_conditions:
8
+ # Using success() and failure() functions like GitHub Actions
9
+ check_must_succeed: "!failure()"
10
+
11
+ # Using contains() like GitHub Actions
12
+ no_sql_injection:
13
+ condition: '!contains(checkName, "skip") || !output.issues.some(i => i.severity === "critical")'
14
+ message: "Critical issues found in non-skipped checks"
15
+ severity: error
16
+
17
+ # Using startsWith() for check name patterns
18
+ security_checks_strict:
19
+ condition: 'startsWith(checkName, "security") && output.issues.length == 0'
20
+ message: "Security checks must have zero issues"
21
+ severity: error
22
+
23
+ steps:
24
+ # Security check with GitHub Actions-style conditions
25
+ security-scan:
26
+ type: ai
27
+ schema: code-review
28
+ prompt: "Analyze for security vulnerabilities"
29
+ on: [pr_opened, pr_updated]
30
+
31
+ failure_conditions:
32
+ # Using contains() to check for specific text in file paths
33
+ sensitive_files:
34
+ condition: 'hasFileMatching(output.issues, ".env") || hasFileMatching(output.issues, "secret")'
35
+ message: "Issues found in sensitive files"
36
+ severity: error
37
+
38
+ # Using success() to check overall health
39
+ must_complete_successfully:
40
+ condition: "success() || always()"
41
+ message: "Check completed"
42
+ severity: info
43
+
44
+ # Performance check with familiar syntax
45
+ performance-check:
46
+ type: ai
47
+ schema: code-review
48
+ prompt: "Review for performance issues"
49
+ on: [pr_opened, pr_updated]
50
+
51
+ failure_conditions:
52
+ # Combining multiple GitHub Actions-like functions
53
+ performance_gates:
54
+ condition: |
55
+ !failure() &&
56
+ !contains(checkName, "skip") &&
57
+ !output.issues.some(i => i.severity === "critical")
58
+ message: "Performance check passed quality gates"
59
+ severity: info
60
+
61
+ # Using endsWith() for file type checking
62
+ frontend_performance:
63
+ condition: 'hasFileMatching(output.issues, ".js") || hasFileMatching(output.issues, ".tsx")'
64
+ message: "Frontend performance issues detected"
65
+ severity: warning
66
+
67
+ # Style check with conditional logic
68
+ code-style:
69
+ type: ai
70
+ schema: code-review
71
+ prompt: "Check code style and formatting"
72
+ on: [pr_opened, pr_updated]
73
+
74
+ failure_conditions:
75
+ # Complex condition similar to GitHub Actions
76
+ style_enforcement:
77
+ condition: |
78
+ (checkName.includes('code-review') && output.issues.filter(i => i.severity === 'warning').length > 5) ||
79
+ (contains(checkName, 'strict') && output.issues.length > 0)
80
+ message: "Style violations exceed threshold"
81
+ severity: warning
82
+
83
+ # Always pass for draft PRs (conceptual example)
84
+ draft_pr_lenient:
85
+ condition: "always()"
86
+ message: "Style check completed"
87
+ severity: info
88
+
89
+ # Comparison with GitHub Actions syntax:
90
+ #
91
+ # GitHub Actions:
92
+ # if: contains(github.event.head_commit.message, 'skip-ci')
93
+ #
94
+ # Visor (JavaScript):
95
+ # condition: "contains(commit.message, 'skip-ci')"
96
+ #
97
+ # GitHub Actions:
98
+ # if: success() && github.event_name == 'pull_request'
99
+ #
100
+ # Visor (JavaScript):
101
+ # condition: "success() && event.name == 'pull_request'"
102
+ #
103
+ # GitHub Actions:
104
+ # if: failure() || cancelled()
105
+ #
106
+ # Visor (JavaScript):
107
+ # condition: "failure() || metadata.cancelled"
108
+ #
109
+ # GitHub Actions:
110
+ # if: startsWith(github.ref, 'refs/heads/release')
111
+ #
112
+ # Visor (JavaScript):
113
+ # condition: "startsWith(event.ref, 'refs/heads/release')"
114
+
115
+ output:
116
+ pr_comment:
117
+ format: markdown
118
+ group_by: check
119
+ collapse: true
@@ -0,0 +1,74 @@
1
+ # Migration Example: Before and After
2
+ # This example shows how to migrate from basic configuration to failure conditions
3
+
4
+ version: "1.0"
5
+
6
+ # BEFORE: Simple configuration without failure conditions
7
+ # checks:
8
+ # security:
9
+ # type: ai
10
+ # prompt: "Security analysis..."
11
+ # on: [pr_opened, pr_updated]
12
+
13
+ # AFTER: Enhanced configuration with failure conditions
14
+
15
+ # Global failure conditions - start simple
16
+ failure_conditions:
17
+ # Basic quality gate
18
+ default_quality_gate: "output.issues.length > 20"
19
+
20
+ # Critical issue blocker
21
+ critical_blocker:
22
+ condition: "output.issues.some(i => i.severity === 'critical')"
23
+ message: "Critical issues found - deployment blocked"
24
+ severity: error
25
+ halt_execution: true
26
+
27
+ steps:
28
+ # Migrated security check with failure conditions
29
+ security:
30
+ type: ai
31
+ group: review
32
+ schema: code-review
33
+ prompt: |
34
+ Analyze security vulnerabilities in the code changes.
35
+ Look for common security issues and provide specific recommendations.
36
+ on: [pr_opened, pr_updated]
37
+
38
+ # Start with simple check-specific conditions
39
+ failure_conditions:
40
+ # Security-specific gate
41
+ security_gate: "output.issues.some(i => i.severity === 'error')"
42
+
43
+ # Specific security patterns
44
+ sensitive_operations:
45
+ condition: "hasFileWith(output.issues, 'password') || hasFileWith(output.issues, 'token')"
46
+ message: "Sensitive security operations detected"
47
+ severity: warning
48
+
49
+ # New performance check with conditions
50
+ performance:
51
+ type: ai
52
+ group: review
53
+ schema: code-review
54
+ prompt: |
55
+ Analyze performance implications of code changes.
56
+ on: [pr_opened, pr_updated]
57
+
58
+ failure_conditions:
59
+ # Performance threshold
60
+ performance_issues: "output.issues.filter(i => i.severity === 'error').length > 2"
61
+
62
+ # Output configuration
63
+ output:
64
+ pr_comment:
65
+ format: markdown
66
+ group_by: check
67
+ collapse: false
68
+
69
+ # Migration Steps:
70
+ # 1. Add global failure_conditions section with basic conditions
71
+ # 2. Add group and schema to existing checks
72
+ # 3. Add check-specific failure_conditions as needed
73
+ # 4. Test conditions using debug mode
74
+ # 5. Gradually refine expressions based on results
@@ -0,0 +1,176 @@
1
+ version: "1.0"
2
+ # Example demonstrating Liquid template for loops in Visor
3
+
4
+ steps:
5
+ # Example 1: Loop through all files in PR
6
+ file-summary:
7
+ type: log
8
+ level: info
9
+ message: |
10
+ 📁 File Changes Summary:
11
+
12
+ Total files changed: {{ files | size }}
13
+
14
+ {% for file in files %}
15
+ - {{ file.filename }}
16
+ Status: {{ file.status }}
17
+ Changes: +{{ file.additions }}/-{{ file.deletions }}
18
+ {% endfor %}
19
+
20
+ # Example 2: Loop with conditions - only show large files
21
+ large-files:
22
+ type: log
23
+ level: warning
24
+ message: |
25
+ ⚠️ Large File Changes (>100 lines):
26
+
27
+ {% for file in files %}
28
+ {% assign total_changes = file.additions | plus: file.deletions %}
29
+ {% if total_changes > 100 %}
30
+ - {{ file.filename }}: {{ total_changes }} lines changed
31
+ {% endif %}
32
+ {% endfor %}
33
+
34
+ # Example 3: Group files by extension using nested loops
35
+ files-by-type:
36
+ type: log
37
+ level: info
38
+ message: |
39
+ 📊 Files Grouped by Extension:
40
+
41
+ {% for ext, files in utils.filesByExtension %}
42
+ {{ ext | upcase }} Files ({{ files | size }}):
43
+ {% for file in files %}
44
+ - {{ file.filename }} ({{ file.status }})
45
+ {% endfor %}
46
+ {% endfor %}
47
+
48
+ # Example 4: Create markdown table from files
49
+ file-table:
50
+ type: log
51
+ level: info
52
+ message: |
53
+ ## File Change Details
54
+
55
+ | File | Type | Status | Additions | Deletions |
56
+ |------|------|--------|-----------|-----------|
57
+ {% for file in files %}
58
+ | `{{ file.filename }}` | {{ file.filename | split: "." | last }} | {{ file.status }} | +{{ file.additions }} | -{{ file.deletions }} |
59
+ {% endfor %}
60
+
61
+ # Example 5: Loop through check outputs (when using dependencies)
62
+ dependency-summary:
63
+ type: log
64
+ level: info
65
+ depends_on: [file-summary, large-files]
66
+ message: |
67
+ 📋 Previous Check Results:
68
+
69
+ {% for checkName, result in outputs %}
70
+ Check: {{ checkName }}
71
+ {% if result.issues %}
72
+ Issues found: {{ result.issues | size }}
73
+ {% for issue in result.issues %}
74
+ - {{ issue.severity }}: {{ issue.message }}
75
+ {% endfor %}
76
+ {% else %}
77
+ No issues found
78
+ {% endif %}
79
+ {% endfor %}
80
+
81
+ # Example 6: Advanced filtering and counting
82
+ security-file-scan:
83
+ type: ai
84
+ prompt: |
85
+ Review these security-sensitive files:
86
+
87
+ {% assign security_files = 0 %}
88
+ {% for file in files %}
89
+ {% if file.filename contains ".env" or file.filename contains "config" or file.filename contains "secret" %}
90
+ {% assign security_files = security_files | plus: 1 %}
91
+ - {{ file.filename }} (SECURITY SENSITIVE)
92
+ {% endif %}
93
+ {% endfor %}
94
+
95
+ {% if security_files == 0 %}
96
+ No security-sensitive files detected in this PR.
97
+ {% else %}
98
+ Found {{ security_files }} security-sensitive files. Please review carefully.
99
+ {% endif %}
100
+
101
+ # Example 7: Create JSON from loop data
102
+ json-output:
103
+ type: command
104
+ exec: |
105
+ echo '{
106
+ "files": [
107
+ {% for file in files %}
108
+ {
109
+ "name": {{ file.filename | json }},
110
+ "status": {{ file.status | json }},
111
+ "additions": {{ file.additions }},
112
+ "deletions": {{ file.deletions }}
113
+ }{% unless forloop.last %},{% endunless %}
114
+ {% endfor %}
115
+ ],
116
+ "total": {{ files | size }}
117
+ }' | jq .
118
+
119
+ # Example 8: Loop with index
120
+ numbered-list:
121
+ type: log
122
+ level: info
123
+ message: |
124
+ 📝 Files (numbered):
125
+
126
+ {% for file in files %}
127
+ {{ forloop.index }}. {{ file.filename }}
128
+ - First in loop: {{ forloop.first }}
129
+ - Last in loop: {{ forloop.last }}
130
+ - Index (0-based): {{ forloop.index0 }}
131
+ - Index (1-based): {{ forloop.index }}
132
+ {% endfor %}
133
+
134
+ # Example 9: Break and continue (using unless/if)
135
+ filter-files:
136
+ type: log
137
+ level: info
138
+ message: |
139
+ 📂 Non-test TypeScript files:
140
+
141
+ {% for file in files %}
142
+ {% unless file.filename contains ".test." %}
143
+ {% if file.filename endswith ".ts" or file.filename endswith ".tsx" %}
144
+ - {{ file.filename }}
145
+ {% endif %}
146
+ {% endunless %}
147
+ {% endfor %}
148
+
149
+ # Example 10: Complex nested structure
150
+ pr-analysis:
151
+ type: ai
152
+ prompt: |
153
+ Analyze this PR structure:
154
+
155
+ {% for ext, files in utils.filesByExtension %}
156
+ {% if files.size > 0 %}
157
+ === {{ ext | upcase }} Files ({{ files.size }}) ===
158
+
159
+ New files:
160
+ {% for file in files %}
161
+ {% if file.status == "added" %}
162
+ - {{ file.filename }}
163
+ {% endif %}
164
+ {% endfor %}
165
+
166
+ Modified files:
167
+ {% for file in files %}
168
+ {% if file.status == "modified" %}
169
+ - {{ file.filename }} ({{ file.changes }} lines)
170
+ {% endif %}
171
+ {% endfor %}
172
+
173
+ {% endif %}
174
+ {% endfor %}
175
+
176
+ Focus your review on the files with the most changes.
@@ -0,0 +1,120 @@
1
+ version: "1.0"
2
+ # Example demonstrating the forEach flag in Visor checks
3
+ # forEach allows a check to output an array, and dependent checks will run once for each item
4
+
5
+ steps:
6
+ # Step 1: Get a list of JSON files (outputs an array)
7
+ list-json-files:
8
+ type: command
9
+ exec: |
10
+ # This outputs a JSON array of file paths
11
+ find . -name "*.json" -type f | head -5 | jq -R -s -c 'split("\n")[:-1]'
12
+ forEach: true # Enable forEach - output will be treated as an array for iteration
13
+ group: validation
14
+
15
+ # Step 2: This check will run once for each JSON file from list-json-files
16
+ validate-each-json:
17
+ type: command
18
+ exec: |
19
+ # {{ outputs.list-json-files }} will be a single file path, not the array
20
+ echo "Validating: {{ outputs.list-json-files }}"
21
+ jsonlint "{{ outputs.list-json-files }}" 2>&1 || echo "Invalid JSON: {{ outputs.list-json-files }}"
22
+ depends_on: [list-json-files]
23
+ group: validation
24
+
25
+ # Another example: Process multiple PR files
26
+ get-changed-js-files:
27
+ type: command
28
+ exec: |
29
+ # Output array of JavaScript files from the PR
30
+ echo '{{ files | json }}' | jq '[.[] | select(.filename | endswith(".js")) | .filename]'
31
+ forEach: true
32
+ group: analysis
33
+
34
+ # This runs for each JS file
35
+ analyze-each-js-file:
36
+ type: command
37
+ exec: |
38
+ echo "Analyzing file: {{ outputs.get-changed-js-files }}"
39
+ # Could run ESLint, complexity analysis, etc.
40
+ wc -l "{{ outputs.get-changed-js-files }}" 2>/dev/null || echo "File not found locally"
41
+ depends_on: [get-changed-js-files]
42
+ group: analysis
43
+
44
+ # Example with AI checks
45
+ list-security-concerns:
46
+ type: ai
47
+ prompt: |
48
+ List the top 3 security-sensitive files in this PR as a JSON array of strings.
49
+ Only include file paths, nothing else.
50
+ Return format: ["file1.js", "file2.py", "file3.yml"]
51
+ schema: plain
52
+ forEach: true # The AI output (array) will be used for iteration
53
+ group: security
54
+
55
+ # This AI check runs for each security-sensitive file
56
+ deep-security-review:
57
+ type: ai
58
+ prompt: |
59
+ Perform a detailed security review of this specific file:
60
+ {{ outputs.list-security-concerns }}
61
+
62
+ Focus only on this one file and provide specific security recommendations.
63
+ depends_on: [list-security-concerns]
64
+ group: security
65
+
66
+ # Example with transform to create array
67
+ extract-functions:
68
+ type: command
69
+ exec: |
70
+ # Extract function names from a TypeScript file
71
+ grep -o "function [a-zA-Z_][a-zA-Z0-9_]*" src/example.ts | cut -d' ' -f2
72
+ transform: |
73
+ {{ output | split: "\n" | json }}
74
+ forEach: true
75
+ group: documentation
76
+
77
+ # Document each function
78
+ document-function:
79
+ type: ai
80
+ prompt: |
81
+ Write JSDoc documentation for the function named: {{ outputs.extract-functions }}
82
+ depends_on: [extract-functions]
83
+ group: documentation
84
+
85
+ # Complex example: Process webhook data
86
+ get-jira-tickets:
87
+ type: http_client
88
+ url: "https://api.example.com/jira/tickets?pr={{ pr.number }}"
89
+ transform: |
90
+ {{ data.issues | json }}
91
+ forEach: true
92
+ group: tracking
93
+
94
+ update-each-ticket:
95
+ type: http
96
+ url: "https://api.example.com/jira/ticket/{{ outputs.get-jira-tickets.id }}"
97
+ body: |
98
+ {
99
+ "status": "in-review",
100
+ "pr_number": {{ pr.number }},
101
+ "reviewer": "{{ pr.author }}"
102
+ }
103
+ depends_on: [get-jira-tickets]
104
+ group: tracking
105
+
106
+ # How forEach works:
107
+ # 1. A check with forEach: true outputs an array (or string that can be parsed as array)
108
+ # 2. The check stores this array internally as forEachItems
109
+ # 3. Any check that depends on a forEach check will:
110
+ # - Execute once for each item in the array
111
+ # - Receive a single item (not the array) in outputs.<check-name>
112
+ # - Aggregate all results from all iterations
113
+ #
114
+ # Example execution flow:
115
+ # - list-json-files outputs: ["file1.json", "file2.json", "file3.json"]
116
+ # - validate-each-json runs 3 times:
117
+ # - Run 1: outputs.list-json-files = "file1.json"
118
+ # - Run 2: outputs.list-json-files = "file2.json"
119
+ # - Run 3: outputs.list-json-files = "file3.json"
120
+ # - All issues from all runs are collected and reported together
@@ -0,0 +1,32 @@
1
+ # Basic Git Checkout Example
2
+ #
3
+ # This example demonstrates a simple workflow that:
4
+ # 1. Checks out the PR head branch
5
+ # 2. Runs tests
6
+ # 3. Builds the project
7
+
8
+ version: "1.0"
9
+
10
+ steps:
11
+ # Checkout the PR head branch
12
+ checkout:
13
+ type: git-checkout
14
+ ref: "{{ pr.head }}"
15
+ criticality: internal
16
+
17
+ # Run tests on the checked out code
18
+ test:
19
+ type: command
20
+ depends_on: [checkout]
21
+ exec: npm test
22
+ working_directory: "{{ outputs.checkout.path }}"
23
+ assume: "outputs.checkout.success"
24
+ criticality: internal
25
+
26
+ # Build the project
27
+ build:
28
+ type: command
29
+ depends_on: [test]
30
+ exec: npm run build
31
+ working_directory: "{{ outputs.checkout.path }}"
32
+ criticality: internal
@@ -0,0 +1,59 @@
1
+ # Git Checkout Compare Example
2
+ #
3
+ # This example demonstrates checking out multiple branches
4
+ # and comparing them.
5
+
6
+ version: "1.0"
7
+
8
+ # Configure worktree cache
9
+ worktree_cache:
10
+ enabled: true
11
+ base_path: /tmp/visor-compare
12
+ cleanup_on_exit: true
13
+
14
+ steps:
15
+ # Checkout PR head branch
16
+ checkout-head:
17
+ type: git-checkout
18
+ ref: "{{ pr.head }}"
19
+ criticality: internal
20
+
21
+ # Checkout PR base branch
22
+ checkout-base:
23
+ type: git-checkout
24
+ ref: "{{ pr.base }}"
25
+ criticality: internal
26
+
27
+ # Run tests on head branch
28
+ test-head:
29
+ type: command
30
+ depends_on: [checkout-head]
31
+ exec: npm test
32
+ working_directory: "{{ outputs['checkout-head'].path }}"
33
+ continue_on_failure: true
34
+ criticality: internal
35
+
36
+ # Run tests on base branch
37
+ test-base:
38
+ type: command
39
+ depends_on: [checkout-base]
40
+ exec: npm test
41
+ working_directory: "{{ outputs['checkout-base'].path }}"
42
+ continue_on_failure: true
43
+ criticality: internal
44
+
45
+ # Compare results
46
+ compare:
47
+ type: command
48
+ depends_on: [test-head, test-base]
49
+ exec: |
50
+ echo "=== Comparison Results ==="
51
+ echo "Head branch: {{ pr.head }} ({{ outputs['checkout-head'].commit }})"
52
+ echo "Base branch: {{ pr.base }} ({{ outputs['checkout-base'].commit }})"
53
+ echo ""
54
+ echo "Head tests: {{ outputs['test-head'].exitCode == 0 ? 'PASSED' : 'FAILED' }}"
55
+ echo "Base tests: {{ outputs['test-base'].exitCode == 0 ? 'PASSED' : 'FAILED' }}"
56
+ echo ""
57
+ echo "File differences:"
58
+ diff -r "{{ outputs['checkout-head'].path }}/src" "{{ outputs['checkout-base'].path }}/src" || true
59
+ criticality: info
@@ -0,0 +1,76 @@
1
+ # Cross-Repository Checkout Example
2
+ #
3
+ # This example demonstrates checking out multiple repositories
4
+ # and running integration tests.
5
+
6
+ version: "1.0"
7
+
8
+ steps:
9
+ # Checkout main application repository
10
+ checkout-app:
11
+ type: git-checkout
12
+ repository: myorg/main-app
13
+ ref: "{{ pr.head }}"
14
+ token: "{{ env.GITHUB_TOKEN }}"
15
+ criticality: internal
16
+
17
+ # Checkout shared library repository
18
+ checkout-lib:
19
+ type: git-checkout
20
+ repository: myorg/shared-lib
21
+ ref: main
22
+ token: "{{ env.GITHUB_TOKEN }}"
23
+ criticality: internal
24
+
25
+ # Checkout test utilities repository
26
+ checkout-test-utils:
27
+ type: git-checkout
28
+ repository: myorg/test-utils
29
+ ref: v2.0.0
30
+ token: "{{ env.GITHUB_TOKEN }}"
31
+ criticality: internal
32
+
33
+ # Install dependencies in all repositories
34
+ install-deps:
35
+ type: command
36
+ depends_on: [checkout-app, checkout-lib, checkout-test-utils]
37
+ exec: |
38
+ echo "Installing dependencies for main app..."
39
+ cd "{{ outputs['checkout-app'].path }}" && npm install
40
+
41
+ echo "Installing dependencies for shared lib..."
42
+ cd "{{ outputs['checkout-lib'].path }}" && npm install
43
+
44
+ echo "Installing dependencies for test utils..."
45
+ cd "{{ outputs['checkout-test-utils'].path }}" && npm install
46
+ criticality: internal
47
+
48
+ # Run integration tests
49
+ integration-test:
50
+ type: command
51
+ depends_on: [install-deps]
52
+ exec: |
53
+ export LIB_PATH="{{ outputs['checkout-lib'].path }}"
54
+ export TEST_UTILS_PATH="{{ outputs['checkout-test-utils'].path }}"
55
+ npm run test:integration
56
+ working_directory: "{{ outputs['checkout-app'].path }}"
57
+ criticality: internal
58
+
59
+ # Generate integration report
60
+ report:
61
+ type: command
62
+ depends_on: [integration-test]
63
+ exec: |
64
+ cat << EOF
65
+ # Integration Test Report
66
+
67
+ ## Repositories Tested
68
+ - **Main App**: {{ outputs['checkout-app'].repository }}@{{ outputs['checkout-app'].commit }}
69
+ - **Shared Lib**: {{ outputs['checkout-lib'].repository }}@{{ outputs['checkout-lib'].commit }}
70
+ - **Test Utils**: {{ outputs['checkout-test-utils'].repository }}@{{ outputs['checkout-test-utils'].commit }}
71
+
72
+ ## Test Results
73
+ Exit Code: {{ outputs['integration-test'].exitCode }}
74
+ Status: {{ outputs['integration-test'].exitCode == 0 ? 'PASSED ✅' : 'FAILED ❌' }}
75
+ EOF
76
+ criticality: info