@adia-ai/adia-ui-forge 0.8.21 → 0.8.22
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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adia-forge",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.22",
|
|
4
4
|
"description": "Maintain the adia-ui (@adia-ai) framework itself \u2014 author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-factory (the consumer/app-author plugin).",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Kim",
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog — adia-forge
|
|
2
2
|
|
|
3
|
+
## [0.8.22] — 2026-07-29
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
- **`release-pack.mjs` Step 10 failures name their reason** — `shOk` discarded stderr, so a release-create that failed twice reported "could not be created" with an expired gh token, a network reset, and a bad notes file all indistinguishable. Create calls now pass `{ report: true }` (stderr surfaced, first 3 lines); existence probes stay silent since their failure is the answer.
|
|
7
|
+
- **`release-pack.mjs` Step 10 is idempotent and resumable** — the GH-release loop called `gh release create` unconditionally, so ONE network blip aborted the whole handoff. The v0.8.21 cut hit exactly that: `connection reset by peer` with 4 of 11 releases made, *after* tags were pushed and all 9 packages published — the irreversible half done, the bookkeeping half stranded, and a plain re-run then failing on "release already exists" for the first 4 (repaired by hand). Now: a non-throwing `shOk()` probe skips releases that already exist, one retry absorbs a transient reset, and a genuine failure reports created/skipped/failed counts plus the fact that tags and publishes are unaffected — re-running the same handoff command finishes the job. Verified against the live v0.8.21 releases: 11 detected as existing, 0 would be re-created, and the probe returns false for a bogus tag (no false-positive skips).
|
|
8
|
+
|
|
9
|
+
### Maintenance
|
|
10
|
+
- **`.claude-plugin/plugin.json` version bump** — moves in lockstep with package.json (the `/plugin update` cache key).
|
|
11
|
+
- **`skills/` touched in this release window** (1 file(s), e.g. `scripts/release-pack.mjs`) — carried by the entries above.
|
|
12
|
+
|
|
3
13
|
## [0.8.21] — 2026-07-28
|
|
4
14
|
|
|
5
15
|
### Fixed
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adia-ai/adia-ui-forge",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.22",
|
|
4
4
|
"description": "Maintain the adia-ui (@adia-ai) framework itself \u2014 author primitives and shells, run the A2UI generation pipeline and its corpus, review gen-UI quality, sweep QA, cut releases, deploy. The maintainer counterpart to adia-factory (the consumer/app-author plugin).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"adia-ui",
|
|
@@ -226,6 +226,28 @@ function shQuiet(cmd, args) {
|
|
|
226
226
|
return execSync(cmd, { cwd: REPO, encoding: 'utf8' });
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
+
/** Run a command for its EXIT STATUS only — true on 0, false on anything
|
|
230
|
+
* else, never throws and never streams. For probes and retryable steps
|
|
231
|
+
* where a non-zero exit is an expected answer, not a crash (Step 10's
|
|
232
|
+
* "does this release already exist?" and its one transient retry).
|
|
233
|
+
* Pass { report: true } for the CREATE calls: stderr is then captured and
|
|
234
|
+
* printed on failure, so "could not be created" names its reason — an
|
|
235
|
+
* expired gh token, a network reset, and a bad notes file were previously
|
|
236
|
+
* indistinguishable (reviewer note, 2026-07-29). Probes stay silent:
|
|
237
|
+
* their failure IS the answer. */
|
|
238
|
+
function shOk(cmd, { report = false } = {}) {
|
|
239
|
+
try {
|
|
240
|
+
execSync(cmd, { cwd: REPO, encoding: 'utf8', stdio: ['ignore', 'ignore', 'pipe'] });
|
|
241
|
+
return true;
|
|
242
|
+
} catch (e) {
|
|
243
|
+
if (report) {
|
|
244
|
+
const err = (e.stderr || e.message || '').toString().trim().split('\n').slice(0, 3).join('\n ');
|
|
245
|
+
if (err) console.error(` stderr: ${err}`);
|
|
246
|
+
}
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
229
251
|
// Runs a command and CAPTURES its combined output instead of streaming it —
|
|
230
252
|
// used where the output itself becomes evidence in a later checkpoint's
|
|
231
253
|
// evidence block (H5), rather than just scrolling past in the terminal.
|
|
@@ -660,9 +682,47 @@ async function step10GhAndSite(args) {
|
|
|
660
682
|
console.error(`ERROR: GH notes file not found: ${args.ghNotesFile}`);
|
|
661
683
|
process.exit(2);
|
|
662
684
|
}
|
|
685
|
+
// Idempotent + resumable (v0.8.21 incident): this loop used to `gh release
|
|
686
|
+
// create` unconditionally, so ONE network blip aborted the whole handoff —
|
|
687
|
+
// that cut died on `connection reset by peer` with 4 of 11 releases made,
|
|
688
|
+
// after tags were pushed and all 9 packages were already published. The
|
|
689
|
+
// irreversible half of the release had happened; only the bookkeeping half
|
|
690
|
+
// was half-done, and a plain re-run then failed on "release already exists"
|
|
691
|
+
// for the first 4. So: skip what exists, create what doesn't, retry a
|
|
692
|
+
// transient failure, and report what remains instead of throwing away the
|
|
693
|
+
// work that succeeded. Re-running Step 10 after ANY partial failure is now
|
|
694
|
+
// safe and finishes the job.
|
|
695
|
+
const created = [];
|
|
696
|
+
const skipped = [];
|
|
697
|
+
const failed = [];
|
|
663
698
|
for (const pkg of PACKAGES) {
|
|
664
|
-
|
|
699
|
+
const tag = `${pkg}-v${args.version}`;
|
|
700
|
+
if (!args.dry && shOk(`gh release view "${tag}"`)) {
|
|
701
|
+
skipped.push(pkg);
|
|
702
|
+
console.log(` = ${tag} — already exists, skipping`);
|
|
703
|
+
continue;
|
|
704
|
+
}
|
|
705
|
+
const cmd = `gh release create "${tag}" --title "${args.scope}/${pkg} v${args.version}" --notes-file ${args.ghNotesFile}`;
|
|
706
|
+
// One retry: the observed failure mode is a transient TLS/connection
|
|
707
|
+
// reset against api.github.com, not a bad request.
|
|
708
|
+
let ok = args.dry ? (sh(cmd, args), true) : shOk(cmd, { report: true });
|
|
709
|
+
if (!ok && !args.dry) {
|
|
710
|
+
console.log(` … ${tag} failed once (transient?) — retrying in 3s`);
|
|
711
|
+
sh('sleep 3', args);
|
|
712
|
+
ok = shOk(cmd, { report: true });
|
|
713
|
+
}
|
|
714
|
+
(ok ? created : failed).push(pkg);
|
|
715
|
+
if (ok) console.log(` ✓ ${tag}`);
|
|
716
|
+
}
|
|
717
|
+
if (failed.length > 0) {
|
|
718
|
+
console.error(`\nERROR: ${failed.length}/${PACKAGES.length} GH release(s) could not be created: ${failed.join(', ')}`);
|
|
719
|
+
console.error(` ${created.length} created, ${skipped.length} already existed.`);
|
|
720
|
+
console.error(' Tags and npm publishes are DONE and unaffected — only the GH-release');
|
|
721
|
+
console.error(' bookkeeping is incomplete. Re-run this same handoff command: the loop');
|
|
722
|
+
console.error(' skips what exists and creates only the remainder.');
|
|
723
|
+
process.exit(1);
|
|
665
724
|
}
|
|
725
|
+
console.log(` ✓ GH releases: ${created.length} created, ${skipped.length} already present (${PACKAGES.length} total)`);
|
|
666
726
|
if (args.skipSite) {
|
|
667
727
|
console.log(' --skip-site set; skipping EXE deploy');
|
|
668
728
|
return;
|