everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
142 lines (140 loc) • 9.87 kB
JavaScript
const require_theme = require('../../utils/theme.cjs');
const require_exit_codes = require('../exit-codes.cjs');
const require_sync = require('../render/sync.cjs');
//#region src/cli/commands/scaffold.ts
const scaffoldRenderers = {
import: async (result, ctx) => {
if (ctx.input.json) {
console.log(JSON.stringify(result, null, 2));
return;
}
console.log();
if (require_exit_codes.exitCodeFor(result) === 1) {
console.error(`[CLI] ${result.error || "Unknown error"}`);
if (result.reportPath) console.error(` Report: ${result.reportPath}`);
process.exit(1);
}
if (result.sourceRepository) console.log(` ${require_theme.colors.dim("Upstream:")} ${result.sourceRepository} @ ${result.ref || "default branch"}${result.resolvedSha ? require_theme.colors.dim(` (commit ${result.resolvedSha})`) : ""}`);
for (const warning of result.warnings ?? []) console.log(` ${require_theme.colors.yellow("Note:")} ${warning}`);
if (result.status === "dry-run") console.log(require_theme.colors.cyan(`${require_theme.icons.ok} Dry run — no files written`));
else if (result.status === "imported") console.log(require_theme.colors.green(`${require_theme.icons.ok} Imported ${result.workspace} from ${result.from}`));
else console.log(require_theme.colors.yellow(`${require_theme.icons.err} Conflicts — nothing written`));
console.log(` ${require_theme.colors.dim("Results:")} ${result.updated.length} updated, ${result.added.length} added, ${result.merged.length} merged, ${result.conflicts.length} conflicted, ${result.preservedLocal.length} local-only preserved, ${result.unchanged.length} unchanged`);
if (result.conflicts.length > 0) {
const heldSet = new Set(result.heldBackMigrations ?? []);
console.log(` ${require_theme.colors.yellow("Conflicts")} (unresolvable — manual-port checklist${result.status === "conflicts" ? "; re-run with --yes to apply upstream" : result.backupDir ? `, upstream applied, local copies at ${result.backupDir}` : ""}):`);
for (const file of result.conflicts) console.log(` ${require_theme.colors.dim(heldSet.has(file) ? `${file} (held — migration chain)` : file)}`);
}
if (result.heldBackMigrations?.length > 0) {
console.log(` ${require_theme.colors.yellow("Migration chain held back")}:`);
for (const file of result.heldBackMigrations) console.log(` ${require_theme.colors.dim(file)}`);
}
if (result.migrationCollisions.length > 0) {
console.log(` ${require_theme.colors.yellow("Unresolvable migration collisions")}:`);
for (const collision of result.migrationCollisions) console.log(` ${require_theme.colors.dim(collision.message)}`);
}
if (result.migrationReconciliation && result.migrationReconciliation.appended.length > 0) {
console.log(` ${require_theme.colors.green("Migration chain reconciled")}: ${result.migrationReconciliation.kept.length} applied migration(s) kept, ${result.migrationReconciliation.appended.length} appended:`);
for (const append of result.migrationReconciliation.appended) console.log(` ${require_theme.colors.dim(`${append.fromTag} → ${append.toTag} (idx ${append.idx})`)}`);
console.log(` ${require_theme.colors.dim("Next boot applies the appended migration(s); renamed snapshots should be reviewed against `drizzle-kit generate` before generating new migrations.")}`);
} else if (result.migrationReconciliation && result.migrationReconciliation.contentMatched.length > 0) console.log(` ${require_theme.colors.dim("Migration chain:")} every upstream migration is already applied (kept: ${result.migrationReconciliation.kept.length}, matched by content: ${result.migrationReconciliation.contentMatched.length})`);
if (result.routeDelta && (result.routeDelta.oursOnly.length > 0 || result.routeDelta.theirsOnly.length > 0)) {
console.log(` ${require_theme.colors.dim("Route delta:")} ${result.routeDelta.oursOnly.length} ours-only, ${result.routeDelta.theirsOnly.length} theirs-only`);
for (const route of result.routeDelta.oursOnly) console.log(` ${require_theme.colors.dim(`ours: ${route}`)}`);
for (const route of result.routeDelta.theirsOnly) console.log(` ${require_theme.colors.dim(`theirs: ${route}`)}`);
}
if (result.reportPath) console.log(` Report: ${require_theme.colors.dim(result.reportPath)}`);
if (result.status === "conflicts") {
console.log();
console.error(`[CLI] ${result.conflicts.length} unresolvable conflict(s)${result.migrationCollisions.length > 0 ? ` and ${result.migrationCollisions.length} migration collision(s)` : ""} — nothing was written. Re-run with --yes to apply upstream (local copies are backed up first).`);
process.exit(1);
}
console.log();
},
upgrade: async (result, ctx) => {
const input = ctx.input;
if (input.json) {
console.log(JSON.stringify(result, null, 2));
return;
}
console.log();
if (result.status === "already-upgraded") {
console.log(require_theme.colors.green(`${require_theme.icons.ok} Already upgraded · v2 — nothing to do`));
for (const note of result.notes ?? []) console.log(` ${require_theme.colors.dim(note)}`);
console.log();
return;
}
if (result.status === "audit") {
const audit = result.audit;
const findings = audit?.findings ?? [];
const blockers = findings.filter((f) => f.severity === "blocker");
const warns = findings.filter((f) => f.severity === "warn");
console.log(require_theme.colors.cyan(`v1 upgrade audit — Tier ${audit?.tier ?? "?"}`));
console.log(` ${require_theme.colors.dim(`blockers: ${blockers.length}, warns: ${warns.length}`)}`);
const formatFinding = (f) => ` [${f.severity}] ${f.check} ${f.path}: ${f.message}`;
for (const f of blockers) console.log(require_theme.colors.error(formatFinding(f)));
for (const f of warns) console.log(require_theme.colors.yellow(formatFinding(f)));
console.log(` ${require_theme.colors.dim("manifest: .bos/v2-upgrade-manifest.json")}`);
console.log();
return;
}
if (result.status === "gate-blocked") {
console.error(require_theme.colors.error("\nGATE BLOCKED — normalize in v1 before upgrading to v2."));
for (const blocker of result.blockers ?? []) console.error(` [${blocker.severity}] ${blocker.check} ${blocker.path}: ${blocker.message}`);
console.error();
process.exit(1);
}
if (require_exit_codes.exitCodeFor(result) === 1) {
console.error(`[CLI] ${result.error || "Unknown error"}`);
process.exit(1);
}
if (result.status === "dry-run") console.log(require_theme.colors.cyan(`${require_theme.icons.ok} Dry run — no changes applied`));
else console.log(require_theme.colors.green(`${require_theme.icons.ok} Upgrade complete`));
if (result.platform) console.log(` ${require_theme.colors.dim(`Platform ${result.platform.resolved}${result.platform.fromCache ? " (cached)" : ""} — ${result.platform.source}`)}`);
const mainPkg = result.packages.find((p) => p.name === "everything-dev");
const versionDelta = mainPkg?.from && mainPkg.from !== mainPkg.to ? `${mainPkg.from} → ${mainPkg.to}` : null;
if (versionDelta) console.log(` ${require_theme.colors.dim(`Upgraded everything-dev ${versionDelta}`)}`);
for (const pkg of result.packages) {
if (pkg.name === "everything-dev") continue;
if (pkg.from && pkg.from !== pkg.to) console.log(` ${require_theme.colors.dim(`${pkg.name} ${pkg.from} → ${pkg.to}`)}`);
else if (!pkg.from) console.log(` ${require_theme.colors.dim(`${pkg.name} ${pkg.to} (new)`)}`);
else if (result.status !== "dry-run") console.log(` ${require_theme.colors.dim(`${pkg.name} ${pkg.to} (up to date)`)}`);
}
if (result.changelogUrl) console.log(` Changelog: ${result.changelogUrl}`);
for (const note of result.notes ?? []) console.log(` ${require_theme.colors.dim(`note: ${note}`)}`);
if (result.status === "dry-run" && input.check) {
if (result.updatesAvailable) {
console.log(require_theme.colors.yellow(`${require_theme.icons.err} Updates available — run \`bos upgrade\``));
console.log();
process.exit(1);
}
console.log(require_theme.colors.green(`${require_theme.icons.ok} Up to date`));
console.log();
process.exit(0);
}
if (result.sync) {
console.log(` ${require_theme.colors.dim("Sync results:")}`);
require_sync.printSyncOutcome(result.sync);
}
if (result.migrated && result.migrated.length > 0) {
console.log(` Migrated: ${result.migrated.length} file(s)`);
for (const f of result.migrated) console.log(` ${require_theme.colors.dim(f)}`);
}
if (versionDelta || result.sync && result.sync.conflicted.length > 0) {
console.log();
console.log(require_theme.colors.dim(" For AI agents:"));
const somedelta = mainPkg?.from && mainPkg.to ? `v${mainPkg.from.replace(/^[\^~>=v]+/, "")}...v${mainPkg.to.replace(/^[\^~>=v]+/, "")}` : "";
console.log(require_theme.colors.dim(` This upgrade applied template changes${somedelta ? ` (${somedelta})` : ""}.`));
if (result.sync && result.sync.conflicted.length > 0) {
console.log(require_theme.colors.dim(` ${result.sync.conflicted.length} file(s) were applied over local conflicts — backups at ${result.sync.backupDir || ".bos/sync-backup/"}.`));
console.log(require_theme.colors.dim(` If local changes should be preserved upstream, file an issue: ${require_sync.UPSTREAM_ISSUE_URL} (or open a PR).`));
}
console.log(require_theme.colors.dim(" Load matching intent skills: pnpm dlx @tanstack/intent@latest load everything-dev#..."));
console.log(require_theme.colors.dim(" Review AGENTS.md — local updates may need merging."));
} else if (!versionDelta) console.log(require_theme.colors.dim(" Framework version unchanged — template files untouched; changes land on the next release."));
console.log();
}
};
//#endregion
exports.scaffoldRenderers = scaffoldRenderers;
//# sourceMappingURL=scaffold.cjs.map