@adia-ai/adia-ui-forge 0.8.24 → 0.8.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +14 -0
- package/package.json +1 -1
- package/skills/adia-author/references/common-gotchas.md +18 -3
- package/skills/adia-release/SKILL.md +5 -5
- package/skills/adia-release/references/changelog-discipline.md +2 -2
- package/skills/adia-release/references/cut-procedure.md +2 -2
- package/skills/adia-release/references/notes-authoring.md +3 -3
- package/skills/adia-release/scripts/dispatch-publish.mjs +1 -1
- package/skills/adia-release/scripts/insert-stub.mjs +1 -1
- package/skills/adia-release/scripts/package-paths.mjs +2 -0
- package/skills/adia-release/scripts/tag-lockstep.mjs +8 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adia-ui-kit-forge",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.26",
|
|
4
4
|
"description": "Maintain the adia-ui (@adia-ai) framework itself \u2014 author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-factory (the consumer/app-author plugin).",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Kim",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog — adia-ui-kit-forge
|
|
2
2
|
|
|
3
|
+
## [0.8.26] — 2026-08-05
|
|
4
|
+
|
|
5
|
+
### Maintenance
|
|
6
|
+
- **Lockstep version bump only.** No source changes in this package; bumped to maintain the lockstep version coherence enforced by `scripts/release/check-lockstep.mjs`. Substantive v0.8.26 work shipped in WCH chat-harness wave + genui conformance train; first publish of @adia-ai/agent + @adia-ai/persona. See `packages/web-modules/CHANGELOG.md#0826--2026-08-05` for details.
|
|
7
|
+
- **`.claude-plugin/plugin.json` version bump** — moves in lockstep with package.json (the `/plugin update` cache key).
|
|
8
|
+
- **`skills/` touched in this release window** (7 file(s), e.g. `adia-release/SKILL.md`) — carried by the entries above.
|
|
9
|
+
|
|
10
|
+
## [0.8.25] — 2026-07-31
|
|
11
|
+
|
|
12
|
+
### Maintenance
|
|
13
|
+
- **Lockstep version bump only.** No source changes in this package; bumped to maintain the 11-package version coherence enforced by `scripts/release/check-lockstep.mjs`. Substantive v0.8.25 work shipped in theme-panel scoped-target [parametric] density/radius fix (gh#570) + System scheme option; anchor-bar-ui; stat-ui band chart layout; chart-ui dots/series-emphasis. See `packages/web-components/CHANGELOG.md#0825--2026-07-31` for details.
|
|
14
|
+
- **`.claude-plugin/plugin.json` version bump** — moves in lockstep with package.json (the `/plugin update` cache key).
|
|
15
|
+
- **`skills/` touched in this release window** (1 file(s), e.g. `references/common-gotchas.md`) — carried by the entries above.
|
|
16
|
+
|
|
3
17
|
## [0.8.24] — 2026-07-30
|
|
4
18
|
|
|
5
19
|
### Maintenance
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adia-ai/adia-ui-forge",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.26",
|
|
4
4
|
"description": "Maintain the adia-ui (@adia-ai) framework itself \u2014 author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-factory (the consumer/app-author plugin).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"adia-ui",
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Common gotchas — authoring traps
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Seven concrete failure modes: five from a billing-overview rebuild + multi-demo grandfather-elimination cycle (CSS/composition-layering traps, §§1–5, composite authoring specifically), one from the site-a2ui migration's router-race root cause (async-lifecycle sequencing, §6, any primitive or module with a multi-await lifecycle method), plus one from minting `anchor-bar-ui` (generated-artifact regeneration ordering, §7, any change that mints/renames a component and touches a demo using it in the same pass). Each is the kind of bug that:
|
|
4
4
|
|
|
5
5
|
- Renders visually broken without console errors
|
|
6
6
|
- Passes existing audits silently
|
|
7
7
|
- Is fixed in one place but recurs in others until pattern-corrected
|
|
8
8
|
|
|
9
|
-
Composite authors: read §§1–5 BEFORE Phase 3 sketch. Anyone adding an async lifecycle method (fetch, dynamic `import()`, any multi-`await` sequence) to any primitive or module: read §6. Each entry includes the pattern, the detector (if any), and the fix.
|
|
9
|
+
Composite authors: read §§1–5 BEFORE Phase 3 sketch. Anyone adding an async lifecycle method (fetch, dynamic `import()`, any multi-`await` sequence) to any primitive or module: read §6. Anyone minting or renaming a component whose PR also regenerates a demo using it: read §7. Each entry includes the pattern, the detector (if any), and the fix.
|
|
10
10
|
|
|
11
11
|
## Contents
|
|
12
12
|
|
|
@@ -16,6 +16,7 @@ Composite authors: read §§1–5 BEFORE Phase 3 sketch. Anyone adding an async
|
|
|
16
16
|
4. [minmax(min, 1fr) inside repeat() fighting container queries](#4-minmaxmin-1fr-inside-repeat-fighting-container-queries)
|
|
17
17
|
5. [Nested `<!-- ... -->` inside design-plan canonical-sketch fenced blocks](#5-nested----inside-design-plan-canonical-sketch-fenced-blocks)
|
|
18
18
|
6. [Async load/render function completing out of order](#6-async-loadrender-function-completing-out-of-order--a-guard-at-the-checkpoint-isnt-enough)
|
|
19
|
+
7. [Minting a wrapper-shaped component before its registry.js entry lands](#7-minting-a-wrapper-shaped-component-before-its-registryjs-entry-lands--site-a2ui-silently-deletes-the-node-not-just-mis-types-it)
|
|
19
20
|
|
|
20
21
|
---
|
|
21
22
|
|
|
@@ -122,8 +123,22 @@ async #loadContent(route) {
|
|
|
122
123
|
|
|
123
124
|
---
|
|
124
125
|
|
|
126
|
+
## 7. Minting a wrapper-shaped component before its registry.js entry lands — site-a2ui silently deletes the node, not just mis-types it
|
|
127
|
+
|
|
128
|
+
**Pattern**: a tag is gated first and only, for `*-ui` tags, by `packages/a2ui/runtime/registry.js`'s hand-maintained `registry` map — inverted into `reverseRegistry` at `transpiler-maps.js`'s module init, consulted first thing in `compose/transpiler/transpiler.js:149-150`. `registry.js` is hand-edited, not generated by `node scripts/build/components.mjs` (that script writes sidecars/prop-catalog data, consumed only for prop-extraction fidelity on tags the transpiler ALREADY resolved — `transpiler-maps.js:22-26`); a runtime `registerType()` call doesn't rescue a stale row either — `reverseRegistry` is a one-time init snapshot, not live. Regenerate a site-a2ui row for a demo using a component minted in the SAME change, before its `registry.js` line lands, and the tag falls through to `transpiler.js`'s "Unknown → Column" branch (line 180-183) — same mechanism as gh#535's toolbar-group breakage, which at least rendered visibly-wrong. A NEW component is usually wrapper-shaped (one child, author-defined attributes like `anchor="bottom"` the transpiler doesn't map to any real A2UI prop). That shape trips a SECOND, separate rule right after — "single-child container chains flatten" (`transpiler.js:282-285`): a retyped Column with exactly one child and zero recognized props is discarded outright, and its child is spliced directly into the PARENT's children in its place. The wrapper's own id and node are never pushed to the tree at all — not visible-but-wrong, just gone. The row is then internally self-consistent (content hash matches source) so `check:chunks-fresh`/`verify:site-a2ui` both report clean.
|
|
129
|
+
|
|
130
|
+
**Example**: minting `anchor-bar-ui` (gh#495, PR #569) and regenerating the `bulk-action-toolbar` pattern's site-a2ui row before the worktree's `registry.js` entry for it existed. Git-verified on the pre-fix commit (`ebf71832d`): `site-a2ui/pages/site__patterns__bulk-action-toolbar.a2ui.json` contains zero occurrences of `pat-bulk-float-bar` (the anchor-bar-ui's own authored id) anywhere — not retyped-and-visible, genuinely absent — while its single child (the toolbar content) survived, reparented one level up. `verify:site-a2ui` reported 321/321 clean.
|
|
131
|
+
|
|
132
|
+
**Detector**: none generic — `verify:site-a2ui`'s freshness check can't catch this (the row IS fresh relative to its source, it transpiled correctly against a registry that was itself incomplete). The only catch is rendering the actual route in a browser and confirming the new tag's node count is nonzero, or re-running `node scripts/build/site-a2ui.mjs --page <route>` (or `--stale`) after `registry.js` is updated and diffing the row for the new component name. A non-wrapper-shaped new component (multiple children, or attributes that happen to map to real props) is lower-risk here — it survives as a visible-but-wrong Column, the gh#535 class, which at least has a visual tell.
|
|
133
|
+
|
|
134
|
+
**Fix**: the `registry.js` entry is what gates resolution — land it (not just run `components.mjs`, which is necessary for prop fidelity but not sufficient to avoid the retype) before regenerating any site-a2ui row that uses the new tag. When gating a dispatched agent's PR that did this out of order, re-run `node scripts/build/site-a2ui.mjs --page <route>` on the merged tree and browser-probe the tag actually appears — never trust `verify:site-a2ui`'s green alone for a route touching a component minted in the same change.
|
|
135
|
+
|
|
136
|
+
**Generalizes to**: any hand-maintained resolution map (not build-generated) that a later regeneration step reads through — regenerating before the map is updated produces an internally-consistent-but-wrong artifact that passes a same-source freshness check; if the misresolved shape also happens to trip a downstream simplification/collapse rule, the failure escalates from "renders wrong" to "renders nothing," with no visual tell at all.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
125
140
|
## Meta-pattern across gotchas 1–5
|
|
126
141
|
|
|
127
142
|
**Composites and primitives have layered contracts. The parent's CSS shouldn't reach into the child's layout territory. The child's CSS shouldn't fight its parent's container queries. The audit should detect the rendering hazard, not just the parsing structure.**
|
|
128
143
|
|
|
129
|
-
The structural defense for #1 (composition-grammar bypass) is `npm run audit:card-structure[:strict]` / `npm run audit:avatar-structure` / `npm run audit:alert-structure` (HTML + JS `createElement` scan) plus `npm run audit:sketch-grammar` at Phase 3. The component-literacy read is a hint, not a gate — the mechanical defenses above are the proximate fix. See [composite-demo-protocol.md](composite-demo-protocol.md) Phase 2. Gotchas #2–4 are caught only by visual review until corresponding audits are added. #6 is a distinct axis (async-lifecycle correctness, not CSS layering) — see its own Detector/Fix above.
|
|
144
|
+
The structural defense for #1 (composition-grammar bypass) is `npm run audit:card-structure[:strict]` / `npm run audit:avatar-structure` / `npm run audit:alert-structure` (HTML + JS `createElement` scan) plus `npm run audit:sketch-grammar` at Phase 3. The component-literacy read is a hint, not a gate — the mechanical defenses above are the proximate fix. See [composite-demo-protocol.md](composite-demo-protocol.md) Phase 2. Gotchas #2–4 are caught only by visual review until corresponding audits are added. #6 is a distinct axis (async-lifecycle correctness, not CSS layering) — see its own Detector/Fix above. #7 is a third axis (a hand-maintained resolution map read by a downstream regeneration step, not CSS or async ordering) — its own Detector/Fix above; no audit catches it, only a browser probe of the specific route touched.
|
|
@@ -3,7 +3,7 @@ name: adia-release
|
|
|
3
3
|
description: >-
|
|
4
4
|
Release engineering for the @adia-ai lockstep monorepo. Use when asked to
|
|
5
5
|
cut and ship a release, promote [Unreleased] CHANGELOG entries, tag and push the
|
|
6
|
-
lockstep packages to origin, publish
|
|
6
|
+
lockstep packages to origin, publish a 13-package release (11 npm
|
|
7
7
|
libraries + 2 Claude Code plugins), batch-push piled-up release commits,
|
|
8
8
|
recover a cut that landed wrong or whose publish workflows didn't fire,
|
|
9
9
|
fix a check:lockstep bump failure or an F-N1 CHANGELOG-coverage warning,
|
|
@@ -17,7 +17,7 @@ user-invocable: true
|
|
|
17
17
|
|
|
18
18
|
# adia-release
|
|
19
19
|
|
|
20
|
-
Release engineering for an @adia-ai-style lockstep monorepo: the
|
|
20
|
+
Release engineering for an @adia-ai-style lockstep monorepo: the `@adia-ai/*` packages on the roster (`scripts/package-paths.mjs`, the single source — 13 as of gh#607: 11 npm libraries plus the 2 Claude Code plugins under `packages/plugins/*`) version and publish together (class A; the plugins joined the lockstep 2026-07-15 after class-B independence let npm drift a full harness-reset behind the repo). Class B (independent versioning) currently has no members; the procedure is retained for future genuinely-independent packages. The substrate — `scripts/release/*`, the `check:*` gates, the tag-triggered publish workflows — encodes the invariants; this skill routes, sequences, and stops at the judgment calls.
|
|
21
21
|
|
|
22
22
|
## Authorization — one go, gates do the rest (operator ruling 2026-07-17)
|
|
23
23
|
|
|
@@ -31,7 +31,7 @@ Mechanics: `release-pack.mjs --go` auto-confirms all checkpoints (it equals `--y
|
|
|
31
31
|
|
|
32
32
|
## Invariants (class-A lockstep cut)
|
|
33
33
|
|
|
34
|
-
1. **Lockstep coherence** —
|
|
34
|
+
1. **Lockstep coherence** — every roster package bumps together (`check:lockstep`; the roster lives in `scripts/package-paths.mjs`, currently `web-components`, `web-modules`, `llm`, `agent`, `persona`, `a2ui-{runtime,compose,corpus,mcp,retrieval,validator}`, and the plugins `adia-ui-{factory,forge}`) (each plugin's `.claude-plugin/plugin.json` version moves with its package.json — `bump.mjs` handles both; `verify:plugins` gates the sync).
|
|
35
35
|
2. **PATCH-cut asymmetry** — internal `@adia-ai/*` ranges hold at `^X.Y.0` during PATCH cuts; only MINOR bumps the floor. `^0.0.x` is forbidden (pre-1.0 caret locks exact — shipped a real stale-sibling bug).
|
|
36
36
|
3. **Release commits land via PR, never a direct push to `main`** (repo policy, operator ruling 2026-07-12): commit on `release/vX.Y.Z` → PR → CI → merge — THEN tag at `main`'s post-merge HEAD, not at the bump commit; post-bump fixes merge before tagging and belong in the tarball. Exception: batch push tags each version at its own release-merge SHA.
|
|
37
37
|
4. **One umbrella + one per-package tag per cut** (`vX.Y.Z` + 11 × `<pkg>-vX.Y.Z`); publish workflows key off the per-package tags. Push tags **one per `git push`** — a batched multi-tag push drops the trigger event.
|
|
@@ -72,7 +72,7 @@ Every cut reports, whether it ran inline or via `release-builder`:
|
|
|
72
72
|
|
|
73
73
|
| Field | Value |
|
|
74
74
|
| --- | --- |
|
|
75
|
-
| Version | X.Y.Z —
|
|
75
|
+
| Version | X.Y.Z — all roster packages at this version (`check:lockstep`) |
|
|
76
76
|
| Commit / PR | release commit SHA, PR # (merged) |
|
|
77
77
|
| Tags | umbrella `vX.Y.Z` + 11 per-package tags pushed (or: which are still pending, and why) |
|
|
78
78
|
| Registry | `npm view @adia-ai/<pkg> version` per package, cited (not "publish workflow green") |
|
|
@@ -93,7 +93,7 @@ assumed pass, or "published" without the actual `npm view` output.
|
|
|
93
93
|
|
|
94
94
|
## Mechanization (bundled `scripts/`, stdlib Node, all support `--dry`)
|
|
95
95
|
|
|
96
|
-
`release-pack.mjs` walks the cycle in two phases per invariant 3 — `--mode cut` / `--mode from-scratch` promote `[Unreleased]` (BOTH modes now — a peer's hand-authored section must be promoted whichever mode cut it, and a loud guard blocks the bump if any
|
|
96
|
+
`release-pack.mjs` walks the cycle in two phases per invariant 3 — `--mode cut` / `--mode from-scratch` promote `[Unreleased]` (BOTH modes now — a peer's hand-authored section must be promoted whichever mode cut it, and a loud guard blocks the bump if any roster package still carries non-empty `[Unreleased]` content after promotion), run Step 4f (pre-tag coverage `--fix` with the authoritative F-N1 matcher), and stop at the release commit (PR → merge); `--mode handoff` tags/publishes/deploys from post-merge main. **`--go` is the standard invocation for an operator-initiated release** — the single authorization covers the cycle; evidence blocks print as a log; granular `--yes`/`--push`/`--publish` remain for cautious manual runs (`--push` still refuses to auto-fire past any F-N1 finding). `--mode batch` is not implemented — it hard-rejects with a pointer to [`recovery-paths.md`](references/recovery-paths.md) §Scenario 2 rather than silently misbehaving; a real batch tags each version at its own release-merge SHA, which this single-version orchestrator has no model for. Pre-flight (Step 3) runs the full 24-gate roster from the single shared list in `scripts/gate-roster.mjs` — the same list [`cut-procedure.md`](references/cut-procedure.md) §3.1 transcribes, so a subset run requires editing that one file, not two.
|
|
97
97
|
|
|
98
98
|
The pieces are callable alone: `bump.mjs` (version fields + the factory `.mcp.json` a2ui-mcp pin, invariant 8), `promote-unreleased.mjs` / `insert-stub.mjs` (CHANGELOG blocks), `tag-lockstep.mjs` (12 tags, `--delete` to move), `dispatch-publish.mjs` (publish workflows; `--verify-triggered` re-dispatches only missing runs; `--after` enforces batch ordering — dispatch output states what WAS done, never a to-do phrased as if it hadn't fired), and `pr-bridge.mjs` (the two-phase bridge: pushes the release branch, opens the PR, waits out CI, and merges ONLY on all-non-fail-soft-checks-green + zero unresolved threads + no changes-requested; any other state stops with evidence — §5.7 mechanized, `--dry` to preview the decision). All fail fast outside a monorepo root (`assert-monorepo-root.mjs`); fork-configurable via `--host` / `--scope`. All 6 CLI scripts (plus `scripts/release/check-release.mjs`) have a `selftest` mode wired into CI's Plugin bin selftests step; the 3 helper modules (`assert-monorepo-root`, `gate-roster`, `package-paths`) are exercised through the CLIs' selftests, not their own.
|
|
99
99
|
|
|
@@ -85,7 +85,7 @@ The inserted block:
|
|
|
85
85
|
|
|
86
86
|
### Maintenance
|
|
87
87
|
- **Lockstep version bump only.** No source changes in this package; bumped to
|
|
88
|
-
maintain the
|
|
88
|
+
maintain the lockstep version coherence enforced by
|
|
89
89
|
`scripts/release/check-lockstep.mjs`. Substantive v0.X.Y work shipped in
|
|
90
90
|
<SUBSTANTIVE>. See `<XREF>` for details.
|
|
91
91
|
```
|
|
@@ -104,7 +104,7 @@ F-N1 (`node scripts/release/check-release.mjs --all-pending`) cross-checks the g
|
|
|
104
104
|
node scripts/release/check-release.mjs --pending-version X.Y.Z --fix
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
This is cut-procedure §Step 4f: the SAME matcher F-N1 uses at tag time (
|
|
107
|
+
This is cut-procedure §Step 4f: the SAME matcher F-N1 uses at tag time (every roster package, the `changelogMentions` pattern set including the `.claude-plugin` leading-dot case), run against the working tree, auto-appending a verified `### Maintenance` bullet per uncovered directory. It re-checks its own output before writing — the v0.8.5 cut hand-authored "enrichment" three times that read correctly but didn't contain the literal substrings the checker matches, costing 3 PRs and 3 tag rewrites. `release-pack.mjs` cut modes run this automatically.
|
|
108
108
|
|
|
109
109
|
**Hand-enrichment (better prose than the auto-bullet):** add the path keyword inline where it makes the entry *more* accurate — `` `table.yaml` `` → `` `components/table/table.yaml` `` — never as a bolted-on parenthetical. Verify with `--pending-version` (no `--fix`) before committing; never assume prose satisfies the matcher.
|
|
110
110
|
|
|
@@ -119,7 +119,7 @@ Any red → route via [`gates-catalog.md`](gates-catalog.md); fix at the source,
|
|
|
119
119
|
|
|
120
120
|
## §Step 4 — (Variant B, or ANY variant with uncommitted `[Unreleased]` content) Promote, bump, lockfile
|
|
121
121
|
|
|
122
|
-
**Run 4a whenever a hand-authored `## [Unreleased]` section is still sitting uncommitted, not only on a strict Variant B.** `release-pack.mjs --mode cut` (a peer's pre-staged content, not yet promoted) needs it exactly as much as `--mode from-scratch` does — the v0.8.4 near-miss was `--mode cut` skipping this step entirely because the doc (and the script) only associated promotion with "from scratch". Both modes now run it and both hard-fail before the bump if any
|
|
122
|
+
**Run 4a whenever a hand-authored `## [Unreleased]` section is still sitting uncommitted, not only on a strict Variant B.** `release-pack.mjs --mode cut` (a peer's pre-staged content, not yet promoted) needs it exactly as much as `--mode from-scratch` does — the v0.8.4 near-miss was `--mode cut` skipping this step entirely because the doc (and the script) only associated promotion with "from scratch". Both modes now run it and both hard-fail before the bump if any roster package still carries non-empty `[Unreleased]` content afterward.
|
|
123
123
|
|
|
124
124
|
**4a. Promote** `## [Unreleased]` → `## [vX.Y.Z] — YYYY-MM-DD` per package (`` `${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/promote-unreleased.mjs` ``); author fresh blocks for changed-but-unlogged packages; stub the pure ride-alongs (`` `${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/insert-stub.mjs` ``). Classification recipe + shapes: [`changelog-discipline.md`](changelog-discipline.md).
|
|
125
125
|
|
|
@@ -247,7 +247,7 @@ The operator's initiating instruction covers the whole cycle — no per-step re-
|
|
|
247
247
|
|
|
248
248
|
## §Step 4f — Pre-tag coverage `--fix` (the retag-loop killer)
|
|
249
249
|
|
|
250
|
-
After the bump + lockfile, run the AUTHORITATIVE F-N1 matcher against the working tree — same code, same `changelogMentions` patterns,
|
|
250
|
+
After the bump + lockfile, run the AUTHORITATIVE F-N1 matcher against the working tree — same code, same `changelogMentions` patterns, every roster package — and let it append verified Maintenance bullets for any changed-but-unmentioned directory:
|
|
251
251
|
|
|
252
252
|
```bash
|
|
253
253
|
node scripts/release/check-release.mjs --pending-version X.Y.Z --fix
|
|
@@ -18,12 +18,12 @@ If the diff contradicts the plan (a feature deferred, a refactor split across cu
|
|
|
18
18
|
|
|
19
19
|
## §The GH release body (single version, ~80–200 lines)
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Every roster package (package-paths.mjs) gets the same body (`gh release create <pkg>-vX.Y.Z --notes-file …`).
|
|
22
22
|
|
|
23
23
|
```markdown
|
|
24
24
|
## vX.Y.Z — <one-line tagline>
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
Lockstep **PATCH** cut (all roster packages). <One sentence on scope.>
|
|
27
27
|
|
|
28
28
|
### `@adia-ai/<substantive-pkg>`
|
|
29
29
|
- **<Bold-prefix headline>.** <Why → what → inline file paths.> Closes <FEEDBACK-NN>.
|
|
@@ -50,7 +50,7 @@ Shape rules: open with the tagline, no preamble; group by `### @adia-ai/<pkg>`;
|
|
|
50
50
|
|
|
51
51
|
npm i @adia-ai/web-components@X.Y.Z @adia-ai/web-modules@X.Y.Z
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
Lockstep PATCH cut (all roster packages). <One sentence.>
|
|
54
54
|
|
|
55
55
|
## 🔷 `@adia-ai/<pkg>` — <headline>
|
|
56
56
|
<2–4 sentences.> Closes <FEEDBACK-NN>.
|
|
@@ -22,7 +22,7 @@ import process from 'node:process';
|
|
|
22
22
|
import { assertMonorepoRoot } from './assert-monorepo-root.mjs';
|
|
23
23
|
import { PACKAGE_NAMES } from './package-paths.mjs';
|
|
24
24
|
|
|
25
|
-
// Instance data — fork-configurable. The npm scope the
|
|
25
|
+
// Instance data — fork-configurable. The npm scope the lockstep roster publishes under.
|
|
26
26
|
// Default preserves @adia-ai behavior; override via --scope or $ADIA_NPM_SCOPE.
|
|
27
27
|
const DEFAULT_SCOPE = '@adia-ai';
|
|
28
28
|
|
|
@@ -68,7 +68,7 @@ function buildStub(version, date, substantive, xref) {
|
|
|
68
68
|
return `## [${version}] — ${date}
|
|
69
69
|
|
|
70
70
|
### Maintenance
|
|
71
|
-
- **Lockstep version bump only.** No source changes in this package; bumped to maintain the
|
|
71
|
+
- **Lockstep version bump only.** No source changes in this package; bumped to maintain the lockstep version coherence enforced by \`scripts/release/check-lockstep.mjs\`. Substantive v${version} work shipped in ${substantive}. See \`${xref}\` for details.
|
|
72
72
|
|
|
73
73
|
`;
|
|
74
74
|
}
|
|
@@ -46,6 +46,8 @@ export const PACKAGE_ROSTER = [
|
|
|
46
46
|
{ name: 'web-components', dir: 'packages/web-components' },
|
|
47
47
|
{ name: 'web-modules', dir: 'packages/web-modules' },
|
|
48
48
|
{ name: 'llm', dir: 'packages/llm' },
|
|
49
|
+
{ name: 'agent', dir: 'packages/agent' },
|
|
50
|
+
{ name: 'persona', dir: 'packages/persona' },
|
|
49
51
|
{ name: 'a2ui-runtime', dir: 'packages/a2ui/runtime' },
|
|
50
52
|
{ name: 'a2ui-compose', dir: 'packages/a2ui/compose' },
|
|
51
53
|
{ name: 'a2ui-corpus', dir: 'packages/a2ui/corpus' },
|
|
@@ -61,7 +61,7 @@ function main() {
|
|
|
61
61
|
const tags = buildTagList(args.version);
|
|
62
62
|
|
|
63
63
|
if (args.deleteMode) {
|
|
64
|
-
console.log(`Deleting
|
|
64
|
+
console.log(`Deleting ${tags.length} tags for v${args.version}:`);
|
|
65
65
|
for (const t of tags) {
|
|
66
66
|
try {
|
|
67
67
|
run(`git tag -d ${t}`, args.repo, args.dry);
|
|
@@ -75,7 +75,7 @@ function main() {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
const targetSha = args.at || run('git rev-parse HEAD', args.repo, false).trim();
|
|
78
|
-
console.log(`Creating
|
|
78
|
+
console.log(`Creating ${tags.length} tags for v${args.version} at ${targetSha.slice(0, 9)}:`);
|
|
79
79
|
for (const t of tags) {
|
|
80
80
|
try {
|
|
81
81
|
run(`git tag ${t} ${args.at || ''}`.trim(), args.repo, args.dry);
|
|
@@ -106,8 +106,12 @@ function main() {
|
|
|
106
106
|
|
|
107
107
|
function selftest() {
|
|
108
108
|
const tags = buildTagList('1.2.3');
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
// Derive from the roster (package-paths.mjs is the single source) — a
|
|
110
|
+
// hard-coded count here is exactly the drift gh#612 removed from the docs;
|
|
111
|
+
// the v0.8.26 cut caught this one when agent+persona joined (11 → 13).
|
|
112
|
+
const expected = PACKAGE_NAMES.length + 1; // umbrella + one per package
|
|
113
|
+
if (tags.length !== expected) {
|
|
114
|
+
console.error(`selftest FAIL: expected ${expected} tags (umbrella + ${PACKAGE_NAMES.length} per-package), got ${tags.length}`); process.exit(1);
|
|
111
115
|
}
|
|
112
116
|
if (tags[0] !== 'v1.2.3') {
|
|
113
117
|
console.error('selftest FAIL: umbrella tag must be first'); process.exit(1);
|