[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M77KAHTWMSWMA03FATPFYT3S":3,"skill-same:01M77KAHTWMSWMA03FATPFYT3S":44},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":14,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":29,"install":30,"resources":43},"01M77KAHTWMSWMA03FATPFYT3S","pr-review-submit",null,"Post a single GitHub PR review carrying both a verdict and a body — supplied inline or as a file — in one call, handling the self-review constraint that leaves an author only a comment.","TheVoskamps\u002Fclaude-plugins-marketplace","TheVoskamps","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F235012489?v=4","01M77K5ZCP12QCJPQ85WVJSHTS","Irene and Edwin Voskamp","01M77K5ZDS7DB0PA1W8FM7G2QD",0,"GPL-3.0","https:\u002F\u002Fgithub.com\u002FTheVoskamps\u002Fclaude-plugins-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-prs\u002Fskills\u002Fpr-review-submit\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: pr-review-submit\ndescription: Post a single GitHub PR review carrying both a verdict and a body — supplied inline or as a file — in one call, handling the self-review constraint that leaves an author only a comment.\n---\n\n# PR Review Submit\n\nPost a **single** pull-request review on a GitHub PR, carrying both a\nverdict and a review body in one call. This is the review-submission\nthe `\u002Fsdlc:orchestrate` flow previously performed as a raw review call\nof its own; the skill now owns it, and\n`sdlc:theorem-based-pr-reviewer` is the caller that posts through it.\n\nPosting the verdict and body in a single call is deliberate: a\nseparate comment followed by an approval or a change request would\ncreate two notifications for one review. This skill always emits\nexactly one review.\n\nThis skill is **GitHub-only by design**. Its script posts through\n`gh`; there is no CodeCommit (or other source-control) branch, and\nnone is planned here — CodeCommit is deliberately out of scope for\nthis plugin.\n\n## Invocation\n\n```text\n\u002Fpr-review-submit \u003CPR> --verdict \u003Capprove|request_changes|comment> \u003Cbody>\n\u002Fpr-review-submit \u003CPR> --verdict \u003Capprove|request_changes|comment> --body-file \u003Cpath>\n```\n\n- `\u003CPR>` (required): the pull request, in any form\n  `skills\u002Flib\u002Fpr-reference.md` lists.\n- `--verdict \u003Cvalue>` (required, exactly once): one of `approve`,\n  `request_changes`, or `comment`. These are GitHub's own review\n  actions, in the skill's spelling; nothing else is a verdict here.\n  - `approve` — the change is good to merge.\n  - `request_changes` — the change needs work before merge.\n  - `comment` — a verdict-less note (e.g. only Medium\u002FLow findings, no\n    approve\u002Fblock yet).\n- The review text, in **exactly one** of the forms below — supplying\n  both, or neither, is an error the skill aborts on rather than\n  guessing:\n  - `\u003Cbody>` — the text inline. The caller supplies the full review\n    body; this skill does not author findings.\n  - `--body-file \u003Cpath>` — a file holding that same text. This is the\n    form a caller uses when the body would not survive being spelled\n    inline on a command line, where the shell reads every backtick and\n    `$` in it: `sdlc:theorem-based-pr-reviewer` stages the review\n    summary it posts under `.claude\u002Ftmp\u002F\u003Ctask-slug>\u002F` and posts it by\n    path, and that summary carries a backticked state-relative detail\n    path on every theorem and finding line, under the\n    `${XDG_STATE_HOME:-$HOME\u002F.local\u002Fstate}` root it names once. GitHub\n    caps a review body at 64 KB, which bounds what either form can\n    carry.\n\nBoth forms work for every verdict.\n\n## Repo-config\n\nThis skill reads no repo-config. The PR, verdict, and body are all\nsupplied by the caller. (The `source-control` value a caller would\npreviously have read to choose between `gh` and CodeCommit is not\nconsulted — this plugin is GitHub-only, so there is nothing to branch\non.)\n\n## Execution\n\nRun the bundled script, spelled as a bare name, with the arguments you\nwere given. Pass an inline body as a single-quoted argument, or — when\nit holds a single quote, a backtick or a `$` — write it to a file with\nthe Write tool and pass that path instead:\n\n```bash\npr-review-submit \u003CPR> --verdict \u003Cverdict> '\u003Cbody>'\npr-review-submit \u003CPR> --verdict \u003Cverdict> --body-file \u003Cpath>\n```\n\nThe script checks its arguments before posting anything, and every\nrefusal posts no review rather than guessing what the caller meant.\nEach is a usage error, and stderr names which of these it is:\n\n- No `--verdict`.\n- More than one `--verdict`; the message names the first two values.\n- A `--verdict` value other than `approve`, `request_changes`, or\n  `comment`; the message names the value.\n- Both body forms supplied.\n- Neither body form supplied.\n\nThe verdict then decides, at once, the review action, the line the body\nopens with, and the GitHub review state the call creates. The\nverdict-line column holds unconditionally; the review state is what it\nsays here only when the action goes through, and the self-review\nconstraint below — the one case that replaces the action — lands\n`commented` instead:\n\n| `--verdict` | Review action | Body's first line | Review state |\n| --- | --- | --- | --- |\n| `approve` | approve | `APPROVED` | `approved` |\n| `request_changes` | request changes | `CHANGES_REQUESTED` | `changes_requested` |\n| `comment` | comment | `COMMENTED` | `commented` |\n\nThe verdict line goes at the head of the body on **every** post,\ndowngraded or not, followed by a blank line and the caller's text, so a\nreader of the body never has to work out whether the self-review\nconstraint below fired. It is the bare verdict word and nothing else: a\nreader can already see on the PR whether the round arrived as a review\nor as a comment, and a `commented` state dressed up as meaning\n`changes_requested` is worse than the plain word. In the file form the\nscript composes the posted body itself and leaves the caller's file\nuntouched.\n\n### Self-review constraint (an author may post only a comment)\n\n**Both** verdict actions are refused when the reviewer is the PR\nauthor. The refusal is GitHub's, not a client-side check: the server\nreturns it on the `addPullRequestReview` mutation, and `gh` prints it\nas, for example:\n\n```text\nGraphQL: Review Can not approve your own pull request (addPullRequestReview)\n```\n\nThe script reads no login to predict this. It posts with the verdict's\nown action, and only when that call fails with the refusal for **that**\naction — `Can not approve your own pull request` for `approve`,\n`Can not request changes on your own pull request` for\n`request_changes` — does it post again as a comment. The refused call\nleaves nothing on the PR, so the comment is the only review. Everything\nelse about the second call, the verdict line included, is unchanged,\nwhich is what carries the verdict the refused action would have\ncarried. `comment` is never refused this way. Any other failure of the\nfirst call stays a failure: nothing is reposted, and it exits 1.\n\nHandling the downgrade here is why `sdlc:theorem-based-pr-reviewer`\ncan hand this skill any verdict unconditionally: reviewer and author\nare frequently the same identity in the orchestrate flow, so a\nblocking verdict has to travel in the comment body.\n\n## Output and exit status\n\nAfter posting, the script re-reads the newest review on the PR,\nwhoever left it, and checks it is not the one that was newest before\nthe post, and that it carries the expected state and the body it\nposted. A review someone else leaves in between fails that check.\n\n- **Exit 0** — stdout is one line: the PR, the verdict\n  requested, the GitHub review state the call actually created\n  (`approved`, `changes_requested`, or `commented`), and which body\n  form carried it. Report it back. The state is what a caller gating on\n  the platform's view of the PR needs: a downgraded review carries\n  state `commented`, so GitHub sees no blocking review whatever the\n  body says.\n- **Exit 1** — a command the script ran failed, such as a `gh` call,\n  and its own error is on stderr above the script's line. Surface it verbatim.\n- **Exit 2** — a usage error, one of the refusals above; nothing was\n  posted.\n- **Exit 3** — the review did not land as posted: no new review\n  appeared, or it carries another state or another body. Stderr says\n  which. Report the failure rather than posting again.\n","# PR Review Submit\n\nPost a **single** pull-request review on a GitHub PR, carrying both a\nverdict and a review body in one call. This is the review-submission\nthe `\u002Fsdlc:orchestrate` flow previously performed as a raw review call\nof its own; the skill now owns it, and\n`sdlc:theorem-based-pr-reviewer` is the caller that posts through it.\n\nPosting the verdict and body in a single call is deliberate: a\nseparate comment followed by an approval or a change request would\ncreate two notifications for one review. This skill always emits\nexactly one review.\n\nThis skill is **GitHub-only by design**. Its script posts through\n`gh`; there is no CodeCommit (or other source-control) branch, and\nnone is planned here — CodeCommit is deliberately out of scope for\nthis plugin.\n\n## Invocation\n\n```text\n\u002Fpr-review-submit \u003CPR> --verdict \u003Capprove|request_changes|comment> \u003Cbody>\n\u002Fpr-review-submit \u003CPR> --verdict \u003Capprove|request_changes|comment> --body-file \u003Cpath>\n```\n\n- `\u003CPR>` (required): the pull request, in any form\n  `skills\u002Flib\u002Fpr-reference.md` lists.\n- `--verdict \u003Cvalue>` (required, exactly once): one of `approve`,\n  `request_changes`, or `comment`. These are GitHub's own review\n  actions, in the skill's spelling; nothing else is a verdict here.\n  - `approve` — the change is good to merge.\n  - `request_changes` — the change needs work before merge.\n  - `comment` — a verdict-less note (e.g. only Medium\u002FLow findings, no\n    approve\u002Fblock yet).\n- The review text, in **exactly one** of the forms below — supplying\n  both, or neither, is an error the skill aborts on rather than\n  guessing:\n  - `\u003Cbody>` — the text inline. The caller supplies the full review\n    body; this skill does not author findings.\n  - `--body-file \u003Cpath>` — a file holding that same text. This is the\n    form a caller uses when the body would not survive being spelled\n    inline on a command line, where the shell reads every backtick and\n    `$` in it: `sdlc:theorem-based-pr-reviewer` stages the review\n    summary it posts under `.claude\u002Ftmp\u002F\u003Ctask-slug>\u002F` and posts it by\n    path, and that summary carries a backticked state-relative detail\n    path on every theorem and finding line, under the\n    `${XDG_STATE_HOME:-$HOME\u002F.local\u002Fstate}` root it names once. GitHub\n    caps a review body at 64 KB, which bounds what either form can\n    carry.\n\nBoth forms work for every verdict.\n\n## Repo-config\n\nThis skill reads no repo-config. The PR, verdict, and body are all\nsupplied by the caller. (The `source-control` value a caller would\npreviously have read to choose between `gh` and CodeCommit is not\nconsulted — this plugin is GitHub-only, so there is nothing to branch\non.)\n\n## Execution\n\nRun the bundled script, spelled as a bare name, with the arguments you\nwere given. Pass an inline body as a single-quoted argument, or — when\nit holds a single quote, a backtick or a `$` — write it to a file with\nthe Write tool and pass that path instead:\n\n```bash\npr-review-submit \u003CPR> --verdict \u003Cverdict> '\u003Cbody>'\npr-review-submit \u003CPR> --verdict \u003Cverdict> --body-file \u003Cpath>\n```\n\nThe script checks its arguments before posting anything, and every\nrefusal posts no review rather than guessing what the caller meant.\nEach is a usage error, and stderr names which of these it is:\n\n- No `--verdict`.\n- More than one `--verdict`; the message names the first two values.\n- A `--verdict` value other than `approve`, `request_changes`, or\n  `comment`; the message names the value.\n- Both body forms supplied.\n- Neither body form supplied.\n\nThe verdict then decides, at once, the review action, the line the body\nopens with, and the GitHub review state the call creates. The\nverdict-line column holds unconditionally; the review state is what it\nsays here only when the action goes through, and the self-review\nconstraint below — the one case that replaces the action — lands\n`commented` instead:\n\n| `--verdict` | Review action | Body's first line | Review state |\n| --- | --- | --- | --- |\n| `approve` | approve | `APPROVED` | `approved` |\n| `request_changes` | request changes | `CHANGES_REQUESTED` | `changes_requested` |\n| `comment` | comment | `COMMENTED` | `commented` |\n\nThe verdict line goes at the head of the body on **every** post,\ndowngraded or not, followed by a blank line and the caller's text, so a\nreader of the body never has to work out whether the self-review\nconstraint below fired. It is the bare verdict word and nothing else: a\nreader can already see on the PR whether the round arrived as a review\nor as a comment, and a `commented` state dressed up as meaning\n`changes_requested` is worse than the plain word. In the file form the\nscript composes the posted body itself and leaves the caller's file\nuntouched.\n\n### Self-review constraint (an author may post only a comment)\n\n**Both** verdict actions are refused when the reviewer is the PR\nauthor. The refusal is GitHub's, not a client-side check: the server\nreturns it on the `addPullRequestReview` mutation, and `gh` prints it\nas, for example:\n\n```text\nGraphQL: Review Can not approve your own pull request (addPullRequestReview)\n```\n\nThe script reads no login to predict this. It posts with the verdict's\nown action, and only when that call fails with the refusal for **that**\naction — `Can not approve your own pull request` for `approve`,\n`Can not request changes on your own pull request` for\n`request_changes` — does it post again as a comment. The refused call\nleaves nothing on the PR, so the comment is the only review. Everything\nelse about the second call, the verdict line included, is unchanged,\nwhich is what carries the verdict the refused action would have\ncarried. `comment` is never refused this way. Any other failure of the\nfirst call stays a failure: nothing is reposted, and it exits 1.\n\nHandling the downgrade here is why `sdlc:theorem-based-pr-reviewer`\ncan hand this skill any verdict unconditionally: reviewer and author\nare frequently the same identity in the orchestrate flow, so a\nblocking verdict has to travel in the comment body.\n\n## Output and exit status\n\nAfter posting, the script re-reads the newest review on the PR,\nwhoever left it, and checks it is not the one that was newest before\nthe post, and that it carries the expected state and the body it\nposted. A review someone else leaves in between fails that check.\n\n- **Exit 0** — stdout is one line: the PR, the verdict\n  requested, the GitHub review state the call actually created\n  (`approved`, `changes_requested`, or `commented`), and which body\n  form carried it. Report it back. The state is what a caller gating on\n  the platform's view of the PR needs: a downgraded review carries\n  state `commented`, so GitHub sees no blocking review whatever the\n  body says.\n- **Exit 1** — a command the script ran failed, such as a `gh` call,\n  and its own error is on stderr above the script's line. Surface it verbatim.\n- **Exit 2** — a usage error, one of the refusals above; nothing was\n  posted.\n- **Exit 3** — the review did not land as posted: no new review\n  appeared, or it carries another state or another body. Stderr says\n  which. Report the failure rather than posting again.\n",{"name":5,"description":7},"main","4b187366f06afb374243166f6a0f5fc1514fa579","plugins\u002Fgithub-prs\u002Fskills\u002Fpr-review-submit","https:\u002F\u002Fgithub.com\u002FTheVoskamps\u002Fclaude-plugins-marketplace","https:\u002F\u002Fgithub.com\u002FTheVoskamps","2026-11-14 13:16:57",{"source":8,"skillName":5,"commands":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add TheVoskamps\u002Fclaude-plugins-marketplace --skill pr-review-submit",{"tool":36,"command":37},"bunx","bunx skills add TheVoskamps\u002Fclaude-plugins-marketplace --skill pr-review-submit",{"tool":39,"command":40},"pnpm","pnpm dlx skills add TheVoskamps\u002Fclaude-plugins-marketplace --skill pr-review-submit","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FTheVoskamps\u002Fclaude-plugins-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fgithub-prs\u002Fskills\u002Fpr-review-submit\u002FSKILL.md",true,[],[45,52,59,66,73,80],{"skillNo":46,"name":47,"nameZh":6,"description":48,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":49,"categories":50,"keywords":51,"publishedAt":19},"01M77KH3GAXPPXNQS96KDEEZBS","mask-inappropriate-language","Replace inappropriate language (profanity, slurs, strong insults) in provided text or a file with asterisks, character-for-character, preserving everything else.","https:\u002F\u002Fgithub.com\u002FTheVoskamps\u002Fclaude-plugins-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fwriting-tools\u002Fskills\u002Fmask-inappropriate-language\u002FSKILL.md",[],[],{"skillNo":53,"name":54,"nameZh":6,"description":55,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":56,"categories":57,"keywords":58,"publishedAt":19},"01M77KGY5TZDQT8QR23Y0R8P7A","theorem-agents-interface","The interface between the sdlc reviewer and the theorem agents it spawns — what each double-dash brief parameter means, and what each consequence class means. Preloaded into every theorem agent (sdlc:theorem-generator, the disprover, and the verifier) via its skills frontmatter, and read by name by the sdlc:theorem-based-pr-reviewer agent for what its briefs' parameters mean; not invoked from the user's slash menu.","https:\u002F\u002Fgithub.com\u002FTheVoskamps\u002Fclaude-plugins-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fsdlc\u002Fskills\u002Ftheorem-agents-interface\u002FSKILL.md",[],[],{"skillNo":60,"name":61,"nameZh":6,"description":62,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":63,"categories":64,"keywords":65,"publishedAt":19},"01M77KGT5HW0XAE500WSSM0PZY","sdlc-config-user","Interactively create or merge-update the repo user sdlc config, `\u003Crepo-root>\u002F.sdlc\u002Fuser-config.yml` (tier 3 — this user, this repo, never committed), and add it to the repo's tracked `.gitignore`.","https:\u002F\u002Fgithub.com\u002FTheVoskamps\u002Fclaude-plugins-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fsdlc\u002Fskills\u002Fsdlc-config-user\u002FSKILL.md",[],[],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":19},"01M77KGQGQVB0NYZX0WJRJPDEK","sdlc-config-repo","Interactively create or merge-update the shared repo sdlc config, `\u003Crepo-root>\u002F.sdlc\u002Frepo-config.yml` (tier 2 — tracked, every user of this repo).","https:\u002F\u002Fgithub.com\u002FTheVoskamps\u002Fclaude-plugins-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fsdlc\u002Fskills\u002Fsdlc-config-repo\u002FSKILL.md",[],[],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":19},"01M77KGKPEN7C5RCEDSEP3Z1XB","sdlc-config-global","Interactively create or merge-update the global user sdlc config, `$XDG_CONFIG_HOME\u002Fsdlc\u002Fuser-config.yml` (tier 1 — this user, every repo on this machine).","https:\u002F\u002Fgithub.com\u002FTheVoskamps\u002Fclaude-plugins-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fsdlc\u002Fskills\u002Fsdlc-config-global\u002FSKILL.md",[],[],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":19},"01M77KGFX95J2XEQBBD49QHTXK","pr-read-cli-interface","The contract for sdlc's PR-read CLIs — sdlc-pr-round, sdlc-pr-adjustments, sdlc-fixer-brief and sdlc-records-chain — their arguments, exit codes and output grammar. Preloaded into sdlc:theorem-based-pr-reviewer, sdlc:issue-fixer, sdlc:docs-writer and sdlc:pr-finalizer via their skills frontmatter; not invoked from the user's slash menu.","https:\u002F\u002Fgithub.com\u002FTheVoskamps\u002Fclaude-plugins-marketplace\u002Fblob\u002Fmain\u002Fplugins\u002Fsdlc\u002Fskills\u002Fpr-read-cli-interface\u002FSKILL.md",[],[]]