@adia-ai/adia-ui-forge 0.8.35 → 0.8.37
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 +47 -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 +6 -5
- 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/eval-diagnostics.md +2 -2
- package/skills/{adia-a2ui → a2ui-maintenance}/references/format-extension-decisions.md +2 -2
- package/skills/{adia-a2ui → a2ui-maintenance}/references/mcp-pipeline-ops.md +1 -1
- package/skills/{adia-a2ui → a2ui-maintenance}/references/mcp-tool-reference.md +5 -4
- package/skills/{adia-a2ui → a2ui-maintenance}/references/pipeline-overview.md +15 -15
- package/skills/{adia-a2ui → a2ui-maintenance}/references/semantic-fail-lifting.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 +3 -3
- 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 +4 -4
- 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-release → package-release}/SKILL.md +17 -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 +170 -27
- package/skills/{adia-release → package-release}/references/gates-catalog.md +4 -3
- package/skills/{adia-release → package-release}/references/independent-package-release.md +12 -8
- 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 +77 -30
- 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 +29 -7
- package/skills/{adia-release → package-release}/scripts/package-paths.mjs +51 -6
- 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 +18 -4
- 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 +7 -7
- package/skills/{adia-author → primitive-authoring}/references/module-promotion.md +3 -3
- 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 +4 -4
- 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 +2 -2
- 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/anti-patterns.md +0 -0
- /package/skills/{adia-a2ui → a2ui-maintenance}/references/chunk-authoring.md +0 -0
- /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-a2ui → a2ui-maintenance}/references/strategy-engines.md +0 -0
- /package/skills/{adia-a2ui → a2ui-maintenance}/references/zettel-calibration.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-llm-internals → llm-client-maintenance}/references/adapter-contract.md +0 -0
- /package/skills/{adia-llm-internals → llm-client-maintenance}/references/add-a-provider.md +0 -0
- /package/skills/{adia-llm-internals → llm-client-maintenance}/references/bridge-facade.md +0 -0
- /package/skills/{adia-llm-internals → llm-client-maintenance}/references/browser-proxy-boundary.md +0 -0
- /package/skills/{adia-llm-internals → llm-client-maintenance}/references/model-registry.md +0 -0
- /package/skills/{adia-llm-internals → llm-client-maintenance}/references/streaming-sse.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,5 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
// bump.mjs — bump
|
|
2
|
+
// bump.mjs — bump every lockstep @adia-ai/* package.json from --from to --to.
|
|
3
|
+
// The set is PACKAGE_ROSTER (package-paths.mjs) filtered to `lockstep !== false`,
|
|
4
|
+
// never a count written here — that number went stale twice.
|
|
3
5
|
//
|
|
4
6
|
// Idempotent. Stops on the first mismatch (a package not at --from) so
|
|
5
7
|
// you can investigate before any mutation lands.
|
|
@@ -8,11 +10,11 @@
|
|
|
8
10
|
// node bump.mjs --from 0.6.20 --to 0.6.21
|
|
9
11
|
// node bump.mjs --from 0.6.20 --to 0.6.21 --dry
|
|
10
12
|
//
|
|
11
|
-
// Part of the
|
|
13
|
+
// Part of the package-release skill. Replaces the /tmp/vXXX-prep.mjs
|
|
12
14
|
// improvisation pattern from the v0.6.13 → v0.6.21 cycles.
|
|
13
15
|
//
|
|
14
16
|
// Exits:
|
|
15
|
-
// 0 —
|
|
17
|
+
// 0 — every lockstep package bumped successfully (or --dry succeeded)
|
|
16
18
|
// 1 — at least one package not at --from (no mutation)
|
|
17
19
|
// 2 — bad args / file I/O error
|
|
18
20
|
// 3 — partial mutation (shouldn't happen if --from validation passes)
|
|
@@ -43,26 +45,51 @@ const SIBLING_MANIFESTS = Object.fromEntries(
|
|
|
43
45
|
// version (SKILL invariant 8 — the consumer never floats). bump.mjs left this
|
|
44
46
|
// untouched through the 0.8.6 + 0.8.7 cuts, forcing a manual edit + amend each
|
|
45
47
|
// time; check-lockstep's mcp-pin guard now catches a drift, this moves it.
|
|
48
|
+
//
|
|
49
|
+
// Each package maps to an ARRAY of pin configs — the factory README's own
|
|
50
|
+
// prose echo of the same pin (`server pinned: @adia-ai/a2ui-mcp@X`) is a
|
|
51
|
+
// SECOND file invariant 8 covers, and check:plugin-count-claims' "factory
|
|
52
|
+
// README a2ui-mcp pin" EQUALITY check enforces the two agree. Left out of
|
|
53
|
+
// this array through the 0.8.35 + 0.8.36 cuts, it needed the same manual
|
|
54
|
+
// hand-commit .mcp.json used to (gh#1198) — same file set, invariant 8's own
|
|
55
|
+
// scope, so it moves alongside .mcp.json rather than getting its own key.
|
|
56
|
+
//
|
|
57
|
+
// ANY NAME THIS PIN HAS CARRIED (ADR-0048 P5, retargeted gh#1240 2026-08-14):
|
|
58
|
+
// the generation MCP is `@adia-ai/mcp` (its `gen-ui` surface) since the
|
|
59
|
+
// MCP-distribution fold — P2 had planned `@adia-ai/gen-ui-mcp`, which never
|
|
60
|
+
// published — but the pin keeps naming the old package until the P7 cut
|
|
61
|
+
// flips it in the release commit itself (see lockstep-checks.mjs MCP_PIN_RE
|
|
62
|
+
// for why an early flip pins consumers to a 404). Matching every name means
|
|
63
|
+
// the version bump works before AND after either flip, with no cut-day edit
|
|
64
|
+
// to this file.
|
|
65
|
+
const A2UI_MCP_PIN = {
|
|
66
|
+
label: 'generation-MCP pin (@adia-ai/{a2ui-mcp,gen-ui-mcp,mcp})',
|
|
67
|
+
// `@adia-ai/{a2ui-mcp,gen-ui-mcp,mcp}@<from>` (not a prefix of a longer version) → `@<to>`
|
|
68
|
+
// Escape EVERY regex metacharacter in `from`, not just dots: a prerelease or
|
|
69
|
+
// build-metadata version (`0.9.0-rc+1`) would otherwise inject `+` as a
|
|
70
|
+
// quantifier and silently match the wrong text. Same class as the truncating
|
|
71
|
+
// MCP_PIN_RE suffix CodeRabbit found on PR #1229.
|
|
72
|
+
pattern: (from) =>
|
|
73
|
+
new RegExp(`(@adia-ai/(?:(?:a2ui|gen-ui)-mcp|mcp)@)${from.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?![\\d.])`),
|
|
74
|
+
replace: (to) => `$1${to}`,
|
|
75
|
+
};
|
|
46
76
|
const PINNED_REFS = {
|
|
47
|
-
'packages/plugins/adia-ui-factory':
|
|
48
|
-
file: '.mcp.json',
|
|
49
|
-
label: '
|
|
50
|
-
|
|
51
|
-
pattern: (from) => new RegExp(`(@adia-ai/a2ui-mcp@)${from.replace(/\./g, '\\.')}(?![\\d.])`),
|
|
52
|
-
replace: (to) => `$1${to}`,
|
|
53
|
-
},
|
|
77
|
+
'packages/plugins/adia-ui-factory': [
|
|
78
|
+
{ ...A2UI_MCP_PIN, file: '.mcp.json' },
|
|
79
|
+
{ ...A2UI_MCP_PIN, file: 'README.md', label: 'generation-MCP pin (README prose)' },
|
|
80
|
+
],
|
|
54
81
|
// web-modules' internal peers pin the EXACT lockstep version (gh#489 —
|
|
55
82
|
// a caret peer never moves on a lockstep bump; adia-v2 sat on llm 0.8.19
|
|
56
83
|
// under web-modules 0.8.22). Same file bumpAll already rewrote for
|
|
57
84
|
// "version", so this pass re-reads it from disk before matching. The
|
|
58
85
|
// check:lockstep peer-exact-mismatch guard catches a pin left behind.
|
|
59
|
-
'packages/web-modules': {
|
|
86
|
+
'packages/web-modules': [{
|
|
60
87
|
file: 'package.json',
|
|
61
88
|
label: '@adia-ai/* exact peer pins',
|
|
62
89
|
pattern: (from) =>
|
|
63
90
|
new RegExp(`("@adia-ai/[a-z0-9-]+":\\s*")${from.replace(/\./g, '\\.')}(?![\\d.])`, 'g'),
|
|
64
91
|
replace: (to) => `$1${to}`,
|
|
65
|
-
},
|
|
92
|
+
}],
|
|
66
93
|
};
|
|
67
94
|
|
|
68
95
|
// Repo-level version references (path relative to REPO ROOT, not a package) —
|
|
@@ -131,13 +158,15 @@ function loadPackageJsons(repo) {
|
|
|
131
158
|
// half-bumped tree whose re-run then failed validateAllAtFrom.)
|
|
132
159
|
function loadPinnedRefs(repo) {
|
|
133
160
|
const out = [];
|
|
134
|
-
for (const [pkg,
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
161
|
+
for (const [pkg, cfgs] of Object.entries(PINNED_REFS)) {
|
|
162
|
+
for (const cfg of cfgs) {
|
|
163
|
+
const p = path.join(repo, pkg, cfg.file);
|
|
164
|
+
if (!fs.existsSync(p)) {
|
|
165
|
+
console.error(`error: missing ${p}`);
|
|
166
|
+
process.exit(2);
|
|
167
|
+
}
|
|
168
|
+
out.push({ pkg, cfg, path: p, txt: fs.readFileSync(p, 'utf8') });
|
|
139
169
|
}
|
|
140
|
-
out.push({ pkg, cfg, path: p, txt: fs.readFileSync(p, 'utf8') });
|
|
141
170
|
}
|
|
142
171
|
for (const cfg of REPO_PINNED_REFS) {
|
|
143
172
|
const p = path.join(repo, cfg.file);
|
|
@@ -206,17 +235,19 @@ function bumpAll(packages, from, to, dry) {
|
|
|
206
235
|
if (!dry) fs.writeFileSync(sibPath, sibOut);
|
|
207
236
|
console.log(` ${dry ? '[dry] ' : ''}bumped ${p.pkg}/${sibling}: ${from} → ${to}`);
|
|
208
237
|
}
|
|
209
|
-
const
|
|
210
|
-
if (
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
238
|
+
const pins = PINNED_REFS[p.pkg];
|
|
239
|
+
if (pins) {
|
|
240
|
+
for (const pin of pins) {
|
|
241
|
+
const pinPath = path.join(path.dirname(p.path), pin.file);
|
|
242
|
+
const pinTxt = fs.readFileSync(pinPath, 'utf8');
|
|
243
|
+
const pinOut = bumpPinnedRef(pinTxt, pin, from, to);
|
|
244
|
+
if (pinOut === pinTxt) {
|
|
245
|
+
console.error(`error: ${p.pkg}/${pin.file} — ${pin.label} '@${from}' not found (invariant 8 drift? set the pin to @${from} and re-run, or use \`npm run check:lockstep:fix\`)`);
|
|
246
|
+
return -1;
|
|
247
|
+
}
|
|
248
|
+
if (!dry) fs.writeFileSync(pinPath, pinOut);
|
|
249
|
+
console.log(` ${dry ? '[dry] ' : ''}bumped ${p.pkg}/${pin.file} ${pin.label}: @${from} → @${to}`);
|
|
217
250
|
}
|
|
218
|
-
if (!dry) fs.writeFileSync(pinPath, pinOut);
|
|
219
|
-
console.log(` ${dry ? '[dry] ' : ''}bumped ${p.pkg}/${pin.file} ${pin.label}: @${from} → @${to}`);
|
|
220
251
|
}
|
|
221
252
|
}
|
|
222
253
|
return bumped;
|
|
@@ -268,7 +299,7 @@ function selftest() {
|
|
|
268
299
|
}
|
|
269
300
|
|
|
270
301
|
// PINNED_REFS — the .mcp.json a2ui-mcp pin (invariant 8) moves in lockstep.
|
|
271
|
-
const pinCfg = PINNED_REFS['packages/plugins/adia-ui-factory'];
|
|
302
|
+
const [pinCfg, readmePinCfg] = PINNED_REFS['packages/plugins/adia-ui-factory'];
|
|
272
303
|
const pinBefore = '{"args":["-y","@adia-ai/a2ui-mcp@0.8.6"]}';
|
|
273
304
|
const pinAfter = bumpPinnedRef(pinBefore, pinCfg, '0.8.6', '0.8.7');
|
|
274
305
|
if (!pinAfter.includes('@adia-ai/a2ui-mcp@0.8.7') || pinAfter.includes('@0.8.6')) {
|
|
@@ -279,9 +310,25 @@ function selftest() {
|
|
|
279
310
|
console.error('selftest FAIL: PINNED_REFS pattern prefix-matched a longer version'); process.exit(1);
|
|
280
311
|
}
|
|
281
312
|
|
|
313
|
+
// gh#1198 — the factory README's OWN prose echo of the same pin
|
|
314
|
+
// (`server pinned: @adia-ai/a2ui-mcp@X`) must move alongside .mcp.json;
|
|
315
|
+
// check:plugin-count-claims' "factory README a2ui-mcp pin" EQUALITY check
|
|
316
|
+
// is what caught this drift on the v0.8.35 + v0.8.36 cuts.
|
|
317
|
+
if (readmePinCfg.file !== 'README.md') {
|
|
318
|
+
console.error('selftest FAIL: expected the second factory pin config to target README.md'); process.exit(1);
|
|
319
|
+
}
|
|
320
|
+
const readmeBefore = '`a2ui` server pinned: `@adia-ai/a2ui-mcp@0.8.6` (tool SoT: `packages/mcp/TOOLS.md`)';
|
|
321
|
+
const readmeAfter = bumpPinnedRef(readmeBefore, readmePinCfg, '0.8.6', '0.8.7');
|
|
322
|
+
if (!readmeAfter.includes('@adia-ai/a2ui-mcp@0.8.7') || readmeAfter.includes('@0.8.6')) {
|
|
323
|
+
console.error('selftest FAIL: PINNED_REFS did not bump the README a2ui-mcp prose pin'); process.exit(1);
|
|
324
|
+
}
|
|
325
|
+
if (bumpPinnedRef('@adia-ai/a2ui-mcp@0.8.60', readmePinCfg, '0.8.6', '0.8.7') !== '@adia-ai/a2ui-mcp@0.8.60') {
|
|
326
|
+
console.error('selftest FAIL: README pin pattern prefix-matched a longer version'); process.exit(1);
|
|
327
|
+
}
|
|
328
|
+
|
|
282
329
|
// web-modules exact peer pins (gh#489) — all three move in one pass; a
|
|
283
330
|
// longer version must not prefix-match.
|
|
284
|
-
const peerCfg = PINNED_REFS['packages/web-modules'];
|
|
331
|
+
const [peerCfg] = PINNED_REFS['packages/web-modules'];
|
|
285
332
|
const peersBefore = '{"peerDependencies":{"@adia-ai/web-components": "0.8.22","@adia-ai/a2ui-runtime": "0.8.22","@adia-ai/llm": "0.8.22"}}';
|
|
286
333
|
const peersAfter = bumpPinnedRef(peersBefore, peerCfg, '0.8.22', '0.8.23');
|
|
287
334
|
if ((peersAfter.match(/0\.8\.23/g) || []).length !== 3 || peersAfter.includes('0.8.22')) {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// # Dry mode:
|
|
15
15
|
// node dispatch-publish.mjs --version 0.6.22 --dry
|
|
16
16
|
//
|
|
17
|
-
// Part of the
|
|
17
|
+
// Part of the package-release skill. Mechanizes the dispatch loop
|
|
18
18
|
// + handles the npm-latest ordering rule for batch pushes.
|
|
19
19
|
|
|
20
20
|
import { execFileSync } from 'node:child_process';
|
|
@@ -45,11 +45,11 @@ export const GATE_ROSTER = [
|
|
|
45
45
|
// cut. examples-md + site-a2ui are the two generators an `.examples.html`
|
|
46
46
|
// edit invalidates (the v0.8.14 cut lost a CI round-trip to exactly that);
|
|
47
47
|
// contrast is the AA gate that gh#427 widened from 42 to 90 pairs;
|
|
48
|
-
// token-semantics-sync keeps the
|
|
48
|
+
// token-semantics-sync keeps the token-selection pack's generated half honest.
|
|
49
49
|
{ n: 18, cmd: 'npm run check:examples-md-fresh', what: '.examples.md vs .examples.html' },
|
|
50
50
|
{ n: 19, cmd: 'npm run verify:site-a2ui', what: 'site-a2ui converted rows vs source fragments' },
|
|
51
51
|
{ n: 20, cmd: 'npm run verify:contrast', what: 'WCAG AA — canvas-text + text-on-fill pairs' },
|
|
52
|
-
{ n: 21, cmd: 'npm run check:token-semantics-sync', what: '
|
|
52
|
+
{ n: 21, cmd: 'npm run check:token-semantics-sync', what: 'token-selection generated references vs token sources' },
|
|
53
53
|
// Operator directive 2026-07-27: demo surfaces must be discoverable —
|
|
54
54
|
// components/modules with .examples.html need a /site/components route,
|
|
55
55
|
// catalog patterns need their Pattern Library sitemap entry.
|
|
@@ -73,12 +73,12 @@ export const GATE_ROSTER = [
|
|
|
73
73
|
{ n: 25, cmd: 'python3 packages/plugins/adia-ui-factory/scripts/adia-scaffold selftest', what: 'scaffold specifiers resolve in packed tarballs' },
|
|
74
74
|
// gh#1137 (factory-dx-ws6-measurement SPEC, REQ-05) — FLAGGED FOR
|
|
75
75
|
// CONFIRMATION: this entry was authored by the WS-6 build without a live
|
|
76
|
-
//
|
|
76
|
+
// package-release sign-off (no operator was available mid-build to confirm
|
|
77
77
|
// the exact freshness window / regression semantics). Asserts a
|
|
78
78
|
// qa/dx/sweeps/ record exists dated within this cut's window AND its
|
|
79
79
|
// verdict is not a regression-RED (a plain floors<=1 baseline RED does
|
|
80
80
|
// NOT block a cut — only a floor that DROPPED since the prior sweep
|
|
81
|
-
// does). CONFIRMED by
|
|
81
|
+
// does). CONFIRMED by package-release on the first live cut (v0.8.35,
|
|
82
82
|
// 2026-08-13): semantics hold, with one correction — the previous-cut
|
|
83
83
|
// comparison excludes the in-flight target version (self-reference fired
|
|
84
84
|
// on the handoff re-run, since the promoted heading was already on main).
|
|
@@ -93,14 +93,25 @@ export const GATE_ROSTER = [
|
|
|
93
93
|
// concern this is not) — hence `targetVersionArg` rather than
|
|
94
94
|
// `versionArg`, a distinct flag release-pack.mjs's step3PreFlight reads.
|
|
95
95
|
{ n: 28, cmd: 'node scripts/release/write-eval-health.mjs', what: 'evals/health/<version>.json committed, AC-01/AC-02 run for real', targetVersionArg: true },
|
|
96
|
+
// ADR-0048 (gh#1192) estate-split latch. Between P1 (mint @adia-ai/gen-ui)
|
|
97
|
+
// and P5 (shims + roster) the tree is correct in-repo but deliberately
|
|
98
|
+
// NOT publishable: the old package dirs are `private: true` stubs the
|
|
99
|
+
// roster still points at, and a2ui-mcp depends on @adia-ai/gen-ui, which
|
|
100
|
+
// is not on npm until P7. Prose in this doc does not stop a 2am cut; this
|
|
101
|
+
// gate does. It is a tree property (private / unrostered dep edges), not a
|
|
102
|
+
// phase number, so it clears itself when P5 lands — and then stays as a
|
|
103
|
+
// permanent no-cost invariant against any future private-dep edge.
|
|
104
|
+
// Appended rather than inserted: gate numbers are cited as identities in
|
|
105
|
+
// shipped release notes, so renumbering would falsify them.
|
|
106
|
+
{ n: 29, cmd: 'node scripts/release/check-estate-split-latch.mjs', what: 'no lockstep cut mid estate-split (ADR-0048)' },
|
|
96
107
|
];
|
|
97
108
|
|
|
98
109
|
// -- CLI ------------------------------------------------------------------
|
|
99
110
|
// Only runs when invoked directly (not when imported by release-pack.mjs).
|
|
100
111
|
// realpathSync BOTH sides (CodeRabbit, PR #289): a naive string/URL compare
|
|
101
112
|
// breaks under a symlinked invocation — this skill is normally reached
|
|
102
|
-
// through `.claude/skills/
|
|
103
|
-
// skills/
|
|
113
|
+
// through `.claude/skills/package-release` -> `packages/plugins/adia-ui-forge/
|
|
114
|
+
// skills/package-release`, and Node resolves `import.meta.url` through that
|
|
104
115
|
// symlink to the real file while `process.argv[1]` keeps the as-invoked
|
|
105
116
|
// path, so an unresolved compare never matches even when this IS the entry
|
|
106
117
|
// point. Verified directly (see embeddings-chunks.mjs's identical guard).
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
// --substantive "<one-line summary>" \
|
|
10
10
|
// --xref "packages/web-modules/CHANGELOG.md#0622--2026-05-22" \
|
|
11
11
|
// --previous-version 0.6.21 \
|
|
12
|
-
// --packages llm,a2ui
|
|
12
|
+
// --packages llm,a2ui-compose,a2ui-mcp,a2ui-retrieval,a2ui-runtime,a2ui-validator
|
|
13
13
|
//
|
|
14
|
-
// Part of the
|
|
14
|
+
// Part of the package-release skill. Replaces the inline stub-
|
|
15
15
|
// insertion pattern used across v0.6.18 / v0.6.19 / v0.6.20 / v0.6.21
|
|
16
16
|
// cycles.
|
|
17
17
|
|
|
@@ -82,8 +82,20 @@ function insertStub(repo, pkg, anchor, stubBlock, version, dry) {
|
|
|
82
82
|
}
|
|
83
83
|
const txt = fs.readFileSync(p, 'utf8');
|
|
84
84
|
if (txt.includes(`## [${version}]`)) {
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
// TRUE idempotency across partial runs (the gh#976 lesson, learned
|
|
86
|
+
// here on the v0.8.36 cut's r4): an earlier aborted run already
|
|
87
|
+
// inserted this stub — that's the DONE state, not an error. The
|
|
88
|
+
// BOTH-headings danger promote-unreleased guards (real [Unreleased]
|
|
89
|
+
// content that would miss the release) applies here too: a stub
|
|
90
|
+
// package whose [Unreleased] still carries content means it was
|
|
91
|
+
// wrongly classified as a stub — loud stop.
|
|
92
|
+
const un = txt.match(/^## \[Unreleased\][^\n]*\n([\s\S]*?)(?=^## \[|(?![\s\S]))/m);
|
|
93
|
+
if (un && un[1].trim().length > 0) {
|
|
94
|
+
console.error(` ERROR ${pkg} — has [${version}] heading AND non-empty [Unreleased] content: this package is substantive, not a stub — move it to --substantive-packages`);
|
|
95
|
+
return 'already-present';
|
|
96
|
+
}
|
|
97
|
+
console.log(` ok ${pkg} — stub already present (idempotent skip)`);
|
|
98
|
+
return 'inserted';
|
|
87
99
|
}
|
|
88
100
|
if (!txt.includes(anchor)) {
|
|
89
101
|
console.error(` ERROR ${pkg} — anchor '${anchor}' not found`);
|
|
@@ -147,10 +159,20 @@ function selftest() {
|
|
|
147
159
|
console.error('selftest FAIL: stub must land ABOVE the previous-version anchor, not below'); process.exit(1);
|
|
148
160
|
}
|
|
149
161
|
|
|
150
|
-
//
|
|
151
|
-
//
|
|
162
|
+
// TRUE idempotency across partial runs (gh#976 lesson, v0.8.36 r4): a
|
|
163
|
+
// re-run against an already-stubbed target is the DONE state — ok skip,
|
|
164
|
+
// file untouched, never a duplicate block.
|
|
165
|
+
const beforeRerun = fs.readFileSync(clPath, 'utf8');
|
|
152
166
|
const r2 = insertStub(tmp, 'llm', anchor, stub, '0.2.0', false);
|
|
153
|
-
if (r2 !== '
|
|
167
|
+
if (r2 !== 'inserted') { console.error(`selftest FAIL: expected idempotent 'inserted' on re-run, got '${r2}'`); process.exit(1); }
|
|
168
|
+
if (fs.readFileSync(clPath, 'utf8') !== beforeRerun) { console.error('selftest FAIL: idempotent re-run must not modify the file'); process.exit(1); }
|
|
169
|
+
if ((fs.readFileSync(clPath, 'utf8').match(/## \[0\.2\.0\]/g) || []).length !== 1) { console.error('selftest FAIL: duplicate stub block'); process.exit(1); }
|
|
170
|
+
|
|
171
|
+
// The one loud stop left: stub heading present BUT non-empty [Unreleased]
|
|
172
|
+
// — a substantive package misclassified as a stub.
|
|
173
|
+
fs.writeFileSync(clPath, `# C\n\n## [Unreleased]\n\n### Fixed\n- real content\n\n## [0.2.0] — 2026-02-02\n\n- stub\n\n${anchor}\n\n- prior\n`);
|
|
174
|
+
const r3 = insertStub(tmp, 'llm', anchor, stub, '0.2.0', false);
|
|
175
|
+
if (r3 !== 'already-present') { console.error(`selftest FAIL: expected 'already-present' for misclassified stub, got '${r3}'`); process.exit(1); }
|
|
154
176
|
|
|
155
177
|
console.log('selftest OK');
|
|
156
178
|
} finally {
|
|
@@ -55,6 +55,13 @@ import path from 'node:path';
|
|
|
55
55
|
// trip-wire (check-release.mjs's per-tag `checkTag` lookup) reads the FULL
|
|
56
56
|
// roster unfiltered — every pushed tag, lockstep or not, still needs its
|
|
57
57
|
// package.json/CHANGELOG validated, so it must recognize a class-B tag too.
|
|
58
|
+
// `shim` (added ADR-0048 P5): `true` marks an old npm name riding exactly ONE
|
|
59
|
+
// cut as a re-export shim before retirement. It changes NOTHING about how the
|
|
60
|
+
// cut treats the entry — a shim versions, tags, publishes and changelogs like
|
|
61
|
+
// any other lockstep member. It exists so P7's retirement PR has a mechanical
|
|
62
|
+
// answer to "which rows go away", instead of a name list someone has to
|
|
63
|
+
// re-derive from a doc. Absent = a permanent package.
|
|
64
|
+
//
|
|
58
65
|
// Every lockstep-scoped consumer must filter `p.lockstep !== false` itself
|
|
59
66
|
// (this module intentionally does NOT pre-filter PACKAGE_NAMES/PACKAGE_DIRS —
|
|
60
67
|
// they stay full-roster projections so a consumer's own filter is visible at
|
|
@@ -65,12 +72,43 @@ export const PACKAGE_ROSTER = [
|
|
|
65
72
|
{ name: 'llm', dir: 'packages/llm', lockstep: true },
|
|
66
73
|
{ name: 'agent', dir: 'packages/agent', lockstep: true },
|
|
67
74
|
{ name: 'persona', dir: 'packages/persona', lockstep: true },
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
75
|
+
// ── ADR-0048 P5 — the estate split's published names ────────────────────
|
|
76
|
+
//
|
|
77
|
+
// The successors of the six old a2ui-* names. `a2ui`/`gen-ui` join here,
|
|
78
|
+
// which is what turns gate 29 (check-estate-split-latch) green: every
|
|
79
|
+
// workspace dependency edge — web-components → a2ui, mcp/gen-ui → gen-ui,
|
|
80
|
+
// the shims → their successors — now points at a name some cut actually
|
|
81
|
+
// publishes.
|
|
82
|
+
//
|
|
83
|
+
// `mcp` (gh#1240, operator ruling 2026-08-14, roster 17 → 16): folds what
|
|
84
|
+
// were TWO planned rows — `gen-ui-mcp` (P2 rename target) and
|
|
85
|
+
// `a2ui-protocol-mcp` (minted fresh at P4) — into ONE published name,
|
|
86
|
+
// `@adia-ai/mcp`, at `packages/mcp/`. Neither predecessor name ever
|
|
87
|
+
// published a 0.8.x, so this fold has no npm deprecation cycle to run —
|
|
88
|
+
// unlike the SIX old a2ui-* shims below, which really did publish and need
|
|
89
|
+
// one. The two-SERVER decision (ADR-0048 §3) is unchanged; only the
|
|
90
|
+
// npm-distribution row count dropped by one.
|
|
91
|
+
{ name: 'a2ui', dir: 'packages/a2ui', lockstep: true },
|
|
92
|
+
{ name: 'gen-ui', dir: 'packages/gen-ui', lockstep: true },
|
|
93
|
+
{ name: 'mcp', dir: 'packages/mcp', lockstep: true },
|
|
94
|
+
// ── ADR-0048 P5 — the six old names, riding EXACTLY ONE cut as shims ────
|
|
95
|
+
//
|
|
96
|
+
// `npm unpublish` is impossible, so each retired name gets one final publish
|
|
97
|
+
// as a re-export shim (packages/shims/<name>, generated by
|
|
98
|
+
// scripts/build/generate-shims.mjs) plus an `npm deprecate` pointer run
|
|
99
|
+
// post-publish. They are on the roster only so that cut versions, tags,
|
|
100
|
+
// CHANGELOGs and publish workflows treat them like any other package.
|
|
101
|
+
//
|
|
102
|
+
// `shim: true` is the retirement marker, not decoration: P7's follow-up PR
|
|
103
|
+
// deletes exactly the entries carrying it, together with packages/shims/,
|
|
104
|
+
// their publish workflows, and resolvePackageDir's `shims/` fallback below.
|
|
105
|
+
// Nothing else in the roster is allowed to carry it.
|
|
106
|
+
{ name: 'a2ui-runtime', dir: 'packages/shims/a2ui-runtime', lockstep: true, shim: true },
|
|
107
|
+
{ name: 'a2ui-compose', dir: 'packages/shims/a2ui-compose', lockstep: true, shim: true },
|
|
108
|
+
{ name: 'a2ui-corpus', dir: 'packages/shims/a2ui-corpus', lockstep: true, shim: true },
|
|
109
|
+
{ name: 'a2ui-mcp', dir: 'packages/shims/a2ui-mcp', lockstep: true, shim: true },
|
|
110
|
+
{ name: 'a2ui-retrieval', dir: 'packages/shims/a2ui-retrieval', lockstep: true, shim: true },
|
|
111
|
+
{ name: 'a2ui-validator', dir: 'packages/shims/a2ui-validator', lockstep: true, shim: true },
|
|
74
112
|
// Plugins joined the lockstep 2026-07-15 (check-lockstep.mjs POLICY note);
|
|
75
113
|
// each carries a .claude-plugin/plugin.json that bumps with package.json.
|
|
76
114
|
{ name: 'adia-ui-factory', dir: 'packages/plugins/adia-ui-factory', lockstep: true, plugin: true },
|
|
@@ -98,6 +136,13 @@ export const PACKAGE_DIRS = PACKAGE_ROSTER.map((p) => p.dir);
|
|
|
98
136
|
// error against the resolved path).
|
|
99
137
|
export function resolvePackageDir(repo, pkg) {
|
|
100
138
|
if (fs.existsSync(path.join(repo, 'packages', pkg))) return pkg;
|
|
139
|
+
// ADR-0048 P3 — the old a2ui-* names now live at packages/shims/<old-name>.
|
|
140
|
+
// Tried before the legacy packages/a2ui/<x> nesting below so the shim wins
|
|
141
|
+
// while both could exist; both fallbacks die when P5 retires the shims.
|
|
142
|
+
if (/^a2ui-/.test(pkg)) {
|
|
143
|
+
const shim = path.join('shims', pkg);
|
|
144
|
+
if (fs.existsSync(path.join(repo, 'packages', shim))) return shim;
|
|
145
|
+
}
|
|
101
146
|
const m = /^a2ui-(.+)$/.exec(pkg);
|
|
102
147
|
if (m) {
|
|
103
148
|
const nested = path.join('a2ui', m[1]);
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
//
|
|
38
38
|
// Exit: 0 merged + main re-baselined · 1 stopped (evidence printed) · 2 bad args.
|
|
39
39
|
//
|
|
40
|
-
// Part of the
|
|
40
|
+
// Part of the package-release skill. Registered in CI's "Plugin bin selftests".
|
|
41
41
|
|
|
42
42
|
import { execSync, execFileSync } from 'node:child_process';
|
|
43
43
|
import fs from 'node:fs';
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// node promote-unreleased.mjs --version 0.6.22 --date 2026-05-22 \
|
|
15
15
|
// --packages web-components,web-modules --dry
|
|
16
16
|
//
|
|
17
|
-
// Part of the
|
|
17
|
+
// Part of the package-release skill. Replaces the inline heading-swap
|
|
18
18
|
// pattern used across v0.6.18 / v0.6.19 / v0.6.20 / v0.6.21 cycles.
|
|
19
19
|
//
|
|
20
20
|
// Exits:
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
// --skip-gates : (DEBUG ONLY) skip pre-flight (don't ship anything!)
|
|
56
56
|
// --skip-site : skip the EXE deploy step (rare; for offline cycles)
|
|
57
57
|
//
|
|
58
|
-
// Part of the
|
|
58
|
+
// Part of the package-release skill. Mechanizes the cut procedure from
|
|
59
59
|
// references/cut-procedure.md. Every confirmation boundary prints its evidence
|
|
60
60
|
// block BEFORE the prompt (H5) — never a bare y/N — whether it waits for input
|
|
61
61
|
// (manual flags) or auto-confirms (--go).
|
|
@@ -223,7 +223,7 @@ function help() {
|
|
|
223
223
|
--substantive "<one-line>" \\
|
|
224
224
|
--xref "packages/web-modules/CHANGELOG.md#0$X$Y$Z--YYYY-MM-DD" \\
|
|
225
225
|
--substantive-packages web-components,web-modules,a2ui/corpus \\
|
|
226
|
-
--stub-packages llm,a2ui
|
|
226
|
+
--stub-packages llm,a2ui-compose,a2ui-mcp,a2ui-retrieval,a2ui-runtime,a2ui-validator
|
|
227
227
|
|
|
228
228
|
Flags: --go (single-authorization: the operator's cut-start go covers the
|
|
229
229
|
whole cycle — auto-confirms ALL checkpoints; stops only on
|
|
@@ -691,6 +691,16 @@ function step5Commit(args) {
|
|
|
691
691
|
'packages/genui/adia-catalog/base.json',
|
|
692
692
|
'packages/genui/adia-catalog/adia-pack.json',
|
|
693
693
|
'packages/genui/adia-catalog/catalog-data.js',
|
|
694
|
+
// gh#1197: gate 28 (write-eval-health.mjs, Step 3) writes this
|
|
695
|
+
// COMMITTED per-cut health record — WS-4 REQ-06's contract — but it
|
|
696
|
+
// never rode the release commit: v0.8.35's and v0.8.36's records both
|
|
697
|
+
// sat untracked until a session close-out swept them by hand (PR
|
|
698
|
+
// #1196). Named after args.version (gate 28 is a targetVersionArg gate,
|
|
699
|
+
// so it always writes at the CUT version, never previous — see Step 3's
|
|
700
|
+
// targetVersionArg comment above). Under --skip-gates the record was
|
|
701
|
+
// never written (Step 3 returned early), so staging it would make the
|
|
702
|
+
// whole `git add` fail on a missing pathspec (PR #1204 review).
|
|
703
|
+
...(args.skipGates ? [] : [`evals/health/${args.version}.json`]),
|
|
694
704
|
...LOCKSTEP_ROSTER.flatMap(({ name, dir, plugin }) => {
|
|
695
705
|
// Roster-driven (H3): each package stages its manifest + CHANGELOG;
|
|
696
706
|
// plugins also stage .claude-plugin/plugin.json (the /plugin-update
|
|
@@ -1009,13 +1019,13 @@ async function main() {
|
|
|
1009
1019
|
const args = parseArgs(process.argv.slice(2));
|
|
1010
1020
|
// Fail-fast guard: refuse to git/npm/gh/curl against a non-monorepo directory.
|
|
1011
1021
|
assertMonorepoRoot(REPO);
|
|
1012
|
-
console.log(`
|
|
1022
|
+
console.log(`package-release release-pack — v${args.version} (${args.mode})${args.dry ? ' [DRY]' : ''}`);
|
|
1013
1023
|
// Stale-plugin-cache self-check (v0.8.32 cut, first failure): the INSTALLED
|
|
1014
1024
|
// plugin cache only refreshes on a version bump, so running this script from
|
|
1015
1025
|
// the cache mid-cycle can execute a version that predates its own guards
|
|
1016
1026
|
// (SKILL.md §Plugin cache). If the repo carries its own copy and the bytes
|
|
1017
1027
|
// differ, warn loudly — the repo copy is almost always the newer one.
|
|
1018
|
-
const repoCopy = path.join(REPO, 'packages/plugins/adia-ui-forge/skills/
|
|
1028
|
+
const repoCopy = path.join(REPO, 'packages/plugins/adia-ui-forge/skills/package-release/scripts/release-pack.mjs');
|
|
1019
1029
|
const selfPath = new URL(import.meta.url).pathname;
|
|
1020
1030
|
if (fs.existsSync(repoCopy) && path.resolve(selfPath) !== path.resolve(repoCopy)) {
|
|
1021
1031
|
const self = fs.readFileSync(selfPath, 'utf8');
|
|
@@ -1115,6 +1125,10 @@ function selftest() {
|
|
|
1115
1125
|
'STOPPING per invariant 3',
|
|
1116
1126
|
// gh#358 — the release branch must actually be created, not just documented.
|
|
1117
1127
|
'git checkout -b release/v9.9.9',
|
|
1128
|
+
// gh#1197 — Step 5's staging pathspec must carry gate 28's committed
|
|
1129
|
+
// health record, or it rides untracked past the release commit
|
|
1130
|
+
// (v0.8.35/v0.8.36 both did, PR #1196 swept them by hand).
|
|
1131
|
+
'evals/health/9.9.9.json',
|
|
1118
1132
|
];
|
|
1119
1133
|
for (const marker of need) {
|
|
1120
1134
|
if (!out.includes(marker)) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// tag-lockstep.mjs — create the lockstep tag set (umbrella vX.Y.Z + one
|
|
3
3
|
// per-package <pkg>-vX.Y.Z per roster entry — package-paths.mjs is the
|
|
4
|
-
// live census;
|
|
4
|
+
// live census; 17 tags as of gh#1240) at HEAD or at a specified SHA.
|
|
5
5
|
//
|
|
6
6
|
// Usage:
|
|
7
7
|
// node tag-lockstep.mjs --version 0.6.22
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// node tag-lockstep.mjs --version 0.6.22 --delete # delete existing tags
|
|
10
10
|
// node tag-lockstep.mjs --version 0.6.22 --dry # print commands without running
|
|
11
11
|
//
|
|
12
|
-
// Part of the
|
|
12
|
+
// Part of the package-release skill. Mechanizes the tag loop used
|
|
13
13
|
// every cycle.
|
|
14
14
|
|
|
15
15
|
import { execSync } from 'node:child_process';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: primitive-authoring
|
|
3
3
|
description: >-
|
|
4
4
|
Author or modify AdiaUI framework source inside the monorepo — primitives
|
|
5
5
|
(packages/web-components), shells/composites (packages/web-modules), yaml
|
|
@@ -10,19 +10,19 @@ description: >-
|
|
|
10
10
|
module, audit a component's four-axis contract/token usage/lifecycle
|
|
11
11
|
(connected/disconnected symmetry) for drift, or author/write a demo or
|
|
12
12
|
examples.html for a component or composite. NOT for composing app screens
|
|
13
|
-
from primitives (
|
|
14
|
-
@adia-ai/llm adapter/streaming/bridge internals (
|
|
15
|
-
site/pages docs pages (
|
|
13
|
+
from primitives (screen-composition), A2UI pipeline internals (a2ui-maintenance),
|
|
14
|
+
@adia-ai/llm adapter/streaming/bridge internals (llm-client-maintenance), or
|
|
15
|
+
site/pages docs pages (site-docs-authoring).
|
|
16
16
|
disable-model-invocation: false
|
|
17
17
|
user-invocable: true
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
#
|
|
20
|
+
# primitive-authoring
|
|
21
21
|
|
|
22
22
|
Guard rails for code that lands INSIDE the adia-ui monorepo: primitives
|
|
23
23
|
(`packages/web-components/`), shells and composites (`packages/web-modules/`),
|
|
24
24
|
their `<name>.yaml` SoTs, and composite demos. `@adia-ai/llm` internals
|
|
25
|
-
(adapters, streaming, the bridge) are `
|
|
25
|
+
(adapters, streaming, the bridge) are `llm-client-maintenance`'s charter, not
|
|
26
26
|
this skill's — route there.
|
|
27
27
|
Light-DOM is load-bearing: `slot=` attributes are decorative metadata,
|
|
28
28
|
positioning is CSS by tag + ancestor + DOM order — never `::slotted()`,
|
|
@@ -41,7 +41,7 @@ wins any tie with this skill. Monorepo source read while authoring (yaml, CSS,
|
|
|
41
41
|
| Contract / token / lifecycle drift audit on an existing component | [token-contract.md](references/token-contract.md) + [anti-patterns.md](references/anti-patterns.md) |
|
|
42
42
|
| Demo for a composite/module — any `packages/web-modules/**/*.{examples,contents}.html` | [composite-demo-protocol.md](references/composite-demo-protocol.md) — NOT the primitive or promotion paths; they lack the canonical-survey discipline |
|
|
43
43
|
| Convention question ("is this idiomatic?") | [code-style.md](references/code-style.md) — cite the rule, don't expand it inline |
|
|
44
|
-
| Trait detail page (`site/pages/traits/<name>/`) | [trait-pages.md](references/trait-pages.md) — the ADR-0019 required-section template (traits are this skill's charter;
|
|
44
|
+
| Trait detail page (`site/pages/traits/<name>/`) | [trait-pages.md](references/trait-pages.md) — the ADR-0019 required-section template (traits are this skill's charter; site-docs-authoring does not own `traits/`) |
|
|
45
45
|
|
|
46
46
|
Full retrieval map — one line per reference file, grouped by axis:
|
|
47
47
|
[references/INDEX.md](references/INDEX.md). Depth references (api-contract,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"skill": "
|
|
2
|
+
"skill": "primitive-authoring",
|
|
3
3
|
"note": "Trigger-routing suite (gh#369). expect=trigger: the skill should fire on the prompt in a fresh session. expect=no-trigger: a near-miss owned elsewhere (owner named per case) or generic knowledge with no AdiaUI skill involved. Cases derived from evals/routing-corpus.json's phrases array (gh#355 vetted corpus) plus the SKILL.md description's own trigger/NOT-fence language.",
|
|
4
4
|
"cases": [
|
|
5
5
|
{ "id": "t01", "prompt": "Add a new <toggle-ui> primitive component from scratch", "expect": "trigger" },
|
|
@@ -11,12 +11,12 @@
|
|
|
11
11
|
{ "id": "t07", "prompt": "Audit the four-axis contract for table-ui — token usage and lifecycle symmetry", "expect": "trigger" },
|
|
12
12
|
{ "id": "t08", "prompt": "Author a demo for the billing-overview composite, an examples.html", "expect": "trigger" },
|
|
13
13
|
{ "id": "t09", "prompt": "Add a pane behaviour to admin-shell per the bespoke shell-tier convention", "expect": "trigger" },
|
|
14
|
-
{ "id": "n01", "prompt": "Compose this Figma mock into AdiaUI components for our consumer app", "expect": "no-trigger", "owner": "
|
|
15
|
-
{ "id": "n02", "prompt": "Cut a release of the next version and publish the npm packages", "expect": "no-trigger", "owner": "
|
|
16
|
-
{ "id": "n03", "prompt": "Tune the zettel composition coverage, the eval is at 38%", "expect": "no-trigger", "owner": "
|
|
17
|
-
{ "id": "n04", "prompt": "Deploy the API service to the hosting platform", "expect": "no-trigger", "owner": "
|
|
18
|
-
{ "id": "n05", "prompt": "The gemini adapter is dropping usage tokens on streamed responses", "expect": "no-trigger", "owner": "
|
|
19
|
-
{ "id": "n06", "prompt": "Extend the LLM bridge in @adia-ai/llm to add a new provider", "expect": "no-trigger", "owner": "
|
|
14
|
+
{ "id": "n01", "prompt": "Compose this Figma mock into AdiaUI components for our consumer app", "expect": "no-trigger", "owner": "screen-composition" },
|
|
15
|
+
{ "id": "n02", "prompt": "Cut a release of the next version and publish the npm packages", "expect": "no-trigger", "owner": "package-release" },
|
|
16
|
+
{ "id": "n03", "prompt": "Tune the zettel composition coverage, the eval is at 38%", "expect": "no-trigger", "owner": "a2ui-maintenance" },
|
|
17
|
+
{ "id": "n04", "prompt": "Deploy the API service to the hosting platform", "expect": "no-trigger", "owner": "site-deployment" },
|
|
18
|
+
{ "id": "n05", "prompt": "The gemini adapter is dropping usage tokens on streamed responses", "expect": "no-trigger", "owner": "llm-client-maintenance" },
|
|
19
|
+
{ "id": "n06", "prompt": "Extend the LLM bridge in @adia-ai/llm to add a new provider", "expect": "no-trigger", "owner": "llm-client-maintenance" },
|
|
20
20
|
{ "id": "n07", "prompt": "Explain how React hooks work in general", "expect": "no-trigger" }
|
|
21
21
|
]
|
|
22
22
|
}
|