@sdt-tools/cli 0.2.0 → 0.2.6

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 (207) hide show
  1. package/dist/advise-tests-6DRSZMBL.js +87 -0
  2. package/dist/advise-tests-6DRSZMBL.js.map +1 -0
  3. package/dist/ai-G4MJWHTM.js +89 -0
  4. package/dist/ai-G4MJWHTM.js.map +1 -0
  5. package/dist/anonymize-QR6JGXA7.js +123 -0
  6. package/dist/anonymize-QR6JGXA7.js.map +1 -0
  7. package/dist/approval-YVHYTV53.js +73 -0
  8. package/dist/approval-YVHYTV53.js.map +1 -0
  9. package/dist/approval-chain-54KKJZS3.js +120 -0
  10. package/dist/approval-chain-54KKJZS3.js.map +1 -0
  11. package/dist/audit-log-QZFH7LUX.js +159 -0
  12. package/dist/audit-log-QZFH7LUX.js.map +1 -0
  13. package/dist/backlog-V2YUIQDL.js +76 -0
  14. package/dist/backlog-V2YUIQDL.js.map +1 -0
  15. package/dist/bisect-GEVYAVL5.js +111 -0
  16. package/dist/bisect-GEVYAVL5.js.map +1 -0
  17. package/dist/bookmarks-57LKS7P6.js +107 -0
  18. package/dist/bookmarks-57LKS7P6.js.map +1 -0
  19. package/dist/branch-W2MGMPSH.js +88 -0
  20. package/dist/branch-W2MGMPSH.js.map +1 -0
  21. package/dist/build-VNIQFKSP.js +23 -0
  22. package/dist/build-VNIQFKSP.js.map +1 -0
  23. package/dist/catalog-JLB5VCEV.js +137 -0
  24. package/dist/catalog-JLB5VCEV.js.map +1 -0
  25. package/dist/changelog-M7XGDYSY.js +220 -0
  26. package/dist/changelog-M7XGDYSY.js.map +1 -0
  27. package/dist/chunk-DGUM43GV.js +11 -0
  28. package/dist/chunk-DGUM43GV.js.map +1 -0
  29. package/dist/chunk-EWXM4KJN.js +25 -0
  30. package/dist/chunk-EWXM4KJN.js.map +1 -0
  31. package/dist/chunk-JP2EZLR5.js +50 -0
  32. package/dist/chunk-JP2EZLR5.js.map +1 -0
  33. package/dist/chunk-VM2H4LAO.js +15 -0
  34. package/dist/chunk-VM2H4LAO.js.map +1 -0
  35. package/dist/chunk-ZWY4ZRHL.js +44 -0
  36. package/dist/chunk-ZWY4ZRHL.js.map +1 -0
  37. package/dist/cli.js +511 -19014
  38. package/dist/cli.js.map +1 -1
  39. package/dist/compare-5O6UTWPJ.js +405 -0
  40. package/dist/compare-5O6UTWPJ.js.map +1 -0
  41. package/dist/compare-profiles-7ZSNIW7B.js +218 -0
  42. package/dist/compare-profiles-7ZSNIW7B.js.map +1 -0
  43. package/dist/completion-I5U5VVAX.js +82 -0
  44. package/dist/completion-I5U5VVAX.js.map +1 -0
  45. package/dist/connection-GNTZDHXF.js +133 -0
  46. package/dist/connection-GNTZDHXF.js.map +1 -0
  47. package/dist/cost-estimate-TJDDH6TO.js +328 -0
  48. package/dist/cost-estimate-TJDDH6TO.js.map +1 -0
  49. package/dist/data-compare-UK2UXAS3.js +134 -0
  50. package/dist/data-compare-UK2UXAS3.js.map +1 -0
  51. package/dist/data-fit-Q45ENBRL.js +125 -0
  52. package/dist/data-fit-Q45ENBRL.js.map +1 -0
  53. package/dist/deploy-status-UUHKVDTI.js +58 -0
  54. package/dist/deploy-status-UUHKVDTI.js.map +1 -0
  55. package/dist/design-PO6UPBL7.js +138 -0
  56. package/dist/design-PO6UPBL7.js.map +1 -0
  57. package/dist/diagnose-6IFMELFR.js +145 -0
  58. package/dist/diagnose-6IFMELFR.js.map +1 -0
  59. package/dist/discover-A7OSZAHK.js +78 -0
  60. package/dist/discover-A7OSZAHK.js.map +1 -0
  61. package/dist/docs-CVRKGUSW.js +177 -0
  62. package/dist/docs-CVRKGUSW.js.map +1 -0
  63. package/dist/drift-XDA3BDYN.js +226 -0
  64. package/dist/drift-XDA3BDYN.js.map +1 -0
  65. package/dist/drift-gate-V7QSIOGZ.js +94 -0
  66. package/dist/drift-gate-V7QSIOGZ.js.map +1 -0
  67. package/dist/error-lookup-7ZWCZJ44.js +56 -0
  68. package/dist/error-lookup-7ZWCZJ44.js.map +1 -0
  69. package/dist/errorReporting-AQXKKGZH.js +109 -0
  70. package/dist/errorReporting-AQXKKGZH.js.map +1 -0
  71. package/dist/exec-PKBHLI7T.js +121 -0
  72. package/dist/exec-PKBHLI7T.js.map +1 -0
  73. package/dist/explain-LWKJOTL7.js +192 -0
  74. package/dist/explain-LWKJOTL7.js.map +1 -0
  75. package/dist/explorer-QOVM6VBD.js +61 -0
  76. package/dist/explorer-QOVM6VBD.js.map +1 -0
  77. package/dist/export-IYYBZ5HE.js +42 -0
  78. package/dist/export-IYYBZ5HE.js.map +1 -0
  79. package/dist/extract-VMMVRQVT.js +102 -0
  80. package/dist/extract-VMMVRQVT.js.map +1 -0
  81. package/dist/features-LE6BDZ2S.js +59 -0
  82. package/dist/features-LE6BDZ2S.js.map +1 -0
  83. package/dist/feedback-M7DM2EQC.js +161 -0
  84. package/dist/feedback-M7DM2EQC.js.map +1 -0
  85. package/dist/find-EME2JG2I.js +176 -0
  86. package/dist/find-EME2JG2I.js.map +1 -0
  87. package/dist/format-TRLWLMGS.js +141 -0
  88. package/dist/format-TRLWLMGS.js.map +1 -0
  89. package/dist/generate-6NAZGZDV.js +152 -0
  90. package/dist/generate-6NAZGZDV.js.map +1 -0
  91. package/dist/graph-QNQDAUO7.js +161 -0
  92. package/dist/graph-QNQDAUO7.js.map +1 -0
  93. package/dist/history-RONA7ZTI.js +199 -0
  94. package/dist/history-RONA7ZTI.js.map +1 -0
  95. package/dist/hosts-YBXY2ZG5.js +49 -0
  96. package/dist/hosts-YBXY2ZG5.js.map +1 -0
  97. package/dist/impact-T2JSANHS.js +59 -0
  98. package/dist/impact-T2JSANHS.js.map +1 -0
  99. package/dist/import-AELYLY6A.js +32 -0
  100. package/dist/import-AELYLY6A.js.map +1 -0
  101. package/dist/import-script-2OF5BI6A.js +83 -0
  102. package/dist/import-script-2OF5BI6A.js.map +1 -0
  103. package/dist/index.cjs +71 -12
  104. package/dist/index.cjs.map +1 -1
  105. package/dist/index.js +95 -31
  106. package/dist/index.js.map +1 -1
  107. package/dist/init-SWRRJMGI.js +57 -0
  108. package/dist/init-SWRRJMGI.js.map +1 -0
  109. package/dist/install-hooks-6SIAGTAF.js +109 -0
  110. package/dist/install-hooks-6SIAGTAF.js.map +1 -0
  111. package/dist/license-OAF22PLZ.js +46 -0
  112. package/dist/license-OAF22PLZ.js.map +1 -0
  113. package/dist/lineage-EW66XJ6O.js +552 -0
  114. package/dist/lineage-EW66XJ6O.js.map +1 -0
  115. package/dist/lint-FQ2OTYTQ.js +143 -0
  116. package/dist/lint-FQ2OTYTQ.js.map +1 -0
  117. package/dist/mcp-SARDMCDV.js +344 -0
  118. package/dist/mcp-SARDMCDV.js.map +1 -0
  119. package/dist/migrate-from-dbt-JVTXPWKQ.js +156 -0
  120. package/dist/migrate-from-dbt-JVTXPWKQ.js.map +1 -0
  121. package/dist/migrate-platform-NTRTOGNR.js +91 -0
  122. package/dist/migrate-platform-NTRTOGNR.js.map +1 -0
  123. package/dist/optimize-CJYWMAWA.js +105 -0
  124. package/dist/optimize-CJYWMAWA.js.map +1 -0
  125. package/dist/perf-LL2CPCJF.js +205 -0
  126. package/dist/perf-LL2CPCJF.js.map +1 -0
  127. package/dist/pii-FBDRDQ2E.js +136 -0
  128. package/dist/pii-FBDRDQ2E.js.map +1 -0
  129. package/dist/pilot-CCQERKPH.js +29 -0
  130. package/dist/pilot-CCQERKPH.js.map +1 -0
  131. package/dist/pr-comment-S5FF4QRX.js +79 -0
  132. package/dist/pr-comment-S5FF4QRX.js.map +1 -0
  133. package/dist/preview-5U4YVCRM.js +47 -0
  134. package/dist/preview-5U4YVCRM.js.map +1 -0
  135. package/dist/profile-7VC57KD2.js +101 -0
  136. package/dist/profile-7VC57KD2.js.map +1 -0
  137. package/dist/promote-AASEFTIA.js +408 -0
  138. package/dist/promote-AASEFTIA.js.map +1 -0
  139. package/dist/publish-UMVIWH6H.js +721 -0
  140. package/dist/publish-UMVIWH6H.js.map +1 -0
  141. package/dist/purge-QMXZKCMD.js +57 -0
  142. package/dist/purge-QMXZKCMD.js.map +1 -0
  143. package/dist/query-log-6OM4GI7W.js +112 -0
  144. package/dist/query-log-6OM4GI7W.js.map +1 -0
  145. package/dist/refactor-LTZQLJ35.js +5799 -0
  146. package/dist/refactor-LTZQLJ35.js.map +1 -0
  147. package/dist/refresh-4TY2AGOU.js +38 -0
  148. package/dist/refresh-4TY2AGOU.js.map +1 -0
  149. package/dist/replay-OOC25FZN.js +117 -0
  150. package/dist/replay-OOC25FZN.js.map +1 -0
  151. package/dist/revert-ODMUVJW6.js +110 -0
  152. package/dist/revert-ODMUVJW6.js.map +1 -0
  153. package/dist/review-XXPWOBFP.js +158 -0
  154. package/dist/review-XXPWOBFP.js.map +1 -0
  155. package/dist/rollback-suggest-6G2HEKFR.js +79 -0
  156. package/dist/rollback-suggest-6G2HEKFR.js.map +1 -0
  157. package/dist/safer-alternative-QFVNLG3L.js +89 -0
  158. package/dist/safer-alternative-QFVNLG3L.js.map +1 -0
  159. package/dist/safety-7QWRSUEZ.js +168 -0
  160. package/dist/safety-7QWRSUEZ.js.map +1 -0
  161. package/dist/savings-RHIXP6IT.js +95 -0
  162. package/dist/savings-RHIXP6IT.js.map +1 -0
  163. package/dist/scan-secrets-5YCQ4UCU.js +54 -0
  164. package/dist/scan-secrets-5YCQ4UCU.js.map +1 -0
  165. package/dist/schema-CIZXCQD2.js +429 -0
  166. package/dist/schema-CIZXCQD2.js.map +1 -0
  167. package/dist/script-K7CIN2P6.js +153 -0
  168. package/dist/script-K7CIN2P6.js.map +1 -0
  169. package/dist/search-BUZ5NXZZ.js +151 -0
  170. package/dist/search-BUZ5NXZZ.js.map +1 -0
  171. package/dist/seed-76QAK276.js +96 -0
  172. package/dist/seed-76QAK276.js.map +1 -0
  173. package/dist/sketch-PTLKDIK3.js +88 -0
  174. package/dist/sketch-PTLKDIK3.js.map +1 -0
  175. package/dist/snapshot-XLPR2OZ5.js +177 -0
  176. package/dist/snapshot-XLPR2OZ5.js.map +1 -0
  177. package/dist/snippets-EK4DK5CN.js +74 -0
  178. package/dist/snippets-EK4DK5CN.js.map +1 -0
  179. package/dist/standards-7T2UY6DD.js +241 -0
  180. package/dist/standards-7T2UY6DD.js.map +1 -0
  181. package/dist/suggest-VGRYSAR6.js +39 -0
  182. package/dist/suggest-VGRYSAR6.js.map +1 -0
  183. package/dist/suggest-constraints-MY5WKUHA.js +160 -0
  184. package/dist/suggest-constraints-MY5WKUHA.js.map +1 -0
  185. package/dist/suite-TRNGZWQM.js +88 -0
  186. package/dist/suite-TRNGZWQM.js.map +1 -0
  187. package/dist/telemetry-3U2QLA2S.js +75 -0
  188. package/dist/telemetry-3U2QLA2S.js.map +1 -0
  189. package/dist/template-ZERIXVXF.js +403 -0
  190. package/dist/template-ZERIXVXF.js.map +1 -0
  191. package/dist/test-5M2ED3WT.js +169 -0
  192. package/dist/test-5M2ED3WT.js.map +1 -0
  193. package/dist/trial-U732FONV.js +31 -0
  194. package/dist/trial-U732FONV.js.map +1 -0
  195. package/dist/validate-T6D2WCOK.js +106 -0
  196. package/dist/validate-T6D2WCOK.js.map +1 -0
  197. package/dist/verify-KXVASEEG.js +76 -0
  198. package/dist/verify-KXVASEEG.js.map +1 -0
  199. package/dist/watch-I6K4BNMA.js +80 -0
  200. package/dist/watch-I6K4BNMA.js.map +1 -0
  201. package/dist/xcompare-TPFLQO6W.js +87 -0
  202. package/dist/xcompare-TPFLQO6W.js.map +1 -0
  203. package/package.json +2 -2
  204. package/dist/cli.cjs +0 -19040
  205. package/dist/cli.cjs.map +0 -1
  206. package/dist/cli.d.cts +0 -1
  207. package/dist/cli.d.ts +0 -1
package/dist/index.cjs CHANGED
@@ -86,7 +86,10 @@ var logger = {
86
86
  // src/commands/init.ts
87
87
  function initCommand() {
88
88
  const cmd = new import_commander.Command("init");
89
- cmd.description("Initialize a new SDT project in the current directory.").option("--name <name>", "Project name", "NewSnowflakeProject").option("--scope <scope>", "Project scope: account | database | schema", "database").option("--db <database>", "Database name (required for database/schema scope)").option("--schema <schema>", "Schema name (required for schema scope)").option("--dir <dir>", "Target directory (default: cwd)", process.cwd()).action(async (opts) => {
89
+ cmd.description("Initialize a new SDT project in the current directory.").option("--name <name>", "Project name", "NewSnowflakeProject").option("--scope <scope>", "Project scope: account | database | schema", "database").option("--db <database>", "Database name (required for database/schema scope)").option("--schema <schema>", "Schema name (required for schema scope)").option("--dir <dir>", "Target directory (default: cwd)", process.cwd()).option(
90
+ "--force",
91
+ "Overwrite an existing <name>.sdtproj in the target directory. Without this flag, init refuses to clobber an existing project file so a re-run never silently discards your project configuration."
92
+ ).action(async (opts) => {
90
93
  const scopeType = String(opts.scope);
91
94
  if (!["account", "database", "schema"].includes(scopeType)) {
92
95
  throw new Error(`Invalid --scope: ${opts.scope}. Use account | database | schema.`);
@@ -104,6 +107,15 @@ function initCommand() {
104
107
  await import_node_fs.promises.mkdir(root, { recursive: true });
105
108
  const project10 = (0, import_project.newProjectTemplate)(String(opts.name), scope);
106
109
  const projectPath = import_node_path.default.join(root, `${project10.name}.sdtproj`);
110
+ if (!opts.force) {
111
+ try {
112
+ await import_node_fs.promises.access(projectPath);
113
+ logger.error(`${projectPath} already exists; pass --force to overwrite.`);
114
+ process.exitCode = 1;
115
+ return;
116
+ } catch {
117
+ }
118
+ }
107
119
  await (0, import_project.saveProject)(projectPath, project10);
108
120
  const seedFolders = ["databases", "scripts/pre", "scripts/post"];
109
121
  for (const f of seedFolders) await import_node_fs.promises.mkdir(import_node_path.default.join(root, f), { recursive: true });
@@ -380,7 +392,13 @@ function compareCommand() {
380
392
  const cmd = new import_commander5.Command("compare");
381
393
  cmd.description(
382
394
  "Compare two schemas. Sources may be .sdtproj, .sdtpac, or snowflake://<profile>[/db[/schema]]."
383
- ).argument("<source>", "Left side of the comparison").argument("<target>", "Right side of the comparison").option("-o, --output <path>", "Write JSON result to this path").option("--format <format>", "Output format: json | summary | markdown", "summary").option("--ignore-case", "Treat unquoted identifiers case-insensitively", false).option(
395
+ ).argument("[source]", "Left side of the comparison (or use --source)").argument("[target]", "Right side of the comparison (or use --target)").option(
396
+ "--source <path>",
397
+ "Left side of the comparison (flag form of the positional source arg)"
398
+ ).option(
399
+ "--target <path>",
400
+ "Right side of the comparison (flag form of the positional target arg)"
401
+ ).option("-o, --output <path>", "Write JSON result to this path").option("--format <format>", "Output format: json | summary | markdown", "summary").option("--ignore-case", "Treat unquoted identifiers case-insensitively", false).option(
384
402
  "--no-slice",
385
403
  "Disable the source project's Slice (if it has one). Default: a project's slice is applied automatically."
386
404
  ).option(
@@ -405,7 +423,14 @@ function compareCommand() {
405
423
  ).option(
406
424
  "--no-history",
407
425
  "Skip writing the compare-history audit record (AUDITCMP.1). Default: every compare run writes a record to `.sdt/history/compare/`, exportable via `sdt audit-log emit`."
408
- ).action(async (sourceArg, targetArg, opts) => {
426
+ ).action(async (sourceArgPos, targetArgPos, opts) => {
427
+ const sourceArg = opts.source ? String(opts.source) : sourceArgPos ? String(sourceArgPos) : "";
428
+ const targetArg = opts.target ? String(opts.target) : targetArgPos ? String(targetArgPos) : "";
429
+ if (!sourceArg || !targetArg) {
430
+ throw new Error(
431
+ "compare needs a source and a target \u2014 pass them positionally (`sdt compare <source> <target>`) or via `--source`/`--target`."
432
+ );
433
+ }
409
434
  const nameMapping = await buildMappingFromOptions(opts);
410
435
  const source = await resolveSource(String(sourceArg));
411
436
  const target = await resolveSource(String(targetArg));
@@ -691,11 +716,14 @@ function splitStatements(sql) {
691
716
  function publishCommand() {
692
717
  const cmd = new import_commander6.Command("publish");
693
718
  cmd.description(
694
- "Compare a .sdtpac to a live Snowflake target and apply (or dry-run) the migration."
719
+ "Compare a .sdtpac (the desired state) to a live Snowflake target and apply (or dry-run) the migration. Shared form with `ddt publish`: `--source <desired> --connection <live-target>`."
720
+ ).option(
721
+ "--source <path>",
722
+ "Path to the desired-state .sdtpac (canonical name; the same flag `ddt publish` uses). Required for a normal publish; omit only with --restore-from-snapshot."
695
723
  ).option(
696
724
  "--pac <path>",
697
- "Path to a built .sdtpac. Required for a normal publish; omit only with --restore-from-snapshot."
698
- ).requiredOption("-c, --connection <profile>", "Connection profile name").option(
725
+ "Back-compat alias for --source (the desired-state .sdtpac). Prefer --source for cross-platform parity with `ddt publish`."
726
+ ).requiredOption("-c, --connection <profile>", "Connection profile name (the live target).").option(
699
727
  "--restore-from-snapshot <batchId>",
700
728
  "Recovery mode: skip the compare step and emit ALTER TABLE \u2026 SWAP WITH against the snapshot batch <batchId> from the registry. Dry-run by default; pass --apply --yes to execute. This is the command printed by TRUST.4's post-deploy-smoke + TRUST.8's restore-hint when a deploy fails \u2014 they tell the operator to run `sdt publish --restore-from-snapshot <id>`."
701
729
  ).option(
@@ -782,12 +810,15 @@ function publishCommand() {
782
810
  await runRestoreFromSnapshot(opts);
783
811
  return;
784
812
  }
785
- if (!opts.pac) {
786
- logger.error("--pac <path> is required (unless --restore-from-snapshot is given).");
813
+ const pacRef = opts.source ?? opts.pac;
814
+ if (!pacRef) {
815
+ logger.error(
816
+ "--source <path> (or its alias --pac) is required (unless --restore-from-snapshot is given)."
817
+ );
787
818
  process.exitCode = 1;
788
819
  return;
789
820
  }
790
- const pacPath = import_node_path4.default.resolve(String(opts.pac));
821
+ const pacPath = import_node_path4.default.resolve(String(pacRef));
791
822
  const pac10 = await (0, import_pac2.readPac)(pacPath);
792
823
  const freshnessMode = opts.freshness ?? "warn";
793
824
  if (freshnessMode !== "skip") {
@@ -1575,12 +1606,17 @@ function validateCommand() {
1575
1606
  logger.dim(` Profiles: ${Object.keys(loaded.project.deploymentProfiles ?? {}).length}`);
1576
1607
  if (opts.checkVariables) {
1577
1608
  const projRoot = import_node_path6.default.dirname(import_node_path6.default.resolve(String(opts.project)));
1578
- const fileContents = await Promise.all(
1579
- files.map(async (f) => {
1609
+ const { results } = await import_core6.catalog.mapPool(
1610
+ files,
1611
+ async (f) => {
1580
1612
  const relPath = import_node_path6.default.relative(projRoot, f).split(import_node_path6.default.sep).join("/");
1581
1613
  const content = await import_node_fs6.promises.readFile(f, "utf8");
1582
1614
  return { path: relPath, content };
1583
- })
1615
+ },
1616
+ { concurrency: 16, stopOnError: true }
1617
+ );
1618
+ const fileContents = results.filter(
1619
+ (r) => r !== void 0
1584
1620
  );
1585
1621
  const profilesBlock = loaded.project.deploymentProfiles ?? {};
1586
1622
  const profileVariableKeys = Object.values(profilesBlock).map(
@@ -1705,6 +1741,11 @@ function connectionCommand() {
1705
1741
  await (0, import_connection5.upsertProfile)(profile);
1706
1742
  logger.success(`Saved profile "${profile.name}".`);
1707
1743
  });
1744
+ cmd.command("get <name>").description("Print a profile (secrets are redacted).").action(async (name) => {
1745
+ const profile = await (0, import_connection5.getProfile)(String(name));
1746
+ const redacted = { ...profile, auth: redactAuth(profile.auth) };
1747
+ logger.info(JSON.stringify(redacted, null, 2));
1748
+ });
1708
1749
  cmd.command("remove").description("Remove a connection profile.").argument("<name>").action(async (name) => {
1709
1750
  const ok = await (0, import_connection5.removeProfile)(String(name));
1710
1751
  if (ok) logger.success(`Removed profile "${name}".`);
@@ -1722,6 +1763,24 @@ function connectionCommand() {
1722
1763
  });
1723
1764
  return cmd;
1724
1765
  }
1766
+ function redactAuth(auth) {
1767
+ const isPlaceholder = (v) => v.startsWith("env:") || v.startsWith("keyring:");
1768
+ switch (auth.method) {
1769
+ case "PASSWORD":
1770
+ case "MFA":
1771
+ return auth.password && !isPlaceholder(auth.password) ? { ...auth, password: "<redacted>" } : auth;
1772
+ case "OAUTH":
1773
+ return auth.token && !isPlaceholder(auth.token) ? { ...auth, token: "<redacted>" } : auth;
1774
+ case "KEY_PAIR":
1775
+ return auth.privateKeyPassphrase && !isPlaceholder(auth.privateKeyPassphrase) ? { ...auth, privateKeyPassphrase: "<redacted>" } : auth;
1776
+ case "EXTERNAL_BROWSER":
1777
+ return auth;
1778
+ default: {
1779
+ const _exhaustive = auth;
1780
+ return _exhaustive;
1781
+ }
1782
+ }
1783
+ }
1725
1784
 
1726
1785
  // src/commands/scaffold.ts
1727
1786
  var import_commander10 = require("commander");