@ddt-tools/cli 0.2.0 → 0.2.5

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 (205) hide show
  1. package/dist/advise-tests-YNMKVJCD.js +87 -0
  2. package/dist/advise-tests-YNMKVJCD.js.map +1 -0
  3. package/dist/ai-NTNPYEKZ.js +86 -0
  4. package/dist/ai-NTNPYEKZ.js.map +1 -0
  5. package/dist/anonymize-LERTWUQO.js +139 -0
  6. package/dist/anonymize-LERTWUQO.js.map +1 -0
  7. package/dist/approval-GGZGKIU4.js +73 -0
  8. package/dist/approval-GGZGKIU4.js.map +1 -0
  9. package/dist/approval-chain-GWJKZHVU.js +118 -0
  10. package/dist/approval-chain-GWJKZHVU.js.map +1 -0
  11. package/dist/audit-log-2PH55BU4.js +159 -0
  12. package/dist/audit-log-2PH55BU4.js.map +1 -0
  13. package/dist/backlog-QNXGOUF4.js +76 -0
  14. package/dist/backlog-QNXGOUF4.js.map +1 -0
  15. package/dist/bisect-W3XKKRWG.js +111 -0
  16. package/dist/bisect-W3XKKRWG.js.map +1 -0
  17. package/dist/bookmarks-XVOGXGMC.js +107 -0
  18. package/dist/bookmarks-XVOGXGMC.js.map +1 -0
  19. package/dist/branch-S3I2IJGQ.js +103 -0
  20. package/dist/branch-S3I2IJGQ.js.map +1 -0
  21. package/dist/build-MP3JQEFO.js +20 -0
  22. package/dist/build-MP3JQEFO.js.map +1 -0
  23. package/dist/catalog-3J3NFNXP.js +137 -0
  24. package/dist/catalog-3J3NFNXP.js.map +1 -0
  25. package/dist/changelog-ZQAH3ULB.js +216 -0
  26. package/dist/changelog-ZQAH3ULB.js.map +1 -0
  27. package/dist/chunk-2FT6HXKS.js +55 -0
  28. package/dist/chunk-2FT6HXKS.js.map +1 -0
  29. package/dist/chunk-DGUM43GV.js +11 -0
  30. package/dist/chunk-DGUM43GV.js.map +1 -0
  31. package/dist/chunk-DL3V7UJ2.js +25 -0
  32. package/dist/chunk-DL3V7UJ2.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-XFXG347C.js +40 -0
  36. package/dist/chunk-XFXG347C.js.map +1 -0
  37. package/dist/cli.js +504 -19402
  38. package/dist/cli.js.map +1 -1
  39. package/dist/compare-IOEATL6G.js +435 -0
  40. package/dist/compare-IOEATL6G.js.map +1 -0
  41. package/dist/compare-profiles-H33CXZPD.js +219 -0
  42. package/dist/compare-profiles-H33CXZPD.js.map +1 -0
  43. package/dist/completion-ZSNCQKJ2.js +89 -0
  44. package/dist/completion-ZSNCQKJ2.js.map +1 -0
  45. package/dist/connection-CDGVEFUC.js +148 -0
  46. package/dist/connection-CDGVEFUC.js.map +1 -0
  47. package/dist/cost-estimate-S2MKHT2H.js +321 -0
  48. package/dist/cost-estimate-S2MKHT2H.js.map +1 -0
  49. package/dist/data-compare-46ZI7KHL.js +128 -0
  50. package/dist/data-compare-46ZI7KHL.js.map +1 -0
  51. package/dist/data-fit-WGEPLD5S.js +127 -0
  52. package/dist/data-fit-WGEPLD5S.js.map +1 -0
  53. package/dist/deploy-status-4H5KJFRC.js +58 -0
  54. package/dist/deploy-status-4H5KJFRC.js.map +1 -0
  55. package/dist/design-ILX3ZSWW.js +135 -0
  56. package/dist/design-ILX3ZSWW.js.map +1 -0
  57. package/dist/diagnose-WPUL67E4.js +150 -0
  58. package/dist/diagnose-WPUL67E4.js.map +1 -0
  59. package/dist/discover-DEO2R5T6.js +78 -0
  60. package/dist/discover-DEO2R5T6.js.map +1 -0
  61. package/dist/docs-QNY3MUVO.js +183 -0
  62. package/dist/docs-QNY3MUVO.js.map +1 -0
  63. package/dist/drift-FDRNPWQA.js +233 -0
  64. package/dist/drift-FDRNPWQA.js.map +1 -0
  65. package/dist/drift-gate-6BWWWMHW.js +103 -0
  66. package/dist/drift-gate-6BWWWMHW.js.map +1 -0
  67. package/dist/error-lookup-4R3Y4RBC.js +56 -0
  68. package/dist/error-lookup-4R3Y4RBC.js.map +1 -0
  69. package/dist/errorReporting-LX6WT4JH.js +109 -0
  70. package/dist/errorReporting-LX6WT4JH.js.map +1 -0
  71. package/dist/exec-JOLH5LPT.js +122 -0
  72. package/dist/exec-JOLH5LPT.js.map +1 -0
  73. package/dist/explain-NS26WE2Y.js +189 -0
  74. package/dist/explain-NS26WE2Y.js.map +1 -0
  75. package/dist/explorer-GSYYYOAL.js +58 -0
  76. package/dist/explorer-GSYYYOAL.js.map +1 -0
  77. package/dist/extract-4LWEZG4O.js +152 -0
  78. package/dist/extract-4LWEZG4O.js.map +1 -0
  79. package/dist/features-KQV4OFIZ.js +54 -0
  80. package/dist/features-KQV4OFIZ.js.map +1 -0
  81. package/dist/feedback-CBLGXUEG.js +158 -0
  82. package/dist/feedback-CBLGXUEG.js.map +1 -0
  83. package/dist/find-SMXRCZ76.js +176 -0
  84. package/dist/find-SMXRCZ76.js.map +1 -0
  85. package/dist/format-HMGG6MY3.js +277 -0
  86. package/dist/format-HMGG6MY3.js.map +1 -0
  87. package/dist/generate-W7VLBDLI.js +160 -0
  88. package/dist/generate-W7VLBDLI.js.map +1 -0
  89. package/dist/graph-YYL5UYCJ.js +168 -0
  90. package/dist/graph-YYL5UYCJ.js.map +1 -0
  91. package/dist/history-GDRFP4PG.js +184 -0
  92. package/dist/history-GDRFP4PG.js.map +1 -0
  93. package/dist/hosts-DRFZTMIJ.js +45 -0
  94. package/dist/hosts-DRFZTMIJ.js.map +1 -0
  95. package/dist/impact-A4NU6CB2.js +63 -0
  96. package/dist/impact-A4NU6CB2.js.map +1 -0
  97. package/dist/import-EGOVKTLX.js +29 -0
  98. package/dist/import-EGOVKTLX.js.map +1 -0
  99. package/dist/import-script-R5RXPDH6.js +79 -0
  100. package/dist/import-script-R5RXPDH6.js.map +1 -0
  101. package/dist/index.cjs +11 -5
  102. package/dist/index.cjs.map +1 -1
  103. package/dist/index.js +8 -2
  104. package/dist/index.js.map +1 -1
  105. package/dist/init-EAOGNGXI.js +54 -0
  106. package/dist/init-EAOGNGXI.js.map +1 -0
  107. package/dist/install-hooks-G3Y5LVXK.js +109 -0
  108. package/dist/install-hooks-G3Y5LVXK.js.map +1 -0
  109. package/dist/license-Z5YSC7XQ.js +43 -0
  110. package/dist/license-Z5YSC7XQ.js.map +1 -0
  111. package/dist/lineage-C5CGVP36.js +555 -0
  112. package/dist/lineage-C5CGVP36.js.map +1 -0
  113. package/dist/lint-AQFPZ3WG.js +144 -0
  114. package/dist/lint-AQFPZ3WG.js.map +1 -0
  115. package/dist/mcp-6ZXOAF7S.js +343 -0
  116. package/dist/mcp-6ZXOAF7S.js.map +1 -0
  117. package/dist/migrate-from-dbt-K4ELOWUD.js +156 -0
  118. package/dist/migrate-from-dbt-K4ELOWUD.js.map +1 -0
  119. package/dist/migrate-platform-E7VZFPO5.js +91 -0
  120. package/dist/migrate-platform-E7VZFPO5.js.map +1 -0
  121. package/dist/optimize-WUJ5ZN5Y.js +109 -0
  122. package/dist/optimize-WUJ5ZN5Y.js.map +1 -0
  123. package/dist/perf-UULZSREY.js +200 -0
  124. package/dist/perf-UULZSREY.js.map +1 -0
  125. package/dist/pii-QHU32VML.js +146 -0
  126. package/dist/pii-QHU32VML.js.map +1 -0
  127. package/dist/pilot-BR6GVK32.js +29 -0
  128. package/dist/pilot-BR6GVK32.js.map +1 -0
  129. package/dist/pr-comment-2FOA3EXG.js +81 -0
  130. package/dist/pr-comment-2FOA3EXG.js.map +1 -0
  131. package/dist/preview-XNY422OU.js +46 -0
  132. package/dist/preview-XNY422OU.js.map +1 -0
  133. package/dist/profile-SQTBNKYS.js +98 -0
  134. package/dist/profile-SQTBNKYS.js.map +1 -0
  135. package/dist/promote-FSGUPIPD.js +417 -0
  136. package/dist/promote-FSGUPIPD.js.map +1 -0
  137. package/dist/publish-HLP3XHM5.js +766 -0
  138. package/dist/publish-HLP3XHM5.js.map +1 -0
  139. package/dist/purge-Y5IOTXKA.js +56 -0
  140. package/dist/purge-Y5IOTXKA.js.map +1 -0
  141. package/dist/query-log-SDDGMJLJ.js +112 -0
  142. package/dist/query-log-SDDGMJLJ.js.map +1 -0
  143. package/dist/refactor-TC7S43F2.js +5809 -0
  144. package/dist/refactor-TC7S43F2.js.map +1 -0
  145. package/dist/refresh-MDJYOYV5.js +39 -0
  146. package/dist/refresh-MDJYOYV5.js.map +1 -0
  147. package/dist/replay-E4664A5K.js +118 -0
  148. package/dist/replay-E4664A5K.js.map +1 -0
  149. package/dist/revert-QWQWCJJB.js +111 -0
  150. package/dist/revert-QWQWCJJB.js.map +1 -0
  151. package/dist/review-7CAVLD67.js +164 -0
  152. package/dist/review-7CAVLD67.js.map +1 -0
  153. package/dist/rollback-suggest-C6D5YFCA.js +79 -0
  154. package/dist/rollback-suggest-C6D5YFCA.js.map +1 -0
  155. package/dist/safer-alternative-QR4QEFUV.js +84 -0
  156. package/dist/safer-alternative-QR4QEFUV.js.map +1 -0
  157. package/dist/safety-OFWUFLK4.js +165 -0
  158. package/dist/safety-OFWUFLK4.js.map +1 -0
  159. package/dist/savings-MEBE4TXI.js +95 -0
  160. package/dist/savings-MEBE4TXI.js.map +1 -0
  161. package/dist/scan-secrets-XCUBMLHL.js +54 -0
  162. package/dist/scan-secrets-XCUBMLHL.js.map +1 -0
  163. package/dist/schema-7JZIG6QR.js +447 -0
  164. package/dist/schema-7JZIG6QR.js.map +1 -0
  165. package/dist/script-BMYVBHFR.js +167 -0
  166. package/dist/script-BMYVBHFR.js.map +1 -0
  167. package/dist/search-TA3C3AZT.js +151 -0
  168. package/dist/search-TA3C3AZT.js.map +1 -0
  169. package/dist/seed-W4Q3L2IU.js +101 -0
  170. package/dist/seed-W4Q3L2IU.js.map +1 -0
  171. package/dist/sketch-6B2V6FJV.js +83 -0
  172. package/dist/sketch-6B2V6FJV.js.map +1 -0
  173. package/dist/snapshot-YMVS322L.js +171 -0
  174. package/dist/snapshot-YMVS322L.js.map +1 -0
  175. package/dist/snippets-EVTN63OU.js +74 -0
  176. package/dist/snippets-EVTN63OU.js.map +1 -0
  177. package/dist/standards-FGJW3CQL.js +238 -0
  178. package/dist/standards-FGJW3CQL.js.map +1 -0
  179. package/dist/suggest-V3LVIFZ5.js +44 -0
  180. package/dist/suggest-V3LVIFZ5.js.map +1 -0
  181. package/dist/suggest-constraints-EX2FCWOQ.js +154 -0
  182. package/dist/suggest-constraints-EX2FCWOQ.js.map +1 -0
  183. package/dist/suite-YTQ3CNX5.js +85 -0
  184. package/dist/suite-YTQ3CNX5.js.map +1 -0
  185. package/dist/telemetry-KOIY3NEQ.js +90 -0
  186. package/dist/telemetry-KOIY3NEQ.js.map +1 -0
  187. package/dist/template-MUJ6X6LN.js +396 -0
  188. package/dist/template-MUJ6X6LN.js.map +1 -0
  189. package/dist/test-XFSQHR2S.js +169 -0
  190. package/dist/test-XFSQHR2S.js.map +1 -0
  191. package/dist/trial-GFTGYCR3.js +31 -0
  192. package/dist/trial-GFTGYCR3.js.map +1 -0
  193. package/dist/validate-LFDEZFFH.js +107 -0
  194. package/dist/validate-LFDEZFFH.js.map +1 -0
  195. package/dist/verify-KRDYOJCR.js +76 -0
  196. package/dist/verify-KRDYOJCR.js.map +1 -0
  197. package/dist/watch-FSG23RR3.js +80 -0
  198. package/dist/watch-FSG23RR3.js.map +1 -0
  199. package/dist/xcompare-U4TXTTIR.js +87 -0
  200. package/dist/xcompare-U4TXTTIR.js.map +1 -0
  201. package/package.json +2 -2
  202. package/dist/cli.cjs +0 -19298
  203. package/dist/cli.cjs.map +0 -1
  204. package/dist/cli.d.cts +0 -1
  205. package/dist/cli.d.ts +0 -1
@@ -0,0 +1,109 @@
1
+ import "./chunk-DGUM43GV.js";
2
+
3
+ // src/commands/install-hooks.ts
4
+ import { promises as fs } from "fs";
5
+ import { existsSync } from "fs";
6
+ import path from "path";
7
+ import { Command } from "commander";
8
+ var HOOK_MARKER = "# ddt-managed-hook";
9
+ var HOOK_BODY = `#!/bin/sh
10
+ ${HOOK_MARKER} \u2014 installed by \`ddt install-hooks\`. Remove this hook or re-install with --force to update.
11
+
12
+ # Find the project file relative to the repo root.
13
+ project=$(find . -maxdepth 3 -name '*.ddtproj' -not -path '*/node_modules/*' -not -path '*/dist/*' | head -1)
14
+ if [ -z "$project" ]; then
15
+ echo "ddt pre-commit hook: no .ddtproj found (skipping)."
16
+ exit 0
17
+ fi
18
+
19
+ echo "ddt pre-commit: validate + format-check on $project"
20
+
21
+ if ! command -v ddt >/dev/null 2>&1; then
22
+ echo "ddt CLI not on PATH. Install with \`npm i -g @ddt-tools/cli\`, or remove the hook at .git/hooks/pre-commit."
23
+ exit 1
24
+ fi
25
+
26
+ if ! ddt validate -p "$project"; then
27
+ echo ""
28
+ echo "Refusing commit: \`ddt validate\` failed."
29
+ exit 1
30
+ fi
31
+
32
+ if ! ddt format -p "$project" --check; then
33
+ echo ""
34
+ echo "Refusing commit: some .sql files are not formatted. Run \`ddt format -p $project\` and re-stage."
35
+ exit 1
36
+ fi
37
+ `;
38
+ function installHooksCommand() {
39
+ const cmd = new Command("install-hooks");
40
+ cmd.description(
41
+ "Install a git pre-commit hook that runs `ddt validate` + `ddt format --check` before each commit."
42
+ ).option("--force", "Overwrite an existing hook (refuses by default if the file exists).", false).option("--uninstall", "Remove the ddt-managed pre-commit hook instead of installing.", false).action(async (opts) => {
43
+ const cwd = process.cwd();
44
+ const gitDir = await findGitDir(cwd);
45
+ if (!gitDir) {
46
+ throw new Error(`No .git directory found at or above ${cwd}.`);
47
+ }
48
+ const hookPath = path.join(gitDir, "hooks", "pre-commit");
49
+ if (opts.uninstall) {
50
+ if (!existsSync(hookPath)) {
51
+ console.log("No pre-commit hook installed.");
52
+ return;
53
+ }
54
+ const existing = await fs.readFile(hookPath, "utf8");
55
+ if (!existing.includes(HOOK_MARKER)) {
56
+ console.error(
57
+ `Refusing to remove: ${hookPath} is not a ddt-managed hook (missing marker).`
58
+ );
59
+ process.exitCode = 1;
60
+ return;
61
+ }
62
+ await fs.unlink(hookPath);
63
+ console.log(`Removed ${hookPath}.`);
64
+ return;
65
+ }
66
+ if (existsSync(hookPath) && !opts.force) {
67
+ const existing = await fs.readFile(hookPath, "utf8");
68
+ if (existing.includes(HOOK_MARKER)) {
69
+ console.log(`Hook already installed at ${hookPath}. Re-run with --force to overwrite.`);
70
+ } else {
71
+ console.error(`Refusing to overwrite: ${hookPath} exists and is NOT a ddt-managed hook.`);
72
+ console.error("Inspect it, then re-run with --force if you want to replace it.");
73
+ process.exitCode = 1;
74
+ }
75
+ return;
76
+ }
77
+ await fs.mkdir(path.dirname(hookPath), { recursive: true });
78
+ await fs.writeFile(hookPath, HOOK_BODY, { mode: 493 });
79
+ console.log(`Installed pre-commit hook at ${hookPath}.`);
80
+ console.log(" Runs `ddt validate` + `ddt format --check` on every commit.");
81
+ console.log(
82
+ " Bypass once with `git commit --no-verify`. Remove with `ddt install-hooks --uninstall`."
83
+ );
84
+ });
85
+ return cmd;
86
+ }
87
+ async function findGitDir(start) {
88
+ let dir = path.resolve(start);
89
+ while (true) {
90
+ const candidate = path.join(dir, ".git");
91
+ if (existsSync(candidate)) {
92
+ const stat = await fs.stat(candidate);
93
+ if (stat.isDirectory()) return candidate;
94
+ const ptr = await fs.readFile(candidate, "utf8");
95
+ const m = ptr.match(/^gitdir:\s*(.+)$/m);
96
+ if (m && m[1]) {
97
+ const resolved = path.isAbsolute(m[1]) ? m[1] : path.resolve(dir, m[1]);
98
+ return resolved;
99
+ }
100
+ }
101
+ const parent = path.dirname(dir);
102
+ if (parent === dir) return void 0;
103
+ dir = parent;
104
+ }
105
+ }
106
+ export {
107
+ installHooksCommand
108
+ };
109
+ //# sourceMappingURL=install-hooks-G3Y5LVXK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/install-hooks.ts"],"sourcesContent":["import { promises as fs } from 'node:fs';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { Command } from 'commander';\n\n/**\n * `ddt install-hooks` — install a git pre-commit hook that runs\n * `ddt format --check` + `ddt validate` before allowing a commit.\n *\n * Husky-style: writes a single shell script to `.git/hooks/pre-commit`\n * that delegates to the CLI. Refuses to overwrite an existing hook\n * unless --force.\n */\nconst HOOK_MARKER = '# ddt-managed-hook';\n\nconst HOOK_BODY = `#!/bin/sh\n${HOOK_MARKER} — installed by \\`ddt install-hooks\\`. Remove this hook or re-install with --force to update.\n\n# Find the project file relative to the repo root.\nproject=$(find . -maxdepth 3 -name '*.ddtproj' -not -path '*/node_modules/*' -not -path '*/dist/*' | head -1)\nif [ -z \"$project\" ]; then\n echo \"ddt pre-commit hook: no .ddtproj found (skipping).\"\n exit 0\nfi\n\necho \"ddt pre-commit: validate + format-check on $project\"\n\nif ! command -v ddt >/dev/null 2>&1; then\n echo \"ddt CLI not on PATH. Install with \\`npm i -g @ddt-tools/cli\\`, or remove the hook at .git/hooks/pre-commit.\"\n exit 1\nfi\n\nif ! ddt validate -p \"$project\"; then\n echo \"\"\n echo \"Refusing commit: \\`ddt validate\\` failed.\"\n exit 1\nfi\n\nif ! ddt format -p \"$project\" --check; then\n echo \"\"\n echo \"Refusing commit: some .sql files are not formatted. Run \\`ddt format -p $project\\` and re-stage.\"\n exit 1\nfi\n`;\n\nexport function installHooksCommand(): Command {\n const cmd = new Command('install-hooks');\n cmd\n .description(\n 'Install a git pre-commit hook that runs `ddt validate` + `ddt format --check` before each commit.',\n )\n .option('--force', 'Overwrite an existing hook (refuses by default if the file exists).', false)\n .option('--uninstall', 'Remove the ddt-managed pre-commit hook instead of installing.', false)\n .action(async (opts) => {\n const cwd = process.cwd();\n const gitDir = await findGitDir(cwd);\n if (!gitDir) {\n throw new Error(`No .git directory found at or above ${cwd}.`);\n }\n const hookPath = path.join(gitDir, 'hooks', 'pre-commit');\n\n if (opts.uninstall) {\n if (!existsSync(hookPath)) {\n console.log('No pre-commit hook installed.');\n return;\n }\n const existing = await fs.readFile(hookPath, 'utf8');\n if (!existing.includes(HOOK_MARKER)) {\n console.error(\n `Refusing to remove: ${hookPath} is not a ddt-managed hook (missing marker).`,\n );\n process.exitCode = 1;\n return;\n }\n await fs.unlink(hookPath);\n console.log(`Removed ${hookPath}.`);\n return;\n }\n\n if (existsSync(hookPath) && !opts.force) {\n const existing = await fs.readFile(hookPath, 'utf8');\n if (existing.includes(HOOK_MARKER)) {\n console.log(`Hook already installed at ${hookPath}. Re-run with --force to overwrite.`);\n } else {\n console.error(`Refusing to overwrite: ${hookPath} exists and is NOT a ddt-managed hook.`);\n console.error('Inspect it, then re-run with --force if you want to replace it.');\n process.exitCode = 1;\n }\n return;\n }\n\n await fs.mkdir(path.dirname(hookPath), { recursive: true });\n await fs.writeFile(hookPath, HOOK_BODY, { mode: 0o755 });\n console.log(`Installed pre-commit hook at ${hookPath}.`);\n console.log(' Runs `ddt validate` + `ddt format --check` on every commit.');\n console.log(\n ' Bypass once with `git commit --no-verify`. Remove with `ddt install-hooks --uninstall`.',\n );\n });\n return cmd;\n}\n\nasync function findGitDir(start: string): Promise<string | undefined> {\n let dir = path.resolve(start);\n while (true) {\n const candidate = path.join(dir, '.git');\n if (existsSync(candidate)) {\n // Could be a regular dir or a `gitdir: …` pointer (worktree). Both work for hooks/.\n const stat = await fs.stat(candidate);\n if (stat.isDirectory()) return candidate;\n // Worktree: read the pointer.\n const ptr = await fs.readFile(candidate, 'utf8');\n const m = ptr.match(/^gitdir:\\s*(.+)$/m);\n if (m && m[1]) {\n const resolved = path.isAbsolute(m[1]) ? m[1] : path.resolve(dir, m[1]);\n return resolved;\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) return undefined;\n dir = parent;\n }\n}\n"],"mappings":";;;AAAA,SAAS,YAAY,UAAU;AAC/B,SAAS,kBAAkB;AAC3B,OAAO,UAAU;AACjB,SAAS,eAAe;AAUxB,IAAM,cAAc;AAEpB,IAAM,YAAY;AAAA,EAChB,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6BN,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAI,QAAQ,eAAe;AACvC,MACG;AAAA,IACC;AAAA,EACF,EACC,OAAO,WAAW,uEAAuE,KAAK,EAC9F,OAAO,eAAe,iEAAiE,KAAK,EAC5F,OAAO,OAAO,SAAS;AACtB,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,SAAS,MAAM,WAAW,GAAG;AACnC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,uCAAuC,GAAG,GAAG;AAAA,IAC/D;AACA,UAAM,WAAW,KAAK,KAAK,QAAQ,SAAS,YAAY;AAExD,QAAI,KAAK,WAAW;AAClB,UAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,gBAAQ,IAAI,+BAA+B;AAC3C;AAAA,MACF;AACA,YAAM,WAAW,MAAM,GAAG,SAAS,UAAU,MAAM;AACnD,UAAI,CAAC,SAAS,SAAS,WAAW,GAAG;AACnC,gBAAQ;AAAA,UACN,uBAAuB,QAAQ;AAAA,QACjC;AACA,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,GAAG,OAAO,QAAQ;AACxB,cAAQ,IAAI,WAAW,QAAQ,GAAG;AAClC;AAAA,IACF;AAEA,QAAI,WAAW,QAAQ,KAAK,CAAC,KAAK,OAAO;AACvC,YAAM,WAAW,MAAM,GAAG,SAAS,UAAU,MAAM;AACnD,UAAI,SAAS,SAAS,WAAW,GAAG;AAClC,gBAAQ,IAAI,6BAA6B,QAAQ,qCAAqC;AAAA,MACxF,OAAO;AACL,gBAAQ,MAAM,0BAA0B,QAAQ,wCAAwC;AACxF,gBAAQ,MAAM,iEAAiE;AAC/E,gBAAQ,WAAW;AAAA,MACrB;AACA;AAAA,IACF;AAEA,UAAM,GAAG,MAAM,KAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,UAAM,GAAG,UAAU,UAAU,WAAW,EAAE,MAAM,IAAM,CAAC;AACvD,YAAQ,IAAI,gCAAgC,QAAQ,GAAG;AACvD,YAAQ,IAAI,+DAA+D;AAC3E,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF,CAAC;AACH,SAAO;AACT;AAEA,eAAe,WAAW,OAA4C;AACpE,MAAI,MAAM,KAAK,QAAQ,KAAK;AAC5B,SAAO,MAAM;AACX,UAAM,YAAY,KAAK,KAAK,KAAK,MAAM;AACvC,QAAI,WAAW,SAAS,GAAG;AAEzB,YAAM,OAAO,MAAM,GAAG,KAAK,SAAS;AACpC,UAAI,KAAK,YAAY,EAAG,QAAO;AAE/B,YAAM,MAAM,MAAM,GAAG,SAAS,WAAW,MAAM;AAC/C,YAAM,IAAI,IAAI,MAAM,mBAAmB;AACvC,UAAI,KAAK,EAAE,CAAC,GAAG;AACb,cAAM,WAAW,KAAK,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,KAAK,EAAE,CAAC,CAAC;AACtE,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACF;","names":[]}
@@ -0,0 +1,43 @@
1
+ import "./chunk-DGUM43GV.js";
2
+
3
+ // src/commands/license.ts
4
+ import { promises as fs } from "fs";
5
+ import { homedir } from "os";
6
+ import path from "path";
7
+ import { Command } from "commander";
8
+ import { license as licenseNs } from "@ddt-tools/core";
9
+ function licenseCommand() {
10
+ const cmd = new Command("license").description(
11
+ "Manage the DDT license key (open-core, offline, warn-mode in v0.3)."
12
+ );
13
+ cmd.command("show").description("Show the currently loaded license.").action(async () => {
14
+ const lic = await licenseNs.loadLicense();
15
+ console.log(licenseNs.describeLicense(lic));
16
+ });
17
+ cmd.command("set").description("Install a license JWT to ~/.ddt/license.jwt.").requiredOption("--jwt <token>", "The full JWT string (3 dot-separated base64url parts).").action(async (opts) => {
18
+ const target = process.env["DDT_LICENSE_PATH"] ?? path.join(homedir(), ".ddt", "license.jwt");
19
+ await fs.mkdir(path.dirname(target), { recursive: true });
20
+ await fs.writeFile(target, opts.jwt.trim() + "\n", "utf8");
21
+ const lic = await licenseNs.loadLicense();
22
+ console.log(`Wrote ${target}.`);
23
+ console.log(licenseNs.describeLicense(lic));
24
+ });
25
+ cmd.command("clear").description("Remove the local license file (returns to free tier).").action(async () => {
26
+ const target = process.env["DDT_LICENSE_PATH"] ?? path.join(homedir(), ".ddt", "license.jwt");
27
+ try {
28
+ await fs.unlink(target);
29
+ console.log(`Removed ${target}. Now running free tier.`);
30
+ } catch (err) {
31
+ if (err.code === "ENOENT") {
32
+ console.log(`No license file at ${target}; already on free tier.`);
33
+ } else {
34
+ throw err;
35
+ }
36
+ }
37
+ });
38
+ return cmd;
39
+ }
40
+ export {
41
+ licenseCommand
42
+ };
43
+ //# sourceMappingURL=license-Z5YSC7XQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/license.ts"],"sourcesContent":["import { promises as fs } from 'node:fs';\nimport { homedir } from 'node:os';\nimport path from 'node:path';\nimport { Command } from 'commander';\nimport { license as licenseNs } from '@ddt-tools/core';\n\n/**\n * `ddt license` — manage the local license-key file. Open-core, offline,\n * warn-mode (this revision never blocks; missing Pro license only prints\n * a warning when running Pro features).\n *\n * Subcommands:\n * show Print the loaded license payload + verification status.\n * set Install a JWT into ~/.ddt/license.jwt.\n * clear Remove the license file (returns to free tier).\n */\nexport function licenseCommand(): Command {\n const cmd = new Command('license').description(\n 'Manage the DDT license key (open-core, offline, warn-mode in v0.3).',\n );\n\n cmd\n .command('show')\n .description('Show the currently loaded license.')\n .action(async () => {\n const lic = await licenseNs.loadLicense();\n console.log(licenseNs.describeLicense(lic));\n });\n\n cmd\n .command('set')\n .description('Install a license JWT to ~/.ddt/license.jwt.')\n .requiredOption('--jwt <token>', 'The full JWT string (3 dot-separated base64url parts).')\n .action(async (opts: { jwt: string }) => {\n const target = process.env['DDT_LICENSE_PATH'] ?? path.join(homedir(), '.ddt', 'license.jwt');\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, opts.jwt.trim() + '\\n', 'utf8');\n const lic = await licenseNs.loadLicense();\n console.log(`Wrote ${target}.`);\n console.log(licenseNs.describeLicense(lic));\n });\n\n cmd\n .command('clear')\n .description('Remove the local license file (returns to free tier).')\n .action(async () => {\n const target = process.env['DDT_LICENSE_PATH'] ?? path.join(homedir(), '.ddt', 'license.jwt');\n try {\n await fs.unlink(target);\n console.log(`Removed ${target}. Now running free tier.`);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n console.log(`No license file at ${target}; already on free tier.`);\n } else {\n throw err;\n }\n }\n });\n\n return cmd;\n}\n"],"mappings":";;;AAAA,SAAS,YAAY,UAAU;AAC/B,SAAS,eAAe;AACxB,OAAO,UAAU;AACjB,SAAS,eAAe;AACxB,SAAS,WAAW,iBAAiB;AAY9B,SAAS,iBAA0B;AACxC,QAAM,MAAM,IAAI,QAAQ,SAAS,EAAE;AAAA,IACjC;AAAA,EACF;AAEA,MACG,QAAQ,MAAM,EACd,YAAY,oCAAoC,EAChD,OAAO,YAAY;AAClB,UAAM,MAAM,MAAM,UAAU,YAAY;AACxC,YAAQ,IAAI,UAAU,gBAAgB,GAAG,CAAC;AAAA,EAC5C,CAAC;AAEH,MACG,QAAQ,KAAK,EACb,YAAY,8CAA8C,EAC1D,eAAe,iBAAiB,wDAAwD,EACxF,OAAO,OAAO,SAA0B;AACvC,UAAM,SAAS,QAAQ,IAAI,kBAAkB,KAAK,KAAK,KAAK,QAAQ,GAAG,QAAQ,aAAa;AAC5F,UAAM,GAAG,MAAM,KAAK,QAAQ,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,UAAM,GAAG,UAAU,QAAQ,KAAK,IAAI,KAAK,IAAI,MAAM,MAAM;AACzD,UAAM,MAAM,MAAM,UAAU,YAAY;AACxC,YAAQ,IAAI,SAAS,MAAM,GAAG;AAC9B,YAAQ,IAAI,UAAU,gBAAgB,GAAG,CAAC;AAAA,EAC5C,CAAC;AAEH,MACG,QAAQ,OAAO,EACf,YAAY,uDAAuD,EACnE,OAAO,YAAY;AAClB,UAAM,SAAS,QAAQ,IAAI,kBAAkB,KAAK,KAAK,KAAK,QAAQ,GAAG,QAAQ,aAAa;AAC5F,QAAI;AACF,YAAM,GAAG,OAAO,MAAM;AACtB,cAAQ,IAAI,WAAW,MAAM,0BAA0B;AAAA,IACzD,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,UAAU;AACpD,gBAAQ,IAAI,sBAAsB,MAAM,yBAAyB;AAAA,MACnE,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAEH,SAAO;AACT;","names":[]}