From shipnote
Generate a build-in-public post from recent git activity. Used by the /shipnote command. Scans git repos, crafts a human-sounding post, saves it, and updates the checkpoint.
How this skill is triggered — by the user, by Claude, or both
Slash command
/shipnote:generate-postThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are generating a "build in public" post based on the user's recent development activity.
You are generating a "build in public" post based on the user's recent development activity.
Read ~/.shipnote/config.json. If it doesn't exist, tell the user: "No config found. Run /shipnote-setup first to configure Shipnote." and stop.
Extract these values:
tone (raw, educational, hype, mix)postsPerRun (1, 2, or 3)reposPath (path to scan)platform (threads, x, both)maxLength (character limit)Read ~/.shipnote/last-checkpoint.json. Extract lastRun timestamp.
If the file doesn't exist, use the start of today (midnight) as the checkpoint.
Run the scan script:
bash ${CLAUDE_PLUGIN_ROOT}/scripts/scan-repos.sh "<reposPath>" "<lastRun timestamp>"
If the output is NO_ACTIVITY, tell the user:
"No new commits since your last post. Keep building — run /shipnote again later!"
Do not generate a post. Do not update the checkpoint.
Using the git activity from the scan, generate post(s) following these rules:
Voice rules:
Tone adjustments:
raw: Focus on the real experience. Struggles, time spent, honest reactions.educational: Pull out a lesson or tip from the work. "TIL:" or "Note to self:" style.hype: Focus on momentum and progress. Short, punchy, forward-looking.mix: Read the activity and pick whichever tone fits best for each post.Platform adjustments:
threads: Up to 500 characters. Can be multi-paragraph.x: Max 280 characters. Single tight paragraph.both: Generate one version for each platform.Generate exactly {postsPerRun} post(s).
Print each post clearly separated:
---
[Post 1 content]
---
If multiple posts, number them.
Append the generated post(s) to ~/.shipnote/posts.md in this format:
## YYYY-MM-DD
### HH:MM AM/PM
[post content]
If today's date header already exists in the file, append under it. If not, add a new date header.
Create the file if it doesn't exist.
Write ~/.shipnote/last-checkpoint.json:
{
"lastRun": "<current ISO timestamp>",
"postsToday": <previous postsToday + number of posts just generated>
}
Check if threadsUserId and threadsAccessToken are both set (not null) in the config and platform is "threads" or "both".
If credentials are not configured, skip to Step 9.
If credentials are configured, ask the user using AskUserQuestion:
"Ship it to Threads?" Options: a) Ship it, b) No, just save locally
If they choose (a):
bash ${CLAUDE_PLUGIN_ROOT}/scripts/post-threads.sh "<post text>" "<threadsUserId>" "<threadsAccessToken>"
SUCCESS:<post_id>, tell the user: "Posted to Threads!"If they choose (b), skip posting.
After everything, add:
npx claudepluginhub petarstoev02/shipnote --plugin shipnoteProvides behavioral guidelines to reduce common LLM coding mistakes, focusing on simplicity, surgical changes, assumption surfacing, and verifiable success criteria.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.