@adia-ai/adia-ui-forge 0.8.36 → 0.8.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +53 -18
- package/README.md +17 -17
- package/agents/{a2ui-builder.corpus.json → a2ui-maintenance-agent.corpus.json} +1 -1
- package/agents/{a2ui-builder.md → a2ui-maintenance-agent.md} +6 -6
- package/agents/framework-reviewer.md +6 -6
- package/agents/{release-builder.corpus.json → package-release-agent.corpus.json} +3 -3
- package/agents/{release-builder.md → package-release-agent.md} +7 -7
- package/agents/{component-author.corpus.json → primitive-authoring-agent.corpus.json} +2 -2
- package/agents/{component-author.md → primitive-authoring-agent.md} +7 -7
- package/agents/routing-corpus.json +40 -40
- package/commands/{dogfood.md → demo-audit.md} +2 -1
- package/commands/{gen-review.md → gen-ui-review.md} +3 -2
- package/commands/{release.md → package-release.md} +3 -2
- package/commands/{deploy.md → site-deployment.md} +2 -1
- package/package.json +1 -1
- package/references/contracts/a2ui-mcp-surface.md +16 -8
- package/references/contracts/migration-guide-format.md +4 -4
- package/scripts/demo-postwrite-pattern-gate +2 -2
- package/scripts/release-pretag-docs-gate +2 -2
- package/scripts/sidecar-prewrite-guard +3 -3
- package/skills/{adia-a2ui → a2ui-maintenance}/SKILL.md +10 -9
- package/skills/{adia-a2ui → a2ui-maintenance}/evals/evals.json +8 -8
- package/skills/{adia-a2ui → a2ui-maintenance}/evals/routing-corpus.json +51 -51
- package/skills/{adia-a2ui → a2ui-maintenance}/references/anti-patterns.md +2 -2
- package/skills/{adia-a2ui → a2ui-maintenance}/references/chunk-authoring.md +2 -2
- package/skills/{adia-a2ui → a2ui-maintenance}/references/eval-diagnostics.md +3 -3
- package/skills/{adia-a2ui → a2ui-maintenance}/references/format-extension-decisions.md +2 -2
- package/skills/{adia-a2ui → a2ui-maintenance}/references/mcp-pipeline-ops.md +5 -5
- package/skills/{adia-a2ui → a2ui-maintenance}/references/mcp-tool-reference.md +5 -4
- package/skills/{adia-a2ui → a2ui-maintenance}/references/pipeline-overview.md +18 -18
- package/skills/{adia-a2ui → a2ui-maintenance}/references/semantic-fail-lifting.md +2 -2
- package/skills/{adia-a2ui → a2ui-maintenance}/references/strategy-engines.md +2 -2
- package/skills/{adia-a2ui → a2ui-maintenance}/references/zettel-calibration.md +2 -2
- package/skills/{adia-dogfood → demo-audit}/SKILL.md +8 -8
- package/skills/{adia-dogfood → demo-audit}/evals/evals.json +7 -7
- package/skills/{adia-dogfood → demo-audit}/evals/routing-corpus.json +43 -43
- package/skills/{adia-dogfood → demo-audit}/references/visual-probe-triage.md +1 -1
- package/skills/{adia-dogfood → demo-audit}/scripts/analyze.mjs +2 -2
- package/skills/{adia-gen-review → gen-ui-review}/SKILL.md +13 -13
- package/skills/{adia-gen-review → gen-ui-review}/evals/evals.json +7 -7
- package/skills/{adia-gen-review → gen-ui-review}/evals/routing-corpus.json +43 -43
- package/skills/{adia-gen-review → gen-ui-review}/references/corpus-html-patterns.md +4 -4
- package/skills/{adia-gen-review → gen-ui-review}/references/loop-protocol.md +11 -11
- package/skills/{adia-gen-review → gen-ui-review}/references/scores.schema.json +1 -1
- package/skills/{adia-gen-review → gen-ui-review}/scripts/gen-review-coverage-audit.mjs +4 -4
- package/skills/{adia-gen-review → gen-ui-review}/scripts/gen-review-decompose.mjs +6 -6
- package/skills/{adia-gen-review → gen-ui-review}/scripts/gen-review-status.mjs +5 -5
- package/skills/{adia-gen-review → gen-ui-review}/scripts/validate-cycle-scores.mjs +5 -5
- package/skills/{adia-llm-internals → llm-client-maintenance}/SKILL.md +7 -7
- package/skills/{adia-llm-internals → llm-client-maintenance}/evals/evals.json +7 -7
- package/skills/{adia-llm-internals → llm-client-maintenance}/evals/routing-corpus.json +49 -49
- package/skills/{adia-llm-internals → llm-client-maintenance}/references/adapter-contract.md +3 -3
- package/skills/{adia-llm-internals → llm-client-maintenance}/references/add-a-provider.md +5 -5
- package/skills/{adia-llm-internals → llm-client-maintenance}/references/bridge-facade.md +2 -2
- package/skills/{adia-llm-internals → llm-client-maintenance}/references/browser-proxy-boundary.md +2 -2
- package/skills/{adia-llm-internals → llm-client-maintenance}/references/model-registry.md +2 -2
- package/skills/{adia-llm-internals → llm-client-maintenance}/references/streaming-sse.md +2 -2
- package/skills/{adia-release → package-release}/SKILL.md +16 -16
- package/skills/{adia-release → package-release}/evals/evals.json +7 -7
- package/skills/{adia-release → package-release}/evals/routing-corpus.json +45 -45
- package/skills/{adia-release → package-release}/references/changelog-discipline.md +4 -4
- package/skills/{adia-release → package-release}/references/cut-procedure.md +84 -30
- package/skills/{adia-release → package-release}/references/gates-catalog.md +7 -6
- package/skills/{adia-release → package-release}/references/independent-package-release.md +2 -2
- package/skills/{adia-release → package-release}/references/migration-guide-authoring.md +12 -3
- package/skills/{adia-release → package-release}/references/recovery-paths.md +5 -5
- package/skills/{adia-release → package-release}/scripts/bump.mjs +87 -37
- package/skills/{adia-release → package-release}/scripts/dispatch-publish.mjs +1 -1
- package/skills/{adia-release → package-release}/scripts/gate-roster.mjs +17 -6
- package/skills/{adia-release → package-release}/scripts/insert-stub.mjs +30 -8
- package/skills/{adia-release → package-release}/scripts/package-paths.mjs +47 -18
- package/skills/{adia-release → package-release}/scripts/pr-bridge.mjs +1 -1
- package/skills/{adia-release → package-release}/scripts/promote-unreleased.mjs +1 -1
- package/skills/{adia-release → package-release}/scripts/release-pack.mjs +29 -8
- package/skills/{adia-release → package-release}/scripts/tag-lockstep.mjs +2 -2
- package/skills/{adia-author → primitive-authoring}/SKILL.md +7 -7
- package/skills/{adia-author → primitive-authoring}/evals/evals.json +7 -7
- package/skills/{adia-author → primitive-authoring}/evals/routing-corpus.json +61 -61
- package/skills/{adia-author → primitive-authoring}/references/INDEX.md +2 -2
- package/skills/{adia-author → primitive-authoring}/references/authoring-cycle.md +1 -1
- package/skills/{adia-author → primitive-authoring}/references/code-style.md +5 -5
- package/skills/{adia-author → primitive-authoring}/references/common-gotchas.md +1 -1
- package/skills/{adia-author → primitive-authoring}/references/llm-bridge.md +17 -17
- package/skills/{adia-author → primitive-authoring}/references/module-promotion.md +5 -5
- package/skills/{adia-author → primitive-authoring}/references/shell-patterns.md +2 -2
- package/skills/{adia-author → primitive-authoring}/references/trait-pages.md +1 -1
- package/skills/{adia-author → primitive-authoring}/scripts/build-canonical-pattern-index.mjs +1 -1
- package/skills/{adia-deploy → site-deployment}/SKILL.md +6 -6
- package/skills/{adia-deploy → site-deployment}/evals/evals.json +8 -8
- package/skills/{adia-deploy → site-deployment}/evals/routing-corpus.json +49 -49
- package/skills/{adia-deploy → site-deployment}/references/deploy-playbooks.md +10 -10
- package/skills/{adia-site-docs → site-docs-authoring}/SKILL.md +4 -4
- package/skills/{adia-site-docs → site-docs-authoring}/evals/evals.json +7 -7
- package/skills/{adia-site-docs → site-docs-authoring}/evals/routing-corpus.json +51 -51
- package/skills/{adia-site-docs → site-docs-authoring}/intent.md +8 -8
- package/skills/{adia-ssr → ssr-compatibility}/SKILL.md +8 -8
- package/skills/{adia-ssr → ssr-compatibility}/evals/evals.json +7 -7
- package/skills/{adia-ssr → ssr-compatibility}/evals/routing-corpus.json +43 -43
- package/skills/{adia-ssr → ssr-compatibility}/references/failure-shapes.md +1 -1
- package/skills/{adia-ssr → ssr-compatibility}/references/guard-patterns.md +1 -1
- /package/skills/{adia-a2ui → a2ui-maintenance}/references/corpus-discipline.md +0 -0
- /package/skills/{adia-a2ui → a2ui-maintenance}/references/leverage-rules.md +0 -0
- /package/skills/{adia-dogfood → demo-audit}/references/admin-shell-anatomy.md +0 -0
- /package/skills/{adia-dogfood → demo-audit}/references/app-shell-pitfalls.md +0 -0
- /package/skills/{adia-dogfood → demo-audit}/references/card-anatomy-sweep.md +0 -0
- /package/skills/{adia-dogfood → demo-audit}/references/html-attr-sweep.md +0 -0
- /package/skills/{adia-dogfood → demo-audit}/references/native-leak-annotations.md +0 -0
- /package/skills/{adia-gen-review → gen-ui-review}/references/rubric-cosmetic.md +0 -0
- /package/skills/{adia-gen-review → gen-ui-review}/references/rubric-decompose.md +0 -0
- /package/skills/{adia-gen-review → gen-ui-review}/references/rubric-score.md +0 -0
- /package/skills/{adia-release → package-release}/references/notes-authoring.md +0 -0
- /package/skills/{adia-release → package-release}/scripts/assert-monorepo-root.mjs +0 -0
- /package/skills/{adia-author → primitive-authoring}/references/anti-patterns.md +0 -0
- /package/skills/{adia-author → primitive-authoring}/references/api-contract.md +0 -0
- /package/skills/{adia-author → primitive-authoring}/references/canonical-pattern-index.md +0 -0
- /package/skills/{adia-author → primitive-authoring}/references/composite-demo-protocol.md +0 -0
- /package/skills/{adia-author → primitive-authoring}/references/css-patterns.md +0 -0
- /package/skills/{adia-author → primitive-authoring}/references/lifecycle-patterns.md +0 -0
- /package/skills/{adia-author → primitive-authoring}/references/primitive-audit.md +0 -0
- /package/skills/{adia-author → primitive-authoring}/references/token-contract.md +0 -0
- /package/skills/{adia-author → primitive-authoring}/references/worked-example.md +0 -0
- /package/skills/{adia-author → primitive-authoring}/references/yaml-contract.md +0 -0
- /package/skills/{adia-ssr → ssr-compatibility}/references/consumer-workarounds.md +0 -0
- /package/skills/{adia-ssr → ssr-compatibility}/references/status-ledger.md +0 -0
- /package/skills/{adia-ssr → ssr-compatibility}/references/test-without-linkedom.md +0 -0
|
@@ -1,115 +1,115 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"name": "
|
|
3
|
+
"name": "package-release routing accuracy corpus",
|
|
4
4
|
"version": "2.1.0",
|
|
5
|
-
"purpose": "Routing-eval corpus for
|
|
5
|
+
"purpose": "Routing-eval corpus for package-release. Each phrase declares the skill (expected), a forbidden skill (expected_not, for phrases the source data only ever asserted as \"not this skill\"), or neither. Scored by scripts/skills/run-skill-evals.mjs (TF-IDF token overlap over per-skill description+triggers).",
|
|
6
6
|
"scoring_notes": "Heuristic signal, not ground truth. Treat misroutes as a prompt to tighten the skill description, never as a reason to keyword-stuff it. Real harness routing is LLM-driven.",
|
|
7
|
-
"scope": "
|
|
7
|
+
"scope": "package-release routing \u2014 does this phrase activate package-release?",
|
|
8
8
|
"phrases": [
|
|
9
9
|
{
|
|
10
|
-
"id": "
|
|
10
|
+
"id": "package-release-pos-01",
|
|
11
11
|
"phrase": "Cut and ship v0.8.5 of the AdiaUI packages",
|
|
12
|
-
"expected": "
|
|
12
|
+
"expected": "package-release"
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
|
-
"id": "
|
|
15
|
+
"id": "package-release-pos-02",
|
|
16
16
|
"phrase": "The [Unreleased] CHANGELOG entries are piling up, let's cut a release",
|
|
17
|
-
"expected": "
|
|
17
|
+
"expected": "package-release"
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
|
-
"id": "
|
|
20
|
+
"id": "package-release-pos-03",
|
|
21
21
|
"phrase": "Tag the lockstep packages and push them to origin",
|
|
22
|
-
"expected": "
|
|
22
|
+
"expected": "package-release"
|
|
23
23
|
},
|
|
24
24
|
{
|
|
25
|
-
"id": "
|
|
25
|
+
"id": "package-release-pos-04",
|
|
26
26
|
"phrase": "check:lockstep is failing \u2014 one package didn't bump",
|
|
27
|
-
"expected": "
|
|
27
|
+
"expected": "package-release"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
|
-
"id": "
|
|
30
|
+
"id": "package-release-pos-05",
|
|
31
31
|
"phrase": "Dispatch the publish workflows for v0.8.5 and verify npm",
|
|
32
|
-
"expected": "
|
|
32
|
+
"expected": "package-release"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
|
-
"id": "
|
|
35
|
+
"id": "package-release-pos-06",
|
|
36
36
|
"phrase": "We have three unpushed release commits piled up, batch-push them",
|
|
37
|
-
"expected": "
|
|
37
|
+
"expected": "package-release"
|
|
38
38
|
},
|
|
39
39
|
{
|
|
40
|
-
"id": "
|
|
40
|
+
"id": "package-release-pos-07",
|
|
41
41
|
"phrase": "F-N1 is warning about a CHANGELOG entry not covering a touched directory",
|
|
42
|
-
"expected": "
|
|
42
|
+
"expected": "package-release"
|
|
43
43
|
},
|
|
44
44
|
{
|
|
45
|
-
"id": "
|
|
45
|
+
"id": "package-release-pos-08",
|
|
46
46
|
"phrase": "The release cut landed on the wrong branch, help me recover",
|
|
47
|
-
"expected": "
|
|
47
|
+
"expected": "package-release"
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
|
-
"id": "
|
|
50
|
+
"id": "package-release-pos-09",
|
|
51
51
|
"phrase": "Author the release notes and Slack post for the last two versions",
|
|
52
|
-
"expected": "
|
|
52
|
+
"expected": "package-release"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
|
-
"id": "
|
|
55
|
+
"id": "package-release-pos-10",
|
|
56
56
|
"phrase": "This cut removes the variant prop from button-ui, write the MIGRATION GUIDE section",
|
|
57
|
-
"expected": "
|
|
57
|
+
"expected": "package-release"
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
|
-
"id": "
|
|
60
|
+
"id": "package-release-pos-11",
|
|
61
61
|
"phrase": "Publish the adia-ui-forge plugin independently of the lockstep set",
|
|
62
|
-
"expected": "
|
|
62
|
+
"expected": "package-release"
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
|
-
"id": "
|
|
65
|
+
"id": "package-release-pos-12",
|
|
66
66
|
"phrase": "Just verify the release gates are green without cutting anything",
|
|
67
|
-
"expected": "
|
|
67
|
+
"expected": "package-release"
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
|
-
"id": "
|
|
70
|
+
"id": "package-release-pos-13",
|
|
71
71
|
"phrase": "Tags are pushed but zero publish workflows fired, what happened",
|
|
72
|
-
"expected": "
|
|
72
|
+
"expected": "package-release"
|
|
73
73
|
},
|
|
74
74
|
{
|
|
75
|
-
"id": "
|
|
75
|
+
"id": "package-release-neg-01",
|
|
76
76
|
"phrase": "Restart the exe.dev VM, it's returning 502s",
|
|
77
|
-
"expected_not": "
|
|
77
|
+
"expected_not": "package-release"
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
|
-
"id": "
|
|
80
|
+
"id": "package-release-neg-02",
|
|
81
81
|
"phrase": "Rsync the built dist folder to ui-kit.exe.xyz",
|
|
82
|
-
"expected_not": "
|
|
82
|
+
"expected_not": "package-release"
|
|
83
83
|
},
|
|
84
84
|
{
|
|
85
|
-
"id": "
|
|
85
|
+
"id": "package-release-neg-03",
|
|
86
86
|
"phrase": "Sweep our consumer app for the renamed variant prop after the last breaking release",
|
|
87
|
-
"expected_not": "
|
|
87
|
+
"expected_not": "package-release"
|
|
88
88
|
},
|
|
89
89
|
{
|
|
90
|
-
"id": "
|
|
90
|
+
"id": "package-release-neg-04",
|
|
91
91
|
"phrase": "Add a new size variant to the button-ui primitive",
|
|
92
|
-
"expected_not": "
|
|
92
|
+
"expected_not": "package-release"
|
|
93
93
|
},
|
|
94
94
|
{
|
|
95
|
-
"id": "
|
|
95
|
+
"id": "package-release-neg-05",
|
|
96
96
|
"phrase": "Compose a settings screen for our app from the AdiaUI catalog",
|
|
97
|
-
"expected_not": "
|
|
97
|
+
"expected_not": "package-release"
|
|
98
98
|
},
|
|
99
99
|
{
|
|
100
|
-
"id": "
|
|
100
|
+
"id": "package-release-neg-06",
|
|
101
101
|
"phrase": "zettel coverage dropped on the nightly eval, find out why",
|
|
102
|
-
"expected_not": "
|
|
102
|
+
"expected_not": "package-release"
|
|
103
103
|
},
|
|
104
104
|
{
|
|
105
|
-
"id": "
|
|
105
|
+
"id": "package-release-neg-07",
|
|
106
106
|
"phrase": "sweep the component demos for native-primitive leaks before we cut",
|
|
107
|
-
"expected_not": "
|
|
107
|
+
"expected_not": "package-release"
|
|
108
108
|
},
|
|
109
109
|
{
|
|
110
|
-
"id": "
|
|
110
|
+
"id": "package-release-neg-08",
|
|
111
111
|
"phrase": "the gemini adapter is dropping usage tokens on streamed responses",
|
|
112
|
-
"expected": "
|
|
112
|
+
"expected": "llm-client-maintenance"
|
|
113
113
|
}
|
|
114
114
|
],
|
|
115
115
|
"_measured_historical": {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
The heading swap is all that happens; content under it stays:
|
|
19
19
|
|
|
20
20
|
```bash
|
|
21
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/
|
|
21
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/promote-unreleased.mjs" \
|
|
22
22
|
--version 0.X.Y --date YYYY-MM-DD --packages web-components,web-modules,a2ui/corpus
|
|
23
23
|
```
|
|
24
24
|
|
|
@@ -70,12 +70,12 @@ Why this recurs: cross-package sweeps leave 1–3 incidental touches (a docstrin
|
|
|
70
70
|
## §Stubs — ride-along lockstep
|
|
71
71
|
|
|
72
72
|
```bash
|
|
73
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/
|
|
73
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/insert-stub.mjs" \
|
|
74
74
|
--version 0.X.Y --date YYYY-MM-DD \
|
|
75
75
|
--substantive "<one-line> in @adia-ai/<pkg>" \
|
|
76
76
|
--xref "packages/web-modules/CHANGELOG.md#0XY--YYYY-MM-DD" \
|
|
77
77
|
--previous-version 0.X.Y-1 \
|
|
78
|
-
--packages llm,a2ui
|
|
78
|
+
--packages llm,a2ui-compose,a2ui-mcp,a2ui-retrieval,a2ui-runtime,a2ui-validator
|
|
79
79
|
```
|
|
80
80
|
|
|
81
81
|
The inserted block:
|
|
@@ -111,7 +111,7 @@ This is cut-procedure §Step 4f: the SAME matcher F-N1 uses at tag time (every r
|
|
|
111
111
|
**Recovery — a warn AFTER tagging** (Step 4f skipped, or an interleaved merge added uncovered changes): the release commit is already merged via PR, so `--amend` is not possible —
|
|
112
112
|
|
|
113
113
|
1. Run `--pending-version X.Y.Z --fix`; `git add` the CHANGELOGs; `git commit -m "fix(release): F-N1 enrichment — vX.Y.Z"`; push the branch → PR → CI → merge.
|
|
114
|
-
2. The SHA moved: `node "${CLAUDE_PLUGIN_ROOT}/skills/
|
|
114
|
+
2. The SHA moved: `node "${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/tag-lockstep.mjs" --version X.Y.Z --delete`, then re-tag at `main`'s new post-merge HEAD.
|
|
115
115
|
3. Re-run F-N1; expect per-package clean (umbrella error stays, ignored). ONE recovery round — if a second warn appears, the cause is upstream (find what keeps merging into the window), not another enrichment.
|
|
116
116
|
|
|
117
117
|
## §Dating and anchors
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
> failure routing), [`changelog-discipline.md`](changelog-discipline.md) (promotion
|
|
6
6
|
> + F-N1 enrichment), [`recovery-paths.md`](recovery-paths.md) (when it goes wrong).
|
|
7
7
|
> The concrete gate names, the roster's package paths (`scripts/package-paths.mjs`,
|
|
8
|
-
>
|
|
8
|
+
> 16 lockstep as of gh#1240's MCP-distribution fold), and `ui-kit.exe.xyz` deploy are the @adia-ai
|
|
9
9
|
> monorepo's worked example of the portable discipline. `$REPO` = repo root.
|
|
10
10
|
|
|
11
11
|
Two entry variants, converging at Step 5:
|
|
@@ -13,7 +13,7 @@ Two entry variants, converging at Step 5:
|
|
|
13
13
|
- **Variant A — deploy handoff:** a peer pre-cut the release commit + CHANGELOG + bump + lockfile. Re-baseline, verify, run **Step 4e** (release docs + team notes — the peer's cut may not have generated them, and the pretag gate blocks Step 6 without them), then resume at Step 6 (tag).
|
|
14
14
|
- **Variant B — author from scratch:** source landed under `## [Unreleased]` with no bump. Do Step 4 (promotion + bump + lockfile), then the full tail.
|
|
15
15
|
|
|
16
|
-
`` `${CLAUDE_PLUGIN_ROOT}/skills/
|
|
16
|
+
`` `${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/release-pack.mjs` `` (bundled) mechanizes the sequence in two phases per invariant 3 — the cut modes stop at the release commit (PR → CI → merge happens between), `--mode handoff` runs tag→publish→deploy from post-merge main. **Run with `--go` for an operator-initiated release** (single authorization, §below); the steps below are the manual/diagnostic form and run straight through on the same one-go model.
|
|
17
17
|
|
|
18
18
|
| Step | Action | Mutates? |
|
|
19
19
|
| --- | --- | --- |
|
|
@@ -71,7 +71,7 @@ node scripts/build/site-a2ui.mjs --stale # /site/components/* converted row
|
|
|
71
71
|
npm run harvest:chunks # chunk corpus from site/apps/playgrounds/catalog
|
|
72
72
|
npm run check:embeddings-fresh # ← run this FIRST; if it passes, SKIP the rebuild below
|
|
73
73
|
npm run build:embeddings:chunks # ONLY if the line above failed (needs OPENAI_API_KEY)
|
|
74
|
-
node scripts/release/check-token-semantics-sync.mjs --fix #
|
|
74
|
+
node scripts/release/check-token-semantics-sync.mjs --fix # token-selection role-roster + alias-layer
|
|
75
75
|
npm run build -w @adia-ai/llm # tsc artifact build:bundle-js resolves
|
|
76
76
|
npm run build:bundles # dist CSS+JS bundles
|
|
77
77
|
```
|
|
@@ -110,25 +110,30 @@ npm run dogfood:status # 17 P0/P1 dogfood floor
|
|
|
110
110
|
npm run check:examples-md-fresh # 18 .examples.md vs .examples.html
|
|
111
111
|
npm run verify:site-a2ui # 19 site-a2ui rows vs source fragments
|
|
112
112
|
npm run verify:contrast # 20 WCAG AA — canvas-text AND text-on-fill
|
|
113
|
-
npm run check:token-semantics-sync # 21
|
|
113
|
+
npm run check:token-semantics-sync # 21 token-selection generated refs vs token sources
|
|
114
114
|
npm run check:demo-routes # 22 demo surfaces routed + patterns indexed
|
|
115
115
|
npm run check:brand-assets # 23 brand mark token-driven, not baked raster
|
|
116
116
|
node scripts/release/check-cut-hygiene.mjs --version <mode-dependent> # 24 README CDN-pin + version currency — CUT modes pre-flight at the PREVIOUS version (the README claim is exact-match and only moves at the Step-4 bump; Step 4g re-proves at the cut version), HANDOFF pre-flights at the CUT version (post-merge, the claim already moved)
|
|
117
117
|
python3 packages/plugins/adia-ui-factory/scripts/adia-scaffold selftest # 25 scaffold specifiers resolve in packed @adia-ai/web-components + @adia-ai/web-modules tarballs (gh#1132)
|
|
118
|
-
node scripts/release/check-dx-sweep-freshness.mjs # 26 DX sweep fresh + not regression-RED (gh#1137 REQ-05 — FLAGGED, needs
|
|
118
|
+
node scripts/release/check-dx-sweep-freshness.mjs # 26 DX sweep fresh + not regression-RED (gh#1137 REQ-05 — FLAGGED, needs package-release confirmation; see the script's own header)
|
|
119
119
|
npm run eval:diff -- --engine free-form # 27 fresh free-form eval run (evals/health input, gh#1135)
|
|
120
120
|
node scripts/release/write-eval-health.mjs --version <cut> # 28 evals/health/<version>.json committed, AC-01/AC-02 run for real (gh#1135, WS-4 SPEC REQ-06)
|
|
121
|
+
node scripts/release/check-estate-split-latch.mjs # 29 no lockstep cut mid estate-split (ADR-0048 / gh#1192) — see the note below
|
|
121
122
|
```
|
|
122
123
|
|
|
124
|
+
**Gate 29 was the ADR-0048 latch; since P5 it is a permanent invariant.** Between P1 and P5 the repo was correct in-repo but deliberately **not publishable** (old-name stubs marked `private: true` that the roster still mapped, plus dependency edges onto workspace packages no cut published), and a cut in that window would have shipped broken packages that npm cannot unpublish. **P5 cleared it by landing the real thing** — the six stubs became publishable shims and `PACKAGE_ROSTER` gained the three remaining new names, at which point all 9 offending edges resolved and the gate went green on its own. No gate logic was changed.
|
|
125
|
+
|
|
126
|
+
It asserts three tree properties over the lockstep roster — no roster dir is `private: true`, and no roster package depends on a workspace package that is either private or absent from the roster — which is why it self-cleared rather than needing a removal. Never bypass it by flipping `private` or hand-editing the roster; that is the exact failure it exists to prevent. Self-check: `node scripts/release/check-estate-split-latch.mjs selftest`. It stays in the roster permanently: it now costs nothing and catches any FUTURE unpublishable dependency edge.
|
|
127
|
+
|
|
123
128
|
Any red → route via [`gates-catalog.md`](gates-catalog.md); fix at the source, re-run the narrowest gate, then re-run the full sequence. The canonical miss: a cut that ran 7 of the gates shipped a stale-embeddings defect that surfaced a day later and cost a tag-move recovery.
|
|
124
129
|
|
|
125
130
|
## §Step 4 — (Variant B, or ANY variant with uncommitted `[Unreleased]` content) Promote, bump, lockfile
|
|
126
131
|
|
|
127
132
|
**Run 4a whenever a hand-authored `## [Unreleased]` section is still sitting uncommitted, not only on a strict Variant B.** `release-pack.mjs --mode cut` (a peer's pre-staged content, not yet promoted) needs it exactly as much as `--mode from-scratch` does — the v0.8.4 near-miss was `--mode cut` skipping this step entirely because the doc (and the script) only associated promotion with "from scratch". Both modes now run it and both hard-fail before the bump if any roster package still carries non-empty `[Unreleased]` content afterward.
|
|
128
133
|
|
|
129
|
-
**4a. Promote** `## [Unreleased]` → `## [vX.Y.Z] — YYYY-MM-DD` per package (`` `${CLAUDE_PLUGIN_ROOT}/skills/
|
|
134
|
+
**4a. Promote** `## [Unreleased]` → `## [vX.Y.Z] — YYYY-MM-DD` per package (`` `${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/promote-unreleased.mjs` ``); author fresh blocks for changed-but-unlogged packages; stub the pure ride-alongs (`` `${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/insert-stub.mjs` ``). Classification recipe + shapes: [`changelog-discipline.md`](changelog-discipline.md).
|
|
130
135
|
|
|
131
|
-
**4b. Bump.** PATCH vs MINOR: **MINOR is reserved for API-surface breaks only** (removed/renamed prop, attribute, slot, event, token, or tag). Visible behavior changes, re-scalings, and opt-in features stay PATCH; a CHANGELOG bullet saying "(MINOR behavior change)" is prose, not a semver directive. Unqualified "bump version" = PATCH; don't round-trip to ask. `node "${CLAUDE_PLUGIN_ROOT}/skills/
|
|
136
|
+
**4b. Bump.** PATCH vs MINOR: **MINOR is reserved for API-surface breaks only** (removed/renamed prop, attribute, slot, event, token, or tag). Visible behavior changes, re-scalings, and opt-in features stay PATCH; a CHANGELOG bullet saying "(MINOR behavior change)" is prose, not a semver directive. Unqualified "bump version" = PATCH; don't round-trip to ask. `node "${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/bump.mjs" --from X.Y.Z-1 --to X.Y.Z`. On a MINOR cut, also bump the internal `@adia-ai/*` `^ranges` separately (bump.mjs touches `"version"` fields only) — and a MINOR cut owes a MIGRATION GUIDE section ([`migration-guide-authoring.md`](migration-guide-authoring.md)).
|
|
132
137
|
|
|
133
138
|
**4c. Lockfile.** `npm install --package-lock-only --no-audit --no-fund` — must land in the release commit. The publish workflows open with `npm ci`, which hard-fails on a version/lockfile mismatch: a bump without the regenerated lockfile passes locally and breaks **every** publish at clean-install.
|
|
134
139
|
|
|
@@ -190,10 +195,10 @@ stub sections exist leaves it nothing to append to, and the gap resurfaces
|
|
|
190
195
|
as F-N1 warns at the push boundary, costing a tag move:
|
|
191
196
|
|
|
192
197
|
```bash
|
|
193
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/
|
|
198
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/insert-stub.mjs" \
|
|
194
199
|
--version X.Y.Z --date YYYY-MM-DD --previous-version X.Y.Z-1 \
|
|
195
200
|
--substantive "<one-line>" --xref "<anchor>" --packages <missing-stubs> # 4a-stub — FIRST, only the missing ones (hard-errors on existing sections)
|
|
196
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/
|
|
201
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/bump.mjs" --from X.Y.Z-1 --to X.Y.Z # 4b (skip if versions already moved)
|
|
197
202
|
npm install --package-lock-only --no-audit --no-fund # 4c
|
|
198
203
|
npm run check:lockstep # 4d
|
|
199
204
|
node scripts/build/derive-genui-catalog.mjs # 4d.5 — catalogId carries the bumped version (gh#617)
|
|
@@ -218,7 +223,7 @@ allowlist (never `git add -A`; if peers may have pre-staged files,
|
|
|
218
223
|
git -C "$REPO" checkout -b "release/vX.Y.Z"
|
|
219
224
|
git -C "$REPO" reset HEAD >/dev/null 2>&1
|
|
220
225
|
git -C "$REPO" add package-lock.json packages/*/package.json packages/*/CHANGELOG.md \
|
|
221
|
-
packages/a2ui/*/package.json packages/a2ui/*/CHANGELOG.md \
|
|
226
|
+
packages/gen-ui/a2ui/*/package.json packages/gen-ui/a2ui/*/CHANGELOG.md \
|
|
222
227
|
packages/genui/adia-catalog/base.json packages/genui/adia-catalog/adia-pack.json \
|
|
223
228
|
docs/releases/vX.Y.Z.md # + in-scope source + Step-3.0 regen outputs
|
|
224
229
|
git -C "$REPO" diff --cached --stat | tail -3 # count must match the allowlist
|
|
@@ -245,7 +250,7 @@ unresolved AND no review requests changes; any other state stops with the
|
|
|
245
250
|
evidence, never force-merges):
|
|
246
251
|
|
|
247
252
|
```bash
|
|
248
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/
|
|
253
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/pr-bridge.mjs" \
|
|
249
254
|
--branch "release/vX.Y.Z" --title "release: vX.Y.Z lockstep" --body-file <path>
|
|
250
255
|
```
|
|
251
256
|
|
|
@@ -271,7 +276,7 @@ The operator's initiating instruction covers the whole cycle — no per-step re-
|
|
|
271
276
|
|
|
272
277
|
| Evidence logged before | Content | Why it's still printed |
|
|
273
278
|
| --- | --- | --- |
|
|
274
|
-
| Tagging (Step 6) | The planned tag list (umbrella +
|
|
279
|
+
| Tagging (Step 6) | The planned tag list (umbrella + 10 per-package) | The log line a recovery diagnoses from |
|
|
275
280
|
| Pushing (Step 8) | The Step 7 F-N1 output + tag list + `origin/main..HEAD` count | F-N1's first real evidence — and its ERROR path still hard-stops unconditionally |
|
|
276
281
|
| Publishing (Step 9) | The current registry snapshot (versions + `dist-tags.latest`) | Ordering is verified against what's LIVE, mechanically |
|
|
277
282
|
| Deploying (Step 10) | The `deploy-site.yml` dispatch (never a raw rsync) | The workflow carries its own GitHub-environment human gate |
|
|
@@ -293,8 +298,8 @@ Stage its CHANGELOG edits into the release commit (the Step-5 allowlist already
|
|
|
293
298
|
Log the planned tag list (evidence table above), then tag **at `main`'s post-merge HEAD** (post-bump fixes belong in the tarball; the window's last merge is the tag point — exception: batch push tags each version at its own release-merge SHA):
|
|
294
299
|
|
|
295
300
|
```bash
|
|
296
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/
|
|
297
|
-
--version X.Y.Z # umbrella vX.Y.Z +
|
|
301
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/tag-lockstep.mjs" \
|
|
302
|
+
--version X.Y.Z # umbrella vX.Y.Z + 10 <pkg>-vX.Y.Z (8 npm + 2 plugins)
|
|
298
303
|
```
|
|
299
304
|
|
|
300
305
|
## §Step 7 — F-N1 release trip-wire
|
|
@@ -313,14 +318,20 @@ only the tags push here. Log the Step 7 F-N1 results + the tag list
|
|
|
313
318
|
is 0 (a non-zero count means local commits bypassed the PR flow — stop
|
|
314
319
|
and route them through a PR first); then:
|
|
315
320
|
|
|
321
|
+
The package list comes from the roster, never a hand list. This block used to
|
|
322
|
+
enumerate the names inline and silently went stale — it pushed 11 tags against
|
|
323
|
+
a 14-package roster (`agent`, `persona` and `a2ui-protocol-mcp` missing), which
|
|
324
|
+
is three packages that would simply never publish.
|
|
325
|
+
|
|
316
326
|
```bash
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
327
|
+
PKGS=$(node -e "import('${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/package-paths.mjs')
|
|
328
|
+
.then(m => console.log(m.PACKAGE_ROSTER.filter(p => p.lockstep !== false).map(p => p.name).join(' ')))")
|
|
329
|
+
echo "$PKGS" # log it — this IS the tag list evidence
|
|
330
|
+
|
|
331
|
+
for p in $PKGS; do
|
|
332
|
+
git -C "$REPO" push origin "${p}-vX.Y.Z" # ONE tag per push — batched multi-tag
|
|
333
|
+
done # pushes drop the create event (Scenario 7)
|
|
334
|
+
git -C "$REPO" push origin vX.Y.Z # umbrella last; triggers nothing
|
|
324
335
|
```
|
|
325
336
|
|
|
326
337
|
## §Step 9 — Publish
|
|
@@ -328,16 +339,22 @@ git -C "$REPO" push origin vX.Y.Z # umbrella last; triggers nothing
|
|
|
328
339
|
Log the current registry snapshot (per-package versions + `dist-tags.latest`) before dispatching. For batch pushes, verify ordering against that snapshot: **oldest version publishes and settles first** — `npm dist-tag latest` is set by publish order. Then:
|
|
329
340
|
|
|
330
341
|
```bash
|
|
331
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/
|
|
342
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/dispatch-publish.mjs" \
|
|
332
343
|
--version X.Y.Z --verify-triggered # re-dispatches missing/dead runs; registry-gated (gh#763)
|
|
333
344
|
```
|
|
334
345
|
|
|
335
346
|
Wait for the workflows to settle, then verify against the **registry**, never the workflow's green check:
|
|
336
347
|
|
|
337
348
|
```bash
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
349
|
+
# The name list comes from PACKAGE_ROSTER, never a hand-typed loop — this loop
|
|
350
|
+
# WAS hand-typed and went stale the moment ADR-0048 changed the roster (it still
|
|
351
|
+
# named the six pre-split a2ui packages and omitted a2ui-protocol-mcp, so a
|
|
352
|
+
# "verified" cut would have skipped checking the package most likely to be
|
|
353
|
+
# missing: the new one).
|
|
354
|
+
for pkg in $(node -e '
|
|
355
|
+
import("./packages/plugins/adia-ui-forge/skills/package-release/scripts/package-paths.mjs")
|
|
356
|
+
.then(m => console.log(m.PACKAGE_ROSTER.filter(p => p.lockstep !== false).map(p => p.name).join(" ")))
|
|
357
|
+
'); do
|
|
341
358
|
echo -n "$pkg: "; npm view "@adia-ai/$pkg" version
|
|
342
359
|
done
|
|
343
360
|
npm view @adia-ai/web-components dist-tags.latest # must equal X.Y.Z
|
|
@@ -348,9 +365,10 @@ Zero workflows fired after a tag push → [`recovery-paths.md`](recovery-paths.m
|
|
|
348
365
|
## §Step 10 — GH releases + site deploy dispatch
|
|
349
366
|
|
|
350
367
|
```bash
|
|
351
|
-
for pkg in
|
|
352
|
-
|
|
353
|
-
|
|
368
|
+
for pkg in $(node -e '
|
|
369
|
+
import("./packages/plugins/adia-ui-forge/skills/package-release/scripts/package-paths.mjs")
|
|
370
|
+
.then(m => console.log(m.PACKAGE_ROSTER.filter(p => p.lockstep !== false).map(p => p.name).join(" ")))
|
|
371
|
+
'); do
|
|
354
372
|
gh release create "$pkg-vX.Y.Z" --title "@adia-ai/$pkg vX.Y.Z" --notes-file <body>.md
|
|
355
373
|
done
|
|
356
374
|
# Site deploy goes through the pipeline, never a raw rsync. The dispatch is
|
|
@@ -359,7 +377,7 @@ done
|
|
|
359
377
|
gh workflow run "Deploy site (ui-kit.exe.xyz)" --repo adiahealth/gen-ui-kit --ref main
|
|
360
378
|
```
|
|
361
379
|
|
|
362
|
-
Deploy discipline (the release tenant of the demo-site host; VM/service ops belong to the deploy skill, `
|
|
380
|
+
Deploy discipline (the release tenant of the demo-site host; VM/service ops belong to the deploy skill, `site-deployment`):
|
|
363
381
|
|
|
364
382
|
- `deploy-site.yml` owns build → pre-flight verify → snapshot → rsync → post-deploy verify → auto-rollback; it builds from `main`, so the release commit must already be merged (§Step 5.7 guarantees this). A raw local rsync bypasses every one of those gates — `release-pack.mjs` dispatches the workflow (never rsyncs directly) behind its own confirm (H1, forge-campaign gh#268 audit: the script had drifted from this already-documented procedure).
|
|
365
383
|
- **Verify deployed FILES, never SPA routes.** The docs site returns HTTP 200 + the same ~5 KB shell for *every* path; an unmatched route renders blank with no error. Curl a content file and grep for real bytes:
|
|
@@ -377,7 +395,43 @@ Any Step-2 stashes: `git stash pop`; flag conflicts to the operator.
|
|
|
377
395
|
|
|
378
396
|
Always author notes at end-of-cycle without being asked — context is freshest now. Single version → [`notes-authoring.md`](notes-authoring.md); ≥2 versions since the last broadcast → its §Rollup section. Surface the draft inline for copy-paste; the operator owns posting. Skip only on an explicit "no notes".
|
|
379
397
|
|
|
380
|
-
|
|
398
|
+
## §The 0.8.38 cut (the clean-world cut — delete this section after it lands)
|
|
399
|
+
|
|
400
|
+
The first cut AFTER the estate-split bridge. Pre-conditions, all verifiable
|
|
401
|
+
before Step 1:
|
|
402
|
+
|
|
403
|
+
1. **The shim-deletion follow-up PR has MERGED** (the §0.8.37 follow-up — that
|
|
404
|
+
section deleted itself with the same PR, as designed:
|
|
405
|
+
`packages/shims/` gone, roster shim rows gone, the six `publish-a2ui-*.yml`
|
|
406
|
+
workflows gone, `check:shims`/`check-shim-bridges` retired). The roster file
|
|
407
|
+
is the member count — never transcribe it.
|
|
408
|
+
2. **Deprecation pointers have been live for the full inter-cut window** —
|
|
409
|
+
`npm info <old-name> deprecated` returns the pointer text for all six names.
|
|
410
|
+
This is the stated policy for the one-cycle bridge: caret-floating consumers
|
|
411
|
+
landed on the shims at 0.8.37, were pointed at the successors the entire
|
|
412
|
+
window, and hard-stop only now. If the window was shorter than ~a week of
|
|
413
|
+
real consumer exposure, surface to the operator before cutting rather than
|
|
414
|
+
deleting the bridge out from under them.
|
|
415
|
+
3. **`fix-old-names` has swept the known consumer repos** against the shim
|
|
416
|
+
names (the closeout half of the rename wave + split).
|
|
417
|
+
4. Whatever landed between cuts rides along normally — as of authoring, the
|
|
418
|
+
queued candidates are the directory wave (gh#1244, npm-invisible), the
|
|
419
|
+
catalog tiers (gh#1243, new `@adia-ai/a2ui` subpath `./catalog`), and the
|
|
420
|
+
factory MCP server (gh#1241, a third `adia-mcp` subcommand — NOT a new
|
|
421
|
+
package). None changes the roster; if one does by then, the roster file
|
|
422
|
+
already reflects it and the gates enforce it.
|
|
423
|
+
|
|
424
|
+
**In the release commit:** nothing estate-split-specific remains — this is a
|
|
425
|
+
normal cut. If gh#1241 landed, the factory `.mcp.json` MAY additionally
|
|
426
|
+
register `adia-factory` (`["-y", "@adia-ai/mcp@0.8.38", "factory"]`) — an
|
|
427
|
+
addition, not a flip.
|
|
428
|
+
|
|
429
|
+
**After publish:** the standard registry verify, plus one split-closure check:
|
|
430
|
+
`npm view @adia-ai/a2ui-compose versions` should END at 0.8.37 (the shim's one
|
|
431
|
+
and only publish) — a 0.8.38 appearing under any retired name means a workflow
|
|
432
|
+
survived the follow-up PR; kill the tag and investigate before anything else.
|
|
433
|
+
|
|
434
|
+
Delete this section in the same PR that closes the split's tracking record.
|
|
381
435
|
|
|
382
436
|
## §Variant A shortcut
|
|
383
437
|
|
|
@@ -14,9 +14,9 @@ Row layout per gate: **What** · **Typical failure** · **Recovery**.
|
|
|
14
14
|
|
|
15
15
|
### `npm run check:lockstep`
|
|
16
16
|
|
|
17
|
-
- **What:** all
|
|
17
|
+
- **What:** all 10 lockstep `@adia-ai/*` packages declare the same `version` (the class-B `adia-plugins` package is excluded — `lockstep: false`, `scripts/package-paths.mjs`); internal `@adia-ai/*` dep ranges match policy (`^X.Y.0` during PATCH cycles, bumped at MINOR).
|
|
18
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 → `` `${CLAUDE_PLUGIN_ROOT}/skills/
|
|
19
|
+
- **Recovery:** version drift → `` `${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/bump.mjs` ``; range drift → `npm run check:lockstep:fix` auto-aligns, then re-run.
|
|
20
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
21
|
|
|
22
22
|
### `node scripts/release/check-release.mjs --all-pending` (F-N1, the release trip-wire)
|
|
@@ -96,8 +96,8 @@ Also: `check:no-self-import-css` (no transitively self-importing barrel) · `che
|
|
|
96
96
|
|
|
97
97
|
### `npm run check:browser-safe`
|
|
98
98
|
|
|
99
|
-
- **What:** no top-level `import 'node:*'` in browser-reachable modules (`packages/a2ui/{compose,retrieval,validator}`, `web-components/`, `web-modules/`, `apps/*/app/*.contents.js`).
|
|
100
|
-
- **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`.
|
|
99
|
+
- **What:** no top-level `import 'node:*'` in browser-reachable modules (`packages/gen-ui/a2ui/{compose,retrieval,validator}`, `web-components/`, `web-modules/`, `apps/*/app/*.contents.js`).
|
|
100
|
+
- **Recovery:** dual-mode pattern (`IS_NODE` + dynamic `await import(/* @vite-ignore */ 'node:*')` + `import.meta.glob` browser branch); canonical impl: `packages/gen-ui/a2ui/retrieval/component-catalog.js`.
|
|
101
101
|
|
|
102
102
|
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).
|
|
103
103
|
|
|
@@ -121,7 +121,7 @@ The two `audit:*` probes are soft-fail pre-cut (exit-1 only on criticals); findi
|
|
|
121
121
|
|
|
122
122
|
### `npm run verify:corpus`
|
|
123
123
|
|
|
124
|
-
- **What:** every chunk in `packages/a2ui/corpus/chunks/*.json` is reachable and well-formed.
|
|
124
|
+
- **What:** every chunk in `packages/gen-ui/a2ui/corpus/chunks/*.json` is reachable and well-formed.
|
|
125
125
|
- **Recovery:** corpus remediation routes to the A2UI-pipeline skill, not this one.
|
|
126
126
|
|
|
127
127
|
### `npm run check:chunks-fresh`
|
|
@@ -133,6 +133,7 @@ The two `audit:*` probes are soft-fail pre-cut (exit-1 only on criticals); findi
|
|
|
133
133
|
|
|
134
134
|
- **What:** `chunk-embeddings.json` at-or-newer-than `chunks/_index.json`.
|
|
135
135
|
- **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]`.
|
|
136
|
+
- **2026-08-12 — isolated agent worktrees can't run this recovery step.** An agent dispatched with `isolation: worktree` (e.g. `build-lead` resolving a merge conflict) structurally can't read the dotenv secrets file — a permission guard blocks copying it into the worktree, correctly, since that's a content-revealing operation on a secret file. Hit twice in one sweep: two separate PRs (#1113, #1117) each needed this recovery step mid-conflict-resolution and both had to hand off to a human running the command directly in their own terminal / via `!`. This step is a standing human-in-the-loop point, not something to keep dispatching an agent for.
|
|
136
137
|
|
|
137
138
|
### `npm run check:css-bundles-fresh` / `npm run check:js-bundles-fresh`
|
|
138
139
|
|
|
@@ -204,7 +205,7 @@ npm run check:demo-shells
|
|
|
204
205
|
|
|
205
206
|
Add `verify:corpus` + `check:embeddings-fresh` if chunks were touched; `check:lightningcss-build` if CSS was touched; F-N1 if unpushed release tags exist.
|
|
206
207
|
|
|
207
|
-
**Full pre-cut sweep** — the
|
|
208
|
+
**Full pre-cut sweep** — the 29-gate roster in [`cut-procedure.md`](cut-procedure.md) §Step 3, sourced from `` `${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/gate-roster.mjs` `` (the ONE list; `release-pack.mjs` imports and runs it in full — a subset run is impossible without editing that file). ~90s wall time.
|
|
208
209
|
|
|
209
210
|
**Omnibus** — `npm run check` invokes everything. Heavy; use when re-baselining a stale checkout.
|
|
210
211
|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
| | Class A — lockstep cut | Class B — independent package |
|
|
20
20
|
| --- | --- | --- |
|
|
21
21
|
| Versioning | whole set bumps together | own version line per package |
|
|
22
|
-
| Lockstep gate | enforced (`check:lockstep`
|
|
22
|
+
| Lockstep gate | enforced (`check:lockstep` 10/10) | **excluded** — a class-B package is not listed in `check-lockstep.mjs`'s `PACKAGES` (`adia-plugins`, the current member, is filtered out via `lockstep: false` — `scripts/package-paths.mjs`) |
|
|
23
23
|
| Umbrella tag | `vX.Y.Z` + per-package | **none** — per-package tags only (versions differ) |
|
|
24
24
|
| `dist-tag` ordering | cross-package publish order matters | N/A |
|
|
25
25
|
| Demo-site deploy | yes | **none** |
|
|
@@ -47,7 +47,7 @@ Substrate fixes (release scripts / lockfile / CHANGELOG), landed once as a norma
|
|
|
47
47
|
|
|
48
48
|
## §Verify target
|
|
49
49
|
|
|
50
|
-
The published package(s) on the **npm registry** at their independent versions, plus the npm-published `@adia-ai/adia-plugins` manifest referencing the new versions (ADR-0045). NOT "all
|
|
50
|
+
The published package(s) on the **npm registry** at their independent versions, plus the npm-published `@adia-ai/adia-plugins` manifest referencing the new versions (ADR-0045). NOT "all 10 lockstep packages + the demo site" — that's class A.
|
|
51
51
|
|
|
52
52
|
## §Gotchas (from the first independent cut, factory v0.2.2 + forge v0.1.2)
|
|
53
53
|
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
> the release ships the breaking change, so the release authors the guide section
|
|
6
6
|
> consumers follow. The shared producer/consumer format contract is
|
|
7
7
|
> [`../../../references/contracts/migration-guide-format.md`](../../../references/contracts/migration-guide-format.md)
|
|
8
|
-
> — the factory's `
|
|
8
|
+
> — the factory's `app-migration` skill consumes exactly that shape.
|
|
9
9
|
>
|
|
10
10
|
> Scope split: **producer (this skill)** authors the guide section + migrates the
|
|
11
11
|
> framework's own in-repo surfaces. **Consumer** (a downstream app sweep) is the
|
|
12
|
-
> factory plugin's `
|
|
12
|
+
> factory plugin's `app-migration` — decline and redirect. Designing the breaking
|
|
13
13
|
> change itself is a contract decision upstream of both.
|
|
14
14
|
|
|
15
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).
|
|
@@ -37,7 +37,9 @@ Author (or extend) a section when the cut removes or renames a **public API symb
|
|
|
37
37
|
git grep -nE '<pattern that surfaces call sites>'
|
|
38
38
|
|
|
39
39
|
**Sweep:**
|
|
40
|
-
git grep -
|
|
40
|
+
git grep -lz '<pattern>' | while IFS= read -r -d '' f; do
|
|
41
|
+
perl -i -pe 's/<old>/<new>/g' "$f"
|
|
42
|
+
done
|
|
41
43
|
```
|
|
42
44
|
|
|
43
45
|
Shape rules:
|
|
@@ -46,6 +48,13 @@ Shape rules:
|
|
|
46
48
|
- **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
49
|
- **One component per sweep regex** — alternation captures (`<(toast|alert)-ui`) don't preserve the matched alternative cleanly.
|
|
48
50
|
- **HTML-attribute regexes only match HTML/JSX** — author a separate JS-side regex when the symbol has a programmatic form (`el.variant = 'danger'`).
|
|
51
|
+
- **`git grep -lz | while read -d '' f; do perl -i … "$f"; done`, never `| xargs perl -i`.**
|
|
52
|
+
The `xargs` form hangs on zero matches (GNU xargs still runs perl once with no file argument,
|
|
53
|
+
and `perl -i -pe` then blocks reading stdin instead of no-op'ing) and, if `<old>`/`<new>` are
|
|
54
|
+
passed as shell variables rather than literals, an `@`-bearing replacement (`@adia-ai/...`)
|
|
55
|
+
parses as perl array interpolation when inlined into `-pe` and silently substitutes empty
|
|
56
|
+
(gh#1233) — pass such strings through the environment instead of the perl source, per
|
|
57
|
+
`.claude/docs/MIGRATION GUIDE.md`'s `§0.8.37` `sweep()` helper.
|
|
49
58
|
|
|
50
59
|
**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
60
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
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
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:
|
|
20
|
+
3. Sweep every occurrence of the wrong version: 10 × package.json, 10 × CHANGELOG (headers + body refs — the lockstep roster, `scripts/package-paths.mjs`), any doc/CSS-comment refs, then regenerate the lockfile. Preserve filename references that intentionally encode the original label.
|
|
21
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
22
|
|
|
23
23
|
## §Scenario 2 — Batch push
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
|
|
39
39
|
**Shape:** source + CHANGELOG entries landed under `## [Unreleased]`, no bump, no release commit.
|
|
40
40
|
|
|
41
|
-
**Resolution:** [`cut-procedure.md`](cut-procedure.md) Variant B; `` `${CLAUDE_PLUGIN_ROOT}/skills/
|
|
41
|
+
**Resolution:** [`cut-procedure.md`](cut-procedure.md) Variant B; `` `${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/promote-unreleased.mjs` `` mechanizes the heading swap; fresh blocks per [`changelog-discipline.md`](changelog-discipline.md) §Authoring.
|
|
42
42
|
|
|
43
43
|
## §Scenario 4 — `[Unreleased]` extension (early cut + entangled fix)
|
|
44
44
|
|
|
@@ -63,18 +63,18 @@
|
|
|
63
63
|
|
|
64
64
|
## §Scenario 7 — Tags pushed, ZERO publish workflows fired
|
|
65
65
|
|
|
66
|
-
**Shape:** all
|
|
66
|
+
**Shape:** all 11 tags exist on origin (umbrella + one per lockstep-roster package — `scripts/package-paths.mjs`), but no `publish-<pkg>.yml` run exists for them; npm latest unchanged; nothing errored.
|
|
67
67
|
|
|
68
68
|
**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).
|
|
69
69
|
|
|
70
70
|
**Resolution:**
|
|
71
71
|
|
|
72
72
|
```bash
|
|
73
|
-
node "${CLAUDE_PLUGIN_ROOT}/skills/
|
|
73
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/dispatch-publish.mjs" \
|
|
74
74
|
--version X.Y.Z --verify-triggered # re-dispatches packages with no run OR a dead (cancelled/failed/timed-out) run; registry-gated; idempotent
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
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); `` `${CLAUDE_PLUGIN_ROOT}/skills/
|
|
77
|
+
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); `` `${CLAUDE_PLUGIN_ROOT}/skills/package-release/scripts/release-pack.mjs` `` does this automatically and follows with `--verify-triggered`.
|
|
78
78
|
|
|
79
79
|
## §Scenario 8 — Cut on the wrong branch
|
|
80
80
|
|