@adia-ai/adia-ui-forge 0.1.3 → 0.8.0
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 +3 -6
- package/CHANGELOG.md +27 -34
- package/README.md +35 -40
- package/agents/a2ui-engineer.md +22 -53
- package/agents/component-author.md +29 -0
- package/agents/framework-verifier.md +26 -0
- package/agents/release-engineer.md +21 -81
- package/agents/routing-corpus.json +293 -64
- package/bin/demo-postwrite-pattern-gate +94 -0
- package/bin/forge-lint +17 -2
- package/bin/sidecar-prewrite-guard +104 -0
- package/commands/deploy.md +9 -0
- package/commands/dogfood.md +10 -0
- package/commands/gen-review.md +9 -0
- package/commands/release.md +10 -0
- package/hooks/hooks.json +15 -0
- package/package.json +3 -6
- package/references/contracts/a2ui-mcp-surface.md +35 -0
- package/references/contracts/migration-guide-format.md +34 -0
- package/references/shared/content-trust.md +19 -74
- package/skills/adia-a2ui/SKILL.md +99 -0
- package/skills/{adia-ui-a2ui → adia-a2ui}/evals/routing-corpus.json +10 -10
- package/skills/adia-a2ui/references/anti-patterns.md +27 -0
- package/skills/adia-a2ui/references/chunk-authoring.md +71 -0
- package/skills/adia-a2ui/references/corpus-discipline.md +68 -0
- package/skills/adia-a2ui/references/eval-diagnostics.md +86 -0
- package/skills/adia-a2ui/references/format-extension-decisions.md +66 -0
- package/skills/adia-a2ui/references/leverage-rules.md +52 -0
- package/skills/adia-a2ui/references/mcp-pipeline-ops.md +83 -0
- package/skills/adia-a2ui/references/mcp-tool-reference.md +59 -0
- package/skills/adia-a2ui/references/pipeline-overview.md +115 -0
- package/skills/adia-a2ui/references/semantic-fail-lifting.md +74 -0
- package/skills/adia-a2ui/references/strategy-engines.md +109 -0
- package/skills/adia-a2ui/references/zettel-calibration.md +104 -0
- package/skills/adia-author/SKILL.md +112 -0
- package/skills/adia-author/evals/routing-corpus.json +222 -0
- package/skills/{adia-ui-authoring → adia-author}/references/anti-patterns.md +33 -4
- package/skills/{adia-ui-authoring → adia-author}/references/authoring-cycle.md +9 -11
- package/skills/adia-author/references/canonical-pattern-index.md +243 -0
- package/skills/{adia-ui-authoring → adia-author}/references/code-style.md +19 -21
- package/skills/adia-author/references/common-gotchas.md +129 -0
- package/skills/adia-author/references/composite-demo-protocol.md +271 -0
- package/skills/{adia-ui-authoring → adia-author}/references/css-patterns.md +19 -6
- package/skills/{adia-ui-authoring → adia-author}/references/lifecycle-patterns.md +1 -0
- package/skills/{adia-ui-authoring → adia-author}/references/llm-bridge.md +3 -5
- package/skills/{adia-ui-authoring → adia-author}/references/module-promotion.md +20 -38
- package/skills/{adia-ui-authoring → adia-author}/references/primitive-audit.md +2 -4
- package/skills/{adia-ui-authoring → adia-author}/references/shell-patterns.md +12 -18
- package/skills/{adia-ui-authoring → adia-author}/references/token-contract.md +5 -7
- package/skills/{adia-ui-authoring → adia-author}/references/worked-example.md +3 -3
- package/skills/{adia-ui-authoring → adia-author}/references/yaml-contract.md +3 -3
- package/skills/{adia-ui-authoring → adia-author}/scripts/build-canonical-pattern-index.mjs +3 -3
- package/skills/adia-deploy/SKILL.md +128 -0
- package/skills/{adia-ui-ops → adia-deploy}/references/deploy-playbooks.md +47 -30
- package/skills/adia-dogfood/SKILL.md +124 -0
- package/skills/adia-dogfood/references/admin-shell-anatomy.md +77 -0
- package/skills/adia-dogfood/references/app-shell-pitfalls.md +66 -0
- package/skills/adia-dogfood/references/card-anatomy-sweep.md +66 -0
- package/skills/adia-dogfood/references/html-attr-sweep.md +63 -0
- package/skills/adia-dogfood/references/native-leak-annotations.md +73 -0
- package/skills/adia-dogfood/references/visual-probe-triage.md +80 -0
- package/skills/{adia-ui-dogfood → adia-dogfood}/scripts/analyze.mjs +30 -14
- package/skills/adia-gen-review/SKILL.md +127 -0
- package/skills/adia-gen-review/references/corpus-html-patterns.md +279 -0
- package/skills/adia-gen-review/references/loop-protocol.md +216 -0
- package/skills/adia-gen-review/references/rubric-cosmetic.md +100 -0
- package/skills/adia-gen-review/references/rubric-decompose.md +101 -0
- package/skills/adia-gen-review/references/rubric-score.md +214 -0
- package/skills/{adia-ui-gen-review → adia-gen-review}/references/scores.schema.json +2 -2
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-coverage-audit.mjs +4 -4
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-decompose.mjs +10 -6
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/gen-review-status.mjs +5 -5
- package/skills/{adia-ui-gen-review → adia-gen-review}/scripts/validate-cycle-scores.mjs +5 -5
- package/skills/adia-llm-internals/SKILL.md +77 -0
- package/skills/{adia-ui-llm → adia-llm-internals}/references/adapter-contract.md +4 -2
- package/skills/{adia-ui-llm → adia-llm-internals}/references/add-a-provider.md +4 -5
- package/skills/{adia-ui-llm → adia-llm-internals}/references/bridge-facade.md +10 -3
- package/skills/{adia-ui-llm → adia-llm-internals}/references/browser-proxy-boundary.md +1 -1
- package/skills/{adia-ui-llm → adia-llm-internals}/references/model-registry.md +5 -3
- package/skills/{adia-ui-llm → adia-llm-internals}/references/streaming-sse.md +2 -2
- package/skills/adia-release/SKILL.md +72 -0
- package/skills/adia-release/references/changelog-discipline.md +119 -0
- package/skills/adia-release/references/cut-procedure.md +247 -0
- package/skills/adia-release/references/gates-catalog.md +222 -0
- package/skills/adia-release/references/independent-package-release.md +52 -0
- package/skills/adia-release/references/migration-guide-authoring.md +86 -0
- package/skills/adia-release/references/notes-authoring.md +90 -0
- package/skills/adia-release/references/recovery-paths.md +106 -0
- package/skills/{adia-ui-release → adia-release}/scripts/bump.mjs +27 -2
- package/skills/{adia-ui-release → adia-release}/scripts/dispatch-publish.mjs +4 -1
- package/skills/{adia-ui-release → adia-release}/scripts/insert-stub.mjs +1 -1
- package/skills/{adia-ui-release → adia-release}/scripts/package-paths.mjs +6 -0
- package/skills/{adia-ui-release → adia-release}/scripts/promote-unreleased.mjs +1 -1
- package/skills/{adia-ui-release → adia-release}/scripts/release-pack.mjs +13 -21
- package/skills/{adia-ui-release → adia-release}/scripts/tag-lockstep.mjs +5 -1
- package/skills/adia-site-docs/SKILL.md +68 -0
- package/skills/adia-site-docs/evals/audit-report.md +30 -0
- package/skills/adia-site-docs/evals/routing-corpus.json +176 -0
- package/skills/adia-site-docs/intent.md +72 -0
- package/agents/README.md +0 -209
- package/agents/author.md +0 -56
- package/agents/repo-steward.md +0 -56
- package/agents/spec-architect.md +0 -53
- package/agents/tech-lead.md +0 -57
- package/agents/verifier.md +0 -55
- package/bin/lib/audit-axes.mjs +0 -555
- package/bin/lib/dry-run-irreversible.mjs +0 -236
- package/bin/lib/run-skill-evals.mjs +0 -487
- package/bin/lib/teach-router.mjs +0 -250
- package/commands/adia-forge-a2ui.md +0 -10
- package/commands/adia-forge-author.md +0 -10
- package/commands/adia-forge-dogfood.md +0 -8
- package/commands/adia-forge-llm.md +0 -8
- package/commands/adia-forge-orient.md +0 -10
- package/commands/adia-forge-release.md +0 -8
- package/commands/adia-forge-review.md +0 -10
- package/references/shared/pev-rationale.md +0 -64
- package/references/shared/skill-conventions.md +0 -133
- package/skills/adia-ui-a2ui/CHANGELOG.md +0 -32
- package/skills/adia-ui-a2ui/SKILL.md +0 -243
- package/skills/adia-ui-a2ui/evals/adversarial-corpus.json +0 -75
- package/skills/adia-ui-a2ui/evals/teach-routing-cases.json +0 -100
- package/skills/adia-ui-a2ui/references/anti-patterns.md +0 -24
- package/skills/adia-ui-a2ui/references/chunk-authoring.md +0 -88
- package/skills/adia-ui-a2ui/references/corpus-discipline.md +0 -56
- package/skills/adia-ui-a2ui/references/eval-diagnostics.md +0 -127
- package/skills/adia-ui-a2ui/references/fragment-graph.md +0 -91
- package/skills/adia-ui-a2ui/references/mcp-pipeline-ops.md +0 -106
- package/skills/adia-ui-a2ui/references/mcp-tool-reference.md +0 -398
- package/skills/adia-ui-a2ui/references/pipeline-overview.md +0 -175
- package/skills/adia-ui-a2ui/references/semantic-fail-lifting.md +0 -120
- package/skills/adia-ui-a2ui/references/strategy-engines.md +0 -111
- package/skills/adia-ui-a2ui/references/teach-protocol.md +0 -220
- package/skills/adia-ui-a2ui/references/zettel-calibration.md +0 -93
- package/skills/adia-ui-a2ui/scripts/audit-a2ui-roster.mjs +0 -96
- package/skills/adia-ui-a2ui/scripts/teach-route.mjs +0 -157
- package/skills/adia-ui-a2ui/skill.json +0 -38
- package/skills/adia-ui-authoring/CHANGELOG.md +0 -32
- package/skills/adia-ui-authoring/SKILL.md +0 -256
- package/skills/adia-ui-authoring/assets/case-studies/admin-shell-decomposition.md +0 -101
- package/skills/adia-ui-authoring/assets/case-studies/maxtokens-32768-discovery.md +0 -109
- package/skills/adia-ui-authoring/assets/case-studies/theme-panel-promotion.md +0 -113
- package/skills/adia-ui-authoring/evals/adversarial-design-plan-gates.json +0 -138
- package/skills/adia-ui-authoring/evals/routing-corpus.json +0 -245
- package/skills/adia-ui-authoring/references/canonical-pattern-index.md +0 -179
- package/skills/adia-ui-authoring/references/common-gotchas.md +0 -93
- package/skills/adia-ui-authoring/references/composite-demo-protocol.md +0 -1084
- package/skills/adia-ui-authoring/references/teach-protocol.md +0 -428
- package/skills/adia-ui-authoring/scripts/audit-authoring-roster.mjs +0 -148
- package/skills/adia-ui-authoring/skill.json +0 -45
- package/skills/adia-ui-dogfood/CHANGELOG.md +0 -17
- package/skills/adia-ui-dogfood/README.md +0 -62
- package/skills/adia-ui-dogfood/SKILL.md +0 -866
- package/skills/adia-ui-dogfood/skill.json +0 -40
- package/skills/adia-ui-forge/SKILL.md +0 -88
- package/skills/adia-ui-forge/evals/routing-corpus.json +0 -30
- package/skills/adia-ui-gen-review/CHANGELOG.md +0 -108
- package/skills/adia-ui-gen-review/SKILL.md +0 -266
- package/skills/adia-ui-gen-review/references/loop-protocol.md +0 -712
- package/skills/adia-ui-gen-review/references/rubric-cosmetic.md +0 -144
- package/skills/adia-ui-gen-review/references/rubric-decompose.md +0 -117
- package/skills/adia-ui-gen-review/references/rubric-score.md +0 -249
- package/skills/adia-ui-gen-review/references/teach-protocol.md +0 -214
- package/skills/adia-ui-gen-review/skill.json +0 -23
- package/skills/adia-ui-llm/CHANGELOG.md +0 -25
- package/skills/adia-ui-llm/SKILL.md +0 -165
- package/skills/adia-ui-llm/evals/adversarial-corpus.json +0 -75
- package/skills/adia-ui-llm/evals/routing-corpus.json +0 -30
- package/skills/adia-ui-llm/evals/teach-routing-cases.json +0 -73
- package/skills/adia-ui-llm/references/teach-protocol.md +0 -78
- package/skills/adia-ui-llm/scripts/audit-llm-roster.mjs +0 -93
- package/skills/adia-ui-llm/scripts/teach-route.mjs +0 -119
- package/skills/adia-ui-llm/skill.json +0 -33
- package/skills/adia-ui-ops/CHANGELOG.md +0 -291
- package/skills/adia-ui-ops/SKILL.md +0 -401
- package/skills/adia-ui-ops/references/INDEX.md +0 -158
- package/skills/adia-ui-ops/references/audit-cadence.md +0 -263
- package/skills/adia-ui-ops/references/audit-patterns/archive-link-sweep.md +0 -96
- package/skills/adia-ui-ops/references/audit-patterns/audit-history-ledger.md +0 -162
- package/skills/adia-ui-ops/references/audit-patterns/browser-bundle-node-imports.md +0 -154
- package/skills/adia-ui-ops/references/audit-patterns/changelog-unreleased-bloat.md +0 -75
- package/skills/adia-ui-ops/references/audit-patterns/coverage-gaps.md +0 -187
- package/skills/adia-ui-ops/references/audit-patterns/entry-file-coverage.md +0 -122
- package/skills/adia-ui-ops/references/audit-patterns/format-hygiene.md +0 -217
- package/skills/adia-ui-ops/references/audit-patterns/lockstep-versioning.md +0 -113
- package/skills/adia-ui-ops/references/audit-patterns/memory-fragmentation.md +0 -180
- package/skills/adia-ui-ops/references/audit-patterns/orphan-detection.md +0 -202
- package/skills/adia-ui-ops/references/audit-patterns/pointer-validation.md +0 -180
- package/skills/adia-ui-ops/references/audit-patterns/redundancy-detection.md +0 -210
- package/skills/adia-ui-ops/references/audit-patterns/spec-dating-sweep.md +0 -91
- package/skills/adia-ui-ops/references/audit-patterns/stale-content.md +0 -182
- package/skills/adia-ui-ops/references/audit-patterns/staleness-tooling.md +0 -156
- package/skills/adia-ui-ops/references/audit-patterns/token-waste-detection.md +0 -196
- package/skills/adia-ui-ops/references/doc-types/adr-pattern.md +0 -210
- package/skills/adia-ui-ops/references/doc-types/architecture-md.md +0 -190
- package/skills/adia-ui-ops/references/doc-types/changelog.md +0 -183
- package/skills/adia-ui-ops/references/doc-types/decisions-log.md +0 -146
- package/skills/adia-ui-ops/references/doc-types/plan-roadmap.md +0 -182
- package/skills/adia-ui-ops/references/doc-types/postmortem-pattern.md +0 -206
- package/skills/adia-ui-ops/references/genres/prose-and-writing.md +0 -149
- package/skills/adia-ui-ops/references/guidance/context-budget.md +0 -137
- package/skills/adia-ui-ops/references/guidance/llm-doc-writing.md +0 -116
- package/skills/adia-ui-ops/references/guidance/reliability-dial.md +0 -186
- package/skills/adia-ui-ops/references/recipes/adr-introduction.md +0 -211
- package/skills/adia-ui-ops/references/recipes/audit-existing-repo.md +0 -234
- package/skills/adia-ui-ops/references/recipes/cold-start-harvest.md +0 -263
- package/skills/adia-ui-ops/references/recipes/concurrent-learnings-merge.md +0 -158
- package/skills/adia-ui-ops/references/recipes/continuous-learning-loop.md +0 -169
- package/skills/adia-ui-ops/references/recipes/external-reference-verification.md +0 -158
- package/skills/adia-ui-ops/references/recipes/findings-index-readout.md +0 -126
- package/skills/adia-ui-ops/references/recipes/greenfield-setup.md +0 -252
- package/skills/adia-ui-ops/references/recipes/harvest-repo-brain.md +0 -169
- package/skills/adia-ui-ops/references/recipes/import-repo-brain-harvest.md +0 -153
- package/skills/adia-ui-ops/references/recipes/memory-organization.md +0 -182
- package/skills/adia-ui-ops/references/recipes/recommend-then-validate.md +0 -199
- package/skills/adia-ui-ops/references/recipes/self-healing-hooks.md +0 -366
- package/skills/adia-ui-ops/references/recipes/skill-stewardship-loop.md +0 -113
- package/skills/adia-ui-ops/references/standards/agents-md-spec.md +0 -138
- package/skills/adia-ui-ops/references/standards/claude-md-convention.md +0 -123
- package/skills/adia-ui-ops/references/standards/cross-tool-matrix.md +0 -85
- package/skills/adia-ui-ops/references/standards/readme-conventions.md +0 -232
- package/skills/adia-ui-ops/references/teach-protocol.md +0 -215
- package/skills/adia-ui-ops/scripts/audit-ops-roster.mjs +0 -104
- package/skills/adia-ui-ops/skill.json +0 -65
- package/skills/adia-ui-release/CHANGELOG.md +0 -66
- package/skills/adia-ui-release/SKILL.md +0 -323
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-batch-push-v0.6.14-v0.6.15.md +0 -144
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-corpus-drift-remediation-v0.6.15.md +0 -155
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-version-skip-correction-v0.6.12.md +0 -114
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-author-from-scratch-v0.6.18.md +0 -139
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-feedback37-retraction-v0.6.21.md +0 -124
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-fn1-enrichment-pass-v0.6.19.md +0 -125
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-stale-test-detection-v0.6.20.md +0 -142
- package/skills/adia-ui-release/assets/case-studies/2026-05-23-freshness-gate-recovery-v0.6.32.md +0 -97
- package/skills/adia-ui-release/assets/case-studies/2026-05-26-catalog-drift-recurring-v0.6.40.md +0 -147
- package/skills/adia-ui-release/assets/templates/stub-changelog.template.md +0 -22
- package/skills/adia-ui-release/evals/evals.json +0 -164
- package/skills/adia-ui-release/references/changelog-discipline.md +0 -250
- package/skills/adia-ui-release/references/cycle-happy-path.md +0 -520
- package/skills/adia-ui-release/references/exe-deploy.md +0 -149
- package/skills/adia-ui-release/references/gates-catalog.md +0 -778
- package/skills/adia-ui-release/references/independent-package-release.md +0 -129
- package/skills/adia-ui-release/references/ledger-discipline.md +0 -232
- package/skills/adia-ui-release/references/migration-guide-authoring.md +0 -174
- package/skills/adia-ui-release/references/multi-agent-baseline.md +0 -207
- package/skills/adia-ui-release/references/notes-authoring.md +0 -212
- package/skills/adia-ui-release/references/recovery-paths.md +0 -262
- package/skills/adia-ui-release/references/rollup-notes.md +0 -208
- package/skills/adia-ui-release/references/teach-protocol.md +0 -468
- package/skills/adia-ui-release/scripts/audit-gate-roster.mjs +0 -196
- package/skills/adia-ui-release/scripts/make-ledger.mjs +0 -200
- package/skills/adia-ui-release/skill.json +0 -77
- package/skills/dogfood-sweep/CHANGELOG.md +0 -37
- package/skills/dogfood-sweep/README.md +0 -105
- package/skills/dogfood-sweep/SKILL.md +0 -1000
- package/skills/dogfood-sweep/analyze.mjs +0 -600
- package/skills/dogfood-sweep/skill.json +0 -31
- /package/skills/{adia-ui-authoring → adia-author}/references/api-contract.md +0 -0
- /package/skills/{adia-ui-release → adia-release}/scripts/assert-monorepo-root.mjs +0 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# `gates-catalog.md` — pre-flight gate roster + failure → recovery map
|
|
2
|
+
|
|
3
|
+
> Load for a verify-only run or on any gate failure during a cut. Maps every
|
|
4
|
+
> release-flow gate × what it checks × typical failure × recovery. Gates are
|
|
5
|
+
> grouped by **failure category** — how the operator routes when one goes red —
|
|
6
|
+
> not by alphabetical namespace. Cited scripts live in the target monorepo's
|
|
7
|
+
> `package.json` (`check:*` / `verify:*` / `smoke:*` / `test:*`).
|
|
8
|
+
|
|
9
|
+
Row layout per gate: **What** · **Typical failure** · **Recovery**.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## §Category 1 — Release identity (hard-fail any cut)
|
|
14
|
+
|
|
15
|
+
### `npm run check:lockstep`
|
|
16
|
+
|
|
17
|
+
- **What:** all 9 `@adia-ai/*` packages declare the same `version`; internal `@adia-ai/*` dep ranges match policy (`^X.Y.0` during PATCH cycles, bumped at MINOR).
|
|
18
|
+
- **Typical failure:** one package forgot to bump; a peer edited an internal range mid-PATCH; a `^0.0.x` range slipped in.
|
|
19
|
+
- **Recovery:** version drift → `scripts/bump.mjs` (bundled with this skill); range drift → `npm run check:lockstep:fix` auto-aligns, then re-run.
|
|
20
|
+
- **Why `^0.0.x` is forbidden:** npm pre-1.0 semver only widens the caret when major+minor aren't both zero — `^0.0.6` resolves to `>=0.0.6 <0.0.7`, locked to exactly 0.0.6. An internal dep pinned that way silently installs a *stale* sibling on every fresh `npm i` (this shipped a real ~4-day-latent bug before the lockstep policy). The `^X.Y.0` floor (Y≥1) widens correctly across patches; trust the gate, don't reason about caret semantics by hand. Moot at 1.0.0.
|
|
21
|
+
|
|
22
|
+
### `node scripts/release/check-release.mjs --all-pending` (F-N1, the release trip-wire)
|
|
23
|
+
|
|
24
|
+
- **What:** for every unpushed tag, verifies CHANGELOG coverage of the diff between this tag and the package's previous tag.
|
|
25
|
+
- **Cosmetic failure:** "diff `packages/<pkg>/components/` touched but CHANGELOG `[X.Y.Z]` doesn't mention 'components'" — the entry names the component (`table-ui`) but not the literal path keyword. Regex miss, change IS documented.
|
|
26
|
+
- **Real failure:** a touched directory has NO matching CHANGELOG entry at all — the cycle missed documenting a change.
|
|
27
|
+
- **Recovery:** cosmetic → add the path keyword to a relevant entry (`table.yaml` → `components/table/table.yaml`); real → author the missing entry. Either way: amend the release commit, delete + re-create the tags at the new SHA, re-run. Full discipline: [`changelog-discipline.md`](changelog-discipline.md) §F-N1 enrichment.
|
|
28
|
+
- The umbrella tag's "doesn't match `<pkg>-v<version>`" **error is expected — ignore it**; only per-package warns need action.
|
|
29
|
+
|
|
30
|
+
### `npm run check:changelog-coverage`
|
|
31
|
+
|
|
32
|
+
- **What:** every published package has a `[vX.Y.Z]` CHANGELOG block for the current `package.json` version.
|
|
33
|
+
- **Recovery:** add the block (stub if genuinely no source change — but classify by the diff first, see [`changelog-discipline.md`](changelog-discipline.md) §Detecting source-changing packages).
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## §Category 2 — Generated-file coherence (hard-fail any cut)
|
|
38
|
+
|
|
39
|
+
### `node scripts/build/components.mjs --verify`
|
|
40
|
+
|
|
41
|
+
- **What:** every component yaml has an up-to-date `.a2ui.json` sidecar; `.d.ts` codegen current. (Generated files are also hook-guarded against hand edits.)
|
|
42
|
+
- **Recovery:** `node scripts/build/components.mjs` (no `--verify`) regenerates; stage the sidecars.
|
|
43
|
+
|
|
44
|
+
### `npm run verify:traits`
|
|
45
|
+
|
|
46
|
+
- **What:** `traits/_catalog.json` reflects every `defineTrait()` call; 100% coverage.
|
|
47
|
+
- **Recovery:** `npm run build:traits`; stage.
|
|
48
|
+
|
|
49
|
+
### `npm run verify:a2ui-schema`
|
|
50
|
+
|
|
51
|
+
- **What:** the A2UI JSON Schema is in sync with the `@adia-ai/a2ui-runtime` TS types.
|
|
52
|
+
- **Recovery:** `node scripts/build/a2ui-schema-types.mjs`; stage.
|
|
53
|
+
|
|
54
|
+
### `npm run verify:tsconfig-strictness`
|
|
55
|
+
|
|
56
|
+
- **What:** per-package `tsconfig.json` doesn't silently relax flags set strict in `tsconfig.base.json` (ADR-0029). A relaxation needs a `// TS-MIG-NNN` tracking comment.
|
|
57
|
+
- **Recovery:** remove the override, or add the tracking comment.
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## §Category 3 — Component / primitive structural drift
|
|
62
|
+
|
|
63
|
+
### `npm run check:demo-shells`
|
|
64
|
+
|
|
65
|
+
- **What:** every component demo `.html` imports all primitives named in its yaml `composes:` list.
|
|
66
|
+
- **Typical failure:** a yaml gained a `composes:` entry but the demo shell didn't get the matching `<script>` import.
|
|
67
|
+
- **Recovery:** add `<script type="module" src="../<tag>/<tag>.js">` to the demo shell. **Release-blocking: HIGH** — a commit failing this gate ships broken demo pages in its tarball. If the fix already landed later but entangled with `[Unreleased]` work → [`recovery-paths.md`](recovery-paths.md) §Scenario 4.
|
|
68
|
+
|
|
69
|
+
Smaller siblings in this category (same recovery shape — fix the declaration or regenerate the registry):
|
|
70
|
+
|
|
71
|
+
| Gate | What |
|
|
72
|
+
| --- | --- |
|
|
73
|
+
| `check:composes` | every yaml `composes:` entry resolves to a real primitive |
|
|
74
|
+
| `check:dts-sibling-presence` | every component `.js` has a sibling `.d.ts` |
|
|
75
|
+
| `check:registry-catalog-coherence` | runtime registry ↔ A2UI catalog parity (both directions) |
|
|
76
|
+
| `check:required-icons` | every referenced `<icon-ui>` name is registered |
|
|
77
|
+
| `check:standalone-html-phosphor` | standalone demos using Phosphor icons include the loader |
|
|
78
|
+
| `check:substitutable-set-drift` | substitutable-element registry in sync |
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## §Category 4 — CSS spec compatibility
|
|
83
|
+
|
|
84
|
+
### `npm run check:lightningcss-build`
|
|
85
|
+
|
|
86
|
+
- **What:** every CSS file under `packages/web-{components,modules}/` minifies cleanly under LightningCSS + current Vite default targets.
|
|
87
|
+
- **Recovery:** fix the offending CSS. Most common sub-case ↓
|
|
88
|
+
|
|
89
|
+
### `npm run check:scope-bare-descendants`
|
|
90
|
+
|
|
91
|
+
- **What:** no `@scope { > X {} }` bare-combinator descendants (LightningCSS rejects as "Invalid empty selector").
|
|
92
|
+
- **Recovery:** `node scripts/build/codemod-scope-bare-descendants.mjs` rewrites `> X` → `& > X`.
|
|
93
|
+
|
|
94
|
+
Also: `check:no-self-import-css` (no transitively self-importing barrel) · `check:rolldown-glob` (`import.meta.glob` works under Rolldown).
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## §Category 5 — Browser safety / module hygiene
|
|
99
|
+
|
|
100
|
+
### `npm run check:browser-safe`
|
|
101
|
+
|
|
102
|
+
- **What:** no top-level `import 'node:*'` in browser-reachable modules (`packages/a2ui/{compose,retrieval,validator}`, `web-components/`, `web-modules/`, `apps/*/app/*.contents.js`).
|
|
103
|
+
- **Recovery:** dual-mode pattern (`IS_NODE` + dynamic `await import(/* @vite-ignore */ 'node:*')` + `import.meta.glob` browser branch); canonical impl: `packages/a2ui/retrieval/component-catalog.js`.
|
|
104
|
+
|
|
105
|
+
Siblings: `check:absolute-imports` (no leading-`/` imports — rewrite relative) · `check:template-interp` (template `${expr}` contract) · `check:yaml-events` (yaml `events:` match runtime `dispatchEvent` calls) · `check:yaml-impl-coverage` (every yaml prop implemented in the JS class).
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## §Category 6 — Visual / structural integrity
|
|
110
|
+
|
|
111
|
+
| Gate | What |
|
|
112
|
+
| --- | --- |
|
|
113
|
+
| `check:card-structure` / `check:drawer-structure` | card/drawer body wraps in `<section>` (strict variants of the `audit:*` twins) |
|
|
114
|
+
| `check:with-css-pairing` | every shell with paired `.js` + `.css` has a `/with-css` companion + exports-map entry |
|
|
115
|
+
| `verify:no-legacy-shell-shapes` | no legacy `<main>` / `[data-content-*]` shapes under `<admin-shell>` (ADR-0032) |
|
|
116
|
+
| `audit:native-primitive-leak` | native `<button>`/`<input>`/… where a `*-ui` equivalent exists; criticals must be replaced or annotated `data-native-ok="<reason>"` |
|
|
117
|
+
| `audit:shell-composition` | admin-shell compositions missing canonical parts (statusbar, `[data-spacer]`/`[data-actions]`, …); escape hatch `data-shell-opt-out="<reason>"` |
|
|
118
|
+
|
|
119
|
+
The two `audit:*` probes are soft-fail pre-cut (exit-1 only on criticals); findings get folded into release notes if non-zero. Recovery for both is manual — slot/attr semantics need a human eyeball, never auto-fix.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## §Category 7 — Corpus / bundle freshness
|
|
124
|
+
|
|
125
|
+
### `npm run verify:corpus`
|
|
126
|
+
|
|
127
|
+
- **What:** every chunk in `packages/a2ui/corpus/chunks/*.json` is reachable and well-formed.
|
|
128
|
+
- **Recovery:** corpus remediation routes to the A2UI-pipeline skill, not this one.
|
|
129
|
+
|
|
130
|
+
### `npm run check:chunks-fresh`
|
|
131
|
+
|
|
132
|
+
- **What:** `chunks/_index.json` matches on-disk chunks and source fragments.
|
|
133
|
+
- **Recovery:** `npm run harvest:chunks`; stage the corpus outputs.
|
|
134
|
+
|
|
135
|
+
### `npm run check:embeddings-fresh`
|
|
136
|
+
|
|
137
|
+
- **What:** `chunk-embeddings.json` at-or-newer-than `chunks/_index.json`.
|
|
138
|
+
- **Recovery:** `npm run build:embeddings:chunks` (needs `OPENAI_API_KEY`; ~6s). Stage `chunk-embeddings.json` + note the regen in the a2ui-corpus CHANGELOG `[vX.Y.Z]`.
|
|
139
|
+
|
|
140
|
+
### `npm run check:css-bundles-fresh` / `npm run check:js-bundles-fresh`
|
|
141
|
+
|
|
142
|
+
- **What:** the `dist/` CDN bundles (`web-components.min.{css,js}`, `everything.min.js`, per-shell `*.min.js`, `icons-manifest.js`) match source. Stale bundles mean jsdelivr/unpkg serve yesterday's build. **Blocking in CI** (2026-06-08).
|
|
143
|
+
- **Recovery:** `npm run build -w @adia-ai/llm` **FIRST** (its `index.js` is a gitignored tsc artifact `build:bundle-js` resolves — a fresh worktree can't bundle without it), then `npm run build:bundles` (or `build:bundle-css` / `build:bundle-js` individually). Stage both `dist/` trees.
|
|
144
|
+
- **Manual spot-checks** (complement the gate; the v0.6.29–31 cycles shipped a shells-only `everything.min.js` that hard-crashed CDN consumers):
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
grep "import '@adia-ai/web-components'" packages/web-modules/everything.js # must be present
|
|
148
|
+
grep -oE '"[a-z][a-z-]*-ui"' packages/web-modules/dist/everything.min.js | sort -u | wc -l # ≥100
|
|
149
|
+
node -e "const m=require('./packages/web-components/dist/icons-manifest.js'); \
|
|
150
|
+
console.log('regular:', m.default.regular.length, '| cdn:', m.default.cdn)" # non-empty + cdn key
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### `npm run audit:chunk-reconcile`
|
|
154
|
+
|
|
155
|
+
- **What:** duplicate-reconciliation report for the chunk corpus (fingerprint collisions, near-duplicates, structural twins). Advisory, not blocking.
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## §Category 8 — Tests + types + evals
|
|
160
|
+
|
|
161
|
+
### `npm run test:unit`
|
|
162
|
+
|
|
163
|
+
- **What:** the vitest suite (~1000+ tests).
|
|
164
|
+
- **Stale-test failure:** the test asserts a behavior a peer deliberately changed (CHANGELOG-documented) without updating the assertion. Tell it apart by reading assertion vs CHANGELOG vs source: if the code matches the CHANGELOG's described behavior, the test is stale — update the assertion (see [`recovery-paths.md`](recovery-paths.md) §Scenario 5). Real regression → fix the regression.
|
|
165
|
+
- **Parallel-contention flake:** heavy web-modules composite suites can fail under full parallelism on a loaded machine (`signals: drain loop exceeded 100 iterations`). Load-dependent, not a code defect. **Gate on `npx vitest run --no-file-parallelism`** (sequential is the source of truth); don't treat a one-off parallel flake as a blocker, and don't raise the drain guard.
|
|
166
|
+
|
|
167
|
+
### `npm run eval:diff -- --engine zettel`
|
|
168
|
+
|
|
169
|
+
- **What:** end-to-end gen-UI eval. Floors (preserve-not-regress):
|
|
170
|
+
- **Zettel**: cov ≥ 87%, avg ≥ 85, MRR ≥ 0.94
|
|
171
|
+
- **Free-form**: cov ≥ 90%, avg ≥ 83, F1 ≥ 55
|
|
172
|
+
- **Monolithic**: cov = 100%, avg ≥ 95
|
|
173
|
+
- **Dogfood**: 20/20, avg ≥ 95
|
|
174
|
+
- **Recovery:** retrieval/corpus regression — routes to the A2UI-pipeline skill.
|
|
175
|
+
|
|
176
|
+
Siblings: `typecheck` (`tsc --noEmit`) · `smoke:engines` (gen-UI engines + retrieval probes) · `smoke:register-engine` (11/11) · `test:a2ui` (22/22, +1 skipped OK).
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## §Category 9 — Misc release safety
|
|
181
|
+
|
|
182
|
+
### `npm run dogfood:status`
|
|
183
|
+
|
|
184
|
+
- **What:** aggregator over the component dogfood audits; classifies findings P0–P3 and regenerates the tracker at `qa/findings/dogfood-tracker.md`. Exit-1 when P0+P1 > 0; P2/P3 are advisory.
|
|
185
|
+
- **Pre-cut policy: must pass before tag.** Any P0/P1 means a paid-down bug class was re-introduced; open the tracker, apply the canonical fix template at the cited file:line, re-run. ~5s.
|
|
186
|
+
|
|
187
|
+
### `npm run verify:pack`
|
|
188
|
+
|
|
189
|
+
- **What:** `npm pack --dry-run` succeeds per package — catches malformed `files`/`exports`. Note: the npm `files:` array supports negation (`!components/**/*.html`); verify tarball contents with `--dry-run` after touching it.
|
|
190
|
+
|
|
191
|
+
Siblings: `check:links` (intra-repo markdown links resolve) · `check:cdn-pins` (docs' CDN `@0.X` pins match the current minor — catches a stale `@0.6` after a `0.7` cut) · `verify:contrast` / `verify:palette` (WCAG pairs / OKLCH ramps).
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## §Standard subsets
|
|
196
|
+
|
|
197
|
+
**Minimum 6 (verify-only default)** — fastest set that catches release-blockers:
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
node scripts/build/components.mjs --verify
|
|
201
|
+
npm run check:lockstep
|
|
202
|
+
npm run verify:traits
|
|
203
|
+
npm run test:unit
|
|
204
|
+
npm run typecheck
|
|
205
|
+
npm run check:demo-shells
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Add `verify:corpus` + `check:embeddings-fresh` if chunks were touched; `check:lightningcss-build` if CSS was touched; F-N1 if unpushed release tags exist.
|
|
209
|
+
|
|
210
|
+
**Full pre-cut sweep** — the 17-gate roster in [`cut-procedure.md`](cut-procedure.md) §Step 3. ~90s wall time.
|
|
211
|
+
|
|
212
|
+
**Omnibus** — `npm run check` invokes everything. Heavy; use when re-baselining a stale checkout.
|
|
213
|
+
|
|
214
|
+
**Suffix variants:** most gates have `:strict` (warns fail), `:fix` (auto-apply, e.g. `check:lockstep:fix`), `:json` / `:quiet` (output form) variants.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## §Gate stewardship
|
|
219
|
+
|
|
220
|
+
- **This catalog must stay in sync with `package.json` `scripts`.** When a cycle meets a release-flow gate not listed here, add its row in the same change.
|
|
221
|
+
- **New CI gates ship advisory first** (`continue-on-error: true`), promoted to blocking after 5+ green runs. Two freshness-gate traps: mtime checks are permanently red on fresh `actions/checkout` (clone-time mtimes — need `fetch-depth: 0` + git-restore-mtime); a dir-watching gate needs its own workflow whose `pull_request: paths:` covers the watched dirs.
|
|
222
|
+
- **New/extended `scripts/release/check-*.mjs` slots run against `main` immediately**; close every finding same-cycle. Before adding a slot, grep the existing ones — the gap is often a regex limit in a current slot, not a missing slot.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# `independent-package-release.md` — class-B cut (independently-versioned package)
|
|
2
|
+
|
|
3
|
+
> Load when releasing a package versioned **independently** of the lockstep set —
|
|
4
|
+
> excluded from the lockstep gate, no umbrella tag, no demo-site deploy.
|
|
5
|
+
> **Class B currently has NO members** (2026-07-15 policy change, operator
|
|
6
|
+
> ruling): the Claude Code plugins under `packages/plugins/*` joined the
|
|
7
|
+
> lockstep after class-B independence let npm drift a full harness-reset
|
|
8
|
+
> behind the repo (npm served forge 0.1.3/factory 0.2.4 pre-reset content
|
|
9
|
+
> while the rewritten estate sat unpublished at a regressed 0.1.0). This
|
|
10
|
+
> procedure is retained for future genuinely-independent packages. The
|
|
11
|
+
> lockstep cut is [`cut-procedure.md`](cut-procedure.md).
|
|
12
|
+
|
|
13
|
+
## §Two release classes in one monorepo
|
|
14
|
+
|
|
15
|
+
| | Class A — lockstep cut | Class B — independent package |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| Versioning | whole set bumps together | own version line per package |
|
|
18
|
+
| Lockstep gate | enforced (`check:lockstep` 9/9) | **excluded** — the gate skips `packages/plugins/*` by design |
|
|
19
|
+
| Umbrella tag | `vX.Y.Z` + per-package | **none** — per-package tags only (versions differ) |
|
|
20
|
+
| `dist-tag` ordering | cross-package publish order matters | N/A |
|
|
21
|
+
| Demo-site deploy | yes | **none** |
|
|
22
|
+
| Publish trigger | tag-triggered per-package workflow | same mechanism (`.github/workflows/publish-adia-ui-{factory,forge}.yml`) |
|
|
23
|
+
|
|
24
|
+
Class B keeps the operator checkpoints and the verify-against-the-registry discipline; it drops every lockstep-specific invariant.
|
|
25
|
+
|
|
26
|
+
## §New-package onboarding — the three trip-wires a FIRST cut hits
|
|
27
|
+
|
|
28
|
+
Substrate fixes (release scripts / lockfile / CHANGELOG), landed once as a normal PR on `main` *before* tagging:
|
|
29
|
+
|
|
30
|
+
1. **Lockfile.** A new workspace package absent from the lockfile blocks the pre-commit hook and fails the workflow's `npm ci`. Fix: `npm install --package-lock-only && git add package-lock.json`.
|
|
31
|
+
2. **Release-trip-wire package registry.** F-N1 validates each pushed tag against `scripts/release/check-release.mjs`'s hardcoded `PACKAGES` array; an unregistered tag fails the pre-push hook with `unknown package`. Fix: add `{ tagPrefix: '<name>', path: 'packages/plugins/<name>' }`.
|
|
32
|
+
3. **CHANGELOG bracket form.** The trip-wire requires Keep-a-Changelog `## [<version>]` headings; bare `## <version>` fails with "no `## [<version>]` entry".
|
|
33
|
+
|
|
34
|
+
## §Procedure
|
|
35
|
+
|
|
36
|
+
1. **Re-baseline** — `git fetch`; confirm the checkout isn't on a peer's branch.
|
|
37
|
+
2. **Land the package(s) on `main`** via PR; resolve every review thread before an admin-merge (this repo's merge gate).
|
|
38
|
+
3. **Pre-publish gate.** `npm run verify:plugins` (package.json ↔ plugin-manifest versions synced). Plugin-specific structural gates: `npm run audit:plugin-coupling` + `npm run check:factory-bare-repo` (ADR-0040 — the plugin must work in a bare consumer repo, no monorepo coupling). The lockstep gate still passes for the lockstep set. First publish of a name: `npm view @adia-ai/<pkg> version` → `E404` means the name is free.
|
|
39
|
+
4. **Tag at the published commit** — `git tag <pkg>-vX.Y.Z` per package; versions differ; no umbrella. Dry-run the trip-wire over the tags (`node scripts/release/check-release.mjs <tags>`) before pushing. If the shared working tree is on a peer's branch, push tags from a throwaway worktree on `origin/main`.
|
|
40
|
+
5. **Push the tags** → the per-package workflows run `npm ci → verify:plugins → npm publish --access public`.
|
|
41
|
+
6. **Verify against npm, not the workflow:** `npm view @adia-ai/<pkg> version` returns the new independent version for each package. Watch runs (`gh run watch <id> --exit-status`), but the registry is the source of truth.
|
|
42
|
+
7. **Marketplace cut-over** (if a plugin marketplace repo exists): point the manifest's per-plugin `source` at npm (`{ "source": "npm", "package": "@adia-ai/<pkg>" }`), `git rm -r` vendored copies, validate the JSON, commit, push. Consumers then `/plugin marketplace add <org>/<repo>` → `/plugin install <pkg>@<repo>`.
|
|
43
|
+
|
|
44
|
+
## §Verify target
|
|
45
|
+
|
|
46
|
+
The published package(s) on the **npm registry** at their independent versions, plus (if a marketplace exists) its manifest referencing npm. NOT "all 9 + the demo site" — that's class A.
|
|
47
|
+
|
|
48
|
+
## §Gotchas (from the first independent cut, factory v0.2.2 + forge v0.1.2)
|
|
49
|
+
|
|
50
|
+
- Never add the package to the lockstep gate or tag it with the umbrella.
|
|
51
|
+
- Publish-workflow YAMLs are token-bearing — keep `persist-credentials: false` on the checkout step, matching the established workflows' action-pinning.
|
|
52
|
+
- A marketplace repo's org + visibility is an **operator call** — a public `gh repo create` is outward-facing; confirm first, and run a secret-scan of full history before pushing any repo public.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# `migration-guide-authoring.md` — authoring the MIGRATION GUIDE on a breaking cut
|
|
2
|
+
|
|
3
|
+
> Load whenever the cut is **MINOR** (an API-surface break) or on an explicit
|
|
4
|
+
> "author the migration guide" ask. This is the **producer** side of migrations:
|
|
5
|
+
> the release ships the breaking change, so the release authors the guide section
|
|
6
|
+
> consumers follow. The shared producer/consumer format contract is
|
|
7
|
+
> [`../../../references/contracts/migration-guide-format.md`](../../../references/contracts/migration-guide-format.md)
|
|
8
|
+
> — the factory's `adia-migrate` skill consumes exactly that shape.
|
|
9
|
+
>
|
|
10
|
+
> Scope split: **producer (this skill)** authors the guide section + migrates the
|
|
11
|
+
> framework's own in-repo surfaces. **Consumer** (a downstream app sweep) is the
|
|
12
|
+
> factory plugin's `adia-migrate` — decline and redirect. Designing the breaking
|
|
13
|
+
> change itself is a contract decision upstream of both.
|
|
14
|
+
|
|
15
|
+
The guide lives at **`.claude/docs/MIGRATION GUIDE.md`** (the space in the filename is intentional; it's a first-class consumer artifact). One section per breaking release, newest at top; a consumer jumping versions reads the merged span. Every cut — breaking or not — gets a version-scope bullet in the top index (see the format contract).
|
|
16
|
+
|
|
17
|
+
## §When a section is owed
|
|
18
|
+
|
|
19
|
+
Author (or extend) a section when the cut removes or renames a **public API symbol**: a prop/attribute (`variant="danger"` → `color="danger"`), a slot or slot-semantics flip, an event name, a token (`--n-*` → `--a-*`), a tag, a Boolean → enum migration, or a default-value change wide enough that consumers must act. Same line as the PATCH-vs-MINOR rule: cutting MINOR almost certainly owes a section. Additive cuts need none — note "additive; no consumer sweep" in the version-coverage table and move on.
|
|
20
|
+
|
|
21
|
+
## §The authoring workflow
|
|
22
|
+
|
|
23
|
+
**1. Enumerate the breaking surface** from the cut's diff + CHANGELOG `### Removed`/`### Changed` entries. Per item capture: the symbol · before → after · the kind (pure rename / semantic flip / Boolean→enum / removal) · the audit grep · the sweep (or "manual review").
|
|
24
|
+
|
|
25
|
+
**2. Write the section** — one `###` subsection per item:
|
|
26
|
+
|
|
27
|
+
```markdown
|
|
28
|
+
## Migrating to @adia-ai/web-components@X.Y.Z (YYYY-MM-DD)
|
|
29
|
+
|
|
30
|
+
<one-line scope: N breaking items, the headline.>
|
|
31
|
+
|
|
32
|
+
### <item — bold headline> (`old` → `new`)
|
|
33
|
+
|
|
34
|
+
<one sentence: what changed and why.>
|
|
35
|
+
|
|
36
|
+
**Audit:**
|
|
37
|
+
git grep -nE '<pattern that surfaces call sites>'
|
|
38
|
+
|
|
39
|
+
**Sweep:**
|
|
40
|
+
git grep -nlE '<pattern>' | xargs perl -i -pe 's/<old>/<new>/g'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Shape rules:
|
|
44
|
+
|
|
45
|
+
- **Audit grep first, sweep second** — the consumer always lists call sites before sweeping; author both.
|
|
46
|
+
- **Mechanical vs manual, explicitly labeled.** A pure rename ships a `perl -i -pe`; a semantic flip ships a "manual review — here's why" note (sed can't tell author intent).
|
|
47
|
+
- **One component per sweep regex** — alternation captures (`<(toast|alert)-ui`) don't preserve the matched alternative cleanly.
|
|
48
|
+
- **HTML-attribute regexes only match HTML/JSX** — author a separate JS-side regex when the symbol has a programmatic form (`el.variant = 'danger'`).
|
|
49
|
+
|
|
50
|
+
**3. Migrate the in-repo surfaces FIRST.** Before the cut ships, run the audit + sweep against `apps/`, `playgrounds/`, `catalog/`, `packages/web-components/components/*/*.html` — the release must not ship broken examples of the thing it changed, and dogfooding the recipe here is what proves it works for consumers.
|
|
51
|
+
|
|
52
|
+
**4. Verify.** Run the cut's normal gate roster; the structural/demo gates catch missed in-repo surfaces. Then the **sweep-verification grep** across ALL extensions — the trap is a vocabulary migration that touched markup but not the CSS selectors or JS comments referencing it:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
LEGACY_PATTERNS=( '<old-tag' 'old-attr=' '--old-token' )
|
|
56
|
+
for pat in "${LEGACY_PATTERNS[@]}"; do
|
|
57
|
+
echo "=== $pat ==="
|
|
58
|
+
grep -rln -E "$pat" apps playgrounds catalog \
|
|
59
|
+
--include='*.css' --include='*.html' --include='*.js' --include='*.yaml'
|
|
60
|
+
done # 0 hits = sweep verified clean
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**5. Cross-reference.** The breaking package's CHANGELOG entry names the symbol AND points at the guide section; the release notes carry a `⚠️` heads-up linking it. Anchors are stable — never retitle an existing section (release notes and consumer tooling link them).
|
|
64
|
+
|
|
65
|
+
## §Manual-review classes (never auto-sweep)
|
|
66
|
+
|
|
67
|
+
- **Semantic flips** — a rename that inverts default behavior (`[open]` default-hidden → `[collapsed]` default-visible): the right migration depends on author intent. List occurrences, ask.
|
|
68
|
+
- **Opt-out Booleans defaulting true** — the migration only matters where a consumer explicitly disabled the affordance; sed can't tell.
|
|
69
|
+
- **Ownership moves** — a prop moving from wrapper to slotted child; the target child may not exist yet.
|
|
70
|
+
- **kebab-string property keys** — attribute name unchanged, only the JS programmatic form changed; audit programmatic access only.
|
|
71
|
+
- **Wide namespace renames (50+ symbols)** — tag/token/class rename waves: list by table, require human approval per cluster; blind sweeps hit false positives on shared prefixes.
|
|
72
|
+
|
|
73
|
+
## §The version-coverage table
|
|
74
|
+
|
|
75
|
+
Maintained at the top of the guide; classifies every release so a gap-jumping consumer knows which sections apply: `additive` (bump and go) · `BREAKING (N items)` (has a section) · `structural` (import retargeting) · `rename` (wide namespace rename, manual-review by cluster). Note forward-looking volatile surfaces at the bottom of the guide so the next breaking-release author knows where churn concentrates.
|
|
76
|
+
|
|
77
|
+
## §Anti-patterns
|
|
78
|
+
|
|
79
|
+
Authoring the guide after the cut ships (it's part of the release scope) · a `perl -i -pe` for a semantic flip · merged alternation sweeps · skipping the in-repo sweep · a CHANGELOG bullet with no guide section for a real break (the CHANGELOG says *what*, the guide says *how*) · doing the consumer sweep from here.
|
|
80
|
+
|
|
81
|
+
## §Done when
|
|
82
|
+
|
|
83
|
+
1. Every breaking item in the cut's CHANGELOG has a matching subsection (audit + sweep, or a labeled manual-review note).
|
|
84
|
+
2. In-repo surfaces swept; the sweep-verification grep reports 0 legacy hits.
|
|
85
|
+
3. The cut's structural/demo gates pass.
|
|
86
|
+
4. The release notes carry the `⚠️` heads-up linking the section.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# `notes-authoring.md` — release notes: GH body · Slack post · multi-version rollup
|
|
2
|
+
|
|
3
|
+
> Load for the end-of-cycle notes step or a notes-only request. The GH release
|
|
4
|
+
> body attached to each per-package tag is the **durable record**; drafts live in
|
|
5
|
+
> the session scratch dir and the operator copy-pastes — the skill never posts to
|
|
6
|
+
> Slack directly.
|
|
7
|
+
|
|
8
|
+
## §Author from the diff, not the intent
|
|
9
|
+
|
|
10
|
+
Draft every note from `git diff <prev-tag>..HEAD` — what actually shipped — never from an ADR's intent or a PR's plan. The first two commands of any draft:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
git log --oneline <prev-tag>..HEAD
|
|
14
|
+
git diff --stat <prev-tag>..HEAD
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
If the diff contradicts the plan (a feature deferred, a refactor split across cuts), the notes follow the diff. This is a discipline because the inverse shipped a real defect: notes copied from an ADR once claimed features that were never staged into the cut. F-N1 catches *undocumented diff*, not *over-claimed notes* — that guard is the author's.
|
|
18
|
+
|
|
19
|
+
## §The GH release body (single version, ~80–200 lines)
|
|
20
|
+
|
|
21
|
+
All 9 packages get the same body (`gh release create <pkg>-vX.Y.Z --notes-file …`).
|
|
22
|
+
|
|
23
|
+
```markdown
|
|
24
|
+
## vX.Y.Z — <one-line tagline>
|
|
25
|
+
|
|
26
|
+
9-package lockstep **PATCH** cut. <One sentence on scope.>
|
|
27
|
+
|
|
28
|
+
### `@adia-ai/<substantive-pkg>`
|
|
29
|
+
- **<Bold-prefix headline>.** <Why → what → inline file paths.> Closes <FEEDBACK-NN>.
|
|
30
|
+
|
|
31
|
+
### Ride-along stubs
|
|
32
|
+
`@adia-ai/<pkg1>`, `@adia-ai/<pkg2>`, … — version bump only.
|
|
33
|
+
|
|
34
|
+
### Verification
|
|
35
|
+
- `check:lockstep` OK at `X.Y.Z / ^X.Y.0`
|
|
36
|
+
- **N/N vitest** · typecheck clean · `components --verify` clean · `verify:traits` 100%
|
|
37
|
+
- `check:demo-shells` · `check:lightningcss-build` · `verify:corpus` 0/0 · `check:embeddings-fresh` OK
|
|
38
|
+
- `smoke:engines` · `smoke:register-engine` 11/11 · `eval:diff zettel` cov=N% avg=N · `check:links` clean
|
|
39
|
+
|
|
40
|
+
### Install
|
|
41
|
+
npm i @adia-ai/web-components@X.Y.Z @adia-ai/web-modules@X.Y.Z
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Shape rules: open with the tagline, no preamble; group by `### @adia-ai/<pkg>`; bold-prefix every bullet then why → what → files; cite tickets by ID; before/after fenced blocks for consumer-facing markup changes; paste the verification block from the actual pre-flight output (the cycle-to-cycle repetition is a feature); a breaking cut adds a `⚠️` paragraph linking its MIGRATION GUIDE section. Anti-patterns: marketing language, vague verbs, missing file paths.
|
|
45
|
+
|
|
46
|
+
## §The Slack post (~40–80 lines)
|
|
47
|
+
|
|
48
|
+
```markdown
|
|
49
|
+
🚀 **AdiaUI vX.Y.Z** is out — <tagline>
|
|
50
|
+
|
|
51
|
+
npm i @adia-ai/web-components@X.Y.Z @adia-ai/web-modules@X.Y.Z
|
|
52
|
+
|
|
53
|
+
9-package lockstep PATCH cut. <One sentence.>
|
|
54
|
+
|
|
55
|
+
## 🔷 `@adia-ai/<pkg>` — <headline>
|
|
56
|
+
<2–4 sentences.> Closes <FEEDBACK-NN>.
|
|
57
|
+
|
|
58
|
+
## ✅ Verification
|
|
59
|
+
<one line>
|
|
60
|
+
|
|
61
|
+
## 📚 Links
|
|
62
|
+
- GH Releases: https://github.com/adiahealth/gen-ui-kit/releases (filter `vX.Y.Z`)
|
|
63
|
+
- Live demos: https://ui-kit.exe.xyz/site/playground/gen-ui
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- **Install matrix is mandatory, npm + CDN, both packages**: npm always names `web-components` AND `web-modules`; the CDN block pins the `@0.X` minor range — `web-components@0.X/dist/web-components.min.{css,js}` plus `web-modules@0.X/dist/everything.min.js` as the all-in-one `<script>`.
|
|
67
|
+
- Section emojis: 🔷 feature · 🛠️ DX fix · 🎨 visual · 🧹 cleanup · ⚠️ breaking/behavior · ✅ verification · 📚 links.
|
|
68
|
+
- Slack renders standard markdown (fenced blocks, `-` bullets, `[text](URL)`); no legacy mrkdwn needed.
|
|
69
|
+
- **Every `https://ui-kit.exe.xyz/site/<route>` URL must be verified against `site/sitemap.json` first** — the docs site is an SPA; an unmatched route returns 200 and renders blank, so curl proves nothing. The Gen UI Canvas is `/site/playground/gen-ui`; there is no `/site/gen-ui/`.
|
|
70
|
+
|
|
71
|
+
Save drafts to the session scratch dir (e.g. `<scratch>/release-vX.Y.Z/notes.md`); strip nothing for Slack, and the GH body is the same content without the rocket header.
|
|
72
|
+
|
|
73
|
+
## §Rollup — multi-version retrospective (≥2 versions since the last broadcast)
|
|
74
|
+
|
|
75
|
+
Audience: consumers or teammates catching up on a window (vA.B.C → vX.Y.Z). Five-section skeleton:
|
|
76
|
+
|
|
77
|
+
1. **Header** — `🚀 AdiaUI vA.B.C → vX.Y.Z — <tagline>` + install snippet + 2–4 sentences on the window (releases count, what held across all of them, e.g. "internal deps held at ^0.X.0 throughout").
|
|
78
|
+
2. **🧵 Framing section — pick ONE:**
|
|
79
|
+
- **A. The arcs** — 2–4 thematic strands, each naming its contributing versions. Best mid-cycle with no dominant theme.
|
|
80
|
+
- **B. The headline event** — one milestone (graduation, ADR ratification) with the package cuts as substrate. Best for milestone windows.
|
|
81
|
+
- **C. Net deltas** — what consumers see differently end-to-end: new primitives / new APIs / breaking-ish / retired, as a bullet list. Best when the window includes a MINOR or a consumer is jumping a big gap.
|
|
82
|
+
3. **📦 Per-version breakdown** — one block per version: `### vN.M.X — <tagline>` + 3–5 bold-prefix bullets if substantive, 1–2 if small, a single sentence for stub-only versions. **Skip ride-along stubs entirely** — naming 6 no-change packages per version is noise.
|
|
83
|
+
4. **⚠️ Behavior-changes table** (only if the window has ≥2): `| Version | Change | Opt-out / migration |`.
|
|
84
|
+
5. **✅ Verification baseline** — one paragraph, not the full table: test-count growth across the window, gate roster held, eval floors held, F-N1 clean at every cut. Show the *growth* — it's the window's velocity signal. Close with one paragraph naming what the window accomplished, echoing the framing.
|
|
85
|
+
|
|
86
|
+
Save to `<scratch>/release-vA.B.C-vX.Y.Z/rollup.md`; announcement-grade rollups (milestone, MINOR) can also land as a GH "milestone" release body — operator's call.
|
|
87
|
+
|
|
88
|
+
## §What NOT to put in notes
|
|
89
|
+
|
|
90
|
+
Internal ticket fields; implementation details with no consumer effect; "coming soon" futures; jokes — notes are a permanent artifact attached to a tag.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# `recovery-paths.md` — the 8 recovery scenarios
|
|
2
|
+
|
|
3
|
+
> Load on any F-N1 / pre-flight failure, for a batch push, or for post-release
|
|
4
|
+
> recovery. Each scenario: the **shape** (what the repo state looks like), the
|
|
5
|
+
> **resolution** (commands + judgment calls), and what to record. Every scenario
|
|
6
|
+
> is grounded in a real past incident; the durable record of a recovery is the
|
|
7
|
+
> fix commit's message + the PR description — write the "what happened / root
|
|
8
|
+
> cause / fix" there.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## §Scenario 1 — Version-skip correction
|
|
13
|
+
|
|
14
|
+
**Shape:** a peer's release commit mislabels the version — package.json bumped 0.6.X → 0.6.X+2, skipping X+1; the CHANGELOG body may narrate the work as two releases. No tags yet, npm latest still 0.6.X, commit unpushed. (Real case: a "v0.6.13" cut that was actually v0.6.12's work.)
|
|
15
|
+
|
|
16
|
+
**Resolution:**
|
|
17
|
+
|
|
18
|
+
1. Verify the skip: `npm view <pkg> versions --json | tail` (no X+1 on npm) + `git tag --list 'vX.Y.*'` (no tags). Run pre-flight at the peer's commit to confirm it's shippable.
|
|
19
|
+
2. Correct the version via a **new commit on top** (not amend — the peer's commit stays for history).
|
|
20
|
+
3. Sweep every occurrence of the wrong version: 9 × package.json, 9 × CHANGELOG (headers + body refs), any doc/CSS-comment refs, then regenerate the lockfile. Preserve filename references that intentionally encode the original label.
|
|
21
|
+
4. Commit as `fix(release): correct vX.Y.Z+1 version-skip → vX.Y.Z` documenting the discovery, then resume [`cut-procedure.md`](cut-procedure.md) at Step 5.
|
|
22
|
+
|
|
23
|
+
## §Scenario 2 — Batch push
|
|
24
|
+
|
|
25
|
+
**Shape:** multiple unpushed `release(*): vX.Y.Z` commits since the last published tag; operator asks to "publish what's accumulated."
|
|
26
|
+
|
|
27
|
+
**Resolution:**
|
|
28
|
+
|
|
29
|
+
1. Order the release commits oldest → newest.
|
|
30
|
+
2. Per version: **tag at that version's release-commit SHA** (the batch-push exception to tag-at-HEAD), run F-N1 against each tag candidate.
|
|
31
|
+
3. Push `main` once; push tags one-at-a-time (Scenario 7 prevention).
|
|
32
|
+
4. **Publish in version order, oldest first, waiting for each version's workflows to settle** before dispatching the next — `npm dist-tag latest` is set by publish order. `dispatch-publish.mjs --after <prev-version>` gates on `dist-tag latest` to enforce it. If mis-ordered: `npm dist-tag add @adia-ai/<pkg>@<newest> latest` per package.
|
|
33
|
+
5. One GH release note per version; site deploy once at the END (reflects HEAD).
|
|
34
|
+
|
|
35
|
+
## §Scenario 3 — Author from scratch (`[Unreleased]` promotion)
|
|
36
|
+
|
|
37
|
+
**Shape:** source + CHANGELOG entries landed under `## [Unreleased]`, no bump, no release commit.
|
|
38
|
+
|
|
39
|
+
**Resolution:** [`cut-procedure.md`](cut-procedure.md) Variant B; `scripts/promote-unreleased.mjs` mechanizes the heading swap; fresh blocks per [`changelog-discipline.md`](changelog-discipline.md) §Authoring.
|
|
40
|
+
|
|
41
|
+
## §Scenario 4 — `[Unreleased]` extension (early cut + entangled fix)
|
|
42
|
+
|
|
43
|
+
**Shape:** a peer pre-cut the release commit early, then landed more commits including a fix that **completes the early cut's own scope** (e.g. the demo-shell import its feature broke) entangled with unrelated `[Unreleased]` work. The early commit fails a release-blocking gate (`check:demo-shells`).
|
|
44
|
+
|
|
45
|
+
**Resolution — two options:**
|
|
46
|
+
|
|
47
|
+
1. Cherry-pick the fix onto the release commit (off-mainline tag; messy archaeology). Only when the operator explicitly wants minimal scope.
|
|
48
|
+
2. **Extend the release to HEAD** ← default. Verify HEAD passes all gates; promote the `[Unreleased]` content into `[vX.Y.Z]`; author fresh blocks for changed-but-unlogged packages; commit the CHANGELOG merge with a message documenting the boundary decision; tag at the new HEAD.
|
|
49
|
+
|
|
50
|
+
## §Scenario 5 — Stale test detection
|
|
51
|
+
|
|
52
|
+
**Shape:** a pre-flight test fails, but it asserts a behavior a peer *deliberately* changed (the change is CHANGELOG-documented); the test was never updated.
|
|
53
|
+
|
|
54
|
+
**Resolution:** read three things — the assertion, the CHANGELOG entry, the production source. Code matches the CHANGELOG's described behavior → the test is stale: update the assertion, add an inline comment naming the vX.Y.Z change, optionally pin the new contract with an extra assertion, include the test update in the release allowlist. Code matches the test → real regression (or the CHANGELOG is wrong) — fix that instead.
|
|
55
|
+
|
|
56
|
+
## §Scenario 6 — Concurrent peer mid-cycle
|
|
57
|
+
|
|
58
|
+
**Shape:** the working tree shifts between commands; `git stash pop` reports a conflict or "kept the stash."
|
|
59
|
+
|
|
60
|
+
**Resolution:** don't fight the peer. First confirm the release itself is fully shipped (tags pushed + npm + GH releases + site). Then for a kept stash: `git stash show -p stash@{0}` vs the file's recent `git log -p` — if the peer committed the same content, the stash is redundant → `git stash drop`; if not, leave the stash for the peer/operator to decide. Never blind-drop.
|
|
61
|
+
|
|
62
|
+
## §Scenario 7 — Tags pushed, ZERO publish workflows fired
|
|
63
|
+
|
|
64
|
+
**Shape:** all 10 tags exist on origin, but no `publish-<pkg>.yml` run exists for them; npm latest unchanged; nothing errored.
|
|
65
|
+
|
|
66
|
+
**Root cause:** pushing many tags in **one** `git push` fires a single batched create event that GitHub Actions routinely drops. Re-pushing is a no-op (the tags already exist remotely).
|
|
67
|
+
|
|
68
|
+
**Resolution:**
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/dispatch-publish.mjs" \
|
|
72
|
+
--version X.Y.Z --verify-triggered # re-dispatches ONLY packages with no run; idempotent
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
For a batch, preserve npm-latest ordering (`--after <prev>`). Verify against the registry, not the workflows. **Prevention:** push tags one-at-a-time ([`cut-procedure.md`](cut-procedure.md) §Step 8); `release-pack.mjs` does this automatically and follows with `--verify-triggered`.
|
|
76
|
+
|
|
77
|
+
## §Scenario 8 — Cut on the wrong branch
|
|
78
|
+
|
|
79
|
+
**Shape:** the cut landed on a peer's local feature branch instead of `main`; caught at push (origin/main at a mid-window commit, tags pointing at the feature tip). (Real case: v0.7.4.)
|
|
80
|
+
|
|
81
|
+
**Resolution:** recovery is clean **while nothing has published** — publish is `workflow_dispatch`-driven, so npm stays put through the tangle. If the feature tip fast-forwards from main: `git branch -f main <release-sha>` → `git checkout main` → `git push origin main`. Verify `origin/main == vX.Y.Z tag == HEAD` **before** dispatching any publish. Moving tags while local is free (`tag-lockstep.mjs --delete` + re-tag); moving them after a publish is not. **Prevention:** the Step-1 `branch --show-current` check.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## §Decision flowchart
|
|
86
|
+
|
|
87
|
+
```text
|
|
88
|
+
Pre-flight or F-N1 gate failed?
|
|
89
|
+
├── check:demo-shells fails at the release-commit candidate?
|
|
90
|
+
│ └── a later fix exists but is entangled with [Unreleased] work → Scenario 4
|
|
91
|
+
│ otherwise → author the fix in this cycle (Variant B)
|
|
92
|
+
├── check:lockstep fails → peer edited an internal range mid-PATCH → fix in place
|
|
93
|
+
├── verify:corpus fails → corpus drift → route to the A2UI-pipeline skill
|
|
94
|
+
├── check:embeddings-fresh fails → npm run build:embeddings:chunks; stage; note in
|
|
95
|
+
│ the a2ui-corpus CHANGELOG
|
|
96
|
+
├── test:unit fails → Scenario 5 (stale test) OR real regression
|
|
97
|
+
│ (assertion vs CHANGELOG vs source tells them apart)
|
|
98
|
+
└── F-N1 cosmetic warns → enrichment pass (changelog-discipline.md)
|
|
99
|
+
|
|
100
|
+
Multiple unpushed release commits → Scenario 2 (batch push)
|
|
101
|
+
Commit's CHANGELOG version ≠ its bump → Scenario 1 (version skip)
|
|
102
|
+
Tags on origin, no publish runs, npm stale → Scenario 7 (batched tag push)
|
|
103
|
+
branch --show-current ≠ main → Scenario 8 (wrong branch)
|
|
104
|
+
Working tree dirty at cycle start → classify + stash per
|
|
105
|
+
cut-procedure.md §Step 2
|
|
106
|
+
```
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// node bump.mjs --from 0.6.20 --to 0.6.21
|
|
9
9
|
// node bump.mjs --from 0.6.20 --to 0.6.21 --dry
|
|
10
10
|
//
|
|
11
|
-
//
|
|
11
|
+
// Part of the adia-release skill. Replaces the /tmp/vXXX-prep.mjs
|
|
12
12
|
// improvisation pattern from the v0.6.13 → v0.6.21 cycles.
|
|
13
13
|
//
|
|
14
14
|
// Exits:
|
|
@@ -31,8 +31,21 @@ const PACKAGES = [
|
|
|
31
31
|
'packages/a2ui/retrieval',
|
|
32
32
|
'packages/a2ui/runtime',
|
|
33
33
|
'packages/a2ui/validator',
|
|
34
|
+
// Plugins joined the lockstep 2026-07-15 (see check-lockstep.mjs's POLICY
|
|
35
|
+
// note). Each also carries a .claude-plugin/plugin.json whose version MUST
|
|
36
|
+
// move with package.json — plugin.json is the /plugin-update cache key
|
|
37
|
+
// (verify:plugins gates the sync).
|
|
38
|
+
'packages/plugins/adia-ui-factory',
|
|
39
|
+
'packages/plugins/adia-ui-forge',
|
|
34
40
|
];
|
|
35
41
|
|
|
42
|
+
// Sibling manifests bumped in the same pass as package.json (path relative to
|
|
43
|
+
// the package dir). Today: the Claude Code plugin manifests.
|
|
44
|
+
const SIBLING_MANIFESTS = {
|
|
45
|
+
'packages/plugins/adia-ui-factory': '.claude-plugin/plugin.json',
|
|
46
|
+
'packages/plugins/adia-ui-forge': '.claude-plugin/plugin.json',
|
|
47
|
+
};
|
|
48
|
+
|
|
36
49
|
function parseArgs(argv) {
|
|
37
50
|
const args = { from: null, to: null, dry: false, repo: process.cwd() };
|
|
38
51
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -96,6 +109,18 @@ function bumpAll(packages, from, to, dry) {
|
|
|
96
109
|
if (!dry) fs.writeFileSync(p.path, out);
|
|
97
110
|
bumped++;
|
|
98
111
|
console.log(` ${dry ? '[dry] ' : ''}bumped ${p.pkg}: ${from} → ${to}`);
|
|
112
|
+
const sibling = SIBLING_MANIFESTS[p.pkg];
|
|
113
|
+
if (sibling) {
|
|
114
|
+
const sibPath = path.join(path.dirname(p.path), sibling);
|
|
115
|
+
const sibTxt = fs.readFileSync(sibPath, 'utf8');
|
|
116
|
+
const sibOut = sibTxt.replace(FROM_PATTERN, TO_LITERAL);
|
|
117
|
+
if (sibOut === sibTxt) {
|
|
118
|
+
console.error(`error: ${p.pkg}/${sibling} — regex did not match (plugin.json out of sync?)`);
|
|
119
|
+
return -1;
|
|
120
|
+
}
|
|
121
|
+
if (!dry) fs.writeFileSync(sibPath, sibOut);
|
|
122
|
+
console.log(` ${dry ? '[dry] ' : ''}bumped ${p.pkg}/${sibling}: ${from} → ${to}`);
|
|
123
|
+
}
|
|
99
124
|
}
|
|
100
125
|
return bumped;
|
|
101
126
|
}
|
|
@@ -106,7 +131,7 @@ function main() {
|
|
|
106
131
|
if (!validateAllAtFrom(packages, args.from)) process.exit(1);
|
|
107
132
|
const bumped = bumpAll(packages, args.from, args.to, args.dry);
|
|
108
133
|
if (bumped < 0) process.exit(3);
|
|
109
|
-
console.log(`\n[bump] ${bumped}
|
|
134
|
+
console.log(`\n[bump] ${bumped}/${PACKAGES.length} ${args.dry ? '(dry — no files written)' : 'bumped'}`);
|
|
110
135
|
if (!args.dry) {
|
|
111
136
|
console.log(`\n[next] regenerate the lockfile:`);
|
|
112
137
|
console.log(` npm install --package-lock-only --no-audit --no-fund`);
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// # Dry mode:
|
|
15
15
|
// node dispatch-publish.mjs --version 0.6.22 --dry
|
|
16
16
|
//
|
|
17
|
-
//
|
|
17
|
+
// Part of the adia-release skill. Mechanizes the dispatch loop
|
|
18
18
|
// + handles the npm-latest ordering rule for batch pushes.
|
|
19
19
|
|
|
20
20
|
import { execSync } from 'node:child_process';
|
|
@@ -35,6 +35,9 @@ const PACKAGES = [
|
|
|
35
35
|
'a2ui-mcp',
|
|
36
36
|
'a2ui-retrieval',
|
|
37
37
|
'a2ui-validator',
|
|
38
|
+
// Plugins joined the lockstep 2026-07-15 (check-lockstep.mjs POLICY note).
|
|
39
|
+
'adia-ui-factory',
|
|
40
|
+
'adia-ui-forge',
|
|
38
41
|
];
|
|
39
42
|
|
|
40
43
|
function parseArgs(argv) {
|