@kb-labs/release-manager-cli 2.119.0 → 2.119.1-canary.b53bbee1d
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/dist/cli/commands/build.js.map +1 -1
- package/dist/cli/commands/changelog.js.map +1 -1
- package/dist/cli/commands/checks.js.map +1 -1
- package/dist/cli/commands/deliver.js.map +1 -1
- package/dist/cli/commands/git.d.ts +2 -0
- package/dist/cli/commands/git.js +11 -4
- package/dist/cli/commands/git.js.map +1 -1
- package/dist/cli/commands/pack.js.map +1 -1
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/promote.js.map +1 -1
- package/dist/cli/commands/publish.js.map +1 -1
- package/dist/cli/commands/report.js.map +1 -1
- package/dist/cli/commands/rollback.js.map +1 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/stage-plan.js.map +1 -1
- package/dist/cli/commands/stage.js.map +1 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/verify-clean-install.js.map +1 -1
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/commands/version.d.ts +2 -0
- package/dist/cli/commands/version.js +11 -4
- package/dist/cli/commands/version.js.map +1 -1
- package/dist/contracts/release.schema.js.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/manifest.js +13 -0
- package/dist/manifest.js.map +1 -1
- package/dist/manifest.json +1309 -0
- package/dist/rest/handlers/build-handler.js.map +1 -1
- package/dist/rest/handlers/changelog-generate-handler.js.map +1 -1
- package/dist/rest/handlers/changelog-handler.js.map +1 -1
- package/dist/rest/handlers/changelog-save-handler.js.map +1 -1
- package/dist/rest/handlers/checklist-handler.js.map +1 -1
- package/dist/rest/handlers/generate-handler.d.ts +2 -2
- package/dist/rest/handlers/generate-handler.js.map +1 -1
- package/dist/rest/handlers/get-checks-handler.js.map +1 -1
- package/dist/rest/handlers/git-timeline-handler.js.map +1 -1
- package/dist/rest/handlers/history-changelog-handler.js.map +1 -1
- package/dist/rest/handlers/history-handler.js.map +1 -1
- package/dist/rest/handlers/history-plan-handler.d.ts +1 -1
- package/dist/rest/handlers/history-plan-handler.js.map +1 -1
- package/dist/rest/handlers/history-report-handler.d.ts +1 -1
- package/dist/rest/handlers/history-report-handler.js.map +1 -1
- package/dist/rest/handlers/plan-handler.d.ts +1 -1
- package/dist/rest/handlers/plan-handler.js.map +1 -1
- package/dist/rest/handlers/preview-handler.js.map +1 -1
- package/dist/rest/handlers/report-handler.d.ts +1 -1
- package/dist/rest/handlers/report-handler.js.map +1 -1
- package/dist/rest/handlers/reset-handler.js.map +1 -1
- package/dist/rest/handlers/run-checks-handler.js.map +1 -1
- package/dist/rest/handlers/run-handler.d.ts +1 -1
- package/dist/rest/handlers/run-handler.js.map +1 -1
- package/dist/rest/handlers/scopes-handler.js.map +1 -1
- package/dist/rest/handlers/status-handler.js.map +1 -1
- package/dist/setup/handler.js.map +1 -1
- package/dist/widgets/117.js +32 -0
- package/dist/widgets/165.js +1 -0
- package/dist/widgets/326.js +1 -0
- package/dist/widgets/370.js +1 -0
- package/dist/widgets/405.js +1 -0
- package/dist/widgets/46.js +445 -0
- package/dist/widgets/50.js +1 -0
- package/dist/widgets/546.js +1 -0
- package/dist/widgets/648.js +1 -0
- package/dist/widgets/669.js +1 -0
- package/dist/widgets/707.js +1 -0
- package/dist/widgets/775.js +1 -0
- package/dist/widgets/78.js +1 -0
- package/dist/widgets/832.js +96 -0
- package/dist/widgets/875.js +25 -0
- package/dist/widgets/945.js +1 -0
- package/dist/widgets/968.js +9 -0
- package/dist/widgets/__federation_expose_ReleasePage.js +1 -0
- package/dist/widgets/mf-manifest.json +229 -0
- package/dist/widgets/mf-stats.json +256 -0
- package/dist/widgets/remoteEntry.js +7 -0
- package/dist/workflows/templates/dry-run.yaml +37 -0
- package/dist/workflows/templates/full-release.yaml +58 -0
- package/dist/workflows/templates/hotfix.yaml +40 -0
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/dep-rewrite.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/publish-programmatic.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/cli/commands/stage-plan.ts"],"names":["join","readFileSync","writeFileSync"],"mappings":"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","file":"stage-plan.js","sourcesContent":["/**\n * Rewrite a package's own version and workspace:/link: dependency references\n * before `pnpm publish`, so the tarball on disk matches what's about to be\n * published even when that version was never persisted to package.json.\n *\n * - Own version: stable releases already have the target version on disk\n * (written by updatePackageVersions() before this runs), so this is a\n * no-op for them. Canary releases compute nextVersion in-memory only —\n * never committed to package.json/git — so without this, `pnpm publish`\n * would read the OLD on-disk version, and either fail outright or (worse)\n * get misclassified as \"already published\" by the retry/idempotency\n * patterns since that old version genuinely IS already on the registry.\n * - pnpm handles `workspace:*` natively during `pnpm publish` — no rewrite needed.\n * - npm/yarn do NOT — we must replace with `^version` before publish.\n * - `link:` references are never valid on the npm registry — always rewrite.\n *\n * Returns a restore function that reverts package.json to original content.\n * Call it in a finally block to guarantee cleanup.\n */\n\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\n// ── rewriteWorkspaceDeps helpers ──────────────────────────────────────────\n\nfunction rewriteLinkDep(\n deps: Record<string, string>,\n depName: string,\n val: string,\n pkgPath: string,\n versionMap: Map<string, string>,\n): void {\n const pinned = versionMap.get(depName);\n if (pinned) {\n deps[depName] = `^${pinned}`;\n return;\n }\n try {\n const linkPath = val.slice('link:'.length);\n const linked = JSON.parse(readFileSync(join(pkgPath, linkPath, 'package.json'), 'utf-8')) as { version?: string };\n deps[depName] = `^${linked.version ?? '*'}`;\n } catch {\n deps[depName] = '*';\n }\n}\n\nfunction rewriteWorkspaceDep(\n deps: Record<string, string>,\n depName: string,\n val: string,\n versionMap: Map<string, string>,\n): boolean {\n const pinned = versionMap.get(depName);\n if (!pinned) { return false; }\n const range = val === 'workspace:*' ? '^' : val.slice('workspace:'.length);\n deps[depName] = `${range}${pinned}`;\n return true;\n}\n\nfunction rewriteDepsSection(\n deps: Record<string, string>,\n pkgPath: string,\n versionMap: Map<string, string>,\n packageManager: string,\n): boolean {\n let modified = false;\n for (const depName of Object.keys(deps)) {\n const val = deps[depName];\n if (typeof val !== 'string') { continue; }\n if (val.startsWith('link:')) {\n rewriteLinkDep(deps, depName, val, pkgPath, versionMap);\n modified = true;\n } else if (val.startsWith('workspace:') && packageManager !== 'pnpm' && rewriteWorkspaceDep(deps, depName, val, versionMap)) {\n modified = true;\n }\n }\n return modified;\n}\n\nexport function rewriteWorkspaceDeps(\n pkg: { path: string; version: string },\n versionMap: Map<string, string>,\n packageManager: string,\n): () => void {\n const pkgPath = pkg.path;\n const pkgJsonPath = join(pkgPath, 'package.json');\n const original = readFileSync(pkgJsonPath, 'utf-8');\n const pkgJson = JSON.parse(original) as Record<string, unknown> & { version?: string };\n let modified = false;\n\n if (pkgJson.version !== pkg.version) {\n pkgJson.version = pkg.version;\n modified = true;\n }\n\n // Every dependency-like section must be rewritten: a published tarball's\n // devDependencies/optionalDependencies\n // field is inert for the *installer* of this package, but npm's own manifest\n // normalization (npm-package-arg validation inside @npmcli/arborist) parses\n // EVERY dependency-like section of every manifest it reads while building the\n // ideal tree — including devDependencies of a package several levels deep in\n // someone else's dependency graph. A leftover \"workspace:*\" there throws\n // EUNSUPPORTEDPROTOCOL and aborts the whole install, not just a devDependency\n // installation that would otherwise be skipped. Confirmed live on\n // @kb-labs/plugin-execution-factory@2.114.0's devDependencies.@kb-labs/gateway-core.\n for (const section of ['dependencies', 'optionalDependencies', 'peerDependencies', 'devDependencies'] as const) {\n const deps = pkgJson[section] as Record<string, string> | undefined;\n if (!deps) { continue; }\n if (rewriteDepsSection(deps, pkgPath, versionMap, packageManager)) { modified = true; }\n }\n\n if (modified) {\n writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + '\\n');\n }\n\n return () => writeFileSync(pkgJsonPath, original);\n}\n\n// ── topoSort helpers ──────────────────────────────────────────────────────\n\n/**\n * Build a simple topological sort of packages for publish order.\n *\n * Packages are grouped into \"waves\": wave 0 has no intra-release deps,\n * wave 1 depends only on wave 0, etc. Within each wave publish order\n * is arbitrary (safe to parallelise).\n *\n * Cycles (should not exist in a well-formed monorepo) fall into a\n * \"remainder\" group appended at the end.\n */\nexport interface TopoPackage {\n name: string;\n path: string;\n version: string;\n}\n\nfunction buildIntraDeps(packages: TopoPackage[], nameSet: Set<string>): Map<string, Set<string>> {\n const deps = new Map<string, Set<string>>();\n for (const pkg of packages) {\n const intra = new Set<string>();\n try {\n const pkgJson = JSON.parse(readFileSync(join(pkg.path, 'package.json'), 'utf-8')) as {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n };\n for (const section of ['dependencies', 'peerDependencies'] as const) {\n for (const depName of Object.keys(pkgJson[section] ?? {})) {\n if (nameSet.has(depName)) { intra.add(depName); }\n }\n }\n } catch {\n // If we can't read package.json, treat as no deps\n }\n deps.set(pkg.name, intra);\n }\n return deps;\n}\n\nfunction buildDependantsMap(packages: TopoPackage[], deps: Map<string, Set<string>>): Map<string, Set<string>> {\n const dependants = new Map<string, Set<string>>();\n for (const pkg of packages) {\n for (const dep of deps.get(pkg.name) ?? []) {\n if (!dependants.has(dep)) { dependants.set(dep, new Set()); }\n dependants.get(dep)!.add(pkg.name);\n }\n }\n return dependants;\n}\n\nfunction computeWaves(\n packages: TopoPackage[],\n deps: Map<string, Set<string>>,\n dependants: Map<string, Set<string>>,\n): TopoPackage[][] {\n const byName = new Map(packages.map(p => [p.name, p]));\n const remaining = new Map<string, number>(\n packages.map(p => [p.name, (deps.get(p.name) ?? new Set()).size])\n );\n const waves: TopoPackage[][] = [];\n\n while (remaining.size > 0) {\n const wave = [...remaining.entries()]\n .filter(([, count]) => count === 0)\n .map(([name]) => byName.get(name)!);\n\n if (wave.length === 0) {\n waves.push([...remaining.keys()].map(n => byName.get(n)!));\n break;\n }\n\n waves.push(wave);\n for (const pkg of wave) {\n remaining.delete(pkg.name);\n for (const dependant of dependants.get(pkg.name) ?? []) {\n if (remaining.has(dependant)) {\n remaining.set(dependant, (remaining.get(dependant) ?? 1) - 1);\n }\n }\n }\n }\n\n return waves.filter(w => w.length > 0);\n}\n\nexport function topoSort(packages: TopoPackage[], _packageManager: string): TopoPackage[][] {\n const nameSet = new Set(packages.map(p => p.name));\n const deps = buildIntraDeps(packages, nameSet);\n const dependants = buildDependantsMap(packages, deps);\n return computeWaves(packages, deps, dependants);\n}\n","/**\n * Programmatic npm publishing for REST handlers (non-interactive context).\n *\n * Uses `npm publish` CLI via spawn with NODE_AUTH_TOKEN env variable.\n * This is the correct approach for granular access tokens (classic tokens\n * were revoked by npm in December 2025).\n *\n * Token resolution order:\n * 1. options.token (explicit override)\n * 2. NPM_TOKEN env variable\n * 3. NODE_AUTH_TOKEN env variable\n *\n * Reliability guarantees:\n * - Already-published versions are treated as success (idempotent re-runs).\n * - 429 rate-limit: exponential back-off with jitter, up to MAX_RETRIES attempts.\n * - Transient network errors (ECONNRESET, ETIMEDOUT, etc.) are also retried.\n * - Packages are published in topological order (deps before dependants).\n * - Default concurrency is 4 — enough throughput, low enough to avoid rate limits.\n */\n\nimport { spawn } from 'node:child_process';\nimport { readFileSync, writeFileSync, existsSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { useLogger, useEnv } from '@kb-labs/sdk';\nimport { rewriteWorkspaceDeps, topoSort } from './dep-rewrite';\n\nexport interface PackageToPublish {\n name: string;\n version: string;\n path: string;\n /**\n * Pre-built tarball to publish instead of packing fresh from `path`\n * (produced by `release stage` — see stage.ts). When set, `path` is\n * only used as the cwd for npm's `.npmrc` auth lookup — no\n * `rewriteWorkspaceDeps` mutation happens, since the tarball's\n * package.json is already final and must ship byte-for-byte unchanged.\n */\n tarballPath?: string;\n}\n\nexport interface ProgrammaticPublishOptions {\n packages: PackageToPublish[];\n packageManager?: 'pnpm' | 'npm' | 'yarn';\n dryRun?: boolean;\n otp?: string;\n tag?: string;\n access?: 'public' | 'restricted';\n registry?: string;\n token?: string;\n}\n\nexport interface PublishResult {\n name: string;\n version: string;\n success: boolean;\n /** Package was already published at this version — counted as success. */\n alreadyPublished?: boolean;\n error?: string;\n /** npm's own error code (e.g. \"E403\"), extracted from its stderr, when recognizable. */\n errorCode?: string;\n /** Actionable, human-readable explanation for errorCode — see NPM_ERROR_HINTS. */\n errorHint?: string;\n}\n\nexport interface ProgrammaticPublishResult {\n results: PublishResult[];\n published: string[];\n /** Versions that were already on npm (counted as success). */\n alreadyPublished: string[];\n failed: string[];\n skipped: string[];\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Retry configuration\n// ---------------------------------------------------------------------------\n\nconst MAX_RETRIES = 5;\n\n// Exponential base delays (ms). Actual delay = base * jitter(0.8–1.2).\nconst RETRY_BASE_DELAYS_MS = [10_000, 20_000, 40_000, 80_000, 160_000] as const;\n\n/** Retryable error patterns — all transient, not indicative of a bad package. */\nconst RETRYABLE_PATTERNS = [\n 'E429',\n '429 Too Many Requests',\n 'ECONNRESET',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'EAI_AGAIN',\n 'socket hang up',\n 'network timeout',\n 'read ECONNRESET',\n];\n\n/** \"Already published\" — treat as success so re-runs are idempotent. */\nconst ALREADY_PUBLISHED_PATTERNS = [\n 'You cannot publish over the previously published versions',\n 'cannot publish over the previously published version',\n 'EPUBLISHCONFLICT',\n // Some registries return 403 for conflicts\n];\n\nfunction isRetryable(message: string): boolean {\n return RETRYABLE_PATTERNS.some(p => message.includes(p));\n}\n\nfunction isAlreadyPublished(message: string): boolean {\n return ALREADY_PUBLISHED_PATTERNS.some(p => message.includes(p));\n}\n\n/**\n * Human-readable hints per npm error code — surfaced directly in the\n * delivery report so a permanent failure doesn't require digging through\n * raw CI logs to tell \"our token is broken\" apart from \"npm has flagged\n * this specific package,\" which look identical (both E403) but need\n * completely different fixes.\n */\nconst NPM_ERROR_HINTS: Record<string, string> = {\n E403: 'npm rejected the publish (403). If other packages in the same run succeeded with the same token, this is almost certainly an npm-side restriction on this specific package/account entry (e.g. a security hold), not a token or code problem — check npmjs.com directly or contact npm support. Retrying will not help until that is resolved.',\n E401: 'Authentication failed (401) — NPM_TOKEN/NODE_AUTH_TOKEN is missing, expired, or invalid for this registry.',\n E404: 'Registry returned 404 — check the registry URL and that the package name/scope is correct and accessible with this token.',\n EOTP: 'npm requires a one-time password for this publish — programmatic (token-based) delivery cannot supply one; this package needs an interactive `npm publish` from a human, or a token exempt from OTP.',\n};\n\n/** Extract the npm CLI's own error code (e.g. \"E403\") from its stderr, if present. */\nfunction extractNpmErrorCode(message: string): string | undefined {\n const match = message.match(/\\bnpm error code (E[A-Z0-9]+)\\b/);\n return match?.[1];\n}\n\n/** Classify a permanent publish failure into a code + actionable hint, when recognizable. */\nfunction classifyPublishError(message: string): { code?: string; hint?: string } {\n const code = extractNpmErrorCode(message);\n const hint = code ? NPM_ERROR_HINTS[code] : undefined;\n return { code, hint };\n}\n\n/** Exponential back-off with ±20% jitter. */\nfunction retryDelay(attempt: number): number {\n const base = RETRY_BASE_DELAYS_MS[Math.min(attempt, RETRY_BASE_DELAYS_MS.length - 1)]!;\n const jitter = 0.8 + Math.random() * 0.4; // 0.8 – 1.2\n return Math.round(base * jitter);\n}\n\n// ---------------------------------------------------------------------------\n// Token resolution\n// ---------------------------------------------------------------------------\n\nfunction resolveToken(token?: string): string | undefined {\n return token ?? useEnv('NPM_TOKEN') ?? useEnv('NODE_AUTH_TOKEN');\n}\n\n// ---------------------------------------------------------------------------\n// Low-level spawn\n// ---------------------------------------------------------------------------\n\n/**\n * Spawn `packageManager publish` for a single package.\n * Writes a temporary .npmrc for NODE_AUTH_TOKEN auth, cleans it up on exit.\n */\nfunction spawnPublish(options: {\n packagePath: string;\n /** Publish this exact tarball instead of packing `packagePath` fresh. */\n tarballPath?: string;\n packageManager: string;\n token: string | undefined;\n otp?: string;\n dryRun?: boolean;\n tag?: string;\n access?: string;\n registry?: string;\n}): Promise<void> {\n const { packagePath, tarballPath, packageManager, token, otp, dryRun, tag, access, registry } = options;\n\n return new Promise((resolve, reject) => {\n const args = ['publish'];\n if (tarballPath) { args.push(tarballPath); }\n\n if (packageManager === 'pnpm' && !tarballPath) {\n // pnpm checks git cleanliness; we version-bump before publish which makes\n // the tree dirty — bypass that check. N/A when publishing a pre-built\n // tarball — there's no working-tree state for pnpm to check.\n args.push('--no-git-checks');\n }\n if (dryRun) { args.push('--dry-run'); }\n if (tag) { args.push(`--tag=${tag}`); }\n if (access) { args.push(`--access=${access}`); }\n if (registry) { args.push(`--registry=${registry}`); }\n if (otp) { args.push(`--otp=${otp}`); }\n\n const env: NodeJS.ProcessEnv = { ...process.env };\n if (token) { env['NODE_AUTH_TOKEN'] = token; }\n\n // Write a per-package .npmrc so npm picks up NODE_AUTH_TOKEN.\n // The auth line's host must match the target registry — hardcoding\n // registry.npmjs.org here would silently break token auth against\n // Verdaccio or any other non-npmjs registry.\n const npmrcPath = join(packagePath, '.npmrc');\n const npmrcExisted = existsSync(npmrcPath);\n const npmrcBackup = npmrcExisted ? readFileSync(npmrcPath, 'utf-8') : null;\n const registryHost = registry ? new URL(registry).host : 'registry.npmjs.org';\n const authLine = `//${registryHost}/:_authToken=\\${NODE_AUTH_TOKEN}\\n`;\n\n if (token) {\n const existing = npmrcExisted ? readFileSync(npmrcPath, 'utf-8') : '';\n if (!existing.includes('_authToken')) {\n writeFileSync(npmrcPath, existing + authLine);\n }\n }\n\n const restoreNpmrc = () => {\n if (!token) { return; }\n try {\n if (npmrcBackup !== null) {\n writeFileSync(npmrcPath, npmrcBackup);\n } else if (existsSync(npmrcPath)) {\n unlinkSync(npmrcPath);\n }\n } catch { /* best-effort */ }\n };\n\n const child = spawn(packageManager, args, {\n cwd: packagePath,\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n env,\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (d: Buffer) => { stdout += d.toString(); });\n child.stderr?.on('data', (d: Buffer) => { stderr += d.toString(); });\n\n child.on('close', (code: number | null) => {\n restoreNpmrc();\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(stderr || stdout || `${packageManager} publish exited with code ${code}`));\n }\n });\n\n child.on('error', (err: Error) => {\n restoreNpmrc();\n reject(err);\n });\n });\n}\n\n// ---------------------------------------------------------------------------\n// Per-package publish with retry\n// ---------------------------------------------------------------------------\n\nasync function publishOne(\n pkg: PackageToPublish,\n opts: {\n packageManager: string;\n token: string | undefined;\n versionMap: Map<string, string>;\n dryRun?: boolean;\n otp?: string;\n tag?: string;\n access?: string;\n registry?: string;\n },\n logger: ReturnType<typeof useLogger>,\n): Promise<PublishResult> {\n // A pre-built tarball (see PackageToPublish.tarballPath) is already final\n // — publishing it must ship those exact bytes, so skip the package.json\n // rewrite entirely rather than mutating a directory whose content the\n // tarball no longer reflects.\n const restore = pkg.tarballPath ? (() => {}) : rewriteWorkspaceDeps(pkg, opts.versionMap, opts.packageManager);\n\n try {\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n await spawnPublish({\n packagePath: pkg.path,\n tarballPath: pkg.tarballPath,\n packageManager: opts.packageManager,\n token: opts.token,\n otp: opts.otp,\n dryRun: opts.dryRun,\n tag: opts.tag,\n access: opts.access,\n registry: opts.registry,\n });\n\n logger.info(`Published ${pkg.name}@${pkg.version}`);\n return { name: pkg.name, version: pkg.version, success: true };\n\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n\n // Idempotency: already published at this version → success.\n if (isAlreadyPublished(message)) {\n logger.info(`${pkg.name}@${pkg.version} already published — skipping`);\n return { name: pkg.name, version: pkg.version, success: true, alreadyPublished: true };\n }\n\n // Retryable transient error (rate-limit, network blip).\n if (isRetryable(message) && attempt < MAX_RETRIES) {\n const delay = retryDelay(attempt);\n logger.warn(\n `Transient error for ${pkg.name}@${pkg.version} (attempt ${attempt + 1}/${MAX_RETRIES}), ` +\n `retrying in ${(delay / 1000).toFixed(1)}s: ${message.split('\\n')[0]}`,\n );\n await new Promise<void>(r => { setTimeout(r, delay); });\n continue;\n }\n\n // Permanent failure.\n const { code, hint } = classifyPublishError(message);\n logger.error(`Failed to publish ${pkg.name}@${pkg.version}`, undefined, { error: message, errorCode: code });\n return { name: pkg.name, version: pkg.version, success: false, error: message, errorCode: code, errorHint: hint };\n }\n }\n\n // Exhausted retries.\n return {\n name: pkg.name,\n version: pkg.version,\n success: false,\n error: `Publish failed after ${MAX_RETRIES} retries (transient errors)`,\n };\n } finally {\n restore();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\nfunction skipRemainingWaves(\n waves: ReturnType<typeof topoSort>,\n waveIdx: number,\n waveFailed: PublishResult[],\n logger: ReturnType<typeof useLogger>,\n allResults: PublishResult[],\n): void {\n const remaining = waves.slice(waveIdx + 1).reduce((acc, w) => acc + w.length, 0);\n if (remaining === 0) { return; }\n logger.warn(\n `Wave ${waveIdx + 1} had ${waveFailed.length} failure(s) — ` +\n `skipping ${remaining} package(s) in later waves to avoid broken dependency chain`,\n );\n for (const laterWave of waves.slice(waveIdx + 1)) {\n for (const pkg of laterWave) {\n allResults.push({ name: pkg.name, version: pkg.version, success: false, error: 'Skipped: dependency wave failed' });\n }\n }\n}\n\n/**\n * Publish packages programmatically (non-interactive, for REST handlers / CI).\n *\n * Packages are published in topological order (deps before dependants) to\n * avoid \"package not found\" errors when a dependent is installed right after\n * release. Within each topological wave, publishes run in parallel up to\n * CONCURRENCY.\n */\nexport async function publishPackagesProgrammatic(\n options: ProgrammaticPublishOptions,\n): Promise<ProgrammaticPublishResult> {\n const {\n packages,\n packageManager = 'pnpm',\n dryRun,\n otp,\n tag,\n access,\n registry,\n } = options;\n\n const logger = useLogger();\n const token = resolveToken(options.token);\n\n if (!token && !dryRun) {\n const error = 'No npm token found. Set NPM_TOKEN (or NODE_AUTH_TOKEN) in environment.';\n logger.error(error);\n return {\n results: [],\n published: [],\n alreadyPublished: [],\n failed: packages.map(p => `${p.name}@${p.version}`),\n skipped: [],\n errors: [error],\n };\n }\n\n // Version map for dep rewriting (workspace:/link: → ^version).\n const versionMap = new Map(packages.map(p => [p.name, p.version]));\n\n // Concurrency: default 4 — enough throughput, below npm's sustained rate limit.\n const CONCURRENCY = Number(useEnv('KB_PUBLISH_CONCURRENCY') ?? 4);\n\n // Sort packages into topological waves so deps are always published first.\n const waves = topoSort(packages, packageManager);\n\n logger.info(\n `Publishing ${packages.length} package(s) in ${waves.length} topological wave(s) ` +\n `(concurrency=${CONCURRENCY}, dryRun=${dryRun ?? false})`,\n );\n\n const allResults: PublishResult[] = [];\n\n for (let waveIdx = 0; waveIdx < waves.length; waveIdx++) {\n const wave = waves[waveIdx]!;\n logger.info(`Wave ${waveIdx + 1}/${waves.length}: publishing ${wave.length} package(s)`);\n\n // Publish wave in parallel batches.\n for (let i = 0; i < wave.length; i += CONCURRENCY) {\n const batch = wave.slice(i, i + CONCURRENCY);\n const batchResults = await Promise.all(\n batch.map(pkg =>\n publishOne(pkg, { packageManager, token, versionMap, dryRun, otp, tag, access, registry }, logger),\n ),\n );\n allResults.push(...batchResults);\n }\n\n // If any package in this wave genuinely failed (not alreadyPublished), stop\n // publishing the next wave — it may depend on the failed packages.\n const waveFailed = allResults.slice(-wave.length).filter(r => !r.success);\n if (waveFailed.length > 0) {\n skipRemainingWaves(waves, waveIdx, waveFailed, logger, allResults);\n break;\n }\n }\n\n const published = allResults.filter(r => r.success && !r.alreadyPublished).map(r => `${r.name}@${r.version}`);\n const alreadyPublished = allResults.filter(r => r.alreadyPublished).map(r => `${r.name}@${r.version}`);\n const failed = allResults.filter(r => !r.success).map(r => `${r.name}@${r.version}`);\n const errors = allResults.filter(r => !r.success && r.error).map(r => `${r.name}: ${r.error}`);\n\n if (alreadyPublished.length > 0) {\n logger.info(`${alreadyPublished.length} package(s) already published — counted as success`);\n }\n\n return {\n results: allResults,\n published,\n alreadyPublished,\n failed,\n skipped: dryRun ? packages.map(p => `${p.name}@${p.version} (dry-run)`) : [],\n errors,\n };\n}\n","/**\n * Stage a release plan's PLANNED package versions to a local registry\n * (Verdaccio), so the `pack-install` release gate can verify internal\n * cross-package dependencies against the version this release is about to\n * ship instead of whatever is already live on npm.\n *\n * Not to be confused with `release stage` (stage.ts): that command packs\n * already-committed, already-bumped versions for CI delivery AFTER human\n * approval — this one runs BEFORE Bump versions, off the in-memory plan\n * `Preview` already computed, and publishes to a throwaway local registry\n * instead of producing artifacts for a real release.\n *\n * Internal dependencies are rewritten to `^nextVersion` regardless of the\n * workspace's configured package manager: `rewriteWorkspaceDeps` only\n * rewrites `workspace:*` for non-pnpm managers (pnpm materializes\n * `workspace:*` itself, but only to the CURRENT on-disk version — the exact\n * thing this command exists to work around), so packages are always\n * packed/published here with the 'npm' package manager.\n */\n\nimport { spawnSync } from 'node:child_process';\nimport { mkdtempSync, readFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { defineCommand, type CLIInput, type PluginContextV3, useLoader, useConfig, type CommandResult } from '@kb-labs/sdk';\nimport {\n discoverCurrentPackages,\n type ReleaseConfig,\n type ReleasePlan,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { rewriteWorkspaceDeps } from '../../shared/dep-rewrite';\nimport { publishPackagesProgrammatic, type PackageToPublish } from '../../shared/publish-programmatic';\n\n/** `npm pack --json` prints a JSON array; we only ever pack one package at a time. */\nfunction filenameFromNpmPack(stdout: string): string | undefined {\n const parsed = JSON.parse(stdout) as Array<{ filename: string }>;\n return parsed[0]?.filename;\n}\n\n/**\n * Pack one plan package at its PLANNED nextVersion, with internal sibling\n * deps rewritten to the full-workspace versionMap (plan packages → their\n * nextVersion, everything else → current). Always uses `npm pack`, never\n * pnpm — see file header for why.\n */\nfunction packPlanPackage(\n pkg: { name: string; path: string; nextVersion: string },\n outDir: string,\n versionMap: Map<string, string>,\n): string {\n const restore = rewriteWorkspaceDeps({ path: pkg.path, version: pkg.nextVersion }, versionMap, 'npm');\n try {\n const packResult = spawnSync('npm', ['pack', '--pack-destination', outDir, '--json'], { cwd: pkg.path, stdio: 'pipe' });\n if (packResult.status !== 0) {\n const stderr = packResult.stderr?.toString().trim() || packResult.stdout?.toString().trim();\n throw new Error(`npm pack failed for ${pkg.name}@${pkg.nextVersion}${stderr ? `: ${stderr}` : ''}`);\n }\n const filename = filenameFromNpmPack(packResult.stdout.toString());\n if (!filename) {\n throw new Error(`npm pack produced no tarball for ${pkg.name}@${pkg.nextVersion}`);\n }\n return join(outDir, filename);\n } finally {\n restore();\n }\n}\n\ninterface StagePlanFlags {\n 'plan-path'?: string;\n registry?: string;\n token?: string;\n tag?: string;\n json?: boolean;\n}\n\ninterface StagePlanPayload {\n registry: string;\n published: string[];\n alreadyPublished: string[];\n failed: string[];\n}\n\nexport default defineCommand({\n id: 'release:stage-plan',\n description: 'Publish a release plan\\'s planned package versions to a local staging registry (Verdaccio)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<StagePlanFlags>): Promise<CommandResult<StagePlanPayload>> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const planPath = flags['plan-path'];\n const registry = flags.registry;\n\n if (!planPath || !registry) {\n const msg = 'release:stage-plan requires --plan-path <path> and --registry <url>';\n if (flags.json) { ctx.ui?.json?.({ error: msg }); } else { ctx.ui?.error?.(msg); }\n return { ok: false, error: 'Command failed' };\n }\n\n let plan: ReleasePlan;\n try {\n plan = JSON.parse(readFileSync(planPath, 'utf-8')) as ReleasePlan;\n } catch (err) {\n const msg = `release:stage-plan could not read plan at ${planPath}: ${err instanceof Error ? err.message : String(err)}`;\n if (flags.json) { ctx.ui?.json?.({ error: msg }); } else { ctx.ui?.error?.(msg); }\n return { ok: false, error: 'Command failed' };\n }\n\n if (plan.packages.length === 0) {\n const msg = 'No packages in release plan — nothing to stage';\n if (flags.json) { ctx.ui?.json?.({ ok: true, result: { registry, published: [], alreadyPublished: [], failed: [] } }); } else { ctx.ui?.write?.(msg); }\n return { ok: true, result: { registry, published: [], alreadyPublished: [], failed: [] } };\n }\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const baseConfig: ReleaseConfig = fileConfig ?? {};\n\n // versionMap covers the WHOLE workspace (unfiltered baseConfig, not a\n // flow-merged one — a FlowConfig's `packages` filter COMPLETELY\n // REPLACES the global one, so merging here would silently drop\n // cross-flow siblings) so a plan package's dependency on a package\n // OUTSIDE this flow (not being released right now) still resolves —\n // to that sibling's current, already-published version, via the\n // staging registry's real-npm uplink. Plan packages then override\n // their own entry with the PLANNED nextVersion.\n const discoverLoader = useLoader('Resolving workspace package versions...');\n discoverLoader.start();\n const allWorkspacePackages = await discoverCurrentPackages(repoRoot, undefined, baseConfig);\n const versionMap = new Map(allWorkspacePackages.map(pkg => [pkg.name, pkg.currentVersion]));\n for (const pkg of plan.packages) {\n versionMap.set(pkg.name, pkg.nextVersion);\n }\n discoverLoader.succeed(`Resolved ${versionMap.size} workspace package version(s)`);\n\n // Pack each plan package ourselves (npm, deps pre-rewritten to\n // versionMap) rather than letting publishPackagesProgrammatic pack —\n // its own internal versionMap only covers the packages it's handed\n // (see publish-programmatic.ts), which would leave a plan package's\n // dependency on a package OUTSIDE this flow as a literal\n // unresolvable `workspace:*` in the published tarball.\n const packLoader = useLoader(`Packing ${plan.packages.length} planned package version(s)...`);\n packLoader.start();\n const outDir = mkdtempSync(join(tmpdir(), 'kb-stage-plan-'));\n const packagesToPublish: PackageToPublish[] = [];\n try {\n for (const pkg of plan.packages) {\n const tarballPath = packPlanPackage(pkg, outDir, versionMap);\n packagesToPublish.push({ name: pkg.name, version: pkg.nextVersion, path: pkg.path, tarballPath });\n }\n } catch (err) {\n packLoader.fail('Packing failed');\n const msg = err instanceof Error ? err.message : String(err);\n if (flags.json) { ctx.ui?.json?.({ error: msg }); } else { ctx.ui?.error?.(msg); }\n return { ok: false, error: 'Command failed' };\n }\n packLoader.succeed(`Packed ${packagesToPublish.length} package(s)`);\n\n const stageLoader = useLoader(`Staging ${packagesToPublish.length} planned package version(s) to ${registry}...`);\n stageLoader.start();\n const result = await publishPackagesProgrammatic({\n packages: packagesToPublish,\n packageManager: 'npm',\n registry,\n tag: flags.tag ?? 'latest',\n access: 'public',\n token: flags.token ?? 'verdaccio-local',\n });\n\n if (result.failed.length > 0) {\n stageLoader.fail(`${result.failed.length}/${packagesToPublish.length} package(s) failed to stage`);\n if (flags.json) {\n ctx.ui?.json?.({ ok: false, result: { registry, ...result } });\n } else {\n ctx.ui?.error?.(result.errors.join('\\n'));\n }\n return { ok: false, error: 'Command failed', result: { registry, published: result.published, alreadyPublished: result.alreadyPublished, failed: result.failed } };\n }\n\n stageLoader.succeed(`Staged ${result.published.length} package(s) (${result.alreadyPublished.length} already staged)`);\n\n const payload: StagePlanPayload = {\n registry,\n published: result.published,\n alreadyPublished: result.alreadyPublished,\n failed: result.failed,\n };\n\n console.log('::kb-output::' + JSON.stringify({ ok: true, registry, staged: payload.published.length + payload.alreadyPublished.length }));\n\n if (flags.json) {\n const response = { ok: true as const, result: payload };\n ctx.ui?.json?.(response);\n return response;\n }\n\n return { ok: true, result: payload };\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/dep-rewrite.ts","../../../src/shared/publish-programmatic.ts","../../../src/cli/commands/stage-plan.ts"],"names":["join","readFileSync","writeFileSync"],"mappings":";;;;;;;;AAyBA,SAAS,cAAA,CACP,IAAA,EACA,OAAA,EACA,GAAA,EACA,SACA,UAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AACrC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,IAAA,CAAK,OAAO,CAAA,GAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC1B,IAAA;AAAA,EACF;AACA,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,SAAS,QAAA,EAAU,cAAc,CAAA,EAAG,OAAO,CAAC,CAAA;AACxF,IAAA,IAAA,CAAK,OAAO,CAAA,GAAI,CAAA,CAAA,EAAI,MAAA,CAAO,WAAW,GAAG,CAAA,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,IAAA,CAAK,OAAO,CAAA,GAAI,GAAA;AAAA,EAClB;AACF;AAEA,SAAS,mBAAA,CACP,IAAA,EACA,OAAA,EACA,GAAA,EACA,UAAA,EACS;AACT,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AACrC,EAAA,IAAI,CAAC,MAAA,EAAQ;AAAE,IAAA,OAAO,KAAA;AAAA,EAAO;AAC7B,EAAA,MAAM,QAAQ,GAAA,KAAQ,aAAA,GAAgB,MAAM,GAAA,CAAI,KAAA,CAAM,aAAa,MAAM,CAAA;AACzE,EAAA,IAAA,CAAK,OAAO,CAAA,GAAI,CAAA,EAAG,KAAK,GAAG,MAAM,CAAA,CAAA;AACjC,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,kBAAA,CACP,IAAA,EACA,OAAA,EACA,UAAA,EACA,cAAA,EACS;AACT,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACvC,IAAA,MAAM,GAAA,GAAM,KAAK,OAAO,CAAA;AACxB,IAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAAE,MAAA;AAAA,IAAU;AACzC,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AAC3B,MAAA,cAAA,CAAe,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,OAAA,EAAS,UAAU,CAAA;AACtD,MAAA,QAAA,GAAW,IAAA;AAAA,IACb,CAAA,MAAA,IAAW,GAAA,CAAI,UAAA,CAAW,YAAY,CAAA,IAAK,cAAA,KAAmB,MAAA,IAAU,mBAAA,CAAoB,IAAA,EAAM,OAAA,EAAS,GAAA,EAAK,UAAU,CAAA,EAAG;AAC3H,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,oBAAA,CACd,GAAA,EACA,UAAA,EACA,cAAA,EACY;AACZ,EAAA,MAAM,UAAU,GAAA,CAAI,IAAA;AACpB,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AAChD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AAClD,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACnC,EAAA,IAAI,QAAA,GAAW,KAAA;AAEf,EAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,GAAA,CAAI,OAAA,EAAS;AACnC,IAAA,OAAA,CAAQ,UAAU,GAAA,CAAI,OAAA;AACtB,IAAA,QAAA,GAAW,IAAA;AAAA,EACb;AAYA,EAAA,KAAA,MAAW,WAAW,CAAC,cAAA,EAAgB,sBAAA,EAAwB,kBAAA,EAAoB,iBAAiB,CAAA,EAAY;AAC9G,IAAA,MAAM,IAAA,GAAO,QAAQ,OAAO,CAAA;AAC5B,IAAA,IAAI,CAAC,IAAA,EAAM;AAAE,MAAA;AAAA,IAAU;AACvB,IAAA,IAAI,kBAAA,CAAmB,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,cAAc,CAAA,EAAG;AAAE,MAAA,QAAA,GAAW,IAAA;AAAA,IAAM;AAAA,EACxF;AAEA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,aAAA,CAAc,aAAa,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AAAA,EACpE;AAEA,EAAA,OAAO,MAAM,aAAA,CAAc,WAAA,EAAa,QAAQ,CAAA;AAClD;AAoBA,SAAS,cAAA,CAAe,UAAyB,OAAA,EAAgD;AAC/F,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAyB;AAC1C,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,IAAI,IAAA,EAAM,cAAc,CAAA,EAAG,OAAO,CAAC,CAAA;AAIhF,MAAA,KAAA,MAAW,OAAA,IAAW,CAAC,cAAA,EAAgB,kBAAkB,CAAA,EAAY;AACnE,QAAA,KAAA,MAAW,OAAA,IAAW,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,IAAK,EAAE,CAAA,EAAG;AACzD,UAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAAE,YAAA,KAAA,CAAM,IAAI,OAAO,CAAA;AAAA,UAAG;AAAA,QAClD;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,UAAyB,IAAA,EAA0D;AAC7G,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAyB;AAChD,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,KAAA,MAAW,OAAO,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,CAAA,IAAK,EAAC,EAAG;AAC1C,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AAAE,QAAA,UAAA,CAAW,GAAA,CAAI,GAAA,kBAAK,IAAI,GAAA,EAAK,CAAA;AAAA,MAAG;AAC5D,MAAA,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,CAAG,GAAA,CAAI,IAAI,IAAI,CAAA;AAAA,IACnC;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,YAAA,CACP,QAAA,EACA,IAAA,EACA,UAAA,EACiB;AACjB,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AACrD,EAAA,MAAM,YAAY,IAAI,GAAA;AAAA,IACpB,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,EAAE,IAAA,EAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,oBAAK,IAAI,GAAA,EAAI,EAAG,IAAI,CAAC;AAAA,GAClE;AACA,EAAA,MAAM,QAAyB,EAAC;AAEhC,EAAA,OAAO,SAAA,CAAU,OAAO,CAAA,EAAG;AACzB,IAAA,MAAM,IAAA,GAAO,CAAC,GAAG,SAAA,CAAU,OAAA,EAAS,CAAA,CACjC,MAAA,CAAO,CAAC,GAAG,KAAK,MAAM,KAAA,KAAU,CAAC,CAAA,CACjC,GAAA,CAAI,CAAC,CAAC,IAAI,CAAA,KAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAE,CAAA;AAEpC,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,GAAG,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,MAAA,CAAO,GAAA,CAAI,CAAC,CAAE,CAAC,CAAA;AACzD,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,SAAA,CAAU,MAAA,CAAO,IAAI,IAAI,CAAA;AACzB,MAAA,KAAA,MAAW,aAAa,UAAA,CAAW,GAAA,CAAI,IAAI,IAAI,CAAA,IAAK,EAAC,EAAG;AACtD,QAAA,IAAI,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA,EAAG;AAC5B,UAAA,SAAA,CAAU,IAAI,SAAA,EAAA,CAAY,SAAA,CAAU,IAAI,SAAS,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,CAAC,CAAA;AACvC;AAEO,SAAS,QAAA,CAAS,UAAyB,eAAA,EAA0C;AAC1F,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA;AACjD,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,QAAA,EAAU,OAAO,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,QAAA,EAAU,IAAI,CAAA;AACpD,EAAA,OAAO,YAAA,CAAa,QAAA,EAAU,IAAA,EAAM,UAAU,CAAA;AAChD;ACnIA,IAAM,WAAA,GAAc,CAAA;AAGpB,IAAM,uBAAuB,CAAC,GAAA,EAAQ,GAAA,EAAQ,GAAA,EAAQ,KAAQ,IAAO,CAAA;AAGrE,IAAM,kBAAA,GAAqB;AAAA,EACzB,MAAA;AAAA,EACA,uBAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA;AAGA,IAAM,0BAAA,GAA6B;AAAA,EACjC,2DAAA;AAAA,EACA,sDAAA;AAAA,EACA;AAAA;AAEF,CAAA;AAEA,SAAS,YAAY,OAAA,EAA0B;AAC7C,EAAA,OAAO,mBAAmB,IAAA,CAAK,CAAA,CAAA,KAAK,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAC,CAAA;AACzD;AAEA,SAAS,mBAAmB,OAAA,EAA0B;AACpD,EAAA,OAAO,2BAA2B,IAAA,CAAK,CAAA,CAAA,KAAK,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAC,CAAA;AACjE;AASA,IAAM,eAAA,GAA0C;AAAA,EAC9C,IAAA,EAAM,qVAAA;AAAA,EACN,IAAA,EAAM,iHAAA;AAAA,EACN,IAAA,EAAM,gIAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAGA,SAAS,oBAAoB,OAAA,EAAqC;AAChE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,iCAAiC,CAAA;AAC7D,EAAA,OAAO,QAAQ,CAAC,CAAA;AAClB;AAGA,SAAS,qBAAqB,OAAA,EAAmD;AAC/E,EAAA,MAAM,IAAA,GAAO,oBAAoB,OAAO,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,IAAA,GAAO,eAAA,CAAgB,IAAI,CAAA,GAAI,MAAA;AAC5C,EAAA,OAAO,EAAE,MAAM,IAAA,EAAK;AACtB;AAGA,SAAS,WAAW,OAAA,EAAyB;AAC3C,EAAA,MAAM,IAAA,GAAO,qBAAqB,IAAA,CAAK,GAAA,CAAI,SAAS,oBAAA,CAAqB,MAAA,GAAS,CAAC,CAAC,CAAA;AACpF,EAAA,MAAM,MAAA,GAAS,GAAA,GAAM,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA;AACrC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,MAAM,CAAA;AACjC;AAMA,SAAS,aAAa,KAAA,EAAoC;AACxD,EAAA,OAAO,KAAA,IAAS,MAAA,CAAO,WAAW,CAAA,IAAK,OAAO,iBAAiB,CAAA;AACjE;AAUA,SAAS,aAAa,OAAA,EAWJ;AAChB,EAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAa,cAAA,EAAgB,KAAA,EAAO,KAAK,MAAA,EAAQ,GAAA,EAAK,MAAA,EAAQ,QAAA,EAAS,GAAI,OAAA;AAEhG,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,IAAA,GAAO,CAAC,SAAS,CAAA;AACvB,IAAA,IAAI,WAAA,EAAa;AAAE,MAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,IAAG;AAE3C,IAAA,IAAI,cAAA,KAAmB,MAAA,IAAU,CAAC,WAAA,EAAa;AAI7C,MAAA,IAAA,CAAK,KAAK,iBAAiB,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,MAAA,EAAU;AAAE,MAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,IAAG;AACxC,IAAA,IAAI,GAAA,EAAU;AAAE,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AAAA,IAAG;AAC3C,IAAA,IAAI,MAAA,EAAU;AAAE,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,SAAA,EAAY,MAAM,CAAA,CAAE,CAAA;AAAA,IAAG;AACjD,IAAA,IAAI,QAAA,EAAU;AAAE,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAE,CAAA;AAAA,IAAG;AACrD,IAAA,IAAI,GAAA,EAAU;AAAE,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AAAA,IAAG;AAE3C,IAAA,MAAM,GAAA,GAAyB,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAI;AAChD,IAAA,IAAI,KAAA,EAAO;AAAE,MAAA,GAAA,CAAI,iBAAiB,CAAA,GAAI,KAAA;AAAA,IAAO;AAM7C,IAAA,MAAM,SAAA,GAAYA,IAAAA,CAAK,WAAA,EAAa,QAAQ,CAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,WAAW,SAAS,CAAA;AACzC,IAAA,MAAM,WAAA,GAAc,YAAA,GAAeC,YAAAA,CAAa,SAAA,EAAW,OAAO,CAAA,GAAI,IAAA;AACtE,IAAA,MAAM,eAAe,QAAA,GAAW,IAAI,GAAA,CAAI,QAAQ,EAAE,IAAA,GAAO,oBAAA;AACzD,IAAA,MAAM,QAAA,GAAW,KAAK,YAAY,CAAA;AAAA,CAAA;AAElC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,QAAA,GAAW,YAAA,GAAeA,YAAAA,CAAa,SAAA,EAAW,OAAO,CAAA,GAAI,EAAA;AACnE,MAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,EAAG;AACpC,QAAAC,aAAAA,CAAc,SAAA,EAAW,QAAA,GAAW,QAAQ,CAAA;AAAA,MAC9C;AAAA,IACF;AAEA,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,IAAI,CAAC,KAAA,EAAO;AAAE,QAAA;AAAA,MAAQ;AACtB,MAAA,IAAI;AACF,QAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,UAAAA,aAAAA,CAAc,WAAW,WAAW,CAAA;AAAA,QACtC,CAAA,MAAA,IAAW,UAAA,CAAW,SAAS,CAAA,EAAG;AAChC,UAAA,UAAA,CAAW,SAAS,CAAA;AAAA,QACtB;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAAoB;AAAA,IAC9B,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,cAAA,EAAgB,IAAA,EAAM;AAAA,MACxC,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAAA,MAChC,KAAA,EAAO,IAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAc;AAAE,MAAA,MAAA,IAAU,EAAE,QAAA,EAAS;AAAA,IAAG,CAAC,CAAA;AACnE,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAc;AAAE,MAAA,MAAA,IAAU,EAAE,QAAA,EAAS;AAAA,IAAG,CAAC,CAAA;AAEnE,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAwB;AACzC,MAAA,YAAA,EAAa;AACb,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAI,MAAM,MAAA,IAAU,MAAA,IAAU,GAAG,cAAc,CAAA,0BAAA,EAA6B,IAAI,CAAA,CAAE,CAAC,CAAA;AAAA,MAC5F;AAAA,IACF,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAe;AAChC,MAAA,YAAA,EAAa;AACb,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACZ,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAMA,eAAe,UAAA,CACb,GAAA,EACA,IAAA,EAUA,MAAA,EACwB;AAKxB,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,WAAA,IAAe,MAAM;AAAA,EAAC,KAAK,oBAAA,CAAqB,GAAA,EAAK,IAAA,CAAK,UAAA,EAAY,KAAK,cAAc,CAAA;AAE7G,EAAA,IAAI;AACF,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,WAAA,EAAa,OAAA,EAAA,EAAW;AACvD,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,CAAa;AAAA,UACjB,aAAa,GAAA,CAAI,IAAA;AAAA,UACjB,aAAa,GAAA,CAAI,WAAA;AAAA,UACjB,gBAAgB,IAAA,CAAK,cAAA;AAAA,UACrB,OAAO,IAAA,CAAK,KAAA;AAAA,UACZ,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,KAAK,IAAA,CAAK,GAAA;AAAA,UACV,QAAQ,IAAA,CAAK,MAAA;AAAA,UACb,UAAU,IAAA,CAAK;AAAA,SAChB,CAAA;AAED,QAAA,MAAA,CAAO,KAAK,CAAA,UAAA,EAAa,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAClD,QAAA,OAAO,EAAE,MAAM,GAAA,CAAI,IAAA,EAAM,SAAS,GAAA,CAAI,OAAA,EAAS,SAAS,IAAA,EAAK;AAAA,MAE/D,SAAS,GAAA,EAAc;AACrB,QAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAG/D,QAAA,IAAI,kBAAA,CAAmB,OAAO,CAAA,EAAG;AAC/B,UAAA,MAAA,CAAO,KAAK,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,kCAAA,CAA+B,CAAA;AACrE,UAAA,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,IAAI,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAK;AAAA,QACvF;AAGA,QAAA,IAAI,WAAA,CAAY,OAAO,CAAA,IAAK,OAAA,GAAU,WAAA,EAAa;AACjD,UAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,CAAA,oBAAA,EAAuB,IAAI,IAAI,CAAA,CAAA,EAAI,IAAI,OAAO,CAAA,UAAA,EAAa,OAAA,GAAU,CAAC,CAAA,CAAA,EAAI,WAAW,mBACrE,KAAA,GAAQ,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EAAM,QAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,WACtE;AACA,UAAA,MAAM,IAAI,QAAc,CAAA,CAAA,KAAK;AAAE,YAAA,UAAA,CAAW,GAAG,KAAK,CAAA;AAAA,UAAG,CAAC,CAAA;AACtD,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,qBAAqB,OAAO,CAAA;AACnD,QAAA,MAAA,CAAO,KAAA,CAAM,CAAA,kBAAA,EAAqB,GAAA,CAAI,IAAI,IAAI,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI,KAAA,CAAA,EAAW,EAAE,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,MAAM,CAAA;AAC3G,QAAA,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,SAAS,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,IAAA,EAAM,WAAW,IAAA,EAAK;AAAA,MAClH;AAAA,IACF;AAGA,IAAA,OAAO;AAAA,MACL,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,wBAAwB,WAAW,CAAA,2BAAA;AAAA,KAC5C;AAAA,EACF,CAAA,SAAE;AACA,IAAA,OAAA,EAAQ;AAAA,EACV;AACF;AAMA,SAAS,kBAAA,CACP,KAAA,EACA,OAAA,EACA,UAAA,EACA,QACA,UAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC/E,EAAA,IAAI,cAAc,CAAA,EAAG;AAAE,IAAA;AAAA,EAAQ;AAC/B,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,QAAQ,OAAA,GAAU,CAAC,QAAQ,UAAA,CAAW,MAAM,+BAChC,SAAS,CAAA,2DAAA;AAAA,GACvB;AACA,EAAA,KAAA,MAAW,SAAA,IAAa,KAAA,CAAM,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA,EAAG;AAChD,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,MAAA,UAAA,CAAW,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,iCAAA,EAAmC,CAAA;AAAA,IACpH;AAAA,EACF;AACF;AAUA,eAAsB,4BACpB,OAAA,EACoC;AACpC,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,cAAA,GAAiB,MAAA;AAAA,IACjB,MAAA;AAAA,IACA,GAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAExC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAA,GAAQ,wEAAA;AACd,IAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAClB,IAAA,OAAO;AAAA,MACL,SAAS,EAAC;AAAA,MACV,WAAW,EAAC;AAAA,MACZ,kBAAkB,EAAC;AAAA,MACnB,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,EAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,MAClD,SAAS,EAAC;AAAA,MACV,MAAA,EAAQ,CAAC,KAAK;AAAA,KAChB;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,CAAC,CAAC,CAAA;AAGjE,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,wBAAwB,KAAK,CAAC,CAAA;AAGhE,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,QAAwB,CAAA;AAE/C,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,CAAA,WAAA,EAAc,QAAA,CAAS,MAAM,CAAA,eAAA,EAAkB,KAAA,CAAM,MAAM,CAAA,kCAAA,EAC3C,WAAW,CAAA,SAAA,EAAY,MAAA,IAAU,KAAK,CAAA,CAAA;AAAA,GACxD;AAEA,EAAA,MAAM,aAA8B,EAAC;AAErC,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,GAAU,KAAA,CAAM,QAAQ,OAAA,EAAA,EAAW;AACvD,IAAA,MAAM,IAAA,GAAO,MAAM,OAAO,CAAA;AAC1B,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,OAAA,GAAU,CAAC,CAAA,CAAA,EAAI,MAAM,MAAM,CAAA,aAAA,EAAgB,IAAA,CAAK,MAAM,CAAA,WAAA,CAAa,CAAA;AAGvF,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,WAAA,EAAa;AACjD,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAI,WAAW,CAAA;AAC3C,MAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA;AAAA,QACjC,KAAA,CAAM,GAAA;AAAA,UAAI,CAAA,GAAA,KACR,UAAA,CAAW,GAAA,EAAK,EAAE,cAAA,EAAgB,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,QAAA,IAAY,MAAM;AAAA;AACnG,OACF;AACA,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,IACjC;AAIA,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAC,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,OAAO,CAAA;AACxE,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,kBAAA,CAAmB,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,MAAA,EAAQ,UAAU,CAAA;AACjE,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,YAAoB,UAAA,CAAW,MAAA,CAAO,OAAK,CAAA,CAAE,OAAA,IAAW,CAAC,CAAA,CAAE,gBAAgB,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACpH,EAAA,MAAM,gBAAA,GAAoB,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,gBAAgB,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACtG,EAAA,MAAM,SAAoB,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,OAAO,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAC9F,EAAA,MAAM,SAAoB,UAAA,CAAW,MAAA,CAAO,OAAK,CAAC,CAAA,CAAE,WAAW,CAAA,CAAE,KAAK,CAAA,CAAE,GAAA,CAAI,OAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAExG,EAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,gBAAA,CAAiB,MAAM,CAAA,uDAAA,CAAoD,CAAA;AAAA,EAC5F;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,UAAA;AAAA,IACT,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,UAAA,CAAY,IAAI,EAAC;AAAA,IAC3E;AAAA,GACF;AACF;;;ACjaA,SAAS,oBAAoB,MAAA,EAAoC;AAC/D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,EAAA,OAAO,MAAA,CAAO,CAAC,CAAA,EAAG,QAAA;AACpB;AAQA,SAAS,eAAA,CACP,GAAA,EACA,MAAA,EACA,UAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,GAAA,CAAI,WAAA,EAAY,EAAG,UAAA,EAAY,KAAK,CAAA;AACpG,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,KAAA,EAAO,CAAC,QAAQ,oBAAA,EAAsB,MAAA,EAAQ,QAAQ,CAAA,EAAG,EAAE,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,QAAQ,CAAA;AACtH,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,EAAQ,QAAA,EAAS,CAAE,IAAA,EAAK,IAAK,UAAA,CAAW,MAAA,EAAQ,QAAA,EAAS,CAAE,IAAA,EAAK;AAC1F,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,WAAW,CAAA,EAAG,MAAA,GAAS,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,IACpG;AACA,IAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,UAAA,CAAW,MAAA,CAAO,UAAU,CAAA;AACjE,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,MAAM,CAAA,iCAAA,EAAoC,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,WAAW,CAAA,CAAE,CAAA;AAAA,IACnF;AACA,IAAA,OAAOF,IAAAA,CAAK,QAAQ,QAAQ,CAAA;AAAA,EAC9B,CAAA,SAAE;AACA,IAAA,OAAA,EAAQ;AAAA,EACV;AACF;AAiBA,IAAO,qBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,oBAAA;AAAA,EACJ,WAAA,EAAa,2FAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA2E;AAC7G,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,GAAG,CAAA;AAEvC,MAAA,MAAM,QAAA,GAAW,MAAM,WAAW,CAAA;AAClC,MAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AAEvB,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AAC1B,QAAA,MAAM,GAAA,GAAM,qEAAA;AACZ,QAAA,IAAI,MAAM,IAAA,EAAM;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,QAAG,CAAA,MAAO;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,GAAG,CAAA;AAAA,QAAG;AACjF,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AAEA,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAMC,YAAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AAAA,MACnD,SAAS,GAAA,EAAK;AACZ,QAAA,MAAM,GAAA,GAAM,CAAA,0CAAA,EAA6C,QAAQ,CAAA,EAAA,EAAK,GAAA,YAAe,QAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AACtH,QAAA,IAAI,MAAM,IAAA,EAAM;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,QAAG,CAAA,MAAO;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,GAAG,CAAA;AAAA,QAAG;AACjF,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AAEA,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC9B,QAAA,MAAM,GAAA,GAAM,qDAAA;AACZ,QAAA,IAAI,MAAM,IAAA,EAAM;AAAE,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,EAAE,QAAA,EAAU,SAAA,EAAW,EAAC,EAAG,kBAAkB,EAAC,EAAG,QAAQ,EAAC,IAAK,CAAA;AAAA,QAAG,CAAA,MAAO;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,GAAG,CAAA;AAAA,QAAG;AACtJ,QAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,EAAE,QAAA,EAAU,SAAA,EAAW,EAAC,EAAG,kBAAkB,EAAC,EAAG,MAAA,EAAQ,IAAG,EAAE;AAAA,MAC3F;AAEA,MAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAyB;AAClD,MAAA,MAAM,UAAA,GAA4B,cAAc,EAAC;AAUjD,MAAA,MAAM,cAAA,GAAiB,UAAU,yCAAyC,CAAA;AAC1E,MAAA,cAAA,CAAe,KAAA,EAAM;AACrB,MAAA,MAAM,oBAAA,GAAuB,MAAM,uBAAA,CAAwB,QAAA,EAAU,QAAW,UAAU,CAAA;AAC1F,MAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,oBAAA,CAAqB,GAAA,CAAI,CAAA,GAAA,KAAO,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,cAAc,CAAC,CAAC,CAAA;AAC1F,MAAA,KAAA,MAAW,GAAA,IAAO,KAAK,QAAA,EAAU;AAC/B,QAAA,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,WAAW,CAAA;AAAA,MAC1C;AACA,MAAA,cAAA,CAAe,OAAA,CAAQ,CAAA,SAAA,EAAY,UAAA,CAAW,IAAI,CAAA,6BAAA,CAA+B,CAAA;AAQjF,MAAA,MAAM,aAAa,SAAA,CAAU,CAAA,QAAA,EAAW,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,8BAAA,CAAgC,CAAA;AAC5F,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,MAAM,SAAS,WAAA,CAAYD,IAAAA,CAAK,MAAA,EAAO,EAAG,gBAAgB,CAAC,CAAA;AAC3D,MAAA,MAAM,oBAAwC,EAAC;AAC/C,MAAA,IAAI;AACF,QAAA,KAAA,MAAW,GAAA,IAAO,KAAK,QAAA,EAAU;AAC/B,UAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAC3D,UAAA,iBAAA,CAAkB,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,GAAA,CAAI,WAAA,EAAa,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,WAAA,EAAa,CAAA;AAAA,QAClG;AAAA,MACF,SAAS,GAAA,EAAK;AACZ,QAAA,UAAA,CAAW,KAAK,gBAAgB,CAAA;AAChC,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,IAAI,MAAM,IAAA,EAAM;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,QAAG,CAAA,MAAO;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,GAAG,CAAA;AAAA,QAAG;AACjF,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AACA,MAAA,UAAA,CAAW,OAAA,CAAQ,CAAA,OAAA,EAAU,iBAAA,CAAkB,MAAM,CAAA,WAAA,CAAa,CAAA;AAElE,MAAA,MAAM,cAAc,SAAA,CAAU,CAAA,QAAA,EAAW,kBAAkB,MAAM,CAAA,+BAAA,EAAkC,QAAQ,CAAA,GAAA,CAAK,CAAA;AAChH,MAAA,WAAA,CAAY,KAAA,EAAM;AAClB,MAAA,MAAM,MAAA,GAAS,MAAM,2BAAA,CAA4B;AAAA,QAC/C,QAAA,EAAU,iBAAA;AAAA,QACV,cAAA,EAAgB,KAAA;AAAA,QAChB,QAAA;AAAA,QACA,GAAA,EAAK,MAAM,GAAA,IAAO,QAAA;AAAA,QAClB,MAAA,EAAQ,QAAA;AAAA,QACR,KAAA,EAAO,MAAM,KAAA,IAAS;AAAA,OACvB,CAAA;AAED,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC5B,QAAA,WAAA,CAAY,IAAA,CAAK,GAAG,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,iBAAA,CAAkB,MAAM,CAAA,2BAAA,CAA6B,CAAA;AACjG,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,EAAE,QAAA,EAAU,GAAG,MAAA,EAAO,EAAG,CAAA;AAAA,QAC/D,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,IAAI,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,QAC1C;AACA,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAkB,QAAQ,EAAE,QAAA,EAAU,SAAA,EAAW,MAAA,CAAO,WAAW,gBAAA,EAAkB,MAAA,CAAO,kBAAkB,MAAA,EAAQ,MAAA,CAAO,QAAO,EAAE;AAAA,MACnK;AAEA,MAAA,WAAA,CAAY,OAAA,CAAQ,UAAU,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,aAAA,EAAgB,MAAA,CAAO,gBAAA,CAAiB,MAAM,CAAA,gBAAA,CAAkB,CAAA;AAErH,MAAA,MAAM,OAAA,GAA4B;AAAA,QAChC,QAAA;AAAA,QACA,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,kBAAkB,MAAA,CAAO,gBAAA;AAAA,QACzB,QAAQ,MAAA,CAAO;AAAA,OACjB;AAEA,MAAA,OAAA,CAAQ,IAAI,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,EAAE,IAAI,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,OAAA,CAAQ,UAAU,MAAA,GAAS,OAAA,CAAQ,gBAAA,CAAiB,MAAA,EAAQ,CAAC,CAAA;AAExI,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAM,QAAA,GAAW,EAAE,EAAA,EAAI,IAAA,EAAe,QAAQ,OAAA,EAAQ;AACtD,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,QAAQ,CAAA;AACvB,QAAA,OAAO,QAAA;AAAA,MACT;AAEA,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAQ;AAAA,IACrC;AAAA;AAEJ,CAAC","file":"stage-plan.js","sourcesContent":["/**\n * Rewrite a package's own version and workspace:/link: dependency references\n * before `pnpm publish`, so the tarball on disk matches what's about to be\n * published even when that version was never persisted to package.json.\n *\n * - Own version: stable releases already have the target version on disk\n * (written by updatePackageVersions() before this runs), so this is a\n * no-op for them. Canary releases compute nextVersion in-memory only —\n * never committed to package.json/git — so without this, `pnpm publish`\n * would read the OLD on-disk version, and either fail outright or (worse)\n * get misclassified as \"already published\" by the retry/idempotency\n * patterns since that old version genuinely IS already on the registry.\n * - pnpm handles `workspace:*` natively during `pnpm publish` — no rewrite needed.\n * - npm/yarn do NOT — we must replace with `^version` before publish.\n * - `link:` references are never valid on the npm registry — always rewrite.\n *\n * Returns a restore function that reverts package.json to original content.\n * Call it in a finally block to guarantee cleanup.\n */\n\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\n// ── rewriteWorkspaceDeps helpers ──────────────────────────────────────────\n\nfunction rewriteLinkDep(\n deps: Record<string, string>,\n depName: string,\n val: string,\n pkgPath: string,\n versionMap: Map<string, string>,\n): void {\n const pinned = versionMap.get(depName);\n if (pinned) {\n deps[depName] = `^${pinned}`;\n return;\n }\n try {\n const linkPath = val.slice('link:'.length);\n const linked = JSON.parse(readFileSync(join(pkgPath, linkPath, 'package.json'), 'utf-8')) as { version?: string };\n deps[depName] = `^${linked.version ?? '*'}`;\n } catch {\n deps[depName] = '*';\n }\n}\n\nfunction rewriteWorkspaceDep(\n deps: Record<string, string>,\n depName: string,\n val: string,\n versionMap: Map<string, string>,\n): boolean {\n const pinned = versionMap.get(depName);\n if (!pinned) { return false; }\n const range = val === 'workspace:*' ? '^' : val.slice('workspace:'.length);\n deps[depName] = `${range}${pinned}`;\n return true;\n}\n\nfunction rewriteDepsSection(\n deps: Record<string, string>,\n pkgPath: string,\n versionMap: Map<string, string>,\n packageManager: string,\n): boolean {\n let modified = false;\n for (const depName of Object.keys(deps)) {\n const val = deps[depName];\n if (typeof val !== 'string') { continue; }\n if (val.startsWith('link:')) {\n rewriteLinkDep(deps, depName, val, pkgPath, versionMap);\n modified = true;\n } else if (val.startsWith('workspace:') && packageManager !== 'pnpm' && rewriteWorkspaceDep(deps, depName, val, versionMap)) {\n modified = true;\n }\n }\n return modified;\n}\n\nexport function rewriteWorkspaceDeps(\n pkg: { path: string; version: string },\n versionMap: Map<string, string>,\n packageManager: string,\n): () => void {\n const pkgPath = pkg.path;\n const pkgJsonPath = join(pkgPath, 'package.json');\n const original = readFileSync(pkgJsonPath, 'utf-8');\n const pkgJson = JSON.parse(original) as Record<string, unknown> & { version?: string };\n let modified = false;\n\n if (pkgJson.version !== pkg.version) {\n pkgJson.version = pkg.version;\n modified = true;\n }\n\n // Every dependency-like section must be rewritten: a published tarball's\n // devDependencies/optionalDependencies\n // field is inert for the *installer* of this package, but npm's own manifest\n // normalization (npm-package-arg validation inside @npmcli/arborist) parses\n // EVERY dependency-like section of every manifest it reads while building the\n // ideal tree — including devDependencies of a package several levels deep in\n // someone else's dependency graph. A leftover \"workspace:*\" there throws\n // EUNSUPPORTEDPROTOCOL and aborts the whole install, not just a devDependency\n // installation that would otherwise be skipped. Confirmed live on\n // @kb-labs/plugin-execution-factory@2.114.0's devDependencies.@kb-labs/gateway-core.\n for (const section of ['dependencies', 'optionalDependencies', 'peerDependencies', 'devDependencies'] as const) {\n const deps = pkgJson[section] as Record<string, string> | undefined;\n if (!deps) { continue; }\n if (rewriteDepsSection(deps, pkgPath, versionMap, packageManager)) { modified = true; }\n }\n\n if (modified) {\n writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + '\\n');\n }\n\n return () => writeFileSync(pkgJsonPath, original);\n}\n\n// ── topoSort helpers ──────────────────────────────────────────────────────\n\n/**\n * Build a simple topological sort of packages for publish order.\n *\n * Packages are grouped into \"waves\": wave 0 has no intra-release deps,\n * wave 1 depends only on wave 0, etc. Within each wave publish order\n * is arbitrary (safe to parallelise).\n *\n * Cycles (should not exist in a well-formed monorepo) fall into a\n * \"remainder\" group appended at the end.\n */\nexport interface TopoPackage {\n name: string;\n path: string;\n version: string;\n}\n\nfunction buildIntraDeps(packages: TopoPackage[], nameSet: Set<string>): Map<string, Set<string>> {\n const deps = new Map<string, Set<string>>();\n for (const pkg of packages) {\n const intra = new Set<string>();\n try {\n const pkgJson = JSON.parse(readFileSync(join(pkg.path, 'package.json'), 'utf-8')) as {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n };\n for (const section of ['dependencies', 'peerDependencies'] as const) {\n for (const depName of Object.keys(pkgJson[section] ?? {})) {\n if (nameSet.has(depName)) { intra.add(depName); }\n }\n }\n } catch {\n // If we can't read package.json, treat as no deps\n }\n deps.set(pkg.name, intra);\n }\n return deps;\n}\n\nfunction buildDependantsMap(packages: TopoPackage[], deps: Map<string, Set<string>>): Map<string, Set<string>> {\n const dependants = new Map<string, Set<string>>();\n for (const pkg of packages) {\n for (const dep of deps.get(pkg.name) ?? []) {\n if (!dependants.has(dep)) { dependants.set(dep, new Set()); }\n dependants.get(dep)!.add(pkg.name);\n }\n }\n return dependants;\n}\n\nfunction computeWaves(\n packages: TopoPackage[],\n deps: Map<string, Set<string>>,\n dependants: Map<string, Set<string>>,\n): TopoPackage[][] {\n const byName = new Map(packages.map(p => [p.name, p]));\n const remaining = new Map<string, number>(\n packages.map(p => [p.name, (deps.get(p.name) ?? new Set()).size])\n );\n const waves: TopoPackage[][] = [];\n\n while (remaining.size > 0) {\n const wave = [...remaining.entries()]\n .filter(([, count]) => count === 0)\n .map(([name]) => byName.get(name)!);\n\n if (wave.length === 0) {\n waves.push([...remaining.keys()].map(n => byName.get(n)!));\n break;\n }\n\n waves.push(wave);\n for (const pkg of wave) {\n remaining.delete(pkg.name);\n for (const dependant of dependants.get(pkg.name) ?? []) {\n if (remaining.has(dependant)) {\n remaining.set(dependant, (remaining.get(dependant) ?? 1) - 1);\n }\n }\n }\n }\n\n return waves.filter(w => w.length > 0);\n}\n\nexport function topoSort(packages: TopoPackage[], _packageManager: string): TopoPackage[][] {\n const nameSet = new Set(packages.map(p => p.name));\n const deps = buildIntraDeps(packages, nameSet);\n const dependants = buildDependantsMap(packages, deps);\n return computeWaves(packages, deps, dependants);\n}\n","/**\n * Programmatic npm publishing for REST handlers (non-interactive context).\n *\n * Uses `npm publish` CLI via spawn with NODE_AUTH_TOKEN env variable.\n * This is the correct approach for granular access tokens (classic tokens\n * were revoked by npm in December 2025).\n *\n * Token resolution order:\n * 1. options.token (explicit override)\n * 2. NPM_TOKEN env variable\n * 3. NODE_AUTH_TOKEN env variable\n *\n * Reliability guarantees:\n * - Already-published versions are treated as success (idempotent re-runs).\n * - 429 rate-limit: exponential back-off with jitter, up to MAX_RETRIES attempts.\n * - Transient network errors (ECONNRESET, ETIMEDOUT, etc.) are also retried.\n * - Packages are published in topological order (deps before dependants).\n * - Default concurrency is 4 — enough throughput, low enough to avoid rate limits.\n */\n\nimport { spawn } from 'node:child_process';\nimport { readFileSync, writeFileSync, existsSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { useLogger, useEnv } from '@kb-labs/sdk';\nimport { rewriteWorkspaceDeps, topoSort } from './dep-rewrite';\n\nexport interface PackageToPublish {\n name: string;\n version: string;\n path: string;\n /**\n * Pre-built tarball to publish instead of packing fresh from `path`\n * (produced by `release stage` — see stage.ts). When set, `path` is\n * only used as the cwd for npm's `.npmrc` auth lookup — no\n * `rewriteWorkspaceDeps` mutation happens, since the tarball's\n * package.json is already final and must ship byte-for-byte unchanged.\n */\n tarballPath?: string;\n}\n\nexport interface ProgrammaticPublishOptions {\n packages: PackageToPublish[];\n packageManager?: 'pnpm' | 'npm' | 'yarn';\n dryRun?: boolean;\n otp?: string;\n tag?: string;\n access?: 'public' | 'restricted';\n registry?: string;\n token?: string;\n}\n\nexport interface PublishResult {\n name: string;\n version: string;\n success: boolean;\n /** Package was already published at this version — counted as success. */\n alreadyPublished?: boolean;\n error?: string;\n /** npm's own error code (e.g. \"E403\"), extracted from its stderr, when recognizable. */\n errorCode?: string;\n /** Actionable, human-readable explanation for errorCode — see NPM_ERROR_HINTS. */\n errorHint?: string;\n}\n\nexport interface ProgrammaticPublishResult {\n results: PublishResult[];\n published: string[];\n /** Versions that were already on npm (counted as success). */\n alreadyPublished: string[];\n failed: string[];\n skipped: string[];\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Retry configuration\n// ---------------------------------------------------------------------------\n\nconst MAX_RETRIES = 5;\n\n// Exponential base delays (ms). Actual delay = base * jitter(0.8–1.2).\nconst RETRY_BASE_DELAYS_MS = [10_000, 20_000, 40_000, 80_000, 160_000] as const;\n\n/** Retryable error patterns — all transient, not indicative of a bad package. */\nconst RETRYABLE_PATTERNS = [\n 'E429',\n '429 Too Many Requests',\n 'ECONNRESET',\n 'ETIMEDOUT',\n 'ECONNREFUSED',\n 'ENOTFOUND',\n 'EAI_AGAIN',\n 'socket hang up',\n 'network timeout',\n 'read ECONNRESET',\n];\n\n/** \"Already published\" — treat as success so re-runs are idempotent. */\nconst ALREADY_PUBLISHED_PATTERNS = [\n 'You cannot publish over the previously published versions',\n 'cannot publish over the previously published version',\n 'EPUBLISHCONFLICT',\n // Some registries return 403 for conflicts\n];\n\nfunction isRetryable(message: string): boolean {\n return RETRYABLE_PATTERNS.some(p => message.includes(p));\n}\n\nfunction isAlreadyPublished(message: string): boolean {\n return ALREADY_PUBLISHED_PATTERNS.some(p => message.includes(p));\n}\n\n/**\n * Human-readable hints per npm error code — surfaced directly in the\n * delivery report so a permanent failure doesn't require digging through\n * raw CI logs to tell \"our token is broken\" apart from \"npm has flagged\n * this specific package,\" which look identical (both E403) but need\n * completely different fixes.\n */\nconst NPM_ERROR_HINTS: Record<string, string> = {\n E403: 'npm rejected the publish (403). If other packages in the same run succeeded with the same token, this is almost certainly an npm-side restriction on this specific package/account entry (e.g. a security hold), not a token or code problem — check npmjs.com directly or contact npm support. Retrying will not help until that is resolved.',\n E401: 'Authentication failed (401) — NPM_TOKEN/NODE_AUTH_TOKEN is missing, expired, or invalid for this registry.',\n E404: 'Registry returned 404 — check the registry URL and that the package name/scope is correct and accessible with this token.',\n EOTP: 'npm requires a one-time password for this publish — programmatic (token-based) delivery cannot supply one; this package needs an interactive `npm publish` from a human, or a token exempt from OTP.',\n};\n\n/** Extract the npm CLI's own error code (e.g. \"E403\") from its stderr, if present. */\nfunction extractNpmErrorCode(message: string): string | undefined {\n const match = message.match(/\\bnpm error code (E[A-Z0-9]+)\\b/);\n return match?.[1];\n}\n\n/** Classify a permanent publish failure into a code + actionable hint, when recognizable. */\nfunction classifyPublishError(message: string): { code?: string; hint?: string } {\n const code = extractNpmErrorCode(message);\n const hint = code ? NPM_ERROR_HINTS[code] : undefined;\n return { code, hint };\n}\n\n/** Exponential back-off with ±20% jitter. */\nfunction retryDelay(attempt: number): number {\n const base = RETRY_BASE_DELAYS_MS[Math.min(attempt, RETRY_BASE_DELAYS_MS.length - 1)]!;\n const jitter = 0.8 + Math.random() * 0.4; // 0.8 – 1.2\n return Math.round(base * jitter);\n}\n\n// ---------------------------------------------------------------------------\n// Token resolution\n// ---------------------------------------------------------------------------\n\nfunction resolveToken(token?: string): string | undefined {\n return token ?? useEnv('NPM_TOKEN') ?? useEnv('NODE_AUTH_TOKEN');\n}\n\n// ---------------------------------------------------------------------------\n// Low-level spawn\n// ---------------------------------------------------------------------------\n\n/**\n * Spawn `packageManager publish` for a single package.\n * Writes a temporary .npmrc for NODE_AUTH_TOKEN auth, cleans it up on exit.\n */\nfunction spawnPublish(options: {\n packagePath: string;\n /** Publish this exact tarball instead of packing `packagePath` fresh. */\n tarballPath?: string;\n packageManager: string;\n token: string | undefined;\n otp?: string;\n dryRun?: boolean;\n tag?: string;\n access?: string;\n registry?: string;\n}): Promise<void> {\n const { packagePath, tarballPath, packageManager, token, otp, dryRun, tag, access, registry } = options;\n\n return new Promise((resolve, reject) => {\n const args = ['publish'];\n if (tarballPath) { args.push(tarballPath); }\n\n if (packageManager === 'pnpm' && !tarballPath) {\n // pnpm checks git cleanliness; we version-bump before publish which makes\n // the tree dirty — bypass that check. N/A when publishing a pre-built\n // tarball — there's no working-tree state for pnpm to check.\n args.push('--no-git-checks');\n }\n if (dryRun) { args.push('--dry-run'); }\n if (tag) { args.push(`--tag=${tag}`); }\n if (access) { args.push(`--access=${access}`); }\n if (registry) { args.push(`--registry=${registry}`); }\n if (otp) { args.push(`--otp=${otp}`); }\n\n const env: NodeJS.ProcessEnv = { ...process.env };\n if (token) { env['NODE_AUTH_TOKEN'] = token; }\n\n // Write a per-package .npmrc so npm picks up NODE_AUTH_TOKEN.\n // The auth line's host must match the target registry — hardcoding\n // registry.npmjs.org here would silently break token auth against\n // Verdaccio or any other non-npmjs registry.\n const npmrcPath = join(packagePath, '.npmrc');\n const npmrcExisted = existsSync(npmrcPath);\n const npmrcBackup = npmrcExisted ? readFileSync(npmrcPath, 'utf-8') : null;\n const registryHost = registry ? new URL(registry).host : 'registry.npmjs.org';\n const authLine = `//${registryHost}/:_authToken=\\${NODE_AUTH_TOKEN}\\n`;\n\n if (token) {\n const existing = npmrcExisted ? readFileSync(npmrcPath, 'utf-8') : '';\n if (!existing.includes('_authToken')) {\n writeFileSync(npmrcPath, existing + authLine);\n }\n }\n\n const restoreNpmrc = () => {\n if (!token) { return; }\n try {\n if (npmrcBackup !== null) {\n writeFileSync(npmrcPath, npmrcBackup);\n } else if (existsSync(npmrcPath)) {\n unlinkSync(npmrcPath);\n }\n } catch { /* best-effort */ }\n };\n\n const child = spawn(packageManager, args, {\n cwd: packagePath,\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n env,\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (d: Buffer) => { stdout += d.toString(); });\n child.stderr?.on('data', (d: Buffer) => { stderr += d.toString(); });\n\n child.on('close', (code: number | null) => {\n restoreNpmrc();\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(stderr || stdout || `${packageManager} publish exited with code ${code}`));\n }\n });\n\n child.on('error', (err: Error) => {\n restoreNpmrc();\n reject(err);\n });\n });\n}\n\n// ---------------------------------------------------------------------------\n// Per-package publish with retry\n// ---------------------------------------------------------------------------\n\nasync function publishOne(\n pkg: PackageToPublish,\n opts: {\n packageManager: string;\n token: string | undefined;\n versionMap: Map<string, string>;\n dryRun?: boolean;\n otp?: string;\n tag?: string;\n access?: string;\n registry?: string;\n },\n logger: ReturnType<typeof useLogger>,\n): Promise<PublishResult> {\n // A pre-built tarball (see PackageToPublish.tarballPath) is already final\n // — publishing it must ship those exact bytes, so skip the package.json\n // rewrite entirely rather than mutating a directory whose content the\n // tarball no longer reflects.\n const restore = pkg.tarballPath ? (() => {}) : rewriteWorkspaceDeps(pkg, opts.versionMap, opts.packageManager);\n\n try {\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {\n try {\n await spawnPublish({\n packagePath: pkg.path,\n tarballPath: pkg.tarballPath,\n packageManager: opts.packageManager,\n token: opts.token,\n otp: opts.otp,\n dryRun: opts.dryRun,\n tag: opts.tag,\n access: opts.access,\n registry: opts.registry,\n });\n\n logger.info(`Published ${pkg.name}@${pkg.version}`);\n return { name: pkg.name, version: pkg.version, success: true };\n\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n\n // Idempotency: already published at this version → success.\n if (isAlreadyPublished(message)) {\n logger.info(`${pkg.name}@${pkg.version} already published — skipping`);\n return { name: pkg.name, version: pkg.version, success: true, alreadyPublished: true };\n }\n\n // Retryable transient error (rate-limit, network blip).\n if (isRetryable(message) && attempt < MAX_RETRIES) {\n const delay = retryDelay(attempt);\n logger.warn(\n `Transient error for ${pkg.name}@${pkg.version} (attempt ${attempt + 1}/${MAX_RETRIES}), ` +\n `retrying in ${(delay / 1000).toFixed(1)}s: ${message.split('\\n')[0]}`,\n );\n await new Promise<void>(r => { setTimeout(r, delay); });\n continue;\n }\n\n // Permanent failure.\n const { code, hint } = classifyPublishError(message);\n logger.error(`Failed to publish ${pkg.name}@${pkg.version}`, undefined, { error: message, errorCode: code });\n return { name: pkg.name, version: pkg.version, success: false, error: message, errorCode: code, errorHint: hint };\n }\n }\n\n // Exhausted retries.\n return {\n name: pkg.name,\n version: pkg.version,\n success: false,\n error: `Publish failed after ${MAX_RETRIES} retries (transient errors)`,\n };\n } finally {\n restore();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\nfunction skipRemainingWaves(\n waves: ReturnType<typeof topoSort>,\n waveIdx: number,\n waveFailed: PublishResult[],\n logger: ReturnType<typeof useLogger>,\n allResults: PublishResult[],\n): void {\n const remaining = waves.slice(waveIdx + 1).reduce((acc, w) => acc + w.length, 0);\n if (remaining === 0) { return; }\n logger.warn(\n `Wave ${waveIdx + 1} had ${waveFailed.length} failure(s) — ` +\n `skipping ${remaining} package(s) in later waves to avoid broken dependency chain`,\n );\n for (const laterWave of waves.slice(waveIdx + 1)) {\n for (const pkg of laterWave) {\n allResults.push({ name: pkg.name, version: pkg.version, success: false, error: 'Skipped: dependency wave failed' });\n }\n }\n}\n\n/**\n * Publish packages programmatically (non-interactive, for REST handlers / CI).\n *\n * Packages are published in topological order (deps before dependants) to\n * avoid \"package not found\" errors when a dependent is installed right after\n * release. Within each topological wave, publishes run in parallel up to\n * CONCURRENCY.\n */\nexport async function publishPackagesProgrammatic(\n options: ProgrammaticPublishOptions,\n): Promise<ProgrammaticPublishResult> {\n const {\n packages,\n packageManager = 'pnpm',\n dryRun,\n otp,\n tag,\n access,\n registry,\n } = options;\n\n const logger = useLogger();\n const token = resolveToken(options.token);\n\n if (!token && !dryRun) {\n const error = 'No npm token found. Set NPM_TOKEN (or NODE_AUTH_TOKEN) in environment.';\n logger.error(error);\n return {\n results: [],\n published: [],\n alreadyPublished: [],\n failed: packages.map(p => `${p.name}@${p.version}`),\n skipped: [],\n errors: [error],\n };\n }\n\n // Version map for dep rewriting (workspace:/link: → ^version).\n const versionMap = new Map(packages.map(p => [p.name, p.version]));\n\n // Concurrency: default 4 — enough throughput, below npm's sustained rate limit.\n const CONCURRENCY = Number(useEnv('KB_PUBLISH_CONCURRENCY') ?? 4);\n\n // Sort packages into topological waves so deps are always published first.\n const waves = topoSort(packages, packageManager);\n\n logger.info(\n `Publishing ${packages.length} package(s) in ${waves.length} topological wave(s) ` +\n `(concurrency=${CONCURRENCY}, dryRun=${dryRun ?? false})`,\n );\n\n const allResults: PublishResult[] = [];\n\n for (let waveIdx = 0; waveIdx < waves.length; waveIdx++) {\n const wave = waves[waveIdx]!;\n logger.info(`Wave ${waveIdx + 1}/${waves.length}: publishing ${wave.length} package(s)`);\n\n // Publish wave in parallel batches.\n for (let i = 0; i < wave.length; i += CONCURRENCY) {\n const batch = wave.slice(i, i + CONCURRENCY);\n const batchResults = await Promise.all(\n batch.map(pkg =>\n publishOne(pkg, { packageManager, token, versionMap, dryRun, otp, tag, access, registry }, logger),\n ),\n );\n allResults.push(...batchResults);\n }\n\n // If any package in this wave genuinely failed (not alreadyPublished), stop\n // publishing the next wave — it may depend on the failed packages.\n const waveFailed = allResults.slice(-wave.length).filter(r => !r.success);\n if (waveFailed.length > 0) {\n skipRemainingWaves(waves, waveIdx, waveFailed, logger, allResults);\n break;\n }\n }\n\n const published = allResults.filter(r => r.success && !r.alreadyPublished).map(r => `${r.name}@${r.version}`);\n const alreadyPublished = allResults.filter(r => r.alreadyPublished).map(r => `${r.name}@${r.version}`);\n const failed = allResults.filter(r => !r.success).map(r => `${r.name}@${r.version}`);\n const errors = allResults.filter(r => !r.success && r.error).map(r => `${r.name}: ${r.error}`);\n\n if (alreadyPublished.length > 0) {\n logger.info(`${alreadyPublished.length} package(s) already published — counted as success`);\n }\n\n return {\n results: allResults,\n published,\n alreadyPublished,\n failed,\n skipped: dryRun ? packages.map(p => `${p.name}@${p.version} (dry-run)`) : [],\n errors,\n };\n}\n","/**\n * Stage a release plan's PLANNED package versions to a local registry\n * (Verdaccio), so the `pack-install` release gate can verify internal\n * cross-package dependencies against the version this release is about to\n * ship instead of whatever is already live on npm.\n *\n * Not to be confused with `release stage` (stage.ts): that command packs\n * already-committed, already-bumped versions for CI delivery AFTER human\n * approval — this one runs BEFORE Bump versions, off the in-memory plan\n * `Preview` already computed, and publishes to a throwaway local registry\n * instead of producing artifacts for a real release.\n *\n * Internal dependencies are rewritten to `^nextVersion` regardless of the\n * workspace's configured package manager: `rewriteWorkspaceDeps` only\n * rewrites `workspace:*` for non-pnpm managers (pnpm materializes\n * `workspace:*` itself, but only to the CURRENT on-disk version — the exact\n * thing this command exists to work around), so packages are always\n * packed/published here with the 'npm' package manager.\n */\n\nimport { spawnSync } from 'node:child_process';\nimport { mkdtempSync, readFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { defineCommand, type CLIInput, type PluginContextV3, useLoader, useConfig, type CommandResult } from '@kb-labs/sdk';\nimport {\n discoverCurrentPackages,\n type ReleaseConfig,\n type ReleasePlan,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { rewriteWorkspaceDeps } from '../../shared/dep-rewrite';\nimport { publishPackagesProgrammatic, type PackageToPublish } from '../../shared/publish-programmatic';\n\n/** `npm pack --json` prints a JSON array; we only ever pack one package at a time. */\nfunction filenameFromNpmPack(stdout: string): string | undefined {\n const parsed = JSON.parse(stdout) as Array<{ filename: string }>;\n return parsed[0]?.filename;\n}\n\n/**\n * Pack one plan package at its PLANNED nextVersion, with internal sibling\n * deps rewritten to the full-workspace versionMap (plan packages → their\n * nextVersion, everything else → current). Always uses `npm pack`, never\n * pnpm — see file header for why.\n */\nfunction packPlanPackage(\n pkg: { name: string; path: string; nextVersion: string },\n outDir: string,\n versionMap: Map<string, string>,\n): string {\n const restore = rewriteWorkspaceDeps({ path: pkg.path, version: pkg.nextVersion }, versionMap, 'npm');\n try {\n const packResult = spawnSync('npm', ['pack', '--pack-destination', outDir, '--json'], { cwd: pkg.path, stdio: 'pipe' });\n if (packResult.status !== 0) {\n const stderr = packResult.stderr?.toString().trim() || packResult.stdout?.toString().trim();\n throw new Error(`npm pack failed for ${pkg.name}@${pkg.nextVersion}${stderr ? `: ${stderr}` : ''}`);\n }\n const filename = filenameFromNpmPack(packResult.stdout.toString());\n if (!filename) {\n throw new Error(`npm pack produced no tarball for ${pkg.name}@${pkg.nextVersion}`);\n }\n return join(outDir, filename);\n } finally {\n restore();\n }\n}\n\ninterface StagePlanFlags {\n 'plan-path'?: string;\n registry?: string;\n token?: string;\n tag?: string;\n json?: boolean;\n}\n\ninterface StagePlanPayload {\n registry: string;\n published: string[];\n alreadyPublished: string[];\n failed: string[];\n}\n\nexport default defineCommand({\n id: 'release:stage-plan',\n description: 'Publish a release plan\\'s planned package versions to a local staging registry (Verdaccio)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<StagePlanFlags>): Promise<CommandResult<StagePlanPayload>> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const planPath = flags['plan-path'];\n const registry = flags.registry;\n\n if (!planPath || !registry) {\n const msg = 'release:stage-plan requires --plan-path <path> and --registry <url>';\n if (flags.json) { ctx.ui?.json?.({ error: msg }); } else { ctx.ui?.error?.(msg); }\n return { ok: false, error: 'Command failed' };\n }\n\n let plan: ReleasePlan;\n try {\n plan = JSON.parse(readFileSync(planPath, 'utf-8')) as ReleasePlan;\n } catch (err) {\n const msg = `release:stage-plan could not read plan at ${planPath}: ${err instanceof Error ? err.message : String(err)}`;\n if (flags.json) { ctx.ui?.json?.({ error: msg }); } else { ctx.ui?.error?.(msg); }\n return { ok: false, error: 'Command failed' };\n }\n\n if (plan.packages.length === 0) {\n const msg = 'No packages in release plan — nothing to stage';\n if (flags.json) { ctx.ui?.json?.({ ok: true, result: { registry, published: [], alreadyPublished: [], failed: [] } }); } else { ctx.ui?.write?.(msg); }\n return { ok: true, result: { registry, published: [], alreadyPublished: [], failed: [] } };\n }\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const baseConfig: ReleaseConfig = fileConfig ?? {};\n\n // versionMap covers the WHOLE workspace (unfiltered baseConfig, not a\n // flow-merged one — a FlowConfig's `packages` filter COMPLETELY\n // REPLACES the global one, so merging here would silently drop\n // cross-flow siblings) so a plan package's dependency on a package\n // OUTSIDE this flow (not being released right now) still resolves —\n // to that sibling's current, already-published version, via the\n // staging registry's real-npm uplink. Plan packages then override\n // their own entry with the PLANNED nextVersion.\n const discoverLoader = useLoader('Resolving workspace package versions...');\n discoverLoader.start();\n const allWorkspacePackages = await discoverCurrentPackages(repoRoot, undefined, baseConfig);\n const versionMap = new Map(allWorkspacePackages.map(pkg => [pkg.name, pkg.currentVersion]));\n for (const pkg of plan.packages) {\n versionMap.set(pkg.name, pkg.nextVersion);\n }\n discoverLoader.succeed(`Resolved ${versionMap.size} workspace package version(s)`);\n\n // Pack each plan package ourselves (npm, deps pre-rewritten to\n // versionMap) rather than letting publishPackagesProgrammatic pack —\n // its own internal versionMap only covers the packages it's handed\n // (see publish-programmatic.ts), which would leave a plan package's\n // dependency on a package OUTSIDE this flow as a literal\n // unresolvable `workspace:*` in the published tarball.\n const packLoader = useLoader(`Packing ${plan.packages.length} planned package version(s)...`);\n packLoader.start();\n const outDir = mkdtempSync(join(tmpdir(), 'kb-stage-plan-'));\n const packagesToPublish: PackageToPublish[] = [];\n try {\n for (const pkg of plan.packages) {\n const tarballPath = packPlanPackage(pkg, outDir, versionMap);\n packagesToPublish.push({ name: pkg.name, version: pkg.nextVersion, path: pkg.path, tarballPath });\n }\n } catch (err) {\n packLoader.fail('Packing failed');\n const msg = err instanceof Error ? err.message : String(err);\n if (flags.json) { ctx.ui?.json?.({ error: msg }); } else { ctx.ui?.error?.(msg); }\n return { ok: false, error: 'Command failed' };\n }\n packLoader.succeed(`Packed ${packagesToPublish.length} package(s)`);\n\n const stageLoader = useLoader(`Staging ${packagesToPublish.length} planned package version(s) to ${registry}...`);\n stageLoader.start();\n const result = await publishPackagesProgrammatic({\n packages: packagesToPublish,\n packageManager: 'npm',\n registry,\n tag: flags.tag ?? 'latest',\n access: 'public',\n token: flags.token ?? 'verdaccio-local',\n });\n\n if (result.failed.length > 0) {\n stageLoader.fail(`${result.failed.length}/${packagesToPublish.length} package(s) failed to stage`);\n if (flags.json) {\n ctx.ui?.json?.({ ok: false, result: { registry, ...result } });\n } else {\n ctx.ui?.error?.(result.errors.join('\\n'));\n }\n return { ok: false, error: 'Command failed', result: { registry, published: result.published, alreadyPublished: result.alreadyPublished, failed: result.failed } };\n }\n\n stageLoader.succeed(`Staged ${result.published.length} package(s) (${result.alreadyPublished.length} already staged)`);\n\n const payload: StagePlanPayload = {\n registry,\n published: result.published,\n alreadyPublished: result.alreadyPublished,\n failed: result.failed,\n };\n\n console.log('::kb-output::' + JSON.stringify({ ok: true, registry, staged: payload.published.length + payload.alreadyPublished.length }));\n\n if (flags.json) {\n const response = { ok: true as const, result: payload };\n ctx.ui?.json?.(response);\n return response;\n }\n\n return { ok: true, result: payload };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/dep-rewrite.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/resolve-flow.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/cli/commands/stage.ts"],"names":["readFileSync","join","writeFileSync"],"mappings":"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","file":"stage.js","sourcesContent":["/**\n * Rewrite a package's own version and workspace:/link: dependency references\n * before `pnpm publish`, so the tarball on disk matches what's about to be\n * published even when that version was never persisted to package.json.\n *\n * - Own version: stable releases already have the target version on disk\n * (written by updatePackageVersions() before this runs), so this is a\n * no-op for them. Canary releases compute nextVersion in-memory only —\n * never committed to package.json/git — so without this, `pnpm publish`\n * would read the OLD on-disk version, and either fail outright or (worse)\n * get misclassified as \"already published\" by the retry/idempotency\n * patterns since that old version genuinely IS already on the registry.\n * - pnpm handles `workspace:*` natively during `pnpm publish` — no rewrite needed.\n * - npm/yarn do NOT — we must replace with `^version` before publish.\n * - `link:` references are never valid on the npm registry — always rewrite.\n *\n * Returns a restore function that reverts package.json to original content.\n * Call it in a finally block to guarantee cleanup.\n */\n\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\n// ── rewriteWorkspaceDeps helpers ──────────────────────────────────────────\n\nfunction rewriteLinkDep(\n deps: Record<string, string>,\n depName: string,\n val: string,\n pkgPath: string,\n versionMap: Map<string, string>,\n): void {\n const pinned = versionMap.get(depName);\n if (pinned) {\n deps[depName] = `^${pinned}`;\n return;\n }\n try {\n const linkPath = val.slice('link:'.length);\n const linked = JSON.parse(readFileSync(join(pkgPath, linkPath, 'package.json'), 'utf-8')) as { version?: string };\n deps[depName] = `^${linked.version ?? '*'}`;\n } catch {\n deps[depName] = '*';\n }\n}\n\nfunction rewriteWorkspaceDep(\n deps: Record<string, string>,\n depName: string,\n val: string,\n versionMap: Map<string, string>,\n): boolean {\n const pinned = versionMap.get(depName);\n if (!pinned) { return false; }\n const range = val === 'workspace:*' ? '^' : val.slice('workspace:'.length);\n deps[depName] = `${range}${pinned}`;\n return true;\n}\n\nfunction rewriteDepsSection(\n deps: Record<string, string>,\n pkgPath: string,\n versionMap: Map<string, string>,\n packageManager: string,\n): boolean {\n let modified = false;\n for (const depName of Object.keys(deps)) {\n const val = deps[depName];\n if (typeof val !== 'string') { continue; }\n if (val.startsWith('link:')) {\n rewriteLinkDep(deps, depName, val, pkgPath, versionMap);\n modified = true;\n } else if (val.startsWith('workspace:') && packageManager !== 'pnpm' && rewriteWorkspaceDep(deps, depName, val, versionMap)) {\n modified = true;\n }\n }\n return modified;\n}\n\nexport function rewriteWorkspaceDeps(\n pkg: { path: string; version: string },\n versionMap: Map<string, string>,\n packageManager: string,\n): () => void {\n const pkgPath = pkg.path;\n const pkgJsonPath = join(pkgPath, 'package.json');\n const original = readFileSync(pkgJsonPath, 'utf-8');\n const pkgJson = JSON.parse(original) as Record<string, unknown> & { version?: string };\n let modified = false;\n\n if (pkgJson.version !== pkg.version) {\n pkgJson.version = pkg.version;\n modified = true;\n }\n\n // Every dependency-like section must be rewritten: a published tarball's\n // devDependencies/optionalDependencies\n // field is inert for the *installer* of this package, but npm's own manifest\n // normalization (npm-package-arg validation inside @npmcli/arborist) parses\n // EVERY dependency-like section of every manifest it reads while building the\n // ideal tree — including devDependencies of a package several levels deep in\n // someone else's dependency graph. A leftover \"workspace:*\" there throws\n // EUNSUPPORTEDPROTOCOL and aborts the whole install, not just a devDependency\n // installation that would otherwise be skipped. Confirmed live on\n // @kb-labs/plugin-execution-factory@2.114.0's devDependencies.@kb-labs/gateway-core.\n for (const section of ['dependencies', 'optionalDependencies', 'peerDependencies', 'devDependencies'] as const) {\n const deps = pkgJson[section] as Record<string, string> | undefined;\n if (!deps) { continue; }\n if (rewriteDepsSection(deps, pkgPath, versionMap, packageManager)) { modified = true; }\n }\n\n if (modified) {\n writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + '\\n');\n }\n\n return () => writeFileSync(pkgJsonPath, original);\n}\n\n// ── topoSort helpers ──────────────────────────────────────────────────────\n\n/**\n * Build a simple topological sort of packages for publish order.\n *\n * Packages are grouped into \"waves\": wave 0 has no intra-release deps,\n * wave 1 depends only on wave 0, etc. Within each wave publish order\n * is arbitrary (safe to parallelise).\n *\n * Cycles (should not exist in a well-formed monorepo) fall into a\n * \"remainder\" group appended at the end.\n */\nexport interface TopoPackage {\n name: string;\n path: string;\n version: string;\n}\n\nfunction buildIntraDeps(packages: TopoPackage[], nameSet: Set<string>): Map<string, Set<string>> {\n const deps = new Map<string, Set<string>>();\n for (const pkg of packages) {\n const intra = new Set<string>();\n try {\n const pkgJson = JSON.parse(readFileSync(join(pkg.path, 'package.json'), 'utf-8')) as {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n };\n for (const section of ['dependencies', 'peerDependencies'] as const) {\n for (const depName of Object.keys(pkgJson[section] ?? {})) {\n if (nameSet.has(depName)) { intra.add(depName); }\n }\n }\n } catch {\n // If we can't read package.json, treat as no deps\n }\n deps.set(pkg.name, intra);\n }\n return deps;\n}\n\nfunction buildDependantsMap(packages: TopoPackage[], deps: Map<string, Set<string>>): Map<string, Set<string>> {\n const dependants = new Map<string, Set<string>>();\n for (const pkg of packages) {\n for (const dep of deps.get(pkg.name) ?? []) {\n if (!dependants.has(dep)) { dependants.set(dep, new Set()); }\n dependants.get(dep)!.add(pkg.name);\n }\n }\n return dependants;\n}\n\nfunction computeWaves(\n packages: TopoPackage[],\n deps: Map<string, Set<string>>,\n dependants: Map<string, Set<string>>,\n): TopoPackage[][] {\n const byName = new Map(packages.map(p => [p.name, p]));\n const remaining = new Map<string, number>(\n packages.map(p => [p.name, (deps.get(p.name) ?? new Set()).size])\n );\n const waves: TopoPackage[][] = [];\n\n while (remaining.size > 0) {\n const wave = [...remaining.entries()]\n .filter(([, count]) => count === 0)\n .map(([name]) => byName.get(name)!);\n\n if (wave.length === 0) {\n waves.push([...remaining.keys()].map(n => byName.get(n)!));\n break;\n }\n\n waves.push(wave);\n for (const pkg of wave) {\n remaining.delete(pkg.name);\n for (const dependant of dependants.get(pkg.name) ?? []) {\n if (remaining.has(dependant)) {\n remaining.set(dependant, (remaining.get(dependant) ?? 1) - 1);\n }\n }\n }\n }\n\n return waves.filter(w => w.length > 0);\n}\n\nexport function topoSort(packages: TopoPackage[], _packageManager: string): TopoPackage[][] {\n const nameSet = new Set(packages.map(p => p.name));\n const deps = buildIntraDeps(packages, nameSet);\n const dependants = buildDependantsMap(packages, deps);\n return computeWaves(packages, deps, dependants);\n}\n","/**\n * Shared `--release-tag` / `--flow` resolution for commands that operate\n * on an already-decided release (`stage`, `deliver`) — mirrors the tag\n * grammar in `@kb-labs/release-manager-core`'s `resolveFlowFromTag` so CI\n * can pass just the tag and the plugin decides the flow, per the\n * \"plugin prepares, CI delivers\" release plan.\n */\n\nimport { resolveFlowFromTag, type ReleaseConfig } from '@kb-labs/release-manager-core';\n\nexport interface FlowResolvableFlags {\n flow?: string;\n 'release-tag'?: string;\n}\n\nexport function resolveFlowName(config: ReleaseConfig, flags: FlowResolvableFlags): string | { error: string } {\n if (flags.flow) { return flags.flow; }\n if (flags['release-tag']) {\n const resolved = resolveFlowFromTag(config, flags['release-tag']);\n if (!resolved) {\n return { error: `Could not resolve a release.flows entry from tag \"${flags['release-tag']}\"` };\n }\n return resolved.flowName;\n }\n return { error: 'requires --flow or --release-tag' };\n}\n","/**\n * Standalone stage command — packs the flow's currently-committed package\n * versions into real npm tarballs, once, so every downstream `release\n * deliver` job ships the exact same bytes instead of re-packing\n * independently from source. See plugins/release/docs/adr/0001-* and the\n * \"plugin prepares, CI delivers\" release plan.\n *\n * Deliberately does NOT call planRelease() — same reasoning as promote.ts:\n * versions are already fixed by the prepare step that already ran (version\n * bump, changelog, git commit/tag/push). This command's only job is\n * \"pack exactly what's already on disk, unchanged.\"\n *\n * Not to be confused with `release:pack` (`pack.ts`) — that command\n * verifies *proposed* packages via `npm pack` + static checks before a\n * release is decided; this one produces the *actual* tarball artifact for\n * an already-decided release.\n */\n\nimport { createHash } from 'node:crypto';\nimport { spawnSync } from 'node:child_process';\nimport { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { basename, join } from 'node:path';\nimport { defineCommand, type CLIInput, type PluginContextV3, useLoader, useConfig, useEnv, type CommandResult } from '@kb-labs/sdk';\nimport {\n discoverCurrentPackages,\n mergeConfigWithFlow,\n verifyExtractedTarball,\n type ReleaseConfig,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { rewriteWorkspaceDeps } from '../../shared/dep-rewrite';\nimport { resolveFlowName, type FlowResolvableFlags } from '../../shared/resolve-flow';\n\ninterface StageFlags extends FlowResolvableFlags {\n 'out-dir'?: string;\n json?: boolean;\n}\n\nexport interface StagedArtifact {\n name: string;\n version: string;\n tarball: string;\n sha256: string;\n}\n\ninterface StagePayload {\n outDir?: string;\n artifacts?: StagedArtifact[];\n}\n\n/**\n * Pack one package into `outDir`, returning the produced tarball's filename.\n *\n * pnpm is the platform default and owns workspace protocol materialization.\n * npm/yarn are explicit opt-in paths and get the rewrite needed for their\n * standalone tarballs.\n */\n/** pnpm prints the produced tarball's absolute path as its last stdout line — no --json output exists. */\nfunction filenameFromPnpmPack(stdout: string): string | undefined {\n const lines = stdout.trim().split('\\n').filter(Boolean);\n const lastLine = lines[lines.length - 1];\n return lastLine ? basename(lastLine.trim()) : undefined;\n}\n\n/** `npm pack --json` prints a JSON array; we only ever pack one package at a time. */\nfunction filenameFromNpmPack(stdout: string): string | undefined {\n const parsed = JSON.parse(stdout) as Array<{ filename: string }>;\n return parsed[0]?.filename;\n}\n\nfunction packOne(\n pkg: { path: string; currentVersion: string },\n outDir: string,\n packageManager: 'pnpm' | 'npm' | 'yarn',\n versionMap: Map<string, string>,\n): { filename: string; restore: () => void } {\n const isPnpm = packageManager === 'pnpm';\n const restore = rewriteWorkspaceDeps(\n { path: pkg.path, version: pkg.currentVersion },\n versionMap,\n packageManager,\n );\n\n const packArgs = isPnpm\n ? ['pack', '--pack-destination', outDir]\n : ['pack', '--pack-destination', outDir, '--json'];\n const packResult = spawnSync(isPnpm ? 'pnpm' : 'npm', packArgs, { cwd: pkg.path, stdio: 'pipe' });\n\n if (packResult.status !== 0) {\n const stderr = packResult.stderr?.toString().trim() || packResult.stdout?.toString().trim();\n throw new Error(`${packageManager} pack failed for ${pkg.path}${stderr ? `: ${stderr}` : ''}`);\n }\n\n const filename = isPnpm\n ? filenameFromPnpmPack(packResult.stdout.toString())\n : filenameFromNpmPack(packResult.stdout.toString());\n\n if (!filename) {\n throw new Error(`${packageManager} pack produced no tarball for ${pkg.path}`);\n }\n return { filename, restore };\n}\n\n/**\n * Pack one package. Static artifact verification happens after all packages\n * have been packed, so Stage never performs a registry-style install per\n * package.\n */\nasync function packStagePackage(\n pkg: { name: string; path: string; currentVersion: string },\n outDir: string,\n packageManager: 'pnpm' | 'npm' | 'yarn',\n versionMap: Map<string, string>,\n): Promise<StagedArtifact> {\n const { filename, restore } = packOne(pkg, outDir, packageManager, versionMap);\n try {\n const sha256 = createHash('sha256').update(readFileSync(join(outDir, filename))).digest('hex');\n return { name: pkg.name, version: pkg.currentVersion, tarball: filename, sha256 };\n } finally { restore(); }\n}\n\nfunction verifyStagePackage(\n pkg: { name: string; currentVersion: string },\n outDir: string,\n artifact: StagedArtifact,\n): void {\n const tarballPath = join(outDir, artifact.tarball);\n const verifyDir = mkdtempSync(join(tmpdir(), 'kb-stage-verify-'));\n try {\n const extractResult = spawnSync('tar', ['xzf', tarballPath, '-C', verifyDir], { stdio: 'pipe' });\n if (extractResult.status !== 0) {\n throw new Error(`could not extract staged tarball for ${pkg.name}@${pkg.currentVersion}`);\n }\n const issues = verifyExtractedTarball(join(verifyDir, 'package'));\n if (issues.length > 0) {\n throw new Error(`staged artifact verification failed for ${pkg.name}@${pkg.currentVersion}: ${issues.join('; ')}`);\n }\n } finally { rmSync(verifyDir, { recursive: true, force: true }); }\n\n}\n\nexport default defineCommand({\n id: 'release:stage',\n description: 'Pack the currently-committed package versions for a flow into real npm tarballs, once, for `release deliver` to ship',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<StageFlags>): Promise<CommandResult<StagePayload>> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const baseConfig: ReleaseConfig = fileConfig ?? {};\n\n const flowResult = resolveFlowName(baseConfig, flags);\n if (typeof flowResult !== 'string') {\n const msg = `release:stage ${flowResult.error}`;\n if (flags.json) { ctx.ui?.json?.({ error: msg }); } else { ctx.ui?.error?.(msg); }\n return { ok: false, error: 'Command failed' };\n }\n const flowName = flowResult;\n\n const config: ReleaseConfig = mergeConfigWithFlow(baseConfig, flowName);\n const outDir = join(repoRoot, flags['out-dir'] ?? '.kb/release/artifacts');\n mkdirSync(outDir, { recursive: true });\n\n const discoverLoader = useLoader(`Discovering currently-committed packages for flow \"${flowName}\"...`);\n discoverLoader.start();\n const discovered = await discoverCurrentPackages(repoRoot, undefined, config);\n discoverLoader.succeed(`Found ${discovered.length} package(s) to stage`);\n\n if (discovered.length === 0) {\n const msg = `No packages found for flow \"${flowName}\"`;\n if (flags.json) { ctx.ui?.json?.({ outDir, artifacts: [] }); } else { ctx.ui?.write?.(msg); }\n return { ok: false, error: 'Command failed' };\n }\n\n // versionMap must cover the WHOLE workspace, not just this flow's packages:\n // a flow package can depend on a package owned by a different flow (e.g. sdk\n // depends on @kb-labs/core-retry, which is platform-flow-scoped). Building the\n // map from `discovered` (flow-scoped) alone leaves such cross-flow deps out of\n // versionMap, so rewriteWorkspaceDeps silently skips them (no pinned version to\n // substitute). Only used by the npm/yarn packing path below — pnpm resolves\n // workspace:* on its own and never consults this map.\n const allWorkspacePackages = await discoverCurrentPackages(repoRoot, undefined, baseConfig);\n const versionMap = new Map(allWorkspacePackages.map(pkg => [pkg.name, pkg.currentVersion]));\n const packageManager = config.workspace?.type ?? config.publish?.packageManager ?? 'pnpm';\n\n const CONCURRENCY = Number(useEnv('KB_STAGE_CONCURRENCY') ?? 6);\n\n const packLoader = useLoader('Packing tarballs...');\n packLoader.start();\n const artifacts: StagedArtifact[] = [];\n for (let i = 0; i < discovered.length; i += CONCURRENCY) {\n const batch = discovered.slice(i, i + CONCURRENCY);\n const batchArtifacts = await Promise.all(\n batch.map(pkg => packStagePackage(pkg, outDir, packageManager, versionMap)),\n );\n artifacts.push(...batchArtifacts);\n }\n packLoader.succeed(`Packed ${artifacts.length} tarball(s) to ${outDir}`);\n\n const verifyLoader = useLoader('Verifying staged tarballs...');\n verifyLoader.start();\n for (let i = 0; i < discovered.length; i += CONCURRENCY) {\n const batch = discovered.slice(i, i + CONCURRENCY);\n batch.forEach((pkg, index) => verifyStagePackage(pkg, outDir, artifacts[i + index]!));\n }\n verifyLoader.succeed(`Verified ${artifacts.length} staged tarball(s)`);\n\n writeFileSync(join(outDir, 'manifest.json'), JSON.stringify(artifacts, null, 2) + '\\n', 'utf-8');\n\n const result: StagePayload = { outDir, artifacts };\n if (flags.json) {\n const response = { ok: true as const, result };\n ctx.ui?.json?.(response);\n return response;\n }\n\n ctx.ui?.sideBox?.({\n title: 'Stage',\n sections: [{\n header: `Staged to ${outDir}`,\n items: artifacts.map(a => `${ctx.ui.symbols.success} ${a.name}@${a.version} → ${a.tarball}`),\n }],\n status: 'success',\n });\n\n return { ok: true, result };\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/shared/dep-rewrite.ts","../../../src/shared/resolve-flow.ts","../../../src/cli/commands/stage.ts"],"names":["readFileSync","join","writeFileSync"],"mappings":"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","file":"stage.js","sourcesContent":["/**\n * Rewrite a package's own version and workspace:/link: dependency references\n * before `pnpm publish`, so the tarball on disk matches what's about to be\n * published even when that version was never persisted to package.json.\n *\n * - Own version: stable releases already have the target version on disk\n * (written by updatePackageVersions() before this runs), so this is a\n * no-op for them. Canary releases compute nextVersion in-memory only —\n * never committed to package.json/git — so without this, `pnpm publish`\n * would read the OLD on-disk version, and either fail outright or (worse)\n * get misclassified as \"already published\" by the retry/idempotency\n * patterns since that old version genuinely IS already on the registry.\n * - pnpm handles `workspace:*` natively during `pnpm publish` — no rewrite needed.\n * - npm/yarn do NOT — we must replace with `^version` before publish.\n * - `link:` references are never valid on the npm registry — always rewrite.\n *\n * Returns a restore function that reverts package.json to original content.\n * Call it in a finally block to guarantee cleanup.\n */\n\nimport { readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\n// ── rewriteWorkspaceDeps helpers ──────────────────────────────────────────\n\nfunction rewriteLinkDep(\n deps: Record<string, string>,\n depName: string,\n val: string,\n pkgPath: string,\n versionMap: Map<string, string>,\n): void {\n const pinned = versionMap.get(depName);\n if (pinned) {\n deps[depName] = `^${pinned}`;\n return;\n }\n try {\n const linkPath = val.slice('link:'.length);\n const linked = JSON.parse(readFileSync(join(pkgPath, linkPath, 'package.json'), 'utf-8')) as { version?: string };\n deps[depName] = `^${linked.version ?? '*'}`;\n } catch {\n deps[depName] = '*';\n }\n}\n\nfunction rewriteWorkspaceDep(\n deps: Record<string, string>,\n depName: string,\n val: string,\n versionMap: Map<string, string>,\n): boolean {\n const pinned = versionMap.get(depName);\n if (!pinned) { return false; }\n const range = val === 'workspace:*' ? '^' : val.slice('workspace:'.length);\n deps[depName] = `${range}${pinned}`;\n return true;\n}\n\nfunction rewriteDepsSection(\n deps: Record<string, string>,\n pkgPath: string,\n versionMap: Map<string, string>,\n packageManager: string,\n): boolean {\n let modified = false;\n for (const depName of Object.keys(deps)) {\n const val = deps[depName];\n if (typeof val !== 'string') { continue; }\n if (val.startsWith('link:')) {\n rewriteLinkDep(deps, depName, val, pkgPath, versionMap);\n modified = true;\n } else if (val.startsWith('workspace:') && packageManager !== 'pnpm' && rewriteWorkspaceDep(deps, depName, val, versionMap)) {\n modified = true;\n }\n }\n return modified;\n}\n\nexport function rewriteWorkspaceDeps(\n pkg: { path: string; version: string },\n versionMap: Map<string, string>,\n packageManager: string,\n): () => void {\n const pkgPath = pkg.path;\n const pkgJsonPath = join(pkgPath, 'package.json');\n const original = readFileSync(pkgJsonPath, 'utf-8');\n const pkgJson = JSON.parse(original) as Record<string, unknown> & { version?: string };\n let modified = false;\n\n if (pkgJson.version !== pkg.version) {\n pkgJson.version = pkg.version;\n modified = true;\n }\n\n // Every dependency-like section must be rewritten: a published tarball's\n // devDependencies/optionalDependencies\n // field is inert for the *installer* of this package, but npm's own manifest\n // normalization (npm-package-arg validation inside @npmcli/arborist) parses\n // EVERY dependency-like section of every manifest it reads while building the\n // ideal tree — including devDependencies of a package several levels deep in\n // someone else's dependency graph. A leftover \"workspace:*\" there throws\n // EUNSUPPORTEDPROTOCOL and aborts the whole install, not just a devDependency\n // installation that would otherwise be skipped. Confirmed live on\n // @kb-labs/plugin-execution-factory@2.114.0's devDependencies.@kb-labs/gateway-core.\n for (const section of ['dependencies', 'optionalDependencies', 'peerDependencies', 'devDependencies'] as const) {\n const deps = pkgJson[section] as Record<string, string> | undefined;\n if (!deps) { continue; }\n if (rewriteDepsSection(deps, pkgPath, versionMap, packageManager)) { modified = true; }\n }\n\n if (modified) {\n writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + '\\n');\n }\n\n return () => writeFileSync(pkgJsonPath, original);\n}\n\n// ── topoSort helpers ──────────────────────────────────────────────────────\n\n/**\n * Build a simple topological sort of packages for publish order.\n *\n * Packages are grouped into \"waves\": wave 0 has no intra-release deps,\n * wave 1 depends only on wave 0, etc. Within each wave publish order\n * is arbitrary (safe to parallelise).\n *\n * Cycles (should not exist in a well-formed monorepo) fall into a\n * \"remainder\" group appended at the end.\n */\nexport interface TopoPackage {\n name: string;\n path: string;\n version: string;\n}\n\nfunction buildIntraDeps(packages: TopoPackage[], nameSet: Set<string>): Map<string, Set<string>> {\n const deps = new Map<string, Set<string>>();\n for (const pkg of packages) {\n const intra = new Set<string>();\n try {\n const pkgJson = JSON.parse(readFileSync(join(pkg.path, 'package.json'), 'utf-8')) as {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n };\n for (const section of ['dependencies', 'peerDependencies'] as const) {\n for (const depName of Object.keys(pkgJson[section] ?? {})) {\n if (nameSet.has(depName)) { intra.add(depName); }\n }\n }\n } catch {\n // If we can't read package.json, treat as no deps\n }\n deps.set(pkg.name, intra);\n }\n return deps;\n}\n\nfunction buildDependantsMap(packages: TopoPackage[], deps: Map<string, Set<string>>): Map<string, Set<string>> {\n const dependants = new Map<string, Set<string>>();\n for (const pkg of packages) {\n for (const dep of deps.get(pkg.name) ?? []) {\n if (!dependants.has(dep)) { dependants.set(dep, new Set()); }\n dependants.get(dep)!.add(pkg.name);\n }\n }\n return dependants;\n}\n\nfunction computeWaves(\n packages: TopoPackage[],\n deps: Map<string, Set<string>>,\n dependants: Map<string, Set<string>>,\n): TopoPackage[][] {\n const byName = new Map(packages.map(p => [p.name, p]));\n const remaining = new Map<string, number>(\n packages.map(p => [p.name, (deps.get(p.name) ?? new Set()).size])\n );\n const waves: TopoPackage[][] = [];\n\n while (remaining.size > 0) {\n const wave = [...remaining.entries()]\n .filter(([, count]) => count === 0)\n .map(([name]) => byName.get(name)!);\n\n if (wave.length === 0) {\n waves.push([...remaining.keys()].map(n => byName.get(n)!));\n break;\n }\n\n waves.push(wave);\n for (const pkg of wave) {\n remaining.delete(pkg.name);\n for (const dependant of dependants.get(pkg.name) ?? []) {\n if (remaining.has(dependant)) {\n remaining.set(dependant, (remaining.get(dependant) ?? 1) - 1);\n }\n }\n }\n }\n\n return waves.filter(w => w.length > 0);\n}\n\nexport function topoSort(packages: TopoPackage[], _packageManager: string): TopoPackage[][] {\n const nameSet = new Set(packages.map(p => p.name));\n const deps = buildIntraDeps(packages, nameSet);\n const dependants = buildDependantsMap(packages, deps);\n return computeWaves(packages, deps, dependants);\n}\n","/**\n * Shared `--release-tag` / `--flow` resolution for commands that operate\n * on an already-decided release (`stage`, `deliver`) — mirrors the tag\n * grammar in `@kb-labs/release-manager-core`'s `resolveFlowFromTag` so CI\n * can pass just the tag and the plugin decides the flow, per the\n * \"plugin prepares, CI delivers\" release plan.\n */\n\nimport { resolveFlowFromTag, type ReleaseConfig } from '@kb-labs/release-manager-core';\n\nexport interface FlowResolvableFlags {\n flow?: string;\n 'release-tag'?: string;\n}\n\nexport function resolveFlowName(config: ReleaseConfig, flags: FlowResolvableFlags): string | { error: string } {\n if (flags.flow) { return flags.flow; }\n if (flags['release-tag']) {\n const resolved = resolveFlowFromTag(config, flags['release-tag']);\n if (!resolved) {\n return { error: `Could not resolve a release.flows entry from tag \"${flags['release-tag']}\"` };\n }\n return resolved.flowName;\n }\n return { error: 'requires --flow or --release-tag' };\n}\n","/**\n * Standalone stage command — packs the flow's currently-committed package\n * versions into real npm tarballs, once, so every downstream `release\n * deliver` job ships the exact same bytes instead of re-packing\n * independently from source. See plugins/release/docs/adr/0001-* and the\n * \"plugin prepares, CI delivers\" release plan.\n *\n * Deliberately does NOT call planRelease() — same reasoning as promote.ts:\n * versions are already fixed by the prepare step that already ran (version\n * bump, changelog, git commit/tag/push). This command's only job is\n * \"pack exactly what's already on disk, unchanged.\"\n *\n * Not to be confused with `release:pack` (`pack.ts`) — that command\n * verifies *proposed* packages via `npm pack` + static checks before a\n * release is decided; this one produces the *actual* tarball artifact for\n * an already-decided release.\n */\n\nimport { createHash } from 'node:crypto';\nimport { spawnSync } from 'node:child_process';\nimport { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { tmpdir } from 'node:os';\nimport { basename, join } from 'node:path';\nimport { defineCommand, type CLIInput, type PluginContextV3, useLoader, useConfig, useEnv, type CommandResult } from '@kb-labs/sdk';\nimport {\n discoverCurrentPackages,\n mergeConfigWithFlow,\n verifyExtractedTarball,\n type ReleaseConfig,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { rewriteWorkspaceDeps } from '../../shared/dep-rewrite';\nimport { resolveFlowName, type FlowResolvableFlags } from '../../shared/resolve-flow';\n\ninterface StageFlags extends FlowResolvableFlags {\n 'out-dir'?: string;\n json?: boolean;\n}\n\nexport interface StagedArtifact {\n name: string;\n version: string;\n tarball: string;\n sha256: string;\n}\n\ninterface StagePayload {\n outDir?: string;\n artifacts?: StagedArtifact[];\n}\n\n/**\n * Pack one package into `outDir`, returning the produced tarball's filename.\n *\n * pnpm is the platform default and owns workspace protocol materialization.\n * npm/yarn are explicit opt-in paths and get the rewrite needed for their\n * standalone tarballs.\n */\n/** pnpm prints the produced tarball's absolute path as its last stdout line — no --json output exists. */\nfunction filenameFromPnpmPack(stdout: string): string | undefined {\n const lines = stdout.trim().split('\\n').filter(Boolean);\n const lastLine = lines[lines.length - 1];\n return lastLine ? basename(lastLine.trim()) : undefined;\n}\n\n/** `npm pack --json` prints a JSON array; we only ever pack one package at a time. */\nfunction filenameFromNpmPack(stdout: string): string | undefined {\n const parsed = JSON.parse(stdout) as Array<{ filename: string }>;\n return parsed[0]?.filename;\n}\n\nfunction packOne(\n pkg: { path: string; currentVersion: string },\n outDir: string,\n packageManager: 'pnpm' | 'npm' | 'yarn',\n versionMap: Map<string, string>,\n): { filename: string; restore: () => void } {\n const isPnpm = packageManager === 'pnpm';\n const restore = rewriteWorkspaceDeps(\n { path: pkg.path, version: pkg.currentVersion },\n versionMap,\n packageManager,\n );\n\n const packArgs = isPnpm\n ? ['pack', '--pack-destination', outDir]\n : ['pack', '--pack-destination', outDir, '--json'];\n const packResult = spawnSync(isPnpm ? 'pnpm' : 'npm', packArgs, { cwd: pkg.path, stdio: 'pipe' });\n\n if (packResult.status !== 0) {\n const stderr = packResult.stderr?.toString().trim() || packResult.stdout?.toString().trim();\n throw new Error(`${packageManager} pack failed for ${pkg.path}${stderr ? `: ${stderr}` : ''}`);\n }\n\n const filename = isPnpm\n ? filenameFromPnpmPack(packResult.stdout.toString())\n : filenameFromNpmPack(packResult.stdout.toString());\n\n if (!filename) {\n throw new Error(`${packageManager} pack produced no tarball for ${pkg.path}`);\n }\n return { filename, restore };\n}\n\n/**\n * Pack one package. Static artifact verification happens after all packages\n * have been packed, so Stage never performs a registry-style install per\n * package.\n */\nasync function packStagePackage(\n pkg: { name: string; path: string; currentVersion: string },\n outDir: string,\n packageManager: 'pnpm' | 'npm' | 'yarn',\n versionMap: Map<string, string>,\n): Promise<StagedArtifact> {\n const { filename, restore } = packOne(pkg, outDir, packageManager, versionMap);\n try {\n const sha256 = createHash('sha256').update(readFileSync(join(outDir, filename))).digest('hex');\n return { name: pkg.name, version: pkg.currentVersion, tarball: filename, sha256 };\n } finally { restore(); }\n}\n\nfunction verifyStagePackage(\n pkg: { name: string; currentVersion: string },\n outDir: string,\n artifact: StagedArtifact,\n): void {\n const tarballPath = join(outDir, artifact.tarball);\n const verifyDir = mkdtempSync(join(tmpdir(), 'kb-stage-verify-'));\n try {\n const extractResult = spawnSync('tar', ['xzf', tarballPath, '-C', verifyDir], { stdio: 'pipe' });\n if (extractResult.status !== 0) {\n throw new Error(`could not extract staged tarball for ${pkg.name}@${pkg.currentVersion}`);\n }\n const issues = verifyExtractedTarball(join(verifyDir, 'package'));\n if (issues.length > 0) {\n throw new Error(`staged artifact verification failed for ${pkg.name}@${pkg.currentVersion}: ${issues.join('; ')}`);\n }\n } finally { rmSync(verifyDir, { recursive: true, force: true }); }\n\n}\n\nexport default defineCommand({\n id: 'release:stage',\n description: 'Pack the currently-committed package versions for a flow into real npm tarballs, once, for `release deliver` to ship',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<StageFlags>): Promise<CommandResult<StagePayload>> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const baseConfig: ReleaseConfig = fileConfig ?? {};\n\n const flowResult = resolveFlowName(baseConfig, flags);\n if (typeof flowResult !== 'string') {\n const msg = `release:stage ${flowResult.error}`;\n if (flags.json) { ctx.ui?.json?.({ error: msg }); } else { ctx.ui?.error?.(msg); }\n return { ok: false, error: 'Command failed' };\n }\n const flowName = flowResult;\n\n const config: ReleaseConfig = mergeConfigWithFlow(baseConfig, flowName);\n const outDir = join(repoRoot, flags['out-dir'] ?? '.kb/release/artifacts');\n mkdirSync(outDir, { recursive: true });\n\n const discoverLoader = useLoader(`Discovering currently-committed packages for flow \"${flowName}\"...`);\n discoverLoader.start();\n const discovered = await discoverCurrentPackages(repoRoot, undefined, config);\n discoverLoader.succeed(`Found ${discovered.length} package(s) to stage`);\n\n if (discovered.length === 0) {\n const msg = `No packages found for flow \"${flowName}\"`;\n if (flags.json) { ctx.ui?.json?.({ outDir, artifacts: [] }); } else { ctx.ui?.write?.(msg); }\n return { ok: false, error: 'Command failed' };\n }\n\n // versionMap must cover the WHOLE workspace, not just this flow's packages:\n // a flow package can depend on a package owned by a different flow (e.g. sdk\n // depends on @kb-labs/core-retry, which is platform-flow-scoped). Building the\n // map from `discovered` (flow-scoped) alone leaves such cross-flow deps out of\n // versionMap, so rewriteWorkspaceDeps silently skips them (no pinned version to\n // substitute). Only used by the npm/yarn packing path below — pnpm resolves\n // workspace:* on its own and never consults this map.\n const allWorkspacePackages = await discoverCurrentPackages(repoRoot, undefined, baseConfig);\n const versionMap = new Map(allWorkspacePackages.map(pkg => [pkg.name, pkg.currentVersion]));\n const packageManager = config.workspace?.type ?? config.publish?.packageManager ?? 'pnpm';\n\n const CONCURRENCY = Number(useEnv('KB_STAGE_CONCURRENCY') ?? 6);\n\n const packLoader = useLoader('Packing tarballs...');\n packLoader.start();\n const artifacts: StagedArtifact[] = [];\n for (let i = 0; i < discovered.length; i += CONCURRENCY) {\n const batch = discovered.slice(i, i + CONCURRENCY);\n const batchArtifacts = await Promise.all(\n batch.map(pkg => packStagePackage(pkg, outDir, packageManager, versionMap)),\n );\n artifacts.push(...batchArtifacts);\n }\n packLoader.succeed(`Packed ${artifacts.length} tarball(s) to ${outDir}`);\n\n const verifyLoader = useLoader('Verifying staged tarballs...');\n verifyLoader.start();\n for (let i = 0; i < discovered.length; i += CONCURRENCY) {\n const batch = discovered.slice(i, i + CONCURRENCY);\n batch.forEach((pkg, index) => verifyStagePackage(pkg, outDir, artifacts[i + index]!));\n }\n verifyLoader.succeed(`Verified ${artifacts.length} staged tarball(s)`);\n\n writeFileSync(join(outDir, 'manifest.json'), JSON.stringify(artifacts, null, 2) + '\\n', 'utf-8');\n\n const result: StagePayload = { outDir, artifacts };\n if (flags.json) {\n const response = { ok: true as const, result };\n ctx.ui?.json?.(response);\n return response;\n }\n\n ctx.ui?.sideBox?.({\n title: 'Stage',\n sections: [{\n header: `Staged to ${outDir}`,\n items: artifacts.map(a => `${ctx.ui.symbols.success} ${a.name}@${a.version} → ${a.tarball}`),\n }],\n status: 'success',\n });\n\n return { ok: true, result };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/cli/commands/status.ts"],"names":[],"mappings":"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","file":"status.js","sourcesContent":["/**\n * Release status command — one receipt-style view answering \"what is\n * actually stable, what is candidate, and why\" without reading raw Actions\n * logs or comparing npm/git by hand.\n *\n * Deliberately reads only surfaces that already exist (git tags, real npm\n * dist-tags, recent candidate CI runs) — no new storage, no CAS, no receipt\n * store. See docs/plans/2026-08-13-release-operating-system-audit.md §Wave 0.\n */\nimport {\n defineCommand,\n type CLIInput,\n type CommandResult,\n type PluginContextV3,\n useLoader,\n useConfig,\n} from '@kb-labs/sdk';\nimport {\n computeFlowReleaseStatus,\n createExecaShellAdapter,\n type ReleaseConfig,\n type FlowReleaseStatus,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\n\ninterface StatusFlags {\n flow: string;\n json?: boolean;\n ci?: boolean;\n}\n\ntype ReleaseStatusResult = CommandResult<unknown>;\n\ninterface CandidateRun {\n workflow: string;\n headSha: string;\n status: string;\n conclusion: string | null;\n createdAt: string;\n}\n\nconst CANDIDATE_WORKFLOWS = ['release-build-candidate.yml', 'release-deliver-candidate.yml'];\n\nasync function fetchRecentCandidateRuns(\n shell: ReturnType<typeof createExecaShellAdapter>,\n cwd: string,\n limit: number,\n): Promise<{ runs: CandidateRun[]; error?: string }> {\n const runs: CandidateRun[] = [];\n for (const workflow of CANDIDATE_WORKFLOWS) {\n const res = await shell.exec(\n 'gh',\n [\n 'run', 'list',\n `--workflow=${workflow}`,\n '--limit', String(limit),\n '--json', 'headSha,status,conclusion,createdAt',\n ],\n { cwd, timeout: 15000 },\n );\n if (!res.ok) {\n return { runs, error: res.stderr.trim() || `gh run list failed for ${workflow}` };\n }\n try {\n const parsed = JSON.parse(res.stdout) as Array<{ headSha: string; status: string; conclusion: string | null; createdAt: string }>;\n runs.push(...parsed.map(r => ({ workflow, ...r })));\n } catch {\n return { runs, error: `Could not parse gh output for ${workflow}` };\n }\n }\n runs.sort((a, b) => (a.createdAt < b.createdAt ? 1 : -1));\n return { runs };\n}\n\n// ── rendering ──────────────────────────────────────────────────────────────\n\nfunction buildStatusSections(\n status: FlowReleaseStatus,\n ci: { runs: CandidateRun[]; error?: string } | undefined,\n symbols: { success: string; error: string; warning: string },\n): Array<{ header?: string; items: string[] }> {\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n sections.push({\n header: 'Stable (git)',\n items: status.git.tag\n ? [\n `Tag: ${status.git.tag} (${status.git.version})`,\n `Commit: ${status.git.commit?.slice(0, 12) ?? 'unknown'}`,\n `Tagged at: ${status.git.committedAt ?? 'unknown'}`,\n ]\n : ['No stable tag found for this flow'],\n });\n\n sections.push({\n header: `npm (${status.npm.registry})`,\n items: [\n `\"${status.npm.stableDistTag}\": ${status.npm.stableVersion ?? (status.npm.stableDrift ? 'DRIFT — packages disagree' : 'unresolved')}`,\n `\"${status.npm.canaryDistTag}\": ${status.npm.canaryVersion ?? (status.npm.canaryDrift ? 'DRIFT — packages disagree' : 'unresolved')}`,\n `Sampled: ${status.npm.perPackage.map(p => p.name).join(', ')}`,\n ],\n });\n\n if (ci) {\n if (ci.error) {\n sections.push({ header: 'Recent candidate CI', items: [`${symbols.warning} ${ci.error}`] });\n } else if (ci.runs.length === 0) {\n sections.push({ header: 'Recent candidate CI', items: ['No recent runs found'] });\n } else {\n sections.push({\n header: 'Recent candidate CI',\n items: ci.runs.slice(0, 8).map(r => {\n const icon = r.conclusion === 'success' ? symbols.success : r.conclusion ? symbols.error : symbols.warning;\n return `${icon} ${r.workflow.replace('.yml', '')} — ${r.headSha.slice(0, 12)} — ${r.conclusion ?? r.status} (${r.createdAt})`;\n }),\n });\n }\n }\n\n if (status.verdict.warnings.length > 0) {\n sections.push({\n header: 'Warnings',\n items: status.verdict.warnings.map(w => `${symbols.warning} ${w}`),\n });\n } else {\n sections.push({ items: [`${symbols.success} Stable tag and npm agree; no drift detected`] });\n }\n\n return sections;\n}\n\n// ── command ────────────────────────────────────────────────────────────────\n\nexport default defineCommand({\n id: 'release:status',\n description: 'Show what is actually stable vs. candidate for a release flow (git tag, npm dist-tags, recent candidate CI)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<StatusFlags>): Promise<ReleaseStatusResult> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n if (!flags.flow) {\n ctx.ui?.error?.('--flow is required', { hint: 'Run: kb release status --flow platform' });\n return { ok: false, error: '--flow is required' };\n }\n\n const loader = useLoader(`Checking release status for \"${flags.flow}\"...`);\n loader.start();\n\n const config: ReleaseConfig = { ...(await useConfig<ReleaseConfig>()) };\n const shell = createExecaShellAdapter();\n\n let status: FlowReleaseStatus;\n try {\n status = await computeFlowReleaseStatus({ cwd: repoRoot, config, flow: flags.flow, shell });\n } catch (err) {\n loader.fail('Failed to compute release status');\n const message = err instanceof Error ? err.message : String(err);\n ctx.ui?.error?.(message);\n return { ok: false, error: message };\n }\n\n const ci = flags.ci === false ? undefined : await fetchRecentCandidateRuns(shell, repoRoot, 5);\n\n loader.succeed(\n status.verdict.ok\n ? `\"${flags.flow}\" is clean — stable tag and npm agree`\n : `\"${flags.flow}\" has ${status.verdict.warnings.length} warning(s)`,\n );\n\n ctx.platform?.logger?.info?.('Release status computed', {\n flow: flags.flow,\n ok: status.verdict.ok,\n warnings: status.verdict.warnings.length,\n });\n\n if (flags.json) {\n ctx.ui?.json?.({ ...status, ci });\n } else {\n ctx.ui?.sideBox?.({\n title: `Release status — ${flags.flow}`,\n sections: buildStatusSections(status, ci, ctx.ui!.symbols),\n status: status.verdict.ok ? 'success' : 'warning',\n });\n }\n\n return { ok: true, result: { ...status, ci } };\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":";;;;;;AAyCA,IAAM,mBAAA,GAAsB,CAAC,6BAAA,EAA+B,+BAA+B,CAAA;AAE3F,eAAe,wBAAA,CACb,KAAA,EACA,GAAA,EACA,KAAA,EACmD;AACnD,EAAA,MAAM,OAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,YAAY,mBAAA,EAAqB;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,IAAA;AAAA,MACtB,IAAA;AAAA,MACA;AAAA,QACE,KAAA;AAAA,QAAO,MAAA;AAAA,QACP,cAAc,QAAQ,CAAA,CAAA;AAAA,QACtB,SAAA;AAAA,QAAW,OAAO,KAAK,CAAA;AAAA,QACvB,QAAA;AAAA,QAAU;AAAA,OACZ;AAAA,MACA,EAAE,GAAA,EAAK,OAAA,EAAS,IAAA;AAAM,KACxB;AACA,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACX,MAAA,OAAO,EAAE,MAAM,KAAA,EAAO,GAAA,CAAI,OAAO,IAAA,EAAK,IAAK,CAAA,uBAAA,EAA0B,QAAQ,CAAA,CAAA,EAAG;AAAA,IAClF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA;AACpC,MAAA,IAAA,CAAK,IAAA,CAAK,GAAG,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,QAAA,EAAU,GAAG,CAAA,EAAE,CAAE,CAAC,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA,8BAAA,EAAiC,QAAQ,CAAA,CAAA,EAAG;AAAA,IACpE;AAAA,EACF;AACA,EAAA,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,EAAE,SAAA,GAAY,CAAA,CAAE,SAAA,GAAY,CAAA,GAAI,EAAG,CAAA;AACxD,EAAA,OAAO,EAAE,IAAA,EAAK;AAChB;AAIA,SAAS,mBAAA,CACP,MAAA,EACA,EAAA,EACA,OAAA,EAC6C;AAC7C,EAAA,MAAM,WAAwD,EAAC;AAE/D,EAAA,QAAA,CAAS,IAAA,CAAK;AAAA,IACZ,MAAA,EAAQ,cAAA;AAAA,IACR,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,GAAA,GACd;AAAA,MACE,QAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA,EAAA,EAAK,MAAA,CAAO,IAAI,OAAO,CAAA,CAAA,CAAA;AAAA,MAC7C,CAAA,QAAA,EAAW,OAAO,GAAA,CAAI,MAAA,EAAQ,MAAM,CAAA,EAAG,EAAE,KAAK,SAAS,CAAA,CAAA;AAAA,MACvD,CAAA,WAAA,EAAc,MAAA,CAAO,GAAA,CAAI,WAAA,IAAe,SAAS,CAAA;AAAA,KACnD,GACA,CAAC,mCAAmC;AAAA,GACzC,CAAA;AAED,EAAA,QAAA,CAAS,IAAA,CAAK;AAAA,IACZ,MAAA,EAAQ,CAAA,KAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,CAAA,CAAA;AAAA,IACnC,KAAA,EAAO;AAAA,MACL,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA,GAAA,EAAM,MAAA,CAAO,GAAA,CAAI,aAAA,KAAkB,MAAA,CAAO,GAAA,CAAI,WAAA,GAAc,gCAAA,GAA8B,YAAA,CAAa,CAAA,CAAA;AAAA,MACnI,CAAA,CAAA,EAAI,MAAA,CAAO,GAAA,CAAI,aAAa,CAAA,GAAA,EAAM,MAAA,CAAO,GAAA,CAAI,aAAA,KAAkB,MAAA,CAAO,GAAA,CAAI,WAAA,GAAc,gCAAA,GAA8B,YAAA,CAAa,CAAA,CAAA;AAAA,MACnI,CAAA,SAAA,EAAY,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA;AAC/D,GACD,CAAA;AAED,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,IAAI,GAAG,KAAA,EAAO;AACZ,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,qBAAA,EAAuB,OAAO,CAAC,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI,EAAA,CAAG,KAAK,CAAA,CAAE,GAAG,CAAA;AAAA,IAC5F,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG;AAC/B,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,qBAAA,EAAuB,OAAO,CAAC,sBAAsB,GAAG,CAAA;AAAA,IAClF,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,MAAA,EAAQ,qBAAA;AAAA,QACR,KAAA,EAAO,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK;AAClC,UAAA,MAAM,IAAA,GAAO,CAAA,CAAE,UAAA,KAAe,SAAA,GAAY,OAAA,CAAQ,UAAU,CAAA,CAAE,UAAA,GAAa,OAAA,CAAQ,KAAA,GAAQ,OAAA,CAAQ,OAAA;AACnG,UAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,QAAA,EAAM,CAAA,CAAE,QAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,QAAA,EAAM,CAAA,CAAE,cAAc,CAAA,CAAE,MAAM,CAAA,EAAA,EAAK,CAAA,CAAE,SAAS,CAAA,CAAA,CAAA;AAAA,QAC5H,CAAC;AAAA,OACF,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACtC,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,MAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAO,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE;AAAA,KAClE,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,KAAA,EAAO,CAAC,GAAG,OAAA,CAAQ,OAAO,CAAA,4CAAA,CAA8C,CAAA,EAAG,CAAA;AAAA,EAC7F;AAEA,EAAA,OAAO,QAAA;AACT;AAIA,IAAO,iBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,gBAAA;AAAA,EACJ,WAAA,EAAa,6GAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAA4D;AAC9F,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,GAAG,CAAA;AAEvC,MAAA,IAAI,CAAC,MAAM,IAAA,EAAM;AACf,QAAA,GAAA,CAAI,IAAI,KAAA,GAAQ,oBAAA,EAAsB,EAAE,IAAA,EAAM,0CAA0C,CAAA;AACxF,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,oBAAA,EAAqB;AAAA,MAClD;AAEA,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,CAAA,6BAAA,EAAgC,KAAA,CAAM,IAAI,CAAA,IAAA,CAAM,CAAA;AACzE,MAAA,MAAA,CAAO,KAAA,EAAM;AAEb,MAAA,MAAM,MAAA,GAAwB,EAAE,GAAI,MAAM,WAAyB,EAAG;AACtE,MAAA,MAAM,QAAQ,uBAAA,EAAwB;AAEtC,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,MAAM,wBAAA,CAAyB,EAAE,GAAA,EAAK,QAAA,EAAU,QAAQ,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,MAC5F,SAAS,GAAA,EAAK;AACZ,QAAA,MAAA,CAAO,KAAK,kCAAkC,CAAA;AAC9C,QAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,QAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,OAAO,CAAA;AACvB,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,OAAA,EAAQ;AAAA,MACrC;AAEA,MAAA,MAAM,EAAA,GAAK,MAAM,EAAA,KAAO,KAAA,GAAQ,SAAY,MAAM,wBAAA,CAAyB,KAAA,EAAO,QAAA,EAAU,CAAC,CAAA;AAE7F,MAAA,MAAA,CAAO,OAAA;AAAA,QACL,MAAA,CAAO,OAAA,CAAQ,EAAA,GACX,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,0CAAA,CAAA,GACd,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,MAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,SAAS,MAAM,CAAA,WAAA;AAAA,OAC3D;AAEA,MAAA,GAAA,CAAI,QAAA,EAAU,MAAA,EAAQ,IAAA,GAAO,yBAAA,EAA2B;AAAA,QACtD,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,EAAA,EAAI,OAAO,OAAA,CAAQ,EAAA;AAAA,QACnB,QAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS;AAAA,OACnC,CAAA;AAED,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,GAAG,MAAA,EAAQ,IAAI,CAAA;AAAA,MAClC,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,IAAI,OAAA,GAAU;AAAA,UAChB,KAAA,EAAO,CAAA,sBAAA,EAAoB,KAAA,CAAM,IAAI,CAAA,CAAA;AAAA,UACrC,UAAU,mBAAA,CAAoB,MAAA,EAAQ,EAAA,EAAI,GAAA,CAAI,GAAI,OAAO,CAAA;AAAA,UACzD,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,EAAA,GAAK,SAAA,GAAY;AAAA,SACzC,CAAA;AAAA,MACH;AAEA,MAAA,OAAO,EAAE,IAAI,IAAA,EAAM,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,IAAG,EAAE;AAAA,IAC/C;AAAA;AAEJ,CAAC","file":"status.js","sourcesContent":["/**\n * Release status command — one receipt-style view answering \"what is\n * actually stable, what is candidate, and why\" without reading raw Actions\n * logs or comparing npm/git by hand.\n *\n * Deliberately reads only surfaces that already exist (git tags, real npm\n * dist-tags, recent candidate CI runs) — no new storage, no CAS, no receipt\n * store. See docs/plans/2026-08-13-release-operating-system-audit.md §Wave 0.\n */\nimport {\n defineCommand,\n type CLIInput,\n type CommandResult,\n type PluginContextV3,\n useLoader,\n useConfig,\n} from '@kb-labs/sdk';\nimport {\n computeFlowReleaseStatus,\n createExecaShellAdapter,\n type ReleaseConfig,\n type FlowReleaseStatus,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\n\ninterface StatusFlags {\n flow: string;\n json?: boolean;\n ci?: boolean;\n}\n\ntype ReleaseStatusResult = CommandResult<unknown>;\n\ninterface CandidateRun {\n workflow: string;\n headSha: string;\n status: string;\n conclusion: string | null;\n createdAt: string;\n}\n\nconst CANDIDATE_WORKFLOWS = ['release-build-candidate.yml', 'release-deliver-candidate.yml'];\n\nasync function fetchRecentCandidateRuns(\n shell: ReturnType<typeof createExecaShellAdapter>,\n cwd: string,\n limit: number,\n): Promise<{ runs: CandidateRun[]; error?: string }> {\n const runs: CandidateRun[] = [];\n for (const workflow of CANDIDATE_WORKFLOWS) {\n const res = await shell.exec(\n 'gh',\n [\n 'run', 'list',\n `--workflow=${workflow}`,\n '--limit', String(limit),\n '--json', 'headSha,status,conclusion,createdAt',\n ],\n { cwd, timeout: 15000 },\n );\n if (!res.ok) {\n return { runs, error: res.stderr.trim() || `gh run list failed for ${workflow}` };\n }\n try {\n const parsed = JSON.parse(res.stdout) as Array<{ headSha: string; status: string; conclusion: string | null; createdAt: string }>;\n runs.push(...parsed.map(r => ({ workflow, ...r })));\n } catch {\n return { runs, error: `Could not parse gh output for ${workflow}` };\n }\n }\n runs.sort((a, b) => (a.createdAt < b.createdAt ? 1 : -1));\n return { runs };\n}\n\n// ── rendering ──────────────────────────────────────────────────────────────\n\nfunction buildStatusSections(\n status: FlowReleaseStatus,\n ci: { runs: CandidateRun[]; error?: string } | undefined,\n symbols: { success: string; error: string; warning: string },\n): Array<{ header?: string; items: string[] }> {\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n sections.push({\n header: 'Stable (git)',\n items: status.git.tag\n ? [\n `Tag: ${status.git.tag} (${status.git.version})`,\n `Commit: ${status.git.commit?.slice(0, 12) ?? 'unknown'}`,\n `Tagged at: ${status.git.committedAt ?? 'unknown'}`,\n ]\n : ['No stable tag found for this flow'],\n });\n\n sections.push({\n header: `npm (${status.npm.registry})`,\n items: [\n `\"${status.npm.stableDistTag}\": ${status.npm.stableVersion ?? (status.npm.stableDrift ? 'DRIFT — packages disagree' : 'unresolved')}`,\n `\"${status.npm.canaryDistTag}\": ${status.npm.canaryVersion ?? (status.npm.canaryDrift ? 'DRIFT — packages disagree' : 'unresolved')}`,\n `Sampled: ${status.npm.perPackage.map(p => p.name).join(', ')}`,\n ],\n });\n\n if (ci) {\n if (ci.error) {\n sections.push({ header: 'Recent candidate CI', items: [`${symbols.warning} ${ci.error}`] });\n } else if (ci.runs.length === 0) {\n sections.push({ header: 'Recent candidate CI', items: ['No recent runs found'] });\n } else {\n sections.push({\n header: 'Recent candidate CI',\n items: ci.runs.slice(0, 8).map(r => {\n const icon = r.conclusion === 'success' ? symbols.success : r.conclusion ? symbols.error : symbols.warning;\n return `${icon} ${r.workflow.replace('.yml', '')} — ${r.headSha.slice(0, 12)} — ${r.conclusion ?? r.status} (${r.createdAt})`;\n }),\n });\n }\n }\n\n if (status.verdict.warnings.length > 0) {\n sections.push({\n header: 'Warnings',\n items: status.verdict.warnings.map(w => `${symbols.warning} ${w}`),\n });\n } else {\n sections.push({ items: [`${symbols.success} Stable tag and npm agree; no drift detected`] });\n }\n\n return sections;\n}\n\n// ── command ────────────────────────────────────────────────────────────────\n\nexport default defineCommand({\n id: 'release:status',\n description: 'Show what is actually stable vs. candidate for a release flow (git tag, npm dist-tags, recent candidate CI)',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<StatusFlags>): Promise<ReleaseStatusResult> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n if (!flags.flow) {\n ctx.ui?.error?.('--flow is required', { hint: 'Run: kb release status --flow platform' });\n return { ok: false, error: '--flow is required' };\n }\n\n const loader = useLoader(`Checking release status for \"${flags.flow}\"...`);\n loader.start();\n\n const config: ReleaseConfig = { ...(await useConfig<ReleaseConfig>()) };\n const shell = createExecaShellAdapter();\n\n let status: FlowReleaseStatus;\n try {\n status = await computeFlowReleaseStatus({ cwd: repoRoot, config, flow: flags.flow, shell });\n } catch (err) {\n loader.fail('Failed to compute release status');\n const message = err instanceof Error ? err.message : String(err);\n ctx.ui?.error?.(message);\n return { ok: false, error: message };\n }\n\n const ci = flags.ci === false ? undefined : await fetchRecentCandidateRuns(shell, repoRoot, 5);\n\n loader.succeed(\n status.verdict.ok\n ? `\"${flags.flow}\" is clean — stable tag and npm agree`\n : `\"${flags.flow}\" has ${status.verdict.warnings.length} warning(s)`,\n );\n\n ctx.platform?.logger?.info?.('Release status computed', {\n flow: flags.flow,\n ok: status.verdict.ok,\n warnings: status.verdict.warnings.length,\n });\n\n if (flags.json) {\n ctx.ui?.json?.({ ...status, ci });\n } else {\n ctx.ui?.sideBox?.({\n title: `Release status — ${flags.flow}`,\n sections: buildStatusSections(status, ci, ctx.ui!.symbols),\n status: status.verdict.ok ? 'success' : 'warning',\n });\n }\n\n return { ok: true, result: { ...status, ci } };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/verify-clean-install.ts"],"names":[],"mappings":";;;;AAsBA,IAAO,+BAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,uBAAA;AAAA,EACJ,WAAA,EAAa,mFAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAsF;AACxH,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAElB,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,IAAW,CAAC,MAAM,IAAA,EAAM;AACjC,QAAA,MAAM,GAAA,GAAM,2EAAA;AACZ,QAAA,IAAI,MAAM,IAAA,EAAM;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,QAAG,CAAA,MAAO;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,GAAG,CAAA;AAAA,QAAG;AACjF,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,EAAC,EAAG,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AAE5F,MAAA,IAAI,CAAC,OAAO,EAAA,EAAI;AACd,QAAA,IAAI,MAAM,IAAA,EAAM;AAAE,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,CAAA;AAAA,QAAG,CAAA,MAAO;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,mCAAmC,CAAA;AAAA,QAAG;AACxI,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AAEA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAM,QAAA,GAAW,EAAE,EAAA,EAAI,IAAA,EAAe,MAAA,EAAO;AAC7C,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,QAAQ,CAAA;AACvB,QAAA,OAAO,QAAA;AAAA,MACT;AAEA,MAAA,GAAA,CAAI,EAAA,EAAI,KAAA,GAAQ,CAAA,IAAA,EAAO,KAAA,CAAM,IAAI,CAAA,6BAAA,CAA+B,CAAA;AAChE,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO;AAAA,IAC5B;AAAA;AAEJ,CAAC","file":"verify-clean-install.js","sourcesContent":["/**\n * Standalone clean-install verification — installs a packed tarball into a\n * throwaway consumer project and confirms it can actually be imported.\n *\n * Exists as its own command so `check-pack-install.sh` (the bash release\n * gate) and `release stage` (the CI publish path) share ONE verification\n * implementation instead of the gate re-shelling to `npm install` on its\n * own and getting npm's swallowed, useless error message back (npm's CLI\n * catches the exact EUNSUPPORTEDPROTOCOL failure this exists to catch as an\n * unhandled rejection and prints nothing beyond \"npm error, see log file\").\n */\n\nimport { defineCommand, type CLIInput, type PluginContextV3, type CommandResult } from '@kb-labs/sdk';\nimport { verifyCleanInstall, type CleanInstallResult } from '@kb-labs/release-manager-core';\n\ninterface VerifyCleanInstallFlags {\n tarball: string;\n name: string;\n registry?: string;\n json?: boolean;\n}\n\nexport default defineCommand({\n id: 'release:clean-install',\n description: 'Install a packed tarball into a throwaway consumer and confirm it imports cleanly',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<VerifyCleanInstallFlags>): Promise<CommandResult<CleanInstallResult>> {\n const { flags } = input;\n\n if (!flags.tarball || !flags.name) {\n const msg = 'release:clean-install requires --tarball <path> and --name <package-name>';\n if (flags.json) { ctx.ui?.json?.({ error: msg }); } else { ctx.ui?.error?.(msg); }\n return { ok: false, error: 'Command failed' };\n }\n\n const result = await verifyCleanInstall(flags.tarball, flags.name, [], 'npm', flags.registry);\n\n if (!result.ok) {\n if (flags.json) { ctx.ui?.json?.({ ok: false, result }); } else { ctx.ui?.error?.(result.error ?? 'clean install verification failed'); }\n return { ok: false, error: 'Command failed' };\n }\n\n if (flags.json) {\n const response = { ok: true as const, result };\n ctx.ui?.json?.(response);\n return response;\n }\n\n ctx.ui?.write?.(`OK: ${flags.name} installs and imports cleanly`);\n return { ok: true, result };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../src/cli/commands/verify.ts"],"names":[],"mappings":"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","file":"verify.js","sourcesContent":["/**\n * Release verify command — validate release readiness via flag gates.\n * Package verification and release checks belong in release:run pipeline.\n */\n\nimport { defineCommand, type CLIInput, type CommandResult, type PluginContextV3, useConfig } from '@kb-labs/sdk';\nimport { planRelease, type VersionBump, type ReleaseConfig } from '@kb-labs/release-manager-core';\nimport { resolveGitRange, parseCommits } from '@kb-labs/release-manager-changelog';\nimport { findRepoRoot } from '../../shared/utils';\n\ninterface VerifyFlags {\n scope?: string;\n bump?: 'patch' | 'minor' | 'major' | 'auto';\n 'fail-if-empty'?: boolean;\n 'fail-on-breaking'?: boolean;\n 'allow-types'?: string;\n json?: boolean;\n}\n\ntype ReleaseVerifyResult = CommandResult<unknown>;\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\nfunction isBreakingChange(pkg: { currentVersion?: string; nextVersion?: string }): boolean {\n if (!pkg.currentVersion || !pkg.nextVersion) {\n return false;\n }\n const currentMajor = parseInt(pkg.currentVersion.split('.')[0] || '0');\n const nextMajor = parseInt(pkg.nextVersion.split('.')[0] || '0');\n return nextMajor > currentMajor;\n}\n\nfunction buildVerifySections(\n isValid: boolean,\n hasPackages: boolean,\n hasBreaking: boolean,\n issues: string[],\n symbols: { error: string },\n): Array<{ header?: string; items: string[] }> {\n const sections: Array<{ header?: string; items: string[] }> = [\n {\n header: 'Status',\n items: [\n `Has Packages: ${hasPackages ? 'Yes' : 'No'}`,\n `Has Breaking Changes: ${hasBreaking ? 'Yes' : 'No'}`,\n `Result: ${isValid ? 'Valid for release' : 'Blocked'}`,\n ],\n },\n ];\n\n if (issues.length > 0) {\n sections.push({\n header: 'Issues',\n items: issues.map(issue => `${symbols.error} ${issue}`),\n });\n }\n\n return sections;\n}\n\nexport default defineCommand({\n id: 'release:verify',\n description: 'Validate release readiness',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<VerifyFlags>): Promise<ReleaseVerifyResult> {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = {\n ...fileConfig,\n ...(flags.bump && { bump: flags.bump }),\n };\n\n const plan = await planRelease({\n cwd: repoRoot,\n config,\n scope: flags.scope,\n bumpOverride: flags.bump as VersionBump | undefined,\n });\n\n const hasPackages = plan.packages.length > 0;\n const hasBreaking = plan.packages.some(isBreakingChange);\n\n let isValid = true;\n const issues: string[] = [];\n\n if (flags['fail-if-empty'] && !hasPackages) {\n isValid = false;\n issues.push('No packages to release (--fail-if-empty)');\n }\n\n if (flags['fail-on-breaking'] && hasBreaking) {\n isValid = false;\n issues.push('Breaking changes detected (--fail-on-breaking)');\n }\n\n if (flags['allow-types']) {\n const allowedTypes = flags['allow-types'].split(',');\n const range = await resolveGitRange({\n cwd: repoRoot,\n sinceTag: undefined,\n autoUnshallow: config.git?.autoUnshallow,\n });\n const changes = await parseCommits({\n cwd: repoRoot,\n from: range.from,\n to: range.to,\n ignoreAuthors: config.changelog?.ignoreAuthors || [],\n });\n const hasAllowedTypes = changes.some(change => allowedTypes.includes(change.type));\n if (!hasAllowedTypes) {\n isValid = false;\n issues.push(`Required types not found: ${allowedTypes.join(', ')}`);\n }\n }\n\n if (flags.json) {\n ctx.ui?.json?.({ valid: isValid, hasPackages, hasBreaking, issues, plan });\n } else {\n ctx.ui?.sideBox?.({\n title: 'Release Verification',\n sections: buildVerifySections(isValid, hasPackages, hasBreaking, issues, ctx.ui.symbols),\n status: isValid ? 'success' : 'error',\n });\n }\n\n const result = {\n valid: isValid,\n plan,\n issues,\n breakingDetected: hasBreaking,\n };\n return isValid\n ? { ok: true, result }\n : { ok: false, error: 'Release verification failed', result };\n },\n },\n});\n"]}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
2
|
import { CLIInput } from '@kb-labs/sdk';
|
|
3
|
+
import { ReleaseChannel } from '@kb-labs/release-manager-core';
|
|
3
4
|
|
|
4
5
|
interface VersionFlags {
|
|
5
6
|
scope?: string;
|
|
6
7
|
flow?: string;
|
|
7
8
|
bump?: 'patch' | 'minor' | 'major' | 'auto';
|
|
9
|
+
channel?: ReleaseChannel;
|
|
8
10
|
'dry-run'?: boolean;
|
|
9
11
|
json?: boolean;
|
|
10
12
|
}
|