@probelabs/visor 0.1.124 → 0.1.126

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 (195) hide show
  1. package/dist/config.d.ts.map +1 -1
  2. package/dist/docs/DEPLOYMENT.md +117 -11
  3. package/dist/docs/GITHUB_CHECKS.md +18 -4
  4. package/dist/docs/NPM_USAGE.md +112 -39
  5. package/dist/docs/action-reference.md +63 -9
  6. package/dist/docs/advanced-ai.md +58 -51
  7. package/dist/docs/ai-configuration.md +99 -11
  8. package/dist/docs/ai-custom-tools-usage.md +70 -33
  9. package/dist/docs/ai-custom-tools.md +50 -27
  10. package/dist/docs/architecture.md +1232 -0
  11. package/dist/docs/bot-transports-rfc.md +13 -3
  12. package/dist/docs/ci-cli-mode.md +116 -8
  13. package/dist/docs/claude-code.md +111 -41
  14. package/dist/docs/command-provider.md +37 -15
  15. package/dist/docs/commands.md +252 -6
  16. package/dist/docs/configuration.md +138 -4
  17. package/dist/docs/contributing.md +737 -0
  18. package/dist/docs/custom-tools.md +39 -8
  19. package/dist/docs/dashboards/README.md +33 -19
  20. package/dist/docs/debug-visualizer-progress.md +14 -13
  21. package/dist/docs/debug-visualizer-rfc.md +14 -13
  22. package/dist/docs/debug-visualizer.md +30 -5
  23. package/dist/docs/debugging.md +73 -8
  24. package/dist/docs/default-output-schema.md +24 -20
  25. package/dist/docs/dependencies.md +75 -21
  26. package/dist/docs/dev-playbook.md +85 -9
  27. package/dist/docs/engine-pause-resume-rfc.md +11 -11
  28. package/dist/docs/engine-state-machine-plan.md +10 -3
  29. package/dist/docs/event-driven-github-integration-rfc.md +20 -11
  30. package/dist/docs/event-triggers.md +95 -6
  31. package/dist/docs/execution-statistics-rfc.md +16 -4
  32. package/dist/docs/fact-validator-gap-analysis.md +12 -1
  33. package/dist/docs/fact-validator-implementation-plan.md +19 -11
  34. package/dist/docs/fail-if.md +116 -11
  35. package/dist/docs/failure-conditions-implementation.md +40 -6
  36. package/dist/docs/failure-conditions-schema.md +243 -87
  37. package/dist/docs/failure-routing-rfc.md +43 -18
  38. package/dist/docs/failure-routing.md +80 -23
  39. package/dist/docs/faq.md +836 -0
  40. package/dist/docs/foreach-dependency-propagation.md +32 -15
  41. package/dist/docs/github-ops.md +6 -5
  42. package/dist/docs/glossary.md +322 -0
  43. package/dist/docs/goto-forward-run-plan.md +23 -10
  44. package/dist/docs/guides/criticality-modes.md +15 -13
  45. package/dist/docs/guides/fault-management-and-contracts.md +8 -5
  46. package/dist/docs/guides/workflow-style-guide.md +17 -8
  47. package/dist/docs/http.md +102 -3
  48. package/dist/docs/human-input-provider.md +20 -36
  49. package/dist/docs/index.md +206 -0
  50. package/dist/docs/lifecycle-hooks.md +322 -2
  51. package/dist/docs/limits.md +20 -5
  52. package/dist/docs/liquid-templates.md +86 -14
  53. package/dist/docs/loop-routing-refactor.md +4 -2
  54. package/dist/docs/mcp-provider.md +53 -19
  55. package/dist/docs/mcp.md +27 -1
  56. package/dist/docs/memory.md +7 -2
  57. package/dist/docs/migration.md +596 -0
  58. package/dist/docs/observability.md +227 -6
  59. package/dist/docs/output-formats.md +388 -9
  60. package/dist/docs/output-history.md +36 -6
  61. package/dist/docs/performance.md +510 -4
  62. package/dist/docs/pluggable.md +95 -4
  63. package/dist/docs/proposals/snapshot-scope-execution.md +6 -5
  64. package/dist/docs/providers/git-checkout.md +16 -14
  65. package/dist/docs/providers/noop.md +696 -0
  66. package/dist/docs/recipes.md +8 -9
  67. package/dist/docs/rfc/git-checkout-step.md +3 -1
  68. package/dist/docs/rfc/on_init-hook.md +18 -5
  69. package/dist/docs/rfc/workspace-isolation.md +16 -0
  70. package/dist/docs/roadmap/criticality-implementation-tasks.md +27 -27
  71. package/dist/docs/router-patterns.md +155 -43
  72. package/dist/docs/schema-templates.md +51 -15
  73. package/dist/docs/script.md +162 -13
  74. package/dist/docs/sdk.md +46 -12
  75. package/dist/docs/security.md +464 -5
  76. package/dist/docs/slack-integration.md +481 -0
  77. package/dist/docs/tag-filtering.md +60 -20
  78. package/dist/docs/telemetry-setup.md +157 -46
  79. package/dist/docs/test-framework-rfc.md +37 -36
  80. package/dist/docs/testing/assertions.md +92 -4
  81. package/dist/docs/testing/ci.md +56 -7
  82. package/dist/docs/testing/cli.md +57 -15
  83. package/dist/docs/testing/cookbook.md +53 -20
  84. package/dist/docs/testing/dsl-reference.md +110 -9
  85. package/dist/docs/testing/fixtures-and-mocks.md +28 -3
  86. package/dist/docs/testing/flows.md +59 -4
  87. package/dist/docs/testing/getting-started.md +14 -13
  88. package/dist/docs/testing/troubleshooting.md +39 -2
  89. package/dist/docs/timeouts.md +174 -18
  90. package/dist/docs/troubleshooting.md +176 -6
  91. package/dist/docs/workflow-creation-guide.md +101 -3
  92. package/dist/docs/workflows.md +138 -41
  93. package/dist/examples/README.md +169 -4
  94. package/dist/examples/ai-custom-tools-simple.yaml +2 -3
  95. package/dist/examples/cron-webhook-config.yaml +15 -0
  96. package/dist/examples/forEach-example.yaml +6 -0
  97. package/dist/examples/git-checkout-basic.yaml +4 -0
  98. package/dist/examples/git-checkout-compare.yaml +6 -0
  99. package/dist/examples/git-checkout-cross-repo.yaml +7 -0
  100. package/dist/examples/http-integration-config.yaml +30 -0
  101. package/dist/examples/https-server-config.yaml +15 -0
  102. package/dist/examples/mcp-provider-example.yaml +10 -10
  103. package/dist/examples/transform-example.yaml +3 -0
  104. package/dist/examples/webhook-pipeline-config.yaml +18 -0
  105. package/dist/examples/workflows/workflow-composition-example.yaml +4 -0
  106. package/dist/frontends/slack-frontend.d.ts +2 -0
  107. package/dist/frontends/slack-frontend.d.ts.map +1 -1
  108. package/dist/generated/config-schema.d.ts +11 -7
  109. package/dist/generated/config-schema.d.ts.map +1 -1
  110. package/dist/generated/config-schema.json +11 -7
  111. package/dist/index.js +3127 -974
  112. package/dist/output/traces/{run-2026-01-28T16-15-24-569Z.ndjson → run-2026-01-31T16-37-22-321Z.ndjson} +84 -84
  113. package/dist/output/traces/{run-2026-01-28T16-16-09-757Z.ndjson → run-2026-01-31T16-38-06-031Z.ndjson} +1013 -1013
  114. package/dist/providers/ai-check-provider.d.ts +9 -2
  115. package/dist/providers/ai-check-provider.d.ts.map +1 -1
  116. package/dist/providers/command-check-provider.d.ts.map +1 -1
  117. package/dist/providers/mcp-custom-sse-server.d.ts +17 -1
  118. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  119. package/dist/providers/workflow-check-provider.d.ts.map +1 -1
  120. package/dist/providers/workflow-tool-executor.d.ts +68 -0
  121. package/dist/providers/workflow-tool-executor.d.ts.map +1 -0
  122. package/dist/sdk/{check-provider-registry-AQ3JETBG.mjs → check-provider-registry-3KI5RKXT.mjs} +6 -5
  123. package/dist/sdk/check-provider-registry-IYILYY35.mjs +28 -0
  124. package/dist/sdk/chunk-2CPMMNIX.mjs +1459 -0
  125. package/dist/sdk/chunk-2CPMMNIX.mjs.map +1 -0
  126. package/dist/sdk/chunk-5LI6T4O3.mjs +3600 -0
  127. package/dist/sdk/chunk-5LI6T4O3.mjs.map +1 -0
  128. package/dist/sdk/{chunk-YLQ4UN62.mjs → chunk-A4PGHURG.mjs} +6838 -6257
  129. package/dist/sdk/chunk-A4PGHURG.mjs.map +1 -0
  130. package/dist/sdk/chunk-EXFGO4FX.mjs +147 -0
  131. package/dist/sdk/chunk-EXFGO4FX.mjs.map +1 -0
  132. package/dist/sdk/chunk-PJ7K5UFC.mjs +17732 -0
  133. package/dist/sdk/chunk-PJ7K5UFC.mjs.map +1 -0
  134. package/dist/sdk/{chunk-BHZ4CKUS.mjs → chunk-PXFIALUH.mjs} +77 -8
  135. package/dist/sdk/chunk-PXFIALUH.mjs.map +1 -0
  136. package/dist/sdk/{chunk-PVITVJ6J.mjs → chunk-RTKJXNZS.mjs} +32 -9
  137. package/dist/sdk/chunk-RTKJXNZS.mjs.map +1 -0
  138. package/dist/sdk/chunk-VW2GBXQT.mjs +606 -0
  139. package/dist/sdk/chunk-VW2GBXQT.mjs.map +1 -0
  140. package/dist/sdk/{config-RQQPMLRD.mjs → config-5AUYQFHE.mjs} +2 -2
  141. package/dist/sdk/config-6CUVEH7H.mjs +16 -0
  142. package/dist/sdk/config-6CUVEH7H.mjs.map +1 -0
  143. package/dist/sdk/{github-frontend-6Q4BISZX.mjs → github-frontend-BZ4N3BFZ.mjs} +7 -3
  144. package/dist/sdk/github-frontend-BZ4N3BFZ.mjs.map +1 -0
  145. package/dist/sdk/host-4MT3EW2I.mjs +52 -0
  146. package/dist/sdk/{host-P5NQICP7.mjs → host-NYWXLIFC.mjs} +2 -2
  147. package/dist/sdk/host-NYWXLIFC.mjs.map +1 -0
  148. package/dist/sdk/{routing-DEY2AIXM.mjs → routing-6R42GXUO.mjs} +2 -2
  149. package/dist/sdk/routing-6R42GXUO.mjs.map +1 -0
  150. package/dist/sdk/routing-7FXPULTO.mjs +24 -0
  151. package/dist/sdk/routing-7FXPULTO.mjs.map +1 -0
  152. package/dist/sdk/sdk.d.mts +3 -1
  153. package/dist/sdk/sdk.d.ts +3 -1
  154. package/dist/sdk/sdk.js +12163 -11204
  155. package/dist/sdk/sdk.js.map +1 -1
  156. package/dist/sdk/sdk.mjs +14 -10
  157. package/dist/sdk/sdk.mjs.map +1 -1
  158. package/dist/sdk/slack-frontend-JUT3TYVC.mjs +821 -0
  159. package/dist/sdk/slack-frontend-JUT3TYVC.mjs.map +1 -0
  160. package/dist/sdk/workflow-check-provider-H3CUOLUD.mjs +28 -0
  161. package/dist/sdk/workflow-check-provider-H3CUOLUD.mjs.map +1 -0
  162. package/dist/sdk/workflow-check-provider-YUNNF4KC.mjs +28 -0
  163. package/dist/sdk/workflow-check-provider-YUNNF4KC.mjs.map +1 -0
  164. package/dist/sdk/workflow-registry-KFWSDSLM.mjs +12 -0
  165. package/dist/sdk/workflow-registry-KFWSDSLM.mjs.map +1 -0
  166. package/dist/slack/socket-runner.d.ts +2 -0
  167. package/dist/slack/socket-runner.d.ts.map +1 -1
  168. package/dist/state-machine/context/workflow-inputs.d.ts +20 -0
  169. package/dist/state-machine/context/workflow-inputs.d.ts.map +1 -0
  170. package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -1
  171. package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -1
  172. package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -1
  173. package/dist/state-machine/states/level-dispatch.d.ts.map +1 -1
  174. package/dist/state-machine/states/routing.d.ts +2 -1
  175. package/dist/state-machine/states/routing.d.ts.map +1 -1
  176. package/dist/traces/{run-2026-01-28T16-15-24-569Z.ndjson → run-2026-01-31T16-37-22-321Z.ndjson} +84 -84
  177. package/dist/traces/{run-2026-01-28T16-16-09-757Z.ndjson → run-2026-01-31T16-38-06-031Z.ndjson} +1013 -1013
  178. package/dist/types/config.d.ts +3 -1
  179. package/dist/types/config.d.ts.map +1 -1
  180. package/dist/utils/human-id.d.ts +12 -0
  181. package/dist/utils/human-id.d.ts.map +1 -0
  182. package/dist/utils/worktree-manager.d.ts +3 -0
  183. package/dist/utils/worktree-manager.d.ts.map +1 -1
  184. package/dist/workflow-executor.d.ts.map +1 -1
  185. package/dist/workflow-registry.d.ts +1 -0
  186. package/dist/workflow-registry.d.ts.map +1 -1
  187. package/package.json +2 -2
  188. package/dist/sdk/chunk-BHZ4CKUS.mjs.map +0 -1
  189. package/dist/sdk/chunk-PVITVJ6J.mjs.map +0 -1
  190. package/dist/sdk/chunk-YLQ4UN62.mjs.map +0 -1
  191. package/dist/sdk/github-frontend-6Q4BISZX.mjs.map +0 -1
  192. /package/dist/sdk/{check-provider-registry-AQ3JETBG.mjs.map → check-provider-registry-3KI5RKXT.mjs.map} +0 -0
  193. /package/dist/sdk/{config-RQQPMLRD.mjs.map → check-provider-registry-IYILYY35.mjs.map} +0 -0
  194. /package/dist/sdk/{routing-DEY2AIXM.mjs.map → config-5AUYQFHE.mjs.map} +0 -0
  195. /package/dist/sdk/{host-P5NQICP7.mjs.map → host-4MT3EW2I.mjs.map} +0 -0
@@ -0,0 +1,596 @@
1
+ # Migration Guide
2
+
3
+ This guide helps you upgrade Visor between versions, documenting breaking changes and how to adapt your configurations.
4
+
5
+ ## Table of Contents
6
+
7
+ - [Version History Overview](#version-history-overview)
8
+ - [Configuration Key Changes](#configuration-key-changes)
9
+ - [Provider Changes](#provider-changes)
10
+ - [Breaking Changes by Version](#breaking-changes-by-version)
11
+ - [Migration Steps](#migration-steps)
12
+ - [Deprecation Warnings](#deprecation-warnings)
13
+ - [Compatibility Notes](#compatibility-notes)
14
+
15
+ ---
16
+
17
+ ## Version History Overview
18
+
19
+ | Version | Key Changes |
20
+ |---------|-------------|
21
+ | 0.1.x | Current stable release with state machine engine |
22
+ | 0.1.40+ | Workspace isolation, git-checkout provider |
23
+ | 0.1.30+ | Lifecycle hooks standardization (`on_init`) |
24
+ | 0.1.20+ | Transitions DSL, memory provider enhancements |
25
+ | 0.1.10+ | Routing system (`on_success`, `on_fail`, `on_finish`) |
26
+ | 0.1.0 | Initial release with basic check providers |
27
+
28
+ ---
29
+
30
+ ## Configuration Key Changes
31
+
32
+ ### `args` to `command_args` (MCP Provider)
33
+
34
+ The MCP provider renamed `args` to `command_args` for stdio transport to avoid confusion with method arguments.
35
+
36
+ **Before:**
37
+ ```yaml
38
+ steps:
39
+ mcp-check:
40
+ type: mcp
41
+ transport: stdio
42
+ command: npx
43
+ args: ["-y", "@probelabs/probe@latest", "mcp"]
44
+ method: search_code
45
+ ```
46
+
47
+ **After:**
48
+ ```yaml
49
+ steps:
50
+ mcp-check:
51
+ type: mcp
52
+ transport: stdio
53
+ command: npx
54
+ command_args: ["-y", "@probelabs/probe@latest", "mcp"]
55
+ method: search_code
56
+ ```
57
+
58
+ ### `checks` to `steps` (Terminology)
59
+
60
+ Visor now uses `steps:` instead of `checks:` to better reflect workflow orchestration capabilities. Both keys work identically for backward compatibility.
61
+
62
+ **Before:**
63
+ ```yaml
64
+ version: "1.0"
65
+ checks:
66
+ security-review:
67
+ type: ai
68
+ prompt: "Review for security issues"
69
+ ```
70
+
71
+ **After (Recommended):**
72
+ ```yaml
73
+ version: "1.0"
74
+ steps:
75
+ security-review:
76
+ type: ai
77
+ prompt: "Review for security issues"
78
+ ```
79
+
80
+ ### `custom_prompt` to `system_prompt` (AI Provider)
81
+
82
+ The AI provider renamed `custom_prompt` to `system_prompt` for clarity.
83
+
84
+ **Before:**
85
+ ```yaml
86
+ steps:
87
+ ai-check:
88
+ type: ai
89
+ ai:
90
+ custom_prompt: "You are a security expert..."
91
+ ```
92
+
93
+ **After:**
94
+ ```yaml
95
+ steps:
96
+ ai-check:
97
+ type: ai
98
+ ai:
99
+ system_prompt: "You are a security expert..."
100
+ ```
101
+
102
+ ### `failure_conditions` to `fail_if` (Simplified)
103
+
104
+ The verbose `failure_conditions` object has been replaced with a simpler `fail_if` expression.
105
+
106
+ **Before:**
107
+ ```yaml
108
+ steps:
109
+ quality-check:
110
+ type: ai
111
+ failure_conditions:
112
+ high_severity:
113
+ condition: "output.issues?.filter(i => i.severity === 'error').length > 0"
114
+ message: "Critical issues found"
115
+ severity: error
116
+ ```
117
+
118
+ **After:**
119
+ ```yaml
120
+ steps:
121
+ quality-check:
122
+ type: ai
123
+ fail_if: "output.issues?.filter(i => i.severity === 'error').length > 0"
124
+ ```
125
+
126
+ ### `include` to `extends` (Configuration Inheritance)
127
+
128
+ The `include` key has been renamed to `extends` to better match common configuration patterns.
129
+
130
+ **Before:**
131
+ ```yaml
132
+ version: "1.0"
133
+ include:
134
+ - ./base-config.yaml
135
+ - ./team-standards.yaml
136
+ ```
137
+
138
+ **After:**
139
+ ```yaml
140
+ version: "1.0"
141
+ extends:
142
+ - ./base-config.yaml
143
+ - ./team-standards.yaml
144
+ ```
145
+
146
+ ---
147
+
148
+ ## Provider Changes
149
+
150
+ ### New Providers
151
+
152
+ The following providers have been added:
153
+
154
+ | Provider | Type | Description |
155
+ |----------|------|-------------|
156
+ | `git-checkout` | `git-checkout` | Checkout git repositories with worktree support |
157
+ | `workflow` | `workflow` | Invoke reusable workflows |
158
+ | `human-input` | `human-input` | Request user input in workflows |
159
+ | `script` | `script` | Execute custom JavaScript logic |
160
+ | `log` | `log` | Debug logging (replaces `logger`) |
161
+ | `github` | `github` | Native GitHub API operations |
162
+
163
+ ### Provider Type Renames
164
+
165
+ | Old Type | New Type | Notes |
166
+ |----------|----------|-------|
167
+ | `webhook` | `http` | For output webhooks |
168
+ | (new) | `http_input` | For receiving webhooks |
169
+ | (new) | `http_client` | For fetching from APIs |
170
+ | `logger` | `log` | Debug logging |
171
+
172
+ **Before:**
173
+ ```yaml
174
+ steps:
175
+ notify:
176
+ type: webhook
177
+ url: https://slack.webhook.url
178
+ ```
179
+
180
+ **After:**
181
+ ```yaml
182
+ steps:
183
+ notify:
184
+ type: http
185
+ url: https://slack.webhook.url
186
+ method: POST
187
+ ```
188
+
189
+ ### MCP Provider Transport Types
190
+
191
+ The MCP provider now supports multiple transports:
192
+
193
+ | Transport | Description |
194
+ |-----------|-------------|
195
+ | `stdio` | Local command via stdin/stdout (default) |
196
+ | `sse` | Server-Sent Events (legacy) |
197
+ | `http` | Modern Streamable HTTP |
198
+ | `custom` | YAML-defined tools |
199
+
200
+ **Example with explicit transport:**
201
+ ```yaml
202
+ steps:
203
+ mcp-tool:
204
+ type: mcp
205
+ transport: stdio # Explicitly specify transport
206
+ command: npx
207
+ command_args: ["-y", "@probelabs/probe@latest", "mcp"]
208
+ method: search_code
209
+ ```
210
+
211
+ ---
212
+
213
+ ## Breaking Changes by Version
214
+
215
+ ### Version 0.1.40+: Workspace Isolation
216
+
217
+ **What Changed:**
218
+ - Introduced workspace isolation for sandboxed execution
219
+ - Steps now execute in isolated `/tmp/visor-workspaces/<sessionId>/` directories
220
+ - Main project is automatically worktree-cloned into the workspace
221
+
222
+ **Impact:**
223
+ - File paths in outputs may be relative to workspace, not original directory
224
+ - Commands should use `{{ outputs['checkout'].path }}` for checkout paths
225
+
226
+ **Migration:**
227
+ ```yaml
228
+ # New workspace configuration (optional)
229
+ workspace:
230
+ enabled: true
231
+ base_path: /tmp/visor-workspaces
232
+ cleanup_on_exit: true
233
+
234
+ steps:
235
+ checkout:
236
+ type: git-checkout
237
+ ref: "{{ pr.head }}"
238
+
239
+ build:
240
+ type: command
241
+ depends_on: [checkout]
242
+ # Use workspace path from checkout output
243
+ exec: "cd {{ outputs.checkout.path }} && npm run build"
244
+ ```
245
+
246
+ ### Version 0.1.30+: Lifecycle Hooks (`on_init`)
247
+
248
+ **What Changed:**
249
+ - Added `on_init` hook for preprocessing before step execution
250
+ - Unified invocation syntax for tools, steps, and workflows
251
+ - Arguments passed via `with:` directive
252
+
253
+ **Migration:**
254
+ If you used `depends_on` for preprocessing, consider migrating to `on_init`:
255
+
256
+ **Before:**
257
+ ```yaml
258
+ steps:
259
+ fetch-jira:
260
+ type: mcp
261
+ method: fetch-jira
262
+ methodArgs:
263
+ issue_key: "PROJ-123"
264
+
265
+ ai-review:
266
+ type: ai
267
+ depends_on: [fetch-jira]
268
+ prompt: |
269
+ JIRA: {{ outputs['fetch-jira'] }}
270
+ Review the PR...
271
+ ```
272
+
273
+ **After:**
274
+ ```yaml
275
+ tools:
276
+ fetch-jira:
277
+ exec: "curl https://jira.../issue/{{ args.issue_key }}"
278
+ parseJson: true
279
+
280
+ steps:
281
+ ai-review:
282
+ type: ai
283
+ on_init:
284
+ run:
285
+ - tool: fetch-jira
286
+ with:
287
+ issue_key: "PROJ-123"
288
+ as: jira-context
289
+ prompt: |
290
+ JIRA: {{ outputs['jira-context'] }}
291
+ Review the PR...
292
+ ```
293
+
294
+ ### Version 0.1.20+: Transitions DSL
295
+
296
+ **What Changed:**
297
+ - Added declarative `transitions` array as alternative to `goto_js`
298
+ - Transitions evaluated in order; first matching rule wins
299
+ - Helper functions available in `when` expressions: `any()`, `all()`, `none()`, `count()`
300
+
301
+ **Migration:**
302
+ Complex `goto_js` logic can be simplified with transitions:
303
+
304
+ **Before:**
305
+ ```yaml
306
+ steps:
307
+ validate:
308
+ type: ai
309
+ on_success:
310
+ goto_js: |
311
+ if (outputs['validate'].score >= 90) return 'publish';
312
+ if (outputs['validate'].score >= 70) return 'review';
313
+ return 'reject';
314
+ ```
315
+
316
+ **After:**
317
+ ```yaml
318
+ steps:
319
+ validate:
320
+ type: ai
321
+ on_success:
322
+ transitions:
323
+ - when: "outputs['validate'].score >= 90"
324
+ to: publish
325
+ - when: "outputs['validate'].score >= 70"
326
+ to: review
327
+ - when: "true"
328
+ to: reject
329
+ ```
330
+
331
+ ### Version 0.1.10+: Routing System
332
+
333
+ **What Changed:**
334
+ - Introduced `on_success`, `on_fail`, `on_finish` hooks
335
+ - Added `routing` configuration for global defaults
336
+ - Retry policies with backoff (fixed/exponential)
337
+ - Loop protection via `max_loops`
338
+
339
+ **Migration:**
340
+ Add routing configuration to enable retry and routing features:
341
+
342
+ ```yaml
343
+ version: "2.0"
344
+
345
+ routing:
346
+ max_loops: 10
347
+ defaults:
348
+ on_fail:
349
+ retry:
350
+ max: 2
351
+ backoff:
352
+ mode: exponential
353
+ delay_ms: 1000
354
+
355
+ steps:
356
+ flaky-step:
357
+ type: command
358
+ exec: ./sometimes-fails.sh
359
+ on_fail:
360
+ retry:
361
+ max: 3
362
+ goto: setup-step # Jump to ancestor on failure
363
+ ```
364
+
365
+ ### Memory Provider Changes
366
+
367
+ **What Changed:**
368
+ - Added `script` type for complex JavaScript logic (previously part of memory provider)
369
+ - Memory operations now require explicit `operation` key
370
+ - Added `value_js` for dynamic value computation
371
+
372
+ **Migration:**
373
+
374
+ **Before (if using inline JS in memory):**
375
+ ```yaml
376
+ steps:
377
+ complex-calc:
378
+ type: memory
379
+ key: result
380
+ value: |
381
+ // This was never valid, but some tried it
382
+ const x = 1 + 2;
383
+ return x;
384
+ ```
385
+
386
+ **After:**
387
+ ```yaml
388
+ steps:
389
+ complex-calc:
390
+ type: script
391
+ content: |
392
+ const x = 1 + 2;
393
+ memory.set('result', x);
394
+ return x;
395
+ ```
396
+
397
+ ---
398
+
399
+ ## Migration Steps
400
+
401
+ ### Step 1: Update Configuration Version
402
+
403
+ If using routing features, update to version "2.0":
404
+
405
+ ```yaml
406
+ version: "2.0" # Required for routing features
407
+ ```
408
+
409
+ ### Step 2: Rename Deprecated Keys
410
+
411
+ Use the following sed commands or manually update:
412
+
413
+ ```bash
414
+ # Rename args to command_args in MCP checks
415
+ sed -i 's/^\(\s*\)args:/\1command_args:/' .visor.yaml
416
+
417
+ # Rename checks to steps (optional but recommended)
418
+ sed -i 's/^checks:/steps:/' .visor.yaml
419
+
420
+ # Rename custom_prompt to system_prompt
421
+ sed -i 's/custom_prompt:/system_prompt:/' .visor.yaml
422
+
423
+ # Rename include to extends
424
+ sed -i 's/^include:/extends:/' .visor.yaml
425
+ ```
426
+
427
+ ### Step 3: Validate Configuration
428
+
429
+ Run the validation command to check for errors:
430
+
431
+ ```bash
432
+ visor validate --config .visor.yaml
433
+ ```
434
+
435
+ ### Step 4: Update Provider Types
436
+
437
+ Replace deprecated provider types:
438
+
439
+ | Find | Replace With |
440
+ |------|--------------|
441
+ | `type: webhook` | `type: http` |
442
+ | `type: logger` | `type: log` |
443
+
444
+ ### Step 5: Test in Dry-Run Mode
445
+
446
+ Before deploying, test your configuration:
447
+
448
+ ```bash
449
+ # Test with debug output
450
+ visor --check all --debug
451
+
452
+ # Or test specific checks
453
+ visor --check security --debug
454
+ ```
455
+
456
+ ---
457
+
458
+ ## Deprecation Warnings
459
+
460
+ ### Features Scheduled for Removal
461
+
462
+ | Feature | Deprecated In | Removal Target | Alternative |
463
+ |---------|--------------|----------------|-------------|
464
+ | `checks:` key | 0.1.30 | 1.0.0 | Use `steps:` |
465
+ | `failure_conditions` | 0.1.20 | 1.0.0 | Use `fail_if` |
466
+ | `custom_prompt` | 0.1.20 | 1.0.0 | Use `system_prompt` |
467
+ | `include:` key | 0.1.30 | 1.0.0 | Use `extends:` |
468
+ | `args` in MCP stdio | 0.1.25 | 1.0.0 | Use `command_args` |
469
+
470
+ ### Deprecation Messages
471
+
472
+ When using deprecated features, Visor logs warnings:
473
+
474
+ ```
475
+ [WARN] 'checks:' is deprecated, use 'steps:' instead
476
+ [WARN] 'failure_conditions' is deprecated, use 'fail_if' instead
477
+ [WARN] 'args' in MCP stdio transport is deprecated, use 'command_args'
478
+ ```
479
+
480
+ ---
481
+
482
+ ## Compatibility Notes
483
+
484
+ ### GitHub Action vs CLI
485
+
486
+ Both modes share the same configuration format with minor differences:
487
+
488
+ | Feature | GitHub Action | CLI |
489
+ |---------|--------------|-----|
490
+ | Event triggers (`on:`) | Automatic from webhook | Manual or simulated |
491
+ | PR context | From GitHub event | From git/API |
492
+ | Output | PR comments, check runs | Console, file |
493
+ | Secrets | GitHub secrets | Environment variables |
494
+
495
+ ### Node.js Version Requirements
496
+
497
+ | Visor Version | Node.js Requirement |
498
+ |---------------|---------------------|
499
+ | 0.1.x | Node.js 18+ |
500
+ | 1.0.0 (planned) | Node.js 20+ |
501
+
502
+ ### Dependencies
503
+
504
+ Visor's core dependencies:
505
+
506
+ | Dependency | Purpose |
507
+ |------------|---------|
508
+ | `@modelcontextprotocol/sdk` | MCP protocol support |
509
+ | `liquidjs` | Template rendering |
510
+ | `js-yaml` | YAML parsing |
511
+ | `ajv` | JSON Schema validation |
512
+
513
+ ### Environment Variables
514
+
515
+ Key environment variables for migration:
516
+
517
+ | Variable | Purpose |
518
+ |----------|---------|
519
+ | `VISOR_WORKSPACE_PATH` | Override workspace base path |
520
+ | `VISOR_WORKTREE_PATH` | Override git worktree cache |
521
+ | `VISOR_TELEMETRY_ENABLED` | Enable OpenTelemetry tracing |
522
+
523
+ ---
524
+
525
+ ## Troubleshooting
526
+
527
+ ### Common Migration Issues
528
+
529
+ #### Issue: "Invalid check type" error
530
+
531
+ **Cause:** Using old provider type names.
532
+
533
+ **Solution:** Update to new type names (see [Provider Type Renames](#provider-type-renames)).
534
+
535
+ #### Issue: MCP check fails with "args not recognized"
536
+
537
+ **Cause:** Using `args` instead of `command_args` for stdio transport.
538
+
539
+ **Solution:** Rename `args` to `command_args` in MCP checks.
540
+
541
+ #### Issue: Configuration validation fails
542
+
543
+ **Cause:** Schema changes between versions.
544
+
545
+ **Solution:** Run `visor validate` and fix reported issues.
546
+
547
+ #### Issue: Outputs not available in templates
548
+
549
+ **Cause:** Using old output access patterns.
550
+
551
+ **Solution:** Use `outputs['step-name']` or `outputs.history['step-name']` for history.
552
+
553
+ ### Getting Help
554
+
555
+ - [Configuration Documentation](./configuration.md)
556
+ - [GitHub Issues](https://github.com/probelabs/visor/issues)
557
+ - [Examples Directory](../examples/)
558
+
559
+ ---
560
+
561
+ ## Quick Reference
562
+
563
+ ### Configuration Changes Checklist
564
+
565
+ - [ ] Update `version:` to "2.0" if using routing
566
+ - [ ] Rename `checks:` to `steps:`
567
+ - [ ] Rename `args:` to `command_args:` in MCP stdio checks
568
+ - [ ] Rename `custom_prompt:` to `system_prompt:`
569
+ - [ ] Rename `include:` to `extends:`
570
+ - [ ] Replace `failure_conditions:` with `fail_if:`
571
+ - [ ] Update provider types (`webhook` to `http`, `logger` to `log`)
572
+ - [ ] Run `visor validate` to check configuration
573
+
574
+ ### Version-Specific Features
575
+
576
+ ```yaml
577
+ # Version 1.0 features
578
+ version: "1.0"
579
+ steps:
580
+ basic-check:
581
+ type: ai
582
+ prompt: "Review code"
583
+
584
+ # Version 2.0 features (routing)
585
+ version: "2.0"
586
+ routing:
587
+ max_loops: 10
588
+ steps:
589
+ with-routing:
590
+ type: command
591
+ exec: ./script.sh
592
+ on_fail:
593
+ retry:
594
+ max: 3
595
+ goto: setup
596
+ ```