Render /changelog from the plugin ledger instead of a second copy #125

Merged
cruelacid merged 1 commit from worktree-site-changelog into main 2026-09-23 17:21:02 +01:00
Owner

Closes #85. Part of #77. It is stacked on #86, and is last in the chain.

site/content/changelog.mjs, the hand-written page that landed in #114, now renders docs/changelog-plugin.md through scripts/lib/ledger.mjs, keeping that page's design. The prose moved into the ledger in #82. The manifest assertion now reads the ledger, and renaming the section fails the build. deploy-site.yml watches the ledger and its parser, and the link map sends changelog-plugin.md to /changelog.

The rendered page is identical to the hand-written one except the footnote, which now covers 0.1.0, shipped the same day. Merging deploys the site.

Changelog

NONE

🤖 Generated with Claude Code

https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt

Closes #85. Part of #77. It is stacked on #86, and is last in the chain. `site/content/changelog.mjs`, the hand-written page that landed in #114, now renders `docs/changelog-plugin.md` through `scripts/lib/ledger.mjs`, keeping that page's design. The prose moved into the ledger in #82. The manifest assertion now reads the ledger, and renaming the section fails the build. `deploy-site.yml` watches the ledger and its parser, and the link map sends `changelog-plugin.md` to `/changelog`. The rendered page is identical to the hand-written one except the footnote, which now covers 0.1.0, shipped the same day. Merging deploys the site. ## Changelog NONE 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
Publish the plugin's changelog in the mirror, generated from the ledger
Some checks failed
Release note / release-note (pull_request) Successful in 15s
CI / e2e (pull_request) Successful in 4m49s
CI / build (pull_request) Successful in 6m17s
CI / promote (pull_request) Has been skipped
CI / promote (push) Has been cancelled
CI / e2e (push) Has been cancelled
CI / build (push) Has been cancelled
6187b4e989
The mirror is what users install from, and it shipped no record of what any
release changed. CHANGELOG.md is now staged from docs/changelog-plugin.md —
released sections only, since Unreleased is a draft under review — the same
way the README is generated rather than kept. It is on the required list,
so a staging bug fails the build instead of shipping without it, and the
README links it from Installing.

verify() scans it like every other staged file. Checked both ways: a line
naming a private document in the ledger fails --check, and dropping the
write reports it missing.

Part of #77. Closes #83.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
releaseNotes() was a fixed template: install instructions, a digest and a
source sha, identical for every release. It now leads with the version's
section of docs/changelog-plugin.md, and keeps the install instructions and
the sha256(main.js) that ties the artefact to the source.

The dry-run exit is the only human checkpoint in a plugin release, and the
notes were an inline argument to gh release create, never printed. It now
prints them in full, exactly as they would be published.

A release with no ledger section for manifest.version is refused before
anything is committed. On --release the source commit is also tagged
plugin-v<version> here and pushed, which is where changelog.mjs draft
starts the next range.

Checked against a scratch clone of the mirror: the dry run printed the
0.1.5 section, install and verification; with the section renamed, it
refused and the clone's head did not move. assertAuthorship is untouched.

Part of #77. Closes #84.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
Stop a tag push from starting the real-Obsidian suite
Some checks failed
Release note / release-note (pull_request) Successful in 12s
CI / e2e (pull_request) Successful in 4m39s
CI / build (pull_request) Successful in 6m16s
CI / promote (pull_request) Has been skipped
CI / promote (push) Has been cancelled
CI / e2e (push) Has been cancelled
CI / build (push) Has been cancelled
e2e / multi (push) Failing after 9m14s
d4ca5f6241
e2e.yml's push trigger had only a paths filter, and a tag push matches it
whatever changed: pushing the seven release tags on 23 September queued
seven full e2e runs in the gate's concurrency group, ahead of main's own.
branches: ['**'] excludes tags without narrowing branches. It matters from
here on because publish-plugin.mjs now pushes a plugin-v* tag per release.

Part of #77, #84.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
Name the server's first version, without changing how it deploys
Some checks failed
Release note / release-note (pull_request) Successful in 13s
CI / e2e (pull_request) Successful in 4m48s
CI / build (pull_request) Successful in 5m29s
CI / promote (pull_request) Has been skipped
CI / e2e (push) Has been cancelled
CI / promote (push) Has been cancelled
CI / build (push) Has been cancelled
84a9ce901c
The server and identity service had been 0.0.1 since the scaffold and ship
by sha, so there was no release to hang a changelog on. They now share one
version, 1.0.0, and server-v1.0.0 tags 1d3234a: the build :stable pointed at
and eu1 reported from /api/health when this was written. Nothing was built
or deployed to create it. promote still moves :stable on every green main,
and hosts still adopt it within a minute.

docs/changelog-server.md carries the 1.0.0 entry, cut with changelog.mjs,
and says it is retrospective. docs/releasing.md says how to name the next
one. The tag is namespaced so it cannot collide with the plugin's in a
--since range.

Part of #77. Closes #86.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
Render /changelog from the plugin ledger instead of a second copy
All checks were successful
Release note / release-note (pull_request) Successful in 12s
CI / build (pull_request) Successful in 5m16s
CI / e2e (pull_request) Successful in 4m22s
CI / promote (pull_request) Has been skipped
Deploy site / deploy (push) Successful in 54s
CI / e2e (push) Successful in 4m29s
CI / build (push) Successful in 5m43s
CI / promote (push) Successful in 32s
5f5a0db1ec
The page held its own hand-written entries because there was nothing to
generate them from. docs/changelog-plugin.md is now that source — it also
becomes the mirror's CHANGELOG.md and the GitHub release notes — so a
separate copy here would be the one that drifted. The prose moved into the
ledger word for word; this renders it, every ### group in order, and never
Unreleased.

The manifest assertion stays and now reads the ledger: renaming the 0.1.5
section fails the build. The rendered page matches the hand-written one
except for the footnote, which now covers 0.1.0, shipped the same day.
deploy-site.yml watches the ledger and its parser, and the link map sends
changelog-plugin.md to /changelog.

Part of #77. Closes #85.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Nectenda/nectenda!125
No description provided.