From 9ca9fda8ef115314931a62082f694eb978ecbd2c Mon Sep 17 00:00:00 2001 From: PerryLink <255665900+PerryLink@users.noreply.github.com> Date: Sun, 16 Aug 2026 18:28:00 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20GitHub=20CI=20integration=20?= =?UTF-8?q?=E2=80=94=20composite=20action,=20review=20bot,=20status-check?= =?UTF-8?q?=20gate=20(v0.6.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- action.yml | 161 ++++++++++++ lib/approval-gate.d.ts | 5 + lib/approval-gate.d.ts.map | 2 +- lib/approval-gate.js | 14 + lib/approval-gate.js.map | 2 +- lib/ci/bot.d.ts | 50 ++++ lib/ci/bot.d.ts.map | 1 + lib/ci/bot.js | 168 ++++++++++++ lib/ci/bot.js.map | 1 + lib/ci/pipeline.d.ts | 84 ++++++ lib/ci/pipeline.d.ts.map | 1 + lib/ci/pipeline.js | 380 +++++++++++++++++++++++++++ lib/ci/pipeline.js.map | 1 + lib/ci/review-rules.d.ts | 41 +++ lib/ci/review-rules.d.ts.map | 1 + lib/ci/review-rules.js | 108 ++++++++ lib/ci/review-rules.js.map | 1 + lib/ci/tool.d.ts | 4 + lib/ci/tool.d.ts.map | 1 + lib/ci/tool.js | 155 +++++++++++ lib/ci/tool.js.map | 1 + lib/config.d.ts | 60 ++++- lib/config.d.ts.map | 2 +- lib/config.js | 68 ++++- lib/config.js.map | 2 +- lib/github.d.ts | 4 +- lib/github.d.ts.map | 2 +- lib/github.js | 24 +- lib/github.js.map | 2 +- lib/index.d.ts | 25 +- lib/index.d.ts.map | 2 +- lib/index.js | 8 + lib/index.js.map | 2 +- lib/jobs.js | 5 +- lib/jobs.js.map | 2 +- lib/present.d.ts | 55 ++++ lib/present.d.ts.map | 2 +- lib/present.js | 32 +++ lib/present.js.map | 2 +- lib/review.d.ts | 2 + lib/review.d.ts.map | 2 +- lib/review.js | 2 +- lib/review.js.map | 2 +- lib/state.d.ts | 4 +- lib/state.d.ts.map | 2 +- lib/state.js | 17 +- lib/state.js.map | 2 +- lib/tools.d.ts | 63 +++++ lib/tools.d.ts.map | 2 +- lib/tools.js | 4 +- lib/tools.js.map | 2 +- package.json | 8 +- scripts/action-patch.mjs | 138 ++++++++++ scripts/action-post.mjs | 48 ++++ src/approval-gate.ts | 14 + src/ci/bot.ts | 210 +++++++++++++++ src/ci/pipeline.ts | 490 +++++++++++++++++++++++++++++++++++ src/ci/review-rules.ts | 147 +++++++++++ src/ci/tool.ts | 155 +++++++++++ src/config.ts | 127 ++++++++- src/github.ts | 25 +- src/index.ts | 33 ++- src/jobs.ts | 5 +- src/present.ts | 61 +++++ src/review.ts | 2 +- src/state.ts | 20 +- src/tools.ts | 4 +- test/ci.test.ts | 403 ++++++++++++++++++++++++++++ test/config.test.ts | 2 +- test/helpers.ts | 4 +- test/security.test.ts | 45 ++++ 71 files changed, 3444 insertions(+), 82 deletions(-) create mode 100644 action.yml create mode 100644 lib/ci/bot.d.ts create mode 100644 lib/ci/bot.d.ts.map create mode 100644 lib/ci/bot.js create mode 100644 lib/ci/bot.js.map create mode 100644 lib/ci/pipeline.d.ts create mode 100644 lib/ci/pipeline.d.ts.map create mode 100644 lib/ci/pipeline.js create mode 100644 lib/ci/pipeline.js.map create mode 100644 lib/ci/review-rules.d.ts create mode 100644 lib/ci/review-rules.d.ts.map create mode 100644 lib/ci/review-rules.js create mode 100644 lib/ci/review-rules.js.map create mode 100644 lib/ci/tool.d.ts create mode 100644 lib/ci/tool.d.ts.map create mode 100644 lib/ci/tool.js create mode 100644 lib/ci/tool.js.map create mode 100644 scripts/action-patch.mjs create mode 100644 scripts/action-post.mjs create mode 100644 src/ci/bot.ts create mode 100644 src/ci/pipeline.ts create mode 100644 src/ci/review-rules.ts create mode 100644 src/ci/tool.ts create mode 100644 test/ci.test.ts diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..3d5d0d6 --- /dev/null +++ b/action.yml @@ -0,0 +1,161 @@ +# dsh-github — official-grade GitHub CI integration for DeepSeek Harness. +# +# Runs `dsh --profile headless` with the dsh-github CI surface composed on top, +# to review pull requests, investigate CI failures, or generate reports. The +# plugin publishes the status-check gate and writes structured JSON + Markdown +# reports; this action exposes them as outputs and enforces the blocking gate. +# +# Shell contract: every step uses only bash builtins, node, npm, and the dsh +# CLI — no curl, gh, jq, or third-party CLI tools. Secrets travel only through +# environment variables and the plugin's per-operation token resolution; they +# are never logged or interpolated into prompts. +name: 'dsh-github — DeepSeek Harness GitHub CI' +description: 'Run dsh headless to review PRs, investigate CI failures, or generate reports, with inline review comments, a status-check gate, and structured JSON/Markdown outputs' +author: 'PerryLink' + +branding: + icon: 'git-pull-request' + color: 'purple' + +inputs: + task: + description: 'CI task: review (analyze + comments + status check), fix-ci (investigate CI failures and post a fix plan), or report (generate a repository/PR report).' + required: false + default: 'review' + pr: + description: 'Pull request number. Defaults to the current pull_request event number; required for review and fix-ci.' + required: false + default: ${{ github.event.pull_request.number }} + owner-repo: + description: 'Repository as owner/repo. Defaults to github.repository.' + required: false + default: ${{ github.repository }} + task-prompt: + description: 'Complete replacement for the per-mode default headless task text (advanced).' + required: false + model: + description: 'DeepSeek model id for the headless session.' + required: false + default: 'deepseek-v4-flash' + engine: + description: "Review engine: 'static' (deterministic analyzer, zero review tokens) or 'model' (the agent authors the review body)." + required: false + default: 'static' + deepseek-api-key: + description: 'DeepSeek API key. Always pass a secret, never a literal.' + required: true + github-token: + description: 'GitHub token for the review pipeline. Use the auto-expiring job token with the minimal permissions shown in the README.' + required: false + default: ${{ github.token }} + check-name: + description: 'Name of the status check published on the PR head commit.' + required: false + default: 'dsh-github-review' + blocking: + description: "When the verdict is needs-changes: 'true' fails the check (and this step), 'false' publishes a neutral (non-blocking) conclusion." + required: false + default: 'true' + fail-on: + description: "Lowest finding severity that flips the verdict to needs-changes: 'error' or 'warning'." + required: false + default: 'error' + label-filters: + description: 'Comma-separated labels; a PR must carry at least one to be reviewed. Empty matches all PRs.' + required: false + path-filters: + description: 'Comma-separated path globs (e.g. src/**,*.md); a PR must touch at least one matching path. Empty matches all PRs.' + required: false + max-diff-chars: + description: 'Character cap for the PR diff read into the review.' + required: false + default: '8000' + post-comments: + description: "Whether the pipeline posts the inline review comments ('true'/'false')." + required: false + default: 'true' + post-check: + description: "Whether the pipeline publishes the status check ('true'/'false')." + required: false + default: 'true' + request-timeout-ms: + description: 'Per GitHub API request timeout in milliseconds (plugin-side).' + required: false + default: '30000' + node-version: + description: 'Node.js version for actions/setup-node.' + required: false + default: '22' + dsh-version: + description: '@deepseek-ai/dsh version to install.' + required: false + default: 'latest' + plugin-version: + description: '@perrylink/dsh-github version to install.' + required: false + default: 'latest' + output-dir: + description: 'Directory for dsh-github-ci-result.json and dsh-github-ci-summary.md.' + required: false + default: ${{ runner.temp }}/dsh-github + +outputs: + verdict: + description: "Review verdict: pass | needs-changes | skipped | error." + value: ${{ steps.post.outputs.verdict }} + report-json: + description: 'Path of the structured JSON report.' + value: ${{ steps.post.outputs.report-json }} + report-markdown: + description: 'Path of the Markdown summary.' + value: ${{ steps.post.outputs.report-markdown }} + check-url: + description: 'URL of the published status check (when published).' + value: ${{ steps.post.outputs.check-url }} + +runs: + using: composite + steps: + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: ${{ inputs.node-version }} + + - name: Install dsh and dsh-github + shell: bash + env: + DSH_HOME: ${{ runner.temp }}/dsh-home + DSH_PROFILE_DIR: ${{ runner.temp }}/dsh-home/profiles/headless + run: | + npm install --global --no-audit --no-fund "@deepseek-ai/dsh@${{ inputs.dsh-version }}" + mkdir -p "$DSH_PROFILE_DIR" + printf '{"private": true}\n' > "$DSH_PROFILE_DIR/package.json" + npm install --prefix "$DSH_PROFILE_DIR" --legacy-peer-deps --package-lock=false --no-save --no-audit --no-fund "@perrylink/dsh-github@${{ inputs.plugin-version }}" + + - name: Generate the dsh profile overlay and task + id: prepare + shell: bash + run: node "${{ github.action_path }}/scripts/action-patch.mjs" + + - name: Run dsh headless + id: run + shell: bash + env: + DSH_HOME: ${{ runner.temp }}/dsh-home + DEEPSEEK_API_KEY: ${{ inputs.deepseek-api-key }} + DSH_GITHUB_TOKEN: ${{ inputs.github-token }} + DSH_GITHUB_CI_DRIVER: '1' + DSH_GITHUB_CI_OUTPUT_DIR: ${{ inputs.output-dir }} + DSH_TELEMETRY_DISABLED: '1' + run: | + mkdir -p "${{ inputs.output-dir }}" + set +e + dsh --profile headless --patch "${{ inputs.output-dir }}/dsh-github-ci.cordis.yml" "$(cat "${{ inputs.output-dir }}/task.txt")" \ + > "${{ inputs.output-dir }}/dsh-github-stdout.log" 2> "${{ inputs.output-dir }}/dsh-github-stderr.log" + echo "$?" > "${{ inputs.output-dir }}/dsh-github-exit.txt" + cat "${{ inputs.output-dir }}/dsh-github-stdout.log" + + - name: Publish outputs and enforce the gate + id: post + shell: bash + run: node "${{ github.action_path }}/scripts/action-post.mjs" diff --git a/lib/approval-gate.d.ts b/lib/approval-gate.d.ts index 626640c..4194ae2 100644 --- a/lib/approval-gate.d.ts +++ b/lib/approval-gate.d.ts @@ -17,6 +17,11 @@ import type { GithubState } from './state.ts'; /** * Register the approval gate. Registration is an effect: disposing the plugin * fiber removes the listener. + * + * Unattended CI runs (`DSH_GITHUB_CI_DRIVER=1`) auto-allow exactly the + * actions listed in `ci.autoApprove` — the composite action composes that + * allowlist for the write the pipeline needs. Interactive sessions always + * ask, and actions missing from `allowedActions` stay denied everywhere. * @param ctx - plugin context; the listener lives on the shared tools pipeline. * @param state - plugin state used to enrich approval reasons. * @returns the effect disposer. diff --git a/lib/approval-gate.d.ts.map b/lib/approval-gate.d.ts.map index c91c556..ad8a4dc 100644 --- a/lib/approval-gate.d.ts.map +++ b/lib/approval-gate.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"approval-gate.d.ts","sourceRoot":"","sources":["../src/approval-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAmF7C;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,IAAI,CASjF"} \ No newline at end of file +{"version":3,"file":"approval-gate.d.ts","sourceRoot":"","sources":["../src/approval-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAGlD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAyF7C;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,IAAI,CAYjF"} \ No newline at end of file diff --git a/lib/approval-gate.js b/lib/approval-gate.js index 891176e..c4a8f21 100644 --- a/lib/approval-gate.js +++ b/lib/approval-gate.js @@ -6,6 +6,7 @@ const ACTION_BY_TOOL = { issue_open: 'issue.create', issue_comment: 'issue.comment', issue_close: 'issue.close', + ci_run: 'ci.run', }; /** Tools the gate intercepts; everything else delegates via next(). */ const WRITE_TOOLS = new Set(Object.keys(ACTION_BY_TOOL)); @@ -76,11 +77,21 @@ function askReason(toolName, args, state) { const number = typeof args.issueNumber === 'number' ? ` #${args.issueNumber}` : ''; return `close GitHub issue${number}`; } + if (toolName === 'ci_run') { + const target = typeof args.pr === 'string' ? ` ${args.pr}` : ''; + const task = typeof args.task === 'string' ? args.task : 'review'; + return `run CI ${task} for GitHub pull request${target} (posts review comments and a status check)`; + } return 'perform a GitHub write action'; } /** * Register the approval gate. Registration is an effect: disposing the plugin * fiber removes the listener. + * + * Unattended CI runs (`DSH_GITHUB_CI_DRIVER=1`) auto-allow exactly the + * actions listed in `ci.autoApprove` — the composite action composes that + * allowlist for the write the pipeline needs. Interactive sessions always + * ask, and actions missing from `allowedActions` stay denied everywhere. * @param ctx - plugin context; the listener lives on the shared tools pipeline. * @param state - plugin state used to enrich approval reasons. * @returns the effect disposer. @@ -93,6 +104,9 @@ export function registerApprovalGate(ctx, state) { if (action === undefined || !state.config.allowedActions.includes(action)) { return { kind: 'deny', reason: `dsh-github: action "${action ?? exec.name}" is not in allowedActions` }; } + if (state.isCiDriver && state.config.ci.autoApprove.includes(action)) { + return { kind: 'allow' }; + } return { kind: 'ask', reason: `dsh-github: ${askReason(exec.name, argumentsAsRecord(exec), state)}` }; }); } diff --git a/lib/approval-gate.js.map b/lib/approval-gate.js.map index 570241a..cfc0dc5 100644 --- a/lib/approval-gate.js.map +++ b/lib/approval-gate.js.map @@ -1 +1 @@ -{"version":3,"file":"approval-gate.js","sourceRoot":"","sources":["../src/approval-gate.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"approval-gate.js","sourceRoot":"","sources":["../src/approval-gate.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/ci/bot.d.ts b/lib/ci/bot.d.ts new file mode 100644 index 0000000..1a3439d --- /dev/null +++ b/lib/ci/bot.d.ts @@ -0,0 +1,50 @@ +/** + * The PR review bot: a poll-driven scanner that reviews open pull requests + * with the shared CI pipeline and posts idempotent inline comments plus the + * status-check gate. + * + * Polling is the transport: a webhook endpoint would need a public listener + * (out of scope for a plugin), so the bot re-scans open PRs on + * `ci.pollIntervalMs` and treats every pass as event delivery — the pipeline's + * check-run + review-marker idempotency makes repeat deliveries harmless. + * `/ci scan` delivers the same "event" on demand. Concurrency inside one scan + * is capped by `ci.maxConcurrent`. + * + * Bot writes are plugin-internal automation, not model tool calls: they do + * not traverse the approval gate. They are switched by `ci.enabled` and + * scoped to exactly two GitHub surfaces — review comments and check runs — + * with the minimal-permission token resolved per operation. + * @module dsh-github/ci/bot + */ +import type { Context } from '@deepseek-ai/cordis'; +import type { CommandsService } from '../types.ts'; +import type { GithubState } from '../state.ts'; +/** Live bot status surfaced by `/ci status`. */ +export interface CiBotStatus { + polling: boolean; + scanning: boolean; + intervalMs: number; + lastScanAt: number | null; + lastScanPrs: number; + lastScanNeedsChanges: number; + lastScanErrors: number; + lastScanSummary: string; +} +/** Shared bot state; one instance per plugin fiber. */ +export interface CiBot { + status(): CiBotStatus; + scan(signal?: AbortSignal): Promise; + setPolling(enabled: boolean): void; + dispose(): void; +} +/** + * Create the polling bot and register the `/ci` command family. Everything + * here is an effect of the calling fiber — disposing the plugin stops the + * interval and removes the commands. + * @param ctx - plugin context (owns the effect lifetime). + * @param commands - the host command registry. + * @param state - shared plugin state. + * @returns the bot handle (also returned by the effect disposer path). + */ +export declare function registerCiBot(ctx: Context, commands: CommandsService, state: GithubState): () => void; +//# sourceMappingURL=bot.d.ts.map \ No newline at end of file diff --git a/lib/ci/bot.d.ts.map b/lib/ci/bot.d.ts.map new file mode 100644 index 0000000..40443d5 --- /dev/null +++ b/lib/ci/bot.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"bot.d.ts","sourceRoot":"","sources":["../../src/ci/bot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,KAAK,EAAoC,eAAe,EAAE,MAAM,aAAa,CAAA;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAG9C,gDAAgD;AAChD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;CACxB;AAOD,uDAAuD;AACvD,MAAM,WAAW,KAAK;IACpB,MAAM,IAAI,WAAW,CAAA;IACrB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3C,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IAClC,OAAO,IAAI,IAAI,CAAA;CAChB;AAID;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,IAAI,CAsJrG"} \ No newline at end of file diff --git a/lib/ci/bot.js b/lib/ci/bot.js new file mode 100644 index 0000000..db03b8b --- /dev/null +++ b/lib/ci/bot.js @@ -0,0 +1,168 @@ +import { runCiPipeline } from "./pipeline.js"; +const SCAN_CAP = 50; +/** + * Create the polling bot and register the `/ci` command family. Everything + * here is an effect of the calling fiber — disposing the plugin stops the + * interval and removes the commands. + * @param ctx - plugin context (owns the effect lifetime). + * @param commands - the host command registry. + * @param state - shared plugin state. + * @returns the bot handle (also returned by the effect disposer path). + */ +export function registerCiBot(ctx, commands, state) { + let polling = state.config.ci.pollIntervalMs > 0; + let scanning = false; + let lastScanAt = null; + let lastScanPrs = 0; + let lastScanNeedsChanges = 0; + let lastScanErrors = 0; + let lastScanSummary = 'no scan yet'; + const status = () => ({ + polling, + scanning, + intervalMs: state.config.ci.pollIntervalMs, + lastScanAt, + lastScanPrs, + lastScanNeedsChanges, + lastScanErrors, + lastScanSummary, + }); + const setPolling = (enabled) => { + polling = enabled; + }; + /** One pass over the open PRs: pipeline per PR under the concurrency cap. */ + const scan = async (signal) => { + if (scanning) + return 'a scan is already running'; + scanning = true; + const started = Date.now(); + let needsChanges = 0; + let errors = 0; + let reviewed = 0; + try { + const token = await state.resolveToken(signal); + if (!token.ok) { + lastScanErrors += 1; + lastScanSummary = `scan failed: ${token.error.message}`; + ctx.logger.warn(`dsh-github ci bot: ${token.error.message}`); + return lastScanSummary; + } + const client = state.client(token.token.value); + const repo = await state.resolveRepo(undefined, signal); + if (!repo.ok) { + lastScanErrors += 1; + lastScanSummary = `scan failed: ${repo.message}`; + ctx.logger.warn(`dsh-github ci bot: ${repo.message}`); + return lastScanSummary; + } + const open = await client.requestJson('GET', `/repos/${repo.repo}/pulls?state=open&per_page=${SCAN_CAP}`, { signal }); + const prs = open.data.filter(item => item.number !== undefined).slice(0, SCAN_CAP); + const cap = state.config.ci.maxConcurrent; + const queue = [...prs]; + const workers = Array.from({ length: Math.min(cap, queue.length) }, async () => { + for (;;) { + const item = queue.shift(); + if (item === undefined) + return; + try { + const outcome = await runCiPipeline(state, { repo: repo.repo, pr: item.number, task: 'review', signal }); + if (outcome.status === 'error') { + errors += 1; + ctx.logger.warn(`dsh-github ci bot: PR #${item.number} review failed: ${outcome.message}`); + } + else { + reviewed += 1; + if (outcome.verdict === 'needs-changes') + needsChanges += 1; + ctx.logger.info(`dsh-github ci bot: PR #${item.number} → ${outcome.verdict}${outcome.alreadyReviewed ? ' (already reviewed)' : ''}`); + } + } + catch (error) { + errors += 1; + ctx.logger.warn(`dsh-github ci bot: PR #${item.number} review threw: ${error instanceof Error ? error.message : String(error)}`); + } + } + }); + await Promise.all(workers); + lastScanAt = Date.now(); + lastScanPrs = reviewed; + lastScanNeedsChanges = needsChanges; + lastScanErrors = errors; + lastScanSummary = `scanned ${prs.length} open PR(s) in ${repo.repo}: ${reviewed} reviewed, ${needsChanges} needs-changes, ${errors} error(s) (${Date.now() - started}ms)`; + return lastScanSummary; + } + finally { + scanning = false; + } + }; + const timer = state.config.ci.pollIntervalMs > 0 + ? setInterval(() => { + if (polling) + void scan().catch(() => { }); + }, state.config.ci.pollIntervalMs) + : undefined; + timer?.unref?.(); + const register = (name, description, hint, handler) => commands.register({ name, description, input: { hint }, handler }); + const disposers = [ + register('ci', 'CI review bot: scan PRs, publish reviews and the status-check gate', 'scan | status | start | stop | run ', async (invocation) => { + const [sub, ...rest] = invocation.rawInput.trim().split(/\s+/); + if (sub === undefined || sub.length === 0) { + const current = status(); + return { kind: 'success', text: `CI bot: polling ${current.polling ? `on (every ${current.intervalMs}ms)` : 'off'}\n${current.lastScanSummary}\nUsage: /ci scan | status | start | stop | run ` }; + } + if (sub === 'scan') { + const result = await scan(invocation.signal); + return { kind: 'success', text: result }; + } + if (sub === 'status') { + const current = status(); + return { + kind: 'success', + text: `polling: ${current.polling ? `on (every ${current.intervalMs}ms)` : 'off'}\n` + + `last scan: ${current.lastScanAt === null ? 'never' : new Date(current.lastScanAt).toISOString()}\n` + + `${current.lastScanSummary}`, + }; + } + if (sub === 'start') { + if (state.config.ci.pollIntervalMs === 0) { + return { kind: 'error', text: 'ci.pollIntervalMs is 0: set a positive interval in cordis.yml to enable polling (or keep using /ci scan on demand).' }; + } + setPolling(true); + return { kind: 'success', text: `CI bot polling enabled (every ${state.config.ci.pollIntervalMs}ms). Set ci.pollIntervalMs to 0 to disable at boot.` }; + } + if (sub === 'stop') { + setPolling(false); + return { kind: 'success', text: 'CI bot polling disabled; /ci scan still runs on demand.' }; + } + if (sub === 'run') { + const target = rest.join(' ').trim(); + if (target.length === 0) + return { kind: 'error', text: 'Usage: /ci run (number, #number, owner/repo#number, or pull URL)' }; + const ref = state.parsePrRef(target); + if (ref === null) + return { kind: 'error', text: `"${target}" is not a PR reference. Use a number, "#number", "owner/repo#number", or a pull URL.` }; + const repoResult = ref.repo !== undefined ? { ok: true, repo: ref.repo } : await state.resolveRepo(undefined, invocation.signal); + if (!repoResult.ok) + return { kind: 'error', text: `${repoResult.message}. ${repoResult.guidance}` }; + const outcome = await runCiPipeline(state, { repo: repoResult.repo, pr: ref.number, task: 'review', signal: invocation.signal }); + if (outcome.status === 'error') + return { kind: 'error', text: `${outcome.message}${outcome.guidance !== undefined ? `\n${outcome.guidance}` : ''}` }; + return { + kind: 'success', + text: `PR #${outcome.pr} (${outcome.repo}): verdict ${outcome.verdict}${outcome.alreadyReviewed ? ' (already reviewed at this head commit)' : ''}\n${outcome.summary}` + + `${outcome.checkRun !== undefined ? `\ncheck: ${outcome.checkRun.url} (${outcome.checkRun.conclusion})` : ''}` + + `${outcome.review !== undefined && outcome.review.url.length > 0 ? `\nreview: ${outcome.review.url}` : ''}` + + `${outcome.files !== undefined ? `\nreports: ${outcome.files.json} · ${outcome.files.markdown}` : ''}`, + }; + } + return { kind: 'error', text: `unknown /ci subcommand "${sub}". Usage: /ci scan | status | start | stop | run ` }; + }), + ]; + return () => { + if (timer !== undefined) + clearInterval(timer); + for (const dispose of disposers) + dispose(); + }; +} +//# sourceMappingURL=bot.js.map \ No newline at end of file diff --git a/lib/ci/bot.js.map b/lib/ci/bot.js.map new file mode 100644 index 0000000..1dd14e9 --- /dev/null +++ b/lib/ci/bot.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bot.js","sourceRoot":"","sources":["../../src/ci/bot.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/ci/pipeline.d.ts b/lib/ci/pipeline.d.ts new file mode 100644 index 0000000..3edf4fd --- /dev/null +++ b/lib/ci/pipeline.d.ts @@ -0,0 +1,84 @@ +import type { Finding } from '../review.ts'; +import { type GithubState, type RateLimitValue } from '../state.ts'; +/** The gate verdict: pass, needs changes, or skipped by the filters. */ +export type CiVerdict = 'pass' | 'needs-changes' | 'skipped'; +/** Tasks the pipeline (and the `ci_run` tool) understands. */ +export type CiTask = 'review' | 'analyze' | 'publish'; +export interface CheckRunValue { + id: number; + url: string; + conclusion: string; +} +export interface ReviewPostValue { + url: string; + inlineComments: number; +} +/** Successful pipeline result — the canonical JSON the `ci_run` tool returns. */ +export interface CiRunResult { + status: 'ok'; + repo: string; + pr: number; + headSha: string; + verdict: CiVerdict; + engine: 'static' | 'model'; + findings: Finding[]; + summary: string; + truncated: boolean; + /** A previous run for this head commit already published its outcome. */ + alreadyReviewed: boolean; + /** Present when the diff text was requested (analyze task). */ + diffText?: string; + checkRun?: CheckRunValue; + review?: ReviewPostValue; + files?: { + json: string; + markdown: string; + }; + rateLimit: RateLimitValue; +} +/** Structured failure — token-free by construction. */ +export interface CiRunError { + status: 'error'; + code: string; + message: string; + guidance?: string; + rateLimit?: RateLimitValue; +} +export type CiRunOutcome = CiRunResult | CiRunError; +export interface CiRunOptions { + repo: string; + pr: number; + task: CiTask; + /** Diff cap for this run; defaults to the plugin config. */ + maxDiffChars?: number; + /** Review-body override (model-authored, publish task). */ + body?: string; + /** Extra findings authored by the model (publish task); merged with static ones. */ + findings?: Finding[]; + /** Post review comments; defaults to `ci.postComments`. */ + postComments?: boolean; + /** Publish the status check; defaults to true for review/publish. */ + postCheck?: boolean; + signal?: AbortSignal; +} +/** First line of the review body — the idempotency marker. */ +export declare function reviewMarker(headSha: string): string; +/** Whether a review body carries our marker for the given head commit. */ +export declare function hasReviewMarker(body: string | undefined, headSha: string): boolean; +/** Conclude the verdict from the findings under the configured `failOn` policy. */ +export declare function verdictFor(findings: readonly Finding[], failOn: 'error' | 'warning'): CiVerdict; +/** Markdown report body written next to the JSON result. */ +export declare function formatMarkdownReport(result: CiRunResult, options: { + blocking: boolean; + checkName: string; +}): string; +/** + * Run one CI pass over a pull request. Pure in the sense that every GitHub + * interaction goes through the per-operation token and the shared client; + * callers (bot, tool) own their own concurrency control. + * @param state - shared plugin state. + * @param options - target repo/PR, task, caps, and overrides. + * @returns the structured outcome; failures are token-free error variants. + */ +export declare function runCiPipeline(state: GithubState, options: CiRunOptions): Promise; +//# sourceMappingURL=pipeline.d.ts.map \ No newline at end of file diff --git a/lib/ci/pipeline.d.ts.map b/lib/ci/pipeline.d.ts.map new file mode 100644 index 0000000..f33a51d --- /dev/null +++ b/lib/ci/pipeline.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/ci/pipeline.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/ci/pipeline.js b/lib/ci/pipeline.js new file mode 100644 index 0000000..1a66d94 --- /dev/null +++ b/lib/ci/pipeline.js @@ -0,0 +1,380 @@ +/** + * The CI review pipeline — one deterministic pass over a pull request, + * shared by the polling bot, the `/ci run` command, and the one-shot + * `ci_run` tool used by the composite action's headless session. + * + * Order of operations: resolve the token → fetch PR metadata (head SHA, + * labels, totals) → apply label/path filters → idempotency checks (completed + * check run with our name, and the review-body marker) → fetch the capped + * diff and changed-file list → run the deterministic analyzers (line rules + * from src/review.ts, PR-level rules from ./review-rules.ts) → post inline + * review comments → publish the status check (success / failure / neutral + * per `ci.blocking`) → write `dsh-github-ci-result.json` and + * `dsh-github-ci-summary.md` (+ `$GITHUB_OUTPUT` lines when present). + * + * Token discipline matches the rest of the plugin: the value is resolved per + * operation and handed only to the REST client — never into findings, + * reports, check output, or thrown messages. + * @module dsh-github/ci/pipeline + */ +import { appendFileSync, mkdirSync, writeFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { analyzeDiff, sanitizeFileName } from "../review.js"; +import { analyzePr, matchesAnyGlob } from "./review-rules.js"; +import { rateLimitValue } from "../state.js"; +/** First line of the review body — the idempotency marker. */ +export function reviewMarker(headSha) { + return ``; +} +/** Whether a review body carries our marker for the given head commit. */ +export function hasReviewMarker(body, headSha) { + return body !== undefined && body.includes(reviewMarker(headSha)); +} +/** A review-timeout signal combining the caller's and the configured deadline. */ +function timeoutSignal(state, signal) { + const deadline = AbortSignal.timeout(state.config.requestTimeoutMs); + return signal === undefined ? deadline : AbortSignal.any([signal, deadline]); +} +/** Conclude the verdict from the findings under the configured `failOn` policy. */ +export function verdictFor(findings, failOn) { + const severity = (finding) => finding.severity === 'error' ? 2 : finding.severity === 'warning' ? 1 : 0; + const threshold = failOn === 'warning' ? 1 : 2; + return findings.some(finding => severity(finding) >= threshold) ? 'needs-changes' : 'pass'; +} +/** Merge model-authored findings into the static set, deduping by file+line+rule. */ +function mergeFindings(staticFindings, extra) { + const seen = new Set(); + const merged = []; + for (const finding of [...staticFindings, ...extra]) { + const key = `${finding.file}\u0000${finding.line ?? ''}\u0000${finding.rule}`; + if (seen.has(key)) + continue; + seen.add(key); + merged.push({ ...finding }); + } + return merged; +} +/** Summary line for a finished pass. */ +function summarize(verdict, findings, truncated) { + const counts = (severity) => findings.filter(finding => finding.severity === severity).length; + if (verdict === 'skipped') + return 'skipped: no label/path filter match'; + return `verdict ${verdict}: ${findings.length} finding(s) (${counts('error')} error / ${counts('warning')} warning / ${counts('info')} info)${truncated ? ' (diff truncated)' : ''}`; +} +/** Markdown report body written next to the JSON result. */ +export function formatMarkdownReport(result, options) { + const lines = [ + `# dsh-github CI review — PR #${result.pr} (${result.repo})`, + '', + `Verdict: **${result.verdict}**${result.verdict === 'needs-changes' ? ` (${options.blocking ? 'blocking' : 'non-blocking'})` : ''}${result.alreadyReviewed ? ' — already reviewed at this head commit' : ''}`, + '', + ]; + if (result.checkRun !== undefined) + lines.push(`Check: [${options.checkName}](${result.checkRun.url}) — conclusion \`${result.checkRun.conclusion}\``, ''); + if (result.review !== undefined) + lines.push(`Review: ${result.review.url} (${result.review.inlineComments} inline comment(s))`, ''); + if (result.findings.length === 0) { + lines.push('No findings.', ''); + } + else { + lines.push(`## Findings (${result.findings.length})`, ''); + for (const finding of result.findings) { + const anchor = finding.file.length === 0 ? 'PR' : `\`${sanitizeFileName(finding.file)}\`${finding.line !== null ? `:${finding.line}` : ''}`; + lines.push(`- **${finding.severity}** \`${finding.rule}\` ${anchor}: ${finding.message}`); + } + lines.push(''); + } + if (result.truncated) + lines.push('> Note: the diff exceeded the cap and was truncated; this report covers only the examined range.', ''); + lines.push('*Generated by [dsh-github](https://github.com/PerryLink/dsh-github) CI.*'); + return lines.join('\n'); +} +/** Directory the report files land in: env var → config → workspace dir. */ +function reportDirectory(state) { + const fromEnv = process.env.DSH_GITHUB_CI_OUTPUT_DIR?.trim(); + if (fromEnv !== undefined && fromEnv.length > 0) + return fromEnv; + if (state.config.ci.reportDir.trim().length > 0) + return state.config.ci.reportDir; + return state.workspaceDir; +} +/** Write the JSON + Markdown reports and, when present, `$GITHUB_OUTPUT` lines. */ +function writeReports(state, result) { + const dir = reportDirectory(state); + mkdirSync(dir, { recursive: true }); + const jsonPath = join(dir, 'dsh-github-ci-result.json'); + const markdownPath = join(dir, 'dsh-github-ci-summary.md'); + writeFileSync(jsonPath, JSON.stringify({ schemaVersion: 1, ...result, files: { json: jsonPath, markdown: markdownPath } }, null, 2) + '\n'); + writeFileSync(markdownPath, formatMarkdownReport(result, { blocking: state.config.ci.blocking, checkName: state.config.ci.checkName }) + '\n'); + const outputFile = process.env.GITHUB_OUTPUT; + if (outputFile !== undefined && outputFile.length > 0) { + appendFileSync(outputFile, `verdict=${result.verdict}\n` + + `report-json=${jsonPath}\n` + + `report-markdown=${markdownPath}\n` + + `${result.checkRun !== undefined ? `check-url=${result.checkRun.url}\n` : ''}`); + } + return { json: jsonPath, markdown: markdownPath }; +} +/** The published review body: marker, PR-level findings, and (optionally) the model override. */ +function buildReviewBody(headSha, prFindings, override, truncated) { + const sections = [reviewMarker(headSha), '## dsh-github review']; + if (prFindings.length > 0) { + sections.push(''); + for (const finding of prFindings) { + const anchor = finding.file.length === 0 ? 'PR' : `\`${sanitizeFileName(finding.file)}\``; + sections.push(`- **${finding.severity}** \`${finding.rule}\` ${anchor}: ${finding.message}`); + } + } + if (override !== undefined && override.trim().length > 0) { + sections.push('', '## Review', '', override.trim()); + } + if (truncated) + sections.push('', '> Note: the diff exceeded the cap and was truncated; this report covers only the examined range.'); + return sections.join('\n'); +} +/** + * Run one CI pass over a pull request. Pure in the sense that every GitHub + * interaction goes through the per-operation token and the shared client; + * callers (bot, tool) own their own concurrency control. + * @param state - shared plugin state. + * @param options - target repo/PR, task, caps, and overrides. + * @returns the structured outcome; failures are token-free error variants. + */ +export async function runCiPipeline(state, options) { + const signal = timeoutSignal(state, options.signal); + const maxDiffChars = options.maxDiffChars !== undefined && options.maxDiffChars > 0 ? Math.floor(options.maxDiffChars) : state.config.maxDiffChars; + const postComments = options.task !== 'analyze' && (options.postComments ?? state.config.ci.postComments); + const postCheck = options.task !== 'analyze' && (options.postCheck ?? true); + const token = await state.resolveToken(signal); + if (!token.ok) { + return { status: 'error', code: token.error.code, message: token.error.message, guidance: token.error.guidance }; + } + const client = state.client(token.token.value); + const errorCode = (error) => error instanceof Error && error.name === 'AbortError' ? 'aborted' + : error instanceof Error && 'status' in error && typeof error.status === 'number' ? `github-api-${error.status}` : 'fetch-failed'; + const rateLimitOf = (error) => { + if (error instanceof Error && 'rateLimit' in error) { + const info = error.rateLimit; + if (info !== undefined) + return { remaining: info.remaining, resetAt: info.resetAt }; + } + return undefined; + }; + const fail = (error) => ({ + status: 'error', + code: errorCode(error), + message: error instanceof Error ? error.message : 'CI review failed', + ...rateLimitOf(error) !== undefined ? { rateLimit: rateLimitOf(error) } : {}, + }); + let meta; + let rateLimit = { remaining: null, resetAt: null }; + try { + const response = await client.requestJson('GET', `/repos/${options.repo}/pulls/${options.pr}`, { signal }); + meta = response.data; + rateLimit = rateLimitValue(response.rateLimit); + } + catch (error) { + return fail(error); + } + const headSha = meta.head?.sha ?? ''; + if (headSha.length === 0) + return { status: 'error', code: 'no-head-sha', message: `PR #${options.pr} reports no head commit` }; + const additions = meta.additions ?? 0; + const deletions = meta.deletions ?? 0; + const labels = (meta.labels ?? []).map(label => label.name ?? '').filter(name => name.length > 0); + // Filter step: label and path filters skip the PR without posting anything. + const labelMatch = state.config.ci.labelFilters.length === 0 + || labels.some(label => state.config.ci.labelFilters.some(filter => filter.trim() === label)); + let files = []; + try { + for (let page = 1; page <= 4; page += 1) { + const response = await client.requestJson('GET', `/repos/${options.repo}/pulls/${options.pr}/files?per_page=100&page=${page}`, { signal }); + for (const entry of response.data) { + files.push({ path: entry.filename ?? '', added: entry.additions ?? 0, removed: entry.deletions ?? 0 }); + } + if (response.data.length < 100 || files.length >= 400) + break; + } + } + catch { + files = []; // path filtering degrades to "match all" when the file list is unavailable. + } + const pathMatch = state.config.ci.pathFilters.length === 0 + || files.length === 0 + || files.some(file => matchesAnyGlob(file.path, state.config.ci.pathFilters)); + if (!labelMatch || !pathMatch) { + let checkRun; + if (postCheck) { + checkRun = await publishCheck(client, options.repo, headSha, state, 'skipped', 0, 'skipped: no label/path filter match'); + } + const result = { + status: 'ok', + repo: options.repo, + pr: options.pr, + headSha, + verdict: 'skipped', + engine: state.config.ci.engine, + findings: [], + summary: summarize('skipped', [], false), + truncated: false, + alreadyReviewed: false, + ...checkRun !== undefined ? { checkRun } : {}, + rateLimit, + }; + const reportFiles = options.task !== 'analyze' ? writeReports(state, result) : undefined; + return { ...result, ...reportFiles !== undefined ? { files: reportFiles } : {} }; + } + // Idempotency: a completed check run for this head commit means the gate was + // already published; a review-body marker means comments were already posted. + // The marker scan always runs (not only when the check is missing), so a + // rerun after a comment-only failure can repair the comments without + // duplicating them. + let existingCheck; + let commentsPosted = false; + try { + const checkName = encodeURIComponent(state.config.ci.checkName); + const response = await client.requestJson('GET', `/repos/${options.repo}/commits/${headSha}/check-runs?check_name=${checkName}`, { signal }); + existingCheck = (response.data.check_runs ?? []).find(run => run.status === 'completed'); + } + catch { + existingCheck = undefined; + } + if (postComments) { + try { + const response = await client.requestJson('GET', `/repos/${options.repo}/pulls/${options.pr}/reviews?per_page=100`, { signal }); + commentsPosted = response.data.some(review => hasReviewMarker(review.body, headSha)); + } + catch { + commentsPosted = false; + } + } + // The deterministic analysis runs even for an already-reviewed PR, so a + // re-run can refresh the gate from the same inputs (zero cost, stable). + let diffText = ''; + let truncated = false; + try { + const text = await client.requestText('GET', `/repos/${options.repo}/pulls/${options.pr}`, { signal }); + truncated = text.text.length > maxDiffChars; + diffText = truncated ? text.text.slice(0, maxDiffChars) : text.text; + } + catch (error) { + return fail(error); + } + const lineFindings = analyzeDiff(diffText, maxDiffChars, { maxFindings: state.config.maxFindings, maxLineLength: state.config.maxLineLength }).findings; + const prFindings = analyzePr({ + files, + additions, + deletions, + options: state.config.ci, + }); + const staticFindings = [...prFindings, ...lineFindings]; + const extraFindings = options.task === 'publish' ? options.findings ?? [] : []; + const findings = mergeFindings(staticFindings, extraFindings); + const verdict = verdictFor(findings, state.config.ci.failOn); + if (options.task === 'analyze') { + return { + status: 'ok', + repo: options.repo, + pr: options.pr, + headSha, + verdict: 'skipped', + engine: state.config.ci.engine, + findings: staticFindings, + summary: 'analysis prepared; no comments or checks were posted', + truncated, + alreadyReviewed: existingCheck !== undefined || commentsPosted, + diffText, + rateLimit, + }; + } + let review; + if (postComments && !commentsPosted) { + const inline = findings.filter(finding => finding.line !== null).slice(0, state.config.maxFindings); + const prLevel = findings.filter(finding => finding.line === null); + try { + const posted = await client.requestJson('POST', `/repos/${options.repo}/pulls/${options.pr}/reviews`, { + signal, + body: { + body: buildReviewBody(headSha, prLevel, options.body, truncated), + event: 'COMMENT', + ...inline.length > 0 ? { + comments: inline.map(finding => ({ + path: finding.file, + line: finding.line, + body: `**${finding.severity}** \`${finding.rule}\`: ${finding.message}`, + })), + } : {}, + }, + }); + review = { url: posted.data.html_url ?? '', inlineComments: inline.length }; + } + catch (error) { + return fail(error); + } + } + else if (postComments) { + review = { url: '', inlineComments: 0 }; // already posted at this head commit + } + let checkRun; + if (postCheck && existingCheck === undefined) { + checkRun = await publishCheck(client, options.repo, headSha, state, verdict, findings.length, summarize(verdict, findings, truncated)); + } + else if (existingCheck !== undefined) { + checkRun = { + id: existingCheck.id ?? 0, + url: existingCheck.html_url ?? '', + conclusion: existingCheck.conclusion ?? '', + }; + } + const effectiveVerdict = existingCheck !== undefined ? verdictFromConclusion(existingCheck.conclusion) : verdict; + const result = { + status: 'ok', + repo: options.repo, + pr: options.pr, + headSha, + verdict: effectiveVerdict, + engine: state.config.ci.engine, + findings, + summary: existingCheck !== undefined ? `already reviewed at ${headSha.slice(0, 7)}: ${summarize(effectiveVerdict, findings, truncated)}` : summarize(effectiveVerdict, findings, truncated), + truncated, + alreadyReviewed: existingCheck !== undefined || commentsPosted, + ...review !== undefined ? { review } : {}, + ...checkRun !== undefined ? { checkRun } : {}, + rateLimit, + }; + const reportFiles = writeReports(state, result); + return { ...result, files: reportFiles }; +} +/** Verdict recovered from an existing check conclusion. */ +function verdictFromConclusion(conclusion) { + if (conclusion === 'failure' || conclusion === 'action_required') + return 'needs-changes'; + if (conclusion === 'neutral') + return 'skipped'; + return 'pass'; +} +/** Create one completed status check for the run. */ +async function publishCheck(client, repo, headSha, state, verdict, findingCount, summary) { + const conclusion = verdict === 'pass' ? 'success' : verdict === 'needs-changes' ? (state.config.ci.blocking ? 'failure' : 'neutral') : 'neutral'; + try { + const posted = await client.requestJson('POST', `/repos/${repo}/commits/${headSha}/check-runs`, { + body: { + name: state.config.ci.checkName, + head_sha: headSha, + status: 'completed', + conclusion, + completed_at: new Date().toISOString(), + output: { + title: `dsh-github review: ${verdict}`, + summary: `${summary}\n\n${verdict === 'needs-changes' ? (state.config.ci.blocking ? 'Blocking: merge is held until the findings are addressed.' : 'Non-blocking: the gate reports findings without failing the check.') : ''}`, + annotations: [], + }, + }, + }); + return { id: posted.data.id ?? 0, url: posted.data.html_url ?? '', conclusion }; + } + catch { + return undefined; // the gate degrades to the report files; callers see the verdict in the result. + } +} +//# sourceMappingURL=pipeline.js.map \ No newline at end of file diff --git a/lib/ci/pipeline.js.map b/lib/ci/pipeline.js.map new file mode 100644 index 0000000..29d3c76 --- /dev/null +++ b/lib/ci/pipeline.js.map @@ -0,0 +1 @@ +{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/ci/pipeline.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/ci/review-rules.d.ts b/lib/ci/review-rules.d.ts new file mode 100644 index 0000000..c8ea9f3 --- /dev/null +++ b/lib/ci/review-rules.d.ts @@ -0,0 +1,41 @@ +/** + * PR-level review rules for the CI pipeline: change scope, test existence, + * and sensitive files. Line-level findings stay in src/review.ts; these rules + * reason about the pull request as a whole (file list, totals) and produce + * findings anchored to a file (`line: null`) or to the PR itself (`file: ''`). + * + * The rules are deterministic and model-free — the same review runs in the + * polling bot, the headless action, and the one-shot `ci_run` tool with + * identical output. + * @module dsh-github/ci/review-rules + */ +import type { Finding } from '../review.ts'; +import type { CiConfig } from '../config.ts'; +/** One changed file's stats, as reported by the PR files endpoint. */ +export interface ChangedFileStat { + path: string; + added: number; + removed: number; +} +/** Facts the PR-level rules reason over. */ +export interface PrReviewInput { + /** Changed files with per-file added/removed counts. */ + files: ChangedFileStat[]; + /** PR-wide added/removed line totals. */ + additions: number; + deletions: number; + /** Tunable rule options from the CI config. */ + options: Pick; +} +/** + * Translate one glob into an anchored RegExp supporting `*`, `**`, and `?`. + * A pattern without a `/` is a basename glob and matches at any depth + * (`.env` matches `config/.env`, `*.pem` matches `certs/server.pem`); + * patterns containing `/` match against the whole repository path. + */ +export declare function globToRegExp(pattern: string): RegExp; +/** Whether a repository path matches any of the configured globs. */ +export declare function matchesAnyGlob(path: string, patterns: readonly string[]): boolean; +/** PR-level findings for one pull request; deterministic and ordered. */ +export declare function analyzePr(input: PrReviewInput): Finding[]; +//# sourceMappingURL=review-rules.d.ts.map \ No newline at end of file diff --git a/lib/ci/review-rules.d.ts.map b/lib/ci/review-rules.d.ts.map new file mode 100644 index 0000000..3b7b485 --- /dev/null +++ b/lib/ci/review-rules.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"review-rules.d.ts","sourceRoot":"","sources":["../../src/ci/review-rules.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAE5C,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,KAAK,EAAE,eAAe,EAAE,CAAA;IACxB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,+CAA+C;IAC/C,OAAO,EAAE,IAAI,CAAC,QAAQ,EAClB,uBAAuB,GAAG,mBAAmB,GAC7C,gBAAgB,GAAG,kBAAkB,GACrC,iBAAiB,GAAG,eAAe,GAAG,iBAAiB,CAC1D,CAAA;CACF;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA4BpD;AAED,qEAAqE;AACrE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAGjF;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,EAAE,CAmEzD"} \ No newline at end of file diff --git a/lib/ci/review-rules.js b/lib/ci/review-rules.js new file mode 100644 index 0000000..5c6559c --- /dev/null +++ b/lib/ci/review-rules.js @@ -0,0 +1,108 @@ +/** + * Translate one glob into an anchored RegExp supporting `*`, `**`, and `?`. + * A pattern without a `/` is a basename glob and matches at any depth + * (`.env` matches `config/.env`, `*.pem` matches `certs/server.pem`); + * patterns containing `/` match against the whole repository path. + */ +export function globToRegExp(pattern) { + let source = ''; + for (let index = 0; index < pattern.length; index += 1) { + const char = pattern[index] ?? ''; + if (char === '*') { + if (pattern[index + 1] === '*') { + // `**/` matches any directory depth (including none). + if (pattern[index + 2] === '/') { + source += '(?:.*/)?'; + index += 2; + continue; + } + source += '.*'; + index += 1; + continue; + } + source += '[^/]*'; + continue; + } + if (char === '?') { + source += '[^/]'; + continue; + } + if ('\\^$.*+?()[]{}|'.includes(char)) + source += `\\${char}`; + else + source += char; + } + const prefix = pattern.includes('/') ? '' : '(?:.*/)?'; + return new RegExp(`^${prefix}${source}$`); +} +/** Whether a repository path matches any of the configured globs. */ +export function matchesAnyGlob(path, patterns) { + const regexes = patterns.map(pattern => globToRegExp(pattern)); + return regexes.some(regex => regex.test(path)); +} +/** PR-level findings for one pull request; deterministic and ordered. */ +export function analyzePr(input) { + const findings = []; + const { files, options } = input; + // Sensitive files: credentials, keys, secrets, and CI workflow edits need + // human eyes regardless of what the diff text itself looks like. + if (options.sensitivePathPatterns.length > 0) { + for (const file of files) { + if (matchesAnyGlob(file.path, options.sensitivePathPatterns)) { + findings.push({ + file: file.path, + line: null, + severity: options.sensitiveSeverity, + rule: 'sensitive-file', + message: 'sensitive path changed (credentials, keys, secrets, or CI workflows); review carefully and never embed secrets', + }); + } + } + } + // Change scope: total file count and line totals beyond the caps. + if (files.length > options.maxChangedFiles) { + findings.push({ + file: '', + line: null, + severity: 'info', + rule: 'large-change', + message: `PR touches ${files.length} files (cap ${options.maxChangedFiles}); consider splitting it into smaller changes`, + }); + } + if (input.additions > options.maxAddedLines) { + findings.push({ + file: '', + line: null, + severity: 'info', + rule: 'large-change', + message: `PR adds ${input.additions} lines (cap ${options.maxAddedLines}); consider splitting it into smaller changes`, + }); + } + if (input.deletions > options.maxRemovedLines) { + findings.push({ + file: '', + line: null, + severity: 'info', + rule: 'large-change', + message: `PR removes ${input.deletions} lines (cap ${options.maxRemovedLines}); double-check the removed behavior`, + }); + } + // Test existence: code changed without any test change. + if (options.codeExtensions.length > 0 && options.testPathPatterns.length > 0) { + const isCode = (path) => options.codeExtensions.some(ext => path.toLowerCase().endsWith(ext.toLowerCase())); + const isTest = (path) => matchesAnyGlob(path, options.testPathPatterns); + const codeFiles = files.filter(file => isCode(file.path)); + const testFiles = files.filter(file => isTest(file.path)); + if (codeFiles.length > 0 && testFiles.length === 0) { + findings.push({ + file: '', + line: null, + severity: 'warning', + rule: 'missing-tests', + message: `${codeFiles.length} code file(s) changed with no test changes; consider adding coverage for the new behavior`, + }); + } + } + return findings; +} +//# sourceMappingURL=review-rules.js.map \ No newline at end of file diff --git a/lib/ci/review-rules.js.map b/lib/ci/review-rules.js.map new file mode 100644 index 0000000..63c2ba2 --- /dev/null +++ b/lib/ci/review-rules.js.map @@ -0,0 +1 @@ +{"version":3,"file":"review-rules.js","sourceRoot":"","sources":["../../src/ci/review-rules.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/ci/tool.d.ts b/lib/ci/tool.d.ts new file mode 100644 index 0000000..a64b2da --- /dev/null +++ b/lib/ci/tool.d.ts @@ -0,0 +1,4 @@ +import type { GithubState } from '../state.ts'; +/** `ci_run`: run one CI review pass (write; approval-gated upstream). */ +export declare function ciRunTool(state: GithubState): import("@deepseek-ai/dsh-tools").ToolDefinition; +//# sourceMappingURL=tool.d.ts.map \ No newline at end of file diff --git a/lib/ci/tool.d.ts.map b/lib/ci/tool.d.ts.map new file mode 100644 index 0000000..84c6858 --- /dev/null +++ b/lib/ci/tool.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/ci/tool.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAmB9C,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,mDAiH3C"} \ No newline at end of file diff --git a/lib/ci/tool.js b/lib/ci/tool.js new file mode 100644 index 0000000..7b62a57 --- /dev/null +++ b/lib/ci/tool.js @@ -0,0 +1,155 @@ +/** + * The `ci_run` tool — the one-shot CI pipeline entry point used by the + * composite action's headless session (and available in interactive sessions + * where `ci.enabled` is on). + * + * Tasks: + * - `review`: one deterministic pass — analyze, post comments (configurable), + * publish the status check, and write the JSON/Markdown reports. + * - `analyze`: read-only preparation — returns the capped diff and static + * findings without any write, so a `model` engine can author its own body. + * - `publish`: post the (optionally model-authored) review and the check. + * + * Every write is gated by the same `tools/pre-execute` approval gate as the + * other tools: interactive sessions ask the human; the CI driver + * (`DSH_GITHUB_CI_DRIVER=1`) auto-allows exactly the actions listed in + * `ci.autoApprove`. + * @module dsh-github/ci/tool + */ +import { defineTool } from '@deepseek-ai/dsh-tools'; +import { errorValue } from "../tools.js"; +import { ERROR_SCHEMA, RATE_LIMIT_SCHEMA } from "../tools.js"; +import { ciRunCall, ciRunResult } from "../present.js"; +import { identityMeta } from "../present.js"; +import { runCiPipeline } from "./pipeline.js"; +const FINDING_SCHEMA = { + type: 'object', + additionalProperties: false, + properties: { + file: { type: 'string', required: true }, + line: { oneOf: [{ type: 'integer' }, { type: 'null' }] }, + severity: { type: 'string', required: true, enum: ['info', 'warning', 'error'] }, + rule: { type: 'string', required: true }, + message: { type: 'string', required: true }, + }, +}; +const TASKS = ['review', 'analyze', 'publish']; +/** `ci_run`: run one CI review pass (write; approval-gated upstream). */ +export function ciRunTool(state) { + return defineTool({ + name: 'ci_run', + description: 'Run one dsh-github CI pass over a pull request. task "review" analyzes the diff, posts inline ' + + 'review comments, publishes the status check, and writes dsh-github-ci-result.json / dsh-github-ci-summary.md. ' + + 'task "analyze" returns the capped diff and static findings without writing anything (read-only), so you can ' + + 'author the review yourself. task "publish" posts your review `body`/`findings` and the check. Repeated runs ' + + 'for the same head commit are idempotent (comments and checks are not duplicated). Requires approval unless ' + + 'auto-approved by the CI driver configuration.', + parameters: { + task: { type: 'string', required: true, enum: [...TASKS], description: 'Which CI pass to run.' }, + pr: { type: 'string', required: true, description: 'PR number, #number, owner/repo#number, or pull URL.' }, + ownerRepo: { type: 'string', description: 'Repository as owner/repo. Defaults to configured or git origin.' }, + maxDiffChars: { type: 'number', description: 'Cap for the diff text. Defaults to the plugin config.' }, + body: { type: 'string', description: 'Review-body override (publish task).' }, + findings: { type: 'array', items: FINDING_SCHEMA, description: 'Extra findings authored by you (publish task).' }, + postComments: { type: 'boolean', description: 'Post review comments. Defaults to the ci.postComments config.' }, + postCheck: { type: 'boolean', description: 'Publish the status check. Defaults to true.' }, + }, + output: { + schema: { + oneOf: [{ + type: 'object', + additionalProperties: false, + properties: { + status: { type: 'string', required: true, const: 'ok' }, + repo: { type: 'string', required: true }, + pr: { type: 'integer', required: true }, + headSha: { type: 'string', required: true }, + verdict: { type: 'string', required: true, enum: ['pass', 'needs-changes', 'skipped'] }, + engine: { type: 'string', required: true, enum: ['static', 'model'] }, + findings: { type: 'array', items: FINDING_SCHEMA }, + summary: { type: 'string', required: true }, + truncated: { type: 'boolean', required: true }, + alreadyReviewed: { type: 'boolean', required: true }, + diffText: { type: 'string' }, + checkRun: { + type: 'object', + additionalProperties: false, + properties: { + id: { type: 'integer', required: true }, + url: { type: 'string', required: true }, + conclusion: { type: 'string', required: true }, + }, + }, + review: { + type: 'object', + additionalProperties: false, + properties: { + url: { type: 'string', required: true }, + inlineComments: { type: 'integer', required: true }, + }, + }, + files: { + type: 'object', + additionalProperties: false, + properties: { + json: { type: 'string', required: true }, + markdown: { type: 'string', required: true }, + }, + }, + rateLimit: RATE_LIMIT_SCHEMA, + }, + }, ERROR_SCHEMA], + }, + render: (args, value) => { + if (value.status === 'error') { + return [{ type: 'text', text: `${value.message}${value.guidance !== undefined ? `\n${value.guidance}` : ''}` }]; + } + const lines = [`CI ${args.task}: PR #${value.pr} (${value.repo}) verdict ${value.verdict}`, value.summary]; + if (value.checkRun !== undefined) + lines.push(`check: ${value.checkRun.url} (${value.checkRun.conclusion})`); + if (value.review !== undefined && value.review.url.length > 0) + lines.push(`review: ${value.review.url}`); + if (value.files !== undefined) + lines.push(`reports: ${value.files.json} · ${value.files.markdown}`); + if (value.diffText !== undefined) + lines.push(`diff (${value.diffText.length} chars${value.truncated ? ', truncated' : ''}):\n${value.diffText}`); + return [{ type: 'text', text: lines.join('\n') }]; + }, + presentationMeta: identityMeta, + }, + isConcurrencySafe: () => false, + presentCall: ciRunCall, + presentResult: ciRunResult, + async execute(args, exec) { + const ref = state.parsePrRef(args.pr); + if (ref === null) + return errorValue('invalid-pr', `"${args.pr}" is not a PR reference`, 'Use a number, "#number", "owner/repo#number", or a pull URL.'); + const repoResult = ref.repo !== undefined ? { ok: true, repo: ref.repo } : await state.resolveRepo(undefined, exec.signal); + if (!repoResult.ok) + return errorValue(repoResult.code, repoResult.message, repoResult.guidance); + const findings = args.findings?.map(finding => ({ + file: String(finding.file), + line: finding.line ?? null, + severity: finding.severity, + rule: String(finding.rule), + message: String(finding.message), + })) ?? []; + const outcome = await runCiPipeline(state, { + repo: repoResult.repo, + pr: ref.number, + task: args.task, + ...args.maxDiffChars !== undefined && args.maxDiffChars > 0 ? { maxDiffChars: Math.floor(args.maxDiffChars) } : {}, + ...args.body !== undefined ? { body: args.body } : {}, + ...findings.length > 0 ? { findings } : {}, + ...args.postComments !== undefined ? { postComments: args.postComments } : {}, + ...args.postCheck !== undefined ? { postCheck: args.postCheck } : {}, + signal: exec.signal, + }); + if (outcome.status === 'error') { + return errorValue(outcome.code, outcome.message, outcome.guidance, outcome.rateLimit !== undefined ? outcome.rateLimit : undefined); + } + return outcome; + }, + }); +} +//# sourceMappingURL=tool.js.map \ No newline at end of file diff --git a/lib/ci/tool.js.map b/lib/ci/tool.js.map new file mode 100644 index 0000000..0a630a8 --- /dev/null +++ b/lib/ci/tool.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/ci/tool.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/config.d.ts b/lib/config.d.ts index 6a27900..97b9de8 100644 --- a/lib/config.d.ts +++ b/lib/config.d.ts @@ -9,9 +9,56 @@ */ import z from '@deepseek-ai/schemastery'; /** GitHub write actions the plugin may perform (each still requires approval). */ -export type GithubAction = 'pr.create' | 'review.post' | 'issue.create' | 'issue.comment' | 'issue.close' | 'pr.merge' | 'pr.update'; +export type GithubAction = 'pr.create' | 'review.post' | 'issue.create' | 'issue.comment' | 'issue.close' | 'pr.merge' | 'pr.update' | 'ci.run'; /** Where a GitHub token is looked up. `auto` tries them in order. */ export type TokenSource = 'auto' | 'credentials' | 'env' | 'gh'; +/** + * The CI surface: the one-shot `ci_run` tool, the polling review bot, the + * `/ci` command family, and the status-check gate. Every tunable is a Schema + * key so the composite action can map its inputs 1:1 onto this section. + */ +export interface CiConfig { + /** Master switch for the CI surface. Defaults to false (interactive use unchanged). */ + enabled: boolean; + /** Review engine: `static` runs the deterministic analyzer; `model` lets the headless agent author the review body. */ + engine: 'static' | 'model'; + /** + * Write actions auto-allowed while running as the CI driver + * (`DSH_GITHUB_CI_DRIVER=1`, unattended). Empty in interactive sessions — + * there every write still asks the human. + */ + autoApprove: GithubAction[]; + /** Status-check name published by the CI gate (per PR head commit). */ + checkName: string; + /** `needs-changes` verdict → check conclusion `failure`; `false` publishes `neutral` instead (non-blocking gate). */ + blocking: boolean; + /** Lowest severity that flips the verdict to `needs-changes`. */ + failOn: 'error' | 'warning'; + /** Review-bot poll interval; `0` disables polling (manual `/ci scan` still works). */ + pollIntervalMs: number; + /** Label filters; a PR must carry at least one listed label. Empty = all PRs. */ + labelFilters: string[]; + /** Path filters (globs, e.g. `src/**`); when set, a PR must touch a matching path. Empty = all PRs. */ + pathFilters: string[]; + /** Sensitive-path globs flagged by the sensitive-file rule (error/warning per `sensitiveSeverity`). */ + sensitivePathPatterns: string[]; + /** Severity of the sensitive-file rule. */ + sensitiveSeverity: 'error' | 'warning'; + /** File extensions treated as code by the test-existence rule (with leading dot). */ + codeExtensions: string[]; + /** Path globs treated as tests by the test-existence rule. */ + testPathPatterns: string[]; + /** Scope caps for the change-size rule (`large-change` findings). */ + maxChangedFiles: number; + maxAddedLines: number; + maxRemovedLines: number; + /** Cap of concurrently reviewed PRs inside one bot scan. */ + maxConcurrent: number; + /** Whether the pipeline posts review comments (inline findings + PR-level body). */ + postComments: boolean; + /** Report-file directory; defaults to the CI output directory env var, then the workspace dir. */ + reportDir: string; +} export interface Config { /** * Token lookup order: `auto` resolves credentials-seam reference → `env` @@ -55,12 +102,23 @@ export interface Config { retryBaseMs: number; /** Ceiling for 429 retry backoff. */ retryMaxWaitMs: number; + /** Hard per-request timeout; aborts the fetch when exceeded. */ + requestTimeoutMs: number; /** GitHub REST base URL; change for GitHub Enterprise. */ apiBaseUrl: string; /** Whitelist of write actions; everything else is denied before approval. */ allowedActions: GithubAction[]; /** Working directory for read-only git inspection; defaults to the process cwd. */ workspaceDir?: string; + /** CI integration: bot, gate, and one-shot runner (see {@link CiConfig}). */ + ci: CiConfig; } +/** Default sensitive-path globs for the sensitive-file rule. */ +export declare const DEFAULT_SENSITIVE_PATTERNS: string[]; +/** Default code extensions for the test-existence rule (with leading dot). */ +export declare const DEFAULT_CODE_EXTENSIONS: string[]; +/** Default test-path globs for the test-existence rule. */ +export declare const DEFAULT_TEST_PATTERNS: string[]; +export declare const CiConfig: z; export declare const Config: z; //# sourceMappingURL=config.d.ts.map \ No newline at end of file diff --git a/lib/config.d.ts.map b/lib/config.d.ts.map index 15fe942..56d7535 100644 --- a/lib/config.d.ts.map +++ b/lib/config.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,CAAC,MAAM,0BAA0B,CAAA;AAExC,kFAAkF;AAClF,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,eAAe,GAAG,aAAa,GAAG,UAAU,GAAG,WAAW,CAAA;AAEpI,qEAAqE;AACrE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,aAAa,GAAG,KAAK,GAAG,IAAI,CAAA;AAE/D,MAAM,WAAW,MAAM;IACrB;;;;OAIG;IACH,WAAW,EAAE,WAAW,CAAA;IACxB,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,4EAA4E;IAC5E,UAAU,EAAE,OAAO,CAAA;IACnB,0EAA0E;IAC1E,YAAY,EAAE,MAAM,CAAA;IACpB,oEAAoE;IACpE,kBAAkB,EAAE,MAAM,CAAA;IAC1B,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAA;IACnB,8EAA8E;IAC9E,kBAAkB,EAAE,MAAM,CAAA;IAC1B,gFAAgF;IAChF,gBAAgB,EAAE,MAAM,CAAA;IACxB,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAA;IACpB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAA;IACnB,uEAAuE;IACvE,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAA;IAC9B,0FAA0F;IAC1F,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAA;IAClB,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAA;IACnB,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAA;IACtB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAA;IAClB,6EAA6E;IAC7E,cAAc,EAAE,YAAY,EAAE,CAAA;IAC9B,mFAAmF;IACnF,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAID,eAAO,MAAM,MAAM,EAAE,CAAC,CAAC,MAAM,CA4D3B,CAAA"} \ No newline at end of file +{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/config.js b/lib/config.js index e28ff4c..7628aa4 100644 --- a/lib/config.js +++ b/lib/config.js @@ -9,6 +9,65 @@ */ import z from '@deepseek-ai/schemastery'; const OWNER_REPO_PATTERN = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/; +/** Default sensitive-path globs for the sensitive-file rule. */ +export const DEFAULT_SENSITIVE_PATTERNS = [ + '.env', '.env.*', '*.pem', '*.key', '*.p12', '*.pfx', + 'id_rsa*', 'id_ed25519*', 'id_dsa*', + '**/credentials*.json', '**/secrets/**', '**/.npmrc', '**/.pypirc', + '.github/workflows/*.yml', '.github/workflows/*.yaml', +]; +/** Default code extensions for the test-existence rule (with leading dot). */ +export const DEFAULT_CODE_EXTENSIONS = [ + '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.py', '.go', '.rs', + '.java', '.kt', '.c', '.h', '.cpp', '.hpp', '.cs', '.rb', '.php', + '.swift', '.scala', '.sh', '.ps1', +]; +/** Default test-path globs for the test-existence rule. */ +export const DEFAULT_TEST_PATTERNS = [ + '**/test/**', '**/tests/**', '**/__tests__/**', '**/spec/**', '**/e2e/**', + '**/*.test.*', '**/*.spec.*', '**/test_*', '**/*_test.*', +]; +const CI_ACTION_VALUES = ['pr.create', 'review.post', 'issue.create', 'issue.comment', 'issue.close', 'pr.merge', 'pr.update', 'ci.run']; +export const CiConfig = z.object({ + enabled: z.boolean().default(false) + .description('Master switch for the CI surface (ci_run tool, review bot, /ci commands, status-check gate).'), + engine: z.union(['static', 'model']).default('static') + .description('Review engine: static (deterministic analyzer) or model (headless agent authors the review body).'), + autoApprove: z.array(z.union(CI_ACTION_VALUES)).default([]) + .description('Write actions auto-allowed while running as the CI driver (DSH_GITHUB_CI_DRIVER=1); interactive sessions always ask.'), + checkName: z.string().default('dsh-github-review') + .description('Status-check name published by the CI gate.'), + blocking: z.boolean().default(true) + .description('needs-changes verdict fails the check; false publishes a neutral (non-blocking) conclusion.'), + failOn: z.union(['error', 'warning']).default('error') + .description('Lowest finding severity that flips the verdict to needs-changes.'), + pollIntervalMs: z.number().step(1).min(0).default(60_000) + .description('Review-bot poll interval; 0 disables polling (manual /ci scan still works).'), + labelFilters: z.array(z.string()).default([]) + .description('Label filters for the bot and pipeline; a PR must carry at least one listed label. Empty matches all.'), + pathFilters: z.array(z.string()).default([]) + .description('Path globs for the bot and pipeline; when set, a PR must touch at least one matching path. Empty matches all.'), + sensitivePathPatterns: z.array(z.string()).default(DEFAULT_SENSITIVE_PATTERNS) + .description('Sensitive-path globs flagged by the sensitive-file rule.'), + sensitiveSeverity: z.union(['error', 'warning']).default('warning') + .description('Severity of the sensitive-file rule.'), + codeExtensions: z.array(z.string()).default(DEFAULT_CODE_EXTENSIONS) + .description('Extensions treated as code by the test-existence rule (leading dot).'), + testPathPatterns: z.array(z.string()).default(DEFAULT_TEST_PATTERNS) + .description('Path globs treated as tests by the test-existence rule.'), + maxChangedFiles: z.number().step(1).min(1).default(30) + .description('File-count cap before a large-change finding.'), + maxAddedLines: z.number().step(1).min(1).default(1000) + .description('Added-line cap before a large-change finding.'), + maxRemovedLines: z.number().step(1).min(1).default(1000) + .description('Removed-line cap before a large-change finding.'), + maxConcurrent: z.number().step(1).min(1).default(2) + .description('Cap of concurrently reviewed PRs inside one bot scan.'), + postComments: z.boolean().default(true) + .description('Whether the CI pipeline posts review comments (inline findings plus the PR-level body).'), + reportDir: z.string().default('') + .description('Report-file directory; defaults to DSH_GITHUB_CI_OUTPUT_DIR, then the workspace directory.'), +}); export const Config = z.object({ tokenSource: z.union(['auto', 'credentials', 'env', 'gh']) .default('auto') @@ -61,13 +120,18 @@ export const Config = z.object({ retryMaxWaitMs: z.number().step(1).min(1) .default(60_000) .description('Ceiling for 429 retry backoff.'), + requestTimeoutMs: z.number().step(1).min(1000) + .default(30_000) + .description('Hard per-request timeout; aborts the fetch when exceeded.'), apiBaseUrl: z.string() .default('https://api.github.com') .description('GitHub REST base URL (change for GitHub Enterprise).'), - allowedActions: z.array(z.union(['pr.create', 'review.post', 'issue.create', 'issue.comment', 'issue.close', 'pr.merge', 'pr.update'])) - .default(['pr.create', 'review.post', 'issue.create', 'issue.comment', 'issue.close', 'pr.merge', 'pr.update']) + allowedActions: z.array(z.union(CI_ACTION_VALUES)) + .default(['pr.create', 'review.post', 'issue.create', 'issue.comment', 'issue.close', 'pr.merge', 'pr.update', 'ci.run']) .description('Write actions this plugin may perform; each still requires approval.'), workspaceDir: z.string() .description('Working directory for read-only git inspection (defaults to process cwd).'), + ci: CiConfig + .description('CI integration: review bot, status-check gate, and the one-shot ci_run tool.'), }); //# sourceMappingURL=config.js.map \ No newline at end of file diff --git a/lib/config.js.map b/lib/config.js.map index 20617f0..4a1c14e 100644 --- a/lib/config.js.map +++ b/lib/config.js.map @@ -1 +1 @@ -{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/github.d.ts b/lib/github.d.ts index 1e5f3e3..df86a98 100644 --- a/lib/github.d.ts +++ b/lib/github.d.ts @@ -38,6 +38,8 @@ interface ClientOptions { maxRetries: number; retryBaseMs: number; retryMaxWaitMs: number; + /** Hard per-request deadline; aborts the fetch when exceeded. */ + requestTimeoutMs: number; fetchImpl: typeof fetch; } /** @@ -59,7 +61,7 @@ export declare class GithubClient { text: string; rateLimit: RateLimitInfo; }>; - /** Fetch with Authorization, 429/403-retry, and signal handling. */ + /** Fetch with Authorization, timeout, and retry (429/403 rate limits always; reads also on network errors and 5xx). */ private request; } /** Build a client from config; resolves the base URL once. */ diff --git a/lib/github.d.ts.map b/lib/github.d.ts.map index c5f7852..c1a0649 100644 --- a/lib/github.d.ts.map +++ b/lib/github.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,4EAA4E;AAC5E,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAA;gBAErB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa;CAMtE;AAED,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,CAAC,CAAA;IACP,SAAS,EAAE,aAAa,CAAA;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,4BAA4B;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,OAAO,KAAK,CAAA;CACxB;AAqDD;;;;;;;GAOG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAE3B,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;IAKjD,wEAAwE;IAClE,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAkBtH,yDAAyD;IACnD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,aAAa,CAAA;KAAE,CAAC;IAgBxI,oEAAoE;YACtD,OAAO;CA+BtB;AAED,8DAA8D;AAC9D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,GAAG,aAAa,CAQ/F"} \ No newline at end of file +{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,0EAA0E;IAC1E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,4EAA4E;AAC5E,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAA;gBAErB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa;CAMtE;AAED,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,CAAC,CAAA;IACP,SAAS,EAAE,aAAa,CAAA;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,4BAA4B;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,UAAU,aAAa;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,iEAAiE;IACjE,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,OAAO,KAAK,CAAA;CACxB;AAwDD;;;;;;;GAOG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAE3B,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa;IAKjD,wEAAwE;IAClE,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAkBtH,yDAAyD;IACnD,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,aAAa,CAAA;KAAE,CAAC;IAgBxI,uHAAuH;YACzG,OAAO;CA0CtB;AAED,8DAA8D;AAC9D,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,GAAG,aAAa,CAS/F"} \ No newline at end of file diff --git a/lib/github.js b/lib/github.js index 6b71f50..241720e 100644 --- a/lib/github.js +++ b/lib/github.js @@ -12,6 +12,8 @@ export class GithubError extends Error { const JSON_ACCEPT = 'application/vnd.github+json'; const API_VERSION = '2022-11-28'; const USER_AGENT = 'dsh-github'; +/** Methods safe to retry on network failures and 5xx responses (reads only; writes stay idempotent). */ +const SAFE_RETRY_METHODS = new Set(['GET', 'HEAD']); function rateLimitFromHeaders(headers) { const remaining = headers.get('x-ratelimit-remaining'); const reset = headers.get('x-ratelimit-reset'); @@ -112,10 +114,12 @@ export class GithubClient { } return { text: await response.text(), rateLimit }; } - /** Fetch with Authorization, 429/403-retry, and signal handling. */ + /** Fetch with Authorization, timeout, and retry (429/403 rate limits always; reads also on network errors and 5xx). */ async request(method, path, options) { let attempt = 0; for (;;) { + const timeoutSignal = AbortSignal.timeout(this.options.requestTimeoutMs); + const signal = options.signal === undefined ? timeoutSignal : AbortSignal.any([options.signal, timeoutSignal]); let response; try { response = await this.options.fetchImpl(new URL(path, this.options.apiBaseUrl), { @@ -128,18 +132,27 @@ export class GithubClient { ...options.body !== undefined ? { 'Content-Type': 'application/json' } : {}, }, ...options.body !== undefined ? { body: JSON.stringify(options.body) } : {}, - signal: options.signal, + signal, }); } catch (error) { if (options.signal?.aborted) throw options.signal.reason instanceof Error ? options.signal.reason : new Error('aborted'); + // A deadline exceeded or a transport failure is retryable for safe + // (read) methods only; a caller abort above always fails fast. + if (SAFE_RETRY_METHODS.has(method) && attempt < this.options.maxRetries) { + await sleep(Math.min(this.options.retryBaseMs * 2 ** attempt, this.options.retryMaxWaitMs), options.signal); + attempt += 1; + continue; + } throw error; } - // Retry primary (429) and secondary (403 + Retry-After) rate limits only; - // a 403 without Retry-After is a permission denial and must fail fast. + // Retry primary (429) and secondary (403 + Retry-After) rate limits for + // every method, plus transient 5xx responses for safe read methods; a + // 403 without Retry-After is a permission denial and must fail fast. const retryable = response.status === 429 - || (response.status === 403 && response.headers.get('retry-after') !== null); + || (response.status === 403 && response.headers.get('retry-after') !== null) + || (SAFE_RETRY_METHODS.has(method) && (response.status === 502 || response.status === 503 || response.status === 504)); if (!retryable || attempt >= this.options.maxRetries) return response; await sleep(retryDelayMs(response.headers, attempt, this.options), options.signal); @@ -154,6 +167,7 @@ export function clientOptionsFromConfig(config, fetchImpl) { maxRetries: config.maxRetries, retryBaseMs: config.retryBaseMs, retryMaxWaitMs: config.retryMaxWaitMs, + requestTimeoutMs: config.requestTimeoutMs, fetchImpl: fetchImpl ?? globalThis.fetch.bind(globalThis), }; } diff --git a/lib/github.js.map b/lib/github.js.map index 749d54e..69985cd 100644 --- a/lib/github.js.map +++ b/lib/github.js.map @@ -1 +1 @@ -{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/index.d.ts b/lib/index.d.ts index 1282116..41dacbd 100644 --- a/lib/index.d.ts +++ b/lib/index.d.ts @@ -1,16 +1,21 @@ /** * dsh-github: GitHub integration for DeepSeek Harness. * - * Tools: pr_create / pr_merge / pr_update (writes), gh_review (read), - * review_post (write), gh_issue (read), issue_open / issue_comment / - * issue_close (writes), gh_repo / gh_file / gh_search (reads). Commands: /pr - * create, /review (start|stop|post), /issue open. Background review jobs run - * the deterministic analyzer by default; `reviewMode: "model"` delegates the - * capped diff to a one-shot subagent through the host's `subagents` seam. - * Every GitHub write is gated by the tools/pre-execute approval listener - * (default ask) and the allowedActions whitelist; the token travels only - * through the credentials seam / environment / gh CLI and never reaches - * model-visible text, session events, or logs. + * Tools: pr_create / pr_merge / pr_update / review_post / issue_open / + * issue_comment / issue_close / ci_run (writes), gh_review / gh_issue / + * gh_search / gh_repo / gh_file (reads). Commands: /pr create, /review + * (start|stop|post), /issue open, /ci (scan|status|start|stop|run — when + * `ci.enabled`). Background review jobs run the deterministic analyzer by + * default; `reviewMode: "model"` delegates the capped diff to a one-shot + * subagent through the host's `subagents` seam. The CI surface (`ci.*` + * config) adds the polling review bot, the status-check gate, and the + * one-shot `ci_run` pipeline consumed by the composite action + * (`action.yml`). Every GitHub write is gated by the tools/pre-execute + * approval listener (default ask) and the allowedActions whitelist — except + * the CI driver (`DSH_GITHUB_CI_DRIVER=1`), which auto-allows exactly the + * actions listed in `ci.autoApprove`; the token travels only through the + * credentials seam / environment / gh CLI and never reaches model-visible + * text, session events, or logs. * * Model-visible ⇔ logged: the plugin appends NO custom session event types — * the host refuses logs with unknown out-of-repo event types, so all content diff --git a/lib/index.d.ts.map b/lib/index.d.ts.map index 743d9f2..a451b45 100644 --- a/lib/index.d.ts.map +++ b/lib/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AASzD,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,IAAI,YAAY,EAAE,MAAM,aAAa,CAAA;AAEjE,eAAO,MAAM,IAAI,eAAe,CAAA;AAEhC,iFAAiF;AACjF,eAAO,MAAM,MAAM,UAA2D,CAAA;AAE9E,OAAO,EAAE,MAAM,EAAE,CAAA;AACjB,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,CAAA;AAEtC,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,GAAE,UAAe,QAkBtF;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,QAEvD"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAWzD,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,IAAI,YAAY,EAAE,MAAM,aAAa,CAAA;AAEjE,eAAO,MAAM,IAAI,eAAe,CAAA;AAEhC,iFAAiF;AACjF,eAAO,MAAM,MAAM,UAA2D,CAAA;AAE9E,OAAO,EAAE,MAAM,EAAE,CAAA;AACjB,YAAY,EAAE,MAAM,IAAI,YAAY,EAAE,CAAA;AAEtC,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CACzB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,GAAE,UAAe,QAwBtF;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,QAEvD"} \ No newline at end of file diff --git a/lib/index.js b/lib/index.js index 5b09761..15f37ac 100644 --- a/lib/index.js +++ b/lib/index.js @@ -4,6 +4,8 @@ import { runGhCli } from "./credential.js"; import { prCreateTool, prMergeTool, prUpdateTool, ghReviewTool, reviewPostTool, ghIssueTool, issueOpenTool, issueCommentTool, issueCloseTool, ghSearchTool, ghRepoTool, ghFileTool, } from "./tools.js"; import { registerApprovalGate } from "./approval-gate.js"; import { registerCommands } from "./commands.js"; +import { registerCiBot } from "./ci/bot.js"; +import { ciRunTool } from "./ci/tool.js"; import { Config } from "./config.js"; export const name = 'dsh-github'; /** Services this plugin requires; all exist in any profile built on dsh-base. */ @@ -34,8 +36,14 @@ export function applyWithDeps(ctx, config, deps = {}) { ctx.tools.register(ghSearchTool(state)); ctx.tools.register(ghRepoTool(state)); ctx.tools.register(ghFileTool(state)); + if (config.ci.enabled) { + ctx.tools.register(ciRunTool(state)); + } ctx.effect(() => registerApprovalGate(ctx, state)); ctx.effect(() => registerCommands(ctx.commands, ctx.jobs, state)); + if (config.ci.enabled) { + ctx.effect(() => registerCiBot(ctx, ctx.commands, state)); + } } /** * Apply the plugin: register tools, commands, and the write-approval gate. diff --git a/lib/index.js.map b/lib/index.js.map index 82131b2..7cf618e 100644 --- a/lib/index.js.map +++ b/lib/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EAAE,SAAS,EAAkB,MAAM,UAAU,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAiB,MAAM,iBAAiB,CAAA;AAEzD,OAAO,EACL,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EACrE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAC1E,UAAU,EAAE,UAAU,GACvB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,MAAM,EAA+B,MAAM,aAAa,CAAA;AAEjE,MAAM,CAAC,MAAM,IAAI,GAAG,YAAY,CAAA;AAEhC,iFAAiF;AACjF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;AAE9E,OAAO,EAAE,MAAM,EAAE,CAAA;AAUjB;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY,EAAE,MAAoB,EAAE,OAAmB,EAAE;IACrF,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAiC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;IAEtM,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;IACvC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;IACtC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;IACvC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;IACvC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IACzC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;IACtC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IACxC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA;IAC3C,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;IACzC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;IACvC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IACrC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAA;IAErC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IAClD,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,GAAY,EAAE,MAAoB;IACtD,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;AAC5B,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/jobs.js b/lib/jobs.js index fda2a77..4e525ee 100644 --- a/lib/jobs.js +++ b/lib/jobs.js @@ -153,8 +153,9 @@ function runReviewWork(state, record, input) { /** Review prompt for the one-shot subagent (model review). */ function modelReviewPrompt(record, diffText, truncated) { return [ - `Review the following GitHub pull request diff for PR #${record.pr} in ${record.repo}.`, - 'You are a careful code reviewer. Analyze correctness, security, style, and maintainability.', + 'You are a careful software engineer reviewing a GitHub pull request.', + `Review the diff for PR #${record.pr} in ${record.repo}.`, + 'Analyze correctness, security, style, and maintainability.', 'Write the review as GitHub-flavored Markdown suitable for posting as a PR comment:', '- a short overall verdict first,', '- then concrete findings grouped by file with line numbers where possible.', diff --git a/lib/jobs.js.map b/lib/jobs.js.map index 3a35869..28a5f54 100644 --- a/lib/jobs.js.map +++ b/lib/jobs.js.map @@ -1 +1 @@ -{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,WAAW,EAAqB,MAAM,aAAa,CAAA;AAI5D,mFAAmF;AACnF,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAA;AA0B9C;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,cAAc,CAAC,QAAqB,EAAE,KAAkB,EAAE,KAA0B;IAClG,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,OAAO,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CACb,4GAA4G;cAC1G,4GAA4G,CAC/G,CAAA;IACH,CAAC;IACD,MAAM,MAAM,GAAoB;QAC9B,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,MAAM,EAAE,IAAI;KACb,CAAA;IACD,MAAM,QAAQ,GAAG;QACf,GAAG,KAAK;QACR,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,kBAAkB;QAC7D,YAAY,EAAE,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY;QAC7D,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;QAClC,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;KAC/C,CAAA;IAED,MAAM,IAAI,GAAiB;QACzB,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,gBAAgB,EAAE,EAAE,GAAG,IAAI;QAC3B,GAAG,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC;KAClD,CAAA;IAED,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/B,KAAK,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAChC,OAAO,EAAE,CAAA;AACX,CAAC;AAED,mEAAmE;AACnE,SAAS,aAAa,CAAC,KAAkB,EAAE,MAAuB,EAAE,KAA+I;IACjN,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,IAAI,YAAgC,CAAA;IAEpC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,YAAY,KAAK,SAAS,CAAA;QAC1B,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAA;IACrD,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAA;IAEnB,MAAM,IAAI,GAAG,CAAC,KAAK,IAAyB,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;YACzD,MAAM,iBAAiB,GAAG,cAAc,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;YAClE,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;gBAC/B,MAAM,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;gBAC3E,OAAO,iBAAiB,CAAA;YAC1B,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;gBACd,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAA;gBACxB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAA;gBAClC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAA;YACnH,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAE9C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAsB,KAAK,EAAE,UAAU,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;YAChJ,MAAM,oBAAoB,GAAG,cAAc,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;YACrE,IAAI,oBAAoB,KAAK,IAAI,EAAE,CAAC;gBAClC,MAAM,CAAC,MAAM,GAAG,oBAAoB,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;gBAC9E,OAAO,oBAAoB,CAAA;YAC7B,CAAC;YACD,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAA;YAExC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;YACvH,MAAM,gBAAgB,GAAG,cAAc,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;YACjE,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC9B,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;gBAC1E,OAAO,gBAAgB,CAAA;YACzB,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,YAAY,CAAA;YACvD,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;YAE7E,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;gBACxC,OAAO,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;YAChG,CAAC;YAED,MAAM,MAAM,GAAiB,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAA;YAC1J,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;YAEtB,MAAM,KAAK,GAAa,EAAE,CAAA;YAC1B,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAmB,KAAK,EAAE,UAAU,MAAM,CAAC,IAAI,YAAY,MAAM,CAAC,OAAO,IAAI,EAAE,aAAa,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;oBAC/J,MAAM,CAAC,SAAS,GAAG,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAA;oBAC5D,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;gBACvC,CAAC;gBAAC,MAAM,CAAC;oBACP,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;gBAC/B,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAY,KAAK,EAAE,UAAU,MAAM,CAAC,IAAI,UAAU,MAAM,CAAC,EAAE,sBAAsB,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;oBACpL,MAAM,CAAC,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAA;oBAC3C,KAAK,CAAC,IAAI,CAAC,6BAA6B,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;gBACjE,CAAC;gBAAC,MAAM,CAAC;oBACP,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;gBACrD,CAAC;YACH,CAAC;YAED,MAAM,CAAC,MAAM,GAAG,WAAW,CAAA;YAC3B,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,aAAa,CAAA;YACrD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;YACxD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;gBACjE,OAAO,OAAO,CAAA;YAChB,CAAC;YACD,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAA;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAA;YACxE,MAAM,CAAC,KAAK,GAAG,OAAO,CAAA;YACtB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;QAC9C,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;IACH,CAAC,CAAC,EAAE,CAAA;IAEJ,OAAO;QACL,MAAM,EAAE,CAAC,MAAe,EAAE,EAAE;YAC1B,YAAY,GAAG,MAAM,IAAI,WAAW,CAAA;YACpC,UAAU,CAAC,KAAK,EAAE,CAAA;QACpB,CAAC;QACD,IAAI;KACL,CAAA;AACH,CAAC;AAED,8DAA8D;AAC9D,SAAS,iBAAiB,CAAC,MAAuB,EAAE,QAAgB,EAAE,SAAkB;IACtF,OAAO;QACL,sEAAsE;QACtE,2BAA2B,MAAM,CAAC,EAAE,OAAO,MAAM,CAAC,IAAI,GAAG;QACzD,4DAA4D;QAC5D,oFAAoF;QACpF,kCAAkC;QAClC,4EAA4E;QAC5E,wDAAwD;QACxD,yGAAyG;QACzG,SAAS,CAAC,CAAC,CAAC,sGAAsG,CAAC,CAAC,CAAC,EAAE;QACvH,OAAO;QACP,SAAS;QACT,QAAQ;QACR,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,4EAA4E;AAC5E,KAAK,UAAU,cAAc,CAC3B,KAAkB,EAClB,MAAuB,EACvB,KAAkB,EAClB,UAA2B,EAC3B,YAAgC,EAChC,QAAgB,EAChB,SAAkB;IAElB,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;IACjC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,8FAA8F;QAC9F,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAA;QACxB,MAAM,CAAC,KAAK,GAAG,yCAAyC,CAAA;QACxD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,0BAA0B,EAAE,MAAM,EAAE,wHAAwH,EAAE,CAAA;IACnM,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,mBAAmB,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IACxE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAA;QACxB,MAAM,CAAC,KAAK,GAAG,iCAAiC,CAAA;QAChD,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,sBAAsB;YAC9B,MAAM,EAAE,oFAAoF;kBACxF,mFAAmF;SACxF,CAAA;IACH,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC1C,KAAK,EAAE,cAAc,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,IAAI,GAAG;YACjD,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;YAChF,MAAM,EAAE,KAAK;YACb,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAA;QACF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAA;YAC/B,IAAI,MAAM,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;gBACtC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAA;gBACxB,MAAM,CAAC,KAAK,GAAG,yBAAyB,MAAM,CAAC,UAAU,EAAE,CAAA;gBAC3D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,MAAM,CAAC,UAAU,EAAE,EAAE,CAAA;YAC3E,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;YAClH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAA;gBACxB,MAAM,CAAC,KAAK,GAAG,iCAAiC,CAAA;gBAChD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iCAAiC,EAAE,CAAA;YACxE,CAAC;YACD,MAAM,CAAC,MAAM,GAAG;gBACd,QAAQ,EAAE,EAAE;gBACZ,OAAO,EAAE,mCAAmC,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9F,QAAQ,EAAE,IAAI;gBACd,SAAS;aACV,CAAA;YACD,MAAM,CAAC,MAAM,GAAG,WAAW,CAAA;YAC3B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,iBAAiB,QAAQ,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QACpF,CAAC;gBAAS,CAAC;YACT,MAAM,GAAG,CAAC,OAAO,EAAE,CAAA;QACrB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,YAAY,CAAC,CAAA;QACxD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;YACjE,OAAO,OAAO,CAAA;QAChB,CAAC;QACD,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAA;QACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAA;QAC9E,MAAM,CAAC,KAAK,GAAG,OAAO,CAAA;QACtB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;IAC9C,CAAC;AACH,CAAC;AAED,8DAA8D;AAC9D,SAAS,eAAe,CAAC,IAA2E;IAClG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,oBAAoB,CAAA;IAClD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAA;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,MAAM,CAAA;IACtK,OAAO,GAAG,IAAI,CAAC,MAAM,cAAc,OAAO,aAAa,MAAM,SAAS,CAAA;AACxE,CAAC;AAED,4EAA4E;AAC5E,SAAS,cAAc,CAAC,UAA2B,EAAE,YAAgC;IACnF,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,IAAI,CAAA;IAC3C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAChD,CAAC;IACD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;IACnD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;AAChD,CAAC"} \ No newline at end of file diff --git a/lib/present.d.ts b/lib/present.d.ts index 0675e36..bee9633 100644 --- a/lib/present.d.ts +++ b/lib/present.d.ts @@ -342,4 +342,59 @@ export interface FileValue { export declare function ghFileCall(args: GhFileArgs): ToolCallView; /** Completed card for gh_file: first lines plus size facts. */ export declare function ghFileResult(_args: GhFileArgs, result: ToolResult): ToolResultView | undefined; +/** Narrow structural view of ci_run arguments. */ +export interface CiRunArgs { + task: 'review' | 'analyze' | 'publish'; + pr: string; + ownerRepo?: string; + maxDiffChars?: number; + body?: string; + findings?: Array<{ + file: string; + line?: number | null; + severity: 'info' | 'warning' | 'error'; + rule: string; + message: string; + }>; + postComments?: boolean; + postCheck?: boolean; +} +/** Narrow structural view of the ci_run canonical value. */ +export interface CiRunValueView { + status: 'ok'; + repo: string; + pr: number; + headSha: string; + verdict: 'pass' | 'needs-changes' | 'skipped'; + engine: 'static' | 'model'; + findings: Array<{ + file: string; + line: number | null; + severity: string; + rule: string; + message: string; + }>; + summary: string; + truncated: boolean; + alreadyReviewed: boolean; + diffText?: string; + checkRun?: { + id: number; + url: string; + conclusion: string; + }; + review?: { + url: string; + inlineComments: number; + }; + files?: { + json: string; + markdown: string; + }; + rateLimit: RateLimitValueView; +} +/** Pending card for ci_run. */ +export declare function ciRunCall(args: CiRunArgs): ToolCallView; +/** Completed card for ci_run: verdict plus the check link. */ +export declare function ciRunResult(_args: CiRunArgs, result: ToolResult): ToolResultView | undefined; //# sourceMappingURL=present.d.ts.map \ No newline at end of file diff --git a/lib/present.d.ts.map b/lib/present.d.ts.map index 2c9a47c..20e8b2a 100644 --- a/lib/present.d.ts.map +++ b/lib/present.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"present.d.ts","sourceRoot":"","sources":["../src/present.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"present.d.ts","sourceRoot":"","sources":["../src/present.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/present.js b/lib/present.js index f64dd7a..38104b9 100644 --- a/lib/present.js +++ b/lib/present.js @@ -253,4 +253,36 @@ export function ghFileResult(_args, result) { }], }; } +/** Pending card for ci_run. */ +export function ciRunCall(args) { + return { + card: 'generic', + title: `CI ${args.task}: ${args.pr}`, + rawInput: { + task: args.task, + pr: args.pr, + ...args.ownerRepo !== undefined ? { ownerRepo: args.ownerRepo } : {}, + ...args.maxDiffChars !== undefined ? { maxDiffChars: args.maxDiffChars } : {}, + ...args.body !== undefined ? { bodyChars: args.body.length } : {}, + ...args.findings !== undefined ? { findings: args.findings.length } : {}, + }, + }; +} +/** Completed card for ci_run: verdict plus the check link. */ +export function ciRunResult(_args, result) { + const value = result.meta; + if (value === undefined) + return undefined; + if (value.status === 'error') { + return { card: 'generic', title: 'CI run failed', content: [{ type: 'text', text: `${value.message}${value.guidance !== undefined ? `\n${value.guidance}` : ''}` }] }; + } + const lines = [`PR #${value.pr} in ${value.repo}: verdict ${value.verdict} (${value.findings.length} finding(s))${value.alreadyReviewed ? ' · already reviewed at this head commit' : ''}`]; + if (value.checkRun !== undefined) + lines.push(`check: ${value.checkRun.url} (${value.checkRun.conclusion})`); + if (value.review !== undefined && value.review.url.length > 0) + lines.push(`review: ${value.review.url} (${value.review.inlineComments} inline comment(s))`); + if (value.files !== undefined) + lines.push(`reports: ${value.files.json} · ${value.files.markdown}`); + return { card: 'generic', title: `CI review verdict: ${value.verdict}`, content: [{ type: 'text', text: lines.join('\n') }] }; +} //# sourceMappingURL=present.js.map \ No newline at end of file diff --git a/lib/present.js.map b/lib/present.js.map index 61813ea..11ac001 100644 --- a/lib/present.js.map +++ b/lib/present.js.map @@ -1 +1 @@ -{"version":3,"file":"present.js","sourceRoot":"","sources":["../src/present.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"present.js","sourceRoot":"","sources":["../src/present.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/review.d.ts b/lib/review.d.ts index efdaecc..c257052 100644 --- a/lib/review.d.ts +++ b/lib/review.d.ts @@ -56,6 +56,8 @@ export declare function parseDiffStats(diff: string, maxChars: number): DiffFile * @returns findings (capped), one-line summary, and Markdown post body. */ export declare function analyzeDiff(diff: string, maxChars: number, options?: AnalyzerOptions): ReviewReport; +/** Make a diff-derived file name safe to interpolate into Markdown. */ +export declare function sanitizeFileName(file: string): string; /** Markdown comment body grouped by file, ready for a PR issue comment. */ export declare function formatPostBody(findings: readonly Finding[], truncated: boolean): string; //# sourceMappingURL=review.d.ts.map \ No newline at end of file diff --git a/lib/review.d.ts.map b/lib/review.d.ts.map index 898e3f7..57270fc 100644 --- a/lib/review.d.ts.map +++ b/lib/review.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;AAE1D,8EAA8E;AAC9E,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,eAAe,CAAA;IACzB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,SAAS,EAAE,OAAO,CAAA;CACnB;AAKD,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAwBD,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BnH;AAED,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAqB7E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,YAAY,CAiCvG;AAgBD,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAuBvF"} \ No newline at end of file +{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;AAE1D,8EAA8E;AAC9E,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,eAAe,CAAA;IACzB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,EAAE,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,oEAAoE;IACpE,SAAS,EAAE,OAAO,CAAA;CACnB;AAKD,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAwBD,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BnH;AAED,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,iEAAiE;AACjE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAqB7E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,YAAY,CAiCvG;AAMD,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAuBvF"} \ No newline at end of file diff --git a/lib/review.js b/lib/review.js index 67ee597..6f609c2 100644 --- a/lib/review.js +++ b/lib/review.js @@ -124,7 +124,7 @@ function countSeverity(findings, severity) { return findings.filter(finding => finding.severity === severity).length; } /** Make a diff-derived file name safe to interpolate into Markdown. */ -function sanitizeFileName(file) { +export function sanitizeFileName(file) { return file .replace(/\\/g, '\\\\') .replace(/`/g, '\\`') diff --git a/lib/review.js.map b/lib/review.js.map index 6a3547f..dee1b32 100644 --- a/lib/review.js.map +++ b/lib/review.js.map @@ -1 +1 @@ -{"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"review.js","sourceRoot":"","sources":["../src/review.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/state.d.ts b/lib/state.d.ts index 1072d42..acd62a4 100644 --- a/lib/state.d.ts +++ b/lib/state.d.ts @@ -14,7 +14,7 @@ import { type GitRunner } from './git.ts'; import { type GhRunner, type TokenResolution } from './credential.ts'; import type { SubagentsService } from './types.ts'; import type { ReviewReport } from './review.ts'; -import type { Config } from './config.ts'; +import { type Config } from './config.ts'; /** Result of resolving which repository a call targets. */ export type RepoResolution = { ok: true; @@ -67,6 +67,8 @@ export interface GithubState { workspaceDir: string; /** Hostname of the configured REST API base, for origin-URL matching. */ apiHost: string; + /** True while this process is the composite action's CI driver (`DSH_GITHUB_CI_DRIVER=1`). */ + isCiDriver: boolean; /** Register one review-job record, evicting settled records past the cap. */ rememberRecord(id: string, record: ReviewJobRecord): void; } diff --git a/lib/state.d.ts.map b/lib/state.d.ts.map index ff144b6..3ce50c7 100644 --- a/lib/state.d.ts.map +++ b/lib/state.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/state.js b/lib/state.js index 1096d48..d735f9a 100644 --- a/lib/state.js +++ b/lib/state.js @@ -1,6 +1,7 @@ import { GithubClient, clientOptionsFromConfig } from "./github.js"; import { repoFromRemoteUrl } from "./git.js"; import { resolveToken } from "./credential.js"; +import { CiConfig } from "./config.js"; const REPO_GUIDANCE = 'Name the repository with the ownerRepo parameter, set defaultOwnerRepo in cordis.yml, or run inside a checkout with a GitHub origin remote.'; const REPO_PATTERN = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/; /** @@ -13,25 +14,29 @@ const REPO_PATTERN = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/; * @param fetchImpl - fetch implementation (injectable in tests). */ export function createState(ctx, config, runGit, runGh, fetchImpl) { - const clientOptions = clientOptionsFromConfig(config, fetchImpl); - const apiHost = new URL(config.apiBaseUrl).hostname.toLowerCase(); + // A composition omitting the whole `ci` block gets the schema defaults here, + // so every consumer can read `config.ci.*` without undefined checks. + const normalizedConfig = { ...config, ci: CiConfig(config.ci ?? {}) }; + const clientOptions = clientOptionsFromConfig(normalizedConfig, fetchImpl); + const apiHost = new URL(normalizedConfig.apiBaseUrl).hostname.toLowerCase(); const records = new Map(); const state = { - config, + config: normalizedConfig, credentials: ctx.credentials, subagents: ctx.subagents, records, runGit, runGh, - workspaceDir: config.workspaceDir ?? process.cwd(), + workspaceDir: normalizedConfig.workspaceDir ?? process.cwd(), apiHost, - resolveToken: (signal) => resolveToken(ctx.credentials, config.tokenSource, config.tokenRef, runGh, signal), + isCiDriver: process.env.DSH_GITHUB_CI_DRIVER === '1', + resolveToken: (signal) => resolveToken(ctx.credentials, normalizedConfig.tokenSource, normalizedConfig.tokenRef, runGh, signal), client: (token) => new GithubClient(token, clientOptions), resolveRepo: (ownerRepo, signal) => resolveRepo(state, ownerRepo, signal), parsePrRef: parsePrRef, rememberRecord: (id, record) => { records.set(id, record); - while (records.size > config.maxReviewRecords) { + while (records.size > normalizedConfig.maxReviewRecords) { const oldestSettled = [...records.entries()].find(([, item]) => item.status !== 'running'); if (oldestSettled === undefined) break; // every record is running; the cap is best-effort. diff --git a/lib/state.js.map b/lib/state.js.map index 0c1996f..57b72b5 100644 --- a/lib/state.js.map +++ b/lib/state.js.map @@ -1 +1 @@ -{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/tools.d.ts b/lib/tools.d.ts index 24a0335..506f2da 100644 --- a/lib/tools.d.ts +++ b/lib/tools.d.ts @@ -1,5 +1,68 @@ import { type GithubState, type RateLimitValue } from './state.ts'; import { type GithubErrorValue } from './present.ts'; +export declare const RATE_LIMIT_SCHEMA: { + readonly type: "object"; + readonly additionalProperties: false; + readonly properties: { + readonly remaining: { + readonly oneOf: readonly [{ + readonly type: "number"; + }, { + readonly type: "null"; + }]; + }; + readonly resetAt: { + readonly oneOf: readonly [{ + readonly type: "number"; + }, { + readonly type: "null"; + }]; + }; + }; + readonly required: true; +}; +export declare const ERROR_SCHEMA: { + readonly type: "object"; + readonly additionalProperties: false; + readonly properties: { + readonly status: { + readonly type: "string"; + readonly required: true; + readonly const: "error"; + }; + readonly code: { + readonly type: "string"; + readonly required: true; + }; + readonly message: { + readonly type: "string"; + readonly required: true; + }; + readonly guidance: { + readonly type: "string"; + }; + readonly rateLimit: { + readonly type: "object"; + readonly additionalProperties: false; + readonly properties: { + readonly remaining: { + readonly oneOf: readonly [{ + readonly type: "number"; + }, { + readonly type: "null"; + }]; + }; + readonly resetAt: { + readonly oneOf: readonly [{ + readonly type: "number"; + }, { + readonly type: "null"; + }]; + }; + }; + }; + }; +}; /** Domain error canonical value, used by every tool. */ export declare function errorValue(code: string, message: string, guidance?: string, rateLimit?: RateLimitValue): GithubErrorValue; /** `pr_create`: create a pull request (write; approval-gated upstream). */ diff --git a/lib/tools.d.ts.map b/lib/tools.d.ts.map index ab2afc4..82a3c60 100644 --- a/lib/tools.d.ts.map +++ b/lib/tools.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAkB,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AAClF,OAAO,EAMW,KAAK,gBAAgB,EAEtC,MAAM,cAAc,CAAA;AA8BrB,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAEzH;AA4FD,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,mDAoG9C;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,mDA8N9C;AAqCD,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,mDA0FhD;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,mDAgI7C;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,mDA2D/C;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,mDAoDlD;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,mDAyDhD;AAID,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,mDAiG9C;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,mDAqG7C;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,mDAgF9C;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,mDAuF5C;AAYD,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,mDAkF5C"} \ No newline at end of file +{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAkB,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AAClF,OAAO,EAMW,KAAK,gBAAgB,EAEtC,MAAM,cAAc,CAAA;AAOrB,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;CAKpB,CAAA;AAEV,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAcf,CAAA;AAEV,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAEzH;AA4FD,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,mDAoG9C;AAED,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,mDA8N9C;AAqCD,8FAA8F;AAC9F,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,mDA0FhD;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,mDAgI7C;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,mDA2D/C;AAED,6FAA6F;AAC7F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,mDAoDlD;AAED,sEAAsE;AACtE,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,mDAyDhD;AAID,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,mDAiG9C;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,mDAqG7C;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,mDAgF9C;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,mDAuF5C;AAYD,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,mDAkF5C"} \ No newline at end of file diff --git a/lib/tools.js b/lib/tools.js index 9e8d45e..2279d64 100644 --- a/lib/tools.js +++ b/lib/tools.js @@ -21,13 +21,13 @@ const RATE_LIMIT_PROPERTIES = { remaining: { oneOf: [{ type: 'number' }, { type: 'null' }] }, resetAt: { oneOf: [{ type: 'number' }, { type: 'null' }] }, }; -const RATE_LIMIT_SCHEMA = { +export const RATE_LIMIT_SCHEMA = { type: 'object', additionalProperties: false, properties: RATE_LIMIT_PROPERTIES, required: true, }; -const ERROR_SCHEMA = { +export const ERROR_SCHEMA = { type: 'object', additionalProperties: false, properties: { diff --git a/lib/tools.js.map b/lib/tools.js.map index 74c7a7f..16bec20 100644 --- a/lib/tools.js.map +++ b/lib/tools.js.map @@ -1 +1 @@ -{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 80d2be7..fead17a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@perrylink/dsh-github", - "version": "0.5.0", - "description": "GitHub integration for DeepSeek Harness: create, merge, and update pull requests, review PRs with background jobs, read issues, repos, and files — every write gated by human approval", + "version": "0.6.0", + "description": "Official-grade GitHub CI for DeepSeek Harness: composite action (review PRs / fix CI / report), polling PR review bot with idempotent inline comments, a status-check gate, and approval-gated PR/issue/repo/file tools", "type": "module", "main": "lib/index.js", "types": "lib/index.d.ts", @@ -13,6 +13,8 @@ }, "files": [ "lib", + "action.yml", + "scripts", "cordis.patch.yml", "README.md", "README.zh-CN.md", @@ -34,8 +36,10 @@ "dsh-plugin", "deepseek-harness", "github", + "github-actions", "pull-request", "code-review", + "ci", "issue-tracker" ], "license": "Apache-2.0", diff --git a/scripts/action-patch.mjs b/scripts/action-patch.mjs new file mode 100644 index 0000000..b1346be --- /dev/null +++ b/scripts/action-patch.mjs @@ -0,0 +1,138 @@ +// Generates the dsh headless profile overlay and the task text for the +// composite action. Zero-dependency Node: every input arrives through the +// runner's INPUT_* environment variables (composite-action inputs), and every +// value is emitted as a JSON string (a valid YAML scalar) so arbitrary user +// input can never break the YAML structure. +// +// Writes to $INPUT_OUTPUT_DIR: +// dsh-github-ci.cordis.yml — the --patch overlay (Minimal persona + role +// line, model selection, sandbox, the minimal bash/editor toolset, and +// the dsh-github row with the full ci.* configuration). +// task.txt — the headless task for the selected mode. +import { mkdirSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' + +const env = (name) => process.env[name] ?? '' +const boolOf = (value, fallback) => value.trim() === '' ? fallback : value.trim() === 'true' || value.trim() === '1' +const listOf = (value) => value.split(',').map(item => item.trim()).filter(item => item.length > 0) +const y = (value) => JSON.stringify(value) + +const task = env('INPUT_TASK').trim() || 'review' +const pr = env('INPUT_PR').trim() +const ownerRepo = env('INPUT_OWNER_REPO').trim() +const model = env('INPUT_MODEL').trim() || 'deepseek-v4-flash' +const engine = env('INPUT_ENGINE').trim() === 'model' ? 'model' : 'static' +const checkName = env('INPUT_CHECK_NAME').trim() || 'dsh-github-review' +const blocking = boolOf(env('INPUT_BLOCKING'), true) +const failOn = env('INPUT_FAIL_ON').trim() === 'warning' ? 'warning' : 'error' +const labelFilters = listOf(env('INPUT_LABEL_FILTERS')) +const pathFilters = listOf(env('INPUT_PATH_FILTERS')) +const maxDiffChars = Number(env('INPUT_MAX_DIFF_CHARS')) > 0 ? Math.floor(Number(env('INPUT_MAX_DIFF_CHARS'))) : 8000 +const postComments = boolOf(env('INPUT_POST_COMMENTS'), true) +const postCheck = boolOf(env('INPUT_POST_CHECK'), true) +const requestTimeoutMs = Number(env('INPUT_REQUEST_TIMEOUT_MS')) > 0 ? Math.floor(Number(env('INPUT_REQUEST_TIMEOUT_MS'))) : 30000 +const outputDir = env('INPUT_OUTPUT_DIR').trim() || join(process.env.RUNNER_TEMP ?? '.', 'dsh-github') +const customTask = env('INPUT_TASK_PROMPT').trim() + +if ((task === 'review' || task === 'fix-ci') && pr === '') { + console.error('dsh-github: the `pr` input is required for the review and fix-ci tasks (defaults to github.event.pull_request.number on pull_request events)') + process.exit(1) +} +if (ownerRepo === '') { + console.error('dsh-github: the `owner-repo` input is required (defaults to github.repository)') + process.exit(1) +} + +mkdirSync(outputDir, { recursive: true }) + +const callJson = (extra) => JSON.stringify({ task: extra.task, pr, ownerRepo, ...extra }) + +let taskText +if (customTask !== '') { + taskText = customTask +} else if (task === 'review' && engine === 'static') { + taskText = `You are the dsh-github CI reviewer for this repository. Call the ci_run tool once with ${callJson({ task: 'review' })} and then reply with only the verdict and the summary line from its result.` +} else if (task === 'review') { + taskText = `You are a careful software engineer reviewing a GitHub pull request. First call ci_run with ${callJson({ task: 'analyze' })}. Review the diff yourself: correctness, security, style, and maintainability. Then call ci_run with ${callJson({ task: 'publish' })} plus a "body" holding your review (Markdown, verdict first, findings grouped by file) and a "findings" array for line-anchored problems you found. Finish by replying with only the verdict and the summary line from the publish result.` +} else if (task === 'fix-ci') { + taskText = `You are the dsh-github CI engineer for this repository. Investigate the CI failures of PR #${pr} in ${ownerRepo}: read the failing checks with gh_review (fields "ci"), inspect the code with gh_file and gh_repo, and use the bash tool only to read logs or run read-only diagnostics. Do NOT modify files. Write a fix plan as your final answer and call ci_run with ${callJson({ task: 'publish' })} plus a "body" holding that plan so it is posted as a review comment.` +} else { + taskText = `You are the dsh-github CI reporter for this repository. Generate a concise, factual report about ${ownerRepo}${pr !== '' ? ` PR #${pr}` : ''} using the read tools (gh_repo, gh_file, gh_review, gh_search). Write the report as your final answer and, if a pull request is being analyzed, call ci_run with ${callJson({ task: 'publish' })} plus a "body" holding the report so it is posted as a review comment.` +} + +const personaText = 'You are a helpful software engineer assistant.\nYou are the dsh-github CI assistant for this repository.' + +const overlay = `# dsh-github CI overlay — generated by the composite action; every value is +# emitted by scripts/action-patch.mjs from the action inputs. Do not edit. +# Rows that already exist in dsh-base are replaced by id; new rows ride an +# insert block (non-insert patches only replace existing rows). +- id: persona + name: '@deepseek-ai/dsh-persona' + config: + text: ${y(personaText)} + complete: true + includeRuntimeContext: false + +- id: agent-default-model + name: '@deepseek-ai/dsh-agent-default-model' + config: + provider: deepseek-official + model: ${y(model)} + +- id: llm-deepseek + name: '@deepseek-ai/dsh-llm-deepseek' + config: + apiKeyEnv: DEEPSEEK_API_KEY + +- id: sandbox-policy + name: '@deepseek-ai/dsh-sandbox-policy' + config: + mode: workspace-write + workspaceRoot: !!js process.env.GITHUB_WORKSPACE ?? process.cwd() + +# The minimal toolset (persistent bash + editor), matching the official +# minimal preset: enough to investigate CI failures and generate reports, +# bounded by the workspace-write sandbox above. +- insert: + - id: terminal + name: '@deepseek-ai/dsh-terminal' + + - id: terminal-bash + name: '@deepseek-ai/dsh-terminal-bash' + config: + timeoutMs: 300000 + + - id: persistent-bash + name: '@deepseek-ai/dsh-tool-bash-persistent' + config: + timeoutMs: 300000 + + - id: str-replace-editor + name: '@deepseek-ai/dsh-tool-str-replace-editor' + config: + maxOutputChars: 16000 + + - id: dsh-github + name: '@perrylink/dsh-github' + config: + tokenSource: env + tokenRef: DSH_GITHUB_TOKEN + maxDiffChars: ${maxDiffChars} + requestTimeoutMs: ${requestTimeoutMs} + ci: + enabled: true + engine: ${y(engine)} + autoApprove: ['ci.run'] + checkName: ${y(checkName)} + blocking: ${blocking} + failOn: ${y(failOn)} + pollIntervalMs: 0 + labelFilters: ${y(labelFilters)} + pathFilters: ${y(pathFilters)} + postComments: ${postComments} + reportDir: ${y(outputDir)} +` + +writeFileSync(join(outputDir, 'dsh-github-ci.cordis.yml'), overlay) +writeFileSync(join(outputDir, 'task.txt'), taskText + '\n') +console.log(`dsh-github: overlay and task written to ${outputDir} (task: ${task}, engine: ${engine})`) diff --git a/scripts/action-post.mjs b/scripts/action-post.mjs new file mode 100644 index 0000000..e833ed4 --- /dev/null +++ b/scripts/action-post.mjs @@ -0,0 +1,48 @@ +// Post-process the CI run for the composite action: publish the step outputs +// from dsh-github-ci-result.json and enforce the blocking gate. +// +// Exit codes: +// 0 — report exists and the gate passed (or the verdict is non-blocking). +// 1 — report missing (the headless run never produced one), or +// blocking=true and the verdict is "needs-changes". +// The status check itself (published by the pipeline) is what gates branch +// protection; this exit code fails the CI job for blocking=false-style +// workflow-level enforcement and for downstream status reporting. +import { readFileSync, appendFileSync } from 'node:fs' +import { join } from 'node:path' + +const outputDir = process.env.INPUT_OUTPUT_DIR?.trim() || join(process.env.RUNNER_TEMP ?? '.', 'dsh-github') +const resultPath = join(outputDir, 'dsh-github-ci-result.json') +const blocking = (process.env.INPUT_BLOCKING ?? 'true').trim() === 'true' +const outputFile = process.env.GITHUB_OUTPUT ?? '' + +let result +try { + result = JSON.parse(readFileSync(resultPath, 'utf8')) +} catch (error) { + console.error(`dsh-github: no CI result at ${resultPath} — the headless run did not produce a review (${error instanceof Error ? error.message : String(error)}). Check the dsh stderr log next to it.`) + if (outputFile !== '') appendFileSync(outputFile, 'verdict=error\n') + process.exit(1) +} + +const markdownPath = join(outputDir, 'dsh-github-ci-summary.md') +const verdict = typeof result.verdict === 'string' ? result.verdict : 'error' +if (outputFile !== '') { + appendFileSync(outputFile, + `verdict=${verdict}\n` + + `report-json=${resultPath}\n` + + `report-markdown=${markdownPath}\n` + + `${result.checkRun?.url !== undefined ? `check-url=${result.checkRun.url}\n` : ''}`) +} + +console.log(`dsh-github: verdict ${verdict} — PR #${result.pr} in ${result.repo}${result.alreadyReviewed ? ' (already reviewed at this head commit)' : ''}`) +console.log(`dsh-github: ${result.summary}`) + +if (blocking && verdict === 'needs-changes') { + console.error(`dsh-github: blocking gate failed — the review verdict is "needs-changes". See ${markdownPath}`) + process.exit(1) +} +if (verdict === 'error') { + console.error('dsh-github: the pipeline reported an error verdict') + process.exit(1) +} diff --git a/src/approval-gate.ts b/src/approval-gate.ts index 4510425..b2a3b18 100644 --- a/src/approval-gate.ts +++ b/src/approval-gate.ts @@ -25,6 +25,7 @@ const ACTION_BY_TOOL: Record = { issue_open: 'issue.create', issue_comment: 'issue.comment', issue_close: 'issue.close', + ci_run: 'ci.run', } /** Tools the gate intercepts; everything else delegates via next(). */ @@ -95,12 +96,22 @@ function askReason(toolName: string, args: Record, state: Githu const number = typeof args.issueNumber === 'number' ? ` #${args.issueNumber}` : '' return `close GitHub issue${number}` } + if (toolName === 'ci_run') { + const target = typeof args.pr === 'string' ? ` ${args.pr}` : '' + const task = typeof args.task === 'string' ? args.task : 'review' + return `run CI ${task} for GitHub pull request${target} (posts review comments and a status check)` + } return 'perform a GitHub write action' } /** * Register the approval gate. Registration is an effect: disposing the plugin * fiber removes the listener. + * + * Unattended CI runs (`DSH_GITHUB_CI_DRIVER=1`) auto-allow exactly the + * actions listed in `ci.autoApprove` — the composite action composes that + * allowlist for the write the pipeline needs. Interactive sessions always + * ask, and actions missing from `allowedActions` stay denied everywhere. * @param ctx - plugin context; the listener lives on the shared tools pipeline. * @param state - plugin state used to enrich approval reasons. * @returns the effect disposer. @@ -112,6 +123,9 @@ export function registerApprovalGate(ctx: Context, state: GithubState): () => vo if (action === undefined || !state.config.allowedActions.includes(action)) { return { kind: 'deny', reason: `dsh-github: action "${action ?? exec.name}" is not in allowedActions` } } + if (state.isCiDriver && state.config.ci.autoApprove.includes(action)) { + return { kind: 'allow' } + } return { kind: 'ask', reason: `dsh-github: ${askReason(exec.name, argumentsAsRecord(exec), state)}` } }) } diff --git a/src/ci/bot.ts b/src/ci/bot.ts new file mode 100644 index 0000000..becac6a --- /dev/null +++ b/src/ci/bot.ts @@ -0,0 +1,210 @@ +/** + * The PR review bot: a poll-driven scanner that reviews open pull requests + * with the shared CI pipeline and posts idempotent inline comments plus the + * status-check gate. + * + * Polling is the transport: a webhook endpoint would need a public listener + * (out of scope for a plugin), so the bot re-scans open PRs on + * `ci.pollIntervalMs` and treats every pass as event delivery — the pipeline's + * check-run + review-marker idempotency makes repeat deliveries harmless. + * `/ci scan` delivers the same "event" on demand. Concurrency inside one scan + * is capped by `ci.maxConcurrent`. + * + * Bot writes are plugin-internal automation, not model tool calls: they do + * not traverse the approval gate. They are switched by `ci.enabled` and + * scoped to exactly two GitHub surfaces — review comments and check runs — + * with the minimal-permission token resolved per operation. + * @module dsh-github/ci/bot + */ +import type { Context } from '@deepseek-ai/cordis' +import type { CommandInvocation, CommandResult, CommandsService } from '../types.ts' +import type { GithubState } from '../state.ts' +import { runCiPipeline } from './pipeline.ts' + +/** Live bot status surfaced by `/ci status`. */ +export interface CiBotStatus { + polling: boolean + scanning: boolean + intervalMs: number + lastScanAt: number | null + lastScanPrs: number + lastScanNeedsChanges: number + lastScanErrors: number + lastScanSummary: string +} + +interface OpenPullPayload { + number?: number + title?: string +} + +/** Shared bot state; one instance per plugin fiber. */ +export interface CiBot { + status(): CiBotStatus + scan(signal?: AbortSignal): Promise + setPolling(enabled: boolean): void + dispose(): void +} + +const SCAN_CAP = 50 + +/** + * Create the polling bot and register the `/ci` command family. Everything + * here is an effect of the calling fiber — disposing the plugin stops the + * interval and removes the commands. + * @param ctx - plugin context (owns the effect lifetime). + * @param commands - the host command registry. + * @param state - shared plugin state. + * @returns the bot handle (also returned by the effect disposer path). + */ +export function registerCiBot(ctx: Context, commands: CommandsService, state: GithubState): () => void { + let polling = state.config.ci.pollIntervalMs > 0 + let scanning = false + let lastScanAt: number | null = null + let lastScanPrs = 0 + let lastScanNeedsChanges = 0 + let lastScanErrors = 0 + let lastScanSummary = 'no scan yet' + + const status = (): CiBotStatus => ({ + polling, + scanning, + intervalMs: state.config.ci.pollIntervalMs, + lastScanAt, + lastScanPrs, + lastScanNeedsChanges, + lastScanErrors, + lastScanSummary, + }) + + const setPolling = (enabled: boolean): void => { + polling = enabled + } + + /** One pass over the open PRs: pipeline per PR under the concurrency cap. */ + const scan = async (signal?: AbortSignal): Promise => { + if (scanning) return 'a scan is already running' + scanning = true + const started = Date.now() + let needsChanges = 0 + let errors = 0 + let reviewed = 0 + try { + const token = await state.resolveToken(signal) + if (!token.ok) { + lastScanErrors += 1 + lastScanSummary = `scan failed: ${token.error.message}` + ctx.logger.warn(`dsh-github ci bot: ${token.error.message}`) + return lastScanSummary + } + const client = state.client(token.token.value) + const repo = await state.resolveRepo(undefined, signal) + if (!repo.ok) { + lastScanErrors += 1 + lastScanSummary = `scan failed: ${repo.message}` + ctx.logger.warn(`dsh-github ci bot: ${repo.message}`) + return lastScanSummary + } + const open = await client.requestJson('GET', `/repos/${repo.repo}/pulls?state=open&per_page=${SCAN_CAP}`, { signal }) + const prs = open.data.filter(item => item.number !== undefined).slice(0, SCAN_CAP) + const cap = state.config.ci.maxConcurrent + const queue = [...prs] + const workers = Array.from({ length: Math.min(cap, queue.length) }, async () => { + for (;;) { + const item = queue.shift() + if (item === undefined) return + try { + const outcome = await runCiPipeline(state, { repo: repo.repo, pr: item.number as number, task: 'review', signal }) + if (outcome.status === 'error') { + errors += 1 + ctx.logger.warn(`dsh-github ci bot: PR #${item.number} review failed: ${outcome.message}`) + } else { + reviewed += 1 + if (outcome.verdict === 'needs-changes') needsChanges += 1 + ctx.logger.info(`dsh-github ci bot: PR #${item.number} → ${outcome.verdict}${outcome.alreadyReviewed ? ' (already reviewed)' : ''}`) + } + } catch (error) { + errors += 1 + ctx.logger.warn(`dsh-github ci bot: PR #${item.number} review threw: ${error instanceof Error ? error.message : String(error)}`) + } + } + }) + await Promise.all(workers) + lastScanAt = Date.now() + lastScanPrs = reviewed + lastScanNeedsChanges = needsChanges + lastScanErrors = errors + lastScanSummary = `scanned ${prs.length} open PR(s) in ${repo.repo}: ${reviewed} reviewed, ${needsChanges} needs-changes, ${errors} error(s) (${Date.now() - started}ms)` + return lastScanSummary + } finally { + scanning = false + } + } + + const timer = state.config.ci.pollIntervalMs > 0 + ? setInterval(() => { + if (polling) void scan().catch(() => {}) + }, state.config.ci.pollIntervalMs) + : undefined + timer?.unref?.() + + const register = (name: string, description: string, hint: string, handler: (invocation: CommandInvocation) => CommandResult | Promise): () => void => + commands.register({ name, description, input: { hint }, handler }) + + const disposers = [ + register('ci', 'CI review bot: scan PRs, publish reviews and the status-check gate', 'scan | status | start | stop | run ', async (invocation) => { + const [sub, ...rest] = invocation.rawInput.trim().split(/\s+/) + if (sub === undefined || sub.length === 0) { + const current = status() + return { kind: 'success', text: `CI bot: polling ${current.polling ? `on (every ${current.intervalMs}ms)` : 'off'}\n${current.lastScanSummary}\nUsage: /ci scan | status | start | stop | run ` } + } + if (sub === 'scan') { + const result = await scan(invocation.signal) + return { kind: 'success', text: result } + } + if (sub === 'status') { + const current = status() + return { + kind: 'success', + text: `polling: ${current.polling ? `on (every ${current.intervalMs}ms)` : 'off'}\n` + + `last scan: ${current.lastScanAt === null ? 'never' : new Date(current.lastScanAt).toISOString()}\n` + + `${current.lastScanSummary}`, + } + } + if (sub === 'start') { + if (state.config.ci.pollIntervalMs === 0) { + return { kind: 'error', text: 'ci.pollIntervalMs is 0: set a positive interval in cordis.yml to enable polling (or keep using /ci scan on demand).' } + } + setPolling(true) + return { kind: 'success', text: `CI bot polling enabled (every ${state.config.ci.pollIntervalMs}ms). Set ci.pollIntervalMs to 0 to disable at boot.` } + } + if (sub === 'stop') { + setPolling(false) + return { kind: 'success', text: 'CI bot polling disabled; /ci scan still runs on demand.' } + } + if (sub === 'run') { + const target = rest.join(' ').trim() + if (target.length === 0) return { kind: 'error', text: 'Usage: /ci run (number, #number, owner/repo#number, or pull URL)' } + const ref = state.parsePrRef(target) + if (ref === null) return { kind: 'error', text: `"${target}" is not a PR reference. Use a number, "#number", "owner/repo#number", or a pull URL.` } + const repoResult = ref.repo !== undefined ? { ok: true as const, repo: ref.repo } : await state.resolveRepo(undefined, invocation.signal) + if (!repoResult.ok) return { kind: 'error', text: `${repoResult.message}. ${repoResult.guidance}` } + const outcome = await runCiPipeline(state, { repo: repoResult.repo, pr: ref.number, task: 'review', signal: invocation.signal }) + if (outcome.status === 'error') return { kind: 'error', text: `${outcome.message}${outcome.guidance !== undefined ? `\n${outcome.guidance}` : ''}` } + return { + kind: 'success', + text: `PR #${outcome.pr} (${outcome.repo}): verdict ${outcome.verdict}${outcome.alreadyReviewed ? ' (already reviewed at this head commit)' : ''}\n${outcome.summary}` + + `${outcome.checkRun !== undefined ? `\ncheck: ${outcome.checkRun.url} (${outcome.checkRun.conclusion})` : ''}` + + `${outcome.review !== undefined && outcome.review.url.length > 0 ? `\nreview: ${outcome.review.url}` : ''}` + + `${outcome.files !== undefined ? `\nreports: ${outcome.files.json} · ${outcome.files.markdown}` : ''}`, + } + } + return { kind: 'error', text: `unknown /ci subcommand "${sub}". Usage: /ci scan | status | start | stop | run ` } + }), + ] + + return () => { + if (timer !== undefined) clearInterval(timer) + for (const dispose of disposers) dispose() + } +} diff --git a/src/ci/pipeline.ts b/src/ci/pipeline.ts new file mode 100644 index 0000000..0308f43 --- /dev/null +++ b/src/ci/pipeline.ts @@ -0,0 +1,490 @@ +/** + * The CI review pipeline — one deterministic pass over a pull request, + * shared by the polling bot, the `/ci run` command, and the one-shot + * `ci_run` tool used by the composite action's headless session. + * + * Order of operations: resolve the token → fetch PR metadata (head SHA, + * labels, totals) → apply label/path filters → idempotency checks (completed + * check run with our name, and the review-body marker) → fetch the capped + * diff and changed-file list → run the deterministic analyzers (line rules + * from src/review.ts, PR-level rules from ./review-rules.ts) → post inline + * review comments → publish the status check (success / failure / neutral + * per `ci.blocking`) → write `dsh-github-ci-result.json` and + * `dsh-github-ci-summary.md` (+ `$GITHUB_OUTPUT` lines when present). + * + * Token discipline matches the rest of the plugin: the value is resolved per + * operation and handed only to the REST client — never into findings, + * reports, check output, or thrown messages. + * @module dsh-github/ci/pipeline + */ +import { appendFileSync, mkdirSync, writeFileSync } from 'node:fs' +import { join } from 'node:path' +import type { Finding } from '../review.ts' +import { analyzeDiff, sanitizeFileName } from '../review.ts' +import { analyzePr, matchesAnyGlob, type ChangedFileStat } from './review-rules.ts' +import { rateLimitValue, type GithubState, type RateLimitValue } from '../state.ts' + +/** The gate verdict: pass, needs changes, or skipped by the filters. */ +export type CiVerdict = 'pass' | 'needs-changes' | 'skipped' + +/** Tasks the pipeline (and the `ci_run` tool) understands. */ +export type CiTask = 'review' | 'analyze' | 'publish' + +export interface CheckRunValue { + id: number + url: string + conclusion: string +} + +export interface ReviewPostValue { + url: string + inlineComments: number +} + +/** Successful pipeline result — the canonical JSON the `ci_run` tool returns. */ +export interface CiRunResult { + status: 'ok' + repo: string + pr: number + headSha: string + verdict: CiVerdict + engine: 'static' | 'model' + findings: Finding[] + summary: string + truncated: boolean + /** A previous run for this head commit already published its outcome. */ + alreadyReviewed: boolean + /** Present when the diff text was requested (analyze task). */ + diffText?: string + checkRun?: CheckRunValue + review?: ReviewPostValue + files?: { json: string; markdown: string } + rateLimit: RateLimitValue +} + +/** Structured failure — token-free by construction. */ +export interface CiRunError { + status: 'error' + code: string + message: string + guidance?: string + rateLimit?: RateLimitValue +} + +export type CiRunOutcome = CiRunResult | CiRunError + +export interface CiRunOptions { + repo: string + pr: number + task: CiTask + /** Diff cap for this run; defaults to the plugin config. */ + maxDiffChars?: number + /** Review-body override (model-authored, publish task). */ + body?: string + /** Extra findings authored by the model (publish task); merged with static ones. */ + findings?: Finding[] + /** Post review comments; defaults to `ci.postComments`. */ + postComments?: boolean + /** Publish the status check; defaults to true for review/publish. */ + postCheck?: boolean + signal?: AbortSignal +} + +interface PullMetaPayload { + number?: number + title?: string + state?: string + html_url?: string + additions?: number + deletions?: number + draft?: boolean + labels?: Array<{ name?: string }> + head?: { ref?: string; sha?: string } | null + base?: { ref?: string } | null +} + +interface FileEntryPayload { + filename?: string + additions?: number + deletions?: number +} + +interface CheckRunPayload { + id?: number + name?: string + status?: string + conclusion?: string | null + html_url?: string +} + +interface ReviewPayload { + id?: number + body?: string + html_url?: string +} + +/** First line of the review body — the idempotency marker. */ +export function reviewMarker(headSha: string): string { + return `` +} + +/** Whether a review body carries our marker for the given head commit. */ +export function hasReviewMarker(body: string | undefined, headSha: string): boolean { + return body !== undefined && body.includes(reviewMarker(headSha)) +} + +/** A review-timeout signal combining the caller's and the configured deadline. */ +function timeoutSignal(state: GithubState, signal?: AbortSignal): AbortSignal { + const deadline = AbortSignal.timeout(state.config.requestTimeoutMs) + return signal === undefined ? deadline : AbortSignal.any([signal, deadline]) +} + +/** Conclude the verdict from the findings under the configured `failOn` policy. */ +export function verdictFor(findings: readonly Finding[], failOn: 'error' | 'warning'): CiVerdict { + const severity = (finding: Finding): number => finding.severity === 'error' ? 2 : finding.severity === 'warning' ? 1 : 0 + const threshold = failOn === 'warning' ? 1 : 2 + return findings.some(finding => severity(finding) >= threshold) ? 'needs-changes' : 'pass' +} + +/** Merge model-authored findings into the static set, deduping by file+line+rule. */ +function mergeFindings(staticFindings: readonly Finding[], extra: readonly Finding[]): Finding[] { + const seen = new Set() + const merged: Finding[] = [] + for (const finding of [...staticFindings, ...extra]) { + const key = `${finding.file}\u0000${finding.line ?? ''}\u0000${finding.rule}` + if (seen.has(key)) continue + seen.add(key) + merged.push({ ...finding }) + } + return merged +} + +/** Summary line for a finished pass. */ +function summarize(verdict: CiVerdict, findings: readonly Finding[], truncated: boolean): string { + const counts = (severity: Finding['severity']): number => findings.filter(finding => finding.severity === severity).length + if (verdict === 'skipped') return 'skipped: no label/path filter match' + return `verdict ${verdict}: ${findings.length} finding(s) (${counts('error')} error / ${counts('warning')} warning / ${counts('info')} info)${truncated ? ' (diff truncated)' : ''}` +} + +/** Markdown report body written next to the JSON result. */ +export function formatMarkdownReport(result: CiRunResult, options: { blocking: boolean; checkName: string }): string { + const lines = [ + `# dsh-github CI review — PR #${result.pr} (${result.repo})`, + '', + `Verdict: **${result.verdict}**${result.verdict === 'needs-changes' ? ` (${options.blocking ? 'blocking' : 'non-blocking'})` : ''}${result.alreadyReviewed ? ' — already reviewed at this head commit' : ''}`, + '', + ] + if (result.checkRun !== undefined) lines.push(`Check: [${options.checkName}](${result.checkRun.url}) — conclusion \`${result.checkRun.conclusion}\``, '') + if (result.review !== undefined) lines.push(`Review: ${result.review.url} (${result.review.inlineComments} inline comment(s))`, '') + if (result.findings.length === 0) { + lines.push('No findings.', '') + } else { + lines.push(`## Findings (${result.findings.length})`, '') + for (const finding of result.findings) { + const anchor = finding.file.length === 0 ? 'PR' : `\`${sanitizeFileName(finding.file)}\`${finding.line !== null ? `:${finding.line}` : ''}` + lines.push(`- **${finding.severity}** \`${finding.rule}\` ${anchor}: ${finding.message}`) + } + lines.push('') + } + if (result.truncated) lines.push('> Note: the diff exceeded the cap and was truncated; this report covers only the examined range.', '') + lines.push('*Generated by [dsh-github](https://github.com/PerryLink/dsh-github) CI.*') + return lines.join('\n') +} + +/** Directory the report files land in: env var → config → workspace dir. */ +function reportDirectory(state: GithubState): string { + const fromEnv = process.env.DSH_GITHUB_CI_OUTPUT_DIR?.trim() + if (fromEnv !== undefined && fromEnv.length > 0) return fromEnv + if (state.config.ci.reportDir.trim().length > 0) return state.config.ci.reportDir + return state.workspaceDir +} + +/** Write the JSON + Markdown reports and, when present, `$GITHUB_OUTPUT` lines. */ +function writeReports(state: GithubState, result: CiRunResult): { json: string; markdown: string } { + const dir = reportDirectory(state) + mkdirSync(dir, { recursive: true }) + const jsonPath = join(dir, 'dsh-github-ci-result.json') + const markdownPath = join(dir, 'dsh-github-ci-summary.md') + writeFileSync(jsonPath, JSON.stringify({ schemaVersion: 1, ...result, files: { json: jsonPath, markdown: markdownPath } }, null, 2) + '\n') + writeFileSync(markdownPath, formatMarkdownReport(result, { blocking: state.config.ci.blocking, checkName: state.config.ci.checkName }) + '\n') + const outputFile = process.env.GITHUB_OUTPUT + if (outputFile !== undefined && outputFile.length > 0) { + appendFileSync(outputFile, + `verdict=${result.verdict}\n` + + `report-json=${jsonPath}\n` + + `report-markdown=${markdownPath}\n` + + `${result.checkRun !== undefined ? `check-url=${result.checkRun.url}\n` : ''}`) + } + return { json: jsonPath, markdown: markdownPath } +} + +/** The published review body: marker, PR-level findings, and (optionally) the model override. */ +function buildReviewBody(headSha: string, prFindings: readonly Finding[], override: string | undefined, truncated: boolean): string { + const sections: string[] = [reviewMarker(headSha), '## dsh-github review'] + if (prFindings.length > 0) { + sections.push('') + for (const finding of prFindings) { + const anchor = finding.file.length === 0 ? 'PR' : `\`${sanitizeFileName(finding.file)}\`` + sections.push(`- **${finding.severity}** \`${finding.rule}\` ${anchor}: ${finding.message}`) + } + } + if (override !== undefined && override.trim().length > 0) { + sections.push('', '## Review', '', override.trim()) + } + if (truncated) sections.push('', '> Note: the diff exceeded the cap and was truncated; this report covers only the examined range.') + return sections.join('\n') +} + +/** + * Run one CI pass over a pull request. Pure in the sense that every GitHub + * interaction goes through the per-operation token and the shared client; + * callers (bot, tool) own their own concurrency control. + * @param state - shared plugin state. + * @param options - target repo/PR, task, caps, and overrides. + * @returns the structured outcome; failures are token-free error variants. + */ +export async function runCiPipeline(state: GithubState, options: CiRunOptions): Promise { + const signal = timeoutSignal(state, options.signal) + const maxDiffChars = options.maxDiffChars !== undefined && options.maxDiffChars > 0 ? Math.floor(options.maxDiffChars) : state.config.maxDiffChars + const postComments = options.task !== 'analyze' && (options.postComments ?? state.config.ci.postComments) + const postCheck = options.task !== 'analyze' && (options.postCheck ?? true) + + const token = await state.resolveToken(signal) + if (!token.ok) { + return { status: 'error', code: token.error.code, message: token.error.message, guidance: token.error.guidance } + } + const client = state.client(token.token.value) + const errorCode = (error: unknown): string => + error instanceof Error && error.name === 'AbortError' ? 'aborted' + : error instanceof Error && 'status' in error && typeof error.status === 'number' ? `github-api-${error.status}` : 'fetch-failed' + const rateLimitOf = (error: unknown): RateLimitValue | undefined => { + if (error instanceof Error && 'rateLimit' in error) { + const info = (error as { rateLimit?: { remaining: number | null; resetAt: number | null } }).rateLimit + if (info !== undefined) return { remaining: info.remaining, resetAt: info.resetAt } + } + return undefined + } + const fail = (error: unknown): CiRunError => ({ + status: 'error', + code: errorCode(error), + message: error instanceof Error ? error.message : 'CI review failed', + ...rateLimitOf(error) !== undefined ? { rateLimit: rateLimitOf(error) } : {}, + }) + + let meta: PullMetaPayload + let rateLimit: RateLimitValue = { remaining: null, resetAt: null } + try { + const response = await client.requestJson('GET', `/repos/${options.repo}/pulls/${options.pr}`, { signal }) + meta = response.data + rateLimit = rateLimitValue(response.rateLimit) + } catch (error) { + return fail(error) + } + const headSha = meta.head?.sha ?? '' + if (headSha.length === 0) return { status: 'error', code: 'no-head-sha', message: `PR #${options.pr} reports no head commit` } + const additions = meta.additions ?? 0 + const deletions = meta.deletions ?? 0 + const labels = (meta.labels ?? []).map(label => label.name ?? '').filter(name => name.length > 0) + + // Filter step: label and path filters skip the PR without posting anything. + const labelMatch = state.config.ci.labelFilters.length === 0 + || labels.some(label => state.config.ci.labelFilters.some(filter => filter.trim() === label)) + let files: ChangedFileStat[] = [] + try { + for (let page = 1; page <= 4; page += 1) { + const response = await client.requestJson('GET', `/repos/${options.repo}/pulls/${options.pr}/files?per_page=100&page=${page}`, { signal }) + for (const entry of response.data) { + files.push({ path: entry.filename ?? '', added: entry.additions ?? 0, removed: entry.deletions ?? 0 }) + } + if (response.data.length < 100 || files.length >= 400) break + } + } catch { + files = [] // path filtering degrades to "match all" when the file list is unavailable. + } + const pathMatch = state.config.ci.pathFilters.length === 0 + || files.length === 0 + || files.some(file => matchesAnyGlob(file.path, state.config.ci.pathFilters)) + + if (!labelMatch || !pathMatch) { + let checkRun: CheckRunValue | undefined + if (postCheck) { + checkRun = await publishCheck(client, options.repo, headSha, state, 'skipped', 0, 'skipped: no label/path filter match') + } + const result: CiRunResult = { + status: 'ok', + repo: options.repo, + pr: options.pr, + headSha, + verdict: 'skipped', + engine: state.config.ci.engine, + findings: [], + summary: summarize('skipped', [], false), + truncated: false, + alreadyReviewed: false, + ...checkRun !== undefined ? { checkRun } : {}, + rateLimit, + } + const reportFiles = options.task !== 'analyze' ? writeReports(state, result) : undefined + return { ...result, ...reportFiles !== undefined ? { files: reportFiles } : {} } + } + + // Idempotency: a completed check run for this head commit means the gate was + // already published; a review-body marker means comments were already posted. + // The marker scan always runs (not only when the check is missing), so a + // rerun after a comment-only failure can repair the comments without + // duplicating them. + let existingCheck: CheckRunPayload | undefined + let commentsPosted = false + try { + const checkName = encodeURIComponent(state.config.ci.checkName) + const response = await client.requestJson<{ check_runs?: CheckRunPayload[] }>('GET', `/repos/${options.repo}/commits/${headSha}/check-runs?check_name=${checkName}`, { signal }) + existingCheck = (response.data.check_runs ?? []).find(run => run.status === 'completed') + } catch { + existingCheck = undefined + } + if (postComments) { + try { + const response = await client.requestJson('GET', `/repos/${options.repo}/pulls/${options.pr}/reviews?per_page=100`, { signal }) + commentsPosted = response.data.some(review => hasReviewMarker(review.body, headSha)) + } catch { + commentsPosted = false + } + } + + // The deterministic analysis runs even for an already-reviewed PR, so a + // re-run can refresh the gate from the same inputs (zero cost, stable). + let diffText = '' + let truncated = false + try { + const text = await client.requestText('GET', `/repos/${options.repo}/pulls/${options.pr}`, { signal }) + truncated = text.text.length > maxDiffChars + diffText = truncated ? text.text.slice(0, maxDiffChars) : text.text + } catch (error) { + return fail(error) + } + + const lineFindings = analyzeDiff(diffText, maxDiffChars, { maxFindings: state.config.maxFindings, maxLineLength: state.config.maxLineLength }).findings + const prFindings = analyzePr({ + files, + additions, + deletions, + options: state.config.ci, + }) + const staticFindings = [...prFindings, ...lineFindings] + const extraFindings = options.task === 'publish' ? options.findings ?? [] : [] + const findings = mergeFindings(staticFindings, extraFindings) + const verdict = verdictFor(findings, state.config.ci.failOn) + + if (options.task === 'analyze') { + return { + status: 'ok', + repo: options.repo, + pr: options.pr, + headSha, + verdict: 'skipped', + engine: state.config.ci.engine, + findings: staticFindings, + summary: 'analysis prepared; no comments or checks were posted', + truncated, + alreadyReviewed: existingCheck !== undefined || commentsPosted, + diffText, + rateLimit, + } + } + + let review: ReviewPostValue | undefined + if (postComments && !commentsPosted) { + const inline = findings.filter(finding => finding.line !== null).slice(0, state.config.maxFindings) + const prLevel = findings.filter(finding => finding.line === null) + try { + const posted = await client.requestJson<{ id?: number; html_url?: string }>('POST', `/repos/${options.repo}/pulls/${options.pr}/reviews`, { + signal, + body: { + body: buildReviewBody(headSha, prLevel, options.body, truncated), + event: 'COMMENT', + ...inline.length > 0 ? { + comments: inline.map(finding => ({ + path: finding.file, + line: finding.line, + body: `**${finding.severity}** \`${finding.rule}\`: ${finding.message}`, + })), + } : {}, + }, + }) + review = { url: posted.data.html_url ?? '', inlineComments: inline.length } + } catch (error) { + return fail(error) + } + } else if (postComments) { + review = { url: '', inlineComments: 0 } // already posted at this head commit + } + + let checkRun: CheckRunValue | undefined + if (postCheck && existingCheck === undefined) { + checkRun = await publishCheck(client, options.repo, headSha, state, verdict, findings.length, summarize(verdict, findings, truncated)) + } else if (existingCheck !== undefined) { + checkRun = { + id: existingCheck.id ?? 0, + url: existingCheck.html_url ?? '', + conclusion: existingCheck.conclusion ?? '', + } + } + + const effectiveVerdict = existingCheck !== undefined ? verdictFromConclusion(existingCheck.conclusion) : verdict + const result: CiRunResult = { + status: 'ok', + repo: options.repo, + pr: options.pr, + headSha, + verdict: effectiveVerdict, + engine: state.config.ci.engine, + findings, + summary: existingCheck !== undefined ? `already reviewed at ${headSha.slice(0, 7)}: ${summarize(effectiveVerdict, findings, truncated)}` : summarize(effectiveVerdict, findings, truncated), + truncated, + alreadyReviewed: existingCheck !== undefined || commentsPosted, + ...review !== undefined ? { review } : {}, + ...checkRun !== undefined ? { checkRun } : {}, + rateLimit, + } + const reportFiles = writeReports(state, result) + return { ...result, files: reportFiles } +} + +/** Verdict recovered from an existing check conclusion. */ +function verdictFromConclusion(conclusion: string | null | undefined): CiVerdict { + if (conclusion === 'failure' || conclusion === 'action_required') return 'needs-changes' + if (conclusion === 'neutral') return 'skipped' + return 'pass' +} + +/** Create one completed status check for the run. */ +async function publishCheck( + client: ReturnType, + repo: string, + headSha: string, + state: GithubState, + verdict: CiVerdict, + findingCount: number, + summary: string, +): Promise { + const conclusion = verdict === 'pass' ? 'success' : verdict === 'needs-changes' ? (state.config.ci.blocking ? 'failure' : 'neutral') : 'neutral' + try { + const posted = await client.requestJson<{ id?: number; html_url?: string }>('POST', `/repos/${repo}/commits/${headSha}/check-runs`, { + body: { + name: state.config.ci.checkName, + head_sha: headSha, + status: 'completed', + conclusion, + completed_at: new Date().toISOString(), + output: { + title: `dsh-github review: ${verdict}`, + summary: `${summary}\n\n${verdict === 'needs-changes' ? (state.config.ci.blocking ? 'Blocking: merge is held until the findings are addressed.' : 'Non-blocking: the gate reports findings without failing the check.') : ''}`, + annotations: [], + }, + }, + }) + return { id: posted.data.id ?? 0, url: posted.data.html_url ?? '', conclusion } + } catch { + return undefined // the gate degrades to the report files; callers see the verdict in the result. + } +} diff --git a/src/ci/review-rules.ts b/src/ci/review-rules.ts new file mode 100644 index 0000000..387a47d --- /dev/null +++ b/src/ci/review-rules.ts @@ -0,0 +1,147 @@ +/** + * PR-level review rules for the CI pipeline: change scope, test existence, + * and sensitive files. Line-level findings stay in src/review.ts; these rules + * reason about the pull request as a whole (file list, totals) and produce + * findings anchored to a file (`line: null`) or to the PR itself (`file: ''`). + * + * The rules are deterministic and model-free — the same review runs in the + * polling bot, the headless action, and the one-shot `ci_run` tool with + * identical output. + * @module dsh-github/ci/review-rules + */ +import type { Finding } from '../review.ts' +import type { CiConfig } from '../config.ts' + +/** One changed file's stats, as reported by the PR files endpoint. */ +export interface ChangedFileStat { + path: string + added: number + removed: number +} + +/** Facts the PR-level rules reason over. */ +export interface PrReviewInput { + /** Changed files with per-file added/removed counts. */ + files: ChangedFileStat[] + /** PR-wide added/removed line totals. */ + additions: number + deletions: number + /** Tunable rule options from the CI config. */ + options: Pick +} + +/** + * Translate one glob into an anchored RegExp supporting `*`, `**`, and `?`. + * A pattern without a `/` is a basename glob and matches at any depth + * (`.env` matches `config/.env`, `*.pem` matches `certs/server.pem`); + * patterns containing `/` match against the whole repository path. + */ +export function globToRegExp(pattern: string): RegExp { + let source = '' + for (let index = 0; index < pattern.length; index += 1) { + const char = pattern[index] ?? '' + if (char === '*') { + if (pattern[index + 1] === '*') { + // `**/` matches any directory depth (including none). + if (pattern[index + 2] === '/') { + source += '(?:.*/)?' + index += 2 + continue + } + source += '.*' + index += 1 + continue + } + source += '[^/]*' + continue + } + if (char === '?') { + source += '[^/]' + continue + } + if ('\\^$.*+?()[]{}|'.includes(char)) source += `\\${char}` + else source += char + } + const prefix = pattern.includes('/') ? '' : '(?:.*/)?' + return new RegExp(`^${prefix}${source}$`) +} + +/** Whether a repository path matches any of the configured globs. */ +export function matchesAnyGlob(path: string, patterns: readonly string[]): boolean { + const regexes = patterns.map(pattern => globToRegExp(pattern)) + return regexes.some(regex => regex.test(path)) +} + +/** PR-level findings for one pull request; deterministic and ordered. */ +export function analyzePr(input: PrReviewInput): Finding[] { + const findings: Finding[] = [] + const { files, options } = input + + // Sensitive files: credentials, keys, secrets, and CI workflow edits need + // human eyes regardless of what the diff text itself looks like. + if (options.sensitivePathPatterns.length > 0) { + for (const file of files) { + if (matchesAnyGlob(file.path, options.sensitivePathPatterns)) { + findings.push({ + file: file.path, + line: null, + severity: options.sensitiveSeverity, + rule: 'sensitive-file', + message: 'sensitive path changed (credentials, keys, secrets, or CI workflows); review carefully and never embed secrets', + }) + } + } + } + + // Change scope: total file count and line totals beyond the caps. + if (files.length > options.maxChangedFiles) { + findings.push({ + file: '', + line: null, + severity: 'info', + rule: 'large-change', + message: `PR touches ${files.length} files (cap ${options.maxChangedFiles}); consider splitting it into smaller changes`, + }) + } + if (input.additions > options.maxAddedLines) { + findings.push({ + file: '', + line: null, + severity: 'info', + rule: 'large-change', + message: `PR adds ${input.additions} lines (cap ${options.maxAddedLines}); consider splitting it into smaller changes`, + }) + } + if (input.deletions > options.maxRemovedLines) { + findings.push({ + file: '', + line: null, + severity: 'info', + rule: 'large-change', + message: `PR removes ${input.deletions} lines (cap ${options.maxRemovedLines}); double-check the removed behavior`, + }) + } + + // Test existence: code changed without any test change. + if (options.codeExtensions.length > 0 && options.testPathPatterns.length > 0) { + const isCode = (path: string): boolean => options.codeExtensions.some(ext => path.toLowerCase().endsWith(ext.toLowerCase())) + const isTest = (path: string): boolean => matchesAnyGlob(path, options.testPathPatterns) + const codeFiles = files.filter(file => isCode(file.path)) + const testFiles = files.filter(file => isTest(file.path)) + if (codeFiles.length > 0 && testFiles.length === 0) { + findings.push({ + file: '', + line: null, + severity: 'warning', + rule: 'missing-tests', + message: `${codeFiles.length} code file(s) changed with no test changes; consider adding coverage for the new behavior`, + }) + } + } + + return findings +} diff --git a/src/ci/tool.ts b/src/ci/tool.ts new file mode 100644 index 0000000..da32009 --- /dev/null +++ b/src/ci/tool.ts @@ -0,0 +1,155 @@ +/** + * The `ci_run` tool — the one-shot CI pipeline entry point used by the + * composite action's headless session (and available in interactive sessions + * where `ci.enabled` is on). + * + * Tasks: + * - `review`: one deterministic pass — analyze, post comments (configurable), + * publish the status check, and write the JSON/Markdown reports. + * - `analyze`: read-only preparation — returns the capped diff and static + * findings without any write, so a `model` engine can author its own body. + * - `publish`: post the (optionally model-authored) review and the check. + * + * Every write is gated by the same `tools/pre-execute` approval gate as the + * other tools: interactive sessions ask the human; the CI driver + * (`DSH_GITHUB_CI_DRIVER=1`) auto-allows exactly the actions listed in + * `ci.autoApprove`. + * @module dsh-github/ci/tool + */ +import { defineTool } from '@deepseek-ai/dsh-tools' +import { errorValue } from '../tools.ts' +import { ERROR_SCHEMA, RATE_LIMIT_SCHEMA } from '../tools.ts' +import type { GithubState } from '../state.ts' +import { ciRunCall, ciRunResult } from '../present.ts' +import { identityMeta } from '../present.ts' +import { runCiPipeline, type CiTask } from './pipeline.ts' + +const FINDING_SCHEMA = { + type: 'object', + additionalProperties: false, + properties: { + file: { type: 'string', required: true }, + line: { oneOf: [{ type: 'integer' }, { type: 'null' }] }, + severity: { type: 'string', required: true, enum: ['info', 'warning', 'error'] }, + rule: { type: 'string', required: true }, + message: { type: 'string', required: true }, + }, +} as const + +const TASKS: CiTask[] = ['review', 'analyze', 'publish'] + +/** `ci_run`: run one CI review pass (write; approval-gated upstream). */ +export function ciRunTool(state: GithubState) { + return defineTool({ + name: 'ci_run', + description: 'Run one dsh-github CI pass over a pull request. task "review" analyzes the diff, posts inline ' + + 'review comments, publishes the status check, and writes dsh-github-ci-result.json / dsh-github-ci-summary.md. ' + + 'task "analyze" returns the capped diff and static findings without writing anything (read-only), so you can ' + + 'author the review yourself. task "publish" posts your review `body`/`findings` and the check. Repeated runs ' + + 'for the same head commit are idempotent (comments and checks are not duplicated). Requires approval unless ' + + 'auto-approved by the CI driver configuration.', + parameters: { + task: { type: 'string', required: true, enum: [...TASKS], description: 'Which CI pass to run.' }, + pr: { type: 'string', required: true, description: 'PR number, #number, owner/repo#number, or pull URL.' }, + ownerRepo: { type: 'string', description: 'Repository as owner/repo. Defaults to configured or git origin.' }, + maxDiffChars: { type: 'number', description: 'Cap for the diff text. Defaults to the plugin config.' }, + body: { type: 'string', description: 'Review-body override (publish task).' }, + findings: { type: 'array', items: FINDING_SCHEMA, description: 'Extra findings authored by you (publish task).' }, + postComments: { type: 'boolean', description: 'Post review comments. Defaults to the ci.postComments config.' }, + postCheck: { type: 'boolean', description: 'Publish the status check. Defaults to true.' }, + }, + output: { + schema: { + oneOf: [{ + type: 'object', + additionalProperties: false, + properties: { + status: { type: 'string', required: true, const: 'ok' }, + repo: { type: 'string', required: true }, + pr: { type: 'integer', required: true }, + headSha: { type: 'string', required: true }, + verdict: { type: 'string', required: true, enum: ['pass', 'needs-changes', 'skipped'] }, + engine: { type: 'string', required: true, enum: ['static', 'model'] }, + findings: { type: 'array', items: FINDING_SCHEMA }, + summary: { type: 'string', required: true }, + truncated: { type: 'boolean', required: true }, + alreadyReviewed: { type: 'boolean', required: true }, + diffText: { type: 'string' }, + checkRun: { + type: 'object', + additionalProperties: false, + properties: { + id: { type: 'integer', required: true }, + url: { type: 'string', required: true }, + conclusion: { type: 'string', required: true }, + }, + }, + review: { + type: 'object', + additionalProperties: false, + properties: { + url: { type: 'string', required: true }, + inlineComments: { type: 'integer', required: true }, + }, + }, + files: { + type: 'object', + additionalProperties: false, + properties: { + json: { type: 'string', required: true }, + markdown: { type: 'string', required: true }, + }, + }, + rateLimit: RATE_LIMIT_SCHEMA, + }, + }, ERROR_SCHEMA], + }, + render: (args, value) => { + if (value.status === 'error') { + return [{ type: 'text', text: `${value.message}${value.guidance !== undefined ? `\n${value.guidance}` : ''}` }] + } + const lines = [`CI ${args.task}: PR #${value.pr} (${value.repo}) verdict ${value.verdict}`, value.summary] + if (value.checkRun !== undefined) lines.push(`check: ${value.checkRun.url} (${value.checkRun.conclusion})`) + if (value.review !== undefined && value.review.url.length > 0) lines.push(`review: ${value.review.url}`) + if (value.files !== undefined) lines.push(`reports: ${value.files.json} · ${value.files.markdown}`) + if (value.diffText !== undefined) lines.push(`diff (${value.diffText.length} chars${value.truncated ? ', truncated' : ''}):\n${value.diffText}`) + return [{ type: 'text', text: lines.join('\n') }] + }, + presentationMeta: identityMeta, + }, + isConcurrencySafe: () => false, + presentCall: ciRunCall, + presentResult: ciRunResult, + async execute(args, exec) { + const ref = state.parsePrRef(args.pr) + if (ref === null) return errorValue('invalid-pr', `"${args.pr}" is not a PR reference`, 'Use a number, "#number", "owner/repo#number", or a pull URL.') + const repoResult = ref.repo !== undefined ? { ok: true as const, repo: ref.repo } : await state.resolveRepo(undefined, exec.signal) + if (!repoResult.ok) return errorValue(repoResult.code, repoResult.message, repoResult.guidance) + + const findings = args.findings?.map(finding => ({ + file: String(finding.file), + line: finding.line ?? null, + severity: finding.severity, + rule: String(finding.rule), + message: String(finding.message), + })) ?? [] + + const outcome = await runCiPipeline(state, { + repo: repoResult.repo, + pr: ref.number, + task: args.task, + ...args.maxDiffChars !== undefined && args.maxDiffChars > 0 ? { maxDiffChars: Math.floor(args.maxDiffChars) } : {}, + ...args.body !== undefined ? { body: args.body } : {}, + ...findings.length > 0 ? { findings } : {}, + ...args.postComments !== undefined ? { postComments: args.postComments } : {}, + ...args.postCheck !== undefined ? { postCheck: args.postCheck } : {}, + signal: exec.signal, + }) + + if (outcome.status === 'error') { + return errorValue(outcome.code, outcome.message, outcome.guidance, outcome.rateLimit !== undefined ? outcome.rateLimit : undefined) + } + return outcome + }, + }) +} diff --git a/src/config.ts b/src/config.ts index 08682db..242c00b 100644 --- a/src/config.ts +++ b/src/config.ts @@ -10,11 +10,59 @@ import z from '@deepseek-ai/schemastery' /** GitHub write actions the plugin may perform (each still requires approval). */ -export type GithubAction = 'pr.create' | 'review.post' | 'issue.create' | 'issue.comment' | 'issue.close' | 'pr.merge' | 'pr.update' +export type GithubAction = 'pr.create' | 'review.post' | 'issue.create' | 'issue.comment' | 'issue.close' | 'pr.merge' | 'pr.update' | 'ci.run' /** Where a GitHub token is looked up. `auto` tries them in order. */ export type TokenSource = 'auto' | 'credentials' | 'env' | 'gh' +/** + * The CI surface: the one-shot `ci_run` tool, the polling review bot, the + * `/ci` command family, and the status-check gate. Every tunable is a Schema + * key so the composite action can map its inputs 1:1 onto this section. + */ +export interface CiConfig { + /** Master switch for the CI surface. Defaults to false (interactive use unchanged). */ + enabled: boolean + /** Review engine: `static` runs the deterministic analyzer; `model` lets the headless agent author the review body. */ + engine: 'static' | 'model' + /** + * Write actions auto-allowed while running as the CI driver + * (`DSH_GITHUB_CI_DRIVER=1`, unattended). Empty in interactive sessions — + * there every write still asks the human. + */ + autoApprove: GithubAction[] + /** Status-check name published by the CI gate (per PR head commit). */ + checkName: string + /** `needs-changes` verdict → check conclusion `failure`; `false` publishes `neutral` instead (non-blocking gate). */ + blocking: boolean + /** Lowest severity that flips the verdict to `needs-changes`. */ + failOn: 'error' | 'warning' + /** Review-bot poll interval; `0` disables polling (manual `/ci scan` still works). */ + pollIntervalMs: number + /** Label filters; a PR must carry at least one listed label. Empty = all PRs. */ + labelFilters: string[] + /** Path filters (globs, e.g. `src/**`); when set, a PR must touch a matching path. Empty = all PRs. */ + pathFilters: string[] + /** Sensitive-path globs flagged by the sensitive-file rule (error/warning per `sensitiveSeverity`). */ + sensitivePathPatterns: string[] + /** Severity of the sensitive-file rule. */ + sensitiveSeverity: 'error' | 'warning' + /** File extensions treated as code by the test-existence rule (with leading dot). */ + codeExtensions: string[] + /** Path globs treated as tests by the test-existence rule. */ + testPathPatterns: string[] + /** Scope caps for the change-size rule (`large-change` findings). */ + maxChangedFiles: number + maxAddedLines: number + maxRemovedLines: number + /** Cap of concurrently reviewed PRs inside one bot scan. */ + maxConcurrent: number + /** Whether the pipeline posts review comments (inline findings + PR-level body). */ + postComments: boolean + /** Report-file directory; defaults to the CI output directory env var, then the workspace dir. */ + reportDir: string +} + export interface Config { /** * Token lookup order: `auto` resolves credentials-seam reference → `env` @@ -58,16 +106,84 @@ export interface Config { retryBaseMs: number /** Ceiling for 429 retry backoff. */ retryMaxWaitMs: number + /** Hard per-request timeout; aborts the fetch when exceeded. */ + requestTimeoutMs: number /** GitHub REST base URL; change for GitHub Enterprise. */ apiBaseUrl: string /** Whitelist of write actions; everything else is denied before approval. */ allowedActions: GithubAction[] /** Working directory for read-only git inspection; defaults to the process cwd. */ workspaceDir?: string + /** CI integration: bot, gate, and one-shot runner (see {@link CiConfig}). */ + ci: CiConfig } const OWNER_REPO_PATTERN = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/ +/** Default sensitive-path globs for the sensitive-file rule. */ +export const DEFAULT_SENSITIVE_PATTERNS = [ + '.env', '.env.*', '*.pem', '*.key', '*.p12', '*.pfx', + 'id_rsa*', 'id_ed25519*', 'id_dsa*', + '**/credentials*.json', '**/secrets/**', '**/.npmrc', '**/.pypirc', + '.github/workflows/*.yml', '.github/workflows/*.yaml', +] + +/** Default code extensions for the test-existence rule (with leading dot). */ +export const DEFAULT_CODE_EXTENSIONS = [ + '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.py', '.go', '.rs', + '.java', '.kt', '.c', '.h', '.cpp', '.hpp', '.cs', '.rb', '.php', + '.swift', '.scala', '.sh', '.ps1', +] + +/** Default test-path globs for the test-existence rule. */ +export const DEFAULT_TEST_PATTERNS = [ + '**/test/**', '**/tests/**', '**/__tests__/**', '**/spec/**', '**/e2e/**', + '**/*.test.*', '**/*.spec.*', '**/test_*', '**/*_test.*', +] + +const CI_ACTION_VALUES = ['pr.create', 'review.post', 'issue.create', 'issue.comment', 'issue.close', 'pr.merge', 'pr.update', 'ci.run'] as const + +export const CiConfig: z = z.object({ + enabled: z.boolean().default(false) + .description('Master switch for the CI surface (ci_run tool, review bot, /ci commands, status-check gate).'), + engine: z.union(['static', 'model'] as const).default('static') + .description('Review engine: static (deterministic analyzer) or model (headless agent authors the review body).'), + autoApprove: z.array(z.union(CI_ACTION_VALUES)).default([]) + .description('Write actions auto-allowed while running as the CI driver (DSH_GITHUB_CI_DRIVER=1); interactive sessions always ask.'), + checkName: z.string().default('dsh-github-review') + .description('Status-check name published by the CI gate.'), + blocking: z.boolean().default(true) + .description('needs-changes verdict fails the check; false publishes a neutral (non-blocking) conclusion.'), + failOn: z.union(['error', 'warning'] as const).default('error') + .description('Lowest finding severity that flips the verdict to needs-changes.'), + pollIntervalMs: z.number().step(1).min(0).default(60_000) + .description('Review-bot poll interval; 0 disables polling (manual /ci scan still works).'), + labelFilters: z.array(z.string()).default([]) + .description('Label filters for the bot and pipeline; a PR must carry at least one listed label. Empty matches all.'), + pathFilters: z.array(z.string()).default([]) + .description('Path globs for the bot and pipeline; when set, a PR must touch at least one matching path. Empty matches all.'), + sensitivePathPatterns: z.array(z.string()).default(DEFAULT_SENSITIVE_PATTERNS) + .description('Sensitive-path globs flagged by the sensitive-file rule.'), + sensitiveSeverity: z.union(['error', 'warning'] as const).default('warning') + .description('Severity of the sensitive-file rule.'), + codeExtensions: z.array(z.string()).default(DEFAULT_CODE_EXTENSIONS) + .description('Extensions treated as code by the test-existence rule (leading dot).'), + testPathPatterns: z.array(z.string()).default(DEFAULT_TEST_PATTERNS) + .description('Path globs treated as tests by the test-existence rule.'), + maxChangedFiles: z.number().step(1).min(1).default(30) + .description('File-count cap before a large-change finding.'), + maxAddedLines: z.number().step(1).min(1).default(1000) + .description('Added-line cap before a large-change finding.'), + maxRemovedLines: z.number().step(1).min(1).default(1000) + .description('Removed-line cap before a large-change finding.'), + maxConcurrent: z.number().step(1).min(1).default(2) + .description('Cap of concurrently reviewed PRs inside one bot scan.'), + postComments: z.boolean().default(true) + .description('Whether the CI pipeline posts review comments (inline findings plus the PR-level body).'), + reportDir: z.string().default('') + .description('Report-file directory; defaults to DSH_GITHUB_CI_OUTPUT_DIR, then the workspace directory.'), +}) + export const Config: z = z.object({ tokenSource: z.union(['auto', 'credentials', 'env', 'gh'] as const) .default('auto') @@ -120,12 +236,17 @@ export const Config: z = z.object({ retryMaxWaitMs: z.number().step(1).min(1) .default(60_000) .description('Ceiling for 429 retry backoff.'), + requestTimeoutMs: z.number().step(1).min(1000) + .default(30_000) + .description('Hard per-request timeout; aborts the fetch when exceeded.'), apiBaseUrl: z.string() .default('https://api.github.com') .description('GitHub REST base URL (change for GitHub Enterprise).'), - allowedActions: z.array(z.union(['pr.create', 'review.post', 'issue.create', 'issue.comment', 'issue.close', 'pr.merge', 'pr.update'] as const)) - .default(['pr.create', 'review.post', 'issue.create', 'issue.comment', 'issue.close', 'pr.merge', 'pr.update']) + allowedActions: z.array(z.union(CI_ACTION_VALUES)) + .default(['pr.create', 'review.post', 'issue.create', 'issue.comment', 'issue.close', 'pr.merge', 'pr.update', 'ci.run']) .description('Write actions this plugin may perform; each still requires approval.'), workspaceDir: z.string() .description('Working directory for read-only git inspection (defaults to process cwd).'), + ci: CiConfig + .description('CI integration: review bot, status-check gate, and the one-shot ci_run tool.'), }) diff --git a/src/github.ts b/src/github.ts index 66ed51d..549fe38 100644 --- a/src/github.ts +++ b/src/github.ts @@ -49,6 +49,8 @@ interface ClientOptions { maxRetries: number retryBaseMs: number retryMaxWaitMs: number + /** Hard per-request deadline; aborts the fetch when exceeded. */ + requestTimeoutMs: number fetchImpl: typeof fetch } @@ -56,6 +58,9 @@ const JSON_ACCEPT = 'application/vnd.github+json' const API_VERSION = '2022-11-28' const USER_AGENT = 'dsh-github' +/** Methods safe to retry on network failures and 5xx responses (reads only; writes stay idempotent). */ +const SAFE_RETRY_METHODS = new Set(['GET', 'HEAD']) + function rateLimitFromHeaders(headers: Headers): RateLimitInfo { const remaining = headers.get('x-ratelimit-remaining') const reset = headers.get('x-ratelimit-reset') @@ -156,10 +161,12 @@ export class GithubClient { return { text: await response.text(), rateLimit } } - /** Fetch with Authorization, 429/403-retry, and signal handling. */ + /** Fetch with Authorization, timeout, and retry (429/403 rate limits always; reads also on network errors and 5xx). */ private async request(method: string, path: string, options: GithubRequestOptions): Promise { let attempt = 0 for (;;) { + const timeoutSignal = AbortSignal.timeout(this.options.requestTimeoutMs) + const signal = options.signal === undefined ? timeoutSignal : AbortSignal.any([options.signal, timeoutSignal]) let response: Response try { response = await this.options.fetchImpl(new URL(path, this.options.apiBaseUrl), { @@ -172,17 +179,26 @@ export class GithubClient { ...options.body !== undefined ? { 'Content-Type': 'application/json' } : {}, }, ...options.body !== undefined ? { body: JSON.stringify(options.body) } : {}, - signal: options.signal, + signal, }) } catch (error) { if (options.signal?.aborted) throw options.signal.reason instanceof Error ? options.signal.reason : new Error('aborted') + // A deadline exceeded or a transport failure is retryable for safe + // (read) methods only; a caller abort above always fails fast. + if (SAFE_RETRY_METHODS.has(method) && attempt < this.options.maxRetries) { + await sleep(Math.min(this.options.retryBaseMs * 2 ** attempt, this.options.retryMaxWaitMs), options.signal) + attempt += 1 + continue + } throw error } - // Retry primary (429) and secondary (403 + Retry-After) rate limits only; - // a 403 without Retry-After is a permission denial and must fail fast. + // Retry primary (429) and secondary (403 + Retry-After) rate limits for + // every method, plus transient 5xx responses for safe read methods; a + // 403 without Retry-After is a permission denial and must fail fast. const retryable = response.status === 429 || (response.status === 403 && response.headers.get('retry-after') !== null) + || (SAFE_RETRY_METHODS.has(method) && (response.status === 502 || response.status === 503 || response.status === 504)) if (!retryable || attempt >= this.options.maxRetries) return response await sleep(retryDelayMs(response.headers, attempt, this.options), options.signal) attempt += 1 @@ -197,6 +213,7 @@ export function clientOptionsFromConfig(config: Config, fetchImpl?: typeof fetch maxRetries: config.maxRetries, retryBaseMs: config.retryBaseMs, retryMaxWaitMs: config.retryMaxWaitMs, + requestTimeoutMs: config.requestTimeoutMs, fetchImpl: fetchImpl ?? globalThis.fetch.bind(globalThis), } } diff --git a/src/index.ts b/src/index.ts index ead84ca..05175e1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,16 +1,21 @@ /** * dsh-github: GitHub integration for DeepSeek Harness. * - * Tools: pr_create / pr_merge / pr_update (writes), gh_review (read), - * review_post (write), gh_issue (read), issue_open / issue_comment / - * issue_close (writes), gh_repo / gh_file / gh_search (reads). Commands: /pr - * create, /review (start|stop|post), /issue open. Background review jobs run - * the deterministic analyzer by default; `reviewMode: "model"` delegates the - * capped diff to a one-shot subagent through the host's `subagents` seam. - * Every GitHub write is gated by the tools/pre-execute approval listener - * (default ask) and the allowedActions whitelist; the token travels only - * through the credentials seam / environment / gh CLI and never reaches - * model-visible text, session events, or logs. + * Tools: pr_create / pr_merge / pr_update / review_post / issue_open / + * issue_comment / issue_close / ci_run (writes), gh_review / gh_issue / + * gh_search / gh_repo / gh_file (reads). Commands: /pr create, /review + * (start|stop|post), /issue open, /ci (scan|status|start|stop|run — when + * `ci.enabled`). Background review jobs run the deterministic analyzer by + * default; `reviewMode: "model"` delegates the capped diff to a one-shot + * subagent through the host's `subagents` seam. The CI surface (`ci.*` + * config) adds the polling review bot, the status-check gate, and the + * one-shot `ci_run` pipeline consumed by the composite action + * (`action.yml`). Every GitHub write is gated by the tools/pre-execute + * approval listener (default ask) and the allowedActions whitelist — except + * the CI driver (`DSH_GITHUB_CI_DRIVER=1`), which auto-allows exactly the + * actions listed in `ci.autoApprove`; the token travels only through the + * credentials seam / environment / gh CLI and never reaches model-visible + * text, session events, or logs. * * Model-visible ⇔ logged: the plugin appends NO custom session event types — * the host refuses logs with unknown out-of-repo event types, so all content @@ -32,6 +37,8 @@ import { } from './tools.ts' import { registerApprovalGate } from './approval-gate.ts' import { registerCommands } from './commands.ts' +import { registerCiBot } from './ci/bot.ts' +import { ciRunTool } from './ci/tool.ts' import { Config, type Config as PluginConfig } from './config.ts' export const name = 'dsh-github' @@ -75,9 +82,15 @@ export function applyWithDeps(ctx: Context, config: PluginConfig, deps: PluginDe ctx.tools.register(ghSearchTool(state)) ctx.tools.register(ghRepoTool(state)) ctx.tools.register(ghFileTool(state)) + if (config.ci.enabled) { + ctx.tools.register(ciRunTool(state)) + } ctx.effect(() => registerApprovalGate(ctx, state)) ctx.effect(() => registerCommands(ctx.commands, ctx.jobs, state)) + if (config.ci.enabled) { + ctx.effect(() => registerCiBot(ctx, ctx.commands, state)) + } } /** diff --git a/src/jobs.ts b/src/jobs.ts index 4758646..7d6bd33 100644 --- a/src/jobs.ts +++ b/src/jobs.ts @@ -192,8 +192,9 @@ function runReviewWork(state: GithubState, record: ReviewJobRecord, input: Requi /** Review prompt for the one-shot subagent (model review). */ function modelReviewPrompt(record: ReviewJobRecord, diffText: string, truncated: boolean): string { return [ - `Review the following GitHub pull request diff for PR #${record.pr} in ${record.repo}.`, - 'You are a careful code reviewer. Analyze correctness, security, style, and maintainability.', + 'You are a careful software engineer reviewing a GitHub pull request.', + `Review the diff for PR #${record.pr} in ${record.repo}.`, + 'Analyze correctness, security, style, and maintainability.', 'Write the review as GitHub-flavored Markdown suitable for posting as a PR comment:', '- a short overall verdict first,', '- then concrete findings grouped by file with line numbers where possible.', diff --git a/src/present.ts b/src/present.ts index f09afbb..997efe6 100644 --- a/src/present.ts +++ b/src/present.ts @@ -574,3 +574,64 @@ export function ghFileResult(_args: GhFileArgs, result: ToolResult): ToolResultV }], } } + +/** Narrow structural view of ci_run arguments. */ +export interface CiRunArgs { + task: 'review' | 'analyze' | 'publish' + pr: string + ownerRepo?: string + maxDiffChars?: number + body?: string + findings?: Array<{ file: string; line?: number | null; severity: 'info' | 'warning' | 'error'; rule: string; message: string }> + postComments?: boolean + postCheck?: boolean +} + +/** Narrow structural view of the ci_run canonical value. */ +export interface CiRunValueView { + status: 'ok' + repo: string + pr: number + headSha: string + verdict: 'pass' | 'needs-changes' | 'skipped' + engine: 'static' | 'model' + findings: Array<{ file: string; line: number | null; severity: string; rule: string; message: string }> + summary: string + truncated: boolean + alreadyReviewed: boolean + diffText?: string + checkRun?: { id: number; url: string; conclusion: string } + review?: { url: string; inlineComments: number } + files?: { json: string; markdown: string } + rateLimit: RateLimitValueView +} + +/** Pending card for ci_run. */ +export function ciRunCall(args: CiRunArgs): ToolCallView { + return { + card: 'generic', + title: `CI ${args.task}: ${args.pr}`, + rawInput: { + task: args.task, + pr: args.pr, + ...args.ownerRepo !== undefined ? { ownerRepo: args.ownerRepo } : {}, + ...args.maxDiffChars !== undefined ? { maxDiffChars: args.maxDiffChars } : {}, + ...args.body !== undefined ? { bodyChars: args.body.length } : {}, + ...args.findings !== undefined ? { findings: args.findings.length } : {}, + }, + } +} + +/** Completed card for ci_run: verdict plus the check link. */ +export function ciRunResult(_args: CiRunArgs, result: ToolResult): ToolResultView | undefined { + const value = result.meta as CiRunValueView | GithubErrorValue | undefined + if (value === undefined) return undefined + if (value.status === 'error') { + return { card: 'generic', title: 'CI run failed', content: [{ type: 'text', text: `${value.message}${value.guidance !== undefined ? `\n${value.guidance}` : ''}` }] } + } + const lines = [`PR #${value.pr} in ${value.repo}: verdict ${value.verdict} (${value.findings.length} finding(s))${value.alreadyReviewed ? ' · already reviewed at this head commit' : ''}`] + if (value.checkRun !== undefined) lines.push(`check: ${value.checkRun.url} (${value.checkRun.conclusion})`) + if (value.review !== undefined && value.review.url.length > 0) lines.push(`review: ${value.review.url} (${value.review.inlineComments} inline comment(s))`) + if (value.files !== undefined) lines.push(`reports: ${value.files.json} · ${value.files.markdown}`) + return { card: 'generic', title: `CI review verdict: ${value.verdict}`, content: [{ type: 'text', text: lines.join('\n') }] } +} diff --git a/src/review.ts b/src/review.ts index 9ddb0ad..bff4507 100644 --- a/src/review.ts +++ b/src/review.ts @@ -174,7 +174,7 @@ function countSeverity(findings: readonly Finding[], severity: FindingSeverity): } /** Make a diff-derived file name safe to interpolate into Markdown. */ -function sanitizeFileName(file: string): string { +export function sanitizeFileName(file: string): string { return file .replace(/\\/g, '\\\\') .replace(/`/g, '\\`') diff --git a/src/state.ts b/src/state.ts index fe4b390..b9e1619 100644 --- a/src/state.ts +++ b/src/state.ts @@ -14,7 +14,7 @@ import { repoFromRemoteUrl, type GitRunner } from './git.ts' import { resolveToken, type GhRunner, type TokenResolution } from './credential.ts' import type { SubagentsService } from './types.ts' import type { ReviewReport } from './review.ts' -import type { Config } from './config.ts' +import { CiConfig, type Config } from './config.ts' /** Result of resolving which repository a call targets. */ export type RepoResolution = { ok: true; repo: string } | { ok: false; code: string; message: string; guidance: string } @@ -63,6 +63,8 @@ export interface GithubState { workspaceDir: string /** Hostname of the configured REST API base, for origin-URL matching. */ apiHost: string + /** True while this process is the composite action's CI driver (`DSH_GITHUB_CI_DRIVER=1`). */ + isCiDriver: boolean /** Register one review-job record, evicting settled records past the cap. */ rememberRecord(id: string, record: ReviewJobRecord): void } @@ -81,25 +83,29 @@ const REPO_PATTERN = /^[A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+$/ * @param fetchImpl - fetch implementation (injectable in tests). */ export function createState(ctx: { credentials: CredentialProvider; subagents?: SubagentsService }, config: Config, runGit: GitRunner, runGh: GhRunner, fetchImpl?: typeof fetch): GithubState { - const clientOptions = clientOptionsFromConfig(config, fetchImpl) - const apiHost = new URL(config.apiBaseUrl).hostname.toLowerCase() + // A composition omitting the whole `ci` block gets the schema defaults here, + // so every consumer can read `config.ci.*` without undefined checks. + const normalizedConfig: Config = { ...config, ci: CiConfig(config.ci ?? {}) as CiConfig } + const clientOptions = clientOptionsFromConfig(normalizedConfig, fetchImpl) + const apiHost = new URL(normalizedConfig.apiBaseUrl).hostname.toLowerCase() const records = new Map() const state: GithubState = { - config, + config: normalizedConfig, credentials: ctx.credentials, subagents: ctx.subagents, records, runGit, runGh, - workspaceDir: config.workspaceDir ?? process.cwd(), + workspaceDir: normalizedConfig.workspaceDir ?? process.cwd(), apiHost, - resolveToken: (signal?: AbortSignal) => resolveToken(ctx.credentials, config.tokenSource, config.tokenRef, runGh, signal), + isCiDriver: process.env.DSH_GITHUB_CI_DRIVER === '1', + resolveToken: (signal?: AbortSignal) => resolveToken(ctx.credentials, normalizedConfig.tokenSource, normalizedConfig.tokenRef, runGh, signal), client: (token: string) => new GithubClient(token, clientOptions), resolveRepo: (ownerRepo: string | undefined, signal?: AbortSignal) => resolveRepo(state, ownerRepo, signal), parsePrRef: parsePrRef, rememberRecord: (id, record) => { records.set(id, record) - while (records.size > config.maxReviewRecords) { + while (records.size > normalizedConfig.maxReviewRecords) { const oldestSettled = [...records.entries()].find(([, item]) => item.status !== 'running') if (oldestSettled === undefined) break // every record is running; the cap is best-effort. records.delete(oldestSettled[0]) diff --git a/src/tools.ts b/src/tools.ts index 502e98f..ec6ec1b 100644 --- a/src/tools.ts +++ b/src/tools.ts @@ -32,14 +32,14 @@ const RATE_LIMIT_PROPERTIES = { resetAt: { oneOf: [{ type: 'number' }, { type: 'null' }] }, } as const -const RATE_LIMIT_SCHEMA = { +export const RATE_LIMIT_SCHEMA = { type: 'object', additionalProperties: false, properties: RATE_LIMIT_PROPERTIES, required: true, } as const -const ERROR_SCHEMA = { +export const ERROR_SCHEMA = { type: 'object', additionalProperties: false, properties: { diff --git a/test/ci.test.ts b/test/ci.test.ts new file mode 100644 index 0000000..9356e07 --- /dev/null +++ b/test/ci.test.ts @@ -0,0 +1,403 @@ +import { afterEach, beforeEach, describe, expect, it } from 'vitest' +import { mkdtempSync, readFileSync, rmSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { loadPlugin, makeServices, stubFetch, jsonResponse, textResponse, TOKEN, MockAgent } from './helpers.ts' +import { analyzePr, globToRegExp, matchesAnyGlob } from '../src/ci/review-rules.ts' +import { formatMarkdownReport, hasReviewMarker, reviewMarker, verdictFor } from '../src/ci/pipeline.ts' +import type { CiConfig } from '../src/config.ts' +import { Config } from '../src/config.ts' + +const SHA = 'abc123def456' +const PULL_META = { + number: 7, + title: 'feat: shiny', + state: 'open', + html_url: 'https://github.com/o/r/pull/7', + additions: 12, + deletions: 3, + draft: false, + user: { login: 'alice' }, + labels: [{ name: 'needs-review' }], + head: { ref: 'feat/shiny', sha: SHA }, + base: { ref: 'main' }, +} +const FILES_PAYLOAD = [{ filename: 'src/app.ts', additions: 5, deletions: 1 }] +const DIFF_TEXT = [ + 'diff --git a/src/app.ts b/src/app.ts', + 'index 1111111..2222222 100644', + '--- a/src/app.ts', + '+++ b/src/app.ts', + '@@ -1,3 +1,4 @@', + ' const keep = 1', + '+const token = "ghp_abcdefghijklmnopqrstu"', + '+// TODO: wire the flag', + ' ', +].join('\n') +const CLEAN_DIFF = [ + 'diff --git a/src/app.ts b/src/app.ts', + 'index 1111111..2222222 100644', + '--- a/src/app.ts', + '+++ b/src/app.ts', + '@@ -1 +1,2 @@', + '+export const answer = 42', + ' ', +].join('\n') + +function acceptOf(init?: RequestInit): string { + return String((init?.headers as Record | undefined)?.Accept ?? '') +} + +interface CiRoutesOptions { + meta?: unknown + diff?: string + files?: unknown + checkRuns?: unknown + reviews?: unknown + /** Captures the JSON bodies of POST /reviews and POST /check-runs. */ + posts?: Array<{ url: string; body: unknown }> + /** Captures POST bodies only when the pathname matches this exact value. */ + openPulls?: unknown +} + +/** Pipeline routes for `o/r` PR #7 with the default happy-path payloads. */ +function ciRoutes(options: CiRoutesOptions = {}) { + const posts = options.posts ?? [] + const capture = (init?: RequestInit, url?: string) => { + if (url !== undefined) posts.push({ url, body: init?.body === undefined ? null : JSON.parse(String(init.body)) }) + } + return [ + { + match: (m: string, u: URL, init?: RequestInit) => m === 'GET' && u.pathname === '/repos/o/r/pulls/7' && acceptOf(init).includes('diff'), + respond: () => textResponse(200, options.diff ?? DIFF_TEXT), + }, + { + match: (m: string, u: URL) => m === 'GET' && u.pathname === '/repos/o/r/pulls/7', + respond: () => jsonResponse(200, options.meta ?? PULL_META), + }, + { + match: (m: string, u: URL) => m === 'GET' && u.pathname === '/repos/o/r/pulls/7/files', + respond: () => jsonResponse(200, options.files ?? FILES_PAYLOAD), + }, + { + match: (m: string, u: URL) => m === 'GET' && u.pathname === `/repos/o/r/commits/${SHA}/check-runs`, + respond: () => jsonResponse(200, options.checkRuns ?? { total_count: 0, check_runs: [] }), + }, + { + match: (m: string, u: URL) => m === 'GET' && u.pathname === '/repos/o/r/pulls/7/reviews', + respond: () => jsonResponse(200, options.reviews ?? []), + }, + { + match: (m: string, u: URL, init?: RequestInit) => m === 'POST' && u.pathname === '/repos/o/r/pulls/7/reviews', + respond: (init?: RequestInit) => { capture(init, '/repos/o/r/pulls/7/reviews'); return jsonResponse(200, { id: 7, html_url: 'https://github.com/o/r/pull/7#pullrequestreview-7' }) }, + }, + { + match: (m: string, u: URL, init?: RequestInit) => m === 'POST' && u.pathname === `/repos/o/r/commits/${SHA}/check-runs`, + respond: (init?: RequestInit) => { capture(init, `/repos/o/r/commits/${SHA}/check-runs`); return jsonResponse(201, { id: 9, html_url: 'https://github.com/o/r/runs/9' }) }, + }, + ...(options.openPulls !== undefined ? [{ + match: (m: string, u: URL) => m === 'GET' && u.pathname === '/repos/o/r/pulls', + respond: () => jsonResponse(200, options.openPulls), + }] : []), + ] +} + +let reportDir: string + +beforeEach(() => { + reportDir = mkdtempSync(join(tmpdir(), 'dsh-github-ci-')) + delete process.env.GITHUB_OUTPUT + delete process.env.DSH_GITHUB_CI_DRIVER +}) + +afterEach(() => { + rmSync(reportDir, { recursive: true, force: true }) + delete process.env.DSH_GITHUB_CI_DRIVER +}) + +async function loaded(routes = ciRoutes(), config: Record = {}) { + const services = makeServices() + services.credentials.values.set('GITHUB_TOKEN', TOKEN) + await loadPlugin(services, { + config: { + defaultOwnerRepo: 'o/r', + ci: { enabled: true, pollIntervalMs: 0, reportDir }, + ...config, + }, + runGit: async () => { throw new Error('git unused') }, + runGh: async () => { throw new Error('gh unused') }, + fetchImpl: stubFetch(routes), + }) + return services +} + +describe('review-rules', () => { + it('translates globs with *, **, and ?; basename globs match at any depth', () => { + expect(globToRegExp('src/**').test('src/a/b.ts')).toBe(true) + expect(globToRegExp('src/**').test('src/a.ts')).toBe(true) + expect(globToRegExp('*.pem').test('server.pem')).toBe(true) + expect(globToRegExp('*.pem').test('certs/server.pem')).toBe(true) // basename glob + expect(globToRegExp('.env').test('config/.env')).toBe(true) + expect(globToRegExp('**/*.test.ts').test('a/b/x.test.ts')).toBe(true) + expect(globToRegExp('file?.txt').test('file1.txt')).toBe(true) + expect(globToRegExp('.github/workflows/*.yml').test('.github/workflows/ci.yml')).toBe(true) + }) + + it('flags sensitive files, oversized scope, and missing tests', () => { + const options = { + sensitivePathPatterns: ['.env', '**/secrets/**', '.github/workflows/*.yml'], + sensitiveSeverity: 'warning' as const, + codeExtensions: ['.ts'], + testPathPatterns: ['**/*.test.ts', '**/test/**'], + maxChangedFiles: 2, + maxAddedLines: 100, + maxRemovedLines: 100, + } + const findings = analyzePr({ + files: [ + { path: 'src/app.ts', added: 90, removed: 0 }, + { path: 'src/helper.ts', added: 5, removed: 0 }, + { path: 'config/.env', added: 1, removed: 0 }, + { path: '.github/workflows/ci.yml', added: 40, removed: 0 }, + ], + additions: 136, + deletions: 0, + options, + }) + const rules = findings.map(finding => finding.rule) + expect(rules).toContain('sensitive-file') + expect(rules).toContain('missing-tests') + expect(rules).toContain('large-change') + const sensitive = findings.filter(finding => finding.rule === 'sensitive-file') + expect(sensitive).toHaveLength(2) + expect(sensitive[0]?.severity).toBe('warning') + }) + + it('finds no missing-tests finding when tests changed alongside code', () => { + const findings = analyzePr({ + files: [ + { path: 'src/app.ts', added: 5, removed: 0 }, + { path: 'src/app.test.ts', added: 3, removed: 0 }, + ], + additions: 8, + deletions: 0, + options: { + sensitivePathPatterns: [], + sensitiveSeverity: 'warning', + codeExtensions: ['.ts'], + testPathPatterns: ['**/*.test.ts'], + maxChangedFiles: 30, + maxAddedLines: 1000, + maxRemovedLines: 1000, + }, + }) + expect(findings.some(finding => finding.rule === 'missing-tests')).toBe(false) + }) +}) + +describe('ci helpers', () => { + it('computes the verdict from findings under the failOn policy', () => { + expect(verdictFor([], 'error')).toBe('pass') + expect(verdictFor([{ file: 'a', line: 1, severity: 'warning', rule: 'r', message: 'm' }], 'error')).toBe('pass') + expect(verdictFor([{ file: 'a', line: 1, severity: 'warning', rule: 'r', message: 'm' }], 'warning')).toBe('needs-changes') + expect(verdictFor([{ file: 'a', line: 1, severity: 'error', rule: 'r', message: 'm' }], 'error')).toBe('needs-changes') + }) + + it('derives the idempotency marker per head commit', () => { + const marker = reviewMarker(SHA) + expect(hasReviewMarker(`\n${marker}\n`, SHA)).toBe(true) + expect(hasReviewMarker('no marker', SHA)).toBe(false) + }) + + it('formats a Markdown report with verdict and check facts', () => { + const md = formatMarkdownReport({ + status: 'ok', repo: 'o/r', pr: 7, headSha: SHA, verdict: 'needs-changes', engine: 'static', + findings: [{ file: 'src/a.ts', line: 3, severity: 'error', rule: 'hardcoded-secret', message: 'secret' }], + summary: 'verdict needs-changes', truncated: false, alreadyReviewed: false, + checkRun: { id: 1, url: 'https://example/checks/1', conclusion: 'failure' }, + rateLimit: { remaining: 10, resetAt: 0 }, + }, { blocking: true, checkName: 'dsh-github-review' }) + expect(md).toContain('Verdict: **needs-changes** (blocking)') + expect(md).toContain('hardcoded-secret') + }) +}) + +describe('ci_run tool (pipeline)', () => { + it('registers ci_run only when ci.enabled', async () => { + const on = await loaded() + expect(on.tools.get('ci_run').name).toBe('ci_run') + const off = makeServices() + off.credentials.values.set('GITHUB_TOKEN', TOKEN) + await loadPlugin(off, { config: { defaultOwnerRepo: 'o/r' }, fetchImpl: stubFetch([]) }) + expect(off.tools.defs.has('ci_run')).toBe(false) + }) + + it('reviews a PR: posts comments and the check, writes reports, verdict pass', async () => { + const posts: Array<{ url: string; body: unknown }> = [] + const services = await loaded(ciRoutes({ diff: CLEAN_DIFF, posts })) + const value = await services.tools.run('ci_run', { task: 'review', pr: 'o/r#7' }) as Record + expect(value.status).toBe('ok') + expect(value.verdict).toBe('pass') // CLEAN_DIFF has no line findings; missing-tests is a warning and failOn is error + expect(value.alreadyReviewed).toBe(false) + expect(value.checkRun).toMatchObject({ conclusion: 'success' }) + expect(value.review).toMatchObject({ inlineComments: 0 }) + const reviewPost = posts.find(post => post.url === '/repos/o/r/pulls/7/reviews') + expect(reviewPost).toBeDefined() + expect((reviewPost?.body as { body: string }).body.startsWith(reviewMarker(SHA))).toBe(true) + expect(posts.some(post => post.url === `/repos/o/r/commits/${SHA}/check-runs`)).toBe(true) + const jsonPath = join(reportDir, 'dsh-github-ci-result.json') + const mdPath = join(reportDir, 'dsh-github-ci-summary.md') + expect(readFileSync(jsonPath, 'utf8')).toContain('"verdict"') + expect(readFileSync(mdPath, 'utf8')).toContain('Verdict: **pass**') + }) + + it('flags hardcoded secrets as error findings', async () => { + const services = await loaded() + const value = await services.tools.run('ci_run', { task: 'analyze', pr: 'o/r#7' }) as Record + expect(value.status).toBe('ok') + const findings = value.findings as Array<{ rule: string; severity: string }> + expect(findings.some(finding => finding.rule === 'hardcoded-secret' && finding.severity === 'error')).toBe(true) + expect(value.diffText).toContain('ghp_') + expect(value.checkRun).toBeUndefined() + expect(value.review).toBeUndefined() + }) + + it('is idempotent: an already-published gate means no duplicate comments or checks', async () => { + const posts: Array<{ url: string; body: unknown }> = [] + const services = await loaded(ciRoutes({ + posts, + checkRuns: { total_count: 1, check_runs: [{ id: 5, name: 'dsh-github-review', status: 'completed', conclusion: 'success', html_url: 'https://example/checks/5' }] }, + reviews: [{ id: 3, body: `${reviewMarker(SHA)}\n## dsh-github review` }], + })) + const value = await services.tools.run('ci_run', { task: 'review', pr: 'o/r#7' }) as Record + expect(value.alreadyReviewed).toBe(true) + expect(value.verdict).toBe('pass') // conclusion success → pass + expect(value.checkRun).toMatchObject({ id: 5, conclusion: 'success' }) + expect(posts).toHaveLength(0) + }) + + it('skips filtered PRs with a neutral check and no comments', async () => { + const posts: Array<{ url: string; body: unknown }> = [] + const services = await loaded(ciRoutes({ posts, meta: { ...PULL_META, labels: [{ name: 'other' }] } }), { + ci: { enabled: true, pollIntervalMs: 0, reportDir, labelFilters: ['needs-review'] }, + }) + const value = await services.tools.run('ci_run', { task: 'review', pr: 'o/r#7' }) as Record + expect(value.verdict).toBe('skipped') + expect(posts.some(post => post.url === '/repos/o/r/pulls/7/reviews')).toBe(false) + const checkPost = posts.find(post => post.url === `/repos/o/r/commits/${SHA}/check-runs`) + expect(checkPost).toBeDefined() + expect(checkPost?.body).toMatchObject({ conclusion: 'neutral' }) + }) + + it('publishes the model-authored body and merges its findings', async () => { + const posts: Array<{ url: string; body: unknown }> = [] + const services = await loaded(ciRoutes({ diff: CLEAN_DIFF, posts }), { ci: { enabled: true, pollIntervalMs: 0, reportDir, failOn: 'error' } }) + const value = await services.tools.run('ci_run', { + task: 'publish', + pr: 'o/r#7', + body: 'Reviewed: the flag wiring looks correct.', + findings: [{ file: 'src/app.ts', line: 4, severity: 'error', rule: 'model-finding', message: 'state update races the render' }], + }) as Record + expect(value.verdict).toBe('needs-changes') + const reviewPost = posts.find(post => post.url === '/repos/o/r/pulls/7/reviews') + expect((reviewPost?.body as { body: string }).body).toContain('Reviewed: the flag wiring looks correct.') + const findings = value.findings as Array<{ rule: string }> + expect(findings.some(finding => finding.rule === 'model-finding')).toBe(true) + }) + + it('returns a structured error without a token', async () => { + const services = makeServices() + await loadPlugin(services, { + config: { defaultOwnerRepo: 'o/r', ci: { enabled: true, pollIntervalMs: 0, reportDir } }, + fetchImpl: stubFetch([]), + }) + const value = await services.tools.run('ci_run', { task: 'review', pr: 'o/r#7' }) as Record + expect(value.status).toBe('error') + expect(value.code).toBe('no-token') + }) +}) + +describe('ci approval gate', () => { + function execLike(name: string, args: unknown) { + return { + callId: 'call-1', + rootCallId: 'call-1', + name, + arguments: args, + agent: new MockAgent(), + signal: new AbortController().signal, + token: Symbol('token'), + } + } + + async function decide(services: Awaited>, name: string, args: unknown) { + return services.ctx.waterfall( + 'tools/pre-execute', + execLike(name, args) as never, + async () => ({ kind: 'allow' }) as never, + ) + } + + it('asks for approval on ci_run in interactive sessions', async () => { + const services = await loaded(ciRoutes(), { ci: { enabled: true, pollIntervalMs: 0, reportDir, autoApprove: [] } }) + const decision = await decide(services, 'ci_run', { task: 'review', pr: 'o/r#7' }) + expect(decision).toMatchObject({ kind: 'ask' }) + expect((decision as { reason: string }).reason).toContain('run CI review for GitHub pull request o/r#7') + }) + + it('auto-allows ci.run for the CI driver only when listed in ci.autoApprove', async () => { + process.env.DSH_GITHUB_CI_DRIVER = '1' + const allowed = await loaded(ciRoutes(), { ci: { enabled: true, pollIntervalMs: 0, reportDir, autoApprove: ['ci.run'] } }) + expect(await decide(allowed, 'ci_run', { task: 'review', pr: 'o/r#7' })).toMatchObject({ kind: 'allow' }) + // Other writes still ask even in driver mode unless listed. + expect(await decide(allowed, 'pr_merge', { pr: 'o/r#7' })).toMatchObject({ kind: 'ask' }) + // Without the allowlist entry the driver asks too. + const gated = await loaded(ciRoutes(), { ci: { enabled: true, pollIntervalMs: 0, reportDir, autoApprove: [] } }) + expect(await decide(gated, 'ci_run', { task: 'review', pr: 'o/r#7' })).toMatchObject({ kind: 'ask' }) + }) +}) + +describe('/ci command family (bot)', () => { + it('scans open PRs through the pipeline and reports the pass', async () => { + const services = await loaded(ciRoutes({ diff: CLEAN_DIFF, openPulls: [{ number: 7, title: 'feat: shiny' }] })) + const result = await services.commands.run('ci', 'scan', new MockAgent()) + expect(result.kind).toBe('success') + expect(result.text).toContain('scanned 1 open PR(s)') + expect(result.text).toContain('needs-changes') // missing-tests rule fires + }) + + it('runs one PR on demand and reports the check url', async () => { + const services = await loaded() + const result = await services.commands.run('ci', 'run o/r#7', new MockAgent()) + expect(result.kind).toBe('success') + expect(result.text).toContain('verdict needs-changes') + expect(result.text).toContain('check: https://github.com/o/r/runs/9') + }) + + it('reports status and toggles polling', async () => { + const services = await loaded(ciRoutes(), { ci: { enabled: true, pollIntervalMs: 0, reportDir } }) + const status = await services.commands.run('ci', 'status', new MockAgent()) + expect(status.text).toContain('polling: off') + const start = await services.commands.run('ci', 'start', new MockAgent()) + expect(start.kind).toBe('error') // pollIntervalMs is 0 + const stop = await services.commands.run('ci', 'stop', new MockAgent()) + expect(stop.text).toContain('polling disabled') + }) +}) + +describe('ci config schema', () => { + it('applies nested defaults for a partial ci block and a missing ci block', () => { + const partial = Config({ ci: { enabled: true } }) as { ci: CiConfig } + expect(partial.ci.enabled).toBe(true) + expect(partial.ci.checkName).toBe('dsh-github-review') + expect(partial.ci.blocking).toBe(true) + expect(partial.ci.sensitivePathPatterns).toContain('.github/workflows/*.yml') + const missing = Config({}) as { ci: CiConfig | undefined } + expect(missing.ci === undefined || missing.ci.checkName === 'dsh-github-review').toBe(true) + }) + + it('defaults requestTimeoutMs and keeps it bounded', () => { + const resolved = Config({}) as { requestTimeoutMs: number } + expect(resolved.requestTimeoutMs).toBe(30_000) + }) +}) diff --git a/test/config.test.ts b/test/config.test.ts index e11fb58..581ade1 100644 --- a/test/config.test.ts +++ b/test/config.test.ts @@ -19,7 +19,7 @@ describe('Config schema', () => { expect(resolved.reviewJobTimeoutMs).toBe(600_000) expect(resolved.maxRetries).toBe(3) expect(resolved.apiBaseUrl).toBe('https://api.github.com') - expect(resolved.allowedActions).toEqual(['pr.create', 'review.post', 'issue.create', 'issue.comment', 'issue.close', 'pr.merge', 'pr.update']) + expect(resolved.allowedActions).toEqual(['pr.create', 'review.post', 'issue.create', 'issue.comment', 'issue.close', 'pr.merge', 'pr.update', 'ci.run']) expect(resolved.defaultOwnerRepo).toBeUndefined() expect(resolved.workspaceDir).toBeUndefined() }) diff --git a/test/helpers.ts b/test/helpers.ts index 1cfa5f7..6156218 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -222,13 +222,13 @@ export function textResponse(status: number, body: string, headers: Record boolean - respond: () => Response + respond: (init?: RequestInit) => Response }>): typeof fetch { return (async (input: string | URL | Request, init?: RequestInit) => { const url = new URL(typeof input === 'string' ? input : input instanceof URL ? input : input.url) const method = init?.method ?? 'GET' for (const route of routes) { - if (route.match(method, url, init)) return route.respond() + if (route.match(method, url, init)) return route.respond(init) } return jsonResponse(404, { message: `no stub for ${method} ${url.pathname}` }) }) as typeof fetch diff --git a/test/security.test.ts b/test/security.test.ts index eef28c2..896c8d6 100644 --- a/test/security.test.ts +++ b/test/security.test.ts @@ -1,4 +1,7 @@ import { describe, expect, it } from 'vitest' +import { mkdtempSync, readFileSync, rmSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { join } from 'node:path' import { loadPlugin, makeServices, MockAgent, stubFetch, jsonResponse, TOKEN } from './helpers.ts' const PULL_PAYLOAD = { @@ -196,4 +199,46 @@ describe('token non-leakage (S2)', () => { expect(postedBody).not.toContain(TOKEN) expect(postedBody).toContain('todo-marker') }) + + it('keeps the token out of CI runs, cards, review bodies, and report files', async () => { + const reportDir = mkdtempSync(join(tmpdir(), 'dsh-github-sec-')) + const SHA = 'abc123' + try { + const services = makeServices() + services.credentials.values.set('GITHUB_TOKEN', TOKEN) + await loadPlugin(services, { + config: { defaultOwnerRepo: 'o/r', ci: { enabled: true, pollIntervalMs: 0, reportDir } }, + runGit: async () => { throw new Error('unused') }, + fetchImpl: stubFetch([ + { match: (m: string, u: URL, i?: RequestInit) => m === 'GET' && u.pathname === '/repos/o/r/pulls/7' && accept(i) !== 'application/vnd.github.diff', respond: () => jsonResponse(200, PULL_PAYLOAD) }, + { match: (m: string, u: URL) => m === 'GET' && u.pathname === '/repos/o/r/pulls/7', respond: () => new Response(DIFF, { status: 200, headers: { 'Content-Type': 'text/plain' } }) }, + { match: (m: string, u: URL) => m === 'GET' && u.pathname === '/repos/o/r/pulls/7/files', respond: () => jsonResponse(200, [{ filename: 'src/a.ts', additions: 1, deletions: 0 }]) }, + { match: (m: string, u: URL) => m === 'GET' && u.pathname === `/repos/o/r/commits/${SHA}/check-runs`, respond: () => jsonResponse(200, { total_count: 0, check_runs: [] }) }, + { match: (m: string, u: URL) => m === 'GET' && u.pathname === '/repos/o/r/pulls/7/reviews', respond: () => jsonResponse(200, []) }, + { match: (m: string, u: URL) => m === 'POST' && u.pathname === '/repos/o/r/pulls/7/reviews', respond: () => jsonResponse(200, { id: 9, html_url: 'https://github.com/o/r/pull/7#pullrequestreview-9' }) }, + { match: (m: string, u: URL) => m === 'POST' && u.pathname === `/repos/o/r/commits/${SHA}/check-runs`, respond: () => jsonResponse(201, { id: 5, html_url: 'https://example/checks/5' }) }, + { match: () => true, respond: () => jsonResponse(404, { message: 'nope' }) }, + ]), + }) + const agent = new MockAgent() + const value = await services.tools.run('ci_run', { task: 'review', pr: 'o/r#7' }, agent) + const def = services.tools.get('ci_run') + const surfaces = [ + JSON.stringify(value), + JSON.stringify(def.output.render({ task: 'review', pr: 'o/r#7' }, value)), + JSON.stringify(def.presentCall?.({ task: 'review', pr: 'o/r#7' }) ?? null), + JSON.stringify(def.presentResult?.({ task: 'review', pr: 'o/r#7' }, { content: [], isError: false, meta: value }) ?? null), + readFileSync(join(reportDir, 'dsh-github-ci-result.json'), 'utf8'), + readFileSync(join(reportDir, 'dsh-github-ci-summary.md'), 'utf8'), + ] + for (const text of surfaces) { + expect(text).not.toContain(TOKEN) + expect(text.toLowerCase()).not.toContain(TOKEN.toLowerCase()) + } + const command = await services.commands.run('ci', 'run o/r#7', agent) + expect(JSON.stringify(command)).not.toContain(TOKEN) + } finally { + rmSync(reportDir, { recursive: true, force: true }) + } + }) }) From 8d75821c772d74a5826d87b6b254483d83e44147 Mon Sep 17 00:00:00 2001 From: PerryLink <255665900+PerryLink@users.noreply.github.com> Date: Sun, 16 Aug 2026 20:04:56 +0800 Subject: [PATCH 2/2] docs: document the ci config section and requestTimeoutMs in all five READMEs, add the 0.6.0 changelog entry --- CHANGELOG.md | 13 +++++++++++++ README.es.md | 6 ++++-- README.hi.md | 6 ++++-- README.md | 6 ++++-- README.pt.md | 6 ++++-- README.zh-CN.md | 6 ++++-- 6 files changed, 33 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d628475..8cf92fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.6.0] - 2026-08-16 + +### Added + +- **CI integration surface**: a composite GitHub Action (`action.yml`) that reviews PRs, fixes CI, and writes the report; a polling review bot with idempotent inline comments and a status-check gate published per PR head commit; and the one-shot `ci_run` tool plus the `/ci` command family. +- `ci` config section: master switch, review engine (`static`/`model`), CI-driver auto-approve list, status-check name and blocking behavior, fail-on severity, poll interval, label/path filters, sensitive-path and test-existence rules, change-size caps, concurrency cap, comment posting, and report directory. +- `ci.run` write action joins the `allowedActions` default list. +- `requestTimeoutMs` config: hard per-request timeout that aborts the fetch when exceeded. + +### Changed + +- The README "planned v2 companion repository" note is replaced: the CI / GitHub Action surface now ships in this repository. + ## [0.5.0] - 2026-08-15 ### Added diff --git a/README.es.md b/README.es.md index c22ee42..2f4fc1d 100644 --- a/README.es.md +++ b/README.es.md @@ -144,9 +144,11 @@ Validado con Schemastery en el momento de carga (falla de forma evidente). Sobre | `maxRetries` | `3` | Intentos de reintento 429 por solicitud | | `retryBaseMs` | `500` | Base del retroceso de reintento (se duplica por intento) | | `retryMaxWaitMs` | `60000` | Tope del retroceso de reintento | +| `requestTimeoutMs` | `30000` | Tiempo máximo por solicitud; aborta el fetch al superarse | | `apiBaseUrl` | `https://api.github.com` | URL base de la API REST de GitHub (GitHub Enterprise) | -| `allowedActions` | `['pr.create','pr.merge','pr.update','review.post','issue.create','issue.comment','issue.close']` | Lista blanca de acciones de escritura; cualquier otra se deniega antes de la aprobación | +| `allowedActions` | `['pr.create','pr.merge','pr.update','review.post','issue.create','issue.comment','issue.close','ci.run']` | Lista blanca de acciones de escritura; cualquier otra se deniega antes de la aprobación | | `workspaceDir` | process cwd | Directorio de trabajo para la inspección de git de solo lectura | +| `ci` | `{ enabled: false, … }` | Sección de integración CI: bot de revisión por sondeo, puerta de status-check y la herramienta de un solo uso `ci_run` (contiene todas las claves `ci.*`) | ## 🛠 Herramientas @@ -223,7 +225,7 @@ Validado con Schemastery en el momento de carga (falla de forma evidente). Sobre - **Analizador estático por defecto** — reglas deterministas (`src/review.ts`), cero tokens, reproducible. `reviewMode: "model"` delega el diff limitado a un subagente de un solo uso a través de la seam `subagents` del host para una revisión por LLM (consume tokens; requiere la seam y un proveedor registrado). - **Trabajos y registros locales al proceso** — el informe de revisión vive en la memoria del plugin indexado por el id del trabajo, coincidiendo con el ciclo de vida del registro de trabajos del host; el mapa de registros está limitado por `maxReviewRecords` (los registros finalizados más antiguos se eliminan primero). - **Las dist-tags `latest` de npm están obsoletas** — el plugin declara rangos de pares `^0.1.0-rc.5` para resolverse contra el cierre de perfil que proporciona `dsh-base`, y fija `0.1.0-rc.6` para desarrollo. Nunca instales con un simple `npm i @deepseek-ai/dsh-tools`. -- **CI / GitHub Action** (`dsh-github-action`, bucle headless de revisión→comentario en el espíritu de claude-code-action / codex-action) es un repositorio complementario v2 planificado. +- **CI / GitHub Action** — incluido en este repositorio (v0.6.0): una acción compuesta (`action.yml`) que revisa PRs, arregla CI y escribe el informe; un bot de revisión por sondeo con comentarios inline idempotentes; y una puerta de status-check. Todas las escrituras siguen sujetas a aprobación. ## 🧪 Desarrollo diff --git a/README.hi.md b/README.hi.md index 94fbb87..46093be 100644 --- a/README.hi.md +++ b/README.hi.md @@ -144,9 +144,11 @@ Load time पर Schemastery-सत्यापित (fail loud)। Profile क | `maxRetries` | `3` | प्रति request 429 retry प्रयास | | `retryBaseMs` | `500` | Retry backoff आधार (प्रति प्रयास दोगुना) | | `retryMaxWaitMs` | `60000` | Retry backoff की अधिकतम सीमा | +| `requestTimeoutMs` | `30000` | प्रति request का hard timeout; exceed होने पर fetch abort | | `apiBaseUrl` | `https://api.github.com` | GitHub REST base URL (GitHub Enterprise) | -| `allowedActions` | `['pr.create','pr.merge','pr.update','review.post','issue.create','issue.comment','issue.close']` | Write-action whitelist; बाकी सब approval से पहले अस्वीकार | +| `allowedActions` | `['pr.create','pr.merge','pr.update','review.post','issue.create','issue.comment','issue.close','ci.run']` | Write-action whitelist; बाकी सब approval से पहले अस्वीकार | | `workspaceDir` | process cwd | read-only git inspection के लिए working directory | +| `ci` | `{ enabled: false, … }` | CI integration section: polling review bot, status-check gate, और one-shot `ci_run` tool (सभी `ci.*` keys इसी में हैं) | ## 🛠 टूल्स @@ -223,7 +225,7 @@ Load time पर Schemastery-सत्यापित (fail loud)। Profile क - **Static analyzer by default** — deterministic rules (`src/review.ts`), शून्य tokens, reproducible। `reviewMode: "model"` LLM review के लिए capped diff को host के `subagents` seam के ज़रिए एक one-shot subagent को सौंपता है (tokens खर्च होते हैं; seam और एक registered provider की आवश्यकता होती है)। - **Jobs और records process-local हैं** — review report plugin memory में job id के आधार पर रहता है, जो host job registry के lifetime से मेल खाता है; record map `maxReviewRecords` से capped है (सबसे पुराने settled records पहले evict होते हैं)। - **npm `latest` dist-tags पुराने हैं** — plugin `^0.1.0-rc.5` peer ranges घोषित करता है ताकि यह `dsh-base` द्वारा दिए गए profile closure के विरुद्ध resolve हो, और विकास के लिए `0.1.0-rc.6` pin करता है। कभी भी bare `npm i @deepseek-ai/dsh-tools` से install न करें। -- **CI / GitHub Action** (`dsh-github-action`, claude-code-action / codex-action की भावना में headless review→comment loop) एक नियोजित v2 companion repository है। +- **CI / GitHub Action** — इसी repository में शामिल है (v0.6.0): एक composite action (`action.yml`) जो PRs की समीक्षा करती है, CI ठीक करती है, और report लिखती है; idempotent inline comments वाला polling review bot; और एक status-check gate। हर write approval-gated रहता है। ## 🧪 विकास diff --git a/README.md b/README.md index 355f2ee..5cbe9cf 100644 --- a/README.md +++ b/README.md @@ -146,9 +146,11 @@ Schemastery-validated at load time (fail loud). Override any key in the profile' | `maxRetries` | `3` | 429 retry attempts per request | | `retryBaseMs` | `500` | Retry backoff base (doubles per attempt) | | `retryMaxWaitMs` | `60000` | Retry backoff ceiling | +| `requestTimeoutMs` | `30000` | Hard per-request timeout; aborts the fetch when exceeded | | `apiBaseUrl` | `https://api.github.com` | GitHub REST base URL (GitHub Enterprise) | -| `allowedActions` | `['pr.create','pr.merge','pr.update','review.post','issue.create','issue.comment','issue.close']` | Write-action whitelist; anything else is denied before approval | +| `allowedActions` | `['pr.create','pr.merge','pr.update','review.post','issue.create','issue.comment','issue.close','ci.run']` | Write-action whitelist; anything else is denied before approval | | `workspaceDir` | process cwd | Working directory for read-only git inspection | +| `ci` | `{ enabled: false, … }` | CI integration section: polling review bot, status-check gate, and the one-shot `ci_run` tool (all `ci.*` keys live inside it) | ## 🛠 Tools @@ -225,7 +227,7 @@ Schemastery-validated at load time (fail loud). Override any key in the profile' - **Static analyzer by default** — deterministic rules (`src/review.ts`), zero tokens, reproducible. `reviewMode: "model"` delegates the capped diff to a one-shot subagent through the host's `subagents` seam for an LLM review (costs tokens; requires the seam and a registered provider). - **Jobs and records are process-local** — the review report lives in plugin memory keyed by job id, matching the host job registry's lifetime; the record map is capped by `maxReviewRecords` (oldest settled records evict first). - **npm `latest` dist-tags are stale** — the plugin declares `^0.1.0-rc.5` peer ranges so it resolves against the profile closure that `dsh-base` provides, and pins `0.1.0-rc.6` for development. Never install by bare `npm i @deepseek-ai/dsh-tools`. -- **CI / GitHub Action** (`dsh-github-action`, headless review→comment loop in the spirit of claude-code-action / codex-action) is a planned v2 companion repository. +- **CI / GitHub Action** — ships in this repository (v0.6.0): a composite action (`action.yml`) that reviews PRs, fixes CI, and writes the report; a polling review bot with idempotent inline comments; and a status-check gate. Every write stays approval-gated. ## 🧪 Development diff --git a/README.pt.md b/README.pt.md index 6104faf..bb5cee6 100644 --- a/README.pt.md +++ b/README.pt.md @@ -144,9 +144,11 @@ Validado pelo Schemastery no momento do carregamento (falha em alto e bom som). | `maxRetries` | `3` | Tentativas de nova tentativa em 429 por requisição | | `retryBaseMs` | `500` | Base do backoff de nova tentativa (dobra a cada tentativa) | | `retryMaxWaitMs` | `60000` | Teto do backoff de nova tentativa | +| `requestTimeoutMs` | `30000` | Timeout rígido por requisição; aborta o fetch ao exceder | | `apiBaseUrl` | `https://api.github.com` | URL base da API REST do GitHub (GitHub Enterprise) | -| `allowedActions` | `['pr.create','pr.merge','pr.update','review.post','issue.create','issue.comment','issue.close']` | Allowlist de ações de gravação; qualquer outra coisa é negada antes da aprovação | +| `allowedActions` | `['pr.create','pr.merge','pr.update','review.post','issue.create','issue.comment','issue.close','ci.run']` | Allowlist de ações de gravação; qualquer outra coisa é negada antes da aprovação | | `workspaceDir` | process cwd | Diretório de trabalho para inspeção somente leitura do git | +| `ci` | `{ enabled: false, … }` | Seção de integração CI: bot de revisão por polling, gate de status-check e a ferramenta de execução única `ci_run` (contém todas as chaves `ci.*`) | ## 🛠 Ferramentas @@ -223,7 +225,7 @@ Validado pelo Schemastery no momento do carregamento (falha em alto e bom som). - **Analisador estático por padrão** — regras determinísticas (`src/review.ts`), zero tokens, reproduzível. `reviewMode: "model"` delega o diff limitado a um subagente de uso único pela seam `subagents` do host para uma revisão por LLM (consome tokens; requer a seam e um provedor registrado). - **Jobs e registros são locais ao processo** — o relatório de revisão vive na memória do plugin, indexado pelo id do job, acompanhando o tempo de vida do registro de jobs do host; o mapa de registros é limitado por `maxReviewRecords` (os registros concluídos mais antigos são removidos primeiro). - **As dist-tags `latest` do npm estão desatualizadas** — o plugin declara faixas de peer `^0.1.0-rc.5` para resolver contra o fechamento de perfil que o `dsh-base` fornece, e fixa `0.1.0-rc.6` para desenvolvimento. Nunca instale por meio de um `npm i @deepseek-ai/dsh-tools` simples. -- **CI / GitHub Action** (`dsh-github-action`, loop headless revisão→comentário no espírito do claude-code-action / codex-action) é um repositório complementar v2 planejado. +- **CI / GitHub Action** — incluído neste repositório (v0.6.0): uma ação composta (`action.yml`) que revisa PRs, corrige CI e escreve o relatório; um bot de revisão por polling com comentários inline idempotentes; e um gate de status-check. Toda gravação permanece sujeita a aprovação. ## 🧪 Desenvolvimento diff --git a/README.zh-CN.md b/README.zh-CN.md index 59314ae..20dee86 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -144,9 +144,11 @@ allowBuilds: | `maxRetries` | `3` | 单请求的 429 重试次数 | | `retryBaseMs` | `500` | 重试退避基数(逐次翻倍) | | `retryMaxWaitMs` | `60000` | 重试退避上限 | +| `requestTimeoutMs` | `30000` | 单次请求硬超时;超时即中止 fetch | | `apiBaseUrl` | `https://api.github.com` | GitHub REST 基地址(GitHub Enterprise) | -| `allowedActions` | `['pr.create','pr.merge','pr.update','review.post','issue.create','issue.comment','issue.close']` | 写动作白名单;名单外直接拒绝 | +| `allowedActions` | `['pr.create','pr.merge','pr.update','review.post','issue.create','issue.comment','issue.close','ci.run']` | 写动作白名单;名单外直接拒绝 | | `workspaceDir` | 进程 cwd | 只读 git 检查的工作目录 | +| `ci` | `{ enabled: false, … }` | CI 集成段:轮询式审查机器人、状态检查门禁与一次性 `ci_run` 工具(其下为全部 `ci.*` 子键) | ## 🛠 工具 @@ -222,7 +224,7 @@ allowBuilds: - **默认静态分析器** —— 确定性规则集(`src/review.ts`),零 token、可复现。`reviewMode: "model"` 会把截断后的 diff 交给宿主 `subagents` 接缝的一次性 subagent 做 LLM 评审(消耗 token;需要接缝与已注册的 provider)。 - **job 与记录是进程内状态** —— 审查报告按 job id 存于插件内存,与宿主 job 注册表同为进程级生命周期;记录表受 `maxReviewRecords` 上限约束(最旧已终态记录先淘汰)。 - **npm `latest` 标签过期** —— 本插件用 `^0.1.0-rc.5` peer 范围对齐 `dsh-base` 提供的 profile 闭包,开发时钉 `0.1.0-rc.6`。不要裸跑 `npm i @deepseek-ai/dsh-tools`。 -- **CI / GitHub Action**(`dsh-github-action`,对标 claude-code-action / codex-action 的 headless「审查 PR → 评论」闭环)是计划中的 v2 配套仓库。 +- **CI / GitHub Action** — 随本仓库发布(v0.6.0):复合动作(`action.yml`)负责审查 PR、修复 CI 并产出报告;轮询式审查机器人带幂等行内评论;外加状态检查门禁。所有写动作仍需审批。 ## 🧪 开发