Repository navigation
v6.13.1
Patch release: fixes two defects in upgrading an existing project with
uds updatethat 6.13.0 exposed (a zh-TW commit-language section turned English; AGENTS.md rewritten into a different format without its index reminder), and adds a pre-release gate that performs a real upgrade from the previous stable release. If you already ranuds updateto 6.13.0, runuds updateagain after upgrading to 6.13.1 to restore those sections.
Added
scripts/check-upgrade-fidelity.sh, wired intopre-release-check.shas step 24: a real cross-versionuds updateupgrade check, run before every release. The two regressions fixed above both share the same shape — they only fire when an EXISTING project, already updated by the previous stable release, runsuds update/uds update --applyagainst a NEWER version — and pre-release-check.sh's other 31 steps, and CI, all missed both, because none of them perform a real cross-version upgrade:uds initruns fresh (nothing to regress against), anduds updateagainst a bundled registry version equal to the manifest's already-recorded version returns early before ever reaching the code that broke. This check builds three project shapes (matching the three real adopters that hit these bugs) with a REAL, published previous stable release fetched from npm, upgrades each with the CLI under test via both a plainuds update -yanduds update --apply, and asserts: content outside the UDS marker block never changes; content inside it changes only by the standards list/count a real upgrade is allowed to add; the commit-message-language heading (CLAUDE.md) is byte-identical, not merely present; the "this is just an index" reminder is present;uds update -yanduds update --applyagree on which generator produced a file; and a second--applyimmediately after a first changes nothing. Fails loudly (exit 2, not a skip) if npm is unreachable or the previous version was never published — this check's entire value is exercising a real release, and silently passing without one would reopen exactly the blind spot it exists to close. Verified both ways:--cli="npx -y universal-dev-standards@6.13.0"reproduces both regressions above (the CLAUDE.md language flip and the AGENTS.md generator flip), with the actual diff printed; the local dev CLI (commitse1524872+8373207dapplied) passes clean on all three shapes.
Fixed
- A plain
uds update -y(not--apply) silently replaced a project's Traditional Chinese CLAUDE.md commit-message heading with the English one, and could report a--plan --integrations-onlydry-run diff that ignored the project's display language.updateCommand's main flow and its--plandry-run each independently derived the integration block's content language fromoutput_language/commit_languagealone (the commit-message language), ignoringdisplay_language(the settinguds initand the reconciler have always used for "what language do you want to read"). A project installed withdisplay_language: zh-twandoutput_language: bilingual— a common combination — therefore got the correct## 提交訊息語言heading frominit, and## Commit Message Languagefrom the next plainuds update, discarding a language choice that was already correct. Measured against two real adopters (asiaostrich-telemetry-server, EngramGraph) upgrading 6.12.0 → 6.13.0. The bug predates 6.13.0 (present since 2026-03-25, commitad555d41) and was invisible wheneveruds updateran against an already-current project, since it returns early before reaching this code in that case — it only ever surfaced on a real version bump, which is why it looked like a new regression.buildToolIntegrationConfig(used by--apply/the reconciler) already had the correct derivation, added 2026-09-16; both remaining call sites now share it via the newresolveIntegrationLanguage(manifest). A regression test reproduces the exact defect against a real temp project and the real generator (no mocking), and a static guard fails if the old inline derivation reappears anywhere in the CLI source. uds update --apply(the reconciler) rewrote a project's AGENTS.md into a completely different, opencode-shaped document the momentgenerateAgentsMdhad ever written one — even on the very first--applyimmediately after a freshuds init, with nothing else changed.desired-state-calculator.js'scalculateIntegrationsresolved anymanifest.integrationsentry namedAGENTS.mdto theopencodetool viaresolveToolKey, regardless of whether opencode (or its aliascodex) was an actually-selected AI tool —uds initalways recordsAGENTS.mdthere once the universal summary is written (a tracking marker, not a record of a tool choice), so every project withgenerateAgentsMd: trueand no codex/opencode selected was affected. Per the generator's own design note (added 2026-08-20): the per-tool template is meant to replace the universal summary only when codex or opencode is genuinely selected. Confirmed on three real projects (asiaostrich-telemetry-server, EngramGraph, dev-platform's own.standards/), all withaiToolscontaining no codex/opencode entry.calculateIntegrations(andplan-executor.js'sexecuteMigrateBlock) now check whether the tool is genuinely selected and, when it is not, generate through the SAMEwriteAgentsMdSummarya plainuds updatealready used —--applyand a plainuds updatenow agree. New regression tests drive the realuds init/uds update(no mocking); confirmed red against the reverted fix, including a second---applyidempotency check that caught a follow-on non-convergent-hash bug introduced while building the fix (see the next entry).- The universal AGENTS.md summary's "this file is an index, not the standards" reminder (added 2026-08-18) never reached an existing project's managed block — only its fixed header, which a marker-based update never regenerates for a file that already exists.
writeAgentsMdSummaryonly ever replaces the content BETWEEN the<!-- UDS:STANDARDS:START/END -->markers for a file that already exists; the reminder lived in the header, outside them. Measured against two real adopters (asiaostrich-telemetry-server, EngramGraph): the reminder was present in neither the file header nor the block, on either side of a real update. The reminder now also lives inside the marker block (worded identically to the per-tool generator's own disclosure,generateIndexDisclosure— not a third phrasing), so every project receives it on its nextuds update/--apply, new file or existing. Building this block through the samewrapWithMarkershelper the per-tool generator already used (rather than hand-writing the marker lines) also fixed a related gap found while adding it: a brand-new AGENTS.md never carried the "DO NOT manually edit" warning comment either, since only the merge path used to add it.
Compare: v6.13.0...v6.13.1