원클릭으로
release
Tag a CalVer release on main, create a GitHub release, and generate a Discord announcement.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Tag a CalVer release on main, create a GitHub release, and generate a Discord announcement.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Compare two traced summarize runs from Langfuse and produce a qualitative evaluation of how subjects, descriptions, and speaker contributions changed.
Deploy a release to staging or production, or show current deployment status.
Read application logs from the production or staging server via SSH.
Create a new task in the opencouncil-tasks codebase. Use when implementing new features or task handlers.
Write documentation for tasks in the opencouncil-tasks codebase. Use after completing a new task implementation.
| name | release |
| description | Tag a CalVer release on main, create a GitHub release, and generate a Discord announcement. |
| argument-hint | [dry-run] | <ref>..<ref> |
Tag a CalVer release on main and generate release content. Single-branch workflow — no production branch, tags go directly on main.
$ARGUMENTS — optional, space-separated tokens:
dry-run — generate content without tagging or publishing<ref>..<ref> — generate content for an arbitrary git range. Implies dry-run. Examples:
abc123..def456 — between two commits2026.4.1..2026.4.2 — between two tags2026.4.2..HEAD — from a tag to current HEADTokens can appear in any order.
If $ARGUMENTS contains .., treat it as an explicit range. Validate both refs exist:
git rev-parse --verify <left-ref>
git rev-parse --verify <right-ref>
Set RANGE="<left-ref>..<right-ref>" and DRY_RUN=true.
If $ARGUMENTS contains dry-run, set DRY_RUN=true.
If $ARGUMENTS is empty, set DRY_RUN=false.
For non-explicit ranges, RANGE is determined after finding the last tag in Step 2.
Skip this step if an explicit range was given.
Determine the upstream remote:
git remote | grep -q upstream && REMOTE=upstream || REMOTE=origin
Verify clean state and sync:
git status --porcelain
git fetch $REMOTE
# Must be on main, in sync with remote
git rev-parse --abbrev-ref HEAD # should be main
git log --oneline $REMOTE/main..HEAD # should be empty
git log --oneline HEAD..$REMOTE/main # should be empty
If there are unpushed or unpulled commits, stop and tell the user.
Find the last release tag and set the range:
LAST_TAG=$(git tag --list '20[0-9][0-9].[0-9]*' --sort=-version:refname | head -1)
echo "Last release: ${LAST_TAG:-none}"
If no explicit range was given, set RANGE="${LAST_TAG}..HEAD". If there is no previous tag, use $(git rev-list --max-parents=0 HEAD)..HEAD to cover all commits.
Check there are changes to release:
git log --oneline $RANGE
If there are no commits in the range, stop — nothing to release.
Collect the raw material:
git log --format="%H %s" $RANGE
git diff --stat $RANGE
git diff --name-only $RANGE
git diff $RANGE
Important: Commit messages are a signal, not the source of truth. Always cross-reference messages against the actual diff to understand what really changed.
CalVer format: YYYY.MM.N where N is a sequential counter starting at 1, resetting each month.
YEAR=$(date +%Y)
MONTH=$(date +%-m)
PREFIX="${YEAR}.${MONTH}"
LAST_N=$(git tag --list "${PREFIX}.*" --sort=-version:refname | head -1 | awk -F. '{print $3}')
if [ -z "$LAST_N" ]; then
NEXT_VERSION="${PREFIX}.1"
else
NEXT_VERSION="${PREFIX}.$((LAST_N + 1))"
fi
echo "Next version: $NEXT_VERSION"
For each versioned task in src/server.ts, answer two questions — from evidence, not inference:
Why did each bump happen? Find the commit that changed the version: line and use its stated reason. Don't infer the reason from the range's headline change — it's often unrelated.
git log $RANGE -L <start>,<end>:src/server.ts # commit + message for a version: line
Should a bump have happened but didn't? Decide whether results differ for existing consumers — a type change alone isn't proof. Before calling anything breaking, verify runtime behavior: a field required in TypeScript but unvalidated at the route and defaulted when omitted is backward compatible, not breaking. New behavior gated behind an opt-in value existing callers won't send doesn't change existing results.
Flag missing bumps before generating notes. Note old→new for real bumps.
Analyze the changes — group by impact, not by commit type. Write for someone deciding whether to deploy this update.
Generate two outputs, each following its template. Read each template before generating:
Present both outputs to the user for review before proceeding.
Skip this step if DRY_RUN=true.
After the user approves:
Tag the release on main:
git tag -a $NEXT_VERSION -m "Release $NEXT_VERSION"
Push the tag:
git push $REMOTE $NEXT_VERSION
Create the GitHub release:
gh release create $NEXT_VERSION --target main --title "$NEXT_VERSION" --notes-file <release-notes-file>
Print the Discord announcement for the user to copy.
Always confirm with the user before pushing the tag and creating the GitHub release.