feat(ship-it): scrub attribution footers sneaked in post-commit/PR #10

Merged
rootiest merged 1 commits from docs-ship-it-attribution-scrub-and-mirror-it-docs-sync into main 2026-09-19 01:13:55 +00:00
8 changed files with 128 additions and 16 deletions
Showing only changes of commit 7d430c46ac - Show all commits

No files matched your search

+16 -4
View File
@@ -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
+22 -2
View File
@@ -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.
+22 -2
View File
@@ -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.
+22 -2
View File
@@ -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.
+1 -1
View File
@@ -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"
}
+22 -2
View File
@@ -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.
+1 -1
View File
@@ -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" }
}
+22 -2
View File
@@ -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.