Agent skill

Changelog

by duracelltomi in duracelltomi/gtm4wp

How to write GTM4WP CHANGELOG.md / readme.txt entries. An agent skill from duracelltomi/gtm4wp.

GPL-2.0-or-laterAuto-check passedDevelopment

Install Changelog

skills CLI
$ npx skills add duracelltomi/gtm4wp --skill changelog -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install duracelltomi/gtm4wp changelog --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/duracelltomi/gtm4wp.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/changelog .claude/skills/changelog && rm -rf skills-src

Use ~/.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/

Facts

Skill name
changelog
GitHub stars
174
Token cost
~2.5k tokens
SKILL.md length
1,324 words
Files
1
Skills in repo
6
Repo updated
First seen
Licence
GPL-2.0-or-later

At a glance

How to write GTM4WP CHANGELOG.md / readme.txt entries. An agent skill from duracelltomi/gtm4wp.

  • Works in 4 steps: What changed, in the user's vocabulary… → What they must do, when anything: a GTM… → Why, in at most one clause — and only… → …
  • Tasks that involve Changelog and release notes
  • SKILL.md covers What requires an entry, Release dates, anchors and the…, The baseline is always the… and Write for the upgrading user,…, plus 2 more sections
  • Calls git and bash; reaches gtm4wp.com

What it does

Changelog is an agent skill from duracelltomi/gtm4wp. How to write GTM4WP CHANGELOG.md / readme.txt entries. Follow when adding, editing, or grouping a changelog bullet for a production-code change, or when the require-changelog Stop/commit-msg hook blocks you. Covers the "last released stable version is the baseline" rule (drop back-ported fixes and dev-only regressions), the "write for the upgrading user" rule (edit an unreleased feature's existing bullet vs. add a new Fixed: bullet), the 2.0 theme grouping, the readme.txt mirror, and the [skip changelog] escape…

Its SKILL.md is about 2.5k 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 WordPress, PHP and WooCommerce. The repository describes itself as: Google Tag Manager plugin for WordPress. The licence is GPL-2.0-or-later.

When your agent uses it

  • Tasks that involve Changelog and release notes

Example prompts

  • “last released stable version is the baseline”
  • “write for the upgrading user”
  • “/changelog”

Workflow steps

4 steps, taken from the first numbered list in SKILL.md.

  1. What changed, in the user's vocabulary (setting names as they appear on
  2. What they must do, when anything: a GTM trigger to adjust, a default that
  3. Why, in at most one clause — and only when it changes what they should do.
  4. The issue number and the credit: (#145), Thanks to @user for the report.

What it can do on your machine

Read from SKILL.md and the folder at commit faa97d2. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • bash

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • gtm4wp.com

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Changelog loads about 2.5k tokens when it runs. Until then it costs about 133 tokens; SKILL.md has 1,324 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~133
When it runs · the whole SKILL.md, loaded when a task matches
~2.5k

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.

Safety

Auto-check passed

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.

SKILL.md

The full file from duracelltomi/gtm4wp at commit faa97d2, republished under its GPL-2.0-or-later licence (© duracelltomi). 1,324 words, ~2,513 tokens.

Download SKILL.mdSave it as .claude/skills/changelog/SKILL.md (or your agent's skills folder).
name
changelog
description
How to write GTM4WP CHANGELOG.md / readme.txt entries. Follow when adding, editing, or grouping a changelog bullet for a production-code change, or when the require-changelog Stop/commit-msg hook blocks you. Covers the "last released stable version is the baseline" rule (drop back-ported fixes and dev-only regressions), the "write for the upgrading user" rule (edit an unreleased feature's existing bullet vs. add a new Fixed: bullet), the 2.0 theme grouping, the readme.txt mirror, and the [skip changelog] escape hatch.
license
GPL-2.0-or-later

GTM4WP Changelog Policy

What requires an entry

Every change to production code ships a matching bullet under the top unreleased heading in CHANGELOG.md (* Added: / * Changed: / * Updated: / * Fixed:). The heading is ## <development target> per .claude/RELEASE-STATE.md; when the top heading is a released version (right after a release, before any new production change), the change that needs a bullet opens the new heading above it in the same edit.

"Production code" = src/**.php, compat/**.php, js/frontend/**.js, js/admin/**.js, the main plugin file and uninstall.php. Tests, docs and .security//.testing/ housekeeping are exempt.

Release dates, anchors and the website

  • A released heading carries the date its wordpress.org SVN tag was created: ## 2.0.5 (2026-10-01). The release skill adds it after the SVN push; never type it from memory and never use the GitHub date (wordpress.org has followed days later). The unreleased headings at the top carry no date.
  • CHANGELOG.md is the source of the gtm4wp.com changelog pages (tools/build-changelog-page.js); never edit those pages on the site. The generator stops on a released heading without a date, a malformed heading, or markdown it does not support: ###/####, * bullets with one tab-indented level, paragraphs, and inline bold, italic, code and links.
  • Never rename a released heading: its anchor (#v2-0-5) is linked from posts, social posts and forum replies.
  • When a release has a post, the section's last line is Release post: [Title](https://gtm4wp.com/…). It renders as "Read more" and is not a bullet, so it is outside the word budget.

The baseline is always the last released stable version

Every bullet in the unreleased block describes a delta against the last released stable version — named in .claude/RELEASE-STATE.md, verifiable as Stable tag: in readme.txt on the released stable branch. Not against the previous major, and not against last week's working tree. Two consequences:

  • A fix back-ported to that stable release gets no bullet in the unreleased block. It is not a delta any more; the reader sees it in the released version's own block directly below.
  • Do not soften the baseline because some sites are still on an older version. Admins upgrading from further back read the intervening blocks, which sit right below the unreleased one, so they stay informed either way.

Before writing "previously…", "the last version did…", or "no longer…", confirm the claim against the released code (git grep <symbol> 2.0 <!-- release-coupled: the released stable branch -->). A bullet whose "previously" only ever existed on the development branch describes nothing the reader lived through.

Write for the upgrading user, not for the development history

While a version is unreleased, a fix to a feature introduced in that same version must edit that feature's existing bullet, not add a new * Fixed: bullet. A user upgrading from the last release never ran the intermediate code, so for them the feature plus its development fixes is a single * Added:. Add a * Fixed: bullet only for a defect that shipped in a released version.

Corollaries:

  • A change that only repairs a regression introduced earlier in the same unreleased version gets no bullet at all — its net effect versus the last release is zero. Touch CHANGELOG.md (e.g. refine the feature's wording) to satisfy the hook.
  • An internal refactor with "no functional change" is not a changelog entry. Use [skip changelog] in the commit message instead.
  • Editing an existing bullet satisfies both hooks — they check that CHANGELOG.md changed, not that a bullet was added.
  • A large release section is grouped under ### theme headings (the ## 2.0 section used: Architecture, Settings screen, Container, Page variables, WooCommerce, Media events, Consent, Contact Form 7, AMP, Removed). Where the unreleased section has theme groups, put a new bullet in its group rather than at the top of the section.
  • readme.txt's matching = <version> = block mirrors the unreleased section (flattened for WordPress.org: no nested lists, **bold** lead-ins instead of ###). A user-visible change updates both files together, opening the readme block alongside the changelog heading when it does not exist yet.

How long a bullet is

Budget: 25–40 words, ceiling 60. A bullet is release notes for somebody upgrading, not the investigation that produced the change. Measured 2026-09-23, the unreleased 2.1 section ran to 280 words per bullet against 117 for 2.0 and 57 for 1.22.5, and readme.txt's changelog section stood at 6,928 words against the 5,000-word cap wordpress.org truncates at (U150 / drift row D21) — so length here is a published defect, not a matter of taste.

What a bullet carries, in this order:

  1. What changed, in the user's vocabulary (setting names as they appear on the screen, event and field names as they appear in the data layer).
  2. What they must do, when anything: a GTM trigger to adjust, a default that changed, an option to switch on. This is the part nobody may cut.
  3. Why, in at most one clause — and only when it changes what they should do.
  4. The issue number and the credit: (#145), Thanks to @user for the report.

Leave out: how the bug was found, what the code did internally, which class or hook was involved, how long it had been broken, what was measured or ruled out, and reassurance that unaffected setups are unaffected. An option's full explanation belongs in its field description and on gtm4wp.com, not here — link it instead of restating it.

readme.txt is the tighter of the two: it mirrors the entry, flattened, and the whole == Changelog == section stays under 5,000 words (target ~4,000), so older sections get summarised and linked to the gtm4wp.com changelog (https://gtm4wp.com/changelog, 1.x: /changelog/1-x) rather than left in full.

The prose-budget Stop hook reports any bullet over 60 words that the working tree added; bash .claude/hooks/prose-budget.sh check runs the same check by hand.

Show full SKILL.md (395 more words)Show less

Enforcement

One shared script, .claude/hooks/require-changelog.sh, enforces this:

  • a Claude Code Stop hook (in .claude/settings.json) blocks wrapping up a turn that left production code modified without a CHANGELOG.md change;
  • a git commit-msg hook (.githooks/commit-msg) rejects a commit that stages production code without staging CHANGELOG.md. Escape hatch for non-user-facing commits: put [skip changelog] in the commit message (or git commit --no-verify).

One-time setup after cloning (the git hook lives in a tracked dir, so it must be activated once per clone): git config core.hooksPath .githooks.

If you ever check out somebody else's branch

That simple setup executes .githooks/commit-msg, which execs .claude/hooks/require-changelog.sh — both resolved from the checked-out tree. So a branch you are only reviewing supplies the shell code that runs as you on your next commit, and on every Claude turn through the Stop hook, with no command typed (.security finding #77, rated D0 → D1).

That matters only if untrusted branches get checked out in a clone. Where they do, run the check from a fixed ref instead, with the entry point outside the tree:

bash
mkdir -p ~/.githooks/gtm4wp
# ~/.githooks/gtm4wp/gtm4wp-changelog-check  - materialises the script from a fixed ref:
#   git show-ref --verify -q refs/tags/master && exit 1                     # a tag would shadow it
#   C=$(git rev-parse --verify -q 'refs/heads/master^{commit}') || exit 1
#   git show "$C:.claude/hooks/require-changelog.sh" > "$TMP" || exit 1      # fail CLOSED
#   exec bash "$TMP" "$@"
# ~/.githooks/gtm4wp/commit-msg  - exec .../gtm4wp-changelog-check commitmsg "$1"
git config core.hooksPath ~/.githooks/gtm4wp

and point the Stop hook in .claude/settings.json at the same runner. The logic stays here, versioned and reviewed; only the copy that executes is pinned.

Four things worth knowing before adopting it:

  • Fail closed, deliberately. The tempting one-liner bash <(git show "$REF:$SRC") fails open — an unresolvable path yields an empty script, bash runs nothing, exits 0, and the commit sails through unchecked. Verified by measurement, not assumed.
  • Pin the branch, never the bare name (#365). git show master:<path> resolves a tag named master before the branch, and fetching from a fork can import one. Resolve refs/heads/master to a commit id first. Passing refs/heads/master:<path> as one argument does not work under Git Bash, which rewrites it as a path list.
  • An edit to require-changelog.sh takes effect once it is committed to the ref, not while it sits uncommitted in your tree.
  • It is local git config, so it protects one clone and propagates to none. It is deliberately not wired into a package.json prepare script: that script comes from the worktree too, so a branch would supply the installer meant to defend against branch-supplied code. An earlier attempt to make this the tracked default was declined because it blocked every commit until an installer had been run — this version changes no tracked file, so nothing breaks for anyone who keeps the simple setup.

© duracelltomi, GPL-2.0-or-later. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/changelog of duracelltomi/gtm4wp.

Open the folder on GitHubat commit faa97d2

Compare with similar skills

Changelog 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.

Changelog compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Changelog this skillduracelltomi/gtm4wp174—~2.5kAutomated safety check: PassGPL-2.0-or-later
WooCommerce Code Reviewwoocommerce/woocommerce11k3 repos~1.1kAutomated safety check: PassCustom licence
WooCommerce Dev Cyclewoocommerce/woocommerce11k3 repos~431Automated safety check: PassCustom licence
WooCommerce Backend Conventionswoocommerce/woocommerce11k1 repos~614Automated safety check: PassCustom licence
Add Changeloggambitph/Stackable351—~1.5kAutomated safety check: PassGPL-3.0
WordPress ProJeffallan/claude-skills12k—~1.6kAutomated safety check: PassMIT

Similar skills

  • WooCommerce Code Review

    woocommerce/woocommerce

    Reviews WooCommerce code changes against the project's standards, flagging backend PHP architecture, naming, documentation, data integrity and testing violations.

    11k GitHub starsUsed in 3 repos~1.1k tokens
    DevelopmentAuto-check passed
  • WooCommerce Dev Cycle

    woocommerce/woocommerce

    Workflow for WooCommerce development: run PHP and JavaScript tests, lint and fix code style on the current branch, and follow guides for i18n and markdown.

    11k GitHub starsUsed in 3 repos~431 tokens
    DevelopmentAuto-check passed
  • WooCommerce Backend Conventions

    woocommerce/woocommerce

    Guides agents writing or changing WooCommerce backend PHP so new classes, hooks and unit tests follow the project's conventions.

    11k GitHub starsUsed in 1 repo~614 tokens
    DevelopmentAuto-check passed
  • Add Changelog

    gambitph/Stackable

    Adds or updates a WordPress plugin changelog entry in readme.txt from the project's Release Roadmap for a confirmed plugin version.

    351 GitHub stars~1.5k tokensUpdated 4 days ago
    DevelopmentAuto-check passed
  • WordPress Pro

    Jeffallan/claude-skills

    Develops WordPress themes, plugins, Gutenberg blocks and WooCommerce features with nonce, escaping and capability checks, phpcs linting and caching tuned for speed.

    12k GitHub stars~1.6k tokensUpdated 7 days ago
    DevelopmentAuto-check passed
  • Sets up a local environment for the WooCommerce block email editor, with a watcher, Mailpit email capture and build and test commands for its PHP and JS packages.

    11k GitHub stars~893 tokensUpdated today
    Backend & APIsAuto-check passed

More from duracelltomi/gtm4wp

  • Wporg Forum Triage

    duracelltomi/gtm4wp

    Triage GTM4WP support topics and reviews on the wordpress.org forum — read a topic (or a batch), work out whether it is already fixed in a released version, classify it, screen for security…

    174 GitHub stars~6.1k tokensUpdated yesterday
    Auto-check: warnings
  • GitHub Issue Triage

    duracelltomi/gtm4wp

    Triage and manage GTM4WP GitHub issues — read an issue (or a batch), classify it, check for duplicates/already-fixed, screen for security disclosures, and draft a polite reply plus proposed labels.

    174 GitHub stars~4.7k tokensUpdated yesterday
    Auto-check: warnings
  • Release

    duracelltomi/gtm4wp

    Cut a GTM4WP release — pre-flight verification, the version bumps, tag, ZIP, GitHub release with post-upload verification, branch mechanics, and the propagation sweep that updates RELEASE-STATE.md…

    174 GitHub stars~2.8k tokensUpdated yesterday
    Auto-check passed
  • Guide to create WooCommerce related WordPress plugins that extends WooCommerce functionality with a consistent and maintainable approach.

    174 GitHub stars~8.9k tokensUpdated yesterday
    Auto-check passed
  • Wordpress Security

    duracelltomi/gtm4wp

    Guide to maintain creating modern and secure code while developing WordPress plugins.

    174 GitHub stars~7.2k tokensUpdated yesterday
    Auto-check passed

Categories

Questions about Changelog

What does Changelog do?

How to write GTM4WP CHANGELOG.md / readme.txt entries. An agent skill from duracelltomi/gtm4wp. Changelog is an agent skill from duracelltomi/gtm4wp.txt entries.

When should I use Changelog?

Changelog fits situations like: tasks that involve Changelog and release notes.

How do I install Changelog in Claude Code?

Run `npx skills add duracelltomi/gtm4wp --skill changelog -a claude-code`. Or copy the skill folder (.claude/skills/changelog in duracelltomi/gtm4wp) into .claude/skills/changelog in your project. Claude Code loads it when a task matches its description.

How do I install Changelog in Codex?

Run `npx skills add duracelltomi/gtm4wp --skill changelog -a codex`. Or copy the skill folder (.claude/skills/changelog in duracelltomi/gtm4wp) into .agents/skills/changelog in your project. Codex loads it when a task matches its description.

Can I use Changelog in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add duracelltomi/gtm4wp --skill changelog -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/changelog, .gemini/skills/changelog, .github/skills/changelog and .opencode/skills/changelog in your project.

What does Changelog need to run?

Going by SKILL.md and its folder, Changelog needs the command-line tools its instructions call (git and bash).

Does Changelog access the network?

SKILL.md names 1 domain. In commands or code: gtm4wp.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.

Is Changelog safe to install?

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.

What licence does Changelog use?

Changelog is published under the GPL-2.0-or-later licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Changelog use?

About 2.5k tokens (SKILL.md is roughly 10k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Changelog?

Skills that share tags, products or a category with Changelog: WooCommerce Code Review (woocommerce/woocommerce, 11k stars), WooCommerce Dev Cycle (woocommerce/woocommerce, 11k stars), WooCommerce Backend Conventions (woocommerce/woocommerce, 11k stars) and Add Changelog (gambitph/Stackable, 351 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Changelog?

duracelltomi (a GitHub user) maintains it in duracelltomi/gtm4wp, which has 174 GitHub stars. The repository holds 6 skills in this directory. The repository was last updated on October 9, 2026.

Source: duracelltomi/gtm4wp on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.