@adia-ai/adia-ui-forge 0.1.3 → 0.8.1
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 +4 -7
- package/CHANGELOG.md +35 -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 +28 -3
- package/skills/{adia-ui-release → adia-release}/scripts/dispatch-publish.mjs +10 -7
- 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 +38 -31
- package/skills/{adia-ui-release → adia-release}/scripts/tag-lockstep.mjs +7 -3
- 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
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
# `independent-package-release.md` — class-B cut (an independently-versioned package outside the lockstep)
|
|
2
|
-
|
|
3
|
-
> Loaded by **mode 12 (Independent-package release)**. Load when releasing a package
|
|
4
|
-
> that versions **independently** of the lockstep set — it is excluded from the
|
|
5
|
-
> lockstep-coherence gate, carries no umbrella tag, and triggers no demo-site deploy.
|
|
6
|
-
> For the lockstep cut (the primary path), use `cycle-happy-path.md` (modes 1–4).
|
|
7
|
-
|
|
8
|
-
> **Worked example — the @adia-ai monorepo's `packages/plugins/*`.** The concrete
|
|
9
|
-
> package names, gate names, and workflow files below are **the worked example** of
|
|
10
|
-
> this class, drawn from the @adia-ai monorepo's two Claude Code plugins —
|
|
11
|
-
> `@adia-ai/adia-ui-factory` (versioned `0.2.x`) and `@adia-ai/adia-ui-forge`
|
|
12
|
-
> (versioned `0.1.x`) — which live under `packages/plugins/*`, version
|
|
13
|
-
> independently, and are EXCLUDED from the 9-package lockstep. A _different_
|
|
14
|
-
> @adia-ai-style monorepo with its own independently-versioned package keeps this
|
|
15
|
-
> skeleton and substitutes its own package path, exclusion comment, and publish
|
|
16
|
-
> workflow. `$REPO` below = the monorepo root.
|
|
17
|
-
|
|
18
|
-
## §Why a separate class — two release classes in one monorepo
|
|
19
|
-
|
|
20
|
-
A lockstep monorepo can host packages that do **not** move with the lockstep set:
|
|
21
|
-
plugins, tools, or any package whose release cadence is deliberately decoupled.
|
|
22
|
-
These are a **class-B independent-package release**, distinct from the **class-A
|
|
23
|
-
lockstep cut** the rest of this skill describes.
|
|
24
|
-
|
|
25
|
-
| | Class A — lockstep cut (modes 1–4) | Class B — independent-package release (mode 12) |
|
|
26
|
-
| --- | --- | --- |
|
|
27
|
-
| **Versioning** | The whole set bumps together | Each package on its own version line |
|
|
28
|
-
| **Lockstep gate** | Enforced (`check:lockstep` 9/9) | **Excluded** — the gate skips the package by design |
|
|
29
|
-
| **Umbrella tag** | Yes (`vX.Y.Z` + per-package) | **None** — per-package tags only (versions differ) |
|
|
30
|
-
| **`dist-tag` ordering** | Cross-package publish ordering matters | N/A (independent versions; no cross-package `latest` race) |
|
|
31
|
-
| **Demo-site deploy** | Yes (the worked example's `ui-kit.exe.xyz`) | **None** |
|
|
32
|
-
| **Publish trigger** | Tag-triggered per-package workflow | Tag-triggered per-package workflow (same mechanism) |
|
|
33
|
-
|
|
34
|
-
`SKILL.md §ReleaseInvariants` govern the **class-A lockstep cut**. Class B's
|
|
35
|
-
invariants are the §Posture operator-confirmation checkpoints plus the onboarding
|
|
36
|
-
trip-wires below — and the same verify-against-reality discipline (verify the npm
|
|
37
|
-
registry, not the workflow's reported "success").
|
|
38
|
-
|
|
39
|
-
> **Worked example.** In the @adia-ai monorepo, `scripts/release/check-lockstep.mjs`
|
|
40
|
-
> skips `packages/plugins/*` by design (there's a comment there saying so), and the
|
|
41
|
-
> plugins publish via their own tag-triggered workflows
|
|
42
|
-
> (`.github/workflows/publish-adia-ui-{factory,forge}.yml`) — exactly like the
|
|
43
|
-
> framework packages but on independent versions. No umbrella tag, no `dist-tag`
|
|
44
|
-
> cross-package ordering, no EXE deploy.
|
|
45
|
-
|
|
46
|
-
## §New-package onboarding — the three trip-wires a FIRST independent cut hits
|
|
47
|
-
|
|
48
|
-
A package that is **new to the release tooling** fails three gates the established
|
|
49
|
-
set long since passed. These are **substrate** fixes (release scripts / lockfile /
|
|
50
|
-
CHANGELOG), not skill edits — per the §Teach decision tree, branch A (substrate).
|
|
51
|
-
The skill only *cites* them here. Onboard the package **once**; the fixes land as a
|
|
52
|
-
normal substrate PR on `main` *before* tagging.
|
|
53
|
-
|
|
54
|
-
1. **Lockfile.** A new workspace package isn't in the lockfile → the pre-commit
|
|
55
|
-
lockfile-check hook blocks the commit, and the publish workflow's clean install
|
|
56
|
-
(`npm ci`) fails the same way.
|
|
57
|
-
*Fix:* regenerate the lockfile only and stage it —
|
|
58
|
-
`npm install --package-lock-only && git add package-lock.json`.
|
|
59
|
-
2. **Release-trip-wire package registry.** The release trip-wire (F-N1,
|
|
60
|
-
`check:release`) validates each pushed tag against a registry of known packages.
|
|
61
|
-
An unregistered tag fails the **pre-push** hook with an `unknown package` error.
|
|
62
|
-
*Fix:* register the package in that list — its tag-prefix + path.
|
|
63
|
-
*(Worked example: `scripts/release/check-release.mjs` has a hardcoded `PACKAGES`
|
|
64
|
-
array — the framework 9; add
|
|
65
|
-
`{ tagPrefix: '<name>', path: 'packages/plugins/<name>' }`.)*
|
|
66
|
-
3. **CHANGELOG bracket form.** The trip-wire's entry check requires the
|
|
67
|
-
Keep-a-Changelog `## [<version>]` (brackets) heading. A bare `## <version>`
|
|
68
|
-
heading fails with a "no `## [<version>]` entry" error.
|
|
69
|
-
*Fix:* bracket the version headings.
|
|
70
|
-
|
|
71
|
-
## §Procedure
|
|
72
|
-
|
|
73
|
-
> The gate/workflow names below are the @adia-ai worked example; substitute your
|
|
74
|
-
> monorepo's own pre-publish gate and publish workflow.
|
|
75
|
-
|
|
76
|
-
0. **Re-baseline** (the multi-agent baseline assumption). `git fetch`; know HEAD +
|
|
77
|
-
whether the shared working tree is on a peer's branch.
|
|
78
|
-
1. **Land the package(s) on `main`** via PR — the usual PR-merge gate: resolve
|
|
79
|
-
**every** review thread (e.g. CodeRabbit) before an admin-merge. A PR-merge gate
|
|
80
|
-
that requires resolved review threads before `gh pr merge --admin` is a hard
|
|
81
|
-
precondition — an admin merge over unresolved threads is the failure this guards
|
|
82
|
-
against. *(See `SKILL.md §Posture` / your monorepo's merge convention.)*
|
|
83
|
-
2. **Pre-publish gate.** Run the per-package version-coherence check (the worked
|
|
84
|
-
example: `npm run verify:plugins` → N/N synced — `package.json` ↔ the plugin
|
|
85
|
-
manifest versions). The lockstep gate still passes for the lockstep set (the
|
|
86
|
-
independent package is excluded). Confirm the names are free on npm:
|
|
87
|
-
`npm view @adia-ai/<pkg> version` → `E404` means available.
|
|
88
|
-
3. **Tag at the published commit** — `git tag <pkg>-vX.Y.Z` per package (versions
|
|
89
|
-
differ; **no umbrella tag**). The tag must point at a commit whose `package.json`
|
|
90
|
-
+ bracketed CHANGELOG match: dry-run the release trip-wire over the tag list
|
|
91
|
-
(worked example: `node scripts/release/check-release.mjs <tags>` → clean) before
|
|
92
|
-
pushing. **If the shared working tree is on a peer's branch, push the tags from a
|
|
93
|
-
throwaway worktree on `origin/main`** — never carry a peer's branch state into a
|
|
94
|
-
tag push.
|
|
95
|
-
4. **Push the tags** → the per-package publish workflows run the clean-install →
|
|
96
|
-
pre-publish-gate → publish sequence (worked example:
|
|
97
|
-
`npm ci → verify:plugins → npm publish --access public` with the repo's npm token).
|
|
98
|
-
5. **Verify (against npm, not the workflow).** `npm view @adia-ai/<pkg> version`
|
|
99
|
-
returns the new version for each package. Watch each workflow to completion
|
|
100
|
-
(`gh run watch <id> --exit-status`) — but the registry, not the workflow's green
|
|
101
|
-
check, is the source of truth.
|
|
102
|
-
6. **Marketplace cut-over** (if a plugin marketplace repo exists). Point the
|
|
103
|
-
marketplace manifest's per-plugin `source` at npm —
|
|
104
|
-
`{ "source": "npm", "package": "@adia-ai/<pkg>" }` — and `git rm -r` any vendored
|
|
105
|
-
copies (the canonical home is the monorepo). Validate the JSON, commit, push.
|
|
106
|
-
Consumers then add the marketplace + install the plugin from npm (e.g.
|
|
107
|
-
`/plugin marketplace add <org>/<repo>` → `/plugin install <pkg>@<repo>`).
|
|
108
|
-
7. **Audit-history ledger** — same as class A; record the **per-package** versions
|
|
109
|
-
(independent — they differ per package).
|
|
110
|
-
|
|
111
|
-
## §Verify Target
|
|
112
|
-
|
|
113
|
-
The published package(s) on the **npm registry** at their independent versions, plus
|
|
114
|
-
(if a marketplace exists) it references npm. **NOT** "the whole lockstep set + the
|
|
115
|
-
demo site" — that's class A. Verify against the registry, never the workflow's
|
|
116
|
-
reported "success."
|
|
117
|
-
|
|
118
|
-
## §Gotchas — from the first independent cut (worked example: 2026-06-07, factory v0.2.2 + forge v0.1.2)
|
|
119
|
-
|
|
120
|
-
- The independent package is **NOT** lockstep — never add it to the lockstep gate,
|
|
121
|
-
and never tag it with the lockstep umbrella tag.
|
|
122
|
-
- Publish-workflow YAMLs are **token-bearing** — keep `persist-credentials: false`
|
|
123
|
-
on the checkout step (match the established publish workflows' action-pinning
|
|
124
|
-
convention).
|
|
125
|
-
- A marketplace repo's **org + visibility is an operator call** — creating a public
|
|
126
|
-
repo is outward-facing; confirm before `gh repo create`. The repo home may differ
|
|
127
|
-
from the primary org (the marketplace manifest's `owner` field is the signal; a
|
|
128
|
-
member without org repo-create rights falls back to a personal repo).
|
|
129
|
-
- Run a **secret-scan of the full history** before pushing any repo public.
|
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
# `ledger-discipline.md` — audit-history JSON schema + what to capture
|
|
2
|
-
|
|
3
|
-
> Loaded by mode 1 Step 11 (Ledger), mode 4 (batch-push ledger), and mode 8 (Investigation — reads past ledgers).
|
|
4
|
-
|
|
5
|
-
Every release cycle writes a JSON ledger to `.brain/audit-history/YYYY-MM-DD-<kind>-vX.Y.Z.json`. The ledger is the long-term memory of the cycle — what shipped, what was excluded, what was learned. Future cycles read past ledgers (mode 8) and the post-mortem flow (mode 7 + `ops-postmortem` skill) cross-references them.
|
|
6
|
-
|
|
7
|
-
This file documents the canonical schema + what to capture for each release-kind.
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## §The canonical schema
|
|
12
|
-
|
|
13
|
-
```json
|
|
14
|
-
{
|
|
15
|
-
"kind": "release-cut" | "batch-push" | "p1-hotfix" | "post-release-fix",
|
|
16
|
-
"audit_id": "YYYY-MM-DD-<kind>-vX.Y.Z",
|
|
17
|
-
"repo": "<org>/<repo>",
|
|
18
|
-
"released_at": "YYYY-MM-DD",
|
|
19
|
-
"version": "X.Y.Z",
|
|
20
|
-
"release_type": "MAJOR" | "MINOR" | "PATCH",
|
|
21
|
-
"summary": "<one-paragraph>",
|
|
22
|
-
"scope": { /* free-form keys, one per substantive package or topic */ },
|
|
23
|
-
"release_commit": "<sha>",
|
|
24
|
-
"tag_commit": "<sha>",
|
|
25
|
-
"tags": [ /* all 10 tags */ ],
|
|
26
|
-
"verification": { /* gate-by-gate summary */ },
|
|
27
|
-
"publish_workflows": { "dispatched": "9/9 ...", "conclusions": "9/9 success" },
|
|
28
|
-
"notes": [ /* one entry per lesson, exclusion, anomaly */ ]
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
The `audit_id` is the file's basename (without `.json`). The `.brain/audit-history/` directory accumulates one such ledger per release cycle. (`make-ledger.mjs` scaffolds the file from git state + `--repo-slug`; the `9/9` counts below are the @adia-ai monorepo's 9-package worked example — substitute your monorepo's package count.)
|
|
33
|
-
|
|
34
|
-
No `$schema` key: ledgers are self-describing local audit records, so `make-ledger.mjs` deliberately emits no `$schema` (it pointed at a non-bundled external host that this skill does not own or validate against). If your ops setup validates ledgers against a hosted JSON Schema, add the `$schema` field in your own post-processing.
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## §What every ledger MUST capture
|
|
39
|
-
|
|
40
|
-
These fields are required and the cycle is incomplete without them:
|
|
41
|
-
|
|
42
|
-
### `audit_id` + `released_at` + `version`
|
|
43
|
-
|
|
44
|
-
- `audit_id` matches the filename. Format: `YYYY-MM-DD-release-vX.Y.Z` (single-version) or `YYYY-MM-DD-batch-push-vA-vZ` (batch).
|
|
45
|
-
- `released_at` is the YYYY-MM-DD cycle date.
|
|
46
|
-
- `version` is the published semver (no `v` prefix).
|
|
47
|
-
|
|
48
|
-
### `summary` (the one-paragraph)
|
|
49
|
-
|
|
50
|
-
A single paragraph (4–6 sentences) covering: substantive packages + scope + new primitives/APIs + retracted features + bundled skill cuts. This is what future operators READ when grepping `.brain/audit-history/`.
|
|
51
|
-
|
|
52
|
-
Example (v0.6.21):
|
|
53
|
-
|
|
54
|
-
> "9-package lockstep PATCH cut, authored from scratch. @adia-ai/web- components: table-ui truncate-by-default with [wrap]/[data-wrap] opt-in (§403), toast/feed-item variant text colour fix, input-ui slot-label spacing. @adia-ai/web-modules: `<admin-entity-item>` row- inset alignment, FEEDBACK-37 retraction (admin-shell spurious slot- contract console.warn removed), page-header title-row :first-of-type selector fix. @adia-ai/a2ui-corpus: catalog regen."
|
|
55
|
-
|
|
56
|
-
### `release_commit` + `tag_commit`
|
|
57
|
-
|
|
58
|
-
- `release_commit`: the SHA of the actual `chore(release):` or `release(*):` commit (typically the same as `tag_commit` unless an enrichment-pass amended it).
|
|
59
|
-
- `tag_commit`: the SHA the 10 tags point at (= HEAD at tag time).
|
|
60
|
-
|
|
61
|
-
If those differ (F-N1 enrichment scenario), record BOTH and explain in a `notes` entry.
|
|
62
|
-
|
|
63
|
-
### `tags` array
|
|
64
|
-
|
|
65
|
-
All 10 tags (umbrella + 9 per-package), in that order.
|
|
66
|
-
|
|
67
|
-
### `verification` (gate-by-gate)
|
|
68
|
-
|
|
69
|
-
A flat object with gate-name → status. Use the same keys across cycles so future search can find regression patterns:
|
|
70
|
-
|
|
71
|
-
```json
|
|
72
|
-
"verification": {
|
|
73
|
-
"check_lockstep": "OK at X.Y.Z / ^X.Y.0",
|
|
74
|
-
"test_unit": "NNNN/NNNN across NN files",
|
|
75
|
-
"typecheck": "clean",
|
|
76
|
-
"components_verify": "clean — NN files",
|
|
77
|
-
"verify_traits": "56/56 (100%)",
|
|
78
|
-
"check_demo_shells": "clean — NN shells",
|
|
79
|
-
"check_lightningcss_build": "NN CSS files clean",
|
|
80
|
-
"verify_corpus": "0 errors / 0 warns",
|
|
81
|
-
"check_embeddings_fresh": "OK",
|
|
82
|
-
"check_links": "NNNN files clean",
|
|
83
|
-
"smoke_engines": "green",
|
|
84
|
-
"smoke_register_engine": "11/11",
|
|
85
|
-
"eval_diff_zettel": "cov=N% avg=N (floor cov≥5% avg≥85)",
|
|
86
|
-
"fn1_trip_wire": "9/9 per-package clean ...",
|
|
87
|
-
"npm_latest": "X.Y.Z across all 9 packages",
|
|
88
|
-
"exe_serves": "HTTP 200 (gen-ui)",
|
|
89
|
-
"gh_releases": "9 created per-package"
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
Use underscores (`check_demo_shells`) not colons (`check:demo-shells`) in JSON keys — colons aren't valid JSON identifier punctuation.
|
|
94
|
-
|
|
95
|
-
If a gate FAILED at first and was recovered — record the recovery in `notes`, not in `verification` (which shows final state).
|
|
96
|
-
|
|
97
|
-
### `publish_workflows`
|
|
98
|
-
|
|
99
|
-
```json
|
|
100
|
-
"publish_workflows": {
|
|
101
|
-
"dispatched": "9/9 via gh workflow run --ref <pkg>-vX.Y.Z",
|
|
102
|
-
"conclusions": "9/9 success"
|
|
103
|
-
}
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
For batch push, expand:
|
|
107
|
-
|
|
108
|
-
```json
|
|
109
|
-
"publish_workflows": {
|
|
110
|
-
"dispatched": "18/18 — vA.B.C set dispatched + settled FIRST, then vA.B.D set (ordering ensures npm latest lands on vA.B.D)",
|
|
111
|
-
"conclusions": "18/18 success"
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### `notes` (the lesson log)
|
|
116
|
-
|
|
117
|
-
Array of strings, one per significant observation. Examples:
|
|
118
|
-
|
|
119
|
-
- "STALE TEST FIXED: ..." — when a stale test required updating.
|
|
120
|
-
- "PEER-IN-FLIGHT EXCLUDED: ..." — when a peer file was stashed.
|
|
121
|
-
- "STRAY UNCOMMITTED CHANGE EXCLUDED: ..." — when an uncommitted-but-undocumented change was stashed.
|
|
122
|
-
- "F-N1 flagged N cosmetic diff-coverage warns; enrichment pass applied to ..." — when the enrichment pass ran.
|
|
123
|
-
- "Companion: `<companion-plugin>` vX.Y.Z bundled with this cut" — when a tooling/skill update rides along.
|
|
124
|
-
- "Umbrella tag vX.Y.Z fails F-N1 pattern check — expected; lockstep convention" — boilerplate but worth keeping for archaeological consistency.
|
|
125
|
-
|
|
126
|
-
The `notes` array is the **highest-information part of the ledger**. This is what future operators read first when investigating a past release.
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
## §What ELSE to capture per kind
|
|
131
|
-
|
|
132
|
-
### `kind: release-cut` (standard single-version)
|
|
133
|
-
|
|
134
|
-
Add `scope` keys per substantive package:
|
|
135
|
-
|
|
136
|
-
```json
|
|
137
|
-
"scope": {
|
|
138
|
-
"web_components": "<one-sentence per substantive feature in this package, with FEEDBACK numbers>",
|
|
139
|
-
"web_modules": "<same>",
|
|
140
|
-
"a2ui_corpus": "<same>",
|
|
141
|
-
"ride_along_stubs": "@adia-ai/llm, @adia-ai/a2ui-compose, ... — version bump only."
|
|
142
|
-
}
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### `kind: batch-push` (multi-version)
|
|
146
|
-
|
|
147
|
-
Add `versions` array + per-version `tag_commits` + `scope` per-version:
|
|
148
|
-
|
|
149
|
-
```json
|
|
150
|
-
"versions": ["A.B.C", "A.B.D"],
|
|
151
|
-
"tag_commits": {
|
|
152
|
-
"vA.B.C": "<sha>",
|
|
153
|
-
"vA.B.D": "<sha>"
|
|
154
|
-
},
|
|
155
|
-
"scope": {
|
|
156
|
-
"vA.B.C": "<one-paragraph summary of this version>",
|
|
157
|
-
"vA.B.D": "<same>"
|
|
158
|
-
}
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### `kind: p1-hotfix` (urgent fix without normal cycle)
|
|
162
|
-
|
|
163
|
-
Add `incident` block:
|
|
164
|
-
|
|
165
|
-
```json
|
|
166
|
-
"incident": {
|
|
167
|
-
"trigger": "<the symptom that demanded a hotfix>",
|
|
168
|
-
"detection_lag": "<when shipped → when noticed>",
|
|
169
|
-
"scope_minimization": "<what was deliberately NOT included to keep the hotfix small>"
|
|
170
|
-
}
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
Cross-reference `ops-postmortem` skill — the hotfix usually pairs with a postmortem doc.
|
|
174
|
-
|
|
175
|
-
### `kind: post-release-fix` (correction after publish)
|
|
176
|
-
|
|
177
|
-
Add `corrects` block:
|
|
178
|
-
|
|
179
|
-
```json
|
|
180
|
-
"corrects": {
|
|
181
|
-
"version": "<the version being corrected>",
|
|
182
|
-
"issue": "<what was wrong>",
|
|
183
|
-
"resolution_path": "<how — typically a follow-up release>"
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
Example: a future "v0.6.21.1" or "v0.6.22 fix-only" cycle correcting a v0.6.21 defect would carry this block.
|
|
188
|
-
|
|
189
|
-
---
|
|
190
|
-
|
|
191
|
-
## §Where to write it
|
|
192
|
-
|
|
193
|
-
Path: `.brain/audit-history/YYYY-MM-DD-release-vX.Y.Z.json`.
|
|
194
|
-
|
|
195
|
-
Convention:
|
|
196
|
-
|
|
197
|
-
- Date is the cycle's `released_at` field (not strictly the local filesystem date; they should match but the field is authoritative).
|
|
198
|
-
- For batch push: `.brain/audit-history/YYYY-MM-DD-batch-push-vA-vZ.json` where A is the oldest and Z is the newest version in the batch.
|
|
199
|
-
|
|
200
|
-
The file MUST be added in a separate `chore(audit-history)` commit after the release commit ships. Don't bundle it into the release commit — the ledger commit is the cycle's epilogue.
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## §Reading past ledgers (mode 8)
|
|
205
|
-
|
|
206
|
-
When the operator asks "what shipped in v0.6.X?" or "did we ever fix `<symptom>`?":
|
|
207
|
-
|
|
208
|
-
```bash
|
|
209
|
-
# Single-version lookup
|
|
210
|
-
cat .brain/audit-history/*-release-v0.6.X.json | jq .
|
|
211
|
-
|
|
212
|
-
# Search across cycles
|
|
213
|
-
grep -l "FEEDBACK-37" .brain/audit-history/*.json | sort
|
|
214
|
-
grep -l "stale test" .brain/audit-history/*.json | sort
|
|
215
|
-
grep -l "version-skip" .brain/audit-history/*.json | sort
|
|
216
|
-
|
|
217
|
-
# What gates were ever flagged?
|
|
218
|
-
for f in .brain/audit-history/*.json; do
|
|
219
|
-
echo "$(basename $f):"
|
|
220
|
-
jq -r '.notes[] | select(test("FAILED|enrichment|STASHED|EXCLUDED"))' "$f" 2>/dev/null
|
|
221
|
-
done
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
Memory: `reference_findings_index_and_postmortems` — there's a `.brain/findings/INDEX.md` for open follow-ups and `.brain/postmortems/` for incident write-ups. The audit-history ledgers complement those: ledgers are per-cycle, INDEX/postmortems are per-issue.
|
|
225
|
-
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
## §When this reference is "done v1"
|
|
229
|
-
|
|
230
|
-
- Every cycle's ledger uses the canonical schema with no key drift (verifiable via a JSON schema validator or `jq` keys diff).
|
|
231
|
-
- The `notes` array has at least one entry per cycle (the umbrella F-N1 boilerplate counts as the minimum).
|
|
232
|
-
- The next mode-8 investigation (what shipped in v0.6.X?) reads the ledger first, not the GH release page.
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
# `migration-guide-authoring.md` — authoring the MIGRATION GUIDE when cutting a breaking release
|
|
2
|
-
|
|
3
|
-
> Loaded by **mode 11 (Author a migration guide)** and by **mode 1 / 2** whenever the cut is a **MINOR** (an API-surface break — removed/renamed prop, attribute, slot, event, token, or tag). The **producer** side of migrations: you are shipping the breaking change, so you author the guide section consumers will follow. Companion: `changelog-discipline.md` (the CHANGELOG records _what_ landed; the migration guide tells consumers _how to absorb it_).
|
|
4
|
-
|
|
5
|
-
This is the **producer counterpart** to consumer-side migration. When the framework ships a breaking release, `MIGRATION GUIDE.md` is the canonical record of every BREAKING item + its mechanical search-and-replace recipe. The **consumer side** (sweeping a consumer app's call sites with `git grep` + `perl -i -pe`, then verifying with the build gate) lives in the separate consumer/app-author plugin — it READS this guide. Your job here is to WRITE the section it reads.
|
|
6
|
-
|
|
7
|
-
> **Scope split (don't blur it):**
|
|
8
|
-
>
|
|
9
|
-
> - **Producer (this skill, this file)** — author the `MIGRATION GUIDE.md` version section + migrate the IN-REPO surfaces (demo / exemplar / playground / catalog pages) so the release ships clean.
|
|
10
|
-
> - **Consumer (separate plugin)** — sweep a downstream consumer app against a published guide section. NOT this skill.
|
|
11
|
-
> - **Designing the breaking change itself** — a contract decision, not a migration. Upstream of both.
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## §When you need a migration guide section
|
|
16
|
-
|
|
17
|
-
Author (or extend) a `MIGRATION GUIDE.md` section when the cut removes or renames a **public API symbol**:
|
|
18
|
-
|
|
19
|
-
- a removed/renamed **prop or attribute** (e.g. `variant="danger"` → `color="danger"`);
|
|
20
|
-
- a removed/renamed **slot** or **slot semantics flip** (e.g. `[open]` default-hidden → `[collapsed]` default-visible);
|
|
21
|
-
- a removed/renamed **event name** (e.g. `chat-submit` → `submit`);
|
|
22
|
-
- a removed/renamed **token** (e.g. `--n-*` → `--a-*`);
|
|
23
|
-
- a removed/renamed **tag** (e.g. `app-shell` → `adia-shell`);
|
|
24
|
-
- a **Boolean → enum** migration (e.g. `completed` → `status="completed"`);
|
|
25
|
-
- a **default-value behavior change** wide enough that consumers must act.
|
|
26
|
-
|
|
27
|
-
This is the same line as the **PATCH-vs-MINOR** rule in `cycle-happy-path.md` §Step 4b: **MINOR is reserved for API-surface breaks ONLY.** If you're cutting MINOR, you almost certainly owe a migration-guide section. If the change is a visible-behavior change with no removed/renamed symbol, it stays PATCH and usually needs only a CHANGELOG `### Changed` bullet — **not** a guide section.
|
|
28
|
-
|
|
29
|
-
Additive cuts (new component, new opt-in attribute, new API) need **no** migration section — note "additive; no consumer sweep" in the version table and move on.
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## §Where the guide lives
|
|
34
|
-
|
|
35
|
-
`MIGRATION GUIDE.md` is a **top-level consumer artifact at the repo root** (not under `docs/` — the space in the filename is intentional; it's surfaced to consumers as a first-class document). It is READ by the consumer side but MODIFIED only here, at producer time, when a new breaking release is cut.
|
|
36
|
-
|
|
37
|
-
One section per release that introduces breaking changes, newest at the top. A consumer jumping multiple versions reads the merged span of all sections between their source and target.
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## §The authoring workflow
|
|
42
|
-
|
|
43
|
-
### Step 1 — Enumerate the breaking surface
|
|
44
|
-
|
|
45
|
-
From the cut's diff + CHANGELOG `[vX.Y.Z]` `### Removed` / `### Changed` entries, list every breaking item. For each, capture:
|
|
46
|
-
|
|
47
|
-
- **The symbol** — the exact prop / attr / slot / event / token / tag.
|
|
48
|
-
- **The before → after** — old shape and new shape.
|
|
49
|
-
- **The kind** — pure rename (mechanical) · semantic flip (needs author judgment) · Boolean→enum · removal (no replacement).
|
|
50
|
-
- **The audit grep** — the `git grep -nE` that surfaces call sites.
|
|
51
|
-
- **The sweep** — the `git grep -lE | xargs perl -i -pe` incantation, OR "manual review" if the change can't be safely mechanized.
|
|
52
|
-
|
|
53
|
-
### Step 2 — Write the section
|
|
54
|
-
|
|
55
|
-
Section skeleton (per release):
|
|
56
|
-
|
|
57
|
-
```markdown
|
|
58
|
-
## Migrating to @adia-ai/web-components@X.Y.Z (YYYY-MM-DD)
|
|
59
|
-
|
|
60
|
-
<one-line scope: how many breaking items, the headline.>
|
|
61
|
-
|
|
62
|
-
### <item 1 — bold headline> (`old` → `new`)
|
|
63
|
-
|
|
64
|
-
<one sentence: what changed and why.>
|
|
65
|
-
|
|
66
|
-
**Audit:**
|
|
67
|
-
|
|
68
|
-
\`\`\`bash
|
|
69
|
-
git grep -nE '<pattern that surfaces call sites>'
|
|
70
|
-
\`\`\`
|
|
71
|
-
|
|
72
|
-
**Sweep:**
|
|
73
|
-
|
|
74
|
-
\`\`\`bash
|
|
75
|
-
git grep -nlE '<pattern>' \
|
|
76
|
-
| xargs perl -i -pe 's/<old>/<new>/g'
|
|
77
|
-
\`\`\`
|
|
78
|
-
|
|
79
|
-
### <item 2 …>
|
|
80
|
-
...
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
Shape rules:
|
|
84
|
-
|
|
85
|
-
- **One item = one subsection.** Each removed/renamed symbol gets its own `###` with audit + sweep (or a "manual review" note).
|
|
86
|
-
- **Bold-prefix headline + before→after in the heading** — readers grep the heading for the symbol they hit.
|
|
87
|
-
- **Audit grep first, sweep second.** The consumer side ALWAYS audits (lists call sites) before sweeping. Author both so they can.
|
|
88
|
-
- **Mechanical vs manual, explicitly labeled.** A pure rename ships a `perl -i -pe`. A semantic flip / opt-out-Boolean / ownership-move ships a **"manual review — here's why"** note instead, because sed can't tell author intent (see §Manual-review classes below).
|
|
89
|
-
- **One component per sweep regex.** Don't merge `<(toast|alert|tag)-ui …>` alternations — perl/sed alternation captures don't preserve the matched alternative cleanly. One component at a time.
|
|
90
|
-
- **HTML-attribute regexes only match HTML/JSX.** A `<button-ui variant="danger">` sweep won't touch JS `el.variant = 'danger'` — author a separate JS-side regex when the symbol has a programmatic form.
|
|
91
|
-
|
|
92
|
-
### Step 3 — Migrate the in-repo surfaces FIRST
|
|
93
|
-
|
|
94
|
-
Before the cut ships, sweep the framework's OWN consumer surfaces — the demo pages, exemplars, playgrounds, and catalog — so the release doesn't ship broken examples of the thing it just changed. Run your own audit + sweep against `apps/`, `playgrounds/`, `catalog/`, `packages/web-components/components/*/*.html`. This is the producer dogfooding the migration: if the in-repo sweep is awkward, the consumer sweep will be worse — fix the recipe now.
|
|
95
|
-
|
|
96
|
-
### Step 4 — Verify
|
|
97
|
-
|
|
98
|
-
Run the cut's normal pre-flight gate roster (`cycle-happy-path.md` §Step 3). For a breaking cut, pay special attention to the structural/demo gates (`check:demo-shells`, the static-HTML probes) — they catch in-repo surfaces you missed. A **sweep-verification grep audit** across all extensions catches the trap where a vocabulary migration touched the markup but NOT the CSS selectors that style it or the JS comments that reference it (different files; a markup-only commit looks complete but leaves drift):
|
|
99
|
-
|
|
100
|
-
```bash
|
|
101
|
-
# For any vocabulary migration where legacy → new shapes coexist or get
|
|
102
|
-
# retired, grep the full legacy-pattern set across ALL extensions at the
|
|
103
|
-
# END of the in-repo sweep. 0 hits = sweep verified clean.
|
|
104
|
-
LEGACY_PATTERNS=( '<old-tag' 'old-attr=' '--old-token' )
|
|
105
|
-
for pat in "${LEGACY_PATTERNS[@]}"; do
|
|
106
|
-
echo "=== $pat ==="
|
|
107
|
-
grep -rln -E "$pat" apps playgrounds catalog \
|
|
108
|
-
--include='*.css' --include='*.html' --include='*.js' --include='*.yaml' 2>/dev/null
|
|
109
|
-
done
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Step 5 — Cross-reference from the CHANGELOG + release notes
|
|
113
|
-
|
|
114
|
-
- The breaking package's CHANGELOG `[vX.Y.Z]` `### Removed` / `### Changed` entry should name the symbol AND point at the guide ("see `MIGRATION GUIDE.md` §X.Y.Z").
|
|
115
|
-
- The release notes (`notes-authoring.md`) carry a `⚠️` heads-up paragraph naming the break + linking the guide section, so consumers reading the announcement know to migrate.
|
|
116
|
-
|
|
117
|
-
---
|
|
118
|
-
|
|
119
|
-
## §Manual-review classes (do NOT auto-sweep)
|
|
120
|
-
|
|
121
|
-
Some breaking changes look mechanical but aren't. Document them as **manual review** with the reason, never as a `perl -i -pe`:
|
|
122
|
-
|
|
123
|
-
- **Semantic flips** — a rename that inverts default behavior. Example: `[open]` (default-hidden, opt-in) → `[collapsed]` (default-visible, opt-out). The right migration depends on author intent: if the surface wanted the thing expanded, drop the attr; if hidden, add `collapsed`. List occurrences, ask.
|
|
124
|
-
- **Opt-out Booleans that default true** — when `<x-ui filterable>` is the same as bare `<x-ui>` (filter on by default), the migration only matters where a consumer EXPLICITLY disabled an affordance (`searchable="false"`). Sed can't tell the difference.
|
|
125
|
-
- **Ownership moves** — moving a message/prop from a wrapper to a child (e.g. `<field-ui error="…">` → the message moves to the slotted control) requires knowing which child is the form control; the slot may not exist yet. Manual.
|
|
126
|
-
- **kebab-string property keys** — when the HTML _attribute_ name is unchanged but the JS _programmatic_ form changed (`el['submit-label']` → `el.submitLabel`), attribute-only consumers need no migration. Audit programmatic access only.
|
|
127
|
-
- **Wide tag/token renames (50+ symbols)** — the `@agent-ui-kit/*` → `@adia-ai/*` namespace rename class: tag renames, token-namespace renames (`--n-*` → `--a-*`), class renames (`NanoElement` → `AdiaElement`). Don't auto-sweep the whole surface blind — false positives are likely (a `variant="danger"` on a non-`*-ui` element that shares a prefix). List by table; require human approval per cluster.
|
|
128
|
-
|
|
129
|
-
---
|
|
130
|
-
|
|
131
|
-
## §The version-coverage table
|
|
132
|
-
|
|
133
|
-
Maintain a table at the top of `MIGRATION GUIDE.md` that classifies every release so a consumer jumping a gap knows which sections apply:
|
|
134
|
-
|
|
135
|
-
```markdown
|
|
136
|
-
| Version | Type | Sweeps |
|
|
137
|
-
|---|---|---|
|
|
138
|
-
| `0.0.22` | additive | New shell components; net-new APIs. No consumer sweep needed. |
|
|
139
|
-
| `0.0.21` | additive (no runtime change) | JSDoc/source-doc refresh. Bump the dep; no sweep. |
|
|
140
|
-
| `0.0.20` | BREAKING (N items) | <bullet list of every breaking item + its sweep>. |
|
|
141
|
-
| `0.0.5`–`0.0.19` | additive | No migration sweeps. Bump the dep version. |
|
|
142
|
-
| `0.0.4` | structural | Runtime extracted to a new package; imports retarget. |
|
|
143
|
-
| `@agent-ui-kit/*` → `@adia-ai/*` | rename | Tag + token + class renames (50+). Don't auto-migrate without approval. |
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
`additive` = bump and go. `BREAKING` = the version has a `###` section with audit + sweep per item. `structural` = import retargeting (package extraction / move). `rename` = wide namespace rename, manual-review by cluster.
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
## §Forward-looking surfaces (the next guide author's heads-up)
|
|
151
|
-
|
|
152
|
-
When a surface is currently additive but accumulating breaking pressure, note it at the bottom of the guide so the NEXT breaking-release author knows where the churn is concentrated — shell components, the gen-UI MCP op-type names, table-family opt-out attributes, etc. A future author reading "this area is volatile" writes a tighter section faster.
|
|
153
|
-
|
|
154
|
-
---
|
|
155
|
-
|
|
156
|
-
## §Anti-patterns
|
|
157
|
-
|
|
158
|
-
- **Authoring the guide AFTER the cut ships.** The guide section is part of the breaking-release scope — write it in the same cycle, before the in-repo sweep, so you dogfood the recipe.
|
|
159
|
-
- **A `perl -i -pe` for a semantic flip.** If author intent decides the migration, it's manual review. A mechanical sweep applied to a flip silently mis-migrates surfaces.
|
|
160
|
-
- **Merging component sweeps into one alternation regex.** One component per regex (capture-group preservation).
|
|
161
|
-
- **Skipping the in-repo sweep.** Shipping a breaking release whose own demo pages still use the old shape teaches consumers the wrong thing and trips the demo gates.
|
|
162
|
-
- **A bare CHANGELOG bullet with no guide section for a real break.** The CHANGELOG says _what_; the guide says _how_. A removed symbol needs both.
|
|
163
|
-
- **Treating this as the consumer sweep.** This skill authors the guide + migrates in-repo surfaces. Sweeping a downstream consumer app is the separate consumer/app-author plugin's job.
|
|
164
|
-
|
|
165
|
-
---
|
|
166
|
-
|
|
167
|
-
## §Verify target (mode 11)
|
|
168
|
-
|
|
169
|
-
The migration-guide section is "done" when:
|
|
170
|
-
|
|
171
|
-
1. Every breaking item in the cut's CHANGELOG has a matching `###` subsection (audit + sweep, or a labeled manual-review note).
|
|
172
|
-
2. The in-repo surfaces (demo / playground / catalog) are swept and the sweep-verification grep audit reports **0 legacy hits**.
|
|
173
|
-
3. The breaking cut's structural/demo gates pass.
|
|
174
|
-
4. The release notes carry the `⚠️` heads-up linking the guide section.
|