@kb-labs/release-manager-cli 2.119.0-canary.e120bc0ee → 2.119.0
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 +2 -0
- package/dist/cli/commands/deliver.js.map +1 -1
- 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.d.ts +19 -0
- package/dist/cli/commands/stage-plan.js +525 -0
- package/dist/cli/commands/stage-plan.js.map +1 -0
- package/dist/cli/commands/stage.js.map +1 -1
- package/dist/cli/commands/status.d.ts +11 -0
- package/dist/cli/commands/status.js +130 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/verify-clean-install.d.ts +1 -0
- package/dist/cli/commands/verify-clean-install.js +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.js.map +1 -1
- package/dist/contracts/release.schema.js.map +1 -1
- package/dist/index.js +40 -2
- package/dist/index.js.map +1 -1
- package/dist/manifest.js +40 -2
- package/dist/manifest.js.map +1 -1
- 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.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.js.map +1 -1
- package/dist/rest/handlers/history-report-handler.js.map +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.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.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/package.json +8 -8
- package/dist/manifest.json +0 -1210
- package/dist/widgets/117.js +0 -32
- package/dist/widgets/165.js +0 -1
- package/dist/widgets/326.js +0 -1
- package/dist/widgets/370.js +0 -1
- package/dist/widgets/405.js +0 -1
- package/dist/widgets/46.js +0 -445
- package/dist/widgets/50.js +0 -1
- package/dist/widgets/546.js +0 -1
- package/dist/widgets/648.js +0 -1
- package/dist/widgets/669.js +0 -1
- package/dist/widgets/707.js +0 -1
- package/dist/widgets/775.js +0 -1
- package/dist/widgets/78.js +0 -1
- package/dist/widgets/832.js +0 -96
- package/dist/widgets/875.js +0 -25
- package/dist/widgets/945.js +0 -1
- package/dist/widgets/968.js +0 -9
- package/dist/widgets/__federation_expose_ReleasePage.js +0 -1
- package/dist/widgets/mf-manifest.json +0 -229
- package/dist/widgets/mf-stats.json +0 -256
- package/dist/widgets/remoteEntry.js +0 -7
- package/dist/workflows/templates/dry-run.yaml +0 -37
- package/dist/workflows/templates/full-release.yaml +0 -58
- package/dist/workflows/templates/hotfix.yaml +0 -40
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/shared/dep-rewrite.ts","../../../src/shared/resolve-flow.ts","../../../src/cli/commands/stage.ts"],"names":["readFileSync","join","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;ACrGO,SAAS,eAAA,CAAgB,QAAuB,KAAA,EAAwD;AAC7G,EAAA,IAAI,MAAM,IAAA,EAAM;AAAE,IAAA,OAAO,KAAA,CAAM,IAAA;AAAA,EAAM;AACrC,EAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAG;AACxB,IAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,MAAA,EAAQ,KAAA,CAAM,aAAa,CAAC,CAAA;AAChE,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAE,KAAA,EAAO,CAAA,kDAAA,EAAqD,KAAA,CAAM,aAAa,CAAC,CAAA,CAAA,CAAA,EAAI;AAAA,IAC/F;AACA,IAAA,OAAO,QAAA,CAAS,QAAA;AAAA,EAClB;AACA,EAAA,OAAO,EAAE,OAAO,kCAAA,EAAmC;AACrD;;;ACkCA,SAAS,qBAAqB,MAAA,EAAoC;AAChE,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,EAAK,CAAE,MAAM,IAAI,CAAA,CAAE,OAAO,OAAO,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACvC,EAAA,OAAO,QAAA,GAAW,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM,CAAA,GAAI,MAAA;AAChD;AAGA,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;AAEA,SAAS,OAAA,CACP,GAAA,EACA,MAAA,EACA,cAAA,EACA,UAAA,EAC2C;AAC3C,EAAA,MAAM,SAAS,cAAA,KAAmB,MAAA;AAClC,EAAA,MAAM,OAAA,GAAU,oBAAA;AAAA,IACd,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,IAAI,cAAA,EAAe;AAAA,IAC9C,UAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,GACb,CAAC,MAAA,EAAQ,oBAAA,EAAsB,MAAM,CAAA,GACrC,CAAC,MAAA,EAAQ,oBAAA,EAAsB,MAAA,EAAQ,QAAQ,CAAA;AACnD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,MAAA,GAAS,MAAA,GAAS,KAAA,EAAO,QAAA,EAAU,EAAE,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,CAAA;AAEhG,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,EAAQ,QAAA,EAAS,CAAE,IAAA,EAAK,IAAK,UAAA,CAAW,MAAA,EAAQ,QAAA,EAAS,CAAE,IAAA,EAAK;AAC1F,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,iBAAA,EAAoB,GAAA,CAAI,IAAI,CAAA,EAAG,MAAA,GAAS,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,EAC/F;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,GACb,oBAAA,CAAqB,UAAA,CAAW,MAAA,CAAO,QAAA,EAAU,CAAA,GACjD,mBAAA,CAAoB,UAAA,CAAW,MAAA,CAAO,QAAA,EAAU,CAAA;AAEpD,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,8BAAA,EAAiC,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,EAAE,UAAU,OAAA,EAAQ;AAC7B;AAOA,eAAe,gBAAA,CACb,GAAA,EACA,MAAA,EACA,cAAA,EACA,UAAA,EACyB;AACzB,EAAA,MAAM,EAAE,UAAU,OAAA,EAAQ,GAAI,QAAQ,GAAA,EAAK,MAAA,EAAQ,gBAAgB,UAAU,CAAA;AAC7E,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAOA,YAAAA,CAAaC,IAAAA,CAAK,MAAA,EAAQ,QAAQ,CAAC,CAAC,CAAA,CAAE,OAAO,KAAK,CAAA;AAC7F,IAAA,OAAO,EAAE,MAAM,GAAA,CAAI,IAAA,EAAM,SAAS,GAAA,CAAI,cAAA,EAAgB,OAAA,EAAS,QAAA,EAAU,MAAA,EAAO;AAAA,EAClF,CAAA,SAAE;AAAU,IAAA,OAAA,EAAQ;AAAA,EAAG;AACzB;AAEA,SAAS,kBAAA,CACP,GAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,MAAM,WAAA,GAAcA,IAAAA,CAAK,MAAA,EAAQ,QAAA,CAAS,OAAO,CAAA;AACjD,EAAA,MAAM,YAAY,WAAA,CAAYA,IAAAA,CAAK,MAAA,EAAO,EAAG,kBAAkB,CAAC,CAAA;AAChE,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,KAAA,EAAO,CAAC,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,SAAS,CAAA,EAAG,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AAC/F,IAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,MAAM,CAAA,qCAAA,EAAwC,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,cAAc,CAAA,CAAE,CAAA;AAAA,IAC1F;AACA,IAAA,MAAM,MAAA,GAAS,sBAAA,CAAuBA,IAAAA,CAAK,SAAA,EAAW,SAAS,CAAC,CAAA;AAChE,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,cAAc,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACnH;AAAA,EACF,CAAA,SAAE;AAAU,IAAA,MAAA,CAAO,WAAW,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EAAG;AAEnE;AAEA,IAAO,gBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,eAAA;AAAA,EACJ,WAAA,EAAa,sHAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAmE;AACrG,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,UAAA,GAAa,MAAM,SAAA,EAAyB;AAClD,MAAA,MAAM,UAAA,GAA4B,cAAc,EAAC;AAEjD,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,UAAA,EAAY,KAAK,CAAA;AACpD,MAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,QAAA,MAAM,GAAA,GAAM,CAAA,cAAA,EAAiB,UAAA,CAAW,KAAK,CAAA,CAAA;AAC7C,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,MAAM,QAAA,GAAW,UAAA;AAEjB,MAAA,MAAM,MAAA,GAAwB,mBAAA,CAAoB,UAAA,EAAY,QAAQ,CAAA;AACtE,MAAA,MAAM,SAASA,IAAAA,CAAK,QAAA,EAAU,KAAA,CAAM,SAAS,KAAK,uBAAuB,CAAA;AACzE,MAAA,SAAA,CAAU,MAAA,EAAQ,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAErC,MAAA,MAAM,cAAA,GAAiB,SAAA,CAAU,CAAA,mDAAA,EAAsD,QAAQ,CAAA,IAAA,CAAM,CAAA;AACrG,MAAA,cAAA,CAAe,KAAA,EAAM;AACrB,MAAA,MAAM,UAAA,GAAa,MAAM,uBAAA,CAAwB,QAAA,EAAU,QAAW,MAAM,CAAA;AAC5E,MAAA,cAAA,CAAe,OAAA,CAAQ,CAAA,MAAA,EAAS,UAAA,CAAW,MAAM,CAAA,oBAAA,CAAsB,CAAA;AAEvE,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,QAAA,MAAM,GAAA,GAAM,+BAA+B,QAAQ,CAAA,CAAA,CAAA;AACnD,QAAA,IAAI,MAAM,IAAA,EAAM;AAAE,UAAA,GAAA,CAAI,IAAI,IAAA,GAAO,EAAE,QAAQ,SAAA,EAAW,IAAI,CAAA;AAAA,QAAG,CAAA,MAAO;AAAE,UAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,GAAG,CAAA;AAAA,QAAG;AAC5F,QAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,gBAAA,EAAiB;AAAA,MAC9C;AASA,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,MAAM,iBAAiB,MAAA,CAAO,SAAA,EAAW,IAAA,IAAQ,MAAA,CAAO,SAAS,cAAA,IAAkB,MAAA;AAEnF,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,sBAAsB,KAAK,CAAC,CAAA;AAE9D,MAAA,MAAM,UAAA,GAAa,UAAU,qBAAqB,CAAA;AAClD,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,MAAM,YAA8B,EAAC;AACrC,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,MAAA,EAAQ,KAAK,WAAA,EAAa;AACvD,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,IAAI,WAAW,CAAA;AACjD,QAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,GAAA;AAAA,UACnC,KAAA,CAAM,IAAI,CAAA,GAAA,KAAO,gBAAA,CAAiB,KAAK,MAAA,EAAQ,cAAA,EAAgB,UAAU,CAAC;AAAA,SAC5E;AACA,QAAA,SAAA,CAAU,IAAA,CAAK,GAAG,cAAc,CAAA;AAAA,MAClC;AACA,MAAA,UAAA,CAAW,QAAQ,CAAA,OAAA,EAAU,SAAA,CAAU,MAAM,CAAA,eAAA,EAAkB,MAAM,CAAA,CAAE,CAAA;AAEvE,MAAA,MAAM,YAAA,GAAe,UAAU,8BAA8B,CAAA;AAC7D,MAAA,YAAA,CAAa,KAAA,EAAM;AACnB,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,UAAA,CAAW,MAAA,EAAQ,KAAK,WAAA,EAAa;AACvD,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,IAAI,WAAW,CAAA;AACjD,QAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU,kBAAA,CAAmB,GAAA,EAAK,MAAA,EAAQ,SAAA,CAAU,CAAA,GAAI,KAAK,CAAE,CAAC,CAAA;AAAA,MACtF;AACA,MAAA,YAAA,CAAa,OAAA,CAAQ,CAAA,SAAA,EAAY,SAAA,CAAU,MAAM,CAAA,kBAAA,CAAoB,CAAA;AAErE,MAAAC,aAAAA,CAAcD,IAAAA,CAAK,MAAA,EAAQ,eAAe,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA,GAAI,IAAA,EAAM,OAAO,CAAA;AAE/F,MAAA,MAAM,MAAA,GAAuB,EAAE,MAAA,EAAQ,SAAA,EAAU;AACjD,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,IAAI,OAAA,GAAU;AAAA,QAChB,KAAA,EAAO,OAAA;AAAA,QACP,UAAU,CAAC;AAAA,UACT,MAAA,EAAQ,aAAa,MAAM,CAAA,CAAA;AAAA,UAC3B,OAAO,SAAA,CAAU,GAAA,CAAI,OAAK,CAAA,EAAG,GAAA,CAAI,GAAG,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,QAAA,EAAM,CAAA,CAAE,OAAO,CAAA,CAAE;AAAA,SAC5F,CAAA;AAAA,QACD,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO;AAAA,IAC5B;AAAA;AAEJ,CAAC","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":["../../../../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"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { CLIInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
interface StatusFlags {
|
|
5
|
+
flow: string;
|
|
6
|
+
json?: boolean;
|
|
7
|
+
ci?: boolean;
|
|
8
|
+
}
|
|
9
|
+
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<StatusFlags>, unknown>;
|
|
10
|
+
|
|
11
|
+
export { _default as default };
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { defineCommand, findRepoRoot, useLoader, useConfig } from '@kb-labs/sdk';
|
|
2
|
+
import { createExecaShellAdapter, computeFlowReleaseStatus } from '@kb-labs/release-manager-core';
|
|
3
|
+
|
|
4
|
+
// src/cli/commands/status.ts
|
|
5
|
+
|
|
6
|
+
// src/cli/commands/status.ts
|
|
7
|
+
var CANDIDATE_WORKFLOWS = ["release-build-candidate.yml", "release-deliver-candidate.yml"];
|
|
8
|
+
async function fetchRecentCandidateRuns(shell, cwd, limit) {
|
|
9
|
+
const runs = [];
|
|
10
|
+
for (const workflow of CANDIDATE_WORKFLOWS) {
|
|
11
|
+
const res = await shell.exec(
|
|
12
|
+
"gh",
|
|
13
|
+
[
|
|
14
|
+
"run",
|
|
15
|
+
"list",
|
|
16
|
+
`--workflow=${workflow}`,
|
|
17
|
+
"--limit",
|
|
18
|
+
String(limit),
|
|
19
|
+
"--json",
|
|
20
|
+
"headSha,status,conclusion,createdAt"
|
|
21
|
+
],
|
|
22
|
+
{ cwd, timeout: 15e3 }
|
|
23
|
+
);
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
return { runs, error: res.stderr.trim() || `gh run list failed for ${workflow}` };
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const parsed = JSON.parse(res.stdout);
|
|
29
|
+
runs.push(...parsed.map((r) => ({ workflow, ...r })));
|
|
30
|
+
} catch {
|
|
31
|
+
return { runs, error: `Could not parse gh output for ${workflow}` };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
runs.sort((a, b) => a.createdAt < b.createdAt ? 1 : -1);
|
|
35
|
+
return { runs };
|
|
36
|
+
}
|
|
37
|
+
function buildStatusSections(status, ci, symbols) {
|
|
38
|
+
const sections = [];
|
|
39
|
+
sections.push({
|
|
40
|
+
header: "Stable (git)",
|
|
41
|
+
items: status.git.tag ? [
|
|
42
|
+
`Tag: ${status.git.tag} (${status.git.version})`,
|
|
43
|
+
`Commit: ${status.git.commit?.slice(0, 12) ?? "unknown"}`,
|
|
44
|
+
`Tagged at: ${status.git.committedAt ?? "unknown"}`
|
|
45
|
+
] : ["No stable tag found for this flow"]
|
|
46
|
+
});
|
|
47
|
+
sections.push({
|
|
48
|
+
header: `npm (${status.npm.registry})`,
|
|
49
|
+
items: [
|
|
50
|
+
`"${status.npm.stableDistTag}": ${status.npm.stableVersion ?? (status.npm.stableDrift ? "DRIFT \u2014 packages disagree" : "unresolved")}`,
|
|
51
|
+
`"${status.npm.canaryDistTag}": ${status.npm.canaryVersion ?? (status.npm.canaryDrift ? "DRIFT \u2014 packages disagree" : "unresolved")}`,
|
|
52
|
+
`Sampled: ${status.npm.perPackage.map((p) => p.name).join(", ")}`
|
|
53
|
+
]
|
|
54
|
+
});
|
|
55
|
+
if (ci) {
|
|
56
|
+
if (ci.error) {
|
|
57
|
+
sections.push({ header: "Recent candidate CI", items: [`${symbols.warning} ${ci.error}`] });
|
|
58
|
+
} else if (ci.runs.length === 0) {
|
|
59
|
+
sections.push({ header: "Recent candidate CI", items: ["No recent runs found"] });
|
|
60
|
+
} else {
|
|
61
|
+
sections.push({
|
|
62
|
+
header: "Recent candidate CI",
|
|
63
|
+
items: ci.runs.slice(0, 8).map((r) => {
|
|
64
|
+
const icon = r.conclusion === "success" ? symbols.success : r.conclusion ? symbols.error : symbols.warning;
|
|
65
|
+
return `${icon} ${r.workflow.replace(".yml", "")} \u2014 ${r.headSha.slice(0, 12)} \u2014 ${r.conclusion ?? r.status} (${r.createdAt})`;
|
|
66
|
+
})
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (status.verdict.warnings.length > 0) {
|
|
71
|
+
sections.push({
|
|
72
|
+
header: "Warnings",
|
|
73
|
+
items: status.verdict.warnings.map((w) => `${symbols.warning} ${w}`)
|
|
74
|
+
});
|
|
75
|
+
} else {
|
|
76
|
+
sections.push({ items: [`${symbols.success} Stable tag and npm agree; no drift detected`] });
|
|
77
|
+
}
|
|
78
|
+
return sections;
|
|
79
|
+
}
|
|
80
|
+
var status_default = defineCommand({
|
|
81
|
+
id: "release:status",
|
|
82
|
+
description: "Show what is actually stable vs. candidate for a release flow (git tag, npm dist-tags, recent candidate CI)",
|
|
83
|
+
handler: {
|
|
84
|
+
async execute(ctx, input) {
|
|
85
|
+
const { flags } = input;
|
|
86
|
+
const cwd = ctx.cwd || process.cwd();
|
|
87
|
+
const repoRoot = await findRepoRoot(cwd);
|
|
88
|
+
if (!flags.flow) {
|
|
89
|
+
ctx.ui?.error?.("--flow is required", { hint: "Run: kb release status --flow platform" });
|
|
90
|
+
return { ok: false, error: "--flow is required" };
|
|
91
|
+
}
|
|
92
|
+
const loader = useLoader(`Checking release status for "${flags.flow}"...`);
|
|
93
|
+
loader.start();
|
|
94
|
+
const config = { ...await useConfig() };
|
|
95
|
+
const shell = createExecaShellAdapter();
|
|
96
|
+
let status;
|
|
97
|
+
try {
|
|
98
|
+
status = await computeFlowReleaseStatus({ cwd: repoRoot, config, flow: flags.flow, shell });
|
|
99
|
+
} catch (err) {
|
|
100
|
+
loader.fail("Failed to compute release status");
|
|
101
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
102
|
+
ctx.ui?.error?.(message);
|
|
103
|
+
return { ok: false, error: message };
|
|
104
|
+
}
|
|
105
|
+
const ci = flags.ci === false ? void 0 : await fetchRecentCandidateRuns(shell, repoRoot, 5);
|
|
106
|
+
loader.succeed(
|
|
107
|
+
status.verdict.ok ? `"${flags.flow}" is clean \u2014 stable tag and npm agree` : `"${flags.flow}" has ${status.verdict.warnings.length} warning(s)`
|
|
108
|
+
);
|
|
109
|
+
ctx.platform?.logger?.info?.("Release status computed", {
|
|
110
|
+
flow: flags.flow,
|
|
111
|
+
ok: status.verdict.ok,
|
|
112
|
+
warnings: status.verdict.warnings.length
|
|
113
|
+
});
|
|
114
|
+
if (flags.json) {
|
|
115
|
+
ctx.ui?.json?.({ ...status, ci });
|
|
116
|
+
} else {
|
|
117
|
+
ctx.ui?.sideBox?.({
|
|
118
|
+
title: `Release status \u2014 ${flags.flow}`,
|
|
119
|
+
sections: buildStatusSections(status, ci, ctx.ui.symbols),
|
|
120
|
+
status: status.verdict.ok ? "success" : "warning"
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
return { ok: true, result: { ...status, ci } };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
export { status_default as default };
|
|
129
|
+
//# sourceMappingURL=status.js.map
|
|
130
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +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"]}
|
|
@@ -5,6 +5,7 @@ import { CleanInstallResult } from '@kb-labs/release-manager-core';
|
|
|
5
5
|
interface VerifyCleanInstallFlags {
|
|
6
6
|
tarball: string;
|
|
7
7
|
name: string;
|
|
8
|
+
registry?: string;
|
|
8
9
|
json?: boolean;
|
|
9
10
|
}
|
|
10
11
|
declare const _default: _kb_labs_shared_command_kit.CommandHandlerV3<unknown, CLIInput<VerifyCleanInstallFlags>, CleanInstallResult>;
|
|
@@ -17,7 +17,7 @@ var verify_clean_install_default = defineCommand({
|
|
|
17
17
|
}
|
|
18
18
|
return { ok: false, error: "Command failed" };
|
|
19
19
|
}
|
|
20
|
-
const result = await verifyCleanInstall(flags.tarball, flags.name);
|
|
20
|
+
const result = await verifyCleanInstall(flags.tarball, flags.name, [], "npm", flags.registry);
|
|
21
21
|
if (!result.ok) {
|
|
22
22
|
if (flags.json) {
|
|
23
23
|
ctx.ui?.json?.({ ok: false, result });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/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":["../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/cli/commands/verify.ts"],"names":[],"mappings":";;;;;;;AAuBA,SAAS,iBAAiB,GAAA,EAAiE;AACzF,EAAA,IAAI,CAAC,GAAA,CAAI,cAAA,IAAkB,CAAC,IAAI,WAAA,EAAa;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,YAAA,GAAe,SAAS,GAAA,CAAI,cAAA,CAAe,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAG,CAAA;AACrE,EAAA,MAAM,SAAA,GAAY,SAAS,GAAA,CAAI,WAAA,CAAY,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,GAAG,CAAA;AAC/D,EAAA,OAAO,SAAA,GAAY,YAAA;AACrB;AAEA,SAAS,mBAAA,CACP,OAAA,EACA,WAAA,EACA,WAAA,EACA,QACA,OAAA,EAC6C;AAC7C,EAAA,MAAM,QAAA,GAAwD;AAAA,IAC5D;AAAA,MACE,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO;AAAA,QACL,CAAA,cAAA,EAAiB,WAAA,GAAc,KAAA,GAAQ,IAAI,CAAA,CAAA;AAAA,QAC3C,CAAA,sBAAA,EAAyB,WAAA,GAAc,KAAA,GAAQ,IAAI,CAAA,CAAA;AAAA,QACnD,CAAA,QAAA,EAAW,OAAA,GAAU,mBAAA,GAAsB,SAAS,CAAA;AAAA;AACtD;AACF,GACF;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,MAAA,EAAQ,QAAA;AAAA,MACR,KAAA,EAAO,OAAO,GAAA,CAAI,CAAA,KAAA,KAAS,GAAG,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE;AAAA,KACvD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,IAAO,iBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,gBAAA;AAAA,EACJ,WAAA,EAAa,4BAAA;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,MAAM,UAAA,GAAa,MAAM,SAAA,EAAyB;AAClD,MAAA,MAAM,MAAA,GAAwB;AAAA,QAC5B,GAAG,UAAA;AAAA,QACH,GAAI,KAAA,CAAM,IAAA,IAAQ,EAAE,IAAA,EAAM,MAAM,IAAA;AAAK,OACvC;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY;AAAA,QAC7B,GAAA,EAAK,QAAA;AAAA,QACL,MAAA;AAAA,QACA,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,cAAc,KAAA,CAAM;AAAA,OACrB,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,MAAA,GAAS,CAAA;AAC3C,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,gBAAgB,CAAA;AAEvD,MAAA,IAAI,OAAA,GAAU,IAAA;AACd,MAAA,MAAM,SAAmB,EAAC;AAE1B,MAAA,IAAI,KAAA,CAAM,eAAe,CAAA,IAAK,CAAC,WAAA,EAAa;AAC1C,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,MAAA,CAAO,KAAK,0CAA0C,CAAA;AAAA,MACxD;AAEA,MAAA,IAAI,KAAA,CAAM,kBAAkB,CAAA,IAAK,WAAA,EAAa;AAC5C,QAAA,OAAA,GAAU,KAAA;AACV,QAAA,MAAA,CAAO,KAAK,gDAAgD,CAAA;AAAA,MAC9D;AAEA,MAAA,IAAI,KAAA,CAAM,aAAa,CAAA,EAAG;AACxB,QAAA,MAAM,YAAA,GAAe,KAAA,CAAM,aAAa,CAAA,CAAE,MAAM,GAAG,CAAA;AACnD,QAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB;AAAA,UAClC,GAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,MAAA;AAAA,UACV,aAAA,EAAe,OAAO,GAAA,EAAK;AAAA,SAC5B,CAAA;AACD,QAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa;AAAA,UACjC,GAAA,EAAK,QAAA;AAAA,UACL,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,aAAA,EAAe,MAAA,CAAO,SAAA,EAAW,aAAA,IAAiB;AAAC,SACpD,CAAA;AACD,QAAA,MAAM,eAAA,GAAkB,QAAQ,IAAA,CAAK,CAAA,MAAA,KAAU,aAAa,QAAA,CAAS,MAAA,CAAO,IAAI,CAAC,CAAA;AACjF,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,OAAA,GAAU,KAAA;AACV,UAAA,MAAA,CAAO,KAAK,CAAA,0BAAA,EAA6B,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,QACpE;AAAA,MACF;AAEA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,EAAE,KAAA,EAAO,SAAS,WAAA,EAAa,WAAA,EAAa,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,MAC3E,CAAA,MAAO;AACL,QAAA,GAAA,CAAI,IAAI,OAAA,GAAU;AAAA,UAChB,KAAA,EAAO,sBAAA;AAAA,UACP,QAAA,EAAU,oBAAoB,OAAA,EAAS,WAAA,EAAa,aAAa,MAAA,EAAQ,GAAA,CAAI,GAAG,OAAO,CAAA;AAAA,UACvF,MAAA,EAAQ,UAAU,SAAA,GAAY;AAAA,SAC/B,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,MAAA,GAAS;AAAA,QACb,KAAA,EAAO,OAAA;AAAA,QACP,IAAA;AAAA,QACA,MAAA;AAAA,QACA,gBAAA,EAAkB;AAAA,OACpB;AACA,MAAA,OAAO,OAAA,GACH,EAAE,EAAA,EAAI,IAAA,EAAM,MAAA,EAAO,GACnB,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,6BAAA,EAA+B,MAAA,EAAO;AAAA,IAChE;AAAA;AAEJ,CAAC","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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/shared/utils.ts","../../../src/shared/resolve-plan.ts","../../../src/cli/commands/version.ts"],"names":["planRelease"],"mappings":"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","file":"version.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Plan resolution shared by the atomic release steps that must act on the\n * SAME plan (`release:version` → `release:git`).\n *\n * Why this exists: each step used to call planRelease() independently and\n * hope the results matched. They don't have to — planning is a function of\n * disk state, and the step in between mutates exactly that state. A plan\n * re-derived after `release:version` sees the bumped versions as the new\n * baseline and bumps again, so the tag/commit message end up one version\n * ahead of the package.json files actually being committed.\n *\n * The plan written by `release:plan` is the single source of truth for a\n * pipeline run. It is only reused when it provably describes the current\n * state of the working tree, so a stale artifact (plan.json is committed to\n * the repo, so one is always present) can never be adopted silently.\n */\n\nimport { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport {\n planRelease,\n type ReleasePlan,\n type ReleaseConfig,\n type VersionBump,\n type ReleaseChannel,\n} from '@kb-labs/release-manager-core';\nimport { scopeToDir } from './utils';\n\n/**\n * Which side of the version bump the caller sits on — determines which field\n * of the plan the on-disk package.json versions are expected to match.\n */\nexport type PlanStage =\n /** `release:version`: bump not applied yet, disk should still be at currentVersion. */\n | 'pre-bump'\n /** `release:git`: bump already applied, disk should be at nextVersion. */\n | 'post-bump';\n\nexport interface ResolvePlanOptions {\n repoRoot: string;\n config: ReleaseConfig;\n scope?: string;\n flow?: string;\n bumpOverride?: VersionBump;\n channel?: ReleaseChannel;\n stage: PlanStage;\n}\n\nexport interface ResolvedPlan {\n plan: ReleasePlan;\n /** 'artifact' — reused the plan from `release:plan`; 'computed' — planned fresh. */\n source: 'artifact' | 'computed';\n /** Why the artifact was rejected, when source is 'computed' and one existed. */\n reason?: string;\n}\n\nexport function releasePlanPath(repoRoot: string, scope?: string): string {\n return join(repoRoot, '.kb', 'release', 'plans', scopeToDir(scope ?? 'root'), 'current', 'plan.json');\n}\n\nasync function readDiskVersion(packagePath: string): Promise<string | undefined> {\n try {\n const raw = await readFile(join(packagePath, 'package.json'), 'utf-8');\n return (JSON.parse(raw) as { version?: string }).version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Reject the persisted plan unless every package it covers is on disk at the\n * version this stage expects. That single check subsumes staleness, partial\n * runs, and out-of-band edits: any of them show up as a version mismatch.\n */\nasync function validateAgainstDisk(plan: ReleasePlan, stage: PlanStage): Promise<string | undefined> {\n const expectedField = stage === 'pre-bump' ? 'currentVersion' : 'nextVersion';\n\n for (const pkg of plan.packages) {\n const onDisk = await readDiskVersion(pkg.path);\n if (onDisk === undefined) {\n return `${pkg.name}: package.json not readable at ${pkg.path}`;\n }\n const expected = pkg[expectedField];\n if (onDisk !== expected) {\n return `${pkg.name}: expected ${expectedField} ${expected} on disk, found ${onDisk}`;\n }\n }\n\n return undefined;\n}\n\n/**\n * Load the plan produced by `release:plan` when it matches this run and the\n * working tree; otherwise plan fresh.\n */\nexport async function resolvePlan(options: ResolvePlanOptions): Promise<ResolvedPlan> {\n const { repoRoot, config, scope, flow, bumpOverride, channel, stage } = options;\n\n const computeFresh = async (reason?: string): Promise<ResolvedPlan> => ({\n plan: await planRelease({ cwd: repoRoot, config, scope, flow, bumpOverride, channel }),\n source: 'computed',\n ...(reason ? { reason } : {}),\n });\n\n let persisted: ReleasePlan;\n try {\n persisted = JSON.parse(await readFile(releasePlanPath(repoRoot, scope), 'utf-8')) as ReleasePlan;\n } catch {\n return computeFresh();\n }\n\n if (!Array.isArray(persisted.packages) || persisted.packages.length === 0) {\n return computeFresh('persisted plan has no packages');\n }\n\n // All flows share one scope-derived artifact path, so an unrelated flow's\n // plan can legitimately be sitting there. Never adopt it.\n if ((persisted.flow ?? undefined) !== (flow ?? undefined)) {\n return computeFresh(`persisted plan is for flow \"${persisted.flow ?? '<none>'}\", requested \"${flow ?? '<none>'}\"`);\n }\n if ((persisted.scope ?? undefined) !== (scope ?? undefined)) {\n return computeFresh(`persisted plan is for scope \"${persisted.scope ?? '<none>'}\", requested \"${scope ?? '<none>'}\"`);\n }\n if (channel !== undefined && persisted.channel !== channel) {\n return computeFresh(`persisted plan is for channel \"${persisted.channel}\", requested \"${channel}\"`);\n }\n\n const mismatch = await validateAgainstDisk(persisted, stage);\n if (mismatch) {\n return computeFresh(`persisted plan does not match working tree (${mismatch})`);\n }\n\n return { plan: persisted, source: 'artifact' };\n}\n","/**\n * Release version command — bump versions in package.json files.\n * Atomic step: reads plan, updates package.json versions, emits output marker for workflow.\n */\n\nimport { defineCommand, type CLIInput, type CommandResult, type PluginContextV3, useLoader, useConfig } from '@kb-labs/sdk';\nimport {\n planRelease,\n updatePackageVersions,\n type ReleaseConfig,\n type VersionBump,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { resolvePlan } from '../../shared/resolve-plan';\n\ninterface VersionFlags {\n scope?: string;\n flow?: string;\n bump?: 'patch' | 'minor' | 'major' | 'auto';\n 'dry-run'?: boolean;\n json?: boolean;\n}\n\ntype ReleaseVersionResult = CommandResult<unknown>;\n\nfunction buildVersionSections(\n updates: Array<{ package: string; from: string; to: string; updated: boolean }>,\n dryRun: boolean,\n symbols: { success: string; error: string },\n): Array<{ header?: string; items: string[] }> {\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n if (dryRun) {\n sections.push({\n header: 'Would update (dry-run)',\n items: updates.map(u => `${symbols.success} ${u.package}: ${u.from} → ${u.to}`),\n });\n return sections;\n }\n\n const succeeded = updates.filter(u => u.updated);\n const failed = updates.filter(u => !u.updated);\n\n if (succeeded.length > 0) {\n sections.push({\n header: 'Updated',\n items: succeeded.map(u => `${symbols.success} ${u.package}: ${u.from} → ${u.to}`),\n });\n }\n\n if (failed.length > 0) {\n sections.push({\n header: 'Failed',\n items: failed.map(u => `${symbols.error} ${u.package}: ${u.from} → ${u.to}`),\n });\n }\n\n return sections;\n}\n\nexport default defineCommand({\n id: 'release:version',\n description: 'Bump package.json versions according to release plan',\n\n handler: {\n async intent(ctx: PluginContextV3, input: CLIInput<VersionFlags>) {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = { ...fileConfig, ...(flags.bump && { bump: flags.bump }) };\n\n const plan = await planRelease({\n cwd: repoRoot,\n config,\n scope: flags.scope,\n flow: flags.flow,\n bumpOverride: flags.bump as VersionBump | undefined,\n });\n\n return {\n summary: `Bump versions for ${plan.packages.length} package(s)`,\n operations: plan.packages.map(p => ({\n type: 'update' as const,\n resource: 'package-version',\n details: { package: p.name, from: p.currentVersion ?? 'unknown', to: p.nextVersion ?? 'unknown' },\n })),\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<VersionFlags>): Promise<ReleaseVersionResult> {\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 planLoader = useLoader('Planning version bumps...');\n planLoader.start();\n // `flow` is mandatory here: without it planRelease() falls back to the\n // global package set, and a lockstep strategy then levels EVERY package\n // in the repo — including other flows' — onto this flow's version.\n const { plan, source, reason } = await resolvePlan({\n repoRoot,\n config,\n scope: flags.scope,\n flow: flags.flow,\n bumpOverride: flags.bump as VersionBump | undefined,\n stage: 'pre-bump',\n });\n ctx.platform?.logger?.debug?.('Release plan resolved', { source, reason });\n planLoader.succeed(\n `${source === 'artifact' ? 'Loaded' : 'Planned'} ${plan.packages.length} package(s)`,\n );\n\n if (plan.packages.length === 0) {\n const msg = `No packages found${flags.scope ? ` matching scope: ${flags.scope}` : ''}`;\n if (flags.json) { ctx.ui?.json?.({ ok: true, updated: 0, updates: [], message: msg }); }\n else { ctx.ui?.write?.(msg); }\n console.log('::kb-output::' + JSON.stringify({ ok: true, updated: 0 }));\n return { ok: true, result: { ok: true, updated: 0, updates: [] } };\n }\n\n const versionLoader = useLoader(`Bumping ${plan.packages.length} package version(s)...`);\n versionLoader.start();\n\n const updates = await updatePackageVersions(plan);\n const updated = updates.filter(u => u.updated).length;\n const ok = updates.every(u => u.updated);\n\n if (ok) {\n versionLoader.succeed(`Bumped ${updated} package version(s)`);\n } else {\n versionLoader.fail(`${updates.filter(u => !u.updated).length} update(s) failed`);\n }\n\n console.log('::kb-output::' + JSON.stringify({ ok, updated }));\n\n if (flags.json) {\n ctx.ui?.json?.({ ok, updated, updates });\n return ok ? { ok: true, result: { ok, updated, updates } } : { ok: false, error: 'Command failed', result: { ok, updated, updates } };\n }\n\n ctx.ui?.sideBox?.({\n title: 'Version Bump',\n sections: buildVersionSections(updates, false, ctx.ui.symbols),\n status: ok ? 'success' : 'error',\n });\n\n return ok ? { ok: true, result: { ok, updated, updates } } : { ok: false, error: 'Command failed', result: { ok, updated, updates } };\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/utils.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/shared/resolve-plan.ts","../../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/cli/commands/version.ts"],"names":["planRelease"],"mappings":"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","file":"version.js","sourcesContent":["export { findRepoRoot } from '@kb-labs/sdk';\nexport { resolveScopePath } from './resolve-scope';\n\n/**\n * Converts scope to safe directory name\n */\nexport function scopeToDir(scope: string): string {\n return scope\n .replace(/^@/, '')\n .replace(/\\//g, '-')\n .replace(/:/g, '-')\n .replace(/\\*/g, '');\n}\n\n/**\n * Converts safe directory name back to scope\n */\nexport function dirToScope(dirName: string): string {\n if (dirName === 'root') {\n return 'root';\n }\n\n const parts = dirName.split('-');\n if (parts.length >= 2) {\n return '@' + parts[0] + '-' + parts[1] + '/' + parts.slice(2).join('-');\n }\n\n return dirName;\n}\n","/**\n * Plan resolution shared by the atomic release steps that must act on the\n * SAME plan (`release:version` → `release:git`).\n *\n * Why this exists: each step used to call planRelease() independently and\n * hope the results matched. They don't have to — planning is a function of\n * disk state, and the step in between mutates exactly that state. A plan\n * re-derived after `release:version` sees the bumped versions as the new\n * baseline and bumps again, so the tag/commit message end up one version\n * ahead of the package.json files actually being committed.\n *\n * The plan written by `release:plan` is the single source of truth for a\n * pipeline run. It is only reused when it provably describes the current\n * state of the working tree, so a stale artifact (plan.json is committed to\n * the repo, so one is always present) can never be adopted silently.\n */\n\nimport { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport {\n planRelease,\n type ReleasePlan,\n type ReleaseConfig,\n type VersionBump,\n type ReleaseChannel,\n} from '@kb-labs/release-manager-core';\nimport { scopeToDir } from './utils';\n\n/**\n * Which side of the version bump the caller sits on — determines which field\n * of the plan the on-disk package.json versions are expected to match.\n */\nexport type PlanStage =\n /** `release:version`: bump not applied yet, disk should still be at currentVersion. */\n | 'pre-bump'\n /** `release:git`: bump already applied, disk should be at nextVersion. */\n | 'post-bump';\n\nexport interface ResolvePlanOptions {\n repoRoot: string;\n config: ReleaseConfig;\n scope?: string;\n flow?: string;\n bumpOverride?: VersionBump;\n channel?: ReleaseChannel;\n stage: PlanStage;\n}\n\nexport interface ResolvedPlan {\n plan: ReleasePlan;\n /** 'artifact' — reused the plan from `release:plan`; 'computed' — planned fresh. */\n source: 'artifact' | 'computed';\n /** Why the artifact was rejected, when source is 'computed' and one existed. */\n reason?: string;\n}\n\nexport function releasePlanPath(repoRoot: string, scope?: string): string {\n return join(repoRoot, '.kb', 'release', 'plans', scopeToDir(scope ?? 'root'), 'current', 'plan.json');\n}\n\nasync function readDiskVersion(packagePath: string): Promise<string | undefined> {\n try {\n const raw = await readFile(join(packagePath, 'package.json'), 'utf-8');\n return (JSON.parse(raw) as { version?: string }).version;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Reject the persisted plan unless every package it covers is on disk at the\n * version this stage expects. That single check subsumes staleness, partial\n * runs, and out-of-band edits: any of them show up as a version mismatch.\n */\nasync function validateAgainstDisk(plan: ReleasePlan, stage: PlanStage): Promise<string | undefined> {\n const expectedField = stage === 'pre-bump' ? 'currentVersion' : 'nextVersion';\n\n for (const pkg of plan.packages) {\n const onDisk = await readDiskVersion(pkg.path);\n if (onDisk === undefined) {\n return `${pkg.name}: package.json not readable at ${pkg.path}`;\n }\n const expected = pkg[expectedField];\n if (onDisk !== expected) {\n return `${pkg.name}: expected ${expectedField} ${expected} on disk, found ${onDisk}`;\n }\n }\n\n return undefined;\n}\n\n/**\n * Load the plan produced by `release:plan` when it matches this run and the\n * working tree; otherwise plan fresh.\n */\nexport async function resolvePlan(options: ResolvePlanOptions): Promise<ResolvedPlan> {\n const { repoRoot, config, scope, flow, bumpOverride, channel, stage } = options;\n\n const computeFresh = async (reason?: string): Promise<ResolvedPlan> => ({\n plan: await planRelease({ cwd: repoRoot, config, scope, flow, bumpOverride, channel }),\n source: 'computed',\n ...(reason ? { reason } : {}),\n });\n\n let persisted: ReleasePlan;\n try {\n persisted = JSON.parse(await readFile(releasePlanPath(repoRoot, scope), 'utf-8')) as ReleasePlan;\n } catch {\n return computeFresh();\n }\n\n if (!Array.isArray(persisted.packages) || persisted.packages.length === 0) {\n return computeFresh('persisted plan has no packages');\n }\n\n // All flows share one scope-derived artifact path, so an unrelated flow's\n // plan can legitimately be sitting there. Never adopt it.\n if ((persisted.flow ?? undefined) !== (flow ?? undefined)) {\n return computeFresh(`persisted plan is for flow \"${persisted.flow ?? '<none>'}\", requested \"${flow ?? '<none>'}\"`);\n }\n if ((persisted.scope ?? undefined) !== (scope ?? undefined)) {\n return computeFresh(`persisted plan is for scope \"${persisted.scope ?? '<none>'}\", requested \"${scope ?? '<none>'}\"`);\n }\n if (channel !== undefined && persisted.channel !== channel) {\n return computeFresh(`persisted plan is for channel \"${persisted.channel}\", requested \"${channel}\"`);\n }\n\n const mismatch = await validateAgainstDisk(persisted, stage);\n if (mismatch) {\n return computeFresh(`persisted plan does not match working tree (${mismatch})`);\n }\n\n return { plan: persisted, source: 'artifact' };\n}\n","/**\n * Release version command — bump versions in package.json files.\n * Atomic step: reads plan, updates package.json versions, emits output marker for workflow.\n */\n\nimport { defineCommand, type CLIInput, type CommandResult, type PluginContextV3, useLoader, useConfig } from '@kb-labs/sdk';\nimport {\n planRelease,\n updatePackageVersions,\n type ReleaseConfig,\n type VersionBump,\n} from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { resolvePlan } from '../../shared/resolve-plan';\n\ninterface VersionFlags {\n scope?: string;\n flow?: string;\n bump?: 'patch' | 'minor' | 'major' | 'auto';\n 'dry-run'?: boolean;\n json?: boolean;\n}\n\ntype ReleaseVersionResult = CommandResult<unknown>;\n\nfunction buildVersionSections(\n updates: Array<{ package: string; from: string; to: string; updated: boolean }>,\n dryRun: boolean,\n symbols: { success: string; error: string },\n): Array<{ header?: string; items: string[] }> {\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n if (dryRun) {\n sections.push({\n header: 'Would update (dry-run)',\n items: updates.map(u => `${symbols.success} ${u.package}: ${u.from} → ${u.to}`),\n });\n return sections;\n }\n\n const succeeded = updates.filter(u => u.updated);\n const failed = updates.filter(u => !u.updated);\n\n if (succeeded.length > 0) {\n sections.push({\n header: 'Updated',\n items: succeeded.map(u => `${symbols.success} ${u.package}: ${u.from} → ${u.to}`),\n });\n }\n\n if (failed.length > 0) {\n sections.push({\n header: 'Failed',\n items: failed.map(u => `${symbols.error} ${u.package}: ${u.from} → ${u.to}`),\n });\n }\n\n return sections;\n}\n\nexport default defineCommand({\n id: 'release:version',\n description: 'Bump package.json versions according to release plan',\n\n handler: {\n async intent(ctx: PluginContextV3, input: CLIInput<VersionFlags>) {\n const { flags } = input;\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = { ...fileConfig, ...(flags.bump && { bump: flags.bump }) };\n\n const plan = await planRelease({\n cwd: repoRoot,\n config,\n scope: flags.scope,\n flow: flags.flow,\n bumpOverride: flags.bump as VersionBump | undefined,\n });\n\n return {\n summary: `Bump versions for ${plan.packages.length} package(s)`,\n operations: plan.packages.map(p => ({\n type: 'update' as const,\n resource: 'package-version',\n details: { package: p.name, from: p.currentVersion ?? 'unknown', to: p.nextVersion ?? 'unknown' },\n })),\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<VersionFlags>): Promise<ReleaseVersionResult> {\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 planLoader = useLoader('Planning version bumps...');\n planLoader.start();\n // `flow` is mandatory here: without it planRelease() falls back to the\n // global package set, and a lockstep strategy then levels EVERY package\n // in the repo — including other flows' — onto this flow's version.\n const { plan, source, reason } = await resolvePlan({\n repoRoot,\n config,\n scope: flags.scope,\n flow: flags.flow,\n bumpOverride: flags.bump as VersionBump | undefined,\n stage: 'pre-bump',\n });\n ctx.platform?.logger?.debug?.('Release plan resolved', { source, reason });\n planLoader.succeed(\n `${source === 'artifact' ? 'Loaded' : 'Planned'} ${plan.packages.length} package(s)`,\n );\n\n if (plan.packages.length === 0) {\n const msg = `No packages found${flags.scope ? ` matching scope: ${flags.scope}` : ''}`;\n if (flags.json) { ctx.ui?.json?.({ ok: true, updated: 0, updates: [], message: msg }); }\n else { ctx.ui?.write?.(msg); }\n console.log('::kb-output::' + JSON.stringify({ ok: true, updated: 0 }));\n return { ok: true, result: { ok: true, updated: 0, updates: [] } };\n }\n\n const versionLoader = useLoader(`Bumping ${plan.packages.length} package version(s)...`);\n versionLoader.start();\n\n const updates = await updatePackageVersions(plan);\n const updated = updates.filter(u => u.updated).length;\n const ok = updates.every(u => u.updated);\n\n if (ok) {\n versionLoader.succeed(`Bumped ${updated} package version(s)`);\n } else {\n versionLoader.fail(`${updates.filter(u => !u.updated).length} update(s) failed`);\n }\n\n console.log('::kb-output::' + JSON.stringify({ ok, updated }));\n\n if (flags.json) {\n ctx.ui?.json?.({ ok, updated, updates });\n return ok ? { ok: true, result: { ok, updated, updates } } : { ok: false, error: 'Command failed', result: { ok, updated, updates } };\n }\n\n ctx.ui?.sideBox?.({\n title: 'Version Bump',\n sections: buildVersionSections(updates, false, ctx.ui.symbols),\n status: ok ? 'success' : 'error',\n });\n\n return ok ? { ok: true, result: { ok, updated, updates } } : { ok: false, error: 'Command failed', result: { ok, updated, updates } };\n },\n },\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["
|
|
1
|
+
{"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/release/manager-cli/src/contracts/release.schema.ts"],"names":[],"mappings":";;;AAEO,IAAM,iBAAA,GAAoB,EAC9B,MAAA,CAAO;AAAA,EACN,UAAU,CAAA,CAAE,KAAA;AAAA,IACV,EAAE,MAAA,CAAO;AAAA,MACP,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,MACf,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,MACf,cAAA,EAAgB,EAAE,MAAA,EAAO;AAAA,MACzB,WAAA,EAAa,EAAE,MAAA,EAAO;AAAA,MACtB,IAAA,EAAM,EAAE,IAAA,CAAK,CAAC,SAAS,OAAA,EAAS,OAAA,EAAS,MAAM,CAAU,CAAA;AAAA,MACzD,WAAA,EAAa,EAAE,OAAA,EAAQ;AAAA,MACvB,cAAc,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,KAC5C;AAAA,GACH;AAAA,EACA,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,EACnB,eAAA,EAAiB,EAAE,OAAA,EAAQ;AAAA,EAC3B,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,QAAQ,CAAU;AAC/C,CAAC,EACA,WAAA;AAEI,IAAM,mBAAA,GAAsB,EAChC,MAAA,CAAO;AAAA,EACN,aAAA,EAAe,CAAA,CAAE,OAAA,CAAQ,KAAK,CAAA;AAAA,EAC9B,EAAA,EAAI,EAAE,MAAA,EAAO;AAAA,EACb,OAAA,EAAS,EACN,MAAA,CAAO;AAAA,IACN,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,IACf,GAAA,EAAK,EAAE,MAAA,EAAO;AAAA,IACd,MAAA,EAAQ,EAAE,MAAA,EAAO;AAAA,IACjB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC7B,MAAA,EAAQ,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAC9B,EACA,WAAA,EAAY;AAAA,EACf,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,YAAY,YAAA,EAAc,YAAA,EAAc,WAAA,EAAa,UAAU,CAAU,CAAA;AAAA,EACpG,IAAA,EAAM,kBAAkB,QAAA,EAAS;AAAA,EACjC,MAAA,EAAQ,EACL,MAAA,CAAO;AAAA,IACN,EAAA,EAAI,EAAE,OAAA,EAAQ;AAAA,IACd,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC7B,WAAW,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IACxC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC/B,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS;AAAA,IAC/C,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,IACnB,QAAQ,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,GACtC,EACA,WAAA;AACL,CAAC,EACA,WAAA","file":"release.schema.js","sourcesContent":["import { z } from 'zod';\n\nexport const ReleasePlanSchema = z\n .object({\n packages: z.array(\n z.object({\n name: z.string(),\n path: z.string(),\n currentVersion: z.string(),\n nextVersion: z.string(),\n bump: z.enum(['patch', 'minor', 'major', 'auto'] as const),\n isPublished: z.boolean(),\n dependencies: z.array(z.string()).optional(),\n })\n ),\n strategy: z.string(),\n registry: z.string(),\n rollbackEnabled: z.boolean(),\n channel: z.enum(['stable', 'canary'] as const),\n })\n .passthrough();\n\nexport const ReleaseReportSchema = z\n .object({\n schemaVersion: z.literal('1.0'),\n ts: z.string(),\n context: z\n .object({\n repo: z.string(),\n cwd: z.string(),\n branch: z.string(),\n profile: z.string().optional(),\n dryRun: z.boolean().optional(),\n })\n .passthrough(),\n stage: z.enum(['planning', 'checking', 'versioning', 'publishing', 'verifying', 'rollback'] as const),\n plan: ReleasePlanSchema.optional(),\n result: z\n .object({\n ok: z.boolean(),\n version: z.string().optional(),\n published: z.array(z.string()).optional(),\n changelog: z.string().optional(),\n checks: z.record(z.string(), z.any()).optional(),\n timingMs: z.number(),\n errors: z.array(z.string()).optional(),\n })\n .passthrough(),\n })\n .passthrough();\n\nexport type ReleasePlanContract = z.infer<typeof ReleasePlanSchema>;\nexport type ReleaseReportContract = z.infer<typeof ReleaseReportSchema>;\n\n\n"]}
|
package/dist/index.js
CHANGED
|
@@ -36,8 +36,9 @@ var pluginPermissions = combinePermissions().with(gitWorkflowPreset).with(kbPlat
|
|
|
36
36
|
analytics: true
|
|
37
37
|
// Track release events
|
|
38
38
|
}).withQuotas({
|
|
39
|
-
|
|
40
|
-
//
|
|
39
|
+
// 30 min default for complex releases (167 packages); overridable via
|
|
40
|
+
// KB_RELEASE_CHECKS_TIMEOUT_MS for profiling/tuning without a rebuild.
|
|
41
|
+
timeoutMs: Number(process.env.KB_RELEASE_CHECKS_TIMEOUT_MS) || 18e5,
|
|
41
42
|
memoryMb: 4096,
|
|
42
43
|
// full platform build:affected across 167 packages peaked at ~2.05GB on a CI runner, right at the old 2048 ceiling
|
|
43
44
|
cpuMs: 3e5
|
|
@@ -199,6 +200,27 @@ var manifest = {
|
|
|
199
200
|
"kb release stage --flow sdk --out-dir .kb/release/artifacts"
|
|
200
201
|
]
|
|
201
202
|
},
|
|
203
|
+
// release:stage-plan - Publish a release plan's PLANNED versions to a
|
|
204
|
+
// local staging registry, before Bump versions has run
|
|
205
|
+
{
|
|
206
|
+
path: "release stage plan",
|
|
207
|
+
category: "Publish",
|
|
208
|
+
describe: "Publish a release plan's planned package versions to a local staging registry (Verdaccio)",
|
|
209
|
+
operationType: "execute",
|
|
210
|
+
longDescription: "Runs BEFORE version bump, off the in-memory plan `release plan` already computed. Publishes each plan package at its PLANNED nextVersion \u2014 internal sibling dependencies rewritten to `^nextVersion` too \u2014 to --registry, so the `pack-install` Checks gate can verify cross-package dependencies against the version this release is about to ship instead of whatever is already live on npm. Distinct from `release stage`, which packs already-committed, already-bumped versions for CI delivery after approval.",
|
|
211
|
+
handler: "./cli/commands/stage-plan.js#default",
|
|
212
|
+
flags: defineCommandFlags({
|
|
213
|
+
"plan-path": { type: "string", description: "Path to the plan.json written by `release plan`" },
|
|
214
|
+
registry: { type: "string", description: "Target staging registry URL (e.g. http://localhost:4873)" },
|
|
215
|
+
flow: { type: "string", description: "Named flow \u2014 used only to resolve config for package discovery" },
|
|
216
|
+
token: { type: "string", description: 'Auth token to send (default: "verdaccio-local" \u2014 a placeholder; the staging registry allows anonymous publish)' },
|
|
217
|
+
tag: { type: "string", description: 'npm dist-tag to publish under (default: "latest")' },
|
|
218
|
+
json: { type: "boolean", description: "Output in JSON format" }
|
|
219
|
+
}),
|
|
220
|
+
examples: [
|
|
221
|
+
"kb release stage plan --flow platform --plan-path .kb/release/plans/root/current/plan.json --registry http://localhost:4873"
|
|
222
|
+
]
|
|
223
|
+
},
|
|
202
224
|
// release:clean-install - Shared install-verification used by both
|
|
203
225
|
// check-pack-install.sh and `release stage`
|
|
204
226
|
{
|
|
@@ -211,6 +233,7 @@ var manifest = {
|
|
|
211
233
|
flags: defineCommandFlags({
|
|
212
234
|
tarball: { type: "string", description: "Path to the packed tarball to install" },
|
|
213
235
|
name: { type: "string", description: "Package name to import after install" },
|
|
236
|
+
registry: { type: "string", description: "Registry override for ALL dependency resolution (default: real npm) \u2014 e.g. a local staging Verdaccio" },
|
|
214
237
|
json: { type: "boolean", description: "Output in JSON format" },
|
|
215
238
|
additionalTarballs: {
|
|
216
239
|
type: "string",
|
|
@@ -315,6 +338,21 @@ var manifest = {
|
|
|
315
338
|
}),
|
|
316
339
|
examples: ["kb release report", "kb release report --json"]
|
|
317
340
|
},
|
|
341
|
+
// release:status - What is actually stable vs. candidate right now
|
|
342
|
+
{
|
|
343
|
+
path: "release status",
|
|
344
|
+
category: "Utilities",
|
|
345
|
+
describe: "Show what is actually stable vs. candidate for a flow (git tag, npm dist-tags, recent candidate CI)",
|
|
346
|
+
operationType: "read",
|
|
347
|
+
longDescription: "Cross-checks the latest stable git tag against real npm dist-tags and recent candidate CI runs, and flags drift \u2014 a tag or npm publish existing is not the same as a verified, promoted release.",
|
|
348
|
+
handler: "./cli/commands/status.js#default",
|
|
349
|
+
flags: defineCommandFlags({
|
|
350
|
+
flow: { type: "string", description: 'Named release flow from release.flows (e.g. "platform", "sdk")', required: true },
|
|
351
|
+
ci: { type: "boolean", description: "Include recent candidate CI run status (default: true)" },
|
|
352
|
+
json: { type: "boolean", description: "Output in JSON format" }
|
|
353
|
+
}),
|
|
354
|
+
examples: ["kb release status --flow platform", "kb release status --flow sdk --json"]
|
|
355
|
+
},
|
|
318
356
|
// release:changelog - Generate changelog
|
|
319
357
|
{
|
|
320
358
|
path: "release changelog",
|