@adia-ai/adia-ui-forge 0.1.2
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 +23 -0
- package/CHANGELOG.md +26 -0
- package/README.md +54 -0
- package/bin/forge-lint +263 -0
- package/bin/lib/audit-axes.mjs +555 -0
- package/bin/lib/dry-run-irreversible.mjs +236 -0
- package/bin/lib/run-skill-evals.mjs +487 -0
- package/bin/lib/teach-router.mjs +250 -0
- package/commands/adia-forge-a2ui.md +10 -0
- package/commands/adia-forge-author.md +10 -0
- package/commands/adia-forge-dogfood.md +8 -0
- package/commands/adia-forge-llm.md +8 -0
- package/commands/adia-forge-orient.md +10 -0
- package/commands/adia-forge-release.md +8 -0
- package/commands/adia-forge-review.md +10 -0
- package/hooks/hooks.json +15 -0
- package/package.json +41 -0
- package/references/shared/content-trust.md +76 -0
- package/references/shared/pev-rationale.md +64 -0
- package/references/shared/skill-conventions.md +133 -0
- package/skills/adia-ui-a2ui/CHANGELOG.md +32 -0
- package/skills/adia-ui-a2ui/SKILL.md +243 -0
- package/skills/adia-ui-a2ui/evals/adversarial-corpus.json +75 -0
- package/skills/adia-ui-a2ui/evals/routing-corpus.json +31 -0
- package/skills/adia-ui-a2ui/evals/teach-routing-cases.json +100 -0
- package/skills/adia-ui-a2ui/references/anti-patterns.md +24 -0
- package/skills/adia-ui-a2ui/references/chunk-authoring.md +88 -0
- package/skills/adia-ui-a2ui/references/corpus-discipline.md +56 -0
- package/skills/adia-ui-a2ui/references/eval-diagnostics.md +127 -0
- package/skills/adia-ui-a2ui/references/fragment-graph.md +91 -0
- package/skills/adia-ui-a2ui/references/mcp-pipeline-ops.md +106 -0
- package/skills/adia-ui-a2ui/references/mcp-tool-reference.md +398 -0
- package/skills/adia-ui-a2ui/references/pipeline-overview.md +175 -0
- package/skills/adia-ui-a2ui/references/semantic-fail-lifting.md +120 -0
- package/skills/adia-ui-a2ui/references/strategy-engines.md +111 -0
- package/skills/adia-ui-a2ui/references/teach-protocol.md +220 -0
- package/skills/adia-ui-a2ui/references/zettel-calibration.md +93 -0
- package/skills/adia-ui-a2ui/scripts/audit-a2ui-roster.mjs +96 -0
- package/skills/adia-ui-a2ui/scripts/teach-route.mjs +157 -0
- package/skills/adia-ui-a2ui/skill.json +38 -0
- package/skills/adia-ui-authoring/CHANGELOG.md +32 -0
- package/skills/adia-ui-authoring/SKILL.md +256 -0
- package/skills/adia-ui-authoring/assets/case-studies/admin-shell-decomposition.md +101 -0
- package/skills/adia-ui-authoring/assets/case-studies/maxtokens-32768-discovery.md +109 -0
- package/skills/adia-ui-authoring/assets/case-studies/theme-panel-promotion.md +113 -0
- package/skills/adia-ui-authoring/evals/adversarial-design-plan-gates.json +138 -0
- package/skills/adia-ui-authoring/evals/routing-corpus.json +245 -0
- package/skills/adia-ui-authoring/references/anti-patterns.md +606 -0
- package/skills/adia-ui-authoring/references/api-contract.md +205 -0
- package/skills/adia-ui-authoring/references/authoring-cycle.md +211 -0
- package/skills/adia-ui-authoring/references/canonical-pattern-index.md +179 -0
- package/skills/adia-ui-authoring/references/code-style.md +329 -0
- package/skills/adia-ui-authoring/references/common-gotchas.md +93 -0
- package/skills/adia-ui-authoring/references/composite-demo-protocol.md +1084 -0
- package/skills/adia-ui-authoring/references/css-patterns.md +364 -0
- package/skills/adia-ui-authoring/references/lifecycle-patterns.md +302 -0
- package/skills/adia-ui-authoring/references/llm-bridge.md +254 -0
- package/skills/adia-ui-authoring/references/module-promotion.md +289 -0
- package/skills/adia-ui-authoring/references/primitive-audit.md +123 -0
- package/skills/adia-ui-authoring/references/shell-patterns.md +561 -0
- package/skills/adia-ui-authoring/references/teach-protocol.md +428 -0
- package/skills/adia-ui-authoring/references/token-contract.md +120 -0
- package/skills/adia-ui-authoring/references/worked-example.md +351 -0
- package/skills/adia-ui-authoring/references/yaml-contract.md +224 -0
- package/skills/adia-ui-authoring/scripts/audit-authoring-roster.mjs +148 -0
- package/skills/adia-ui-authoring/scripts/build-canonical-pattern-index.mjs +199 -0
- package/skills/adia-ui-authoring/skill.json +45 -0
- package/skills/adia-ui-dogfood/CHANGELOG.md +17 -0
- package/skills/adia-ui-dogfood/README.md +62 -0
- package/skills/adia-ui-dogfood/SKILL.md +866 -0
- package/skills/adia-ui-dogfood/scripts/analyze.mjs +603 -0
- package/skills/adia-ui-dogfood/skill.json +40 -0
- package/skills/adia-ui-forge/SKILL.md +88 -0
- package/skills/adia-ui-forge/evals/routing-corpus.json +30 -0
- package/skills/adia-ui-gen-review/CHANGELOG.md +108 -0
- package/skills/adia-ui-gen-review/SKILL.md +266 -0
- package/skills/adia-ui-gen-review/references/loop-protocol.md +712 -0
- package/skills/adia-ui-gen-review/references/rubric-cosmetic.md +144 -0
- package/skills/adia-ui-gen-review/references/rubric-decompose.md +117 -0
- package/skills/adia-ui-gen-review/references/rubric-score.md +249 -0
- package/skills/adia-ui-gen-review/references/scores.schema.json +125 -0
- package/skills/adia-ui-gen-review/references/teach-protocol.md +214 -0
- package/skills/adia-ui-gen-review/scripts/gen-review-coverage-audit.mjs +127 -0
- package/skills/adia-ui-gen-review/scripts/gen-review-decompose.mjs +569 -0
- package/skills/adia-ui-gen-review/scripts/gen-review-status.mjs +176 -0
- package/skills/adia-ui-gen-review/scripts/validate-cycle-scores.mjs +198 -0
- package/skills/adia-ui-gen-review/skill.json +22 -0
- package/skills/adia-ui-llm/CHANGELOG.md +25 -0
- package/skills/adia-ui-llm/SKILL.md +165 -0
- package/skills/adia-ui-llm/evals/adversarial-corpus.json +75 -0
- package/skills/adia-ui-llm/evals/routing-corpus.json +30 -0
- package/skills/adia-ui-llm/evals/teach-routing-cases.json +73 -0
- package/skills/adia-ui-llm/references/adapter-contract.md +99 -0
- package/skills/adia-ui-llm/references/add-a-provider.md +90 -0
- package/skills/adia-ui-llm/references/bridge-facade.md +94 -0
- package/skills/adia-ui-llm/references/browser-proxy-boundary.md +89 -0
- package/skills/adia-ui-llm/references/model-registry.md +75 -0
- package/skills/adia-ui-llm/references/streaming-sse.md +95 -0
- package/skills/adia-ui-llm/references/teach-protocol.md +78 -0
- package/skills/adia-ui-llm/scripts/audit-llm-roster.mjs +93 -0
- package/skills/adia-ui-llm/scripts/teach-route.mjs +119 -0
- package/skills/adia-ui-llm/skill.json +33 -0
- package/skills/adia-ui-release/CHANGELOG.md +23 -0
- package/skills/adia-ui-release/SKILL.md +295 -0
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-batch-push-v0.6.14-v0.6.15.md +144 -0
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-corpus-drift-remediation-v0.6.15.md +155 -0
- package/skills/adia-ui-release/assets/case-studies/2026-05-20-version-skip-correction-v0.6.12.md +114 -0
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-author-from-scratch-v0.6.18.md +139 -0
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-feedback37-retraction-v0.6.21.md +124 -0
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-fn1-enrichment-pass-v0.6.19.md +125 -0
- package/skills/adia-ui-release/assets/case-studies/2026-05-21-stale-test-detection-v0.6.20.md +142 -0
- package/skills/adia-ui-release/assets/case-studies/2026-05-23-freshness-gate-recovery-v0.6.32.md +97 -0
- package/skills/adia-ui-release/assets/case-studies/2026-05-26-catalog-drift-recurring-v0.6.40.md +147 -0
- package/skills/adia-ui-release/assets/templates/stub-changelog.template.md +22 -0
- package/skills/adia-ui-release/evals/evals.json +164 -0
- package/skills/adia-ui-release/references/changelog-discipline.md +250 -0
- package/skills/adia-ui-release/references/cycle-happy-path.md +520 -0
- package/skills/adia-ui-release/references/exe-deploy.md +149 -0
- package/skills/adia-ui-release/references/gates-catalog.md +778 -0
- package/skills/adia-ui-release/references/ledger-discipline.md +232 -0
- package/skills/adia-ui-release/references/migration-guide-authoring.md +174 -0
- package/skills/adia-ui-release/references/multi-agent-baseline.md +207 -0
- package/skills/adia-ui-release/references/notes-authoring.md +212 -0
- package/skills/adia-ui-release/references/recovery-paths.md +215 -0
- package/skills/adia-ui-release/references/rollup-notes.md +208 -0
- package/skills/adia-ui-release/references/teach-protocol.md +468 -0
- package/skills/adia-ui-release/scripts/assert-monorepo-root.mjs +49 -0
- package/skills/adia-ui-release/scripts/audit-gate-roster.mjs +196 -0
- package/skills/adia-ui-release/scripts/bump.mjs +118 -0
- package/skills/adia-ui-release/scripts/dispatch-publish.mjs +151 -0
- package/skills/adia-ui-release/scripts/insert-stub.mjs +127 -0
- package/skills/adia-ui-release/scripts/make-ledger.mjs +179 -0
- package/skills/adia-ui-release/scripts/promote-unreleased.mjs +88 -0
- package/skills/adia-ui-release/scripts/release-pack.mjs +350 -0
- package/skills/adia-ui-release/scripts/tag-lockstep.mjs +110 -0
- package/skills/adia-ui-release/skill.json +75 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// make-ledger.mjs — author .brain/audit-history/YYYY-MM-DD-release-vX.Y.Z.json
|
|
3
|
+
// from git state + cycle-specific notes.
|
|
4
|
+
//
|
|
5
|
+
// Reads:
|
|
6
|
+
// - the current git HEAD (release_commit + tag_commit if same)
|
|
7
|
+
// - the 10 tags for the given version (collected from `git tag`)
|
|
8
|
+
// - the recent gate-run output (passed via --verification-file or
|
|
9
|
+
// --verification-json or computed best-effort from `npm run check:lockstep`)
|
|
10
|
+
//
|
|
11
|
+
// Writes:
|
|
12
|
+
// - .brain/audit-history/YYYY-MM-DD-release-vX.Y.Z.json
|
|
13
|
+
//
|
|
14
|
+
// Usage:
|
|
15
|
+
// node make-ledger.mjs --version 0.6.22 --date 2026-05-22 \
|
|
16
|
+
// --summary "9-package lockstep PATCH cut. Substantive: ..." \
|
|
17
|
+
// --kind release-cut
|
|
18
|
+
// node make-ledger.mjs --version 0.6.22 --date 2026-05-22 --kind batch-push \
|
|
19
|
+
// --versions 0.6.21,0.6.22 --summary "..."
|
|
20
|
+
//
|
|
21
|
+
// Optional flags:
|
|
22
|
+
// --tag-commit <sha> (default: HEAD)
|
|
23
|
+
// --release-commit <sha> (default: tag-commit)
|
|
24
|
+
// --scope <key=value,...> shorthand for the .scope.{key} block
|
|
25
|
+
// --note "<text>" append to .notes array; repeatable
|
|
26
|
+
// --interactive prompt for missing required fields
|
|
27
|
+
// --dry print to stdout without writing
|
|
28
|
+
//
|
|
29
|
+
// Phase 3 of the adia-ui-release skill. Mechanizes the per-cycle ledger
|
|
30
|
+
// authoring used at Step 11 of cycle-happy-path.
|
|
31
|
+
|
|
32
|
+
import fs from 'node:fs';
|
|
33
|
+
import path from 'node:path';
|
|
34
|
+
import { execSync } from 'node:child_process';
|
|
35
|
+
import process from 'node:process';
|
|
36
|
+
import { assertMonorepoRoot } from './assert-monorepo-root.mjs';
|
|
37
|
+
|
|
38
|
+
function parseArgs(argv) {
|
|
39
|
+
const args = {
|
|
40
|
+
version: null,
|
|
41
|
+
date: null,
|
|
42
|
+
kind: 'release-cut',
|
|
43
|
+
summary: null,
|
|
44
|
+
versions: null,
|
|
45
|
+
tagCommit: null,
|
|
46
|
+
releaseCommit: null,
|
|
47
|
+
scope: {},
|
|
48
|
+
notes: [],
|
|
49
|
+
dry: false,
|
|
50
|
+
repo: process.cwd(),
|
|
51
|
+
repoSlug: '<org>/<repo>',
|
|
52
|
+
};
|
|
53
|
+
for (let i = 0; i < argv.length; i++) {
|
|
54
|
+
const k = argv[i];
|
|
55
|
+
if (k === '--version') args.version = argv[++i];
|
|
56
|
+
else if (k === '--date') args.date = argv[++i];
|
|
57
|
+
else if (k === '--kind') args.kind = argv[++i];
|
|
58
|
+
else if (k === '--summary') args.summary = argv[++i];
|
|
59
|
+
else if (k === '--versions') args.versions = argv[++i].split(',');
|
|
60
|
+
else if (k === '--tag-commit') args.tagCommit = argv[++i];
|
|
61
|
+
else if (k === '--release-commit') args.releaseCommit = argv[++i];
|
|
62
|
+
else if (k === '--scope') {
|
|
63
|
+
const pairs = argv[++i].split(',');
|
|
64
|
+
for (const p of pairs) {
|
|
65
|
+
const [key, ...val] = p.split('=');
|
|
66
|
+
args.scope[key] = val.join('=');
|
|
67
|
+
}
|
|
68
|
+
} else if (k === '--note') args.notes.push(argv[++i]);
|
|
69
|
+
else if (k === '--dry') args.dry = true;
|
|
70
|
+
else if (k === '--repo') args.repo = argv[++i];
|
|
71
|
+
else if (k === '--repo-slug') args.repoSlug = argv[++i];
|
|
72
|
+
else if (k === '-h' || k === '--help') {
|
|
73
|
+
console.log('Usage: node make-ledger.mjs --version X.Y.Z --date YYYY-MM-DD --summary "..." [--kind release-cut|batch-push|p1-hotfix] [--repo-slug <org>/<repo>] [--tag-commit <sha>] [--release-commit <sha>] [--scope key=val,...] [--note "..."] [--dry]');
|
|
74
|
+
process.exit(0);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (!args.version || !args.date || !args.summary) {
|
|
78
|
+
console.error('error: --version, --date, --summary all required');
|
|
79
|
+
process.exit(2);
|
|
80
|
+
}
|
|
81
|
+
// Fail-fast guard: refuse to run git against a non-monorepo directory.
|
|
82
|
+
assertMonorepoRoot(args.repo);
|
|
83
|
+
if (!args.tagCommit) {
|
|
84
|
+
args.tagCommit = execSync(`git -C "${args.repo}" rev-parse HEAD`).toString().trim();
|
|
85
|
+
}
|
|
86
|
+
if (!args.releaseCommit) args.releaseCommit = args.tagCommit;
|
|
87
|
+
return args;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function collectTags(repo, version) {
|
|
91
|
+
const out = execSync(`git -C "${repo}" tag --list 'v${version}' '*-v${version}'`).toString().trim();
|
|
92
|
+
return out.split('\n').filter(Boolean).sort();
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function buildLedger(args) {
|
|
96
|
+
const isBatch = args.kind === 'batch-push';
|
|
97
|
+
const allTags = isBatch && args.versions
|
|
98
|
+
? args.versions.flatMap((v) => collectTags(args.repo, v))
|
|
99
|
+
: collectTags(args.repo, args.version);
|
|
100
|
+
|
|
101
|
+
const ledger = {
|
|
102
|
+
kind: args.kind,
|
|
103
|
+
audit_id: `${args.date}-${args.kind}-v${args.version}`,
|
|
104
|
+
repo: args.repoSlug,
|
|
105
|
+
released_at: args.date,
|
|
106
|
+
version: args.version,
|
|
107
|
+
release_type: 'PATCH',
|
|
108
|
+
summary: args.summary,
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
if (Object.keys(args.scope).length > 0) ledger.scope = args.scope;
|
|
112
|
+
if (isBatch && args.versions) {
|
|
113
|
+
ledger.versions = args.versions;
|
|
114
|
+
ledger.tag_commits = {};
|
|
115
|
+
for (const v of args.versions) {
|
|
116
|
+
const tag = `v${v}`;
|
|
117
|
+
try {
|
|
118
|
+
ledger.tag_commits[tag] = execSync(`git -C "${args.repo}" rev-parse ${tag}`).toString().trim();
|
|
119
|
+
} catch {
|
|
120
|
+
ledger.tag_commits[tag] = '<missing — tag not found>';
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
} else {
|
|
124
|
+
ledger.release_commit = args.releaseCommit;
|
|
125
|
+
ledger.tag_commit = args.tagCommit;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
ledger.tags = allTags;
|
|
129
|
+
ledger.verification = {
|
|
130
|
+
note: 'TODO: paste gate-by-gate summary here. See ledger-discipline.md § canonical schema.',
|
|
131
|
+
};
|
|
132
|
+
ledger.publish_workflows = {
|
|
133
|
+
dispatched: '9/9 via gh workflow run --ref <pkg>-vX.Y.Z',
|
|
134
|
+
conclusions: '9/9 success',
|
|
135
|
+
};
|
|
136
|
+
ledger.notes = args.notes.length > 0 ? args.notes : ['TODO: at least one note per cycle.'];
|
|
137
|
+
|
|
138
|
+
return ledger;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function writeOrPrint(ledger, args) {
|
|
142
|
+
const filename = `${ledger.audit_id}.json`;
|
|
143
|
+
const target = path.join(args.repo, '.brain', 'audit-history', filename);
|
|
144
|
+
const content = JSON.stringify(ledger, null, 2) + '\n';
|
|
145
|
+
|
|
146
|
+
if (args.dry) {
|
|
147
|
+
console.log(`[dry] would write to: ${target}`);
|
|
148
|
+
console.log('---');
|
|
149
|
+
console.log(content);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
154
|
+
if (fs.existsSync(target)) {
|
|
155
|
+
console.error(`error: ${target} already exists. Use --dry to preview or remove it manually.`);
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
fs.writeFileSync(target, content);
|
|
159
|
+
console.log(`[make-ledger] wrote ${target}`);
|
|
160
|
+
console.log(`\n[next] verify the ledger:`);
|
|
161
|
+
console.log(` cat ${target} | jq .`);
|
|
162
|
+
console.log(`\n[next] commit + push:`);
|
|
163
|
+
console.log(` git add ${target}`);
|
|
164
|
+
console.log(` git commit -m "chore(audit-history): v${ledger.version} release ledger"`);
|
|
165
|
+
console.log(` git push origin main`);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function main() {
|
|
169
|
+
const args = parseArgs(process.argv.slice(2));
|
|
170
|
+
const ledger = buildLedger(args);
|
|
171
|
+
writeOrPrint(ledger, args);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
try {
|
|
175
|
+
main();
|
|
176
|
+
} catch (e) {
|
|
177
|
+
console.error(`error: ${e.message}`);
|
|
178
|
+
process.exit(1);
|
|
179
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// promote-unreleased.mjs — promote `## [Unreleased]` → `## [vX.Y.Z] — DATE`
|
|
3
|
+
// in N package CHANGELOGs.
|
|
4
|
+
//
|
|
5
|
+
// Idempotent. Stops if any target already has the [vX.Y.Z] heading
|
|
6
|
+
// (means you've already run this; would create a duplicate block).
|
|
7
|
+
//
|
|
8
|
+
// Usage:
|
|
9
|
+
// node promote-unreleased.mjs --version 0.6.22 --date 2026-05-22 \
|
|
10
|
+
// --packages web-components,web-modules,a2ui/corpus
|
|
11
|
+
// node promote-unreleased.mjs --version 0.6.22 --date 2026-05-22 \
|
|
12
|
+
// --packages web-components,web-modules --dry
|
|
13
|
+
//
|
|
14
|
+
// Phase 2 of the adia-ui-release skill. Replaces the inline heading-swap
|
|
15
|
+
// pattern used across v0.6.18 / v0.6.19 / v0.6.20 / v0.6.21 cycles.
|
|
16
|
+
//
|
|
17
|
+
// Exits:
|
|
18
|
+
// 0 — all targets promoted (or --dry succeeded)
|
|
19
|
+
// 1 — at least one target missing [Unreleased] OR already has [vX.Y.Z]
|
|
20
|
+
// 2 — bad args / file I/O error
|
|
21
|
+
|
|
22
|
+
import fs from 'node:fs';
|
|
23
|
+
import path from 'node:path';
|
|
24
|
+
import process from 'node:process';
|
|
25
|
+
|
|
26
|
+
function parseArgs(argv) {
|
|
27
|
+
const args = { version: null, date: null, packages: null, dry: false, repo: process.cwd() };
|
|
28
|
+
for (let i = 0; i < argv.length; i++) {
|
|
29
|
+
if (argv[i] === '--version') args.version = argv[++i];
|
|
30
|
+
else if (argv[i] === '--date') args.date = argv[++i];
|
|
31
|
+
else if (argv[i] === '--packages') args.packages = argv[++i].split(',').map((s) => s.trim());
|
|
32
|
+
else if (argv[i] === '--dry') args.dry = true;
|
|
33
|
+
else if (argv[i] === '--repo') args.repo = argv[++i];
|
|
34
|
+
else if (argv[i] === '-h' || argv[i] === '--help') {
|
|
35
|
+
console.log('Usage: node promote-unreleased.mjs --version X.Y.Z --date YYYY-MM-DD --packages comma,list [--dry] [--repo <path>]');
|
|
36
|
+
process.exit(0);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (!args.version || !args.date || !args.packages) {
|
|
40
|
+
console.error('error: --version, --date, --packages all required');
|
|
41
|
+
process.exit(2);
|
|
42
|
+
}
|
|
43
|
+
if (!/^\d+\.\d+\.\d+(-[\w.]+)?$/.test(args.version)) {
|
|
44
|
+
console.error('error: --version must be semver');
|
|
45
|
+
process.exit(2);
|
|
46
|
+
}
|
|
47
|
+
if (!/^\d{4}-\d{2}-\d{2}$/.test(args.date)) {
|
|
48
|
+
console.error('error: --date must be YYYY-MM-DD');
|
|
49
|
+
process.exit(2);
|
|
50
|
+
}
|
|
51
|
+
return args;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function promote(repo, pkg, version, date, dry) {
|
|
55
|
+
const p = path.join(repo, 'packages', pkg, 'CHANGELOG.md');
|
|
56
|
+
if (!fs.existsSync(p)) {
|
|
57
|
+
console.error(` ERROR ${pkg} — CHANGELOG.md not found at ${p}`);
|
|
58
|
+
return 'missing';
|
|
59
|
+
}
|
|
60
|
+
const txt = fs.readFileSync(p, 'utf8');
|
|
61
|
+
const newHeading = `## [${version}] — ${date}`;
|
|
62
|
+
if (txt.includes(newHeading)) {
|
|
63
|
+
console.error(` ERROR ${pkg} — already has ${newHeading} (already promoted)`);
|
|
64
|
+
return 'already-promoted';
|
|
65
|
+
}
|
|
66
|
+
if (!txt.includes('## [Unreleased]')) {
|
|
67
|
+
console.error(` ERROR ${pkg} — no '## [Unreleased]' heading found`);
|
|
68
|
+
return 'no-unreleased';
|
|
69
|
+
}
|
|
70
|
+
const out = txt.replace('## [Unreleased]', newHeading);
|
|
71
|
+
if (!dry) fs.writeFileSync(p, out);
|
|
72
|
+
console.log(` ${dry ? '[dry] ' : ''}promoted ${pkg}: [Unreleased] → [${version}] — ${date}`);
|
|
73
|
+
return 'promoted';
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function main() {
|
|
77
|
+
const args = parseArgs(process.argv.slice(2));
|
|
78
|
+
const results = args.packages.map((pkg) => promote(args.repo, pkg, args.version, args.date, args.dry));
|
|
79
|
+
const promoted = results.filter((r) => r === 'promoted').length;
|
|
80
|
+
const failed = results.filter((r) => r !== 'promoted').length;
|
|
81
|
+
console.log(`\n[promote] ${promoted}/${args.packages.length} ${args.dry ? '(dry)' : 'promoted'}`);
|
|
82
|
+
if (failed > 0) {
|
|
83
|
+
console.error(`[promote] ${failed} target(s) did not promote — see ERRORs above`);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
main();
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// release-pack.mjs — full-cycle orchestrator for an AdiaUI lockstep release.
|
|
3
|
+
//
|
|
4
|
+
// Chains the 6 Phase-1/2/3 CLI helpers (bump · promote-unreleased ·
|
|
5
|
+
// insert-stub · tag-lockstep · dispatch-publish · make-ledger) plus the
|
|
6
|
+
// non-helper steps (lockfile · pre-flight gates · git commit · F-N1 ·
|
|
7
|
+
// push · GH releases · site deploy) into one walked sequence with 3
|
|
8
|
+
// operator checkpoints (before tag, before push, before publish) per
|
|
9
|
+
// SKILL.md §Posture.
|
|
10
|
+
//
|
|
11
|
+
// MODES:
|
|
12
|
+
// --mode cut (Mode 1 — peer pre-staged [Unreleased] or pure stub)
|
|
13
|
+
// --mode from-scratch (Mode 2 — promote [Unreleased] → [VERSION] in 1-3 pkgs)
|
|
14
|
+
// --mode handoff (Mode 3 — peer pre-cut the release commit; skip bump/commit)
|
|
15
|
+
// --mode batch (Mode 4 — multiple unpushed cuts; pass --version-list)
|
|
16
|
+
//
|
|
17
|
+
// REQUIRED:
|
|
18
|
+
// --version 0.6.22
|
|
19
|
+
// --date 2026-05-22
|
|
20
|
+
// --previous-version 0.6.21
|
|
21
|
+
//
|
|
22
|
+
// CONTENT (operator-authored; the orchestrator does not generate):
|
|
23
|
+
// --commit-message-file <path> : the release commit body
|
|
24
|
+
// --gh-notes-file <path> : GH release notes body (one per cycle)
|
|
25
|
+
// --substantive "<one-line>" : for the stub block xref
|
|
26
|
+
// --xref "<changelog-anchor>" : for the stub block
|
|
27
|
+
// --substantive-packages a,b,c : packages with [Unreleased] to promote
|
|
28
|
+
// --stub-packages a,b,c : packages getting the lockstep stub
|
|
29
|
+
//
|
|
30
|
+
// FLAGS:
|
|
31
|
+
// --dry : preview all commands, no mutation, no prompts
|
|
32
|
+
// --yes : skip the 3 operator checkpoints (CI / scripted)
|
|
33
|
+
// --skip-gates : (DEBUG ONLY) skip pre-flight (don't ship anything!)
|
|
34
|
+
// --skip-site : skip the EXE deploy step (rare; for offline cycles)
|
|
35
|
+
//
|
|
36
|
+
// PHASE 4 of the adia-ui-release skill. Mechanizes the 11-step cycle from
|
|
37
|
+
// references/cycle-happy-path.md while preserving operator judgment at
|
|
38
|
+
// the 3 mutating-checkpoint boundaries.
|
|
39
|
+
|
|
40
|
+
import { execSync } from 'node:child_process';
|
|
41
|
+
import { createInterface } from 'node:readline/promises';
|
|
42
|
+
import { stdin, stdout } from 'node:process';
|
|
43
|
+
import fs from 'node:fs';
|
|
44
|
+
import path from 'node:path';
|
|
45
|
+
import process from 'node:process';
|
|
46
|
+
import { assertMonorepoRoot } from './assert-monorepo-root.mjs';
|
|
47
|
+
|
|
48
|
+
const SCRIPT_DIR = path.dirname(new URL(import.meta.url).pathname);
|
|
49
|
+
const REPO = process.cwd();
|
|
50
|
+
|
|
51
|
+
// Instance data — fork-configurable; defaults preserve @adia-ai behavior.
|
|
52
|
+
// Deploy host (rsync target + curl verify): --host or $ADIA_DEPLOY_HOST.
|
|
53
|
+
// npm scope (publishes + npm-view + GH release titles): --scope or $ADIA_NPM_SCOPE.
|
|
54
|
+
const DEFAULT_DEPLOY_HOST = 'ui-kit.exe.xyz';
|
|
55
|
+
const DEFAULT_NPM_SCOPE = '@adia-ai';
|
|
56
|
+
|
|
57
|
+
const PACKAGES = ['web-components', 'web-modules', 'llm', 'a2ui-runtime',
|
|
58
|
+
'a2ui-compose', 'a2ui-corpus', 'a2ui-mcp', 'a2ui-retrieval',
|
|
59
|
+
'a2ui-validator'];
|
|
60
|
+
|
|
61
|
+
function parseArgs(argv) {
|
|
62
|
+
const args = {
|
|
63
|
+
version: null, date: null, previous: null, mode: null,
|
|
64
|
+
commitMessageFile: null, ghNotesFile: null,
|
|
65
|
+
substantive: null, xref: null,
|
|
66
|
+
substantivePackages: null, stubPackages: null,
|
|
67
|
+
versionList: null,
|
|
68
|
+
host: process.env.ADIA_DEPLOY_HOST || DEFAULT_DEPLOY_HOST,
|
|
69
|
+
scope: process.env.ADIA_NPM_SCOPE || DEFAULT_NPM_SCOPE,
|
|
70
|
+
dry: false, yes: false, skipGates: false, skipSite: false,
|
|
71
|
+
};
|
|
72
|
+
for (let i = 0; i < argv.length; i++) {
|
|
73
|
+
const k = argv[i];
|
|
74
|
+
if (k === '--version') args.version = argv[++i];
|
|
75
|
+
else if (k === '--date') args.date = argv[++i];
|
|
76
|
+
else if (k === '--previous-version') args.previous = argv[++i];
|
|
77
|
+
else if (k === '--mode') args.mode = argv[++i];
|
|
78
|
+
else if (k === '--commit-message-file') args.commitMessageFile = argv[++i];
|
|
79
|
+
else if (k === '--gh-notes-file') args.ghNotesFile = argv[++i];
|
|
80
|
+
else if (k === '--substantive') args.substantive = argv[++i];
|
|
81
|
+
else if (k === '--xref') args.xref = argv[++i];
|
|
82
|
+
else if (k === '--substantive-packages') args.substantivePackages = argv[++i].split(',');
|
|
83
|
+
else if (k === '--stub-packages') args.stubPackages = argv[++i].split(',');
|
|
84
|
+
else if (k === '--version-list') args.versionList = argv[++i].split(',');
|
|
85
|
+
else if (k === '--host') args.host = argv[++i];
|
|
86
|
+
else if (k === '--scope') args.scope = argv[++i];
|
|
87
|
+
else if (k === '--dry') args.dry = true;
|
|
88
|
+
else if (k === '--yes') args.yes = true;
|
|
89
|
+
else if (k === '--skip-gates') args.skipGates = true;
|
|
90
|
+
else if (k === '--skip-site') args.skipSite = true;
|
|
91
|
+
else if (k === '-h' || k === '--help') { help(); process.exit(0); }
|
|
92
|
+
}
|
|
93
|
+
if (!args.version || !args.date || !args.previous || !args.mode) {
|
|
94
|
+
console.error('error: --version, --date, --previous-version, --mode all required');
|
|
95
|
+
console.error(' see --help');
|
|
96
|
+
process.exit(2);
|
|
97
|
+
}
|
|
98
|
+
if (!['cut', 'from-scratch', 'handoff', 'batch'].includes(args.mode)) {
|
|
99
|
+
console.error(`error: --mode must be cut|from-scratch|handoff|batch (got: ${args.mode})`);
|
|
100
|
+
process.exit(2);
|
|
101
|
+
}
|
|
102
|
+
return args;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function help() {
|
|
106
|
+
console.log(`Usage:
|
|
107
|
+
node release-pack.mjs --mode cut --version X.Y.Z --date YYYY-MM-DD \\
|
|
108
|
+
--previous-version X.Y.Z-1 \\
|
|
109
|
+
--commit-message-file /tmp/v$X.Y.Z-commit.txt \\
|
|
110
|
+
--gh-notes-file /tmp/release-v$X.Y.Z.md \\
|
|
111
|
+
--substantive "<one-line>" \\
|
|
112
|
+
--xref "packages/web-modules/CHANGELOG.md#0$X$Y$Z--YYYY-MM-DD" \\
|
|
113
|
+
--substantive-packages web-components,web-modules,a2ui/corpus \\
|
|
114
|
+
--stub-packages llm,a2ui/compose,a2ui/mcp,a2ui/retrieval,a2ui/runtime,a2ui/validator
|
|
115
|
+
|
|
116
|
+
Flags: --dry (preview all) --yes (skip prompts) --skip-site (skip EXE deploy)
|
|
117
|
+
Instance: --host <deploy-host> (default ${DEFAULT_DEPLOY_HOST}; or $ADIA_DEPLOY_HOST)
|
|
118
|
+
--scope <@org> (npm scope; default ${DEFAULT_NPM_SCOPE}; or $ADIA_NPM_SCOPE)`);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const rl = createInterface({ input: stdin, output: stdout });
|
|
122
|
+
async function checkpoint(label, args) {
|
|
123
|
+
if (args.yes) {
|
|
124
|
+
console.log(`\n[checkpoint] ${label} — auto-confirmed (--yes)`);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const answer = await rl.question(`\n[CHECKPOINT] ${label} — proceed? [y/N]: `);
|
|
128
|
+
if (!/^y(es)?$/i.test(answer.trim())) {
|
|
129
|
+
console.log('[checkpoint] aborted by operator');
|
|
130
|
+
rl.close();
|
|
131
|
+
process.exit(0);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function sh(cmd, args, opts = {}) {
|
|
136
|
+
if (args.dry) {
|
|
137
|
+
console.log(` [dry] ${cmd}`);
|
|
138
|
+
return '';
|
|
139
|
+
}
|
|
140
|
+
return execSync(cmd, { cwd: REPO, encoding: 'utf8', stdio: opts.stdio || 'inherit' });
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function shQuiet(cmd, args) {
|
|
144
|
+
if (args.dry) {
|
|
145
|
+
console.log(` [dry] ${cmd}`);
|
|
146
|
+
return '';
|
|
147
|
+
}
|
|
148
|
+
return execSync(cmd, { cwd: REPO, encoding: 'utf8' });
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ── Step 1 — Re-baseline ──────────────────────────────────────────
|
|
152
|
+
function step1ReBaseline(args) {
|
|
153
|
+
console.log('\n=== Step 1 — Re-baseline ===');
|
|
154
|
+
console.log('git status --short:');
|
|
155
|
+
sh('git status --short', args);
|
|
156
|
+
console.log('\norigin/main..HEAD (unpushed):');
|
|
157
|
+
sh('git log origin/main..HEAD --oneline', args);
|
|
158
|
+
console.log('\nHEAD..origin/main (must be empty before push):');
|
|
159
|
+
const out = shQuiet('git log HEAD..origin/main --oneline', args).trim();
|
|
160
|
+
if (out && !args.dry) {
|
|
161
|
+
console.error('ERROR: remote ahead — pull/rebase before proceeding');
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
console.log(' (empty — origin not ahead)');
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// ── Step 3 — Pre-flight gates ────────────────────────────────────
|
|
168
|
+
function step3PreFlight(args) {
|
|
169
|
+
if (args.skipGates) {
|
|
170
|
+
console.log('\n=== Step 3 — Pre-flight (SKIPPED via --skip-gates; danger!) ===');
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
console.log('\n=== Step 3 — Pre-flight gates ===');
|
|
174
|
+
const gates = [
|
|
175
|
+
'node scripts/build/components.mjs --verify',
|
|
176
|
+
'npm run verify:traits',
|
|
177
|
+
'npm run check:lockstep',
|
|
178
|
+
'npm run test:unit',
|
|
179
|
+
'npm run typecheck',
|
|
180
|
+
'npm run check:demo-shells',
|
|
181
|
+
'npm run check:lightningcss-build',
|
|
182
|
+
'npm run smoke:engines',
|
|
183
|
+
'npm run smoke:register-engine',
|
|
184
|
+
'npm run check:links',
|
|
185
|
+
'npm run check:embeddings-fresh',
|
|
186
|
+
'npm run verify:corpus',
|
|
187
|
+
];
|
|
188
|
+
for (const g of gates) {
|
|
189
|
+
console.log(`\n ${g}`);
|
|
190
|
+
try {
|
|
191
|
+
sh(g, args, { stdio: 'inherit' });
|
|
192
|
+
} catch (e) {
|
|
193
|
+
console.error(`\n ✗ FAILED: ${g}`);
|
|
194
|
+
console.error(' Pre-flight aborted. Fix the gate failure before proceeding.');
|
|
195
|
+
console.error(' See references/gates-catalog.md for failure-mode → recovery.');
|
|
196
|
+
process.exit(1);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// ── Step 4 — Promote + bump + lockfile ───────────────────────────
|
|
202
|
+
function step4PromoteAndBump(args) {
|
|
203
|
+
if (args.mode === 'handoff') {
|
|
204
|
+
console.log('\n=== Step 4 — SKIPPED (mode handoff: peer cut the release commit) ===');
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
console.log('\n=== Step 4 — Promote + Bump + Lockfile ===');
|
|
208
|
+
|
|
209
|
+
if (args.mode === 'from-scratch' && args.substantivePackages) {
|
|
210
|
+
const cmd = `node ${SCRIPT_DIR}/promote-unreleased.mjs --version ${args.version} --date ${args.date} --packages ${args.substantivePackages.join(',')}`;
|
|
211
|
+
sh(cmd, args);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (args.stubPackages && args.substantive && args.xref) {
|
|
215
|
+
const cmd = `node ${SCRIPT_DIR}/insert-stub.mjs --version ${args.version} --date ${args.date} --previous-version ${args.previous} --substantive "${args.substantive}" --xref "${args.xref}" --packages ${args.stubPackages.join(',')}`;
|
|
216
|
+
sh(cmd, args);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
sh(`node ${SCRIPT_DIR}/bump.mjs --from ${args.previous} --to ${args.version}`, args);
|
|
220
|
+
sh('npm install --package-lock-only --no-audit --no-fund', args);
|
|
221
|
+
sh('npm run check:lockstep', args);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// ── Step 5 — Commit ──────────────────────────────────────────────
|
|
225
|
+
function step5Commit(args) {
|
|
226
|
+
if (args.mode === 'handoff') {
|
|
227
|
+
console.log('\n=== Step 5 — SKIPPED (mode handoff) ===');
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
console.log('\n=== Step 5 — Stage + Commit ===');
|
|
231
|
+
sh('git reset HEAD >/dev/null 2>&1 || true', args);
|
|
232
|
+
const releaseFiles = [
|
|
233
|
+
'package-lock.json',
|
|
234
|
+
...PACKAGES.flatMap((p) => {
|
|
235
|
+
const dir = p.startsWith('a2ui-') ? `packages/a2ui/${p.replace('a2ui-', '')}` : `packages/${p}`;
|
|
236
|
+
return [`${dir}/package.json`, `${dir}/CHANGELOG.md`];
|
|
237
|
+
}),
|
|
238
|
+
];
|
|
239
|
+
sh(`git add ${releaseFiles.join(' ')}`, args);
|
|
240
|
+
sh('git diff --cached --stat | tail -3', args);
|
|
241
|
+
if (!args.commitMessageFile) {
|
|
242
|
+
console.error('ERROR: --commit-message-file required for cut/from-scratch mode');
|
|
243
|
+
process.exit(2);
|
|
244
|
+
}
|
|
245
|
+
if (!args.dry && !fs.existsSync(args.commitMessageFile)) {
|
|
246
|
+
console.error(`ERROR: commit message file not found: ${args.commitMessageFile}`);
|
|
247
|
+
process.exit(2);
|
|
248
|
+
}
|
|
249
|
+
sh(`git commit -F ${args.commitMessageFile}`, args);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// ── Step 6 — Tag ─────────────────────────────────────────────────
|
|
253
|
+
async function step6Tag(args) {
|
|
254
|
+
console.log('\n=== Step 6 — Tag at HEAD ===');
|
|
255
|
+
await checkpoint('Ready to create 10 tags (umbrella + 9 per-package)', args);
|
|
256
|
+
sh(`node ${SCRIPT_DIR}/tag-lockstep.mjs --version ${args.version}`, args);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// ── Step 7 — F-N1 ────────────────────────────────────────────────
|
|
260
|
+
function step7Fn1(args) {
|
|
261
|
+
console.log('\n=== Step 7 — F-N1 release trip-wire ===');
|
|
262
|
+
try {
|
|
263
|
+
sh('node scripts/release/check-release.mjs --all-pending', args);
|
|
264
|
+
} catch (e) {
|
|
265
|
+
// F-N1 sometimes exits non-zero on cosmetic warns; show the output and let the operator decide
|
|
266
|
+
console.warn('\n F-N1 returned non-zero — review the warns above.');
|
|
267
|
+
console.warn(' See references/changelog-discipline.md § F-N1 diff-coverage enrichment.');
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// ── Step 8 — Push ────────────────────────────────────────────────
|
|
272
|
+
async function step8Push(args) {
|
|
273
|
+
console.log('\n=== Step 8 — Push main + tags ===');
|
|
274
|
+
const count = shQuiet('git rev-list --count origin/main..HEAD', args).trim();
|
|
275
|
+
console.log(` commits to push: ${count}`);
|
|
276
|
+
await checkpoint(`Ready to push ${count} commit(s) + 10 tags`, args);
|
|
277
|
+
sh('git push origin main', args);
|
|
278
|
+
const tagList = [`v${args.version}`, ...PACKAGES.map((p) => `${p}-v${args.version}`)].join(' ');
|
|
279
|
+
sh(`git push origin ${tagList}`, args);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// ── Step 9 — Publish ─────────────────────────────────────────────
|
|
283
|
+
async function step9Publish(args) {
|
|
284
|
+
console.log('\n=== Step 9 — Dispatch publishes ===');
|
|
285
|
+
await checkpoint('Ready to dispatch 9 npm publishes', args);
|
|
286
|
+
sh(`node ${SCRIPT_DIR}/dispatch-publish.mjs --version ${args.version} --scope ${args.scope}`, args);
|
|
287
|
+
console.log('\n Waiting for publishes to settle...');
|
|
288
|
+
sh(`until [ "$(gh run list --workflow=publish-a2ui-validator.yml --limit 1 --json status -q '.[0].status')" = "completed" ]; do sleep 5; done`, args);
|
|
289
|
+
console.log(' ✓ publishes settled');
|
|
290
|
+
console.log('\n Verify all 9 succeeded + npm latest:');
|
|
291
|
+
sh(`for pkg in ${PACKAGES.join(' ')}; do echo -n "$pkg: "; npm view "${args.scope}/$pkg" version 2>/dev/null; done`, args);
|
|
292
|
+
sh(`echo -n "latest: "; npm view ${args.scope}/web-components dist-tags.latest 2>/dev/null`, args);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// ── Step 10 — GH releases + site deploy ──────────────────────────
|
|
296
|
+
async function step10GhAndSite(args) {
|
|
297
|
+
console.log('\n=== Step 10 — GH releases + Site deploy ===');
|
|
298
|
+
if (!args.ghNotesFile) {
|
|
299
|
+
console.error('ERROR: --gh-notes-file required for GH releases');
|
|
300
|
+
process.exit(2);
|
|
301
|
+
}
|
|
302
|
+
if (!args.dry && !fs.existsSync(args.ghNotesFile)) {
|
|
303
|
+
console.error(`ERROR: GH notes file not found: ${args.ghNotesFile}`);
|
|
304
|
+
process.exit(2);
|
|
305
|
+
}
|
|
306
|
+
for (const pkg of PACKAGES) {
|
|
307
|
+
sh(`gh release create "${pkg}-v${args.version}" --title "${args.scope}/${pkg} v${args.version}" --notes-file ${args.ghNotesFile}`, args);
|
|
308
|
+
}
|
|
309
|
+
if (args.skipSite) {
|
|
310
|
+
console.log(' --skip-site set; skipping EXE deploy');
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
sh('npm run build:site', args);
|
|
314
|
+
sh(`rsync -az --delete dist/ ${args.host}:/srv/adia-ui/dist/`, args);
|
|
315
|
+
sh(`curl -s -o /dev/null -w "EXE gen-ui: HTTP %{http_code}\\n" https://${args.host}/site/gen-ui/`, args);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// ── Step 11 — Ledger ─────────────────────────────────────────────
|
|
319
|
+
function step11Ledger(args) {
|
|
320
|
+
console.log('\n=== Step 11 — Audit-history ledger ===');
|
|
321
|
+
const cmd = `node ${SCRIPT_DIR}/make-ledger.mjs --version ${args.version} --date ${args.date} --summary "<TODO: paste from commit message>" --note "Shipped via release-pack.mjs mode=${args.mode}"`;
|
|
322
|
+
sh(cmd, args);
|
|
323
|
+
console.log('\n Edit the generated ledger to fill in scope/verification details, then commit + push.');
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// ── Main ─────────────────────────────────────────────────────────
|
|
327
|
+
async function main() {
|
|
328
|
+
const args = parseArgs(process.argv.slice(2));
|
|
329
|
+
// Fail-fast guard: refuse to git/npm/gh/curl against a non-monorepo directory.
|
|
330
|
+
assertMonorepoRoot(REPO);
|
|
331
|
+
console.log(`adia-ui-release release-pack — v${args.version} (${args.mode})${args.dry ? ' [DRY]' : ''}`);
|
|
332
|
+
step1ReBaseline(args);
|
|
333
|
+
step3PreFlight(args);
|
|
334
|
+
step4PromoteAndBump(args);
|
|
335
|
+
step5Commit(args);
|
|
336
|
+
await step6Tag(args);
|
|
337
|
+
step7Fn1(args);
|
|
338
|
+
await step8Push(args);
|
|
339
|
+
await step9Publish(args);
|
|
340
|
+
await step10GhAndSite(args);
|
|
341
|
+
step11Ledger(args);
|
|
342
|
+
rl.close();
|
|
343
|
+
console.log('\n✓ release-pack complete. Don\'t forget to commit + push the ledger.');
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
main().catch((e) => {
|
|
347
|
+
console.error(e);
|
|
348
|
+
rl.close();
|
|
349
|
+
process.exit(1);
|
|
350
|
+
});
|