marketplace/bundles/plan-marshall/skills/workflow-integration-ci/SKILL.md
PR review response workflow - fetch comments, triage, and respond to review feedback (GitHub and GitLab)
npx skillsauth add cuioss/plan-marshall workflow-integration-ciInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Handles PR review comment workflows - fetching comments, triaging them, and generating appropriate responses. Works with both GitHub and GitLab via the unified tools-integration-ci abstraction.
Execution mode: Fetch PR review comments, triage each for action, implement fixes or generate responses, resolve threads.
Prohibited actions:
Constraints:
python3 .plan/execute-script.py commandFetch Comments Workflow - Retrieves PR review comments
tools-integration-ci abstraction (GitHub or GitLab)Handle Review Workflow - Processes and responds to comments
Automated Review Lifecycle - Complete CI-wait → fetch → triage → respond → resolve cycle
3_automated_review == truePurpose: Fetch all review comments for a PR.
Input: PR number (optional, defaults to current branch's PR)
Steps:
Get PR Comments via CI Integration
Use the pr-comments command from marshal.json (provider-agnostic):
python3 .plan/execute-script.py plan-marshall:tools-integration-ci:ci pr comments \
--pr-number {number} [--unresolved-only]
Or use the workflow script for additional processing:
python3 .plan/execute-script.py plan-marshall:workflow-integration-ci:pr fetch-comments [--pr {number}]
Output (TOON format):
status: success
operation: pr_comments
provider: github|gitlab
pr_number: 123
total: N
unresolved: N
comments[N]{id,thread_id,author,body,path,line,resolved,created_at}:
c1 PRRT_abc alice Fix security issue src/Auth.java 42 false 2025-01-15T10:30:00Z
Return Comment List
Output: Structured list of comments for triage
Purpose: Process review comments and respond appropriately.
Input: PR number or comment list from Fetch workflow
Steps:
Get Comments If not provided, use Fetch Comments workflow first.
Triage Each Comment For each unresolved comment:
Script: plan-marshall:workflow-integration-ci
python3 .plan/execute-script.py plan-marshall:workflow-integration-ci:pr triage --comment '{json}'
Script outputs decision:
comment_id: ...
action: code_change|explain|ignore
reason: ...
priority: high|medium|low|none
suggested_implementation: ...
Process by Action Type
For code_change:
For explain:
python3 .plan/execute-script.py plan-marshall:tools-integration-ci:ci pr reply \
--pr-number {pr} --body "..."
For ignore:
Group by Priority
Return Summary
Output:
pr_number: 123
processed:
code_changes: 3
explanations: 1
ignored: 1
files_modified[1]:
- ...
status: success
Purpose: Complete automated review cycle for a PR — wait for CI, fetch review comments, triage, respond, and resolve threads. Used by phase-6-finalize when 3_automated_review == true.
Input:
plan_id — for logging and Q-Gate findingspr_number — PR number (from phase-6-finalize Step 4 or pr-view)review_bot_buffer_seconds — seconds to wait after CI for review bots (from config)Steps:
Wait for CI
Use the built-in ci wait command which handles polling internally:
python3 .plan/execute-script.py plan-marshall:tools-integration-ci:ci ci wait \
--pr-number {pr_number}
Bash tool timeout: 1800000ms (30-minute safety net). Internal timeout managed by script.
final_status: success → proceed to step 2final_status: failure → return {status: ci_failure, details: ...} for loop-backstatus: timeout → ask user (continue/skip/abort)Buffer for Review Bots
Wait for automated review bots (Gemini Code Assist, etc.) to post comments:
sleep {review_bot_buffer_seconds}
Fetch Comments
Use Workflow 1 (Fetch Comments) with --unresolved-only:
python3 .plan/execute-script.py plan-marshall:workflow-integration-ci:pr fetch-comments --pr {pr_number} --unresolved-only
Triage Each Comment
Use Workflow 2 (Handle Review) triage for each unresolved comment:
python3 .plan/execute-script.py plan-marshall:workflow-integration-ci:pr triage --comment '{comment_json}'
Process by Action Type
ID format rules (from fetch-comments output):
thread-reply --thread-id: Use the comment's id field (GraphQL node ID, format: PRRC_kwDO...). This is the inReplyTo target.resolve-thread --thread-id: Use the thread_id field (GraphQL node ID, format: PRRT_kwDO...).For each triaged comment:
code_change (requires implementation):
python3 .plan/execute-script.py plan-marshall:manage-findings:manage-findings \
qgate add --plan-id {plan_id} --phase 6-finalize --source qgate \
--type pr-comment --title "{comment summary}" \
--detail "{comment body} at {path}:{line}"
python3 .plan/execute-script.py plan-marshall:tools-integration-ci:ci pr thread-reply \
--pr-number {pr_number} --thread-id {comment_id} --body "Acknowledged — creating fix task."
explain (reply with explanation):
python3 .plan/execute-script.py plan-marshall:tools-integration-ci:ci pr thread-reply \
--pr-number {pr_number} --thread-id {comment_id} --body "{explanation}"
python3 .plan/execute-script.py plan-marshall:tools-integration-ci:ci pr resolve-thread \
--pr-number {pr_number} --thread-id {thread_id}
ignore (dismiss):
python3 .plan/execute-script.py plan-marshall:tools-integration-ci:ci pr resolve-thread \
--pr-number {pr_number} --thread-id {thread_id}
Return Summary
Output:
status: success
pr_number: {pr_number}
ci_status: success
comments_total: {N}
comments_unresolved: {N}
processed:
code_changes: {N}
explanations: {N}
ignored: {N}
threads_resolved: {N}
loop_back_needed: {true|false}
findings_created: {N}
If loop_back_needed == true, phase-6-finalize creates fix tasks and loops back to phase-5-execute.
Script: plan-marshall:workflow-integration-ci → pr.py
Purpose: Fetch PR review comments from GitHub.
Usage:
python3 .plan/execute-script.py plan-marshall:workflow-integration-ci:pr fetch-comments [--pr <number>]
Requirements: gh CLI installed and authenticated
Output: TOON with comments array
Purpose: Analyze a single comment and determine action.
Usage:
python3 .plan/execute-script.py plan-marshall:workflow-integration-ci:pr triage --comment '{"id":"...", "body":"...", ...}'
Output: TOON with action decision
| Pattern | Action | Priority | |---------|--------|----------| | security, vulnerability, injection | code_change | high | | bug, error, fix, broken | code_change | high | | please add/remove/change | code_change | medium | | rename, variable name, typo | code_change | low | | why, explain, reasoning, ? | explain | low | | lgtm, approved, looks good | ignore | none |
development
Domain-owned OpenRewrite log-line finding parser for the java-cui domain — parses the
development
Domain-owned OpenRewrite marker detection for the java-cui domain — scans Java/Kotlin sources for cui-rewrite TODO markers, categorizes them by recipe, and fails the gate on any detected marker
development
Operator control surface for the marshalld build server — enrol/drop a project in the machine-global registry (the opt-in enable signal and anti-laundering wall), manage the daemon lifecycle (start, stop, drain, status, install, upgrade) version-pinned to the verified bundle copy, and inspect the daemon's per-project interaction-audit log (read-only)
tools
The tiny build-consumption client for the marshalld build server — submit a build job, bounded long-poll for its result, ping the daemon identity, and preflight registry-plus-liveness in one call; consumption only, never provisioning or enrolment