@kb-labs/release-manager-cli 2.6.0 → 2.9.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.
@@ -4,7 +4,7 @@ import { join } from 'path';
4
4
  import 'fs/promises';
5
5
  import 'globby';
6
6
  import { spawn } from 'child_process';
7
- import { readFileSync, readdirSync, writeFileSync } from 'fs';
7
+ import { readFileSync, writeFileSync } from 'fs';
8
8
  import * as readline from 'readline/promises';
9
9
 
10
10
  // src/cli/commands/publish.ts
@@ -12,9 +12,12 @@ function resolveToken(token) {
12
12
  return token ?? process.env.NPM_TOKEN ?? process.env.NODE_AUTH_TOKEN;
13
13
  }
14
14
  function publishSinglePackage(options) {
15
- const { packagePath, token, otp, dryRun, tag, access, registry } = options;
15
+ const { packagePath, packageManager, token, otp, dryRun, tag, access, registry } = options;
16
16
  return new Promise((resolve, reject) => {
17
17
  const args = ["publish"];
18
+ if (packageManager === "pnpm") {
19
+ args.push("--no-git-checks");
20
+ }
18
21
  if (dryRun) {
19
22
  args.push("--dry-run");
20
23
  }
@@ -34,7 +37,7 @@ function publishSinglePackage(options) {
34
37
  if (token) {
35
38
  env["NODE_AUTH_TOKEN"] = token;
36
39
  }
37
- const child = spawn("npm", args, {
40
+ const child = spawn(packageManager, args, {
38
41
  cwd: packagePath,
39
42
  stdio: ["ignore", "pipe", "pipe"],
40
43
  shell: true,
@@ -52,7 +55,7 @@ function publishSinglePackage(options) {
52
55
  if (code === 0) {
53
56
  resolve();
54
57
  } else {
55
- reject(new Error(stderr || stdout || `npm publish exited with code ${code}`));
58
+ reject(new Error(stderr || stdout || `${packageManager} publish exited with code ${code}`));
56
59
  }
57
60
  });
58
61
  child.on("error", (err) => {
@@ -61,7 +64,7 @@ function publishSinglePackage(options) {
61
64
  });
62
65
  }
63
66
  async function publishPackagesProgrammatic(options) {
64
- const { packages, dryRun, otp, tag, access, registry } = options;
67
+ const { packages, packageManager = "pnpm", dryRun, otp, tag, access, registry } = options;
65
68
  const logger = useLogger();
66
69
  const token = resolveToken(options.token);
67
70
  if (!token && !dryRun) {
@@ -111,30 +114,11 @@ async function publishPackagesProgrammatic(options) {
111
114
  modified = true;
112
115
  }
113
116
  }
114
- } else if (val.startsWith("workspace:")) {
117
+ } else if (val.startsWith("workspace:") && packageManager !== "pnpm") {
115
118
  const planVersion = versionMap.get(depName);
116
119
  if (planVersion) {
117
120
  deps[depName] = val === "workspace:*" ? `^${planVersion}` : val.replace("workspace:", "");
118
121
  modified = true;
119
- } else {
120
- try {
121
- const repoRoot = join(pkg.path, "..");
122
- const candidates = readdirSync(repoRoot, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => join(repoRoot, d.name, "package.json"));
123
- for (const candidate of candidates) {
124
- try {
125
- const cPkg = JSON.parse(readFileSync(candidate, "utf-8"));
126
- if (cPkg.name === depName) {
127
- deps[depName] = `^${cPkg.version}`;
128
- modified = true;
129
- break;
130
- }
131
- } catch {
132
- }
133
- }
134
- } catch {
135
- deps[depName] = "*";
136
- modified = true;
137
- }
138
122
  }
139
123
  }
140
124
  }
@@ -145,6 +129,7 @@ async function publishPackagesProgrammatic(options) {
145
129
  }
146
130
  await publishSinglePackage({
147
131
  packagePath: pkg.path,
132
+ packageManager,
148
133
  token,
149
134
  otp,
150
135
  dryRun,
@@ -182,7 +167,7 @@ async function publishPackagesProgrammatic(options) {
182
167
  };
183
168
  }
184
169
  async function publishPackagesWithOTP(options) {
185
- const { packages, dryRun, tag, access, ui, logger } = options;
170
+ const { packages, packageManager = "pnpm", dryRun, tag, access, ui, logger } = options;
186
171
  let otp = options.otp;
187
172
  const results = [];
188
173
  const versionMap = new Map(packages.map((p) => [p.name, p.version]));
@@ -220,30 +205,11 @@ async function publishPackagesWithOTP(options) {
220
205
  modified = true;
221
206
  }
222
207
  }
223
- } else if (val.startsWith("workspace:")) {
208
+ } else if (val.startsWith("workspace:") && packageManager !== "pnpm") {
224
209
  const planVersion = versionMap.get(depName);
225
210
  if (planVersion) {
226
211
  deps[depName] = val === "workspace:*" ? `^${planVersion}` : val.replace("workspace:", "");
227
212
  modified = true;
228
- } else {
229
- try {
230
- const repoRoot = join(pkg.path, "..");
231
- const candidates = readdirSync(repoRoot, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => join(repoRoot, d.name, "package.json"));
232
- for (const candidate of candidates) {
233
- try {
234
- const cPkg = JSON.parse(readFileSync(candidate, "utf-8"));
235
- if (cPkg.name === depName) {
236
- deps[depName] = `^${cPkg.version}`;
237
- modified = true;
238
- break;
239
- }
240
- } catch {
241
- }
242
- }
243
- } catch {
244
- deps[depName] = "*";
245
- modified = true;
246
- }
247
213
  }
248
214
  }
249
215
  }
@@ -262,6 +228,7 @@ async function publishPackagesWithOTP(options) {
262
228
  try {
263
229
  await publishSinglePackage2({
264
230
  packagePath: pkg.path,
231
+ packageManager,
265
232
  otp,
266
233
  dryRun,
267
234
  tag,
@@ -355,9 +322,12 @@ async function publishPackagesWithOTP(options) {
355
322
  };
356
323
  }
357
324
  function publishSinglePackage2(options) {
358
- const { packagePath, otp, dryRun, tag, access } = options;
325
+ const { packagePath, packageManager = "pnpm", otp, dryRun, tag, access } = options;
359
326
  return new Promise((resolve, reject) => {
360
327
  const args = ["publish"];
328
+ if (packageManager === "pnpm") {
329
+ args.push("--no-git-checks");
330
+ }
361
331
  if (dryRun) {
362
332
  args.push("--dry-run");
363
333
  }
@@ -370,7 +340,7 @@ function publishSinglePackage2(options) {
370
340
  if (access) {
371
341
  args.push(`--access=${access}`);
372
342
  }
373
- const child = spawn("npm", args, {
343
+ const child = spawn(packageManager, args, {
374
344
  cwd: packagePath,
375
345
  stdio: ["inherit", "pipe", "pipe"],
376
346
  shell: true
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/shared/publish-programmatic.ts","../../../src/shared/publish-with-otp.ts","../../../src/cli/commands/publish.ts"],"names":["join","readFileSync","readdirSync","writeFileSync","published","publishSinglePackage","spawn","useLoader","r"],"mappings":";;;;;;;;;;AAoDA,SAAS,aAAa,KAAA,EAAoC;AACxD,EAAA,OAAO,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,SAAA,IAAa,QAAQ,GAAA,CAAI,eAAA;AACvD;AAMA,SAAS,qBAAqB,OAAA,EAQZ;AAChB,EAAA,MAAM,EAAE,aAAa,KAAA,EAAO,GAAA,EAAK,QAAQ,GAAA,EAAK,MAAA,EAAQ,UAAS,GAAI,OAAA;AAEnE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,IAAA,GAAO,CAAC,SAAS,CAAA;AAEvB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,SAAA,EAAY,MAAM,CAAA,CAAE,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAE,CAAA;AAAA,IACpC;AAEA,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1B;AAGA,IAAA,MAAM,GAAA,GAAyB,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAI;AAChD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,GAAA,CAAI,iBAAiB,CAAA,GAAI,KAAA;AAAA,IAC3B;AAEA,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM;AAAA,MAC/B,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAAA,MAChC,KAAA,EAAO,IAAA;AAAA,MACP;AAAA,KACD,CAAA;AAED,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AACzC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAiB;AACzC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAwB;AACzC,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,MAAA,IAAU,UAAU,CAAA,6BAAA,EAAgC,IAAI,EAAE,CAAC,CAAA;AAAA,MAC9E;AAAA,IACF,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAe;AAChC,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACZ,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAMA,eAAsB,4BACpB,OAAA,EACoC;AACpC,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,KAAK,GAAA,EAAK,MAAA,EAAQ,UAAS,GAAI,OAAA;AACzD,EAAA,MAAM,SAAS,SAAA,EAAU;AAEzB,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAExC,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ;AACrB,IAAA,MAAM,KAAA,GAAQ,wEAAA;AACd,IAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAClB,IAAA,OAAO;AAAA,MACL,SAAS,EAAC;AAAA,MACV,WAAW,EAAC;AAAA,MACZ,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,MACpD,SAAS,EAAC;AAAA,MACV,MAAA,EAAQ,CAAC,KAAK;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,MAAM,UAA2B,EAAC;AAGlC,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,CAAC,CAAC,CAAA;AAEjE,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,WAAA,EAAc,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,QAAQ,CAAA;AAG/E,IAAA,MAAM,WAAA,GAAcA,IAAAA,CAAK,GAAA,CAAI,IAAA,EAAM,cAAc,CAAA;AACjD,IAAA,MAAM,eAAA,GAAkB,YAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AACzD,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAC1C,MAAA,IAAI,QAAA,GAAW,KAAA;AAEf,MAAA,KAAA,MAAW,OAAA,IAAW,CAAC,cAAA,EAAgB,kBAAkB,CAAA,EAAY;AACnE,QAAA,MAAM,IAAA,GAAO,QAAQ,OAAO,CAAA;AAC5B,QAAA,IAAI,CAAC,IAAA,EAAM;AAAC,UAAA;AAAA,QAAS;AACrB,QAAA,KAAA,MAAW,CAAC,OAAA,EAAS,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACtD,UAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAAC,YAAA;AAAA,UAAS;AAC5C,UAAA,MAAM,GAAA,GAAM,QAAA;AAEZ,UAAA,IAAI,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AAE3B,YAAA,MAAM,WAAA,GAAc,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAC1C,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,IAAA,CAAK,OAAO,CAAA,GAAI,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAC/B,cAAA,QAAA,GAAW,IAAA;AAAA,YACb,CAAA,MAAO;AACL,cAAA,IAAI;AACF,gBAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACxC,gBAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,YAAA,CAAaA,IAAAA,CAAK,GAAA,CAAI,IAAA,EAAM,QAAA,EAAU,cAAc,CAAA,EAAG,OAAO,CAAC,CAAA;AAC5F,gBAAA,IAAA,CAAK,OAAO,CAAA,GAAI,CAAA,CAAA,EAAI,SAAA,CAAU,OAAO,CAAA,CAAA;AACrC,gBAAA,QAAA,GAAW,IAAA;AAAA,cACb,CAAA,CAAA,MAAQ;AACN,gBAAA,IAAA,CAAK,OAAO,CAAA,GAAI,GAAA;AAChB,gBAAA,QAAA,GAAW,IAAA;AAAA,cACb;AAAA,YACF;AAAA,UACF,CAAA,MAAA,IAAW,GAAA,CAAI,UAAA,CAAW,YAAY,CAAA,EAAG;AAEvC,YAAA,MAAM,WAAA,GAAc,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAC1C,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,IAAA,CAAK,OAAO,CAAA,GAAI,GAAA,KAAQ,aAAA,GAAgB,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AACxF,cAAA,QAAA,GAAW,IAAA;AAAA,YACb,CAAA,MAAO;AAEL,cAAA,IAAI;AAEF,gBAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AACpC,gBAAA,MAAM,UAAA,GAAa,YAAY,QAAA,EAAU,EAAE,eAAe,IAAA,EAAM,EAC7D,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,WAAA,EAAa,EAC3B,GAAA,CAAI,CAAA,CAAA,KAAKA,KAAK,QAAA,EAAU,CAAA,CAAE,IAAA,EAAM,cAAc,CAAC,CAAA;AAClD,gBAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,kBAAA,IAAI;AACF,oBAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,SAAA,EAAW,OAAO,CAAC,CAAA;AACxD,oBAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,sBAAA,IAAA,CAAK,OAAO,CAAA,GAAI,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,CAAA;AAChC,sBAAA,QAAA,GAAW,IAAA;AACX,sBAAA;AAAA,oBACF;AAAA,kBACF,CAAA,CAAA,MAAQ;AAAA,kBAAa;AAAA,gBACvB;AAAA,cACF,CAAA,CAAA,MAAQ;AACN,gBAAA,IAAA,CAAK,OAAO,CAAA,GAAI,GAAA;AAChB,gBAAA,QAAA,GAAW,IAAA;AAAA,cACb;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,aAAA,CAAc,aAAa,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AAClE,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,wBAAA,EAA2B,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAAA,MACnD;AAEA,MAAA,MAAM,oBAAA,CAAqB;AAAA,QACzB,aAAa,GAAA,CAAI,IAAA;AAAA,QACjB,KAAA;AAAA,QACA,GAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAA;AAAA,QACA,QAAQ,MAAA,IAAU,QAAA;AAAA,QAClB;AAAA,OACD,CAAA;AAED,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,SAAS,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,CAAA;AACpE,MAAA,MAAA,CAAO,KAAK,CAAA,UAAA,EAAa,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,CAAE,CAAA;AAAA,IACpD,SAAS,KAAA,EAAgB;AACvB,MAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAErE,MAAA,MAAA,CAAO,KAAA,CAAM,CAAA,kBAAA,EAAqB,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,CAAA,EAAI,MAAA,EAAW,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA;AAE1F,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,CAAA,SAAE;AAEA,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,aAAA,CAAc,aAAa,eAAe,CAAA;AAC1C,QAAA,QAAA,GAAW,IAAA;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACtF,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACpF,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,WAAW,CAAA,CAAE,KAAK,EAAE,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAE9F,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,UAAA,CAAY,IAAI,EAAC;AAAA,IAC7E;AAAA,GACF;AACF;AClOA,eAAsB,uBACpB,OAAA,EAC+B;AAC/B,EAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAQ,KAAK,MAAA,EAAQ,EAAA,EAAI,QAAO,GAAI,OAAA;AACtD,EAAA,IAAI,MAAM,OAAA,CAAQ,GAAA;AAElB,EAAA,MAAM,UAA2B,EAAC;AAGlC,EAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,CAAC,CAAC,CAAA;AAEjE,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,MAAA,EAAQ,IAAA,CAAK,sBAAsB,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,CAAA;AAG3E,IAAA,MAAM,WAAA,GAAcA,IAAAA,CAAK,GAAA,CAAI,IAAA,EAAM,cAAc,CAAA;AACjD,IAAA,MAAM,eAAA,GAAkBC,YAAAA,CAAa,WAAA,EAAa,OAAO,CAAA;AACzD,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAC1C,MAAA,IAAI,QAAA,GAAW,KAAA;AAEf,MAAA,KAAA,MAAW,OAAA,IAAW,CAAC,cAAA,EAAgB,kBAAkB,CAAA,EAAY;AACnE,QAAA,MAAM,IAAA,GAAO,QAAQ,OAAO,CAAA;AAC5B,QAAA,IAAI,CAAC,IAAA,EAAM;AAAC,UAAA;AAAA,QAAS;AACrB,QAAA,KAAA,MAAW,CAAC,OAAA,EAAS,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AACtD,UAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAAC,YAAA;AAAA,UAAS;AAC5C,UAAA,MAAM,GAAA,GAAM,QAAA;AAEZ,UAAA,IAAI,GAAA,CAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AAC3B,YAAA,MAAM,WAAA,GAAc,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAC1C,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,IAAA,CAAK,OAAO,CAAA,GAAI,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAC/B,cAAA,QAAA,GAAW,IAAA;AAAA,YACb,CAAA,MAAO;AACL,cAAA,IAAI;AACF,gBAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AACxC,gBAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAMA,YAAAA,CAAaD,IAAAA,CAAK,GAAA,CAAI,IAAA,EAAM,QAAA,EAAU,cAAc,CAAA,EAAG,OAAO,CAAC,CAAA;AAC5F,gBAAA,IAAA,CAAK,OAAO,CAAA,GAAI,CAAA,CAAA,EAAI,SAAA,CAAU,OAAO,CAAA,CAAA;AACrC,gBAAA,QAAA,GAAW,IAAA;AAAA,cACb,CAAA,CAAA,MAAQ;AACN,gBAAA,IAAA,CAAK,OAAO,CAAA,GAAI,GAAA;AAChB,gBAAA,QAAA,GAAW,IAAA;AAAA,cACb;AAAA,YACF;AAAA,UACF,CAAA,MAAA,IAAW,GAAA,CAAI,UAAA,CAAW,YAAY,CAAA,EAAG;AACvC,YAAA,MAAM,WAAA,GAAc,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAC1C,YAAA,IAAI,WAAA,EAAa;AACf,cAAA,IAAA,CAAK,OAAO,CAAA,GAAI,GAAA,KAAQ,aAAA,GAAgB,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,GAAK,GAAA,CAAI,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AACxF,cAAA,QAAA,GAAW,IAAA;AAAA,YACb,CAAA,MAAO;AACL,cAAA,IAAI;AACF,gBAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AACpC,gBAAA,MAAM,UAAA,GAAaE,YAAY,QAAA,EAAU,EAAE,eAAe,IAAA,EAAM,EAC7D,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,WAAA,EAAa,EAC3B,GAAA,CAAI,CAAA,CAAA,KAAKF,KAAK,QAAA,EAAU,CAAA,CAAE,IAAA,EAAM,cAAc,CAAC,CAAA;AAClD,gBAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,kBAAA,IAAI;AACF,oBAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAMC,YAAAA,CAAa,SAAA,EAAW,OAAO,CAAC,CAAA;AACxD,oBAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,sBAAA,IAAA,CAAK,OAAO,CAAA,GAAI,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,CAAA;AAChC,sBAAA,QAAA,GAAW,IAAA;AACX,sBAAA;AAAA,oBACF;AAAA,kBACF,CAAA,CAAA,MAAQ;AAAA,kBAAa;AAAA,gBACvB;AAAA,cACF,CAAA,CAAA,MAAQ;AACN,gBAAA,IAAA,CAAK,OAAO,CAAA,GAAI,GAAA;AAChB,gBAAA,QAAA,GAAW,IAAA;AAAA,cACb;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAAE,aAAAA,CAAc,aAAa,IAAA,CAAK,SAAA,CAAU,SAAS,IAAA,EAAM,CAAC,IAAI,IAAI,CAAA;AAClE,QAAA,MAAA,EAAQ,IAAA,CAAK,CAAA,wBAAA,EAA2B,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,MAAA,GAAS,UAAU,CAAA,WAAA,EAAc,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,GAAA,CAAK,CAAA;AACnE,MAAA,MAAA,CAAO,KAAA,EAAM;AAEb,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,MAAM,WAAA,GAAc,CAAA;AACpB,MAAA,IAAIC,UAAAA,GAAY,KAAA;AAEhB,MAAA,OAAO,CAACA,UAAAA,IAAa,QAAA,GAAW,WAAA,EAAa;AAC3C,QAAA,QAAA,EAAA;AAEA,QAAA,IAAI;AACF,UAAA,MAAMC,qBAAAA,CAAqB;AAAA,YACzB,aAAa,GAAA,CAAI,IAAA;AAAA,YACjB,GAAA;AAAA,YACA,MAAA;AAAA,YACA,GAAA;AAAA,YACA;AAAA,WACD,CAAA;AAED,UAAAD,UAAAA,GAAY,IAAA;AACZ,UAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,SAAS,GAAA,CAAI,OAAA,EAAS,OAAA,EAAS,IAAA,EAAM,CAAA;AAEpE,UAAA,MAAM,UAAA,GAAa,MAAA,GACf,CAAA,sBAAA,EAAyB,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,CAAA,GAChD,CAAA,UAAA,EAAa,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,IAAI,OAAO,CAAA,CAAA;AAExC,UAAA,MAAA,CAAO,QAAQ,UAAU,CAAA;AACzB,UAAA,MAAA,EAAQ,KAAK,gCAAA,EAAkC;AAAA,YAC7C,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,SAAS,GAAA,CAAI,OAAA;AAAA,YACb;AAAA,WACD,CAAA;AAAA,QACH,SAAS,KAAA,EAAY;AACnB,UAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,IAAW,MAAA,CAAO,KAAK,CAAA;AAGlD,UAAA,IAAI,aAAa,QAAA,CAAS,MAAM,KAAK,YAAA,CAAa,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAC/E,YAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,cAAA,MAAA,CAAO,OAAA,CAAQ,CAAA,2BAAA,EAAuB,GAAA,CAAI,IAAI,CAAA,CAAE,CAAA;AAChD,cAAA,MAAA,EAAQ,KAAK,6BAAA,EAA+B;AAAA,gBAC1C,MAAM,GAAA,CAAI,IAAA;AAAA,gBACV,OAAA,EAAS;AAAA,eACV,CAAA;AAED,cAAA,MAAM,KAAc,QAAA,CAAA,eAAA,CAAgB;AAAA,gBAClC,OAAO,OAAA,CAAQ,KAAA;AAAA,gBACf,QAAQ,OAAA,CAAQ;AAAA,eACjB,CAAA;AAED,cAAA,IAAI;AACF,gBAAA,GAAA,GAAM,MAAM,EAAA,CAAG,QAAA,CAAS,qBAAqB,CAAA;AAC7C,gBAAA,EAAA,CAAG,KAAA,EAAM;AAET,gBAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACnC,kBAAA,EAAA,CAAG,QAAQ,wDAA8C,CAAA;AACzD,kBAAA,MAAA,EAAQ,IAAA,CAAK,6BAA6B,EAAE,MAAA,EAAQ,KAAK,IAAA,EAAK,CAAE,QAAQ,CAAA;AACxE,kBAAA,GAAA,GAAM,KAAA,CAAA;AACN,kBAAA;AAAA,gBACF;AAEA,gBAAA,MAAA,CAAO,MAAA,CAAO,EAAE,IAAA,EAAM,CAAA,WAAA,EAAc,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAA,YAAA,CAAA,EAAgB,CAAA;AAC3E,gBAAA,MAAA,CAAO,KAAA,EAAM;AACb,gBAAA,MAAA,EAAQ,MAAM,mBAAmB,CAAA;AAAA,cACnC,SAAS,CAAA,EAAG;AACV,gBAAA,EAAA,CAAG,KAAA,EAAM;AACT,gBAAA,MAAM,CAAA;AAAA,cACR;AAAA,YACF,CAAA,MAAO;AACL,cAAA,MAAA,CAAO,KAAK,0BAA0B,CAAA;AACtC,cAAA,MAAA,EAAQ,MAAM,0BAAA,EAA4B;AAAA,gBACxC,MAAM,GAAA,CAAI,IAAA;AAAA,gBACV,QAAA,EAAU;AAAA,eACX,CAAA;AACD,cAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,gBACX,MAAM,GAAA,CAAI,IAAA;AAAA,gBACV,SAAS,GAAA,CAAI,OAAA;AAAA,gBACb,OAAA,EAAS,KAAA;AAAA,gBACT,KAAA,EAAO;AAAA,eACR,CAAA;AACD,cAAA;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,QAAA,EAAW,YAAY,CAAA,CAAE,CAAA;AACrC,YAAA,MAAA,EAAQ,MAAM,wBAAA,EAA0B;AAAA,cACtC,MAAM,GAAA,CAAI,IAAA;AAAA,cACV,SAAS,GAAA,CAAI,OAAA;AAAA,cACb,KAAA,EAAO;AAAA,aACR,CAAA;AACD,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,MAAM,GAAA,CAAI,IAAA;AAAA,cACV,SAAS,GAAA,CAAI,OAAA;AAAA,cACb,OAAA,EAAS,KAAA;AAAA,cACT,KAAA,EAAO;AAAA,aACR,CAAA;AACD,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AAEA,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAAD,aAAAA,CAAc,aAAa,eAAe,CAAA;AAC1C,QAAA,QAAA,GAAW,IAAA;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,YAAY,OAAA,CACf,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA,CACvB,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACtC,EAAA,MAAM,SAAS,OAAA,CACZ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA,CACxB,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,QACZ,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA,CAAE,WAAW,CAAA,CAAE,KAAK,EACnC,GAAA,CAAI,CAAC,MAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAErC,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA,EAAS,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,UAAA,CAAY,IAAI,EAAC;AAAA,IAC7E;AAAA,GACF;AACF;AAaA,SAASE,sBAAqB,OAAA,EAA8C;AAC1E,EAAA,MAAM,EAAE,WAAA,EAAa,GAAA,EAAK,MAAA,EAAQ,GAAA,EAAK,QAAO,GAAI,OAAA;AAElD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,IAAA,GAAO,CAAC,SAAS,CAAA;AAEvB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,KAAK,WAAW,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,SAAA,EAAY,MAAM,CAAA,CAAE,CAAA;AAAA,IAChC;AAEA,IAAA,MAAM,KAAA,GAAQC,KAAAA,CAAM,KAAA,EAAO,IAAA,EAAM;AAAA,MAC/B,GAAA,EAAK,WAAA;AAAA,MACL,KAAA,EAAO,CAAC,SAAA,EAAW,MAAA,EAAQ,MAAM,CAAA;AAAA,MACjC,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,MAAA,GAAS,EAAA;AAEb,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACjC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACjC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA,MAAO;AACL,QAAA,MAAM,cAAc,MAAA,IAAU,MAAA;AAC9B,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,MAC/B;AAAA,IACF,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACzB,MAAA,MAAA,CAAO,GAAG,CAAA;AAAA,IACZ,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;;;ACjSA,IAAO,kBAAQ,aAAA,CAAc;AAAA,EAC3B,EAAA,EAAI,iBAAA;AAAA,EACJ,WAAA,EAAa,kCAAA;AAAA,EAEb,OAAA,EAAS;AAAA,IACP,MAAM,OAAA,CAAQ,GAAA,EAAsB,KAAA,EAAuD;AACzF,MAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,MAAA,MAAM,EAAE,KAAA,EAAO,GAAA,EAAK,YAAY,GAAA,EAAK,MAAA,EAAQ,MAAK,GAAI,KAAA;AACtD,MAAA,MAAM,MAAA,GAAS,MAAM,SAAS,CAAA;AAC9B,MAAA,MAAM,QAAQ,KAAA,CAAM,KAAA,IAAS,QAAQ,GAAA,CAAI,SAAA,IAAa,QAAQ,GAAA,CAAI,eAAA;AAElE,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACnC,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,GAAG,CAAA;AAGvC,MAAA,MAAM,eAAA,GAAkBC,UAAU,yBAAyB,CAAA;AAC3D,MAAA,eAAA,CAAgB,KAAA,EAAM;AAEtB,MAAA,MAAM,UAAA,GAAa,MAAM,SAAA,EAAyB;AAClD,MAAA,MAAM,MAAA,GAAwB,cAAc,EAAC;AAC7C,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,EAAE,KAAK,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAA;AAE/D,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,GAAA,MAAQ;AAAA,QACzC,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,SAAS,GAAA,CAAI,WAAA;AAAA,QACb,MAAM,GAAA,CAAI;AAAA,OACZ,CAAE,CAAA;AAEF,MAAA,eAAA,CAAgB,OAAA,CAAQ,CAAA,MAAA,EAAS,QAAA,CAAS,MAAM,CAAA,WAAA,CAAa,CAAA;AAE7D,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,MAAM,MAAM,CAAA,4BAAA,EAA+B,KAAA,GAAQ,CAAA,iBAAA,EAAoB,KAAK,KAAK,EAAE,CAAA,CAAA;AACnF,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,EAAE,KAAA,EAAO,KAAK,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,EAAA,EAAI,QAAQ,GAAG,CAAA;AAAA,QACrB;AACA,QAAA,OAAO,EAAE,QAAA,EAAU,CAAA,EAAG,OAAA,EAAS,EAAE,KAAA,EAAO,CAAA,EAAG,UAAA,EAAY,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAE,EAAE;AAAA,MACxE;AAGA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,GAAS,MAAM,2BAAA,CAA4B;AAAA,UACzC,QAAA;AAAA,UACA,MAAA;AAAA,UACA,GAAA,EAAK,UAAA;AAAA,UACL,GAAA;AAAA,UACA,MAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAA,GAAS,MAAM,sBAAA,CAAuB;AAAA,UACpC,QAAA;AAAA,UACA,MAAA;AAAA,UACA,GAAA,EAAK,UAAA;AAAA,UACL,GAAA;AAAA,UACA,QAAQ,MAAA,IAAU,QAAA;AAAA,UAClB,IAAI,GAAA,CAAI,EAAA;AAAA,UACR,MAAA,EAAQ,IAAI,QAAA,EAAU;AAAA,SACvB,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,UAAA,GAAa,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAC3D,MAAA,MAAM,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAExD,MAAA,MAAM,aAAA,GAA+B;AAAA,QACnC,QAAA,EAAU,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,QAC7B,WAAW,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA,CAAE,IAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,MAAM,OAAA,EAAS,CAAA,CAAE,SAAQ,CAAE,CAAA;AAAA,QACpG,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UAC3D,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,KAAA,EAAO,EAAE,KAAA,IAAS;AAAA,SACpB,CAAE,CAAA;AAAA,QACF,SAAS,EAAE,KAAA,EAAO,OAAO,OAAA,CAAQ,MAAA,EAAQ,YAAY,MAAA;AAAO,OAC9D;AAEA,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,GAAA,CAAI,EAAA,EAAI,OAAO,aAAa,CAAA;AAC5B,QAAA,OAAO,aAAA;AAAA,MACT;AAEA,MAAA,MAAM,WAAwD,EAAC;AAE/D,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,MAAM,eAAyB,EAAC;AAChC,QAAA,KAAA,MAAW,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,CAACC,EAAAA,KAAMA,EAAAA,CAAE,OAAO,CAAA,EAAG;AACvD,UAAA,YAAA,CAAa,IAAA,CAAK,CAAA,EAAG,GAAA,CAAI,EAAA,CAAG,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACpE,UAAA,YAAA,CAAa,IAAA,CAAK,CAAA,6CAAA,EAAsC,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,QAClE;AACA,QAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,WAAA,EAAa,KAAA,EAAO,cAAc,CAAA;AAAA,MAC5D;AAEA,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CACtB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAO,CAAA,CACxB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,GAAA,CAAI,EAAA,CAAG,OAAA,CAAQ,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,GAAA,EAAM,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC3E,QAAA,QAAA,CAAS,KAAK,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,WAAW,CAAA;AAAA,MACtD;AAEA,MAAA,GAAA,CAAI,GAAG,OAAA,CAAQ;AAAA,QACb,KAAA,EAAO,SAAS,iBAAA,GAAoB,iBAAA;AAAA,QACpC,QAAA;AAAA,QACA,MAAA,EAAQ,MAAA,KAAW,CAAA,GAAI,SAAA,GAAY;AAAA,OACpC,CAAA;AAED,MAAA,OAAO,aAAA;AAAA,IACT;AAAA;AAEJ,CAAC","file":"publish.js","sourcesContent":["/**\n * Programmatic npm publishing for REST handlers (non-interactive context)\n *\n * Uses `npm publish` CLI via spawn with NODE_AUTH_TOKEN env variable.\n * This is the correct approach for granular access tokens (classic tokens\n * were revoked by npm in December 2025).\n *\n * Token resolution order:\n * 1. options.token (explicit override)\n * 2. NPM_TOKEN env variable\n * 3. NODE_AUTH_TOKEN env variable\n */\n\nimport { spawn } from 'node:child_process';\nimport { readFileSync, writeFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { useLogger } from '@kb-labs/sdk';\n\nexport interface PackageToPublish {\n name: string;\n version: string;\n path: string;\n}\n\nexport interface ProgrammaticPublishOptions {\n packages: PackageToPublish[];\n dryRun?: boolean;\n otp?: string;\n tag?: string;\n access?: 'public' | 'restricted';\n registry?: string;\n token?: string;\n}\n\nexport interface PublishResult {\n name: string;\n version: string;\n success: boolean;\n error?: string;\n}\n\nexport interface ProgrammaticPublishResult {\n results: PublishResult[];\n published: string[];\n failed: string[];\n skipped: string[];\n errors: string[];\n}\n\n/**\n * Resolve npm auth token from options or environment\n */\nfunction resolveToken(token?: string): string | undefined {\n return token ?? process.env.NPM_TOKEN ?? process.env.NODE_AUTH_TOKEN;\n}\n\n/**\n * Publish a single package using npm CLI\n * Passes auth token via NODE_AUTH_TOKEN env (recommended for granular tokens)\n */\nfunction publishSinglePackage(options: {\n packagePath: string;\n token: string | undefined;\n otp?: string;\n dryRun?: boolean;\n tag?: string;\n access?: string;\n registry?: string;\n}): Promise<void> {\n const { packagePath, token, otp, dryRun, tag, access, registry } = options;\n\n return new Promise((resolve, reject) => {\n const args = ['publish'];\n\n if (dryRun) {\n args.push('--dry-run');\n }\n\n if (tag) {\n args.push(`--tag=${tag}`);\n }\n\n if (access) {\n args.push(`--access=${access}`);\n }\n\n if (registry) {\n args.push(`--registry=${registry}`);\n }\n\n if (otp) {\n args.push(`--otp=${otp}`);\n }\n\n // Pass token via env — this is the correct way for granular tokens\n const env: NodeJS.ProcessEnv = { ...process.env };\n if (token) {\n env['NODE_AUTH_TOKEN'] = token;\n }\n\n const child = spawn('npm', args, {\n cwd: packagePath,\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n env,\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', (code: number | null) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(stderr || stdout || `npm publish exited with code ${code}`));\n }\n });\n\n child.on('error', (err: Error) => {\n reject(err);\n });\n });\n}\n\n/**\n * Publish packages programmatically (non-interactive, for REST handlers)\n * Uses npm CLI with NODE_AUTH_TOKEN — works with granular access tokens.\n */\nexport async function publishPackagesProgrammatic(\n options: ProgrammaticPublishOptions\n): Promise<ProgrammaticPublishResult> {\n const { packages, dryRun, otp, tag, access, registry } = options;\n const logger = useLogger();\n\n const token = resolveToken(options.token);\n\n if (!token && !dryRun) {\n const error = 'No npm token found. Set NPM_TOKEN (or NODE_AUTH_TOKEN) in environment.';\n logger.error(error);\n return {\n results: [],\n published: [],\n failed: packages.map((p) => `${p.name}@${p.version}`),\n skipped: [],\n errors: [error],\n };\n }\n\n const results: PublishResult[] = [];\n\n // Build version map from all packages in this release for link: → ^version replacement\n const versionMap = new Map(packages.map(p => [p.name, p.version]));\n\n for (const pkg of packages) {\n logger.info(`Publishing ${pkg.name}@${pkg.version}`, { path: pkg.path, dryRun });\n\n // Replace link: deps with real versions before publish, restore after\n const pkgJsonPath = join(pkg.path, 'package.json');\n const originalPkgJson = readFileSync(pkgJsonPath, 'utf-8');\n let restored = false;\n\n try {\n const pkgJson = JSON.parse(originalPkgJson);\n let modified = false;\n\n for (const section of ['dependencies', 'peerDependencies'] as const) {\n const deps = pkgJson[section];\n if (!deps) {continue;}\n for (const [depName, depValue] of Object.entries(deps)) {\n if (typeof depValue !== 'string') {continue;}\n const val = depValue as string;\n\n if (val.startsWith('link:')) {\n // Cross-repo link: → ^version from plan or linked package.json\n const planVersion = versionMap.get(depName);\n if (planVersion) {\n deps[depName] = `^${planVersion}`;\n modified = true;\n } else {\n try {\n const linkPath = val.replace('link:', '');\n const linkedPkg = JSON.parse(readFileSync(join(pkg.path, linkPath, 'package.json'), 'utf-8'));\n deps[depName] = `^${linkedPkg.version}`;\n modified = true;\n } catch {\n deps[depName] = '*';\n modified = true;\n }\n }\n } else if (val.startsWith('workspace:')) {\n // Intra-repo workspace:* → ^version (pnpm does this automatically, but npm doesn't)\n const planVersion = versionMap.get(depName);\n if (planVersion) {\n deps[depName] = val === 'workspace:*' ? `^${planVersion}` : val.replace('workspace:', '');\n modified = true;\n } else {\n // Not in plan — resolve from current version in monorepo\n try {\n // Find the package in the same repo by scanning packages/*/package.json\n const repoRoot = join(pkg.path, '..');\n const candidates = readdirSync(repoRoot, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .map(d => join(repoRoot, d.name, 'package.json'));\n for (const candidate of candidates) {\n try {\n const cPkg = JSON.parse(readFileSync(candidate, 'utf-8'));\n if (cPkg.name === depName) {\n deps[depName] = `^${cPkg.version}`;\n modified = true;\n break;\n }\n } catch { /* skip */ }\n }\n } catch {\n deps[depName] = '*';\n modified = true;\n }\n }\n }\n }\n }\n\n if (modified) {\n writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + '\\n');\n logger.info(`Replaced link: deps for ${pkg.name}`);\n }\n\n await publishSinglePackage({\n packagePath: pkg.path,\n token,\n otp,\n dryRun,\n tag,\n access: access ?? 'public',\n registry,\n });\n\n results.push({ name: pkg.name, version: pkg.version, success: true });\n logger.info(`Published ${pkg.name}@${pkg.version}`);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n logger.error(`Failed to publish ${pkg.name}@${pkg.version}`, undefined, { error: message });\n\n results.push({\n name: pkg.name,\n version: pkg.version,\n success: false,\n error: message,\n });\n } finally {\n // Always restore original package.json\n if (!restored) {\n writeFileSync(pkgJsonPath, originalPkgJson);\n restored = true;\n }\n }\n }\n\n const published = results.filter((r) => r.success).map((r) => `${r.name}@${r.version}`);\n const failed = results.filter((r) => !r.success).map((r) => `${r.name}@${r.version}`);\n const errors = results.filter((r) => !r.success && r.error).map((r) => `${r.name}: ${r.error}`);\n\n return {\n results,\n published,\n failed,\n skipped: dryRun ? packages.map((p) => `${p.name}@${p.version} (dry-run)`) : [],\n errors,\n };\n}\n","/**\n * Shared publishing logic with interactive OTP support\n * Used by both `release:run` and `release publish` commands\n */\n\nimport { spawn } from 'node:child_process';\nimport { readFileSync, writeFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport * as readline from 'node:readline/promises';\nimport { useLoader } from '@kb-labs/sdk';\n\nexport interface PackageToPublish {\n name: string;\n version: string;\n path: string;\n}\n\nexport interface PublishWithOTPOptions {\n packages: PackageToPublish[];\n dryRun?: boolean;\n otp?: string;\n tag?: string;\n access?: string;\n ui: {\n write?: (text: string) => void;\n };\n logger?: {\n info: (msg: string, meta?: any) => void;\n warn: (msg: string, meta?: any) => void;\n error: (msg: string, meta?: any) => void;\n debug: (msg: string, meta?: any) => void;\n };\n}\n\nexport interface PublishResult {\n name: string;\n version: string;\n success: boolean;\n error?: string;\n}\n\nexport interface PublishWithOTPResult {\n results: PublishResult[];\n published: string[];\n failed: string[];\n skipped: string[];\n errors: string[];\n}\n\n/**\n * Publish packages with interactive OTP support\n */\nexport async function publishPackagesWithOTP(\n options: PublishWithOTPOptions\n): Promise<PublishWithOTPResult> {\n const { packages, dryRun, tag, access, ui, logger } = options;\n let otp = options.otp;\n\n const results: PublishResult[] = [];\n\n // Build version map from all packages in this release for link: → ^version replacement\n const versionMap = new Map(packages.map(p => [p.name, p.version]));\n\n for (const pkg of packages) {\n logger?.info('Publishing package', { name: pkg.name, version: pkg.version });\n\n // Replace link: deps with real versions before publish, restore after\n const pkgJsonPath = join(pkg.path, 'package.json');\n const originalPkgJson = readFileSync(pkgJsonPath, 'utf-8');\n let restored = false;\n\n try {\n const pkgJson = JSON.parse(originalPkgJson);\n let modified = false;\n\n for (const section of ['dependencies', 'peerDependencies'] as const) {\n const deps = pkgJson[section];\n if (!deps) {continue;}\n for (const [depName, depValue] of Object.entries(deps)) {\n if (typeof depValue !== 'string') {continue;}\n const val = depValue as string;\n\n if (val.startsWith('link:')) {\n const planVersion = versionMap.get(depName);\n if (planVersion) {\n deps[depName] = `^${planVersion}`;\n modified = true;\n } else {\n try {\n const linkPath = val.replace('link:', '');\n const linkedPkg = JSON.parse(readFileSync(join(pkg.path, linkPath, 'package.json'), 'utf-8'));\n deps[depName] = `^${linkedPkg.version}`;\n modified = true;\n } catch {\n deps[depName] = '*';\n modified = true;\n }\n }\n } else if (val.startsWith('workspace:')) {\n const planVersion = versionMap.get(depName);\n if (planVersion) {\n deps[depName] = val === 'workspace:*' ? `^${planVersion}` : val.replace('workspace:', '');\n modified = true;\n } else {\n try {\n const repoRoot = join(pkg.path, '..');\n const candidates = readdirSync(repoRoot, { withFileTypes: true })\n .filter(d => d.isDirectory())\n .map(d => join(repoRoot, d.name, 'package.json'));\n for (const candidate of candidates) {\n try {\n const cPkg = JSON.parse(readFileSync(candidate, 'utf-8'));\n if (cPkg.name === depName) {\n deps[depName] = `^${cPkg.version}`;\n modified = true;\n break;\n }\n } catch { /* skip */ }\n }\n } catch {\n deps[depName] = '*';\n modified = true;\n }\n }\n }\n }\n }\n\n if (modified) {\n writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + '\\n');\n logger?.info(`Replaced link: deps for ${pkg.name}`);\n }\n\n const loader = useLoader(`Publishing ${pkg.name}@${pkg.version}...`);\n loader.start();\n\n let attempts = 0;\n const maxAttempts = 3;\n let published = false;\n\n while (!published && attempts < maxAttempts) {\n attempts++;\n\n try {\n await publishSinglePackage({\n packagePath: pkg.path,\n otp,\n dryRun,\n tag,\n access,\n });\n\n published = true;\n results.push({ name: pkg.name, version: pkg.version, success: true });\n\n const successMsg = dryRun\n ? `Dry-run succeeded for ${pkg.name}@${pkg.version}`\n : `Published ${pkg.name}@${pkg.version}`;\n\n loader.succeed(successMsg);\n logger?.info('Package published successfully', {\n name: pkg.name,\n version: pkg.version,\n dryRun,\n });\n } catch (error: any) {\n const errorMessage = error.message || String(error);\n\n // Check if OTP is required\n if (errorMessage.includes('EOTP') || errorMessage.includes('one-time password')) {\n if (attempts < maxAttempts) {\n loader.succeed(`🔐 2FA required for ${pkg.name}`);\n logger?.info('OTP required for publishing', {\n name: pkg.name,\n attempt: attempts,\n });\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n otp = await rl.question(' Enter OTP code: ');\n rl.close();\n\n if (!otp || otp.trim().length !== 6) {\n ui.write?.(' ⚠️ Invalid OTP code (must be 6 digits)\\n');\n logger?.warn('Invalid OTP code provided', { length: otp?.trim().length });\n otp = undefined;\n continue;\n }\n\n loader.update({ text: `Publishing ${pkg.name}@${pkg.version} with OTP...` });\n loader.start();\n logger?.debug('Retrying with OTP');\n } catch (e) {\n rl.close();\n throw e;\n }\n } else {\n loader.fail('Max OTP attempts reached');\n logger?.error('Max OTP attempts reached', {\n name: pkg.name,\n attempts: maxAttempts,\n });\n results.push({\n name: pkg.name,\n version: pkg.version,\n success: false,\n error: 'Max OTP attempts reached',\n });\n break;\n }\n } else {\n loader.fail(`Failed: ${errorMessage}`);\n logger?.error('Package publish failed', {\n name: pkg.name,\n version: pkg.version,\n error: errorMessage,\n });\n results.push({\n name: pkg.name,\n version: pkg.version,\n success: false,\n error: errorMessage,\n });\n break;\n }\n }\n }\n } finally {\n // Always restore original package.json\n if (!restored) {\n writeFileSync(pkgJsonPath, originalPkgJson);\n restored = true;\n }\n }\n }\n\n // Build result summary\n const published = results\n .filter((r) => r.success)\n .map((r) => `${r.name}@${r.version}`);\n const failed = results\n .filter((r) => !r.success)\n .map((r) => `${r.name}@${r.version}`);\n const errors = results\n .filter((r) => !r.success && r.error)\n .map((r) => `${r.name}: ${r.error}`);\n\n return {\n results,\n published,\n failed,\n skipped: dryRun ? packages.map((p) => `${p.name}@${p.version} (dry-run)`) : [],\n errors,\n };\n}\n\ninterface PublishSingleOptions {\n packagePath: string;\n otp?: string;\n dryRun?: boolean;\n tag?: string;\n access?: string;\n}\n\n/**\n * Publish a single package using npm CLI\n */\nfunction publishSinglePackage(options: PublishSingleOptions): Promise<void> {\n const { packagePath, otp, dryRun, tag, access } = options;\n\n return new Promise((resolve, reject) => {\n const args = ['publish'];\n\n if (dryRun) {\n args.push('--dry-run');\n }\n\n if (otp) {\n args.push(`--otp=${otp}`);\n }\n\n if (tag) {\n args.push(`--tag=${tag}`);\n }\n\n if (access) {\n args.push(`--access=${access}`);\n }\n\n const child = spawn('npm', args, {\n cwd: packagePath,\n stdio: ['inherit', 'pipe', 'pipe'],\n shell: true,\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n const errorOutput = stderr || stdout;\n reject(new Error(errorOutput));\n }\n });\n\n child.on('error', (err) => {\n reject(err);\n });\n });\n}\n","/**\n * Standalone npm publish command — thin adapter over planRelease + publish.\n * No build/verify steps (those belong in release:run pipeline).\n *\n * Token-first (programmatic), OTP fallback for interactive terminal.\n */\n\nimport { defineCommand, type CLIInput, type PluginContextV3, useLoader, useConfig } from '@kb-labs/sdk';\nimport { planRelease, type ReleaseConfig } from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { publishPackagesProgrammatic, type ProgrammaticPublishResult } from '../../shared/publish-programmatic';\nimport { publishPackagesWithOTP, type PublishWithOTPResult } from '../../shared/publish-with-otp';\n\ninterface PublishFlags {\n scope?: string;\n otp?: string;\n 'dry-run'?: boolean;\n tag?: string;\n access?: string;\n token?: string;\n json?: boolean;\n}\n\ninterface PublishResult {\n exitCode: number;\n published?: Array<{ name: string; version: string }>;\n failed?: Array<{ name: string; version: string; error: string }>;\n summary?: {\n total: number;\n successful: number;\n failed: number;\n };\n}\n\nexport default defineCommand({\n id: 'release:publish',\n description: 'Publish packages to npm registry',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<PublishFlags>): Promise<PublishResult> {\n const { flags } = input;\n const { scope, otp: initialOtp, tag, access, json } = flags;\n const dryRun = flags['dry-run'];\n const token = flags.token ?? process.env.NPM_TOKEN ?? process.env.NODE_AUTH_TOKEN;\n\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n // 1. Discover packages via planRelease\n const discoveryLoader = useLoader('Discovering packages...');\n discoveryLoader.start();\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = fileConfig ?? {};\n const plan = await planRelease({ cwd: repoRoot, config, scope });\n\n const packages = plan.packages.map(pkg => ({\n name: pkg.name,\n version: pkg.nextVersion,\n path: pkg.path,\n }));\n\n discoveryLoader.succeed(`Found ${packages.length} package(s)`);\n\n if (packages.length === 0) {\n const msg = `No packages found to publish${scope ? ` matching scope: ${scope}` : ''}`;\n if (json) {\n ctx.ui?.json?.({ error: msg });\n } else {\n ctx.ui?.write?.(msg);\n }\n return { exitCode: 1, summary: { total: 0, successful: 0, failed: 0 } };\n }\n\n // 2. Publish — token-first (programmatic), OTP fallback for interactive terminal\n let result: ProgrammaticPublishResult | PublishWithOTPResult;\n if (token) {\n result = await publishPackagesProgrammatic({\n packages,\n dryRun,\n otp: initialOtp,\n tag,\n access: access as 'public' | 'restricted' | undefined,\n token,\n });\n } else {\n result = await publishPackagesWithOTP({\n packages,\n dryRun,\n otp: initialOtp,\n tag,\n access: access ?? 'public',\n ui: ctx.ui,\n logger: ctx.platform?.logger,\n });\n }\n\n // 3. Format output\n const successful = result.results.filter((r) => r.success).length;\n const failed = result.results.filter((r) => !r.success).length;\n\n const publishResult: PublishResult = {\n exitCode: failed === 0 ? 0 : 1,\n published: result.results.filter((r) => r.success).map((r) => ({ name: r.name, version: r.version })),\n failed: result.results.filter((r) => !r.success).map((r) => ({\n name: r.name,\n version: r.version,\n error: r.error || 'Unknown error',\n })),\n summary: { total: result.results.length, successful, failed },\n };\n\n if (json) {\n ctx.ui?.json?.(publishResult);\n return publishResult;\n }\n\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n if (successful > 0) {\n const successItems: string[] = [];\n for (const r of result.results.filter((r) => r.success)) {\n successItems.push(`${ctx.ui.symbols.success} ${r.name}@${r.version}`);\n successItems.push(` └─ https://www.npmjs.com/package/${r.name}`);\n }\n sections.push({ header: 'Published', items: successItems });\n }\n\n if (failed > 0) {\n const failItems = result.results\n .filter((r) => !r.success)\n .map((r) => `${ctx.ui.symbols.error} ${r.name}@${r.version} - ${r.error}`);\n sections.push({ header: 'Failed', items: failItems });\n }\n\n ctx.ui.sideBox({\n title: dryRun ? 'Publish Dry-Run' : 'Publish Summary',\n sections,\n status: failed === 0 ? 'success' : 'error',\n });\n\n return publishResult;\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../src/shared/publish-programmatic.ts","../../../src/shared/publish-with-otp.ts","../../../src/cli/commands/publish.ts"],"names":["join","readFileSync","writeFileSync","published","publishSinglePackage","spawn","useLoader","r"],"mappings":"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","file":"publish.js","sourcesContent":["/**\n * Programmatic npm publishing for REST handlers (non-interactive context)\n *\n * Uses `npm publish` CLI via spawn with NODE_AUTH_TOKEN env variable.\n * This is the correct approach for granular access tokens (classic tokens\n * were revoked by npm in December 2025).\n *\n * Token resolution order:\n * 1. options.token (explicit override)\n * 2. NPM_TOKEN env variable\n * 3. NODE_AUTH_TOKEN env variable\n */\n\nimport { spawn } from 'node:child_process';\nimport { readFileSync, writeFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { useLogger } from '@kb-labs/sdk';\n\nexport interface PackageToPublish {\n name: string;\n version: string;\n path: string;\n}\n\nexport interface ProgrammaticPublishOptions {\n packages: PackageToPublish[];\n packageManager?: 'pnpm' | 'npm' | 'yarn';\n dryRun?: boolean;\n otp?: string;\n tag?: string;\n access?: 'public' | 'restricted';\n registry?: string;\n token?: string;\n}\n\nexport interface PublishResult {\n name: string;\n version: string;\n success: boolean;\n error?: string;\n}\n\nexport interface ProgrammaticPublishResult {\n results: PublishResult[];\n published: string[];\n failed: string[];\n skipped: string[];\n errors: string[];\n}\n\n/**\n * Resolve npm auth token from options or environment\n */\nfunction resolveToken(token?: string): string | undefined {\n return token ?? process.env.NPM_TOKEN ?? process.env.NODE_AUTH_TOKEN;\n}\n\n/**\n * Publish a single package using npm CLI\n * Passes auth token via NODE_AUTH_TOKEN env (recommended for granular tokens)\n */\nfunction publishSinglePackage(options: {\n packagePath: string;\n packageManager: string;\n token: string | undefined;\n otp?: string;\n dryRun?: boolean;\n tag?: string;\n access?: string;\n registry?: string;\n}): Promise<void> {\n const { packagePath, packageManager, token, otp, dryRun, tag, access, registry } = options;\n\n return new Promise((resolve, reject) => {\n const args = ['publish'];\n\n // pnpm checks git cleanliness before publish, but our pipeline already bumps versions\n // (making the tree dirty) before calling publish — disable this check.\n if (packageManager === 'pnpm') {\n args.push('--no-git-checks');\n }\n\n if (dryRun) {\n args.push('--dry-run');\n }\n\n if (tag) {\n args.push(`--tag=${tag}`);\n }\n\n if (access) {\n args.push(`--access=${access}`);\n }\n\n if (registry) {\n args.push(`--registry=${registry}`);\n }\n\n if (otp) {\n args.push(`--otp=${otp}`);\n }\n\n // Pass token via env — this is the correct way for granular tokens\n const env: NodeJS.ProcessEnv = { ...process.env };\n if (token) {\n env['NODE_AUTH_TOKEN'] = token;\n }\n\n const child = spawn(packageManager, args, {\n cwd: packagePath,\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n env,\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data: Buffer) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data: Buffer) => {\n stderr += data.toString();\n });\n\n child.on('close', (code: number | null) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(stderr || stdout || `${packageManager} publish exited with code ${code}`));\n }\n });\n\n child.on('error', (err: Error) => {\n reject(err);\n });\n });\n}\n\n/**\n * Publish packages programmatically (non-interactive, for REST handlers)\n * Uses npm CLI with NODE_AUTH_TOKEN — works with granular access tokens.\n */\nexport async function publishPackagesProgrammatic(\n options: ProgrammaticPublishOptions\n): Promise<ProgrammaticPublishResult> {\n const { packages, packageManager = 'pnpm', dryRun, otp, tag, access, registry } = options;\n const logger = useLogger();\n\n const token = resolveToken(options.token);\n\n if (!token && !dryRun) {\n const error = 'No npm token found. Set NPM_TOKEN (or NODE_AUTH_TOKEN) in environment.';\n logger.error(error);\n return {\n results: [],\n published: [],\n failed: packages.map((p) => `${p.name}@${p.version}`),\n skipped: [],\n errors: [error],\n };\n }\n\n const results: PublishResult[] = [];\n\n // Build version map from all packages in this release for link: → ^version replacement\n const versionMap = new Map(packages.map(p => [p.name, p.version]));\n\n for (const pkg of packages) {\n logger.info(`Publishing ${pkg.name}@${pkg.version}`, { path: pkg.path, dryRun });\n\n // Replace link: deps with real versions before publish, restore after\n const pkgJsonPath = join(pkg.path, 'package.json');\n const originalPkgJson = readFileSync(pkgJsonPath, 'utf-8');\n let restored = false;\n\n try {\n const pkgJson = JSON.parse(originalPkgJson);\n let modified = false;\n\n for (const section of ['dependencies', 'peerDependencies'] as const) {\n const deps = pkgJson[section];\n if (!deps) {continue;}\n for (const [depName, depValue] of Object.entries(deps)) {\n if (typeof depValue !== 'string') {continue;}\n const val = depValue as string;\n\n if (val.startsWith('link:')) {\n // Cross-repo link: → ^version from plan or linked package.json\n const planVersion = versionMap.get(depName);\n if (planVersion) {\n deps[depName] = `^${planVersion}`;\n modified = true;\n } else {\n try {\n const linkPath = val.replace('link:', '');\n const linkedPkg = JSON.parse(readFileSync(join(pkg.path, linkPath, 'package.json'), 'utf-8'));\n deps[depName] = `^${linkedPkg.version}`;\n modified = true;\n } catch {\n deps[depName] = '*';\n modified = true;\n }\n }\n } else if (val.startsWith('workspace:') && packageManager !== 'pnpm') {\n // workspace:* → ^version only needed for npm/yarn (pnpm publish handles this automatically)\n const planVersion = versionMap.get(depName);\n if (planVersion) {\n deps[depName] = val === 'workspace:*' ? `^${planVersion}` : val.replace('workspace:', '');\n modified = true;\n }\n }\n }\n }\n\n if (modified) {\n writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + '\\n');\n logger.info(`Replaced link: deps for ${pkg.name}`);\n }\n\n await publishSinglePackage({\n packagePath: pkg.path,\n packageManager,\n token,\n otp,\n dryRun,\n tag,\n access: access ?? 'public',\n registry,\n });\n\n results.push({ name: pkg.name, version: pkg.version, success: true });\n logger.info(`Published ${pkg.name}@${pkg.version}`);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n\n logger.error(`Failed to publish ${pkg.name}@${pkg.version}`, undefined, { error: message });\n\n results.push({\n name: pkg.name,\n version: pkg.version,\n success: false,\n error: message,\n });\n } finally {\n // Always restore original package.json\n if (!restored) {\n writeFileSync(pkgJsonPath, originalPkgJson);\n restored = true;\n }\n }\n }\n\n const published = results.filter((r) => r.success).map((r) => `${r.name}@${r.version}`);\n const failed = results.filter((r) => !r.success).map((r) => `${r.name}@${r.version}`);\n const errors = results.filter((r) => !r.success && r.error).map((r) => `${r.name}: ${r.error}`);\n\n return {\n results,\n published,\n failed,\n skipped: dryRun ? packages.map((p) => `${p.name}@${p.version} (dry-run)`) : [],\n errors,\n };\n}\n","/**\n * Shared publishing logic with interactive OTP support\n * Used by both `release:run` and `release publish` commands\n */\n\nimport { spawn } from 'node:child_process';\nimport { readFileSync, writeFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport * as readline from 'node:readline/promises';\nimport { useLoader } from '@kb-labs/sdk';\n\nexport interface PackageToPublish {\n name: string;\n version: string;\n path: string;\n}\n\nexport interface PublishWithOTPOptions {\n packages: PackageToPublish[];\n packageManager?: 'pnpm' | 'npm' | 'yarn';\n dryRun?: boolean;\n otp?: string;\n tag?: string;\n access?: string;\n ui: {\n write?: (text: string) => void;\n };\n logger?: {\n info: (msg: string, meta?: any) => void;\n warn: (msg: string, meta?: any) => void;\n error: (msg: string, meta?: any) => void;\n debug: (msg: string, meta?: any) => void;\n };\n}\n\nexport interface PublishResult {\n name: string;\n version: string;\n success: boolean;\n error?: string;\n}\n\nexport interface PublishWithOTPResult {\n results: PublishResult[];\n published: string[];\n failed: string[];\n skipped: string[];\n errors: string[];\n}\n\n/**\n * Publish packages with interactive OTP support\n */\nexport async function publishPackagesWithOTP(\n options: PublishWithOTPOptions\n): Promise<PublishWithOTPResult> {\n const { packages, packageManager = 'pnpm', dryRun, tag, access, ui, logger } = options;\n let otp = options.otp;\n\n const results: PublishResult[] = [];\n\n // Build version map from all packages in this release for link: → ^version replacement\n const versionMap = new Map(packages.map(p => [p.name, p.version]));\n\n for (const pkg of packages) {\n logger?.info('Publishing package', { name: pkg.name, version: pkg.version });\n\n // Replace link: deps with real versions before publish, restore after\n const pkgJsonPath = join(pkg.path, 'package.json');\n const originalPkgJson = readFileSync(pkgJsonPath, 'utf-8');\n let restored = false;\n\n try {\n const pkgJson = JSON.parse(originalPkgJson);\n let modified = false;\n\n for (const section of ['dependencies', 'peerDependencies'] as const) {\n const deps = pkgJson[section];\n if (!deps) {continue;}\n for (const [depName, depValue] of Object.entries(deps)) {\n if (typeof depValue !== 'string') {continue;}\n const val = depValue as string;\n\n if (val.startsWith('link:')) {\n const planVersion = versionMap.get(depName);\n if (planVersion) {\n deps[depName] = `^${planVersion}`;\n modified = true;\n } else {\n try {\n const linkPath = val.replace('link:', '');\n const linkedPkg = JSON.parse(readFileSync(join(pkg.path, linkPath, 'package.json'), 'utf-8'));\n deps[depName] = `^${linkedPkg.version}`;\n modified = true;\n } catch {\n deps[depName] = '*';\n modified = true;\n }\n }\n } else if (val.startsWith('workspace:') && packageManager !== 'pnpm') {\n // workspace:* → ^version only needed for npm/yarn (pnpm publish handles this automatically)\n const planVersion = versionMap.get(depName);\n if (planVersion) {\n deps[depName] = val === 'workspace:*' ? `^${planVersion}` : val.replace('workspace:', '');\n modified = true;\n }\n }\n }\n }\n\n if (modified) {\n writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + '\\n');\n logger?.info(`Replaced link: deps for ${pkg.name}`);\n }\n\n const loader = useLoader(`Publishing ${pkg.name}@${pkg.version}...`);\n loader.start();\n\n let attempts = 0;\n const maxAttempts = 3;\n let published = false;\n\n while (!published && attempts < maxAttempts) {\n attempts++;\n\n try {\n await publishSinglePackage({\n packagePath: pkg.path,\n packageManager,\n otp,\n dryRun,\n tag,\n access,\n });\n\n published = true;\n results.push({ name: pkg.name, version: pkg.version, success: true });\n\n const successMsg = dryRun\n ? `Dry-run succeeded for ${pkg.name}@${pkg.version}`\n : `Published ${pkg.name}@${pkg.version}`;\n\n loader.succeed(successMsg);\n logger?.info('Package published successfully', {\n name: pkg.name,\n version: pkg.version,\n dryRun,\n });\n } catch (error: any) {\n const errorMessage = error.message || String(error);\n\n // Check if OTP is required\n if (errorMessage.includes('EOTP') || errorMessage.includes('one-time password')) {\n if (attempts < maxAttempts) {\n loader.succeed(`🔐 2FA required for ${pkg.name}`);\n logger?.info('OTP required for publishing', {\n name: pkg.name,\n attempt: attempts,\n });\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n try {\n otp = await rl.question(' Enter OTP code: ');\n rl.close();\n\n if (!otp || otp.trim().length !== 6) {\n ui.write?.(' ⚠️ Invalid OTP code (must be 6 digits)\\n');\n logger?.warn('Invalid OTP code provided', { length: otp?.trim().length });\n otp = undefined;\n continue;\n }\n\n loader.update({ text: `Publishing ${pkg.name}@${pkg.version} with OTP...` });\n loader.start();\n logger?.debug('Retrying with OTP');\n } catch (e) {\n rl.close();\n throw e;\n }\n } else {\n loader.fail('Max OTP attempts reached');\n logger?.error('Max OTP attempts reached', {\n name: pkg.name,\n attempts: maxAttempts,\n });\n results.push({\n name: pkg.name,\n version: pkg.version,\n success: false,\n error: 'Max OTP attempts reached',\n });\n break;\n }\n } else {\n loader.fail(`Failed: ${errorMessage}`);\n logger?.error('Package publish failed', {\n name: pkg.name,\n version: pkg.version,\n error: errorMessage,\n });\n results.push({\n name: pkg.name,\n version: pkg.version,\n success: false,\n error: errorMessage,\n });\n break;\n }\n }\n }\n } finally {\n // Always restore original package.json\n if (!restored) {\n writeFileSync(pkgJsonPath, originalPkgJson);\n restored = true;\n }\n }\n }\n\n // Build result summary\n const published = results\n .filter((r) => r.success)\n .map((r) => `${r.name}@${r.version}`);\n const failed = results\n .filter((r) => !r.success)\n .map((r) => `${r.name}@${r.version}`);\n const errors = results\n .filter((r) => !r.success && r.error)\n .map((r) => `${r.name}: ${r.error}`);\n\n return {\n results,\n published,\n failed,\n skipped: dryRun ? packages.map((p) => `${p.name}@${p.version} (dry-run)`) : [],\n errors,\n };\n}\n\ninterface PublishSingleOptions {\n packagePath: string;\n packageManager?: 'pnpm' | 'npm' | 'yarn';\n otp?: string;\n dryRun?: boolean;\n tag?: string;\n access?: string;\n}\n\n/**\n * Publish a single package using npm CLI\n */\nfunction publishSinglePackage(options: PublishSingleOptions): Promise<void> {\n const { packagePath, packageManager = 'pnpm', otp, dryRun, tag, access } = options;\n\n return new Promise((resolve, reject) => {\n const args = ['publish'];\n\n if (packageManager === 'pnpm') {\n args.push('--no-git-checks');\n }\n\n if (dryRun) {\n args.push('--dry-run');\n }\n\n if (otp) {\n args.push(`--otp=${otp}`);\n }\n\n if (tag) {\n args.push(`--tag=${tag}`);\n }\n\n if (access) {\n args.push(`--access=${access}`);\n }\n\n const child = spawn(packageManager, args, {\n cwd: packagePath,\n stdio: ['inherit', 'pipe', 'pipe'],\n shell: true,\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n const errorOutput = stderr || stdout;\n reject(new Error(errorOutput));\n }\n });\n\n child.on('error', (err) => {\n reject(err);\n });\n });\n}\n","/**\n * Standalone npm publish command — thin adapter over planRelease + publish.\n * No build/verify steps (those belong in release:run pipeline).\n *\n * Token-first (programmatic), OTP fallback for interactive terminal.\n */\n\nimport { defineCommand, type CLIInput, type PluginContextV3, useLoader, useConfig } from '@kb-labs/sdk';\nimport { planRelease, type ReleaseConfig } from '@kb-labs/release-manager-core';\nimport { findRepoRoot } from '../../shared/utils';\nimport { publishPackagesProgrammatic, type ProgrammaticPublishResult } from '../../shared/publish-programmatic';\nimport { publishPackagesWithOTP, type PublishWithOTPResult } from '../../shared/publish-with-otp';\n\ninterface PublishFlags {\n scope?: string;\n otp?: string;\n 'dry-run'?: boolean;\n tag?: string;\n access?: string;\n token?: string;\n json?: boolean;\n}\n\ninterface PublishResult {\n exitCode: number;\n published?: Array<{ name: string; version: string }>;\n failed?: Array<{ name: string; version: string; error: string }>;\n summary?: {\n total: number;\n successful: number;\n failed: number;\n };\n}\n\nexport default defineCommand({\n id: 'release:publish',\n description: 'Publish packages to npm registry',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<PublishFlags>): Promise<PublishResult> {\n const { flags } = input;\n const { scope, otp: initialOtp, tag, access, json } = flags;\n const dryRun = flags['dry-run'];\n const token = flags.token ?? process.env.NPM_TOKEN ?? process.env.NODE_AUTH_TOKEN;\n\n const cwd = ctx.cwd || process.cwd();\n const repoRoot = await findRepoRoot(cwd);\n\n // 1. Discover packages via planRelease\n const discoveryLoader = useLoader('Discovering packages...');\n discoveryLoader.start();\n\n const fileConfig = await useConfig<ReleaseConfig>();\n const config: ReleaseConfig = fileConfig ?? {};\n const plan = await planRelease({ cwd: repoRoot, config, scope });\n\n const packages = plan.packages.map(pkg => ({\n name: pkg.name,\n version: pkg.nextVersion,\n path: pkg.path,\n }));\n\n discoveryLoader.succeed(`Found ${packages.length} package(s)`);\n\n if (packages.length === 0) {\n const msg = `No packages found to publish${scope ? ` matching scope: ${scope}` : ''}`;\n if (json) {\n ctx.ui?.json?.({ error: msg });\n } else {\n ctx.ui?.write?.(msg);\n }\n return { exitCode: 1, summary: { total: 0, successful: 0, failed: 0 } };\n }\n\n // 2. Publish — token-first (programmatic), OTP fallback for interactive terminal\n let result: ProgrammaticPublishResult | PublishWithOTPResult;\n if (token) {\n result = await publishPackagesProgrammatic({\n packages,\n dryRun,\n otp: initialOtp,\n tag,\n access: access as 'public' | 'restricted' | undefined,\n token,\n });\n } else {\n result = await publishPackagesWithOTP({\n packages,\n dryRun,\n otp: initialOtp,\n tag,\n access: access ?? 'public',\n ui: ctx.ui,\n logger: ctx.platform?.logger,\n });\n }\n\n // 3. Format output\n const successful = result.results.filter((r) => r.success).length;\n const failed = result.results.filter((r) => !r.success).length;\n\n const publishResult: PublishResult = {\n exitCode: failed === 0 ? 0 : 1,\n published: result.results.filter((r) => r.success).map((r) => ({ name: r.name, version: r.version })),\n failed: result.results.filter((r) => !r.success).map((r) => ({\n name: r.name,\n version: r.version,\n error: r.error || 'Unknown error',\n })),\n summary: { total: result.results.length, successful, failed },\n };\n\n if (json) {\n ctx.ui?.json?.(publishResult);\n return publishResult;\n }\n\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n if (successful > 0) {\n const successItems: string[] = [];\n for (const r of result.results.filter((r) => r.success)) {\n successItems.push(`${ctx.ui.symbols.success} ${r.name}@${r.version}`);\n successItems.push(` └─ https://www.npmjs.com/package/${r.name}`);\n }\n sections.push({ header: 'Published', items: successItems });\n }\n\n if (failed > 0) {\n const failItems = result.results\n .filter((r) => !r.success)\n .map((r) => `${ctx.ui.symbols.error} ${r.name}@${r.version} - ${r.error}`);\n sections.push({ header: 'Failed', items: failItems });\n }\n\n ctx.ui.sideBox({\n title: dryRun ? 'Publish Dry-Run' : 'Publish Summary',\n sections,\n status: failed === 0 ? 'success' : 'error',\n });\n\n return publishResult;\n },\n },\n});\n"]}
@@ -6,7 +6,7 @@ import 'fs/promises';
6
6
  import 'globby';
7
7
  import { generateChangelog, generateSimpleChangelog } from '@kb-labs/release-manager-changelog';
8
8
  import { spawn } from 'child_process';
9
- import { readFileSync, readdirSync, writeFileSync } from 'fs';
9
+ import { readFileSync, writeFileSync } from 'fs';
10
10
 
11
11
  // src/cli/commands/run.ts
12
12
  function createChangelogGenerator(config, llm) {
@@ -56,9 +56,12 @@ function resolveToken(token) {
56
56
  return token ?? process.env.NPM_TOKEN ?? process.env.NODE_AUTH_TOKEN;
57
57
  }
58
58
  function publishSinglePackage(options) {
59
- const { packagePath, token, otp, dryRun, tag, access, registry } = options;
59
+ const { packagePath, packageManager, token, otp, dryRun, tag, access, registry } = options;
60
60
  return new Promise((resolve, reject) => {
61
61
  const args = ["publish"];
62
+ if (packageManager === "pnpm") {
63
+ args.push("--no-git-checks");
64
+ }
62
65
  if (dryRun) {
63
66
  args.push("--dry-run");
64
67
  }
@@ -78,7 +81,7 @@ function publishSinglePackage(options) {
78
81
  if (token) {
79
82
  env["NODE_AUTH_TOKEN"] = token;
80
83
  }
81
- const child = spawn("npm", args, {
84
+ const child = spawn(packageManager, args, {
82
85
  cwd: packagePath,
83
86
  stdio: ["ignore", "pipe", "pipe"],
84
87
  shell: true,
@@ -96,7 +99,7 @@ function publishSinglePackage(options) {
96
99
  if (code === 0) {
97
100
  resolve();
98
101
  } else {
99
- reject(new Error(stderr || stdout || `npm publish exited with code ${code}`));
102
+ reject(new Error(stderr || stdout || `${packageManager} publish exited with code ${code}`));
100
103
  }
101
104
  });
102
105
  child.on("error", (err) => {
@@ -105,7 +108,7 @@ function publishSinglePackage(options) {
105
108
  });
106
109
  }
107
110
  async function publishPackagesProgrammatic(options) {
108
- const { packages, dryRun, otp, tag, access, registry } = options;
111
+ const { packages, packageManager = "pnpm", dryRun, otp, tag, access, registry } = options;
109
112
  const logger = useLogger();
110
113
  const token = resolveToken(options.token);
111
114
  if (!token && !dryRun) {
@@ -155,30 +158,11 @@ async function publishPackagesProgrammatic(options) {
155
158
  modified = true;
156
159
  }
157
160
  }
158
- } else if (val.startsWith("workspace:")) {
161
+ } else if (val.startsWith("workspace:") && packageManager !== "pnpm") {
159
162
  const planVersion = versionMap.get(depName);
160
163
  if (planVersion) {
161
164
  deps[depName] = val === "workspace:*" ? `^${planVersion}` : val.replace("workspace:", "");
162
165
  modified = true;
163
- } else {
164
- try {
165
- const repoRoot = join(pkg.path, "..");
166
- const candidates = readdirSync(repoRoot, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => join(repoRoot, d.name, "package.json"));
167
- for (const candidate of candidates) {
168
- try {
169
- const cPkg = JSON.parse(readFileSync(candidate, "utf-8"));
170
- if (cPkg.name === depName) {
171
- deps[depName] = `^${cPkg.version}`;
172
- modified = true;
173
- break;
174
- }
175
- } catch {
176
- }
177
- }
178
- } catch {
179
- deps[depName] = "*";
180
- modified = true;
181
- }
182
166
  }
183
167
  }
184
168
  }
@@ -189,6 +173,7 @@ async function publishPackagesProgrammatic(options) {
189
173
  }
190
174
  await publishSinglePackage({
191
175
  packagePath: pkg.path,
176
+ packageManager,
192
177
  token,
193
178
  otp,
194
179
  dryRun,
@@ -226,7 +211,7 @@ async function publishPackagesProgrammatic(options) {
226
211
  };
227
212
  }
228
213
  async function publishPackagesWithOTP(options) {
229
- const { packages, dryRun, tag, access, ui, logger } = options;
214
+ const { packages, packageManager = "pnpm", dryRun, tag, access, ui, logger } = options;
230
215
  let otp = options.otp;
231
216
  const results = [];
232
217
  const versionMap = new Map(packages.map((p) => [p.name, p.version]));
@@ -264,30 +249,11 @@ async function publishPackagesWithOTP(options) {
264
249
  modified = true;
265
250
  }
266
251
  }
267
- } else if (val.startsWith("workspace:")) {
252
+ } else if (val.startsWith("workspace:") && packageManager !== "pnpm") {
268
253
  const planVersion = versionMap.get(depName);
269
254
  if (planVersion) {
270
255
  deps[depName] = val === "workspace:*" ? `^${planVersion}` : val.replace("workspace:", "");
271
256
  modified = true;
272
- } else {
273
- try {
274
- const repoRoot = join(pkg.path, "..");
275
- const candidates = readdirSync(repoRoot, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => join(repoRoot, d.name, "package.json"));
276
- for (const candidate of candidates) {
277
- try {
278
- const cPkg = JSON.parse(readFileSync(candidate, "utf-8"));
279
- if (cPkg.name === depName) {
280
- deps[depName] = `^${cPkg.version}`;
281
- modified = true;
282
- break;
283
- }
284
- } catch {
285
- }
286
- }
287
- } catch {
288
- deps[depName] = "*";
289
- modified = true;
290
- }
291
257
  }
292
258
  }
293
259
  }
@@ -306,6 +272,7 @@ async function publishPackagesWithOTP(options) {
306
272
  try {
307
273
  await publishSinglePackage2({
308
274
  packagePath: pkg.path,
275
+ packageManager,
309
276
  otp,
310
277
  dryRun,
311
278
  tag,
@@ -399,9 +366,12 @@ async function publishPackagesWithOTP(options) {
399
366
  };
400
367
  }
401
368
  function publishSinglePackage2(options) {
402
- const { packagePath, otp, dryRun, tag, access } = options;
369
+ const { packagePath, packageManager = "pnpm", otp, dryRun, tag, access } = options;
403
370
  return new Promise((resolve, reject) => {
404
371
  const args = ["publish"];
372
+ if (packageManager === "pnpm") {
373
+ args.push("--no-git-checks");
374
+ }
405
375
  if (dryRun) {
406
376
  args.push("--dry-run");
407
377
  }
@@ -414,7 +384,7 @@ function publishSinglePackage2(options) {
414
384
  if (access) {
415
385
  args.push(`--access=${access}`);
416
386
  }
417
- const child = spawn("npm", args, {
387
+ const child = spawn(packageManager, args, {
418
388
  cwd: packagePath,
419
389
  stdio: ["inherit", "pipe", "pipe"],
420
390
  shell: true
@@ -527,13 +497,15 @@ var run_default = defineCommand({
527
497
  const llm = useLLM();
528
498
  const changelog = createChangelogGenerator(config, llm ?? void 0);
529
499
  const token = process.env.NPM_TOKEN ?? process.env.NODE_AUTH_TOKEN;
500
+ const packageManager = config.workspace?.type ?? config.publish?.packageManager ?? "pnpm";
530
501
  const publisher = {
531
502
  async publish(packages, opts) {
532
503
  if (token) {
533
- return publishPackagesProgrammatic({ packages, dryRun: opts.dryRun });
504
+ return publishPackagesProgrammatic({ packages, packageManager, dryRun: opts.dryRun });
534
505
  }
535
506
  return publishPackagesWithOTP({
536
507
  packages,
508
+ packageManager,
537
509
  dryRun: opts.dryRun,
538
510
  access: opts.access ?? "public",
539
511
  ui: ctx.ui,