@databricks-solutions/lakebase-scm-utils 0.2.43 → 0.2.44

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.
Files changed (57) hide show
  1. package/dist/scripts/github/index.cjs +21 -4
  2. package/dist/scripts/github/index.js +21 -4
  3. package/dist/scripts/github/pr.cli.cjs +21 -4
  4. package/dist/scripts/github/pr.cli.js +21 -4
  5. package/dist/scripts/index.cjs +40 -10
  6. package/dist/scripts/index.js +40 -10
  7. package/dist/scripts/lakebase/branch.cli.cjs +21 -4
  8. package/dist/scripts/lakebase/branch.cli.js +21 -4
  9. package/dist/scripts/lakebase/ci-app-endpoint.cli.cjs +21 -4
  10. package/dist/scripts/lakebase/ci-app-endpoint.cli.js +21 -4
  11. package/dist/scripts/lakebase/ci-resolve-branch.cli.cjs +23 -6
  12. package/dist/scripts/lakebase/ci-resolve-branch.cli.js +23 -6
  13. package/dist/scripts/lakebase/collapse-heads.cli.cjs +23 -6
  14. package/dist/scripts/lakebase/collapse-heads.cli.js +23 -6
  15. package/dist/scripts/lakebase/cut-backup.cli.cjs +21 -4
  16. package/dist/scripts/lakebase/cut-backup.cli.js +21 -4
  17. package/dist/scripts/lakebase/cut-tier.cli.cjs +21 -4
  18. package/dist/scripts/lakebase/cut-tier.cli.js +21 -4
  19. package/dist/scripts/lakebase/detect-language.cli.cjs +23 -6
  20. package/dist/scripts/lakebase/detect-language.cli.js +23 -6
  21. package/dist/scripts/lakebase/doctor.cli.cjs +23 -6
  22. package/dist/scripts/lakebase/doctor.cli.js +23 -6
  23. package/dist/scripts/lakebase/get-connection.cli.cjs +23 -6
  24. package/dist/scripts/lakebase/get-connection.cli.js +23 -6
  25. package/dist/scripts/lakebase/index.cjs +40 -10
  26. package/dist/scripts/lakebase/index.js +40 -10
  27. package/dist/scripts/lakebase/infra-runner.cli.cjs +23 -6
  28. package/dist/scripts/lakebase/infra-runner.cli.js +23 -6
  29. package/dist/scripts/lakebase/new-migration.cli.cjs +23 -6
  30. package/dist/scripts/lakebase/new-migration.cli.js +23 -6
  31. package/dist/scripts/lakebase/schema-diff.cli.cjs +23 -6
  32. package/dist/scripts/lakebase/schema-diff.cli.js +23 -6
  33. package/dist/scripts/lakebase/schema-migrate.cli.cjs +23 -6
  34. package/dist/scripts/lakebase/schema-migrate.cli.js +23 -6
  35. package/dist/scripts/lakebase/scm-abandon-feature.cli.cjs +21 -4
  36. package/dist/scripts/lakebase/scm-abandon-feature.cli.js +21 -4
  37. package/dist/scripts/lakebase/scm-adopt-state.cli.cjs +21 -4
  38. package/dist/scripts/lakebase/scm-adopt-state.cli.js +21 -4
  39. package/dist/scripts/lakebase/scm-claim-feature.cli.cjs +23 -6
  40. package/dist/scripts/lakebase/scm-claim-feature.cli.js +23 -6
  41. package/dist/scripts/lakebase/scm-cleanup.cli.cjs +21 -4
  42. package/dist/scripts/lakebase/scm-cleanup.cli.js +21 -4
  43. package/dist/scripts/lakebase/scm-doctor.cli.cjs +23 -6
  44. package/dist/scripts/lakebase/scm-doctor.cli.js +23 -6
  45. package/dist/scripts/lakebase/scm-merge.cli.cjs +23 -6
  46. package/dist/scripts/lakebase/scm-merge.cli.js +23 -6
  47. package/dist/scripts/lakebase/scm-reconcile-tier.cli.cjs +23 -6
  48. package/dist/scripts/lakebase/scm-reconcile-tier.cli.js +23 -6
  49. package/dist/scripts/lakebase/scm-recover-orphans.cli.cjs +21 -4
  50. package/dist/scripts/lakebase/scm-recover-orphans.cli.js +21 -4
  51. package/dist/scripts/util/index.cjs +23 -6
  52. package/dist/scripts/util/index.js +23 -6
  53. package/package.json +1 -1
  54. package/scripts/lakebase/databricks-cli.ts +44 -4
  55. package/scripts/lakebase/runner-setup.ts +18 -2
  56. package/scripts/lakebase/secret-auth.ts +9 -2
  57. package/templates/project/common/scripts/run-tests.sh +10 -0
@@ -272,16 +272,33 @@ stdout: ${stdout}` : killed || signal ? `
272
272
  }
273
273
  async function runDatabricks(args, opts = {}) {
274
274
  const { argv, env, profile } = buildInvocation(args, opts);
275
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
275
276
  try {
276
- const { stdout } = await execFileP("databricks", argv, {
277
- env,
278
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
279
- });
277
+ if (opts.input !== void 0) {
278
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
279
+ }
280
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
280
281
  return stdout.toString();
281
282
  } catch (err) {
282
283
  throw classifyDatabricksError(err, argv, profile);
283
284
  }
284
285
  }
286
+ function execDatabricksWithStdin(argv, input, env, timeout) {
287
+ return new Promise((resolve, reject) => {
288
+ const child = (0, import_node_child_process2.execFile)("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
289
+ if (err) {
290
+ err.stdout = String(stdout ?? "");
291
+ err.stderr = String(stderr ?? "");
292
+ reject(err);
293
+ return;
294
+ }
295
+ resolve(String(stdout ?? ""));
296
+ });
297
+ child.stdin?.on("error", () => {
298
+ });
299
+ child.stdin?.end(input);
300
+ });
301
+ }
285
302
 
286
303
  // scripts/lakebase/branch-id.ts
287
304
  var UID_PATTERN = /^br-[a-z0-9-]+$/;
@@ -232,16 +232,33 @@ stdout: ${stdout}` : killed || signal ? `
232
232
  }
233
233
  async function runDatabricks(args, opts = {}) {
234
234
  const { argv, env, profile } = buildInvocation(args, opts);
235
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
235
236
  try {
236
- const { stdout } = await execFileP("databricks", argv, {
237
- env,
238
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
239
- });
237
+ if (opts.input !== void 0) {
238
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
239
+ }
240
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
240
241
  return stdout.toString();
241
242
  } catch (err) {
242
243
  throw classifyDatabricksError(err, argv, profile);
243
244
  }
244
245
  }
246
+ function execDatabricksWithStdin(argv, input, env, timeout) {
247
+ return new Promise((resolve, reject) => {
248
+ const child = execFile("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
249
+ if (err) {
250
+ err.stdout = String(stdout ?? "");
251
+ err.stderr = String(stderr ?? "");
252
+ reject(err);
253
+ return;
254
+ }
255
+ resolve(String(stdout ?? ""));
256
+ });
257
+ child.stdin?.on("error", () => {
258
+ });
259
+ child.stdin?.end(input);
260
+ });
261
+ }
245
262
 
246
263
  // scripts/lakebase/branch-id.ts
247
264
  var UID_PATTERN = /^br-[a-z0-9-]+$/;
@@ -79269,16 +79269,33 @@ stdout: ${stdout}` : killed || signal ? `
79269
79269
  }
79270
79270
  async function runDatabricks(args, opts = {}) {
79271
79271
  const { argv, env, profile } = buildInvocation(args, opts);
79272
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
79272
79273
  try {
79273
- const { stdout } = await execFileP("databricks", argv, {
79274
- env,
79275
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
79276
- });
79274
+ if (opts.input !== void 0) {
79275
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
79276
+ }
79277
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
79277
79278
  return stdout.toString();
79278
79279
  } catch (err) {
79279
79280
  throw classifyDatabricksError(err, argv, profile);
79280
79281
  }
79281
79282
  }
79283
+ function execDatabricksWithStdin(argv, input, env, timeout) {
79284
+ return new Promise((resolve3, reject) => {
79285
+ const child = (0, import_node_child_process2.execFile)("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
79286
+ if (err) {
79287
+ err.stdout = String(stdout ?? "");
79288
+ err.stderr = String(stderr ?? "");
79289
+ reject(err);
79290
+ return;
79291
+ }
79292
+ resolve3(String(stdout ?? ""));
79293
+ });
79294
+ child.stdin?.on("error", () => {
79295
+ });
79296
+ child.stdin?.end(input);
79297
+ });
79298
+ }
79282
79299
  function runDatabricksSync(args, opts = {}) {
79283
79300
  const { argv, env, profile } = buildInvocation(args, opts);
79284
79301
  try {
@@ -88222,8 +88239,8 @@ var PKG_NAME = "@databricks-solutions/lakebase-scm-utils";
88222
88239
  var cached;
88223
88240
  function substrateSelfVersion() {
88224
88241
  if (cached !== void 0) return cached;
88225
- if ("0.2.43".length > 0) {
88226
- cached = "0.2.43";
88242
+ if ("0.2.44".length > 0) {
88243
+ cached = "0.2.44";
88227
88244
  return cached;
88228
88245
  }
88229
88246
  cached = "unknown";
@@ -1791,16 +1791,33 @@ stdout: ${stdout}` : killed || signal ? `
1791
1791
  }
1792
1792
  async function runDatabricks(args, opts = {}) {
1793
1793
  const { argv, env, profile } = buildInvocation(args, opts);
1794
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
1794
1795
  try {
1795
- const { stdout } = await execFileP("databricks", argv, {
1796
- env,
1797
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
1798
- });
1796
+ if (opts.input !== void 0) {
1797
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
1798
+ }
1799
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
1799
1800
  return stdout.toString();
1800
1801
  } catch (err) {
1801
1802
  throw classifyDatabricksError(err, argv, profile);
1802
1803
  }
1803
1804
  }
1805
+ function execDatabricksWithStdin(argv, input, env, timeout) {
1806
+ return new Promise((resolve3, reject) => {
1807
+ const child = execFile("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
1808
+ if (err) {
1809
+ err.stdout = String(stdout ?? "");
1810
+ err.stderr = String(stderr ?? "");
1811
+ reject(err);
1812
+ return;
1813
+ }
1814
+ resolve3(String(stdout ?? ""));
1815
+ });
1816
+ child.stdin?.on("error", () => {
1817
+ });
1818
+ child.stdin?.end(input);
1819
+ });
1820
+ }
1804
1821
  function runDatabricksSync(args, opts = {}) {
1805
1822
  const { argv, env, profile } = buildInvocation(args, opts);
1806
1823
  try {
@@ -9375,8 +9392,8 @@ var PKG_NAME = "@databricks-solutions/lakebase-scm-utils";
9375
9392
  var cached;
9376
9393
  function substrateSelfVersion() {
9377
9394
  if (cached !== void 0) return cached;
9378
- if ("0.2.43".length > 0) {
9379
- cached = "0.2.43";
9395
+ if ("0.2.44".length > 0) {
9396
+ cached = "0.2.44";
9380
9397
  return cached;
9381
9398
  }
9382
9399
  cached = "unknown";
@@ -85791,16 +85791,33 @@ stdout: ${stdout}` : killed || signal ? `
85791
85791
  }
85792
85792
  async function runDatabricks(args, opts = {}) {
85793
85793
  const { argv, env, profile } = buildInvocation(args, opts);
85794
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
85794
85795
  try {
85795
- const { stdout } = await execFileP("databricks", argv, {
85796
- env,
85797
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
85798
- });
85796
+ if (opts.input !== void 0) {
85797
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
85798
+ }
85799
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
85799
85800
  return stdout.toString();
85800
85801
  } catch (err) {
85801
85802
  throw classifyDatabricksError(err, argv, profile);
85802
85803
  }
85803
85804
  }
85805
+ function execDatabricksWithStdin(argv, input, env, timeout) {
85806
+ return new Promise((resolve2, reject) => {
85807
+ const child = (0, import_node_child_process3.execFile)("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
85808
+ if (err) {
85809
+ err.stdout = String(stdout ?? "");
85810
+ err.stderr = String(stderr ?? "");
85811
+ reject(err);
85812
+ return;
85813
+ }
85814
+ resolve2(String(stdout ?? ""));
85815
+ });
85816
+ child.stdin?.on("error", () => {
85817
+ });
85818
+ child.stdin?.end(input);
85819
+ });
85820
+ }
85804
85821
  function runDatabricksSync(args, opts = {}) {
85805
85822
  const { argv, env, profile } = buildInvocation(args, opts);
85806
85823
  try {
@@ -88205,8 +88222,8 @@ var PKG_NAME = "@databricks-solutions/lakebase-scm-utils";
88205
88222
  var cached;
88206
88223
  function substrateSelfVersion() {
88207
88224
  if (cached !== void 0) return cached;
88208
- if ("0.2.43".length > 0) {
88209
- cached = "0.2.43";
88225
+ if ("0.2.44".length > 0) {
88226
+ cached = "0.2.44";
88210
88227
  return cached;
88211
88228
  }
88212
88229
  cached = "unknown";
@@ -8313,16 +8313,33 @@ stdout: ${stdout}` : killed || signal ? `
8313
8313
  }
8314
8314
  async function runDatabricks(args, opts = {}) {
8315
8315
  const { argv, env, profile } = buildInvocation(args, opts);
8316
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
8316
8317
  try {
8317
- const { stdout } = await execFileP("databricks", argv, {
8318
- env,
8319
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
8320
- });
8318
+ if (opts.input !== void 0) {
8319
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
8320
+ }
8321
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
8321
8322
  return stdout.toString();
8322
8323
  } catch (err) {
8323
8324
  throw classifyDatabricksError(err, argv, profile);
8324
8325
  }
8325
8326
  }
8327
+ function execDatabricksWithStdin(argv, input, env, timeout) {
8328
+ return new Promise((resolve2, reject) => {
8329
+ const child = execFile("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
8330
+ if (err) {
8331
+ err.stdout = String(stdout ?? "");
8332
+ err.stderr = String(stderr ?? "");
8333
+ reject(err);
8334
+ return;
8335
+ }
8336
+ resolve2(String(stdout ?? ""));
8337
+ });
8338
+ child.stdin?.on("error", () => {
8339
+ });
8340
+ child.stdin?.end(input);
8341
+ });
8342
+ }
8326
8343
  function runDatabricksSync(args, opts = {}) {
8327
8344
  const { argv, env, profile } = buildInvocation(args, opts);
8328
8345
  try {
@@ -9358,8 +9375,8 @@ var PKG_NAME = "@databricks-solutions/lakebase-scm-utils";
9358
9375
  var cached;
9359
9376
  function substrateSelfVersion() {
9360
9377
  if (cached !== void 0) return cached;
9361
- if ("0.2.43".length > 0) {
9362
- cached = "0.2.43";
9378
+ if ("0.2.44".length > 0) {
9379
+ cached = "0.2.44";
9363
9380
  return cached;
9364
9381
  }
9365
9382
  cached = "unknown";
@@ -77731,16 +77731,33 @@ stdout: ${stdout}` : killed || signal ? `
77731
77731
  }
77732
77732
  async function runDatabricks(args, opts = {}) {
77733
77733
  const { argv, env, profile } = buildInvocation(args, opts);
77734
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
77734
77735
  try {
77735
- const { stdout } = await execFileP("databricks", argv, {
77736
- env,
77737
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
77738
- });
77736
+ if (opts.input !== void 0) {
77737
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
77738
+ }
77739
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
77739
77740
  return stdout.toString();
77740
77741
  } catch (err) {
77741
77742
  throw classifyDatabricksError(err, argv, profile);
77742
77743
  }
77743
77744
  }
77745
+ function execDatabricksWithStdin(argv, input, env, timeout) {
77746
+ return new Promise((resolve2, reject) => {
77747
+ const child = (0, import_node_child_process2.execFile)("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
77748
+ if (err) {
77749
+ err.stdout = String(stdout ?? "");
77750
+ err.stderr = String(stderr ?? "");
77751
+ reject(err);
77752
+ return;
77753
+ }
77754
+ resolve2(String(stdout ?? ""));
77755
+ });
77756
+ child.stdin?.on("error", () => {
77757
+ });
77758
+ child.stdin?.end(input);
77759
+ });
77760
+ }
77744
77761
  function runDatabricksSync(args, opts = {}) {
77745
77762
  const { argv, env, profile } = buildInvocation(args, opts);
77746
77763
  try {
@@ -79270,8 +79287,8 @@ var PKG_NAME = "@databricks-solutions/lakebase-scm-utils";
79270
79287
  var cached;
79271
79288
  function substrateSelfVersion() {
79272
79289
  if (cached !== void 0) return cached;
79273
- if ("0.2.43".length > 0) {
79274
- cached = "0.2.43";
79290
+ if ("0.2.44".length > 0) {
79291
+ cached = "0.2.44";
79275
79292
  return cached;
79276
79293
  }
79277
79294
  cached = "unknown";
@@ -208,16 +208,33 @@ stdout: ${stdout}` : killed || signal ? `
208
208
  }
209
209
  async function runDatabricks(args, opts = {}) {
210
210
  const { argv, env, profile } = buildInvocation(args, opts);
211
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
211
212
  try {
212
- const { stdout } = await execFileP("databricks", argv, {
213
- env,
214
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
215
- });
213
+ if (opts.input !== void 0) {
214
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
215
+ }
216
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
216
217
  return stdout.toString();
217
218
  } catch (err) {
218
219
  throw classifyDatabricksError(err, argv, profile);
219
220
  }
220
221
  }
222
+ function execDatabricksWithStdin(argv, input, env, timeout) {
223
+ return new Promise((resolve2, reject) => {
224
+ const child = execFile("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
225
+ if (err) {
226
+ err.stdout = String(stdout ?? "");
227
+ err.stderr = String(stderr ?? "");
228
+ reject(err);
229
+ return;
230
+ }
231
+ resolve2(String(stdout ?? ""));
232
+ });
233
+ child.stdin?.on("error", () => {
234
+ });
235
+ child.stdin?.end(input);
236
+ });
237
+ }
221
238
  function runDatabricksSync(args, opts = {}) {
222
239
  const { argv, env, profile } = buildInvocation(args, opts);
223
240
  try {
@@ -371,8 +388,8 @@ var PKG_NAME = "@databricks-solutions/lakebase-scm-utils";
371
388
  var cached;
372
389
  function substrateSelfVersion() {
373
390
  if (cached !== void 0) return cached;
374
- if ("0.2.43".length > 0) {
375
- cached = "0.2.43";
391
+ if ("0.2.44".length > 0) {
392
+ cached = "0.2.44";
376
393
  return cached;
377
394
  }
378
395
  cached = "unknown";
@@ -77849,16 +77849,33 @@ stdout: ${stdout}` : killed || signal ? `
77849
77849
  }
77850
77850
  async function runDatabricks(args, opts = {}) {
77851
77851
  const { argv, env, profile } = buildInvocation(args, opts);
77852
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
77852
77853
  try {
77853
- const { stdout } = await execFileP("databricks", argv, {
77854
- env,
77855
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
77856
- });
77854
+ if (opts.input !== void 0) {
77855
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
77856
+ }
77857
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
77857
77858
  return stdout.toString();
77858
77859
  } catch (err) {
77859
77860
  throw classifyDatabricksError(err, argv, profile);
77860
77861
  }
77861
77862
  }
77863
+ function execDatabricksWithStdin(argv, input, env, timeout) {
77864
+ return new Promise((resolve2, reject) => {
77865
+ const child = (0, import_node_child_process2.execFile)("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
77866
+ if (err) {
77867
+ err.stdout = String(stdout ?? "");
77868
+ err.stderr = String(stderr ?? "");
77869
+ reject(err);
77870
+ return;
77871
+ }
77872
+ resolve2(String(stdout ?? ""));
77873
+ });
77874
+ child.stdin?.on("error", () => {
77875
+ });
77876
+ child.stdin?.end(input);
77877
+ });
77878
+ }
77862
77879
  function runDatabricksSync(args, opts = {}) {
77863
77880
  const { argv, env, profile } = buildInvocation(args, opts);
77864
77881
  try {
@@ -321,16 +321,33 @@ stdout: ${stdout}` : killed || signal ? `
321
321
  }
322
322
  async function runDatabricks(args, opts = {}) {
323
323
  const { argv, env, profile } = buildInvocation(args, opts);
324
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
324
325
  try {
325
- const { stdout } = await execFileP("databricks", argv, {
326
- env,
327
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
328
- });
326
+ if (opts.input !== void 0) {
327
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
328
+ }
329
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
329
330
  return stdout.toString();
330
331
  } catch (err) {
331
332
  throw classifyDatabricksError(err, argv, profile);
332
333
  }
333
334
  }
335
+ function execDatabricksWithStdin(argv, input, env, timeout) {
336
+ return new Promise((resolve2, reject) => {
337
+ const child = execFile("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
338
+ if (err) {
339
+ err.stdout = String(stdout ?? "");
340
+ err.stderr = String(stderr ?? "");
341
+ reject(err);
342
+ return;
343
+ }
344
+ resolve2(String(stdout ?? ""));
345
+ });
346
+ child.stdin?.on("error", () => {
347
+ });
348
+ child.stdin?.end(input);
349
+ });
350
+ }
334
351
  function runDatabricksSync(args, opts = {}) {
335
352
  const { argv, env, profile } = buildInvocation(args, opts);
336
353
  try {
@@ -1659,8 +1659,8 @@ var PKG_NAME = "@databricks-solutions/lakebase-scm-utils";
1659
1659
  var cached;
1660
1660
  function substrateSelfVersion() {
1661
1661
  if (cached !== void 0) return cached;
1662
- if ("0.2.43".length > 0) {
1663
- cached = "0.2.43";
1662
+ if ("0.2.44".length > 0) {
1663
+ cached = "0.2.44";
1664
1664
  return cached;
1665
1665
  }
1666
1666
  cached = "unknown";
@@ -1928,16 +1928,33 @@ stdout: ${stdout}` : killed || signal ? `
1928
1928
  }
1929
1929
  async function runDatabricks(args, opts = {}) {
1930
1930
  const { argv, env, profile } = buildInvocation(args, opts);
1931
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
1931
1932
  try {
1932
- const { stdout } = await execFileP("databricks", argv, {
1933
- env,
1934
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
1935
- });
1933
+ if (opts.input !== void 0) {
1934
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
1935
+ }
1936
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
1936
1937
  return stdout.toString();
1937
1938
  } catch (err) {
1938
1939
  throw classifyDatabricksError(err, argv, profile);
1939
1940
  }
1940
1941
  }
1942
+ function execDatabricksWithStdin(argv, input, env, timeout) {
1943
+ return new Promise((resolve, reject) => {
1944
+ const child = (0, import_node_child_process2.execFile)("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
1945
+ if (err) {
1946
+ err.stdout = String(stdout ?? "");
1947
+ err.stderr = String(stderr ?? "");
1948
+ reject(err);
1949
+ return;
1950
+ }
1951
+ resolve(String(stdout ?? ""));
1952
+ });
1953
+ child.stdin?.on("error", () => {
1954
+ });
1955
+ child.stdin?.end(input);
1956
+ });
1957
+ }
1941
1958
 
1942
1959
  // scripts/github/secrets.ts
1943
1960
  init_cjs_shims();
@@ -1630,8 +1630,8 @@ var PKG_NAME = "@databricks-solutions/lakebase-scm-utils";
1630
1630
  var cached;
1631
1631
  function substrateSelfVersion() {
1632
1632
  if (cached !== void 0) return cached;
1633
- if ("0.2.43".length > 0) {
1634
- cached = "0.2.43";
1633
+ if ("0.2.44".length > 0) {
1634
+ cached = "0.2.44";
1635
1635
  return cached;
1636
1636
  }
1637
1637
  cached = "unknown";
@@ -1899,16 +1899,33 @@ stdout: ${stdout}` : killed || signal ? `
1899
1899
  }
1900
1900
  async function runDatabricks(args, opts = {}) {
1901
1901
  const { argv, env, profile } = buildInvocation(args, opts);
1902
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
1902
1903
  try {
1903
- const { stdout } = await execFileP("databricks", argv, {
1904
- env,
1905
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault
1906
- });
1904
+ if (opts.input !== void 0) {
1905
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
1906
+ }
1907
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
1907
1908
  return stdout.toString();
1908
1909
  } catch (err) {
1909
1910
  throw classifyDatabricksError(err, argv, profile);
1910
1911
  }
1911
1912
  }
1913
+ function execDatabricksWithStdin(argv, input, env, timeout) {
1914
+ return new Promise((resolve, reject) => {
1915
+ const child = execFile("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
1916
+ if (err) {
1917
+ err.stdout = String(stdout ?? "");
1918
+ err.stderr = String(stderr ?? "");
1919
+ reject(err);
1920
+ return;
1921
+ }
1922
+ resolve(String(stdout ?? ""));
1923
+ });
1924
+ child.stdin?.on("error", () => {
1925
+ });
1926
+ child.stdin?.end(input);
1927
+ });
1928
+ }
1912
1929
 
1913
1930
  // scripts/github/secrets.ts
1914
1931
  init_esm_shims();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@databricks-solutions/lakebase-scm-utils",
3
- "version": "0.2.43",
3
+ "version": "0.2.44",
4
4
  "description": "Lakebase SCM + substrate engine: database branching, paired-branch SCM workflows, connection/credential minting, schema migration, project scaffold + deploy primitives, and the git/github utility layer. Extracted from consort for portable, standalone consumption by lakebase-scm-extension and the SFTDD orchestration.",
5
5
  "type": "module",
6
6
  "private": false,
@@ -36,6 +36,11 @@ export interface DatabricksCliOptions {
36
36
  * subcommand. Set this for version/help probes so they work regardless of
37
37
  * DATABRICKS_CONFIG_PROFILE. */
38
38
  noProfile?: boolean;
39
+ /** Data to feed on the child's STDIN (async path only). Used to keep a
40
+ * credential OFF the command line: pass the secret in a `--json @/dev/stdin`
41
+ * body here instead of as a `--string-value <cred>` argv element, so it never
42
+ * appears in the process table / `ps`. */
43
+ input?: string;
39
44
  }
40
45
 
41
46
  /** A `databricks` CLI call failed. Message: `databricks <args> failed: <msg>\nstderr: <stderr>`. */
@@ -203,17 +208,52 @@ export function classifyDatabricksError(err: unknown, argv: string[], profile: s
203
208
  /** Run the `databricks` CLI (async), returning stdout. */
204
209
  export async function runDatabricks(args: string[], opts: DatabricksCliOptions = {}): Promise<string> {
205
210
  const { argv, env, profile } = buildInvocation(args, opts);
211
+ const timeout = opts.timeout ?? KIT_TIMEOUTS.cliDefault;
206
212
  try {
207
- const { stdout } = await execFileP("databricks", argv, {
208
- env,
209
- timeout: opts.timeout ?? KIT_TIMEOUTS.cliDefault,
210
- });
213
+ if (opts.input !== undefined) {
214
+ return await execDatabricksWithStdin(argv, opts.input, env, timeout);
215
+ }
216
+ const { stdout } = await execFileP("databricks", argv, { env, timeout });
211
217
  return stdout.toString();
212
218
  } catch (err) {
213
219
  throw classifyDatabricksError(err, argv, profile);
214
220
  }
215
221
  }
216
222
 
223
+ /**
224
+ * Run `databricks` feeding `input` on STDIN, so a credential can travel in a
225
+ * `--json @/dev/stdin` body instead of a `--string-value <cred>` argv element
226
+ * that leaks into the process table. Buffers stdout/stderr and shapes
227
+ * the result like execFileP so classifyDatabricksError reads it uniformly.
228
+ *
229
+ * The stdin write is GUARDED: a child that exits/rejects the body before we finish
230
+ * writing raises EPIPE on the pipe, which is an UNHANDLED 'error' (crash) unless we
231
+ * listen for it. We swallow the pipe error and let the child's own exit code + stderr
232
+ * be the verdict (guard the write against EPIPE).
233
+ */
234
+ function execDatabricksWithStdin(
235
+ argv: string[],
236
+ input: string,
237
+ env: NodeJS.ProcessEnv,
238
+ timeout: number,
239
+ ): Promise<string> {
240
+ return new Promise((resolve, reject) => {
241
+ const child = execFile("databricks", argv, { env, timeout }, (err, stdout, stderr) => {
242
+ if (err) {
243
+ (err as { stdout?: string; stderr?: string }).stdout = String(stdout ?? "");
244
+ (err as { stdout?: string; stderr?: string }).stderr = String(stderr ?? "");
245
+ reject(err);
246
+ return;
247
+ }
248
+ resolve(String(stdout ?? ""));
249
+ });
250
+ // Guard the pipe: without this an EPIPE (child gone before we finish) is an
251
+ // uncaught exception; the child's exit/stderr is the real verdict.
252
+ child.stdin?.on("error", () => {});
253
+ child.stdin?.end(input);
254
+ });
255
+ }
256
+
217
257
  /** Run the `databricks` CLI (sync), returning stdout. */
218
258
  export function runDatabricksSync(args: string[], opts: DatabricksCliOptions = {}): string {
219
259
  const { argv, env, profile } = buildInvocation(args, opts);
@@ -271,8 +271,24 @@ export async function setupRunner(args: SetupRunnerArgs): Promise<RunnerInfo> {
271
271
  if (needsConfig) {
272
272
  report("Registering runner with GitHub...");
273
273
  const regToken = await createRegistrationToken(args.fullRepoName);
274
- cp.execSync(
275
- `./config.sh --url "https://github.com/${args.fullRepoName}" --token "${regToken}" --name "${name}" --labels self-hosted --unattended --replace`,
274
+ // Invoke config.sh with an argv array (execFileSync), NOT a shell-interpolated
275
+ // string (execSync). config.sh is GitHub's runner binary and only accepts the
276
+ // registration token as `--token <tok>`, so the token is unavoidably on its argv
277
+ // (a full off-`ps` fix would need the JIT-runner API — disproportionate for a
278
+ // SHORT-LIVED (~1h) reg token). But dropping the `/bin/sh -c` wrapper removes the
279
+ // extra shell process that also carried the token, closes the shell-trace /
280
+ // process-accounting exposure, and eliminates any shell-injection surface on the
281
+ // interpolated url/name.
282
+ cp.execFileSync(
283
+ "./config.sh",
284
+ [
285
+ "--url", `https://github.com/${args.fullRepoName}`,
286
+ "--token", regToken,
287
+ "--name", name,
288
+ "--labels", "self-hosted",
289
+ "--unattended",
290
+ "--replace",
291
+ ],
276
292
  { cwd: dir, timeout: KIT_TIMEOUTS.cliLong }
277
293
  );
278
294
  }