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