SDK Changelog
bouffalolab/bouffalo_sdk
A skill your agent uses when generating a customer-facing CHANGELOG between two SDK release tags.
A skill your agent uses when preparing a CODAP v3 release, creating release notes, updating version files, creating release PRs, tagging releases, or deploying to staging/production.
$ npx skills add concord-consortium/codap --skill codap-v3-build -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install concord-consortium/codap codap-v3-build --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/concord-consortium/codap.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/codap-v3-build .claude/skills/codap-v3-build && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "codap-v3-build" agent skill from https://github.com/concord-consortium/codap/tree/main/.claude/skills/codap-v3-build into .claude/skills/codap-v3-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "codap-v3-build", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/concord-consortium/codap/tree/main/.claude/skills/codap-v3-buildType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add concord-consortium/codap --skill codap-v3-build -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install concord-consortium/codap codap-v3-build --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/concord-consortium/codap.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/codap-v3-build .agents/skills/codap-v3-build && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "codap-v3-build" agent skill from https://github.com/concord-consortium/codap/tree/main/.claude/skills/codap-v3-build into .agents/skills/codap-v3-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "codap-v3-build", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add concord-consortium/codap --skill codap-v3-build -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install concord-consortium/codap codap-v3-build --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/concord-consortium/codap.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/codap-v3-build .cursor/skills/codap-v3-build && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "codap-v3-build" agent skill from https://github.com/concord-consortium/codap/tree/main/.claude/skills/codap-v3-build into .cursor/skills/codap-v3-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "codap-v3-build", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/concord-consortium/codap.git --path .claude/skills/codap-v3-build--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add concord-consortium/codap --skill codap-v3-build -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install concord-consortium/codap codap-v3-build --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/concord-consortium/codap.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/codap-v3-build .gemini/skills/codap-v3-build && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "codap-v3-build" agent skill from https://github.com/concord-consortium/codap/tree/main/.claude/skills/codap-v3-build into .gemini/skills/codap-v3-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "codap-v3-build", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install concord-consortium/codap codap-v3-buildInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add concord-consortium/codap --skill codap-v3-build -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/concord-consortium/codap.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/codap-v3-build .github/skills/codap-v3-build && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "codap-v3-build" agent skill from https://github.com/concord-consortium/codap/tree/main/.claude/skills/codap-v3-build into .github/skills/codap-v3-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "codap-v3-build", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add concord-consortium/codap --skill codap-v3-build -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install concord-consortium/codap codap-v3-build --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/concord-consortium/codap.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/codap-v3-build .opencode/skills/codap-v3-build && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "codap-v3-build" agent skill from https://github.com/concord-consortium/codap/tree/main/.claude/skills/codap-v3-build into .opencode/skills/codap-v3-build/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "codap-v3-build", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
codap-v3-buildA skill your agent uses when preparing a CODAP v3 release, creating release notes, updating version files, creating release PRs, tagging releases, or deploying to staging/production.
Codap V3 Build is an agent skill from concord-consortium/codap. Use when preparing a CODAP v3 release, creating release notes, updating version files, creating release PRs, tagging releases, or deploying to staging/production. Invoke with phase name or version number to resume.
Its SKILL.md is about 15k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Changelog and release notes. It works with Jira. The repository describes itself as: CODAP (Common Online Data Analysis Platform). The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 4bcb0ff. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitghnpmcurlnodepython3From the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
codap3.concord.orgconcord-consortium.atlassian.netapi.poeditor.comgithubstatus.comFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
API_TOKENPOEDITOR_API_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Codap V3 Build loads about 15k tokens when it runs. Until then it costs about 57 tokens; SKILL.md has 7,108 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from concord-consortium/codap at commit 4bcb0ff, republished under its MIT licence (© concord-consortium). 7,108 words, ~14,757 tokens.
.claude/skills/codap-v3-build/SKILL.md (or your agent's skills folder).Interactive workflow for CODAP v3 releases. Guides you through Jira setup, release notes generation, version updates, PR creation, tagging, and deployment.
| Phase | Command | Description |
|---|---|---|
| 1 | /codap-v3-build | Prepare release (Jira version, tag stories) |
| 2 | /codap-v3-build notes | Prepare release notes (interactive) |
| 3 | /codap-v3-build files | Update version files |
| 4 | /codap-v3-build pr | Create release PR |
| 5 | /codap-v3-build tag | Tag the release (triggers S3 build) |
| 6 | /codap-v3-build deploy [version] | Deploy to staging/production, publish GitHub release |
| fix | /codap-v3-build fix {old-version} | Revise release after staging QA failure |
When invoked, introduce the skill:
This skill will walk you through the process of building a release of CODAP v3. The process has 6 phases:
- Prepare the Release - Set up Jira version and gather context
- Prepare Release Notes - Interactive walkthrough to create CHANGELOG entry
- Update Version Files - Update package.json, versions.md, CHANGELOG.md
- Create Release PR - Build, capture asset sizes, create PR
- Tag - After PR merge, create git tag (triggers the S3 build)
- Deploy - Stage, QA, deploy to production, then publish the GitHub release
Are you ready to proceed?
Wait for user confirmation before starting Phase 1.
Every action below changes shared state that other people see or depend on. For each one:
An approval covers only the actions it names. Approving the staging deploy does not approve the Slack post that follows it, and "go ahead with everything" early in the session does not lift later gates.
| Action | Where | Read back with |
|---|---|---|
| POEditor push | Phase 3, step 2b | the script's output |
| POEditor translation fixes | Phase 3, step 2d | the API response, then the re-pulled file |
git push of a release branch, gh pr create | Phase 4; Fix, Step 4 | gh pr view --json url,labels |
| Tag push or deletion | Phase 5; Fix, Step 5 | git ls-remote --tags origin '{version}^{}' |
| Workflow dispatch (staging, production, beta) | Phase 6; Fix, Step 6 | Dispatch, watch, verify |
gh release create | Phase 6 | gh release view {version} --json url,isDraft,isPrerelease |
| Jira edits (Fix Versions, version rename) | Phase 2, step 9; Fix, Step 6 | re-fetch the changed fields |
| Slack posts outside the developer's self-DM | Phase 6; Fix, Step 6 | the posted message's ts (Slack's message ID) |
Not gated: reads, builds, local commits, and previews posted to the developer's own Slack self-DM (Slack Posts).
Goal: Create Jira release version and gather context.
Check workspace status:
git statusEnsure on main branch with latest:
git checkout main
git pullGet current build number:
cat v3/build_number.jsonNeeded for the version string only in the pre-release phase (see step 6), but always worth showing as context.
Get previous release tag:
git tag --sort=-creatordate | head -5Show context to user:
build_number.jsonDetermine recommended version string:
CODAP v3 has two versioning conventions, one per development phase. Identify the current phase from the newest release tag, then apply that phase's rule.
git tag --sort=-creatordate | head -3| Phase | You are here when… | Version format | Rule |
|---|---|---|---|
| Production release | The newest release tag is plain semver with no prerelease suffix (3.0.4, 3.1.2) | MAJOR.MINOR.PATCH | Increment from the last released version: patch for bug fixes, minor for new features, major for breaking changes. Example: after 3.0.4 → 3.0.5. |
| Pre-release development | The newest release tag carries a prerelease suffix (-beta, -rc, -pre) | {major}.{minor}.{patch}-{suffix}.{buildNumber} | Use build number + 1 (it auto-increments when the release PR merges), carrying over the previous tag's version prefix and suffix. Example: newest tag 3.0.0-beta.2662 with build 2662 → 3.0.0-beta.2663. |
The build number is part of the version string ONLY in the pre-release phase.
In the production phase the build number still exists and still increments, but it is
independent of the version — do not derive the version from build_number.json.
(At the 3.0.5 release the build number was 2956, heading to 2957 on merge, while the
version was 3.0.5. The two are unrelated and will never match again.)
CODAP v3 entered the production phase at 3.0.0 on 2026-06-04. The pre-release rule
is retained because the project may re-enter a pre-release phase for a future major
version (e.g. a 4.0.0-beta.N series), at which point it applies again.
Exception — starting a new prerelease series. Inferring the phase from the newest tag is reliable within a phase but blind to the moment you deliberately switch. When the next major begins its prerelease series, the newest tag is still production semver (e.g.
3.1.4), so the rule above would wrongly say "production, bump the patch" instead of4.0.0-beta.N. A tag can't signal an intent to change phase. So before applying the rule, ask the user whether this release starts a new prerelease series for a new major version. If yes, switch to the pre-release convention and confirm the intended prefix (4.0.0) and suffix (-beta) with them rather than inferring.
Which component to bump is a judgment call about the release's contents, not a mechanical rule — propose one and confirm it with the user along with the rest of the Jira release details (step 8). Count only what users can see: work behind a feature flag, logging, and docs don't make a release minor, and by convention neither does a new translation or language.
Get previous release date from Jira (for start date default)
Ask user for Jira release details:
| Field | Default | Options |
|---|---|---|
| Version name | The phase-appropriate next version from step 6 | Production phase: patch / minor / major bump. Pre-release phase: previous suffix + new build number |
| Start date | Previous release date | User can modify |
| Release date | Today's date | Today / Tomorrow / Custom future date |
| Description | Version {version} | User can modify |
Note: The release date chosen here is used throughout the process:
Ensure the Jira release version exists (status: Unreleased).
The Atlassian MCP tools cannot create a version or edit its release date — they expose no version-management tool. This step is the user's to perform, in the Jira UI (CODAP → Releases). Setting issue Fix Versions (Phase 2, step 9) works fine through MCP; it is only the version object itself that is out of reach.
Release {version} tracking issue) ahead of time. Ask the user to
check Jira → CODAP → Releases; that is the only reliable check. Querying the
fixVersions field via JQL is a weak fallback: it can only surface versions already
assigned to at least one issue, so a freshly created version with nothing assigned to
it — the very case this step is looking for — will not appear. Absence from JQL is
not evidence the version is missing.The date only has to be correct before the release is marked Released in Phase 6, so
this need not block the rest of the workflow.
Put the release tracking issue in the current sprint. Jira automation creates a
Release {version} issue (type Release) along with the version, and it lands in the
backlog. Once the user confirms the version exists, have a subagent find it and the active
sprint:
project = CODAP AND issuetype = Release AND fixVersion = "{version}" -- with customfield_10020
project = CODAP AND sprint in openSprints() -- customfield_10020, maxResults 50If the tracking issue's customfield_10020 already holds the active sprint, report that and
skip the edit (the user may have moved it already). Sprint IDs are not sequential, so read the
active sprint's id, name, and endDate from customfield_10020 rather than guessing; scan
all results, since an issue can carry several sprints. If more than one sprint is active, or
the active sprint ends before the release date, ask which sprint to use.
Setting the sprint is a gated Jira edit: show the issue key, its summary, and the sprint
name and ID, then set customfield_10020 to the sprint's ID (a plain integer, not an
object) with editJiraIssue, and re-fetch the field to confirm it. If no tracking issue
exists, say so; don't create one.
Goal: Generate CHANGELOG entry with user-selected titles.
Get PRs since last release:
git log <last-tag>..HEAD --oneline | grep -E '\(#[0-9]+\)|Merge pull request #[0-9]+'Note: This finds both regular merge commits AND squash-merged PRs (which include (#123) in the commit message). Using --merges alone misses squash merges.
Get PR details from GitHub:
gh pr view <number> --json number,title,headRefNameMatch PRs to Jira stories by CODAP-XXX ID:
CODAP-1027-inbounds-url-param)CODAP-1027: Implement inbounds parameter)For each matched item, fetch:
Interactive walkthrough for each item:
IMPORTANT - NO SHORTCUTS:
IMPORTANT - PUT THE TABLE IN THE QUESTION: Text written in the same turn as an
AskUserQuestion call is not shown to the user, so a table output just before the question
is invisible and the user has nothing to decide from. Put each item's table in the preview
of every option of the Section question (previews render as monospace markdown beside the
options), and put the candidate titles in the option descriptions of the Title question.
The preview for each item:
Item 1/8: CODAP-1027 (Story) — Jira: Done
| Source | Title |
|---------------|-------------|
| AI suggestion | {ai_title} |
| Jira | {jira_summary} |
| PR | {pr_title} |
PR #NNNN. {one or two lines of context: what the user would see, whether it is
flag-gated, anything that bears on the section choice}Note: Strip Jira IDs from PR titles before presenting (e.g., "CODAP-138: Fix point color" → "Fix point color")
Jira status notice (if not Done): append the status to the preview's first line with a
warning indicator, e.g. Item 1/8: CODAP-1027 (Story) — Jira: In Project Team Review ⚠️. The
user can choose to exclude the story via the Section question.
Ask using AskUserQuestion (Section and Title are TWO SEPARATE CALLS so Title is skipped if Exclude):
Section question:
If Section is NOT Exclude - ask Title question:
description
(no "Custom" - user types preferred title in built-in "Other")If Section IS Exclude - ask Fix Version question:
After selection, confirm:
✓ CODAP-1027 → Features: "Selected title here"
For PRs without Jira IDs:
Generate CHANGELOG markdown after all items are processed:
## Version {version} - Month Day, Year
### ✨ Features & Improvements:
- **CODAP-XXX:** Title here
- **CODAP-YYY:** Another title
### 🐞 Bug Fixes:
- **CODAP-AAA:** Fix description
- **CODAP-BBB:** Another fix
### 🛠️ Under the Hood:
- **CODAP-ZZZ:** Internal improvementRules:
Month Day, Year (e.g., February 1, 2026)Present generated markdown for approval:
Show the complete CHANGELOG entry as a markdown code block and end the turn with a plain question — do not use AskUserQuestion here. The entry is too long for an option preview, and text in the same turn as a question isn't shown, so the user would be asked to approve notes they can't see. Ask whether to approve, edit an item (section or title), or reorder. The user often reviews the whole entry for consistency at this point (e.g. capitalization, or similar items landing in different sections), so expect edits.
In the same message, list the issues step 9 will set the Fix Version on, so a single reply can approve both the notes and that gated Jira edit.
Note: Mention that Asset Sizes will be added in Phase 4 after the build.
Update Jira Fix Versions for all stories where user approved the update (during step 5).
This is a gated action: list the story IDs and the version first, and wait for approval.
IMPORTANT - Context Management: Jira MCP responses can be verbose and consume significant context. Delegate this bulk operation to a subagent:
Use the Task tool to update Fix Versions for all approved stories. Provide the subagent with:
- The list of CODAP-XXX story IDs to update
- The version string to set (e.g.,
3.0.5)The subagent should report back ONLY:
- Success/failure count (e.g., "Updated 8/10 stories successfully")
- IDs of any stories that failed (e.g., "Failed: CODAP-123, CODAP-456")
Check the fix version from the Jira side. Steps 1–9 match only from PR to story, so a story that carries the fix version but has no merged PR in the release range goes unnoticed. Have a subagent run this JQL and report key, summary, issue type, status, assignee, and Project Team Approver for each result:
project = CODAP AND fixVersion = "{version}" ORDER BY keyCompare the results with the stories matched in step 3 and show the user:
Release {version} issue (type Release) that Jira automation creates with the version is
expected here and needs no action.This check and the read-back of step 9 are the same query, so one subagent can do both.
JQL can query this reliably now that step 9 has assigned the version to issues; the caveat in Phase 1, step 9 applies only to a version with no issues yet.
Goal: Sync translations, update all version-related files, and create release branch.
IMPORTANT — Working Directory Awareness:
v3/scripts/ use cd v3 internally, which changes the shell's working directory for subsequent commands in the same Bash call.pwd before running git commands.git commands must be run from the repository root (/path/to/codap), not from v3/.git diff or git status command produces no output, do NOT assume "no changes" — verify by checking the working directory and trying again with correct paths. Empty output from git commands that should show changes is a red flag that something is wrong.IMPORTANT — Branch policy: Never commit directly to main. The release
branch must be created before any commits (translations, version files, etc.).
Create release branch:
git checkout -b release-{version}Branch naming rules:
release-{version} where {version} is from Phase 1 (e.g., release-3.0.5)/ in branch namesSync translations with POEditor:
V3 owns all string pushes to POEditor — both DG.* and V3.* keys.
All English strings live in a single file: src/utilities/translation/lang/en-US.json5.
API Token: All scripts resolve the token in order: -a argument >
~/.porc > $POEDITOR_API_TOKEN env var. Only ask the user for a token
if none of these are configured.
2a. Preview English string changes before pushing:
Before pushing, pull the current English strings from POEditor and diff them
against the local en-US.json5 so the user can validate the changes.
cd v3
# Pull current English strings from POEditor to a temp file
./scripts/strings-pull.sh -p 125447 -l en-US -o /tmp
# Convert local JSON5 to JSON for comparison
node -e "
const fs = require('fs');
const JSON5 = require('json5');
const data = JSON5.parse(fs.readFileSync('src/utilities/translation/lang/en-US.json5', 'utf8'));
fs.writeFileSync('/tmp/en-US-local.json', JSON.stringify(data, null, 4) + '\n');
"
# Detailed diff showing new keys, changed values, and keys only in POEditor
node -e "
const poeditor = require('/tmp/en-US.json');
const local = require('/tmp/en-US-local.json');
const changed = [], newKeys = [], missingLocally = [];
for (const k of Object.keys(local)) {
if (!(k in poeditor)) newKeys.push(k);
else if (poeditor[k] !== local[k]) changed.push({key: k, old: poeditor[k], new: local[k]});
}
for (const k of Object.keys(poeditor)) {
if (!(k in local)) missingLocally.push(k);
}
console.log('=== VALUE CHANGES (' + changed.length + ' keys) ===');
changed.forEach(c => {
console.log(' ' + c.key);
console.log(' POEditor: ' + JSON.stringify(c.old));
console.log(' Local: ' + JSON.stringify(c.new));
console.log();
});
console.log('=== NEW KEYS (' + newKeys.length + ' keys) ===');
newKeys.forEach(k => console.log(' ' + k + ': ' + JSON.stringify(local[k])));
console.log();
console.log('=== KEYS IN POEDITOR BUT NOT LOCAL (' + missingLocally.length + ' keys) ===');
missingLocally.forEach(k => console.log(' ' + k + ': ' + JSON.stringify(poeditor[k])));
"Show the diff to the user. Common expected changes:
Red flags to call out:
sync_terms=0, but worth noting)Decide whether to push — based solely on whether English strings changed:
2b. Push English strings to POEditor (only when 2a found English changes):
./scripts/strings-push-project.shThis pushes all strings from en-US.json5 (both DG and V3 keys) to POEditor.
The push is additive (sync_terms=0) — it adds new terms and updates existing
values but never deletes terms. Push first so that the subsequent pull includes
any new keys added since the last release.
2c. Pull non-English translations:
./scripts/strings-pull-project.shThis pulls translated strings for all supported languages. Report results to the user (the streaming output may be collapsed in the UI).
Always run the pull — never skip it and never ask whether to pull. Every build must pull from POEditor, because translators may have added or updated non-English strings since the last release even when the English strings are unchanged. (The push in 2b is conditional; this pull is not.)
2d. Verify and commit pulled translations:
Return to the repository root before running git commands:
cd /path/to/codap # repository root, NOT v3/
git status -- v3/src/utilities/translation/lang/Report results to the user. Every language normally gains the new English keys from 2b (untranslated keys arrive with the English text). Also review changes to existing translations — values translators edited in POEditor since the last release. These go straight into the release, and nothing else checks them. List them, filtering out the new keys:
git diff -U0 -- v3/src/utilities/translation/lang/ | grep -E '^(\+\+\+|[-+] )' \
| grep -vE '<new-key-pattern>' # e.g. 'pointShape|section\.graph|...' from 2a's NEW KEYSA changed line can also be just a trailing comma, where a new key was appended after what
used to be the last entry; ignore those. Show the user each changed value, old → new, and
flag anything that looks wrong: typos, broken placeholders (%@), lost punctuation. In the
3.1.1 release, two French typos arrived this way.
If a translation needs fixing, fix it in POEditor, not in the local file (the next pull
would overwrite a local fix), then re-run 2c. Fixing it is a gated action. Write the
corrections to a JSON file and call the POEditor API; ~/.porc defines API_TOKEN:
# fixes.json: [{"term":"<key>","context":"","translation":{"content":"<corrected text>"}}]
source ~/.porc
curl -s -X POST https://api.poeditor.com/v2/translations/update \
-d api_token="$API_TOKEN" -d id=125447 -d language=<lang> --data-urlencode data@fixes.json
# expect: "translations":{"parsed":N,"updated":N}After re-running 2c, grep the language file to confirm the corrected values arrived.
Then commit:
git add v3/src/utilities/translation/lang/
git commit -m "Update translations from POEditor"Zero-width space handling: POEditor treats truly empty strings as
"untranslated," so the scripts convert between empty strings and zero-width
spaces (\u200b) at the boundary:
strings-push.sh): "" → "\u200b" before uploadingstrings-pull.sh): "\u200b" → "" after downloadingThe source file (en-US.json5) and all runtime language files use "" for
intentionally blank strings — zero-width spaces should never appear in the
repository.
Update package.json version:
cd v3
npm version --no-git-tag-version {version}IMPORTANT: Use the npm version command - do NOT manually edit package.json. The npm command updates both package.json AND package-lock.json.
Update versions.md:
Add new row at top of versions table (using release date from Phase 1):
| [{version}](https://codap3.concord.org/version/{version}/) | Month Day, Year |Update CHANGELOG.md:
# Changelog heading)Stage version files:
git add v3/package.json v3/package-lock.json v3/versions.md v3/CHANGELOG.mdGoal: Build, capture asset sizes, commit, and create PR.
Run build:
cd v3 && npm run buildGet asset sizes:
ls -la v3/dist/assetsmain.*.css file, get its sizeindex.*.js files, use the largest oneindex.f6eac39a783c91ae9ea5.js → index.jsCalculate % change:
((new - old) / old) * 100X.XX%, <0.01% for very small increases, negative for decreases (e.g., -0.50%)Add Asset Sizes to CHANGELOG:
### Asset Sizes
| File | Size | % Change from Previous Release |
|-----------|---------------|--------------------------------|
| main.css | XXXXXX bytes | X.XX% |
| index.js | XXXXXXX bytes | X.XX% |Commit and push:
git add v3/CHANGELOG.md
git commit -m "Release {version}"
git push -u origin release-{version}Note: Only commit the version files (package.json, package-lock.json, versions.md, CHANGELOG.md). Do not commit the dist/ build output.
The push and the PR creation (step 6) are gated. Show the branch, the PR title, and the full PR body, and get one approval covering both.
Create PR with labels:
gh pr create \
--title "Release {version}" \
--body "{release_notes_from_phase_2}" \
--label "v3" \
--label "run regression"Inform user:
PR created: {url}
CI is running. The
run regressionlabel triggers the full Cypress test suite.After CI passes and PR is reviewed/merged, run
/codap-v3-build tagto continue.
If CI fails or stalls, check for a GitHub outage before suspecting the release. During the 3.1.1 release, a GitHub Actions incident made jobs wait for runners that never came: they ran no steps and were cancelled exactly 15 minutes after being queued, while jobs that did get runners passed slowly. That pattern means the infrastructure, not the code:
gh run view <id> --json jobs \
--jq '.jobs[] | "\(.name)\t\(.conclusion)\t\(.startedAt) -> \(.completedAt)\t\(.steps|length) steps"'
curl -s https://www.githubstatus.com/api/v2/incidents/unresolved.json \
| python3 -c "import json,sys; [print(i['name'], i['status'], i['created_at']) for i in json.load(sys.stdin)['incidents']]"If an Actions incident is open, poll the status API in the background (e.g. every 3 minutes)
until it clears, then re-run the affected runs (gh run rerun <id>, or --failed for only
the cancelled jobs) and watch them with gh run watch <id> --exit-status.
Goal: After PR merge, create the git tag that triggers the S3 build.
Do NOT create the GitHub release here. Publishing the GitHub release at tag time confused external users: they saw a published release for a version that was not yet available in production (staging QA can take 1+ days). The GitHub release is created later, in Phase 6, only after the build is live in production. The tag still must be pushed now, because the tag push is what triggers the CI build that deploys to S3 (needed for staging).
Prerequisite: Release PR must be merged, and the automatic "Increment the
build number" commit that follows the merge must have landed on main (see step 2).
Checkout main and pull:
git checkout main
git pullVerify the build-number increment commit has landed — do NOT skip this:
Merging the release PR triggers an automation that pushes an
"Increment the build number" commit to main. That increment commit is the one
to tag — not the Release {version} merge commit.
git log --oneline -2The output must show the increment commit sitting on top of the release merge:
f999f1445 Increment the build number <- tag THIS one (HEAD)
936451ef5 Release {version} (#NNNN)If HEAD is still the Release {version} merge commit, the automation has not
pushed yet. Wait, re-run git pull, and check again until the increment
commit appears.
Why this matters: tagging immediately after the merge, before the increment lands, points the tag at the release merge commit instead. This has happened before. The resulting build carries the wrong build number, and undoing it means deleting the tag and its S3 deploy. Every correct release tag (3.0.0 through 3.0.3) points at an "Increment the build number" commit — use that as your check.
Create the annotated tag, confirm its target, then push it. Create it locally and check that it is on the increment commit:
git tag -a {version} -m "Version {version}"
git log -1 --format='%h %s' {version}
# expected: <sha> Increment the build numberThe push is gated. Show the tag, its commit, and the command, then:
git push origin {version}
git ls-remote --tags origin '{version}^{}' # the commit it points at; must match
git rev-list -n1 {version}The tag push triggers a CI build that deploys to S3. The GitHub release is not created until after the production deploy (Phase 6).
Watch the tag's CI run until the S3 deploy finishes. The tag push starts the
"Continuous Integration (CODAP v3)" workflow (v3.yml), whose S3 Deploy job publishes
version/{version}/. Find the run for the tag's commit; it can take a few seconds to
appear, so retry if the list is empty:
gh run list --workflow v3.yml --branch {version} \
--json databaseId,headSha,status,createdAt
git rev-list -n1 {version} # the run's headSha must match this
gh run watch <id> --exit-statusThen confirm the version folder is served:
curl -s -o /dev/null -w '%{http_code}\n' https://codap3.concord.org/version/{version}/
# expected: 200Do not trigger the staging workflow until the run has succeeded and the folder returns
200. The staging workflow copies version/{version}/index-top.html, so it fails if the
S3 deploy hasn't finished. If the run fails, stop and show the user the failed job
(gh run view <id> --log-failed).
Inform user:
Tag pushed and deployed to S3: https://codap3.concord.org/version/{version}/ (The GitHub release will be created later, after the production deploy, so external users don't see a release for a version that isn't live yet.)
Ready to deploy to staging? (Or run
/codap-v3-build deploy {version}later.)
Goal: Stage, test, deploy to production and beta, publish the GitHub release, finalize Jira, and announce.
Deploy to staging (gated) — dispatch, watch, and verify
release-v3-staging.yml. Expect version/{version}/ on both /index-staging.html and
/staging.
Staging deployed and verified. Test at: https://codap3.concord.org/index-staging.html
Post the release announcement to #codap-v3 (gated), following
Slack Posts: preview in the self-DM, get approval, post, and record the
message's ts for step 7.
Announcement format (standard markdown, same items, titles, and order as CHANGELOG.md):
CODAP {version} is available for testing at https://codap3.concord.org/staging.
### ✨ Features & Improvements:
- **[CODAP-XXX](https://concord-consortium.atlassian.net/browse/CODAP-XXX):** Feature title here
- **[CODAP-YYY](https://concord-consortium.atlassian.net/browse/CODAP-YYY):** Another feature
### 🐞 Bug Fixes:
- **[CODAP-AAA](https://concord-consortium.atlassian.net/browse/CODAP-AAA):** Bug fix title
### 🛠️ Under the Hood:
- **[CODAP-ZZZ](https://concord-consortium.atlassian.net/browse/CODAP-ZZZ):** Internal change
The [beta](https://codap3.concord.org/beta) and [production](https://codap3.concord.org/) URLs will be updated once the staging build passes QA.Rules:
- , even when a section has only one item. Slack collapses
consecutive non-list lines into one paragraph. The self-DM preview shows whether this
went wrong.CODAP-XXX. A bare key makes the Jira bot post a
preview card for each item in the channel.**Title** form.Wait for external QA (may take 1+ days).
Let me know when staging QA is complete and we can proceed with the production deployment.
If QA finds a show-stopper, switch to Staging QA Failure.
Deploy to production (gated) — dispatch, watch, and verify release-v3-production.yml.
Expect version/{version}/ on /.
Deploy to beta (gated) — dispatch, watch, and verify release-v3-beta.yml. Expect
version/{version}/ on /beta.
Publish the GitHub release (gated). Do this only after step 4 has verified that production
serves {version}, so external users never see a published release for a version that isn't
live yet (staging QA can take 1+ days). Write the Phase 2 release notes to a file in the
scratchpad and pass it with --notes-file:
gh release create {version} --title "Version {version}" --notes-file <scratchpad>/notes.md
gh release view {version} --json url,isDraft,isPrerelease
gh release list --limit 1 # {version} should be marked LatestAnnounce that production is live (gated) as a reply in the announcement's thread
(thread_ts = the ts recorded in step 2), following Slack Posts:
CODAP {version} is now live on [production](https://codap3.concord.org/) and [beta](https://codap3.concord.org/beta). [GitHub release notes](<GitHub release URL from step 6>)Say "GitHub release notes", not "Release notes": there is a separate, user-facing release notes document, and the two shouldn't be confused.
If the session was resumed and the ts is no longer known, find the announcement with
mcp__slack__conversations_history on #codap-v3 (text starting CODAP {version} is available for testing) and confirm with the user that it's the right message.
Check unresolved issues on the fix version. Have a subagent run:
project = CODAP AND fixVersion = "{version}" AND statusCategory != Done ORDER BY keyand report key, summary, status, assignee, and Project Team Approver. Show the list grouped
by status. Stories in "In Project Team Review" are normal at this point; anything earlier
(In Progress, In Code Review, Ready for Merge) suggests the story isn't actually in the build.
The Release {version} tracking issue appears here too, with "Automation for Jira" as its
Project Team Approver; that is expected. Ask the user whether to nudge the owners (a Slack message to anyone else is gated), to move a
story's Fix Version (a gated Jira edit), or to release as is.
Mark the Jira version released. The Atlassian MCP tools have no version-management tool,
so the user does this in the Jira UI: CODAPv3 → Releases → {version} → Release, with the
release date agreed in Phase 1. Wait for the user to confirm.
Go through the Done when checklist before calling the release finished.
Check every item and report each one's status. The release is not finished until all of them are true:
/ and /beta serve version/{version}/ (re-run the curl checks){version} is published, not a draft or pre-release, and marked Latest{version} is marked Released#codap-v3 and the production-live reply is in its threadIf you prefer to complete deployment outside of Claude Code, run these in order. The GitHub release must not be published until the production deploy has succeeded.
gh workflow run release-v3-production.yml -f version={version}
gh workflow run release-v3-beta.yml -f version={version}
gh release create {version} --title "Version {version}" --notes "{release_notes_from_phase_2}"The workflows can also be run from the GitHub UI:
production,
beta.
Then mark the Jira version released (CODAPv3 → Releases → {version} → Release).
To complete deployment in Claude Code after QA:
/codap-v3-build deploy {version}On resume, establish where things stand before acting: which pages serve {version} (the curl
checks), whether gh release view {version} finds a release, and whether the #codap-v3
announcement exists. Then continue from the first step that isn't done.
Trigger: A show-stopper bug is found during Phase 6 staging QA, and a fix has been merged to main.
Invocation: /codap-v3-build fix {old-version} (e.g., /codap-v3-build fix 3.0.5)
When invoked, introduce the situation:
A bug was found during staging QA for {old-version} and a fix has been merged. This workflow will create a revised release. In the pre-release phase that means a new version number; in the production phase the version stays the same and only the build number and tag move (see Step 1.3).
I'll walk you through:
- Determine the new version number and release date
- Decide whether release notes need updating
- Update version files
- Build and create a new release PR
- Clean up the old tag/release and create new ones
- Update Jira and re-deploy to staging
Ensure on main with latest:
git checkout main
git pullGet current build number and verify the fix is present:
cat v3/build_number.json
git log --oneline {old-version}..HEADConfirm with the user that the expected fix commit(s) appear in the log.
Determine the new version number — this is phase-dependent (see Phase 1, step 6, for how to identify the phase):
| Phase | Revised release version |
|---|---|
| Production release | The version does not change. {old-version} is reused as-is. Only the build number changes (it increments when the revised release PR merges), and the build number is not part of the version. The respin is reflected in the CHANGELOG, not the version string. |
| Pre-release development | The version does change, because the build number is part of it. Current build number is N; the release PR increments it once more on merge → new version is N + 1, matching {old-version}'s prefix. Example: build 2804 → 3.0.0-beta.2805. |
The production-phase rule reshapes this whole workflow. With the version unchanged there is no "old vs new version" to reconcile:
versions.mdneeds no edit, the Jira release needs no rename, andnpm versionis a no-op. What still must happen is re-tagging — delete the{version}tag and recreate it on the new increment commit (Step 5) — plus any CHANGELOG corrections and a fresh staging deploy. Read the steps below with that in mind and skip the version-migration parts; they apply only in the pre-release phase.The steps below are written in
{old-version}→{new-version}terms, which collapses in the production phase — the two are the same string. Read every{new-version}as{version}.This creates a branch-name collision in the commands below. They create and push
release-{new-version}, which in the production phase isrelease-{version}— the branch the original release already used, still present locally and on the remote. Choose a distinct respin branch name (e.g.release-{version}-fix) and substitute it forrelease-{new-version}everywhere it appears below. This note calls that name{respin-branch}; in the pre-release phase{respin-branch}is justrelease-{new-version}(no collision, since the version is new). Do not reuse or force-push the original release branch.This production-phase path has not yet been exercised as of 3.0.5. Confirm the approach with the user before running it rather than assuming these notes are complete.
Confirm release date:
versions.md in the
pre-release phase, where the row's version string changes. In the production phase
the versions.md row already carries the right version, so it needs an edit only if
the date itself changed.Confirm with user — use the wording for the current phase:
Production phase (version unchanged — do not present this as a version change):
The fix is on main. The version stays {version}; the respin changes only the build number ({old-build} → {new-build}) and moves the
{version}tag to the new increment commit. Release date: {release-date}Does this look correct?
Pre-release phase (version changes):
The fix is on main. New version will be {new-version} (old was {old-version}). Release date: {release-date}
Does this look correct?
Ask the user:
Do the release notes need to be updated?
- No changes needed — The bug was introduced in this release cycle, so users never saw it
- Add the fix — The bug existed in a prior release and the fix should be documented
If no changes needed:
If release notes need updating:
Follow the same working directory rules as Phase 3.
Create release branch ({respin-branch} — see the collision note in Step 1.3; in
the pre-release phase this is release-{new-version}):
git checkout -b {respin-branch}Sync translations:
Update package.json:
cd v3
npm version --no-git-tag-version {new-version}Update versions.md:
{old-version} row with the {new-version} row (using the confirmed release date)Update CHANGELOG.md:
## Version {old-version} header with ## Version {new-version}, using the confirmed release dateCommit version file changes:
cd /path/to/codap
git add v3/package.json v3/package-lock.json v3/versions.md v3/CHANGELOG.md
git commit -m "Release {new-version}"Follow the same process as Phase 4:
Build:
cd v3 && npm run buildUpdate asset sizes in CHANGELOG.md (same process as Phase 4, steps 2–4).
{old-version} is being replaced, not used as baseline).Commit, push, and create PR:
cd /path/to/codap
git add v3/CHANGELOG.md
git commit --amend --no-edit
git push -u origin {respin-branch}
gh pr create \
--title "Release {new-version}" \
--body "{release_notes}" \
--label "v3" \
--label "run regression"({respin-branch} is the distinct respin branch from Step 1.3; in the pre-release
phase it is release-{new-version}. The PR title still uses {new-version}, which
equals {version} in the production phase.)
Inform user:
PR created: {url}
After CI passes and PR is merged, I'll clean up the old release and create the new one.
Prerequisite: Release PR must be merged, and the automatic "Increment the
build number" commit that follows the merge must have landed on main.
Checkout main, pull, and wait for the increment commit:
git checkout main
git pull
git log --oneline -2As in Phase 5, the new tag must point at the "Increment the build number"
commit that the merge automation pushes after the release merge — not at the
Release {new-version} merge commit itself. If HEAD is still the release merge,
wait, git pull again, and re-check until the increment commit appears.
Delete the old tag (gated; get one approval covering this deletion and the push in step 3, and show both tags and the commit the new one will point at):
git push origin --delete {old-version}
git tag -d {old-version}The tag is safe to delete because it points to a known-buggy build that was never deployed to production or beta and that no external consumer depends on.
No GitHub release to delete: under the current flow the GitHub release is
only created after a production deploy (Phase 6). Since {old-version} failed
staging QA, it never reached production and never had a release published. (If
one somehow exists, remove it with gh release delete {old-version} --yes.)
Create the new tag:
git tag -a {new-version} -m "Version {new-version}"
git log -1 --format='%h %s' {new-version}
# expected: <sha> Increment the build number
git push origin {new-version}
git ls-remote --tags origin '{new-version}^{}' # must match git rev-list -n1 {new-version}As in Phase 5, do not create the GitHub release here. The tag push triggers
the S3 build; the GitHub release for {new-version} is published only after the
revised build reaches production (Step 6 / the deploy phase).
Delete the merged release branch(es) (optional cleanup):
Pre-release phase — the buggy release's branch:
git push origin --delete release-{old-version}
git branch -d release-{old-version}Production phase — release-{old-version} is release-{version}, the original
release's branch (already merged for the first attempt), and {respin-branch} is the
branch this workflow just merged. Both are now merged and can be removed; the respin
branch is the one that would otherwise dangle:
git push origin --delete {respin-branch} && git branch -d {respin-branch}
# optionally also remove the original release branch if it still exists:
git push origin --delete release-{version} 2>/dev/null; git branch -d release-{version} 2>/dev/null || trueWatch the tag's CI run until the S3 deploy finishes, exactly as in Phase 5, step 4,
with {new-version}. Do not trigger the staging workflow until the run has succeeded and
https://codap3.concord.org/version/{new-version}/ returns 200.
Update Jira:
{old-version} to
{new-version}. The Atlassian MCP tools can't edit versions, so ask the user to do it in
the Jira UI (CODAPv3 → Releases).Re-deploy to staging (gated) — dispatch, watch, and verify
release-v3-staging.yml with {new-version}.
Post the updated announcement (gated) as a new top-level message in #codap-v3, following
Slack Posts. Use the same format and rules as Phase 6, step 2 (linked Jira
keys, - on every item), with a line noting the revised build. Record the new message's
ts; the production-live reply (Phase 6, step 7) goes in this message's thread.
CODAP {new-version} is available for testing at https://codap3.concord.org/staging.
(Revised build — replaces {old-version} which had a staging QA issue.)
### ✨ Features & Improvements:
- **[CODAP-XXX](https://concord-consortium.atlassian.net/browse/CODAP-XXX):** Feature title here
### 🐞 Bug Fixes:
- **[CODAP-AAA](https://concord-consortium.atlassian.net/browse/CODAP-AAA):** Bug fix title
The [beta](https://codap3.concord.org/beta) and [production](https://codap3.concord.org/) URLs will be updated once the staging build passes QA.In the production phase {new-version} and {old-version} are the same string, so say
"revised build of {version}" instead.
Inform user:
Revised release {new-version} deployed to staging.
Test at: https://codap3.concord.org/index-staging.html
When staging QA passes, run
/codap-v3-build deploy {new-version}to continue with production deployment.
Use this for every staging, production, and beta deploy. The dispatch itself is gated.
gh workflow run returns before the new run exists, so gh run list --limit 1 can return the
previous run and report a false success. Pick the run created after the dispatch instead:
date -u +%Y-%m-%dT%H:%M:%SZ # note this as <dispatched>
gh workflow run <workflow>.yml -f version={version}
gh run list --workflow <workflow>.yml --event workflow_dispatch \
--json databaseId,createdAt \
--jq '.[] | select(.createdAt >= "<dispatched>") | .databaseId'If no id appears yet, re-run the gh run list with the same <dispatched> value. If more than
one appears, stop and ask. Then:
gh run watch <id> --exit-statusA non-zero exit means the deploy failed: stop and show the user gh run view <id> --log-failed.
Verify what is served. A successful run is not proof the page changed. Check the page references the new version folder:
for p in index-staging.html staging "" beta; do
printf '%-20s ' "/$p"
curl -s "https://codap3.concord.org/$p" | grep -oE 'version/[^/"]+/' | sort -u | tr '\n' ' '
echo
doneEach workflow updates only its own pages (staging: /index-staging.html and /staging;
production: /; beta: /beta), so only those are expected to change. The pages are served with
cache-control: no-cache, so the new version shows as soon as the run finishes.
Every message to #codap-v3 (or anyone other than the developer) goes through these steps:
mcp__slack__channels_me with channel_types: "im";
the self-DM is the row named after the developer's own handle ("DM with <developer's name>").mcp__slack__conversations_add_message
(content_type: text/markdown). This isn't gated. The preview renders exactly as the channel
will, which shows collapsed bullets, broken links, or stray formatting before anyone else
sees them.channel_id: #codap-v3, plus thread_ts for a thread
reply). The result names the channel's ID (C…) and the message's ts; record and report
both. A release spans days and often sessions, so also save them where a later session will
find them (e.g. Claude's memory for this project), for the production-live thread reply.If the Slack MCP server isn't available, show the user the draft and ask them to paste it into Slack themselves.
| File | Purpose |
|---|---|
v3/build_number.json | Current build number. Part of the version string only in the pre-release phase (Phase 1, step 6). In the production phase it is independent of the version, but its auto-increment commit is always the tag target (Phase 5). |
v3/package.json | Version field |
v3/versions.md | Version history table |
v3/CHANGELOG.md | Release notes |
v3/dist/assets/ | Built assets (after npm run build) |
v3/src/utilities/translation/lang/en-US.json5 | All English strings (DG + V3, JSON5, source of truth) |
Use these constants for all Atlassian MCP tool calls:
| Constant | Value |
|---|---|
cloudId | concord-consortium.atlassian.net |
projectKey | CODAP |
Note: The Atlassian MCP tools accept either a UUID cloud ID or a site URL for the
cloudIdparameter. The site URL format is used here for readability.
Fix versions fieldReleased after production deploy© concord-consortium, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/codap-v3-build of concord-consortium/codap.
Open the folder on GitHubat commit 4bcb0ff
Codap V3 Build next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Codap V3 Build this skillconcord-consortium/codap | 106 | — | ~15k | Automated safety check: Pass | MIT | |
| SDK Changelogbouffalolab/bouffalo_sdk | 501 | — | ~1.1k | Automated safety check: Pass | Apache-2.0 | |
| Create Epic RecapDataDog/datadog-agent | 3.8k | — | ~5k | Automated safety check: Notes | Apache-2.0 | |
| Review Release Noteschef/chef-web-docs | 143 | — | ~5.2k | Automated safety check: Pass | Custom licence | |
| Changelog To JiraDevolutions/devolutions-gateway | 162 | — | ~2.7k | Automated safety check: Pass | Apache-2.0 | |
| Prepare ReleaseDevolutions/devolutions-gateway | 162 | — | ~1.8k | Automated safety check: Pass | Apache-2.0 |
bouffalolab/bouffalo_sdk
A skill your agent uses when generating a customer-facing CHANGELOG between two SDK release tags.
DataDog/datadog-agent
A skill your agent uses when an engineer or manager asks to recap, summarize, or post an update on a Jira Epic — a progress update for an in-progress Epic (how far along it is, what's shipped so…
chef/chef-web-docs
Read a release notes file and edit it using Jira release data and GitHub pull requests as co-equal, optional sources.
Devolutions/devolutions-gateway
Creates missing DGW Jira tickets from CHANGELOG.md entries and updates the file with the new ticket links.
Devolutions/devolutions-gateway
Prepares a Devolutions Gateway / Devolutions Agent release commit: bumps the version, generates and inserts the changelog, creates Jira tickets, generates the ToolBox changelog, and produces the…
huytieu/COG-second-brain
Generate categorized release notes from any source (GitHub, Linear, Jira, or manual input) with optional publishing
concord-consortium/codap
A skill your agent uses when deploying, updating, or syncing assets to the codap-resources S3 bucket - plugins, example documents, boundary files, banners, or notification configs
concord-consortium/codap
A skill your agent uses when regenerating, updating, or auditing the CODAP v3 log-events dictionary CSV (the list of every log event the v3 app can emit, with placeholders/parameters/descriptions).
Works with
Categories
A skill your agent uses when preparing a CODAP v3 release, creating release notes, updating version files, creating release PRs, tagging releases, or deploying to staging/production. Codap V3 Build is an agent skill from concord-consortium/codap. Use when preparing a CODAP v3 release, creating release notes, updating version files, creating release PRs, tagging releases, or deploying to staging/production.
Codap V3 Build fits situations like: preparing a CODAP v3 release; creating release notes; updating version files; creating release PRs.
Run `npx skills add concord-consortium/codap --skill codap-v3-build -a claude-code`. Or copy the skill folder (.claude/skills/codap-v3-build in concord-consortium/codap) into .claude/skills/codap-v3-build in your project. Claude Code loads it when a task matches its description.
Run `npx skills add concord-consortium/codap --skill codap-v3-build -a codex`. Or copy the skill folder (.claude/skills/codap-v3-build in concord-consortium/codap) into .agents/skills/codap-v3-build in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add concord-consortium/codap --skill codap-v3-build -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/codap-v3-build, .gemini/skills/codap-v3-build, .github/skills/codap-v3-build and .opencode/skills/codap-v3-build in your project.
Going by SKILL.md and its folder, Codap V3 Build needs the command-line tools its instructions call (git, gh, npm, curl, node and python3) and credentials named API_TOKEN and POEDITOR_API_TOKEN.
SKILL.md names 4 domains. In commands or code: codap3.concord.org, concord-consortium.atlassian.net, api.poeditor.com and githubstatus.com; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Codap V3 Build is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 15k tokens (SKILL.md is roughly 59k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Codap V3 Build: SDK Changelog (bouffalolab/bouffalo_sdk, 501 stars), Create Epic Recap (DataDog/datadog-agent, 3.8k stars), Review Release Notes (chef/chef-web-docs, 143 stars) and Changelog To Jira (Devolutions/devolutions-gateway, 162 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
concord-consortium (a GitHub organization) maintains it in concord-consortium/codap, which has 106 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 7, 2026.
Source: concord-consortium/codap on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.