@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
@@ -1,4 +1,4 @@
1
- ## 🧠 Advanced AI Features
1
+ ## Advanced AI Features
2
2
 
3
3
  ### AI Session Reuse
4
4
  Use `reuse_ai_session` on checks to continue conversation context with the AI across steps. This improves follow‑ups and consistency for follow‑on analysis and chat‑style flows.
@@ -26,6 +26,7 @@ steps:
26
26
  depends_on: [security-remediation]
27
27
  reuse_ai_session: true
28
28
  session_mode: append # Share history - sees full conversation
29
+ ```
29
30
 
30
31
  #### Reusing your own session: `reuse_ai_session: self`
31
32
 
@@ -84,8 +85,7 @@ The corresponding testable example lives at:
84
85
 
85
86
  - `examples/session-reuse-self.yaml`
86
87
 
87
- This keeps the configuration small but shows how to wire `reuse_ai_session: self` and `session_mode: append` without touching higherlevel workflows like `tyk-assistant`.
88
- ```
88
+ This keeps the configuration small but shows how to wire `reuse_ai_session: self` and `session_mode: append` without touching higher-level workflows like `tyk-assistant`.
89
89
 
90
90
  **When to use each mode:**
91
91
  - Use **`clone`** (default) when you want parallel follow-ups that don't interfere with each other
@@ -99,61 +99,67 @@ For PR events, Visor provides comprehensive code review context:
99
99
 
100
100
  ```xml
101
101
  <pull_request>
102
+ <!-- Core pull request metadata including identification, branches, and change statistics -->
102
103
  <metadata>
103
- <number>123</number> <!-- PR number -->
104
- <title>Add user authentication</title> <!-- PR title -->
105
- <author>developer</author> <!-- PR author username -->
106
- <base_branch>main</base_branch> <!-- Target branch (where changes will be merged) -->
107
- <target_branch>feature-auth</target_branch> <!-- Source branch (contains the changes) -->
108
- <total_additions>250</total_additions> <!-- Total lines added across all files -->
109
- <total_deletions>50</total_deletions> <!-- Total lines removed across all files -->
110
- <files_changed_count>3</files_changed_count> <!-- Number of files modified -->
104
+ <number>123</number>
105
+ <title>Add user authentication</title>
106
+ <author>developer</author>
107
+ <base_branch>main</base_branch>
108
+ <target_branch>feature-auth</target_branch>
109
+ <total_additions>250</total_additions>
110
+ <total_deletions>50</total_deletions>
111
+ <files_changed_count>3</files_changed_count>
111
112
  </metadata>
112
113
 
114
+ <!-- Raw diff header snippet for compatibility -->
115
+ <raw_diff_header>
116
+ diff --git a/src/auth.ts b/src/auth.ts
117
+ </raw_diff_header>
118
+
119
+ <!-- Full pull request description provided by the author -->
113
120
  <description>
114
- <!-- PR description/body text provided by the author -->
115
- This PR implements JWT-based authentication with refresh token support
121
+ This PR implements JWT-based authentication with refresh token support
116
122
  </description>
117
123
 
124
+ <!-- Complete unified diff showing all changes (processed with outline-diff) -->
118
125
  <full_diff>
119
- <!-- Complete unified diff of all changes (present for all PR analyses) -->
120
- --- src/auth.ts
121
- +++ src/auth.ts
122
- @@ -1,3 +1,10 @@
123
- +import jwt from 'jsonwebtoken';
124
- ...
126
+ --- src/auth.ts
127
+ +++ src/auth.ts
128
+ @@ -1,3 +1,10 @@
129
+ +import jwt from 'jsonwebtoken';
130
+ ...
125
131
  </full_diff>
126
132
 
133
+ <!-- Diff of only the latest commit for incremental analysis (only present for pr_updated events) -->
127
134
  <commit_diff>
128
- <!-- Only present for incremental analysis (pr_updated events) -->
129
- <!-- Contains diff of just the latest commit pushed -->
135
+ <!-- Contains diff of just the latest commit pushed -->
130
136
  </commit_diff>
131
137
 
138
+ <!-- Summary of all files changed with statistics -->
132
139
  <files_summary>
133
- <!-- List of all modified files with change statistics -->
134
- <file index="1">
140
+ <file>
135
141
  <filename>src/auth.ts</filename>
136
- <status>modified</status> <!-- added/modified/removed/renamed -->
137
- <additions>120</additions> <!-- Lines added in this file -->
138
- <deletions>10</deletions> <!-- Lines removed from this file -->
142
+ <status>modified</status>
143
+ <additions>120</additions>
144
+ <deletions>10</deletions>
139
145
  </file>
140
146
  </files_summary>
141
147
 
142
- <!-- Only present for issue_comment events on PRs -->
148
+ <!-- The comment that triggered this analysis (only present for issue_comment events) -->
143
149
  <triggering_comment>
144
150
  <author>reviewer1</author>
145
151
  <created_at>2024-01-16T15:30:00Z</created_at>
146
152
  <body>/review --check security</body>
147
153
  </triggering_comment>
148
154
 
149
- <!-- Historical comments on the PR (excludes triggering comment) -->
155
+ <!-- Previous comments in chronological order (excluding triggering comment) -->
150
156
  <comment_history>
151
- <comment index="1">
157
+ <comment>
152
158
  <author>reviewer2</author>
153
159
  <created_at>2024-01-15T11:00:00Z</created_at>
154
160
  <body>Please add unit tests for the authentication logic</body>
155
161
  </comment>
156
- <comment index="2">
162
+ <comment>
157
163
  <author>developer</author>
158
164
  <created_at>2024-01-15T14:30:00Z</created_at>
159
165
  <body>Tests added in latest commit</body>
@@ -167,56 +173,57 @@ For issue events, Visor provides issue-specific context for intelligent assistan
167
173
 
168
174
  ```xml
169
175
  <issue>
176
+ <!-- Core issue metadata including identification, status, and timeline information -->
170
177
  <metadata>
171
- <number>456</number> <!-- Issue number -->
172
- <title>Feature request: Add dark mode</title> <!-- Issue title -->
173
- <author>user123</author> <!-- Issue author username -->
174
- <state>open</state> <!-- Issue state: open/closed -->
175
- <created_at>2024-01-15T10:30:00Z</created_at> <!-- When issue was created -->
176
- <updated_at>2024-01-16T14:20:00Z</updated_at> <!-- Last update timestamp -->
177
- <comments_count>5</comments_count> <!-- Total number of comments -->
178
+ <number>456</number>
179
+ <title>Feature request: Add dark mode</title>
180
+ <author>user123</author>
181
+ <state>open</state>
182
+ <created_at>2024-01-15T10:30:00Z</created_at>
183
+ <updated_at>2024-01-16T14:20:00Z</updated_at>
184
+ <comments_count>5</comments_count>
178
185
  </metadata>
179
186
 
187
+ <!-- Full issue description and body text provided by the issue author -->
180
188
  <description>
181
- <!-- Issue body/description text provided by the author -->
182
- I would like to request a dark mode feature for better accessibility...
189
+ I would like to request a dark mode feature for better accessibility...
183
190
  </description>
184
191
 
192
+ <!-- Applied labels for issue categorization and organization -->
185
193
  <labels>
186
- <!-- GitHub labels applied to categorize the issue -->
187
194
  <label>enhancement</label>
188
195
  <label>good first issue</label>
189
196
  <label>ui/ux</label>
190
197
  </labels>
191
198
 
199
+ <!-- Users assigned to work on this issue -->
192
200
  <assignees>
193
- <!-- Users assigned to work on this issue -->
194
201
  <assignee>developer1</assignee>
195
202
  <assignee>developer2</assignee>
196
203
  </assignees>
197
204
 
205
+ <!-- Associated project milestone information -->
198
206
  <milestone>
199
- <!-- Project milestone this issue is part of (if any) -->
200
207
  <title>v2.0 Release</title>
201
- <state>open</state> <!-- Milestone state: open/closed -->
202
- <due_on>2024-03-01T00:00:00Z</due_on> <!-- Milestone due date -->
208
+ <state>open</state>
209
+ <due_on>2024-03-01T00:00:00Z</due_on>
203
210
  </milestone>
204
211
 
205
- <!-- Only present for issue_comment events -->
212
+ <!-- The comment that triggered this analysis (only present for issue_comment events) -->
206
213
  <triggering_comment>
207
- <author>user456</author> <!-- User who posted the triggering comment -->
208
- <created_at>2024-01-16T15:30:00Z</created_at> <!-- When comment was posted -->
209
- <body>/review security --focus authentication</body> <!-- The comment text -->
214
+ <author>user456</author>
215
+ <created_at>2024-01-16T15:30:00Z</created_at>
216
+ <body>/review security --focus authentication</body>
210
217
  </triggering_comment>
211
218
 
212
- <!-- Historical comments on the issue (excludes triggering comment) -->
219
+ <!-- Previous comments in chronological order (excluding triggering comment) -->
213
220
  <comment_history>
214
- <comment index="1"> <!-- Comments ordered by creation time -->
221
+ <comment>
215
222
  <author>developer1</author>
216
223
  <created_at>2024-01-15T11:00:00Z</created_at>
217
224
  <body>This is a great idea! I'll start working on it.</body>
218
225
  </comment>
219
- <comment index="2">
226
+ <comment>
220
227
  <author>user123</author>
221
228
  <created_at>2024-01-15T14:30:00Z</created_at>
222
229
  <body>Thanks! Please consider accessibility standards.</body>
@@ -7,8 +7,8 @@ Visor supports multiple AI providers. Configure one via environment variables.
7
7
  | Provider | Env Var | Example Models |
8
8
  |----------|---------|----------------|
9
9
  | Google Gemini | `GOOGLE_API_KEY` | `gemini-2.0-flash-exp`, `gemini-1.5-pro` |
10
- | Anthropic Claude | `ANTHROPIC_API_KEY` | `claude-3-opus`, `claude-3-sonnet` |
11
- | OpenAI GPT | `OPENAI_API_KEY` | `gpt-4`, `gpt-4-turbo`, `gpt-3.5-turbo` |
10
+ | Anthropic Claude | `ANTHROPIC_API_KEY` | `claude-3-5-sonnet-latest`, `claude-3-opus-latest` |
11
+ | OpenAI GPT | `OPENAI_API_KEY` | `gpt-4o`, `gpt-4-turbo`, `gpt-4` |
12
12
  | AWS Bedrock | AWS credentials (see below) | `anthropic.claude-sonnet-4-20250514-v1:0` (default) |
13
13
 
14
14
  ### GitHub Actions Setup
@@ -122,10 +122,12 @@ Visor exposes Probe’s prompt controls to adjust the agent’s behavior for a g
122
122
  Accepted keys
123
123
  - Under `ai:`
124
124
  - `prompt_type`: string — Probe persona/family, e.g., `engineer`, `code-review`, `architect`.
125
- - `custom_prompt`: string — Baseline/system prompt prepended by the SDK.
125
+ - `system_prompt`: string — Baseline/system prompt prepended by the SDK (preferred).
126
+ - `custom_prompt`: string — Alias for `system_prompt` (deprecated, use `system_prompt` instead).
126
127
  - At the check level (aliases if you prefer not to nest):
127
128
  - `ai_prompt_type`: string
128
- - `ai_custom_prompt`: string
129
+ - `ai_system_prompt`: string (preferred)
130
+ - `ai_custom_prompt`: string (deprecated alias for `ai_system_prompt`)
129
131
  - `ai_persona`: string — optional hint we prepend as a first line: `Persona: <value>`.
130
132
 
131
133
  Examples
@@ -138,7 +140,7 @@ steps:
138
140
  provider: anthropic
139
141
  model: claude-3-5-sonnet-latest
140
142
  prompt_type: engineer
141
- custom_prompt: |
143
+ system_prompt: |
142
144
  You are a specialist in analyzing security vulnerabilities.
143
145
  Focus on injection, authn/z, crypto, and data exposure.
144
146
  schema: code-review
@@ -148,14 +150,13 @@ steps:
148
150
  quick-architect-check:
149
151
  type: ai
150
152
  ai_prompt_type: architect # check-level alias
151
- ai_custom_prompt: "Favor modular boundaries and low coupling."
153
+ ai_system_prompt: "Favor modular boundaries and low coupling."
152
154
  prompt: "Assess high-level design risks in the diff"
153
155
  ```
154
156
 
155
157
  Notes
156
158
  - If `prompt_type` is omitted and a `schema` is provided, Visor defaults to `code-review`.
157
159
  - `ai_persona` is a lightweight hint added as a first line; prefer `prompt_type` when integrating with Probe personas.
158
- ```
159
160
 
160
161
  #### AWS Bedrock Specific Configuration
161
162
 
@@ -280,7 +281,7 @@ steps:
280
281
  prompt: "Fix the security vulnerabilities found in the code"
281
282
  ai:
282
283
  provider: anthropic
283
- model: claude-3-opus
284
+ model: claude-3-opus-latest
284
285
  allowEdit: true # Enable Edit and Create tools
285
286
 
286
287
  read-only-review:
@@ -394,7 +395,7 @@ steps:
394
395
  - Cryptographic weaknesses
395
396
  ai:
396
397
  provider: anthropic
397
- model: claude-3-opus
398
+ model: claude-3-opus-latest
398
399
  enableDelegate: true # Enable task delegation to subagents
399
400
 
400
401
  focused-sql-injection-check:
@@ -434,7 +435,7 @@ steps:
434
435
  prompt: "Analyze the project structure and git status"
435
436
  ai:
436
437
  provider: anthropic
437
- model: claude-3-opus
438
+ model: claude-3-opus-latest
438
439
  allowBash: true # Simple one-line enable
439
440
  ```
440
441
 
@@ -527,9 +528,96 @@ steps:
527
528
 
528
529
  **Security Note:** Bash command execution respects existing security boundaries and permissions. Commands run with the same privileges as the Visor process. Always review and test bash configurations before deploying to production environments.
529
530
 
531
+ #### Retry Configuration (`retry`)
532
+
533
+ Configure automatic retries for AI provider calls when transient errors occur:
534
+
535
+ ```yaml
536
+ steps:
537
+ resilient-review:
538
+ type: ai
539
+ prompt: "Analyze code for security vulnerabilities"
540
+ ai:
541
+ provider: anthropic
542
+ retry:
543
+ maxRetries: 3 # Maximum retry attempts (0-50)
544
+ initialDelay: 1000 # Initial delay in ms (0-60000)
545
+ maxDelay: 30000 # Maximum delay cap in ms (0-300000)
546
+ backoffFactor: 2 # Exponential backoff multiplier (1-10)
547
+ retryableErrors: # Custom error patterns to retry on
548
+ - "rate limit"
549
+ - "timeout"
550
+ ```
551
+
552
+ **Configuration Options:**
553
+
554
+ - **`maxRetries`** (number): Maximum retry attempts. Default varies by provider.
555
+ - **`initialDelay`** (number): Initial delay between retries in milliseconds.
556
+ - **`maxDelay`** (number): Maximum delay cap to prevent excessive waits.
557
+ - **`backoffFactor`** (number): Multiplier for exponential backoff between retries.
558
+ - **`retryableErrors`** (string[]): Custom error message patterns that should trigger retries.
559
+
560
+ #### Fallback Configuration (`fallback`)
561
+
562
+ Configure fallback providers when the primary AI provider fails:
563
+
564
+ ```yaml
565
+ steps:
566
+ fault-tolerant-review:
567
+ type: ai
568
+ prompt: "Review code for quality issues"
569
+ ai:
570
+ provider: anthropic
571
+ model: claude-3-5-sonnet-latest
572
+ fallback:
573
+ strategy: custom # 'same-model', 'same-provider', 'any', or 'custom'
574
+ maxTotalAttempts: 5 # Maximum attempts across all providers
575
+ auto: true # Auto-detect fallbacks from available env vars
576
+ providers: # Custom fallback chain
577
+ - provider: openai
578
+ model: gpt-4o
579
+ - provider: google
580
+ model: gemini-2.0-flash-exp
581
+ ```
582
+
583
+ **Configuration Options:**
584
+
585
+ - **`strategy`** (string): Fallback strategy:
586
+ - `same-model`: Retry with the same model
587
+ - `same-provider`: Try different models from the same provider
588
+ - `any`: Try any available provider
589
+ - `custom`: Use the specified providers list
590
+ - **`providers`** (array): Array of fallback provider configurations
591
+ - **`maxTotalAttempts`** (number): Maximum total attempts across all providers
592
+ - **`auto`** (boolean): Automatically detect and use fallback providers from environment variables
593
+
594
+ #### Completion Prompt (`completion_prompt`)
595
+
596
+ Run a validation or review prompt after the AI completes its primary task:
597
+
598
+ ```yaml
599
+ steps:
600
+ validated-review:
601
+ type: ai
602
+ prompt: "Analyze the codebase for security issues"
603
+ ai:
604
+ provider: anthropic
605
+ completion_prompt: |
606
+ Review your analysis above. Verify that:
607
+ 1. All findings have specific file and line references
608
+ 2. Severity levels are appropriate
609
+ 3. Recommendations are actionable
610
+ If any issues are found, revise your response.
611
+ ```
612
+
613
+ **When to use completion prompts:**
614
+ - Validate AI output meets quality standards
615
+ - Self-review for accuracy and completeness
616
+ - Ensure proper formatting of responses
617
+
530
618
  ### Fallback Behavior
531
619
 
532
620
  If no key is configured, Visor falls back to fast, heuristic checks (simple patterns, basic style/perf). For best results, set a provider.
533
621
 
534
622
  ### MCP (Tools) Support
535
- See docs/mcp.md for adding MCP servers (Probe, Jira, Filesystem, etc.).
623
+ See [mcp.md](./mcp.md) for adding MCP servers (Probe, Jira, Filesystem, etc.).
@@ -2,8 +2,28 @@
2
2
 
3
3
  ## TL;DR
4
4
 
5
- You can expose custom shell-based tools to AI by adding `tools: [tool-names]` to your `ai_mcp_servers` configuration. No new config sections needed!
5
+ You can expose custom shell-based tools to AI using one of two methods:
6
6
 
7
+ **Method 1: Using `ai_custom_tools` (Recommended)**
8
+ ```yaml
9
+ tools:
10
+ grep-pattern:
11
+ name: grep-pattern
12
+ exec: 'grep -rn "{{ args.pattern }}" *.ts'
13
+ inputSchema:
14
+ type: object
15
+ properties:
16
+ pattern: {type: string}
17
+ required: [pattern]
18
+
19
+ steps:
20
+ security-scan:
21
+ type: ai
22
+ prompt: Use grep-pattern to find security issues.
23
+ ai_custom_tools: [grep-pattern] # Simple and explicit
24
+ ```
25
+
26
+ **Method 2: Using `tools:` within `ai_mcp_servers`**
7
27
  ```yaml
8
28
  tools:
9
29
  grep-pattern:
@@ -21,14 +41,14 @@ steps:
21
41
  prompt: Use grep-pattern to find security issues.
22
42
  ai_mcp_servers:
23
43
  custom-tools:
24
- tools: [grep-pattern] # Automatically creates ephemeral SSE MCP server!
44
+ tools: [grep-pattern] # Creates ephemeral SSE MCP server
25
45
  ```
26
46
 
27
47
  ## How It Works
28
48
 
29
- When you add `tools: [...]` to an MCP server config:
49
+ When you use either `ai_custom_tools` or `tools: [...]` within an MCP server config:
30
50
 
31
- 1. **Automatic Detection**: Visor detects you're referencing custom tools (not a command/URL)
51
+ 1. **Automatic Detection**: Visor detects you're referencing custom tools defined in the global `tools:` section
32
52
  2. **Server Startup**: Creates an ephemeral SSE MCP server on an available port
33
53
  3. **Tool Exposure**: Your custom tools become available to the AI via MCP protocol
34
54
  4. **Auto Cleanup**: Server stops automatically when the AI check completes
@@ -51,9 +71,7 @@ steps:
51
71
  security-review:
52
72
  type: ai
53
73
  prompt: Use check-secrets to find hardcoded credentials.
54
- ai_mcp_servers:
55
- security-tools:
56
- tools: [check-secrets]
74
+ ai_custom_tools: [check-secrets]
57
75
  ```
58
76
 
59
77
  ### Example 2: Multiple Custom Tools
@@ -82,9 +100,7 @@ steps:
82
100
  prompt: |
83
101
  Use grep-pattern to find console.log statements.
84
102
  Use count-todos to count pending work items.
85
- ai_mcp_servers:
86
- custom-tools:
87
- tools: [grep-pattern, count-todos]
103
+ ai_custom_tools: [grep-pattern, count-todos]
88
104
  ```
89
105
 
90
106
  ### Example 3: Combining Custom Tools with External MCP Servers
@@ -96,11 +112,10 @@ steps:
96
112
  prompt: |
97
113
  You have both custom tools and external MCP servers.
98
114
  Use them for a comprehensive review.
115
+ # Custom tools via ai_custom_tools
116
+ ai_custom_tools: [grep-pattern, check-secrets]
117
+ # External MCP servers
99
118
  ai_mcp_servers:
100
- # Custom tools via ephemeral SSE server
101
- my-tools:
102
- tools: [grep-pattern, check-secrets]
103
- # External MCP server via stdio
104
119
  filesystem:
105
120
  command: npx
106
121
  args: ["-y", "@modelcontextprotocol/server-filesystem", "."]
@@ -108,7 +123,22 @@ steps:
108
123
 
109
124
  ## Configuration Format
110
125
 
111
- ### Custom Tools Server (Ephemeral SSE)
126
+ ### Method 1: ai_custom_tools (Recommended)
127
+
128
+ ```yaml
129
+ steps:
130
+ my-check:
131
+ type: ai
132
+ ai_custom_tools: [tool-name-1, tool-name-2, ...]
133
+ ```
134
+
135
+ **Key points:**
136
+ - Simple and explicit configuration
137
+ - Tools must be defined in global `tools:` section
138
+ - Automatically creates SSE server on ephemeral port
139
+ - Can be combined with `ai_mcp_servers` for external servers
140
+
141
+ ### Method 2: tools: within ai_mcp_servers
112
142
 
113
143
  ```yaml
114
144
  ai_mcp_servers:
@@ -117,12 +147,12 @@ ai_mcp_servers:
117
147
  ```
118
148
 
119
149
  **Key points:**
120
- - Server name can be anything (e.g., `custom-tools`, `my-tools`, `security-tools`)
150
+ - Server name can be anything (e.g., `custom-tools`, `my-tools`)
121
151
  - Tools must be defined in global `tools:` section
122
152
  - Automatically creates SSE server on ephemeral port
123
153
  - No command/URL needed - handled automatically
124
154
 
125
- ### External MCP Server (Traditional)
155
+ ### External MCP Server (for comparison)
126
156
 
127
157
  ```yaml
128
158
  ai_mcp_servers:
@@ -136,22 +166,32 @@ ai_mcp_servers:
136
166
  - Uses stdio transport by default
137
167
  - Can also use SSE/HTTP with `url:` and `transport:`
138
168
 
139
- ## Backward Compatibility
169
+ ## Both Methods Work
140
170
 
141
- The old `ai_custom_tools` field still works for backward compatibility:
171
+ Both configuration methods are fully supported:
142
172
 
143
173
  ```yaml
144
174
  steps:
145
- my-check:
175
+ # Method 1: ai_custom_tools (recommended for simplicity)
176
+ check-with-custom-tools:
177
+ type: ai
178
+ ai_custom_tools: [tool1, tool2]
179
+
180
+ # Method 2: tools: in ai_mcp_servers (useful for naming)
181
+ check-with-mcp-tools:
146
182
  type: ai
147
- ai_custom_tools: [tool1, tool2] # Still works!
183
+ ai_mcp_servers:
184
+ my-security-tools:
185
+ tools: [tool1, tool2]
148
186
  ```
149
187
 
150
- But the **recommended approach** is to use `ai_mcp_servers` with `tools:` because:
151
- - Consistent with existing MCP server configuration
152
- - No new config fields to learn
153
- - ✅ Easier to combine custom + external MCP servers
154
- - More flexible (can name your tool server)
188
+ **Choose `ai_custom_tools` when:**
189
+ - You want simple, explicit configuration
190
+ - You're combining custom tools with external MCP servers
191
+
192
+ **Choose `tools:` in `ai_mcp_servers` when:**
193
+ - You want to name your tool server
194
+ - You prefer all MCP configuration in one place
155
195
 
156
196
  ## Complete Example
157
197
 
@@ -200,9 +240,7 @@ steps:
200
240
  1. Use grep-security to find eval(), exec(), or dangerous patterns
201
241
  2. Use scan-dependencies to check for outdated packages
202
242
  3. Report findings with severity levels
203
- ai_mcp_servers:
204
- security-tools:
205
- tools: [grep-security, scan-dependencies]
243
+ ai_custom_tools: [grep-security, scan-dependencies]
206
244
  ai:
207
245
  provider: anthropic
208
246
  model: claude-3-5-sonnet-20241022
@@ -213,9 +251,7 @@ steps:
213
251
  Analyze code metrics:
214
252
  - Use count-lines to measure TypeScript code
215
253
  - Provide insights on code size and complexity
216
- ai_mcp_servers:
217
- metrics-tools:
218
- tools: [count-lines]
254
+ ai_custom_tools: [count-lines]
219
255
  ai:
220
256
  provider: anthropic
221
257
  model: claude-3-5-sonnet-20241022
@@ -250,7 +286,8 @@ output:
250
286
  **Problem**: AI says it doesn't have access to tools
251
287
 
252
288
  **Solutions**:
253
- - Verify `tools:` field in `ai_mcp_servers` (not `tool` singular)
289
+ - Verify `ai_custom_tools:` syntax (not `ai_custom_tool` singular)
290
+ - If using `ai_mcp_servers`, verify `tools:` field (not `tool` singular)
254
291
  - Check tool names match exactly (case-sensitive)
255
292
  - Enable debug logging to see server startup
256
293