@probelabs/visor 0.1.89 → 0.1.92

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 (133) hide show
  1. package/README.md +68 -2
  2. package/action.yml +1 -1
  3. package/defaults/.visor.yaml +120 -154
  4. package/dist/13.index.js +82 -0
  5. package/dist/159.index.js +38 -0
  6. package/dist/168.index.js +82 -0
  7. package/dist/201.index.js +82 -0
  8. package/dist/262.index.js +48 -0
  9. package/dist/272.index.js +82 -0
  10. package/dist/273.index.js +48 -0
  11. package/dist/320.index.js +38 -0
  12. package/dist/34.index.js +81 -0
  13. package/dist/421.index.js +48 -0
  14. package/dist/437.index.js +82 -0
  15. package/dist/441.index.js +81 -0
  16. package/dist/450.index.js +82 -0
  17. package/dist/54.index.js +81 -0
  18. package/dist/544.index.js +38 -0
  19. package/dist/558.index.js +82 -0
  20. package/dist/715.index.js +38 -0
  21. package/dist/737.index.js +82 -0
  22. package/dist/834.index.js +48 -0
  23. package/dist/85.index.js +82 -0
  24. package/dist/861.index.js +48 -0
  25. package/dist/878.index.js +81 -0
  26. package/dist/940.index.js +38 -0
  27. package/dist/989.index.js +81 -0
  28. package/dist/996.index.js +82 -0
  29. package/dist/ai-review-service.d.ts +11 -1
  30. package/dist/ai-review-service.d.ts.map +1 -1
  31. package/dist/check-execution-engine.d.ts +12 -2
  32. package/dist/check-execution-engine.d.ts.map +1 -1
  33. package/dist/cli-main.d.ts.map +1 -1
  34. package/dist/cli.d.ts.map +1 -1
  35. package/dist/config.d.ts.map +1 -1
  36. package/dist/defaults/.visor.yaml +120 -154
  37. package/dist/failure-condition-evaluator.d.ts +4 -2
  38. package/dist/failure-condition-evaluator.d.ts.map +1 -1
  39. package/dist/generated/config-schema.d.ts +89 -2
  40. package/dist/generated/config-schema.d.ts.map +1 -1
  41. package/dist/generated/config-schema.json +109 -1
  42. package/dist/git-repository-analyzer.d.ts +17 -1
  43. package/dist/git-repository-analyzer.d.ts.map +1 -1
  44. package/dist/github-comments.d.ts.map +1 -1
  45. package/dist/github-reactions.d.ts +36 -0
  46. package/dist/github-reactions.d.ts.map +1 -0
  47. package/dist/index.d.ts +2 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +174591 -45945
  50. package/dist/liquid-extensions.d.ts +3 -0
  51. package/dist/liquid-extensions.d.ts.map +1 -1
  52. package/dist/logger.d.ts.map +1 -1
  53. package/dist/memory-store.d.ts +129 -0
  54. package/dist/memory-store.d.ts.map +1 -0
  55. package/dist/output/issue-assistant/schema.json +29 -0
  56. package/dist/output/issue-assistant/template.liquid +1 -0
  57. package/dist/output/overview/schema.json +33 -0
  58. package/dist/output/overview/template.liquid +16 -0
  59. package/dist/output-formatters.d.ts +1 -0
  60. package/dist/output-formatters.d.ts.map +1 -1
  61. package/dist/pr-analyzer.d.ts +2 -0
  62. package/dist/pr-analyzer.d.ts.map +1 -1
  63. package/dist/proto/channelz.proto +564 -0
  64. package/dist/providers/check-provider-registry.d.ts.map +1 -1
  65. package/dist/providers/command-check-provider.d.ts +2 -0
  66. package/dist/providers/command-check-provider.d.ts.map +1 -1
  67. package/dist/providers/github-ops-provider.d.ts +18 -0
  68. package/dist/providers/github-ops-provider.d.ts.map +1 -0
  69. package/dist/providers/memory-check-provider.d.ts +56 -0
  70. package/dist/providers/memory-check-provider.d.ts.map +1 -0
  71. package/dist/reviewer.d.ts +2 -0
  72. package/dist/reviewer.d.ts.map +1 -1
  73. package/dist/sdk/check-execution-engine-L73PFZQY.mjs +11 -0
  74. package/dist/sdk/chunk-2U6BIWSY.mjs +748 -0
  75. package/dist/sdk/chunk-2U6BIWSY.mjs.map +1 -0
  76. package/dist/sdk/chunk-KVHVCGY6.mjs +103 -0
  77. package/dist/sdk/chunk-KVHVCGY6.mjs.map +1 -0
  78. package/dist/sdk/{chunk-N34GS4A5.mjs → chunk-LJHRU3WQ.mjs} +4065 -473
  79. package/dist/sdk/chunk-LJHRU3WQ.mjs.map +1 -0
  80. package/dist/sdk/chunk-TWJKAYT6.mjs +1124 -0
  81. package/dist/sdk/chunk-TWJKAYT6.mjs.map +1 -0
  82. package/dist/sdk/liquid-extensions-AFKRYROF.mjs +14 -0
  83. package/dist/sdk/mermaid-telemetry-LZGDD35I.mjs +61 -0
  84. package/dist/sdk/mermaid-telemetry-LZGDD35I.mjs.map +1 -0
  85. package/dist/sdk/sdk.d.mts +48 -2
  86. package/dist/sdk/sdk.d.ts +48 -2
  87. package/dist/sdk/sdk.js +6651 -811
  88. package/dist/sdk/sdk.js.map +1 -1
  89. package/dist/sdk/sdk.mjs +114 -7
  90. package/dist/sdk/sdk.mjs.map +1 -1
  91. package/dist/sdk/tracer-init-O7RLXMJ3.mjs +10 -0
  92. package/dist/sdk/tracer-init-O7RLXMJ3.mjs.map +1 -0
  93. package/dist/session-registry.d.ts +19 -5
  94. package/dist/session-registry.d.ts.map +1 -1
  95. package/dist/telemetry/fallback-ndjson.d.ts +7 -0
  96. package/dist/telemetry/fallback-ndjson.d.ts.map +1 -0
  97. package/dist/telemetry/file-span-exporter.d.ts +17 -0
  98. package/dist/telemetry/file-span-exporter.d.ts.map +1 -0
  99. package/dist/telemetry/metrics.d.ts +13 -0
  100. package/dist/telemetry/metrics.d.ts.map +1 -0
  101. package/dist/telemetry/opentelemetry.d.ts +26 -0
  102. package/dist/telemetry/opentelemetry.d.ts.map +1 -0
  103. package/dist/telemetry/trace-helpers.d.ts +9 -0
  104. package/dist/telemetry/trace-helpers.d.ts.map +1 -0
  105. package/dist/telemetry/trace-report-exporter.d.ts +17 -0
  106. package/dist/telemetry/trace-report-exporter.d.ts.map +1 -0
  107. package/dist/traces/run-2025-10-15T07-21-47-696Z.ndjson +17 -0
  108. package/dist/traces/run-2025-10-15T07-21-58-106Z.ndjson +17 -0
  109. package/dist/traces/run-2025-10-15T07-21-58-693Z.ndjson +17 -0
  110. package/dist/traces/run-2025-10-15T07-21-59-167Z.ndjson +17 -0
  111. package/dist/traces/run-2025-10-15T07-21-59-629Z.ndjson +8 -0
  112. package/dist/types/cli.d.ts +4 -0
  113. package/dist/types/cli.d.ts.map +1 -1
  114. package/dist/types/config.d.ts +56 -2
  115. package/dist/types/config.d.ts.map +1 -1
  116. package/dist/utils/author-permissions.d.ts +74 -0
  117. package/dist/utils/author-permissions.d.ts.map +1 -0
  118. package/dist/utils/head-sha.d.ts +8 -0
  119. package/dist/utils/head-sha.d.ts.map +1 -0
  120. package/dist/utils/mermaid-telemetry.d.ts +3 -0
  121. package/dist/utils/mermaid-telemetry.d.ts.map +1 -0
  122. package/dist/utils/tracer-init.d.ts +12 -0
  123. package/dist/utils/tracer-init.d.ts.map +1 -0
  124. package/dist/utils/ui-helpers.d.ts +3 -0
  125. package/dist/utils/ui-helpers.d.ts.map +1 -0
  126. package/package.json +3 -3
  127. package/dist/sdk/check-execution-engine-D6FPIIKR.mjs +0 -9
  128. package/dist/sdk/chunk-FIL2OGF6.mjs +0 -68
  129. package/dist/sdk/chunk-FIL2OGF6.mjs.map +0 -1
  130. package/dist/sdk/chunk-N34GS4A5.mjs.map +0 -1
  131. package/dist/sdk/liquid-extensions-KDECAJTV.mjs +0 -12
  132. /package/dist/sdk/{check-execution-engine-D6FPIIKR.mjs.map → check-execution-engine-L73PFZQY.mjs.map} +0 -0
  133. /package/dist/sdk/{liquid-extensions-KDECAJTV.mjs.map → liquid-extensions-AFKRYROF.mjs.map} +0 -0
package/README.md CHANGED
@@ -88,12 +88,26 @@ Tip: Pin releases for stability, e.g. `uses: probelabs/visor@v1`.
88
88
  Short cheatsheet for common tasks:
89
89
 
90
90
  ```bash
91
+ # Validate configuration before running checks
92
+ visor validate # Search for .visor.yaml in current directory
93
+ visor validate --config .visor.yaml # Validate specific config file
94
+
91
95
  # Run all checks with a table output
92
96
  visor --check all --output table
93
97
 
94
98
  # Filter by tags (e.g., fast/local) and increase parallelism
95
99
  visor --tags fast,local --max-parallelism 5
96
100
 
101
+ # Analyze full PR diff vs base branch (like GitHub Actions does)
102
+ # Auto-enabled for code-review schemas, or force with --analyze-branch-diff
103
+ visor --analyze-branch-diff # Analyzes diff vs main/master branch
104
+ visor --check security --analyze-branch-diff # Specific checks on branch diff
105
+
106
+ # Simulate GitHub events for event-based check filtering
107
+ visor --event pr_updated # Run checks triggered by PR updates (auto for code-review)
108
+ visor --event issue_opened # Run checks triggered by new issues
109
+ visor --event all # Run all checks regardless of event filters (default)
110
+
97
111
  # Emit machine‑readable results and save to a file
98
112
  visor --check security --output json --output-file visor-results.json
99
113
 
@@ -116,7 +130,7 @@ Additional guides:
116
130
  - Schema – JSON shape checks return (e.g., `code-review`).
117
131
  - Template – renders results (tables/markdown).
118
132
  - Group – which comment a check is posted into.
119
- - Provider – how a check runs (`ai`, `http`, `command`, `claude-code`).
133
+ - Provider – how a check runs (`ai`, `http`, `http_client`, `command`, `log`, `github`, `claude-code`).
120
134
  - Dependencies – `depends_on` controls order; independents run in parallel.
121
135
  - Tags – label checks (`fast`, `local`, `comprehensive`) and filter with `--tags`.
122
136
  - Events – PRs, issues, `/review` comments, webhooks, or cron schedules.
@@ -153,6 +167,7 @@ Visor is a general SDLC automation framework:
153
167
  - [Step Dependencies & Intelligent Execution](#-step-dependencies--intelligent-execution)
154
168
  - [Failure Routing (Auto-fix Loops)](#-failure-routing-auto-fix-loops)
155
169
  - [Claude Code Provider](#-claude-code-provider)
170
+ - [GitHub Provider](#-github-provider)
156
171
  - [AI Session Reuse](#-ai-session-reuse)
157
172
  - [Schema-Template System](#-schema-template-system)
158
173
  - [Enhanced Prompts](#-enhanced-prompts)
@@ -174,9 +189,10 @@ Visor is a general SDLC automation framework:
174
189
  - Structured outputs: JSON Schema validation drives deterministic rendering, annotations, and SARIF.
175
190
  - Orchestrated pipelines: Dependencies, parallelism, and tag‑based profiles; run in Actions or any CI.
176
191
  - Multi‑provider AI: Google Gemini, Anthropic Claude, OpenAI, AWS Bedrock — plus MCP tools and Claude Code SDK.
192
+ - Author permissions: Built-in functions to customize workflows based on contributor trust level (owner, member, collaborator, etc).
177
193
  - Assistants & commands: `/review` to rerun checks, `/visor …` for Q&A, predictable comment groups.
178
194
  - HTTP & schedules: Receive webhooks, call external APIs, and run cron‑scheduled audits and reports.
179
- - Extensible providers: `ai`, `http`, `http_client`, `log`, `command`, `claude-code` — or add your own.
195
+ - Extensible providers: `ai`, `http`, `http_client`, `log`, `command`, `github`, `claude-code` — or add your own.
180
196
  - Security by default: GitHub App support, scoped tokens, remote‑extends allowlist, opt‑in network usage.
181
197
  - Observability & control: JSON/SARIF outputs, fail‑fast and timeouts, parallelism and cost control.
182
198
 
@@ -232,6 +248,37 @@ Examples:
232
248
 
233
249
  Learn more: [docs/commands.md](docs/commands.md)
234
250
 
251
+ ## 🔐 Author Permissions
252
+
253
+ Customize workflows based on PR author's permission level using built-in functions in JavaScript expressions:
254
+
255
+ ```yaml
256
+ checks:
257
+ # Run security scan only for external contributors
258
+ security-scan:
259
+ type: command
260
+ exec: npm run security:full
261
+ if: "!hasMinPermission('MEMBER')"
262
+
263
+ # Auto-approve PRs from collaborators
264
+ auto-approve:
265
+ type: command
266
+ exec: gh pr review --approve
267
+ if: "hasMinPermission('COLLABORATOR') && totalIssues === 0"
268
+
269
+ # Block sensitive file changes from non-members
270
+ protect-secrets:
271
+ type: command
272
+ exec: echo "Checking permissions..."
273
+ fail_if: "!isMember() && files.some(f => f.filename.startsWith('secrets/'))"
274
+ ```
275
+
276
+ **Available functions:**
277
+ - `hasMinPermission(level)` - Check if author has >= permission level
278
+ - `isOwner()`, `isMember()`, `isCollaborator()`, `isContributor()`, `isFirstTimer()` - Boolean checks
279
+
280
+ Learn more: [docs/author-permissions.md](docs/author-permissions.md)
281
+
235
282
  ## 🔇 Suppressing Warnings
236
283
 
237
284
  Suppress a specific issue by adding a nearby `visor-disable` comment.
@@ -624,3 +671,22 @@ MIT License — see [LICENSE](LICENSE)
624
671
  <div align="center">
625
672
  Made with ❤️ by <a href="https://probelabs.com">Probe Labs</a>
626
673
  </div>
674
+ ## 🧰 GitHub Provider
675
+
676
+ Use the native GitHub provider for safe labels and comments without invoking the `gh` CLI.
677
+
678
+ Example — apply overview‑derived labels to a PR:
679
+
680
+ ```yaml
681
+ checks:
682
+ apply-overview-labels:
683
+ type: github
684
+ op: labels.add
685
+ values:
686
+ - "{{ outputs.overview.tags.label | default: '' | safe_label }}"
687
+ - "{{ outputs.overview.tags['review-effort'] | default: '' | prepend: 'review/effort:' | safe_label }}"
688
+ value_js: |
689
+ return values.filter(v => typeof v === 'string' && v.trim().length > 0);
690
+ ```
691
+
692
+ See docs: docs/github-ops.md
package/action.yml CHANGED
@@ -100,7 +100,7 @@ inputs:
100
100
  tags:
101
101
  description: 'Include checks with these tags (comma-separated)'
102
102
  required: false
103
- default: ''
103
+ default: 'github'
104
104
 
105
105
  exclude-tags:
106
106
  description: 'Exclude checks with these tags (comma-separated)'
@@ -69,36 +69,34 @@ checks:
69
69
  overview:
70
70
  type: ai
71
71
  group: overview
72
+ schema: overview
72
73
  prompt: |
73
- # 📋 Pull Request Overview: {{ pr.title }}
74
-
75
- {% if pr.body %}
76
- ## Description
77
- {{ pr.body }}
78
- {% endif %}
74
+ You are generating PR overview, to help owners of the repository to understand what this PR is above, and help reviewer to point to the right parts of the code. First you should provide detailed but concise description, mentioning all the changes.
79
75
 
80
76
  ## Files Changed Analysis
77
+ After you need to summarize insights from `<files_summary>`: changed files, additions/deletions, notable patterns.
81
78
 
82
- Analyze the files listed in the `<files_summary>` section, which provides a structured overview of all changes including filenames, status, additions, and deletions.
79
+ Next ensure you cover all below:
83
80
 
84
81
  ## Architecture & Impact Assessment
85
-
86
- Please generate a comprehensive overview and analysis of this pull request.
87
-
88
- Follow these instructions to create a thorough assessment:
89
-
90
- 1. **Change Impact Analysis**
91
- - What this PR accomplishes
92
- - Key technical changes introduced
93
- - Affected system components
94
-
95
- 2. **Architecture Visualization**
96
- - Create appropriate mermaid diagram(s) to visualize the changes
97
- - Choose the best diagram type for the context
98
- - Use multiple diagrams if needed to explain different aspects
99
- - Focus on modified components and their relationships
100
-
101
- Provide a balanced technical assessment suitable for both developers and stakeholders.
82
+ - What this PR accomplishes
83
+ - Key technical changes introduced
84
+ - Affected system components
85
+ - Include one or more mermaid diagrams when useful to visualize component relationships or flow.
86
+
87
+ ## Scope Discovery & Context Expansion
88
+ - From the `<files_summary>` and code diffs, infer the broader scope of impact across modules, services, and boundaries.
89
+ - If your environment supports code search/extract tools, use them to peek at immediately-related files (tests, configs, entrypoints) for better context. If tools are not available, infer and list what you would search next.
90
+
91
+ You may also be asked to assign labels to PR; if so use this:
92
+ - `tags.review-effort`: integer 1–5 estimating review effort (1=trivial, 5=very high).
93
+ - `tags.label`: one of [bug, chore, documentation, enhancement, feature]. Choose the best fit.
94
+
95
+ Important:
96
+ - Propose `tags.review-effort` and `tags.label` only for the initial PR open event.
97
+ - Do not change or re-suggest labels on PR update events; the repository applies labels only on `pr_opened`.
98
+
99
+ Be concise, specific, and actionable. Avoid praise or celebration.
102
100
  on: [pr_opened, pr_updated]
103
101
 
104
102
  # Security analysis - Critical for all projects
@@ -155,7 +153,7 @@ checks:
155
153
  group: review
156
154
  schema: code-review
157
155
  prompt: |
158
- Building on our overview and security analysis, now review the code changes for performance issues.
156
+ Building on our overview analysis, now review the code changes for performance issues.
159
157
 
160
158
  Focus on the files listed in `<files_summary>` and analyze the code changes shown in the `<full_diff>` or `<commit_diff>` sections.
161
159
 
@@ -183,7 +181,7 @@ checks:
183
181
  - Race conditions and deadlocks
184
182
  - Inefficient parallel processing
185
183
 
186
- Building on our overview and security analysis, identify performance issues and provide optimization recommendations that complement our previous findings.
184
+ Building on our overview analysis, identify performance issues and provide optimization recommendations.
187
185
 
188
186
  ## Severity Guidelines
189
187
  Use the following severity levels appropriately:
@@ -191,7 +189,7 @@ checks:
191
189
  - **error**: Significant performance problems affecting user experience (O(n²) in critical path, N+1 queries, blocking I/O)
192
190
  - **warning**: Performance concerns that should be optimized (inefficient algorithms, missing indexes, unnecessary operations)
193
191
  - **info**: Performance best practices and optimization opportunities (caching suggestions, async improvements)
194
- depends_on: [security]
192
+ depends_on: [overview]
195
193
  reuse_ai_session: overview # 🔄 Reuses the overview check's AI session for context continuity
196
194
  on: [pr_opened, pr_updated]
197
195
 
@@ -201,7 +199,7 @@ checks:
201
199
  group: review
202
200
  schema: code-review
203
201
  prompt: |
204
- Building on our overview, security, and performance discussions, evaluate the code quality and maintainability.
202
+ Building on our overview discussion, evaluate the code quality and maintainability.
205
203
 
206
204
  Review the code changes shown in the `<full_diff>` or `<commit_diff>` sections, considering the files listed in `<files_summary>`.
207
205
 
@@ -235,7 +233,7 @@ checks:
235
233
  - Framework/library best practices
236
234
  - Type safety (if applicable)
237
235
 
238
- Focus on actionable improvements that enhance code maintainability while considering the overview, security, and performance findings we've already discussed.
236
+ Focus on actionable improvements that enhance code maintainability based on the overview analysis.
239
237
 
240
238
  ## Severity Guidelines
241
239
  Use the following severity levels appropriately:
@@ -243,7 +241,7 @@ checks:
243
241
  - **error**: Quality problems that significantly impact maintainability (no error handling, high complexity, severe coupling)
244
242
  - **warning**: Quality concerns that should be addressed (missing tests, code duplication, poor naming)
245
243
  - **info**: Best practices and improvement suggestions (refactoring opportunities, documentation improvements)
246
- depends_on: [performance]
244
+ depends_on: [overview]
247
245
  reuse_ai_session: overview # 🔄 Reuses the overview check's AI session for context continuity
248
246
  on: [pr_opened, pr_updated]
249
247
 
@@ -253,7 +251,7 @@ checks:
253
251
  group: review
254
252
  schema: code-review
255
253
  prompt: |
256
- Building on our overview, security, performance, and quality discussions, analyze the code style and formatting consistency.
254
+ Building on our overview discussion, analyze the code style and formatting consistency.
257
255
 
258
256
  Review the code changes shown in the `<full_diff>` or `<commit_diff>` sections, considering the files listed in `<files_summary>`.
259
257
 
@@ -276,7 +274,7 @@ checks:
276
274
  - Documentation standards adherence
277
275
  - Code comment quality and completeness
278
276
 
279
- Focus on style improvements that enhance code readability and maintainability while considering our previous analysis.
277
+ Focus on style improvements that enhance code readability and maintainability based on the overview analysis.
280
278
 
281
279
  ## Severity Guidelines
282
280
  Use the following severity levels appropriately:
@@ -284,135 +282,103 @@ checks:
284
282
  - **error**: Major style violations that significantly harm readability (completely inconsistent formatting, misleading names)
285
283
  - **warning**: Style inconsistencies that should be fixed (mixed conventions, unclear naming, formatting issues)
286
284
  - **info**: Style suggestions and minor improvements (spacing, comment formatting, optional conventions)
287
- depends_on: [quality]
285
+ depends_on: [overview]
288
286
  reuse_ai_session: overview # 🔄 Reuses the overview check's AI session for context continuity
289
287
  on: [pr_opened, pr_updated]
290
288
 
291
- # Command orchestrator - demonstrates noop type for triggering multiple checks
292
- review-all:
293
- type: noop
294
- command: '/review'
295
- depends_on: [overview, security, performance, quality, style]
296
- on: [issue_comment]
297
- if: "event.isPullRequest" # Only trigger on PR comments, not issues
298
- group: orchestrator
299
-
300
- # Intelligent Issue Assistant - provides sophisticated issue triage and assistance
289
+ # Apply labels based on overview tags runs only on PR open (GitHub environments only)
290
+ apply-overview-labels:
291
+ type: github
292
+ tags: [github]
293
+ depends_on: [overview]
294
+ on: [pr_opened]
295
+ op: labels.add
296
+ values:
297
+ - "{{ outputs.overview.tags.label | default: '' | safe_label }}"
298
+ - "{{ outputs.overview.tags['review-effort'] | default: '' | prepend: 'review/effort:' | safe_label }}"
299
+ value_js: |
300
+ return values.filter(v => typeof v === 'string' && v.trim().length > 0);
301
+
302
+ # Issue Assistant (issues only) — triage-quality prompt from main branch, structured output
301
303
  issue-assistant:
302
304
  type: ai
303
- group: dynamic # Special group: creates new comment each time instead of updating
305
+ group: dynamic # New issue triage posts a standalone comment
306
+ schema: issue-assistant
307
+ prompt: |
308
+ You are an intelligent GitHub issue assistant for the {{ event.repository.fullName }} repository. Your role is to provide professional, knowledgeable assistance when a NEW issue is opened.
309
+
310
+ Return ONE JSON object (no prose outside JSON) that validates the `issue-assistant` schema with:
311
+ - `text`: write a clear, well-structured markdown reply that welcomes the reporter, shows understanding, and provides next steps. Use sections and bullets where helpful.
312
+ - `intent`: must be "issue_triage" for this flow.
313
+ - `labels` (optional): array of labels that would help organization for this new issue.
314
+
315
+ Use this triage rubric (adopted from our main prompt):
316
+ 1) Categorize the issue - choose from: bug, chore, documentation, enhancement, feature, question, wontfix, invalid, duplicate
317
+ 2) Assess priority (low/medium/high/urgent)
318
+ 3) Estimate complexity (trivial/simple/moderate/complex)
319
+ 4) Recommend labels from the categories above
320
+ 5) Identify potential areas affected or relevant documentation
321
+ 6) Provide an initial response with clarifying questions if needed
322
+
323
+ Response style:
324
+ - Professional and welcoming
325
+ - Actionable guidance and clear next steps
326
+ - Ask clarifying questions when information is missing
327
+ - Use markdown formatting; include code snippets where useful
328
+ - NEVER make promises about timelines, release dates, or team commitments
329
+ - NEVER say things like "we'll pick this up", "will be included in upcoming release", or "we will post updates"
330
+ - Focus on technical analysis and helpful information rather than commitments
331
+ on: [issue_opened]
332
+
333
+ # Comment Assistant (comments only) — intent detection and reply
334
+ comment-assistant:
335
+ type: ai
336
+ group: dynamic
337
+ schema: issue-assistant
304
338
  command: "visor"
305
- if: "event.name === 'issues' && event.action === 'opened' || (event.name === 'issue_comment' && event.comment && event.comment.body && event.comment.body.trim().startsWith('/visor'))"
306
339
  prompt: |
307
- You are an intelligent GitHub issue assistant for the {{ event.repository.fullName }} repository. Your role is to provide professional, knowledgeable assistance based on the trigger event.
308
-
309
- ## Event Context
310
- **Event Type**: {{ event.name }} - {{ event.action }}
311
- {% if event.issue -%}
312
- **Issue #{{ event.issue.number }}**: {{ event.issue.title }}
313
- **Author**: {{ event.issue.author }}
314
- **State**: {{ event.issue.state }}
315
- **Created**: {{ event.issue.createdAt }}
316
- {%- if event.issue.labels.size > 0 %}
317
- **Labels**: {% for label in event.issue.labels %}{{ label.name }}{% unless forloop.last %}, {% endunless %}{% endfor %}
318
- {%- endif %}
319
- {%- if event.issue.assignees.size > 0 %}
320
- **Assignees**: {% for assignee in event.issue.assignees %}{{ assignee }}{% unless forloop.last %}, {% endunless %}{% endfor %}
321
- {%- endif %}
322
- {%- endif %}
323
- {%- if event.comment %}
324
- **Comment by**: {{ event.comment.author }}
325
- {%- endif %}
326
-
327
- ## Repository Analysis Context
328
- {%- if event.isPullRequest and pr.title %}
329
- **PR Context**: {{ pr.title }}
330
- {%- endif %}
331
- {%- if event.repository %}
332
- **Repository**: {{ event.repository.fullName }}
333
- {%- endif %}
334
-
335
- ## Instructions
336
-
337
- {%- if event.name == 'issues' and event.action == 'opened' %}
338
-
339
- **ISSUE TRIAGE MODE**
340
-
341
- Analyze this new issue and provide intelligent triage:
342
-
343
- ### Issue Content
344
- {{ event.issue.body }}
345
-
346
- ### Analysis Tasks
347
- 1. **Categorize** the issue (bug/feature/documentation/question/enhancement/maintenance)
348
- 2. **Assess priority** (low/medium/high/urgent) based on:
349
- - Impact on users/system
350
- - Security implications
351
- - Blocking nature
352
- - Community interest
353
- 3. **Estimate complexity** (trivial/simple/moderate/complex)
354
- 4. **Suggest timeline** for resolution
355
- 5. **Recommend labels** that would help with organization
356
- 6. **Identify stakeholders** who should be involved or assignees
357
- 7. **Provide initial response** to the issue author
358
-
359
- ### Response Requirements
360
- - Be professional and welcoming
361
- - Show you understand the request
362
- - Provide clear next steps
363
- - Ask clarifying questions if needed
364
- - Include technical insights where appropriate
365
-
366
- {%- elsif event.name == 'issue_comment' %}
367
-
368
- **ASSISTANCE MODE**
369
-
370
- A user has asked a question or provided additional information. Provide helpful technical assistance:
371
-
372
- ### Original Issue
373
- {%- if event.issue.title %}
374
- **Title**: {{ event.issue.title }}
375
- {%- endif %}
376
- {%- if event.issue.body %}
377
- **Description**: {{ event.issue.body }}
378
- {%- endif %}
379
-
380
- ### Latest Comment
381
- {{ event.comment.body }}
382
-
383
- ### Analysis Tasks
384
- 1. **Understand the context** of their question/comment
385
- 2. **Provide technical guidance** based on project knowledge
386
- 3. **Reference relevant code/files** if applicable
387
- 4. **Suggest implementation approaches** for feature requests
388
- 5. **Provide debugging steps** for bug reports
389
- 6. **Link to documentation** or similar issues if helpful
390
- 7. **Offer code examples** when appropriate
391
-
392
- ### Response Requirements
393
- - Address their specific question directly
394
- - Provide actionable guidance
395
- - Be encouraging and supportive
396
- - Use technical language appropriate to their level
397
- - Include code examples where helpful
398
- - Reference project conventions and patterns
399
-
400
- {%- endif %}
401
-
402
- ### Special Instructions
403
- - Always be professional, helpful, and encouraging
404
- - Focus on actionable advice and clear next steps
405
- - Use markdown formatting for better readability
406
- - Include relevant code examples when helpful
407
- - Reference project context and patterns when applicable
408
- - If dealing with `/visor` commands in comments, acknowledge and provide assistance
409
- - Maintain consistency with project tone and contributor guidelines
410
-
411
- ### Response Format
412
- Provide a well-structured markdown response with clear sections and helpful guidance.
413
- on: [issue_opened, issue_comment]
414
-
415
- # Output configuration
340
+ You are the GitHub comment assistant for {{ event.repository.fullName }}. Respond to user comments on issues or PR discussion threads.
341
+
342
+ Return ONE JSON object (no prose outside JSON) that validates the `issue-assistant` schema with:
343
+ - `text`: a concise, helpful markdown reply to the latest comment.
344
+ - `intent`: choose one: "comment_reply" (normal reply) or "comment_retrigger" (pick this ONLY when the user explicitly asks to re-run checks OR explicitly asks to disable some checks).
345
+ - `labels`: omit for comments (do not include).
346
+
347
+ Rules:
348
+ - Never suggest rerun/disable unless asked explicitly.
349
+ - If asked to disable any check(s), set `intent` = "comment_retrigger" and in `text` acknowledge the request and say the checks will be re-run; DO NOT propose slash/directive comments.
350
+ - Stay technical, direct, and specific; add code snippets or links when helpful.
351
+ on: [issue_comment]
352
+ on_success:
353
+ goto_js: |
354
+ const intent = (typeof output === 'object' && output) ? output.intent : undefined;
355
+ const isComment = (event && event.name) ? (event.name == 'issue_comment') : true;
356
+ const allowed = typeof hasMinPermission === 'function' ? hasMinPermission('MEMBER') : true;
357
+ return (isComment && allowed && intent === 'comment_retrigger') ? 'overview' : null
358
+ goto_event: pr_updated
359
+
360
+ # Apply labels to new issues based on assistant output (GitHub-only)
361
+ apply-issue-labels:
362
+ type: github
363
+ tags: [github]
364
+ depends_on: [issue-assistant]
365
+ on: [issue_opened]
366
+ op: labels.add
367
+ values:
368
+ - "{{ outputs['issue-assistant'].labels | safe_label_list }}"
369
+
370
+ # External origin labelling for PRs and Issues
371
+ external-label:
372
+ type: github
373
+ tags: [github]
374
+ on: [pr_opened, issue_opened]
375
+ if: "!isMember() && !isContributor()"
376
+ op: labels.add
377
+ values:
378
+ - "external"
379
+
380
+ # Retrigger noop removed — comment-assistant schedules overview directly
381
+
416
382
  output:
417
383
  pr_comment:
418
384
  format: markdown
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ exports.id = 13;
3
+ exports.ids = [13];
4
+ exports.modules = {
5
+
6
+ /***/ 31223:
7
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
8
+
9
+
10
+ /*
11
+ * Copyright The OpenTelemetry Authors
12
+ *
13
+ * Licensed under the Apache License, Version 2.0 (the "License");
14
+ * you may not use this file except in compliance with the License.
15
+ * You may obtain a copy of the License at
16
+ *
17
+ * https://www.apache.org/licenses/LICENSE-2.0
18
+ *
19
+ * Unless required by applicable law or agreed to in writing, software
20
+ * distributed under the License is distributed on an "AS IS" BASIS,
21
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22
+ * See the License for the specific language governing permissions and
23
+ * limitations under the License.
24
+ */
25
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
26
+ exports.execAsync = void 0;
27
+ const child_process = __webpack_require__(35317);
28
+ const util = __webpack_require__(39023);
29
+ exports.execAsync = util.promisify(child_process.exec);
30
+ //# sourceMappingURL=execAsync.js.map
31
+
32
+ /***/ }),
33
+
34
+ /***/ 80013:
35
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
36
+
37
+
38
+ /*
39
+ * Copyright The OpenTelemetry Authors
40
+ *
41
+ * Licensed under the Apache License, Version 2.0 (the "License");
42
+ * you may not use this file except in compliance with the License.
43
+ * You may obtain a copy of the License at
44
+ *
45
+ * https://www.apache.org/licenses/LICENSE-2.0
46
+ *
47
+ * Unless required by applicable law or agreed to in writing, software
48
+ * distributed under the License is distributed on an "AS IS" BASIS,
49
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
50
+ * See the License for the specific language governing permissions and
51
+ * limitations under the License.
52
+ */
53
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
54
+ exports.getMachineId = void 0;
55
+ const process = __webpack_require__(932);
56
+ const execAsync_1 = __webpack_require__(31223);
57
+ const api_1 = __webpack_require__(63914);
58
+ async function getMachineId() {
59
+ const args = 'QUERY HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography /v MachineGuid';
60
+ let command = '%windir%\\System32\\REG.exe';
61
+ if (process.arch === 'ia32' && 'PROCESSOR_ARCHITEW6432' in process.env) {
62
+ command = '%windir%\\sysnative\\cmd.exe /c ' + command;
63
+ }
64
+ try {
65
+ const result = await (0, execAsync_1.execAsync)(`${command} ${args}`);
66
+ const parts = result.stdout.split('REG_SZ');
67
+ if (parts.length === 2) {
68
+ return parts[1].trim();
69
+ }
70
+ }
71
+ catch (e) {
72
+ api_1.diag.debug(`error reading machine id: ${e}`);
73
+ }
74
+ return undefined;
75
+ }
76
+ exports.getMachineId = getMachineId;
77
+ //# sourceMappingURL=getMachineId-win.js.map
78
+
79
+ /***/ })
80
+
81
+ };
82
+ ;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ exports.id = 159;
3
+ exports.ids = [159];
4
+ exports.modules = {
5
+
6
+ /***/ 31159:
7
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
8
+
9
+
10
+ /*
11
+ * Copyright The OpenTelemetry Authors
12
+ *
13
+ * Licensed under the Apache License, Version 2.0 (the "License");
14
+ * you may not use this file except in compliance with the License.
15
+ * You may obtain a copy of the License at
16
+ *
17
+ * https://www.apache.org/licenses/LICENSE-2.0
18
+ *
19
+ * Unless required by applicable law or agreed to in writing, software
20
+ * distributed under the License is distributed on an "AS IS" BASIS,
21
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22
+ * See the License for the specific language governing permissions and
23
+ * limitations under the License.
24
+ */
25
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
26
+ exports.getMachineId = void 0;
27
+ const api_1 = __webpack_require__(63914);
28
+ async function getMachineId() {
29
+ api_1.diag.debug('could not read machine-id: unsupported platform');
30
+ return undefined;
31
+ }
32
+ exports.getMachineId = getMachineId;
33
+ //# sourceMappingURL=getMachineId-unsupported.js.map
34
+
35
+ /***/ })
36
+
37
+ };
38
+ ;