diff --git a/README.md b/README.md index 6cc22c5..169fc28 100644 --- a/README.md +++ b/README.md @@ -167,7 +167,7 @@ or want an auditable record of what changed and why. **Purpose:** Run a comprehensive pre-flight audit and publish changes to a new PR in a single command. -Two sequential phases — Phase 2 is blocked until Phase 1 succeeds: +Three sequential phases — each is blocked until the previous one succeeds: 1. **Documentation Sync & Code Audit** — acts as `/docs-sync-audit`: scans all file changes since the last documentation edit, updates the docs/README to @@ -177,6 +177,11 @@ Two sequential phases — Phase 2 is blocked until Phase 1 succeeds: descriptively named branch, commits all pending changes (including the README updates from Phase 1), pushes to the remote, and opens a Pull Request against `main`. +3. **Post-Publish Attribution Scrub** — only runs if a global/user/project + rule forbids AI attribution footers. Checks the commit(s) and PR + description as actually persisted (not just what was composed) for + attribution text sneaked in by hooks outside the visible conversation, and + strips it via `git commit --amend` + force-push and `gh pr edit`. **Use when:** you say "Ship this," "Publish my changes," or invoke `/ship-it`. @@ -187,12 +192,19 @@ Two sequential phases — Phase 2 is blocked until Phase 1 succeeds: **Purpose:** Register a Gitea push mirror so a repository's commits are automatically forwarded to a corresponding GitHub repository. -Uses `tea api` against Gitea's `push_mirrors` endpoint, with credentials passed -as `remote_username`/`remote_password` fields — never embedded in the mirror +Before registering the mirror, checks whether the GitHub target repository +exists and creates it if missing (via `gh`, a GitHub MCP server, or the REST +API directly — whichever is available), since GitHub won't auto-create it on +first push the way Gitea does; if none of those are available it warns the +user to create it manually instead of blocking. Uses `tea api` against +Gitea's `push_mirrors` endpoint, with credentials passed as +`remote_username`/`remote_password` fields — never embedded in the mirror URL. Defaults to an `8h` sync interval with sync-on-commit enabled; both are overridable per request, as is the destination repository name. `GITHUB_USER`/`GITHUB_TOKEN` can come from the environment or, as a fallback, a -repo-root `.env` file. +repo-root `.env` file. All shell snippets are POSIX-compatible so the skill +works under bash, zsh, or any shell the agent's tool happens to invoke — not +just Fish. **Use when:** you say "Mirror this repository to GitHub," or invoke `/mirror-it`. Only relevant for repositories hosted on Gitea — GitHub can't diff --git a/dist/agy/rootiest-ai-all/skills/ship-it/SKILL.md b/dist/agy/rootiest-ai-all/skills/ship-it/SKILL.md index 4da824e..caf1df7 100644 --- a/dist/agy/rootiest-ai-all/skills/ship-it/SKILL.md +++ b/dist/agy/rootiest-ai-all/skills/ship-it/SKILL.md @@ -1,7 +1,7 @@ --- name: ship-it description: Runs a comprehensive pre-flight audit, syncs the README, and publishes the changes to a new PR. -version: 1.0.0 +version: 1.1.0 user-invocable: true author: Rootiest --- @@ -9,7 +9,7 @@ author: Rootiest # /ship-it Instructions: -Execute the following two phases sequentially. Do not proceed to Phase 2 unless Phase 1 completes successfully. +Execute the following phases sequentially. Do not proceed to the next phase unless the current one completes successfully. 1. Phase 1: Documentation Sync & Code Audit - Act as the `/docs-sync-audit` skill. @@ -23,3 +23,23 @@ Execute the following two phases sequentially. Do not proceed to Phase 2 unless - Stage and commit all pending changes (including the newly updated README from Phase 1). - Push the branch to the remote repository. - Generate a Pull Request (PR) from the new branch into 'main'. + +3. Phase 3: Post-Publish Attribution Scrub + - Only run this phase if a global, user, or project rule (e.g. `CLAUDE.md`, memory) explicitly + forbids AI attribution footers/text (e.g. "no Co-Authored-By", "no Claude attribution") on + commits or PRs. Skip this phase entirely if no such rule exists. + - Run this check AFTER the commit and PR from Phase 2 already exist, not before — attribution + lines can be injected by a hook outside the visible conversation, so text you composed + yourself is not proof of what actually landed. Verify the real, persisted state: + - Inspect the actual commit message(s) just created (`git log -1 --format=%B` for each + commit pushed) for attribution lines (e.g. `Co-Authored-By: Claude...`, "Generated with + Claude Code", or similar). + - Inspect the actual PR description as stored on the remote (e.g. `gh pr view --json body`), + not the text you intended to send. + - If any attribution text is found in violation of the rule, remove it: + - Commit message: amend it (`git commit --amend`) to strip the offending lines, then + force-push the branch (`git push --force-with-lease`) since it was just created for this + PR and nothing else depends on it yet. + - PR description: edit it directly (`gh pr edit --body ...`) with the offending lines + removed. + - Report to the user whether attribution was found and stripped, or that none was found. diff --git a/dist/agy/ship-it/skills/ship-it/SKILL.md b/dist/agy/ship-it/skills/ship-it/SKILL.md index 4da824e..caf1df7 100644 --- a/dist/agy/ship-it/skills/ship-it/SKILL.md +++ b/dist/agy/ship-it/skills/ship-it/SKILL.md @@ -1,7 +1,7 @@ --- name: ship-it description: Runs a comprehensive pre-flight audit, syncs the README, and publishes the changes to a new PR. -version: 1.0.0 +version: 1.1.0 user-invocable: true author: Rootiest --- @@ -9,7 +9,7 @@ author: Rootiest # /ship-it Instructions: -Execute the following two phases sequentially. Do not proceed to Phase 2 unless Phase 1 completes successfully. +Execute the following phases sequentially. Do not proceed to the next phase unless the current one completes successfully. 1. Phase 1: Documentation Sync & Code Audit - Act as the `/docs-sync-audit` skill. @@ -23,3 +23,23 @@ Execute the following two phases sequentially. Do not proceed to Phase 2 unless - Stage and commit all pending changes (including the newly updated README from Phase 1). - Push the branch to the remote repository. - Generate a Pull Request (PR) from the new branch into 'main'. + +3. Phase 3: Post-Publish Attribution Scrub + - Only run this phase if a global, user, or project rule (e.g. `CLAUDE.md`, memory) explicitly + forbids AI attribution footers/text (e.g. "no Co-Authored-By", "no Claude attribution") on + commits or PRs. Skip this phase entirely if no such rule exists. + - Run this check AFTER the commit and PR from Phase 2 already exist, not before — attribution + lines can be injected by a hook outside the visible conversation, so text you composed + yourself is not proof of what actually landed. Verify the real, persisted state: + - Inspect the actual commit message(s) just created (`git log -1 --format=%B` for each + commit pushed) for attribution lines (e.g. `Co-Authored-By: Claude...`, "Generated with + Claude Code", or similar). + - Inspect the actual PR description as stored on the remote (e.g. `gh pr view --json body`), + not the text you intended to send. + - If any attribution text is found in violation of the rule, remove it: + - Commit message: amend it (`git commit --amend`) to strip the offending lines, then + force-push the branch (`git push --force-with-lease`) since it was just created for this + PR and nothing else depends on it yet. + - PR description: edit it directly (`gh pr edit --body ...`) with the offending lines + removed. + - Report to the user whether attribution was found and stripped, or that none was found. diff --git a/dist/claude-code/rootiest-ai-all/skills/ship-it/SKILL.md b/dist/claude-code/rootiest-ai-all/skills/ship-it/SKILL.md index 4da824e..caf1df7 100644 --- a/dist/claude-code/rootiest-ai-all/skills/ship-it/SKILL.md +++ b/dist/claude-code/rootiest-ai-all/skills/ship-it/SKILL.md @@ -1,7 +1,7 @@ --- name: ship-it description: Runs a comprehensive pre-flight audit, syncs the README, and publishes the changes to a new PR. -version: 1.0.0 +version: 1.1.0 user-invocable: true author: Rootiest --- @@ -9,7 +9,7 @@ author: Rootiest # /ship-it Instructions: -Execute the following two phases sequentially. Do not proceed to Phase 2 unless Phase 1 completes successfully. +Execute the following phases sequentially. Do not proceed to the next phase unless the current one completes successfully. 1. Phase 1: Documentation Sync & Code Audit - Act as the `/docs-sync-audit` skill. @@ -23,3 +23,23 @@ Execute the following two phases sequentially. Do not proceed to Phase 2 unless - Stage and commit all pending changes (including the newly updated README from Phase 1). - Push the branch to the remote repository. - Generate a Pull Request (PR) from the new branch into 'main'. + +3. Phase 3: Post-Publish Attribution Scrub + - Only run this phase if a global, user, or project rule (e.g. `CLAUDE.md`, memory) explicitly + forbids AI attribution footers/text (e.g. "no Co-Authored-By", "no Claude attribution") on + commits or PRs. Skip this phase entirely if no such rule exists. + - Run this check AFTER the commit and PR from Phase 2 already exist, not before — attribution + lines can be injected by a hook outside the visible conversation, so text you composed + yourself is not proof of what actually landed. Verify the real, persisted state: + - Inspect the actual commit message(s) just created (`git log -1 --format=%B` for each + commit pushed) for attribution lines (e.g. `Co-Authored-By: Claude...`, "Generated with + Claude Code", or similar). + - Inspect the actual PR description as stored on the remote (e.g. `gh pr view --json body`), + not the text you intended to send. + - If any attribution text is found in violation of the rule, remove it: + - Commit message: amend it (`git commit --amend`) to strip the offending lines, then + force-push the branch (`git push --force-with-lease`) since it was just created for this + PR and nothing else depends on it yet. + - PR description: edit it directly (`gh pr edit --body ...`) with the offending lines + removed. + - Report to the user whether attribution was found and stripped, or that none was found. diff --git a/dist/claude-code/ship-it/.claude-plugin/plugin.json b/dist/claude-code/ship-it/.claude-plugin/plugin.json index d9d37f9..edf37b3 100644 --- a/dist/claude-code/ship-it/.claude-plugin/plugin.json +++ b/dist/claude-code/ship-it/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "ship-it", "description": "Runs a comprehensive pre-flight audit, syncs the README, and publishes the changes to a new PR.", - "version": "1.0.0", + "version": "1.1.0", "author": { "name": "Rootiest" } diff --git a/dist/claude-code/ship-it/skills/ship-it/SKILL.md b/dist/claude-code/ship-it/skills/ship-it/SKILL.md index 4da824e..caf1df7 100644 --- a/dist/claude-code/ship-it/skills/ship-it/SKILL.md +++ b/dist/claude-code/ship-it/skills/ship-it/SKILL.md @@ -1,7 +1,7 @@ --- name: ship-it description: Runs a comprehensive pre-flight audit, syncs the README, and publishes the changes to a new PR. -version: 1.0.0 +version: 1.1.0 user-invocable: true author: Rootiest --- @@ -9,7 +9,7 @@ author: Rootiest # /ship-it Instructions: -Execute the following two phases sequentially. Do not proceed to Phase 2 unless Phase 1 completes successfully. +Execute the following phases sequentially. Do not proceed to the next phase unless the current one completes successfully. 1. Phase 1: Documentation Sync & Code Audit - Act as the `/docs-sync-audit` skill. @@ -23,3 +23,23 @@ Execute the following two phases sequentially. Do not proceed to Phase 2 unless - Stage and commit all pending changes (including the newly updated README from Phase 1). - Push the branch to the remote repository. - Generate a Pull Request (PR) from the new branch into 'main'. + +3. Phase 3: Post-Publish Attribution Scrub + - Only run this phase if a global, user, or project rule (e.g. `CLAUDE.md`, memory) explicitly + forbids AI attribution footers/text (e.g. "no Co-Authored-By", "no Claude attribution") on + commits or PRs. Skip this phase entirely if no such rule exists. + - Run this check AFTER the commit and PR from Phase 2 already exist, not before — attribution + lines can be injected by a hook outside the visible conversation, so text you composed + yourself is not proof of what actually landed. Verify the real, persisted state: + - Inspect the actual commit message(s) just created (`git log -1 --format=%B` for each + commit pushed) for attribution lines (e.g. `Co-Authored-By: Claude...`, "Generated with + Claude Code", or similar). + - Inspect the actual PR description as stored on the remote (e.g. `gh pr view --json body`), + not the text you intended to send. + - If any attribution text is found in violation of the rule, remove it: + - Commit message: amend it (`git commit --amend`) to strip the offending lines, then + force-push the branch (`git push --force-with-lease`) since it was just created for this + PR and nothing else depends on it yet. + - PR description: edit it directly (`gh pr edit --body ...`) with the offending lines + removed. + - Report to the user whether attribution was found and stripped, or that none was found. diff --git a/plugins/ship-it/plugin.json b/plugins/ship-it/plugin.json index f74e6a7..512d9b0 100644 --- a/plugins/ship-it/plugin.json +++ b/plugins/ship-it/plugin.json @@ -1,6 +1,6 @@ { "name": "ship-it", "description": "Runs a comprehensive pre-flight audit, syncs the README, and publishes the changes to a new PR.", - "version": "1.0.0", + "version": "1.1.0", "author": { "name": "Rootiest" } } diff --git a/plugins/ship-it/skills/ship-it/SKILL.md b/plugins/ship-it/skills/ship-it/SKILL.md index 4da824e..caf1df7 100644 --- a/plugins/ship-it/skills/ship-it/SKILL.md +++ b/plugins/ship-it/skills/ship-it/SKILL.md @@ -1,7 +1,7 @@ --- name: ship-it description: Runs a comprehensive pre-flight audit, syncs the README, and publishes the changes to a new PR. -version: 1.0.0 +version: 1.1.0 user-invocable: true author: Rootiest --- @@ -9,7 +9,7 @@ author: Rootiest # /ship-it Instructions: -Execute the following two phases sequentially. Do not proceed to Phase 2 unless Phase 1 completes successfully. +Execute the following phases sequentially. Do not proceed to the next phase unless the current one completes successfully. 1. Phase 1: Documentation Sync & Code Audit - Act as the `/docs-sync-audit` skill. @@ -23,3 +23,23 @@ Execute the following two phases sequentially. Do not proceed to Phase 2 unless - Stage and commit all pending changes (including the newly updated README from Phase 1). - Push the branch to the remote repository. - Generate a Pull Request (PR) from the new branch into 'main'. + +3. Phase 3: Post-Publish Attribution Scrub + - Only run this phase if a global, user, or project rule (e.g. `CLAUDE.md`, memory) explicitly + forbids AI attribution footers/text (e.g. "no Co-Authored-By", "no Claude attribution") on + commits or PRs. Skip this phase entirely if no such rule exists. + - Run this check AFTER the commit and PR from Phase 2 already exist, not before — attribution + lines can be injected by a hook outside the visible conversation, so text you composed + yourself is not proof of what actually landed. Verify the real, persisted state: + - Inspect the actual commit message(s) just created (`git log -1 --format=%B` for each + commit pushed) for attribution lines (e.g. `Co-Authored-By: Claude...`, "Generated with + Claude Code", or similar). + - Inspect the actual PR description as stored on the remote (e.g. `gh pr view --json body`), + not the text you intended to send. + - If any attribution text is found in violation of the rule, remove it: + - Commit message: amend it (`git commit --amend`) to strip the offending lines, then + force-push the branch (`git push --force-with-lease`) since it was just created for this + PR and nothing else depends on it yet. + - PR description: edit it directly (`gh pr edit --body ...`) with the offending lines + removed. + - Report to the user whether attribution was found and stripped, or that none was found.