All notable changes to this project are documented in this file. The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- The bundle patch row now names the package exactly as published (
@perrylink/dsh-github). The previous bare name made the row unresolvable in a clean profile, so the plugin failed to load withERR_MODULE_NOT_FOUND.
- Local-machine protection for the action scripts:
action-patch.mjsandaction-post.mjsrefuse to run outside a GitHub Actions runner (noRUNNER_TEMP/GITHUB_WORKSPACE), and the newscripts/local-test.mjssimulates the composite action in a fully isolated sandbox —DSH_HOME,DSH_PROFILE_DIR, and the output directory are hardcoded under the system temp directory, overriding any inherited (machine-scope)DSH_HOME. - Regression coverage for the CI-context guards in
test/action-guard.test.ts, plus local-testing notes in all five READMEs.
- 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-shotci_runtool plus the/cicommand family. ciconfig 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.runwrite action joins theallowedActionsdefault list.requestTimeoutMsconfig: hard per-request timeout that aborts the fetch when exceeded.
- The README "planned v2 companion repository" note is replaced: the CI / GitHub Action surface now ships in this repository.
pr_mergetool: merge a pull request withmerge/squash/rebase, optional commit title/message, and optional head-branch deletion after the merge (approval-gated, actionpr.merge). The tool passes the head-commit SHA for consistency and reports branch-deletion failures as a note without failing the merge.pr_updatetool: edit a pull request's title, body, state (open/closed), or target branch (approval-gated, actionpr.update; at least one field required).gh_repotool: read a repository's metadata (description, default branch, visibility, stars, forks, open issues, language, license, topics, last update). Concurrency-safe.gh_filetool: read one file from a repository at a branch, tag, or commit (base64-decoded, capped by the newmaxFileCharsconfig, per-callmaxCharsoverride); directories are reported as a structuredis-directoryerror. Concurrency-safe.- Analyzer tunables moved into configuration:
maxFindings(default 50) andmaxLineLength(default 300) replace the hardcoded constants insrc/review.ts. - Secondary-rate-limit resilience: the REST client now retries 403 responses carrying a
Retry-Afterheader (GitHub's secondary-limit / abuse-detection signal) under the samemaxRetries/ backoff / signal rules as 429s; 403s withoutRetry-Afterstill fail fast as permission denials. - 204 No Content responses are handled by the JSON client (needed by the branch-deletion call).
test/present.test.ts: pure-function coverage for the new UI cards plus thereview_postbody-size indicator.- The
check:readmesgate now also asserts that every README mentions every tool and config key from the source, that no README pins a versioned tarball name, and that CHANGELOG.md carries a section for the current version. - Real-API e2e smoke for the contents endpoint (base64 decode path).
/pr createrefuses detached-HEAD checkouts with a structuredno-headerror instead of sending the literal branch nameHEADto the API./review postand thereview_postapproval reason label model-review jobs "model review" instead of "0 finding(s)".review_postinline mode omits thecommentskey entirely for body-only reviews (no line-anchored findings) instead of posting an empty array.- The
review_postpending card records the body override as a character count (bodyChars) rather than dropping it or dumping the text. allowedActionsdefaults now includepr.mergeandpr.update.- README install channels reference
dsh-github-<version>.tgzinstead of a stale pinned version.
- The unit suite is now hermetic against the environment: a developer's or CI's
GITHUB_TOKENno longer leaks into "no token" tests (a setup file removes it before unit tests run). The opt-in real-API smoke tests now gate on the dedicatedDSH_GITHUB_E2E_TOKENvariable instead.
-
Published to npm as
@perrylink/dsh-github(the unscopeddsh-githubname is owned by an unrelated project on the registry; the plugin's module name staysdsh-github). -
issue_commenttool: comment on an issue or pull request (approval-gated, actionissue.comment). -
issue_closetool: close an issue with an optionalstate_reason(completed/not_planned; approval-gated, actionissue.close). -
gh_searchtool: search issues and pull requests across repositories with the separate search quota surfaced. -
review_postmode: "inline": posts line-anchored review comments against the PR head commit viaPOST /pulls/{n}/reviews(the background job now captures the head-commit SHA).mode: "summary"remains the default. -
review_postbodyparameter: override the drafted comment before posting; approval reasons preview the override. -
Background review jobs now fetch PR metadata, CI check runs, and existing review comments; the completion output carries the CI summary and comment count.
/reviewaccepts--max-diff <n>,--no-ci,--no-comments. -
gh_reviewreturns the full capped diff asdiff.text(the render excerpt is bounded by the newrenderExcerptCharsconfig) and reports per-section fetch failures viadiff.error/comments.error/ci.errorinstead of swallowing them. -
gh_issueitems carrykind: issue | pr | comment; pull requests in listings are marked, and real comment payloads map correctly. -
Rate-limit facts now ride every result: write successes and all structured errors.
-
Analyzer rules:
google-api-keyandhardcoded-credentialdetection. -
Review-job record map is capped by the new
maxReviewRecordsconfig (oldest settled records evict first). -
GitHub Enterprise support in origin parsing:
repoFromRemoteUrlmatches the configuredapiBaseUrlhost. -
reviewMode: "model"config: background review jobs can delegate the capped diff to a one-shot subagent through the host'ssubagentsseam (the owning agent is the parent; the child's Markdown output becomes the postable report). The defaultstaticmode stays deterministic and token-free;modelReviewProviderselects the provider, and a missing seam or provider fails loud. -
Opt-in real-API smoke tests (
test/e2e.test.ts) that self-skip withoutGITHUB_TOKEN. -
CI workflow (
.github/workflows/ci.yml) and acheck:readmesscript wired intopackage.json.
- Approval reasons preview titles, body sizes, and review-body overrides.
- Posted review comments escape diff-derived file names (backticks + HTML) so hostile PRs cannot inject Markdown.
/review stopand/review <pr>return clean command errors for unknown jobs and missing job controllers (withdsh-tool-jobsguidance).maxDiffCharsis documented as a character cap (matching the implementation).
- Removed the unused
@deepseek-ai/dsh-scopepeer/dev dependency. - Removed the duplicated
RepoStateViewinterface declaration insrc/state.ts. - Fixed the module JSDoc reference to a README section that did not exist.
- Read-tool presenters now render structured error cards instead of assuming success values.
- README token wording corrected: the token is read per operation from the configured source and sent only in the Authorization header (it was never exclusively "in the credential layer").
- Documented the prompt-injection surface of GitHub content (issue/PR bodies, comments, search results) in the README security section.
- Initial release:
pr_create,gh_review,review_post,gh_issue,issue_opentools;/pr,/review,/issuecommand families; approval-gated writes; credential-seam token resolution; 429 retry with rate-limit surfacing; deterministic background review jobs.