@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.
- package/dist/config.d.ts.map +1 -1
- package/dist/docs/DEPLOYMENT.md +117 -11
- package/dist/docs/GITHUB_CHECKS.md +18 -4
- package/dist/docs/NPM_USAGE.md +112 -39
- package/dist/docs/action-reference.md +63 -9
- package/dist/docs/advanced-ai.md +58 -51
- package/dist/docs/ai-configuration.md +99 -11
- package/dist/docs/ai-custom-tools-usage.md +70 -33
- package/dist/docs/ai-custom-tools.md +50 -27
- package/dist/docs/architecture.md +1232 -0
- package/dist/docs/bot-transports-rfc.md +13 -3
- package/dist/docs/ci-cli-mode.md +116 -8
- package/dist/docs/claude-code.md +111 -41
- package/dist/docs/command-provider.md +37 -15
- package/dist/docs/commands.md +252 -6
- package/dist/docs/configuration.md +138 -4
- package/dist/docs/contributing.md +737 -0
- package/dist/docs/custom-tools.md +39 -8
- package/dist/docs/dashboards/README.md +33 -19
- package/dist/docs/debug-visualizer-progress.md +14 -13
- package/dist/docs/debug-visualizer-rfc.md +14 -13
- package/dist/docs/debug-visualizer.md +30 -5
- package/dist/docs/debugging.md +73 -8
- package/dist/docs/default-output-schema.md +24 -20
- package/dist/docs/dependencies.md +75 -21
- package/dist/docs/dev-playbook.md +85 -9
- package/dist/docs/engine-pause-resume-rfc.md +11 -11
- package/dist/docs/engine-state-machine-plan.md +10 -3
- package/dist/docs/event-driven-github-integration-rfc.md +20 -11
- package/dist/docs/event-triggers.md +95 -6
- package/dist/docs/execution-statistics-rfc.md +16 -4
- package/dist/docs/fact-validator-gap-analysis.md +12 -1
- package/dist/docs/fact-validator-implementation-plan.md +19 -11
- package/dist/docs/fail-if.md +116 -11
- package/dist/docs/failure-conditions-implementation.md +40 -6
- package/dist/docs/failure-conditions-schema.md +243 -87
- package/dist/docs/failure-routing-rfc.md +43 -18
- package/dist/docs/failure-routing.md +80 -23
- package/dist/docs/faq.md +836 -0
- package/dist/docs/foreach-dependency-propagation.md +32 -15
- package/dist/docs/github-ops.md +6 -5
- package/dist/docs/glossary.md +322 -0
- package/dist/docs/goto-forward-run-plan.md +23 -10
- package/dist/docs/guides/criticality-modes.md +15 -13
- package/dist/docs/guides/fault-management-and-contracts.md +8 -5
- package/dist/docs/guides/workflow-style-guide.md +17 -8
- package/dist/docs/http.md +102 -3
- package/dist/docs/human-input-provider.md +20 -36
- package/dist/docs/index.md +206 -0
- package/dist/docs/lifecycle-hooks.md +322 -2
- package/dist/docs/limits.md +20 -5
- package/dist/docs/liquid-templates.md +86 -14
- package/dist/docs/loop-routing-refactor.md +4 -2
- package/dist/docs/mcp-provider.md +53 -19
- package/dist/docs/mcp.md +27 -1
- package/dist/docs/memory.md +7 -2
- package/dist/docs/migration.md +596 -0
- package/dist/docs/observability.md +227 -6
- package/dist/docs/output-formats.md +388 -9
- package/dist/docs/output-history.md +36 -6
- package/dist/docs/performance.md +510 -4
- package/dist/docs/pluggable.md +95 -4
- package/dist/docs/proposals/snapshot-scope-execution.md +6 -5
- package/dist/docs/providers/git-checkout.md +16 -14
- package/dist/docs/providers/noop.md +696 -0
- package/dist/docs/recipes.md +8 -9
- package/dist/docs/rfc/git-checkout-step.md +3 -1
- package/dist/docs/rfc/on_init-hook.md +18 -5
- package/dist/docs/rfc/workspace-isolation.md +16 -0
- package/dist/docs/roadmap/criticality-implementation-tasks.md +27 -27
- package/dist/docs/router-patterns.md +155 -43
- package/dist/docs/schema-templates.md +51 -15
- package/dist/docs/script.md +162 -13
- package/dist/docs/sdk.md +46 -12
- package/dist/docs/security.md +464 -5
- package/dist/docs/slack-integration.md +481 -0
- package/dist/docs/tag-filtering.md +60 -20
- package/dist/docs/telemetry-setup.md +157 -46
- package/dist/docs/test-framework-rfc.md +37 -36
- package/dist/docs/testing/assertions.md +92 -4
- package/dist/docs/testing/ci.md +56 -7
- package/dist/docs/testing/cli.md +57 -15
- package/dist/docs/testing/cookbook.md +53 -20
- package/dist/docs/testing/dsl-reference.md +110 -9
- package/dist/docs/testing/fixtures-and-mocks.md +28 -3
- package/dist/docs/testing/flows.md +59 -4
- package/dist/docs/testing/getting-started.md +14 -13
- package/dist/docs/testing/troubleshooting.md +39 -2
- package/dist/docs/timeouts.md +174 -18
- package/dist/docs/troubleshooting.md +176 -6
- package/dist/docs/workflow-creation-guide.md +101 -3
- package/dist/docs/workflows.md +138 -41
- package/dist/examples/README.md +169 -4
- package/dist/examples/ai-custom-tools-simple.yaml +2 -3
- package/dist/examples/cron-webhook-config.yaml +15 -0
- package/dist/examples/forEach-example.yaml +6 -0
- package/dist/examples/git-checkout-basic.yaml +4 -0
- package/dist/examples/git-checkout-compare.yaml +6 -0
- package/dist/examples/git-checkout-cross-repo.yaml +7 -0
- package/dist/examples/http-integration-config.yaml +30 -0
- package/dist/examples/https-server-config.yaml +15 -0
- package/dist/examples/mcp-provider-example.yaml +10 -10
- package/dist/examples/transform-example.yaml +3 -0
- package/dist/examples/webhook-pipeline-config.yaml +18 -0
- package/dist/examples/workflows/workflow-composition-example.yaml +4 -0
- package/dist/frontends/slack-frontend.d.ts +2 -0
- package/dist/frontends/slack-frontend.d.ts.map +1 -1
- package/dist/generated/config-schema.d.ts +11 -7
- package/dist/generated/config-schema.d.ts.map +1 -1
- package/dist/generated/config-schema.json +11 -7
- package/dist/index.js +3127 -974
- package/dist/output/traces/{run-2026-01-28T16-15-24-569Z.ndjson → run-2026-01-31T16-37-22-321Z.ndjson} +84 -84
- package/dist/output/traces/{run-2026-01-28T16-16-09-757Z.ndjson → run-2026-01-31T16-38-06-031Z.ndjson} +1013 -1013
- package/dist/providers/ai-check-provider.d.ts +9 -2
- package/dist/providers/ai-check-provider.d.ts.map +1 -1
- package/dist/providers/command-check-provider.d.ts.map +1 -1
- package/dist/providers/mcp-custom-sse-server.d.ts +17 -1
- package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
- package/dist/providers/workflow-check-provider.d.ts.map +1 -1
- package/dist/providers/workflow-tool-executor.d.ts +68 -0
- package/dist/providers/workflow-tool-executor.d.ts.map +1 -0
- package/dist/sdk/{check-provider-registry-AQ3JETBG.mjs → check-provider-registry-3KI5RKXT.mjs} +6 -5
- package/dist/sdk/check-provider-registry-IYILYY35.mjs +28 -0
- package/dist/sdk/chunk-2CPMMNIX.mjs +1459 -0
- package/dist/sdk/chunk-2CPMMNIX.mjs.map +1 -0
- package/dist/sdk/chunk-5LI6T4O3.mjs +3600 -0
- package/dist/sdk/chunk-5LI6T4O3.mjs.map +1 -0
- package/dist/sdk/{chunk-YLQ4UN62.mjs → chunk-A4PGHURG.mjs} +6838 -6257
- package/dist/sdk/chunk-A4PGHURG.mjs.map +1 -0
- package/dist/sdk/chunk-EXFGO4FX.mjs +147 -0
- package/dist/sdk/chunk-EXFGO4FX.mjs.map +1 -0
- package/dist/sdk/chunk-PJ7K5UFC.mjs +17732 -0
- package/dist/sdk/chunk-PJ7K5UFC.mjs.map +1 -0
- package/dist/sdk/{chunk-BHZ4CKUS.mjs → chunk-PXFIALUH.mjs} +77 -8
- package/dist/sdk/chunk-PXFIALUH.mjs.map +1 -0
- package/dist/sdk/{chunk-PVITVJ6J.mjs → chunk-RTKJXNZS.mjs} +32 -9
- package/dist/sdk/chunk-RTKJXNZS.mjs.map +1 -0
- package/dist/sdk/chunk-VW2GBXQT.mjs +606 -0
- package/dist/sdk/chunk-VW2GBXQT.mjs.map +1 -0
- package/dist/sdk/{config-RQQPMLRD.mjs → config-5AUYQFHE.mjs} +2 -2
- package/dist/sdk/config-6CUVEH7H.mjs +16 -0
- package/dist/sdk/config-6CUVEH7H.mjs.map +1 -0
- package/dist/sdk/{github-frontend-6Q4BISZX.mjs → github-frontend-BZ4N3BFZ.mjs} +7 -3
- package/dist/sdk/github-frontend-BZ4N3BFZ.mjs.map +1 -0
- package/dist/sdk/host-4MT3EW2I.mjs +52 -0
- package/dist/sdk/{host-P5NQICP7.mjs → host-NYWXLIFC.mjs} +2 -2
- package/dist/sdk/host-NYWXLIFC.mjs.map +1 -0
- package/dist/sdk/{routing-DEY2AIXM.mjs → routing-6R42GXUO.mjs} +2 -2
- package/dist/sdk/routing-6R42GXUO.mjs.map +1 -0
- package/dist/sdk/routing-7FXPULTO.mjs +24 -0
- package/dist/sdk/routing-7FXPULTO.mjs.map +1 -0
- package/dist/sdk/sdk.d.mts +3 -1
- package/dist/sdk/sdk.d.ts +3 -1
- package/dist/sdk/sdk.js +12163 -11204
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +14 -10
- package/dist/sdk/sdk.mjs.map +1 -1
- package/dist/sdk/slack-frontend-JUT3TYVC.mjs +821 -0
- package/dist/sdk/slack-frontend-JUT3TYVC.mjs.map +1 -0
- package/dist/sdk/workflow-check-provider-H3CUOLUD.mjs +28 -0
- package/dist/sdk/workflow-check-provider-H3CUOLUD.mjs.map +1 -0
- package/dist/sdk/workflow-check-provider-YUNNF4KC.mjs +28 -0
- package/dist/sdk/workflow-check-provider-YUNNF4KC.mjs.map +1 -0
- package/dist/sdk/workflow-registry-KFWSDSLM.mjs +12 -0
- package/dist/sdk/workflow-registry-KFWSDSLM.mjs.map +1 -0
- package/dist/slack/socket-runner.d.ts +2 -0
- package/dist/slack/socket-runner.d.ts.map +1 -1
- package/dist/state-machine/context/workflow-inputs.d.ts +20 -0
- package/dist/state-machine/context/workflow-inputs.d.ts.map +1 -0
- package/dist/state-machine/dispatch/execution-invoker.d.ts.map +1 -1
- package/dist/state-machine/dispatch/foreach-processor.d.ts.map +1 -1
- package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -1
- package/dist/state-machine/states/level-dispatch.d.ts.map +1 -1
- package/dist/state-machine/states/routing.d.ts +2 -1
- package/dist/state-machine/states/routing.d.ts.map +1 -1
- package/dist/traces/{run-2026-01-28T16-15-24-569Z.ndjson → run-2026-01-31T16-37-22-321Z.ndjson} +84 -84
- package/dist/traces/{run-2026-01-28T16-16-09-757Z.ndjson → run-2026-01-31T16-38-06-031Z.ndjson} +1013 -1013
- package/dist/types/config.d.ts +3 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/human-id.d.ts +12 -0
- package/dist/utils/human-id.d.ts.map +1 -0
- package/dist/utils/worktree-manager.d.ts +3 -0
- package/dist/utils/worktree-manager.d.ts.map +1 -1
- package/dist/workflow-executor.d.ts.map +1 -1
- package/dist/workflow-registry.d.ts +1 -0
- package/dist/workflow-registry.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/sdk/chunk-BHZ4CKUS.mjs.map +0 -1
- package/dist/sdk/chunk-PVITVJ6J.mjs.map +0 -1
- package/dist/sdk/chunk-YLQ4UN62.mjs.map +0 -1
- package/dist/sdk/github-frontend-6Q4BISZX.mjs.map +0 -1
- /package/dist/sdk/{check-provider-registry-AQ3JETBG.mjs.map → check-provider-registry-3KI5RKXT.mjs.map} +0 -0
- /package/dist/sdk/{config-RQQPMLRD.mjs.map → check-provider-registry-IYILYY35.mjs.map} +0 -0
- /package/dist/sdk/{routing-DEY2AIXM.mjs.map → config-5AUYQFHE.mjs.map} +0 -0
- /package/dist/sdk/{host-P5NQICP7.mjs.map → host-4MT3EW2I.mjs.map} +0 -0
|
@@ -0,0 +1,696 @@
|
|
|
1
|
+
# Noop Provider
|
|
2
|
+
|
|
3
|
+
The `noop` (no-operation) provider is a utility provider that does not perform any analysis or execution. It is designed for workflow orchestration, flow control, and dependency coordination.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The noop provider serves as a structural element in workflows where you need:
|
|
8
|
+
|
|
9
|
+
- **Command orchestration**: Trigger multiple checks through dependencies without performing analysis
|
|
10
|
+
- **Flow control hubs**: Create synchronization points in complex workflows
|
|
11
|
+
- **Conditional routing**: Make routing decisions based on upstream outputs
|
|
12
|
+
- **Output aggregation**: Wait for multiple parallel checks to complete before continuing
|
|
13
|
+
- **Quality gates**: Validate workflow state and fail conditionally
|
|
14
|
+
|
|
15
|
+
Since noop checks always succeed (unless `fail_if` is specified), they are ideal for control flow without side effects.
|
|
16
|
+
|
|
17
|
+
## Configuration
|
|
18
|
+
|
|
19
|
+
### Basic Usage
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
steps:
|
|
23
|
+
sync-point:
|
|
24
|
+
type: noop
|
|
25
|
+
depends_on: [check-a, check-b, check-c]
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Full Configuration Options
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
steps:
|
|
32
|
+
orchestration-hub:
|
|
33
|
+
type: noop
|
|
34
|
+
|
|
35
|
+
# Standard check options
|
|
36
|
+
depends_on: [upstream-check-1, upstream-check-2]
|
|
37
|
+
on: [pr_opened, pr_updated]
|
|
38
|
+
if: "conditions.are_met"
|
|
39
|
+
group: orchestration
|
|
40
|
+
tags: ["workflow", "sync"]
|
|
41
|
+
|
|
42
|
+
# Conditional failure
|
|
43
|
+
fail_if: |
|
|
44
|
+
// JavaScript expression returning boolean
|
|
45
|
+
return outputs['upstream-check'].failed === true;
|
|
46
|
+
|
|
47
|
+
# Lifecycle hooks for routing
|
|
48
|
+
on_success:
|
|
49
|
+
run: [next-step-1, next-step-2]
|
|
50
|
+
goto: previous-step
|
|
51
|
+
goto_event: pr_updated
|
|
52
|
+
goto_js: |
|
|
53
|
+
return outputs.history['sync-point'].length === 1 ? 'start' : null;
|
|
54
|
+
transitions:
|
|
55
|
+
- when: "outputs['score'].value >= 90"
|
|
56
|
+
to: fast-path
|
|
57
|
+
- when: "true"
|
|
58
|
+
to: standard-path
|
|
59
|
+
|
|
60
|
+
on_fail:
|
|
61
|
+
run: [error-handler]
|
|
62
|
+
retry:
|
|
63
|
+
max: 2
|
|
64
|
+
backoff:
|
|
65
|
+
mode: exponential
|
|
66
|
+
delay_ms: 1000
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Supported Configuration Keys
|
|
70
|
+
|
|
71
|
+
| Key | Type | Description |
|
|
72
|
+
|-----|------|-------------|
|
|
73
|
+
| `type` | string | Must be `"noop"` |
|
|
74
|
+
| `command` | string | Optional command trigger (e.g., `/review`) |
|
|
75
|
+
| `depends_on` | array | Steps that must complete before this runs |
|
|
76
|
+
| `on` | array | Events that trigger this check |
|
|
77
|
+
| `if` | string | Conditional expression for execution |
|
|
78
|
+
| `fail_if` | string | JavaScript expression that causes failure when true |
|
|
79
|
+
| `group` | string | Group for output organization |
|
|
80
|
+
| `tags` | array | Tags for filtering and categorization |
|
|
81
|
+
| `on_success` | object | Routing actions when check succeeds |
|
|
82
|
+
| `on_fail` | object | Routing actions when check fails |
|
|
83
|
+
|
|
84
|
+
## Use Cases
|
|
85
|
+
|
|
86
|
+
### 1. Flow Control Hub
|
|
87
|
+
|
|
88
|
+
Create a synchronization point that waits for multiple parallel checks to complete:
|
|
89
|
+
|
|
90
|
+
```yaml
|
|
91
|
+
steps:
|
|
92
|
+
# Parallel checks
|
|
93
|
+
security-scan:
|
|
94
|
+
type: ai
|
|
95
|
+
prompt: Scan for security issues
|
|
96
|
+
|
|
97
|
+
performance-check:
|
|
98
|
+
type: ai
|
|
99
|
+
prompt: Analyze performance
|
|
100
|
+
|
|
101
|
+
style-review:
|
|
102
|
+
type: ai
|
|
103
|
+
prompt: Check code style
|
|
104
|
+
|
|
105
|
+
# Synchronization point - waits for all parallel checks
|
|
106
|
+
all-checks-complete:
|
|
107
|
+
type: noop
|
|
108
|
+
depends_on: [security-scan, performance-check, style-review]
|
|
109
|
+
|
|
110
|
+
# Continues after all checks complete
|
|
111
|
+
generate-summary:
|
|
112
|
+
type: ai
|
|
113
|
+
depends_on: [all-checks-complete]
|
|
114
|
+
prompt: |
|
|
115
|
+
Summarize findings from:
|
|
116
|
+
- Security: {{ outputs['security-scan'] | json }}
|
|
117
|
+
- Performance: {{ outputs['performance-check'] | json }}
|
|
118
|
+
- Style: {{ outputs['style-review'] | json }}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### 2. Conditional Routing
|
|
122
|
+
|
|
123
|
+
Use noop with `on_success.transitions` for declarative routing decisions:
|
|
124
|
+
|
|
125
|
+
```yaml
|
|
126
|
+
steps:
|
|
127
|
+
analyze-pr:
|
|
128
|
+
type: ai
|
|
129
|
+
prompt: Analyze this PR and provide a risk score (0-100)
|
|
130
|
+
transform_js: "JSON.parse(output)"
|
|
131
|
+
|
|
132
|
+
route-by-risk:
|
|
133
|
+
type: noop
|
|
134
|
+
depends_on: [analyze-pr]
|
|
135
|
+
on_success:
|
|
136
|
+
transitions:
|
|
137
|
+
- when: "outputs['analyze-pr'].risk_score >= 80"
|
|
138
|
+
to: detailed-security-review
|
|
139
|
+
- when: "outputs['analyze-pr'].risk_score >= 50"
|
|
140
|
+
to: standard-review
|
|
141
|
+
- when: "true"
|
|
142
|
+
to: quick-approve
|
|
143
|
+
|
|
144
|
+
detailed-security-review:
|
|
145
|
+
type: ai
|
|
146
|
+
prompt: Perform detailed security analysis
|
|
147
|
+
on: [] # Only triggered via routing
|
|
148
|
+
|
|
149
|
+
standard-review:
|
|
150
|
+
type: ai
|
|
151
|
+
prompt: Perform standard code review
|
|
152
|
+
on: []
|
|
153
|
+
|
|
154
|
+
quick-approve:
|
|
155
|
+
type: command
|
|
156
|
+
exec: echo "Low risk - approved"
|
|
157
|
+
on: []
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### 3. Output Aggregation
|
|
161
|
+
|
|
162
|
+
Collect results from multiple sources before proceeding:
|
|
163
|
+
|
|
164
|
+
```yaml
|
|
165
|
+
steps:
|
|
166
|
+
# Multiple analysis checks run in parallel
|
|
167
|
+
lint-js:
|
|
168
|
+
type: command
|
|
169
|
+
exec: eslint src/ --format json
|
|
170
|
+
transform_js: JSON.parse(output)
|
|
171
|
+
|
|
172
|
+
lint-css:
|
|
173
|
+
type: command
|
|
174
|
+
exec: stylelint "**/*.css" --formatter json
|
|
175
|
+
transform_js: JSON.parse(output)
|
|
176
|
+
|
|
177
|
+
type-check:
|
|
178
|
+
type: command
|
|
179
|
+
exec: tsc --noEmit --pretty false
|
|
180
|
+
|
|
181
|
+
# Aggregation point
|
|
182
|
+
aggregate-lint-results:
|
|
183
|
+
type: noop
|
|
184
|
+
depends_on: [lint-js, lint-css, type-check]
|
|
185
|
+
|
|
186
|
+
# Access all results through outputs
|
|
187
|
+
report-issues:
|
|
188
|
+
type: log
|
|
189
|
+
depends_on: [aggregate-lint-results]
|
|
190
|
+
message: |
|
|
191
|
+
## Lint Results
|
|
192
|
+
|
|
193
|
+
**JavaScript Issues:** {{ outputs['lint-js'] | size }}
|
|
194
|
+
**CSS Issues:** {{ outputs['lint-css'] | size }}
|
|
195
|
+
**Type Errors:** {{ outputs['type-check'].exitCode == 0 | default: "None" }}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### 4. Workflow Synchronization Points
|
|
199
|
+
|
|
200
|
+
Create named synchronization points for complex multi-stage workflows:
|
|
201
|
+
|
|
202
|
+
```yaml
|
|
203
|
+
steps:
|
|
204
|
+
# Stage 1: Setup
|
|
205
|
+
checkout:
|
|
206
|
+
type: git-checkout
|
|
207
|
+
ref: "{{ pr.head }}"
|
|
208
|
+
|
|
209
|
+
install-deps:
|
|
210
|
+
type: command
|
|
211
|
+
depends_on: [checkout]
|
|
212
|
+
exec: npm ci
|
|
213
|
+
working_directory: "{{ outputs.checkout.path }}"
|
|
214
|
+
|
|
215
|
+
stage-1-complete:
|
|
216
|
+
type: noop
|
|
217
|
+
depends_on: [install-deps]
|
|
218
|
+
tags: ["stage", "setup"]
|
|
219
|
+
|
|
220
|
+
# Stage 2: Build & Test (parallel)
|
|
221
|
+
build:
|
|
222
|
+
type: command
|
|
223
|
+
depends_on: [stage-1-complete]
|
|
224
|
+
exec: npm run build
|
|
225
|
+
|
|
226
|
+
test-unit:
|
|
227
|
+
type: command
|
|
228
|
+
depends_on: [stage-1-complete]
|
|
229
|
+
exec: npm test
|
|
230
|
+
|
|
231
|
+
test-integration:
|
|
232
|
+
type: command
|
|
233
|
+
depends_on: [stage-1-complete]
|
|
234
|
+
exec: npm run test:integration
|
|
235
|
+
|
|
236
|
+
stage-2-complete:
|
|
237
|
+
type: noop
|
|
238
|
+
depends_on: [build, test-unit, test-integration]
|
|
239
|
+
tags: ["stage", "build-test"]
|
|
240
|
+
|
|
241
|
+
# Stage 3: Deploy
|
|
242
|
+
deploy:
|
|
243
|
+
type: command
|
|
244
|
+
depends_on: [stage-2-complete]
|
|
245
|
+
exec: npm run deploy
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### 5. Quality Gates with fail_if
|
|
249
|
+
|
|
250
|
+
Use noop to enforce quality gates by failing based on upstream results:
|
|
251
|
+
|
|
252
|
+
```yaml
|
|
253
|
+
steps:
|
|
254
|
+
run-tests:
|
|
255
|
+
type: command
|
|
256
|
+
exec: npm test -- --coverage --json
|
|
257
|
+
transform_js: JSON.parse(output)
|
|
258
|
+
|
|
259
|
+
check-coverage:
|
|
260
|
+
type: script
|
|
261
|
+
depends_on: [run-tests]
|
|
262
|
+
content: |
|
|
263
|
+
const coverage = outputs['run-tests'].coveragePercentage;
|
|
264
|
+
return { coverage, threshold: 80 };
|
|
265
|
+
|
|
266
|
+
coverage-gate:
|
|
267
|
+
type: noop
|
|
268
|
+
depends_on: [check-coverage]
|
|
269
|
+
fail_if: |
|
|
270
|
+
const result = outputs['check-coverage'];
|
|
271
|
+
return result.coverage < result.threshold;
|
|
272
|
+
|
|
273
|
+
# Only runs if coverage gate passes
|
|
274
|
+
deploy-preview:
|
|
275
|
+
type: command
|
|
276
|
+
depends_on: [coverage-gate]
|
|
277
|
+
exec: npm run deploy:preview
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### 6. Retry Logic with Memory
|
|
281
|
+
|
|
282
|
+
Combine noop with memory to implement custom retry logic:
|
|
283
|
+
|
|
284
|
+
```yaml
|
|
285
|
+
steps:
|
|
286
|
+
init-retry:
|
|
287
|
+
type: memory
|
|
288
|
+
operation: set
|
|
289
|
+
key: retry_count
|
|
290
|
+
value: 0
|
|
291
|
+
|
|
292
|
+
flaky-operation:
|
|
293
|
+
type: command
|
|
294
|
+
depends_on: [init-retry]
|
|
295
|
+
exec: ./flaky-script.sh
|
|
296
|
+
on_fail:
|
|
297
|
+
run: [increment-retry, check-retry-limit]
|
|
298
|
+
|
|
299
|
+
increment-retry:
|
|
300
|
+
type: memory
|
|
301
|
+
operation: set
|
|
302
|
+
key: retry_count
|
|
303
|
+
value_js: "memory.get('retry_count') + 1"
|
|
304
|
+
|
|
305
|
+
check-retry-limit:
|
|
306
|
+
type: noop
|
|
307
|
+
depends_on: [increment-retry]
|
|
308
|
+
on_success:
|
|
309
|
+
goto_js: |
|
|
310
|
+
const retries = memory.get('retry_count');
|
|
311
|
+
log('Retry attempt:', retries);
|
|
312
|
+
return retries < 3 ? 'flaky-operation' : null;
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### 7. Command Orchestration
|
|
316
|
+
|
|
317
|
+
Use noop to create command-triggered workflows:
|
|
318
|
+
|
|
319
|
+
```yaml
|
|
320
|
+
steps:
|
|
321
|
+
# Triggered by /review comment
|
|
322
|
+
review-command:
|
|
323
|
+
type: noop
|
|
324
|
+
command: /review
|
|
325
|
+
on: [issue_comment]
|
|
326
|
+
on_success:
|
|
327
|
+
run: [security-check, performance-check, style-check]
|
|
328
|
+
|
|
329
|
+
security-check:
|
|
330
|
+
type: ai
|
|
331
|
+
prompt: Security analysis
|
|
332
|
+
on: [] # Only via routing
|
|
333
|
+
|
|
334
|
+
performance-check:
|
|
335
|
+
type: ai
|
|
336
|
+
prompt: Performance analysis
|
|
337
|
+
on: []
|
|
338
|
+
|
|
339
|
+
style-check:
|
|
340
|
+
type: ai
|
|
341
|
+
prompt: Style analysis
|
|
342
|
+
on: []
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### 8. Error Collection and Final Validation
|
|
346
|
+
|
|
347
|
+
Use noop to validate collected errors at the end of a workflow:
|
|
348
|
+
|
|
349
|
+
```yaml
|
|
350
|
+
steps:
|
|
351
|
+
init-errors:
|
|
352
|
+
type: memory
|
|
353
|
+
operation: set
|
|
354
|
+
key: errors
|
|
355
|
+
value: []
|
|
356
|
+
|
|
357
|
+
lint:
|
|
358
|
+
type: command
|
|
359
|
+
depends_on: [init-errors]
|
|
360
|
+
exec: npm run lint
|
|
361
|
+
on_fail:
|
|
362
|
+
run: [collect-lint-error]
|
|
363
|
+
|
|
364
|
+
collect-lint-error:
|
|
365
|
+
type: memory
|
|
366
|
+
operation: append
|
|
367
|
+
key: errors
|
|
368
|
+
value:
|
|
369
|
+
check: lint
|
|
370
|
+
message: "{{ outputs['lint'].stderr }}"
|
|
371
|
+
|
|
372
|
+
test:
|
|
373
|
+
type: command
|
|
374
|
+
depends_on: [init-errors]
|
|
375
|
+
exec: npm test
|
|
376
|
+
on_fail:
|
|
377
|
+
run: [collect-test-error]
|
|
378
|
+
|
|
379
|
+
collect-test-error:
|
|
380
|
+
type: memory
|
|
381
|
+
operation: append
|
|
382
|
+
key: errors
|
|
383
|
+
value:
|
|
384
|
+
check: test
|
|
385
|
+
message: "{{ outputs['test'].stderr }}"
|
|
386
|
+
|
|
387
|
+
# Final validation - fail if any errors collected
|
|
388
|
+
validate-no-errors:
|
|
389
|
+
type: noop
|
|
390
|
+
depends_on: [lint, test]
|
|
391
|
+
fail_if: |
|
|
392
|
+
const errors = memory.get('errors') || [];
|
|
393
|
+
return errors.length > 0;
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
## Integration with Routing
|
|
397
|
+
|
|
398
|
+
The noop provider integrates seamlessly with Visor's routing system. Since it always succeeds (unless `fail_if` triggers), it's ideal for making routing decisions.
|
|
399
|
+
|
|
400
|
+
### Using goto for Re-execution
|
|
401
|
+
|
|
402
|
+
```yaml
|
|
403
|
+
steps:
|
|
404
|
+
generate:
|
|
405
|
+
type: ai
|
|
406
|
+
prompt: Generate code
|
|
407
|
+
|
|
408
|
+
validate:
|
|
409
|
+
type: ai
|
|
410
|
+
depends_on: [generate]
|
|
411
|
+
prompt: Validate the generated code
|
|
412
|
+
transform_js: JSON.parse(output)
|
|
413
|
+
|
|
414
|
+
decide-retry:
|
|
415
|
+
type: noop
|
|
416
|
+
depends_on: [validate]
|
|
417
|
+
on_success:
|
|
418
|
+
goto_js: |
|
|
419
|
+
const result = outputs['validate'];
|
|
420
|
+
const attempts = outputs.history['generate'].length;
|
|
421
|
+
|
|
422
|
+
// Retry up to 3 times if validation fails
|
|
423
|
+
if (!result.valid && attempts < 3) {
|
|
424
|
+
return 'generate';
|
|
425
|
+
}
|
|
426
|
+
return null;
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
### Using transitions for Declarative Routing
|
|
430
|
+
|
|
431
|
+
```yaml
|
|
432
|
+
steps:
|
|
433
|
+
score-pr:
|
|
434
|
+
type: ai
|
|
435
|
+
prompt: Score this PR from 0-100
|
|
436
|
+
transform_js: "({ score: parseInt(output) })"
|
|
437
|
+
|
|
438
|
+
route-by-score:
|
|
439
|
+
type: noop
|
|
440
|
+
depends_on: [score-pr]
|
|
441
|
+
on_success:
|
|
442
|
+
transitions:
|
|
443
|
+
- when: "outputs['score-pr'].score >= 90"
|
|
444
|
+
to: auto-approve
|
|
445
|
+
- when: "outputs['score-pr'].score >= 70"
|
|
446
|
+
to: request-review
|
|
447
|
+
- when: "outputs['score-pr'].score >= 50"
|
|
448
|
+
to: request-changes
|
|
449
|
+
- when: "true"
|
|
450
|
+
to: block-merge
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### Using run for Triggering Multiple Steps
|
|
454
|
+
|
|
455
|
+
```yaml
|
|
456
|
+
steps:
|
|
457
|
+
analyze:
|
|
458
|
+
type: ai
|
|
459
|
+
prompt: Analyze code and categorize issues
|
|
460
|
+
transform_js: JSON.parse(output)
|
|
461
|
+
|
|
462
|
+
dispatch-handlers:
|
|
463
|
+
type: noop
|
|
464
|
+
depends_on: [analyze]
|
|
465
|
+
on_success:
|
|
466
|
+
run_js: |
|
|
467
|
+
const analysis = outputs['analyze'];
|
|
468
|
+
const handlers = [];
|
|
469
|
+
|
|
470
|
+
if (analysis.hasSecurityIssues) handlers.push('handle-security');
|
|
471
|
+
if (analysis.hasPerformanceIssues) handlers.push('handle-performance');
|
|
472
|
+
if (analysis.hasStyleIssues) handlers.push('handle-style');
|
|
473
|
+
|
|
474
|
+
return handlers;
|
|
475
|
+
|
|
476
|
+
handle-security:
|
|
477
|
+
type: ai
|
|
478
|
+
prompt: Detail security issues
|
|
479
|
+
on: []
|
|
480
|
+
|
|
481
|
+
handle-performance:
|
|
482
|
+
type: ai
|
|
483
|
+
prompt: Detail performance issues
|
|
484
|
+
on: []
|
|
485
|
+
|
|
486
|
+
handle-style:
|
|
487
|
+
type: ai
|
|
488
|
+
prompt: Detail style issues
|
|
489
|
+
on: []
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
## Integration with Lifecycle Hooks
|
|
493
|
+
|
|
494
|
+
Noop checks support all lifecycle hooks:
|
|
495
|
+
|
|
496
|
+
### on_init
|
|
497
|
+
|
|
498
|
+
```yaml
|
|
499
|
+
steps:
|
|
500
|
+
orchestrator:
|
|
501
|
+
type: noop
|
|
502
|
+
on_init:
|
|
503
|
+
run:
|
|
504
|
+
- tool: fetch-config
|
|
505
|
+
as: config
|
|
506
|
+
on_success:
|
|
507
|
+
run_js: |
|
|
508
|
+
const config = outputs['config'];
|
|
509
|
+
return config.enabledChecks || [];
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
### on_success / on_fail
|
|
513
|
+
|
|
514
|
+
```yaml
|
|
515
|
+
steps:
|
|
516
|
+
quality-gate:
|
|
517
|
+
type: noop
|
|
518
|
+
depends_on: [all-checks]
|
|
519
|
+
fail_if: "outputs['all-checks'].failed"
|
|
520
|
+
|
|
521
|
+
on_success:
|
|
522
|
+
run: [notify-success, deploy]
|
|
523
|
+
|
|
524
|
+
on_fail:
|
|
525
|
+
run: [notify-failure]
|
|
526
|
+
goto: retry-point
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
## Best Practices
|
|
530
|
+
|
|
531
|
+
### 1. Use Descriptive Names
|
|
532
|
+
|
|
533
|
+
Name noop checks to describe their purpose in the workflow:
|
|
534
|
+
|
|
535
|
+
```yaml
|
|
536
|
+
steps:
|
|
537
|
+
# Good - describes the purpose
|
|
538
|
+
all-validations-complete:
|
|
539
|
+
type: noop
|
|
540
|
+
|
|
541
|
+
quality-gate-passed:
|
|
542
|
+
type: noop
|
|
543
|
+
|
|
544
|
+
# Avoid generic names
|
|
545
|
+
sync:
|
|
546
|
+
type: noop
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
### 2. Use Tags for Organization
|
|
550
|
+
|
|
551
|
+
Tag noop checks for filtering and documentation:
|
|
552
|
+
|
|
553
|
+
```yaml
|
|
554
|
+
steps:
|
|
555
|
+
stage-1-complete:
|
|
556
|
+
type: noop
|
|
557
|
+
tags: ["stage", "setup", "sync-point"]
|
|
558
|
+
|
|
559
|
+
stage-2-complete:
|
|
560
|
+
type: noop
|
|
561
|
+
tags: ["stage", "build", "sync-point"]
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
### 3. Document Complex Routing Logic
|
|
565
|
+
|
|
566
|
+
Add comments explaining routing decisions:
|
|
567
|
+
|
|
568
|
+
```yaml
|
|
569
|
+
steps:
|
|
570
|
+
route-decision:
|
|
571
|
+
type: noop
|
|
572
|
+
depends_on: [analysis]
|
|
573
|
+
on_success:
|
|
574
|
+
# Route based on risk level:
|
|
575
|
+
# - High risk (>=80): Full security review
|
|
576
|
+
# - Medium risk (50-79): Standard review
|
|
577
|
+
# - Low risk (<50): Auto-approve
|
|
578
|
+
transitions:
|
|
579
|
+
- when: "outputs['analysis'].risk >= 80"
|
|
580
|
+
to: security-review
|
|
581
|
+
- when: "outputs['analysis'].risk >= 50"
|
|
582
|
+
to: standard-review
|
|
583
|
+
- when: "true"
|
|
584
|
+
to: auto-approve
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
### 4. Keep fail_if Expressions Simple
|
|
588
|
+
|
|
589
|
+
Complex validation logic should be in a script check:
|
|
590
|
+
|
|
591
|
+
```yaml
|
|
592
|
+
steps:
|
|
593
|
+
# Good - simple fail_if
|
|
594
|
+
gate:
|
|
595
|
+
type: noop
|
|
596
|
+
fail_if: "outputs['validate'].passed === false"
|
|
597
|
+
|
|
598
|
+
# Better for complex logic - use script
|
|
599
|
+
complex-validation:
|
|
600
|
+
type: script
|
|
601
|
+
content: |
|
|
602
|
+
const results = outputs['checks'];
|
|
603
|
+
const hasBlockers = results.some(r => r.severity === 'blocker');
|
|
604
|
+
const failCount = results.filter(r => !r.passed).length;
|
|
605
|
+
return { shouldFail: hasBlockers || failCount > 5 };
|
|
606
|
+
|
|
607
|
+
gate:
|
|
608
|
+
type: noop
|
|
609
|
+
depends_on: [complex-validation]
|
|
610
|
+
fail_if: "outputs['complex-validation'].shouldFail"
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
### 5. Use noop for Aggregation Points in Workflows
|
|
614
|
+
|
|
615
|
+
When creating reusable workflows, use noop to define clear aggregation points:
|
|
616
|
+
|
|
617
|
+
```yaml
|
|
618
|
+
# In workflow file
|
|
619
|
+
steps:
|
|
620
|
+
check-1:
|
|
621
|
+
type: ai
|
|
622
|
+
prompt: First check
|
|
623
|
+
|
|
624
|
+
check-2:
|
|
625
|
+
type: ai
|
|
626
|
+
prompt: Second check
|
|
627
|
+
|
|
628
|
+
check-3:
|
|
629
|
+
type: ai
|
|
630
|
+
prompt: Third check
|
|
631
|
+
|
|
632
|
+
# Clear aggregation point for workflow consumers
|
|
633
|
+
aggregate-results:
|
|
634
|
+
type: noop
|
|
635
|
+
depends_on: [check-1, check-2, check-3]
|
|
636
|
+
# Workflow outputs reference this point
|
|
637
|
+
|
|
638
|
+
outputs:
|
|
639
|
+
- name: all_complete
|
|
640
|
+
value_js: "true" # Signals all checks completed
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
## Troubleshooting
|
|
644
|
+
|
|
645
|
+
### Problem: Noop Check Not Running
|
|
646
|
+
|
|
647
|
+
**Solution**: Check that dependencies are met and event triggers match:
|
|
648
|
+
|
|
649
|
+
```yaml
|
|
650
|
+
steps:
|
|
651
|
+
my-noop:
|
|
652
|
+
type: noop
|
|
653
|
+
depends_on: [upstream] # Ensure upstream exists and succeeds
|
|
654
|
+
on: [pr_opened] # Ensure event matches
|
|
655
|
+
if: "true" # Check conditional
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
### Problem: fail_if Not Triggering
|
|
659
|
+
|
|
660
|
+
**Solution**: Verify the JavaScript expression and output access:
|
|
661
|
+
|
|
662
|
+
```yaml
|
|
663
|
+
steps:
|
|
664
|
+
debug-gate:
|
|
665
|
+
type: noop
|
|
666
|
+
fail_if: |
|
|
667
|
+
// Add logging to debug
|
|
668
|
+
log('Outputs:', JSON.stringify(outputs['check']));
|
|
669
|
+
return outputs['check']?.failed === true;
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
### Problem: Routing Not Working
|
|
673
|
+
|
|
674
|
+
**Solution**: Check that target steps have `on: []` to be routing-only:
|
|
675
|
+
|
|
676
|
+
```yaml
|
|
677
|
+
steps:
|
|
678
|
+
router:
|
|
679
|
+
type: noop
|
|
680
|
+
on_success:
|
|
681
|
+
run: [target-step]
|
|
682
|
+
|
|
683
|
+
target-step:
|
|
684
|
+
type: command
|
|
685
|
+
exec: echo "routed"
|
|
686
|
+
on: [] # Required for routing-only steps
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
## Related Documentation
|
|
690
|
+
|
|
691
|
+
- [Lifecycle Hooks](../lifecycle-hooks.md) - on_init, on_success, on_fail, on_finish hooks
|
|
692
|
+
- [Failure Routing](../failure-routing.md) - Routing and retry configuration
|
|
693
|
+
- [Workflows](../workflows.md) - Creating reusable workflows
|
|
694
|
+
- [Memory](../memory.md) - Persistent state across checks
|
|
695
|
+
- [Dependencies](../dependencies.md) - Dependency configuration
|
|
696
|
+
- [Configuration](../configuration.md) - Full configuration reference
|