@creem_io/cli 0.2.1

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 (98) hide show
  1. package/README.md +155 -0
  2. package/dist/commands/checkouts.d.ts +3 -0
  3. package/dist/commands/checkouts.d.ts.map +1 -0
  4. package/dist/commands/checkouts.js +175 -0
  5. package/dist/commands/checkouts.js.map +1 -0
  6. package/dist/commands/config.d.ts +3 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +184 -0
  9. package/dist/commands/config.js.map +1 -0
  10. package/dist/commands/customers.d.ts +3 -0
  11. package/dist/commands/customers.d.ts.map +1 -0
  12. package/dist/commands/customers.js +246 -0
  13. package/dist/commands/customers.js.map +1 -0
  14. package/dist/commands/discounts.d.ts +3 -0
  15. package/dist/commands/discounts.d.ts.map +1 -0
  16. package/dist/commands/discounts.js +419 -0
  17. package/dist/commands/discounts.js.map +1 -0
  18. package/dist/commands/index.d.ts +12 -0
  19. package/dist/commands/index.d.ts.map +1 -0
  20. package/dist/commands/index.js +26 -0
  21. package/dist/commands/index.js.map +1 -0
  22. package/dist/commands/login.d.ts +3 -0
  23. package/dist/commands/login.d.ts.map +1 -0
  24. package/dist/commands/login.js +115 -0
  25. package/dist/commands/login.js.map +1 -0
  26. package/dist/commands/logout.d.ts +3 -0
  27. package/dist/commands/logout.d.ts.map +1 -0
  28. package/dist/commands/logout.js +61 -0
  29. package/dist/commands/logout.js.map +1 -0
  30. package/dist/commands/migrate.d.ts +3 -0
  31. package/dist/commands/migrate.d.ts.map +1 -0
  32. package/dist/commands/migrate.js +1073 -0
  33. package/dist/commands/migrate.js.map +1 -0
  34. package/dist/commands/products.d.ts +3 -0
  35. package/dist/commands/products.d.ts.map +1 -0
  36. package/dist/commands/products.js +400 -0
  37. package/dist/commands/products.js.map +1 -0
  38. package/dist/commands/subscriptions.d.ts +3 -0
  39. package/dist/commands/subscriptions.d.ts.map +1 -0
  40. package/dist/commands/subscriptions.js +476 -0
  41. package/dist/commands/subscriptions.js.map +1 -0
  42. package/dist/commands/transactions.d.ts +3 -0
  43. package/dist/commands/transactions.d.ts.map +1 -0
  44. package/dist/commands/transactions.js +326 -0
  45. package/dist/commands/transactions.js.map +1 -0
  46. package/dist/commands/whoami.d.ts +3 -0
  47. package/dist/commands/whoami.d.ts.map +1 -0
  48. package/dist/commands/whoami.js +76 -0
  49. package/dist/commands/whoami.js.map +1 -0
  50. package/dist/index.d.ts +3 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +109 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/lib/api.d.ts +25 -0
  55. package/dist/lib/api.d.ts.map +1 -0
  56. package/dist/lib/api.js +77 -0
  57. package/dist/lib/api.js.map +1 -0
  58. package/dist/lib/auth.d.ts +28 -0
  59. package/dist/lib/auth.d.ts.map +1 -0
  60. package/dist/lib/auth.js +113 -0
  61. package/dist/lib/auth.js.map +1 -0
  62. package/dist/lib/config.d.ts +34 -0
  63. package/dist/lib/config.d.ts.map +1 -0
  64. package/dist/lib/config.js +144 -0
  65. package/dist/lib/config.js.map +1 -0
  66. package/dist/lib/env-cache.d.ts +10 -0
  67. package/dist/lib/env-cache.d.ts.map +1 -0
  68. package/dist/lib/env-cache.js +27 -0
  69. package/dist/lib/env-cache.js.map +1 -0
  70. package/dist/tui/command-bar.d.ts +10 -0
  71. package/dist/tui/command-bar.d.ts.map +1 -0
  72. package/dist/tui/command-bar.js +35 -0
  73. package/dist/tui/command-bar.js.map +1 -0
  74. package/dist/tui/engine.d.ts +3 -0
  75. package/dist/tui/engine.d.ts.map +1 -0
  76. package/dist/tui/engine.js +454 -0
  77. package/dist/tui/engine.js.map +1 -0
  78. package/dist/tui/index.d.ts +3 -0
  79. package/dist/tui/index.d.ts.map +1 -0
  80. package/dist/tui/index.js +6 -0
  81. package/dist/tui/index.js.map +1 -0
  82. package/dist/tui/keymap.d.ts +29 -0
  83. package/dist/tui/keymap.d.ts.map +1 -0
  84. package/dist/tui/keymap.js +143 -0
  85. package/dist/tui/keymap.js.map +1 -0
  86. package/dist/tui/renderer.d.ts +12 -0
  87. package/dist/tui/renderer.d.ts.map +1 -0
  88. package/dist/tui/renderer.js +379 -0
  89. package/dist/tui/renderer.js.map +1 -0
  90. package/dist/tui/types.d.ts +53 -0
  91. package/dist/tui/types.d.ts.map +1 -0
  92. package/dist/tui/types.js +24 -0
  93. package/dist/tui/types.js.map +1 -0
  94. package/dist/utils/output.d.ts +67 -0
  95. package/dist/utils/output.d.ts.map +1 -0
  96. package/dist/utils/output.js +245 -0
  97. package/dist/utils/output.js.map +1 -0
  98. package/package.json +56 -0
package/README.md ADDED
@@ -0,0 +1,155 @@
1
+ # Creem CLI
2
+
3
+ The official command-line tool for [Creem](https://creem.io) — the Merchant of Record for SaaS and digital businesses.
4
+
5
+ Manage products, customers, subscriptions, checkouts, transactions, and discounts from your terminal.
6
+
7
+ ## Installation
8
+
9
+ ### Homebrew (macOS/Linux)
10
+
11
+ ```bash
12
+ brew tap armitage-labs/creem
13
+ brew install creem
14
+ ```
15
+
16
+ ### npm (Global)
17
+
18
+ ```bash
19
+ npm install -g @creem_io/cli
20
+ ```
21
+
22
+ ### npx (No Install)
23
+
24
+ ```bash
25
+ npx @creem_io/cli <command>
26
+ ```
27
+
28
+ ## Quick Start
29
+
30
+ ```bash
31
+ # Authenticate with your API key
32
+ creem login
33
+
34
+ # Check your auth status
35
+ creem whoami
36
+
37
+ # Switch to live mode
38
+ creem config set environment live
39
+ ```
40
+
41
+ Get your API key from the [Creem Dashboard](https://creem.io/dashboard/developers).
42
+
43
+ - Test keys start with `creem_test_`
44
+ - Live keys start with `creem_`
45
+
46
+ ## Commands
47
+
48
+ ### Authentication
49
+
50
+ ```bash
51
+ # Login with API key (interactive)
52
+ creem login
53
+
54
+ # Login with API key (non-interactive)
55
+ creem login --api-key creem_xxxxx
56
+
57
+ # Check current authentication
58
+ creem whoami
59
+
60
+ # Logout
61
+ creem logout
62
+ ```
63
+
64
+ ### Configuration
65
+
66
+ ```bash
67
+ # Show all config
68
+ creem config show
69
+
70
+ # Get a specific value
71
+ creem config get environment
72
+
73
+ # Set a value
74
+ creem config set environment live
75
+ creem config set output_format json
76
+
77
+ # List available config keys
78
+ creem config list
79
+ ```
80
+
81
+ ### Resources
82
+
83
+ - `creem products` — list, create, get, update products
84
+ - `creem customers` — list, get, create customers and open billing portals
85
+ - `creem subscriptions` — list, get, cancel, pause, resume, upgrade, update
86
+ - `creem checkouts` — create and get checkout sessions
87
+ - `creem transactions` — list and inspect transactions
88
+ - `creem discounts` — create and list discount codes
89
+ - `creem migrate` — migrate from LemonSqueezy to Creem
90
+
91
+ Run `creem <command> --help` for details on any command.
92
+
93
+ ### Global Options
94
+
95
+ - `--json` — Output in JSON format (works with most commands)
96
+ - `--help` — Show help for any command
97
+ - `--version` — Show CLI version
98
+
99
+ ## Configuration
100
+
101
+ Config is stored at `~/.creem/config.json`:
102
+
103
+ ```json
104
+ {
105
+ "api_key": "creem_xxxxx",
106
+ "environment": "test",
107
+ "output_format": "table"
108
+ }
109
+ ```
110
+
111
+ ### Environment
112
+
113
+ - `test` — Uses `https://test-api.creem.io` (default)
114
+ - `live` — Uses `https://api.creem.io`
115
+
116
+ ## Development
117
+
118
+ This package lives inside the [armitage-labs/creem](https://github.com/armitage-labs/creem) monorepo and uses `pnpm` + `turbo`.
119
+
120
+ ```bash
121
+ # From the repo root
122
+ pnpm install
123
+ pnpm --filter @creem_io/cli build
124
+
125
+ # Or from this directory
126
+ cd packages/cli
127
+ pnpm build # build once
128
+ pnpm dev # watch mode
129
+ ```
130
+
131
+ Run the locally built binary:
132
+
133
+ ```bash
134
+ node packages/cli/dist/index.js <command>
135
+ ```
136
+
137
+ ### Optional: direnv
138
+
139
+ A `.envrc` is included that adds `packages/cli/bin` to your `PATH`, so after building you can just run `creem`:
140
+
141
+ ```bash
142
+ brew install direnv # if not already installed
143
+ cd packages/cli
144
+ direnv allow
145
+ creem whoami
146
+ ```
147
+
148
+ ## Contributing
149
+
150
+ Contributions are welcome! Please open an issue or pull request at
151
+ [github.com/armitage-labs/creem](https://github.com/armitage-labs/creem).
152
+
153
+ ## License
154
+
155
+ MIT
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createCheckoutsCommand(): Command;
3
+ //# sourceMappingURL=checkouts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkouts.d.ts","sourceRoot":"","sources":["../../src/commands/checkouts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsCpC,wBAAgB,sBAAsB,IAAI,OAAO,CAmJhD"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.createCheckoutsCommand = createCheckoutsCommand;
40
+ const commander_1 = require("commander");
41
+ const ora_1 = __importDefault(require("ora"));
42
+ const chalk_1 = __importDefault(require("chalk"));
43
+ const api_1 = require("../lib/api");
44
+ const config_1 = require("../lib/config");
45
+ const output = __importStar(require("../utils/output"));
46
+ /**
47
+ * Formats checkout status with color
48
+ */
49
+ function formatStatus(status) {
50
+ switch (status?.toLowerCase()) {
51
+ case "completed":
52
+ return chalk_1.default.green(status);
53
+ case "expired":
54
+ return chalk_1.default.red(status);
55
+ case "pending":
56
+ case "open":
57
+ return chalk_1.default.yellow(status);
58
+ default:
59
+ return status || "-";
60
+ }
61
+ }
62
+ function createCheckoutsCommand() {
63
+ const command = new commander_1.Command("checkouts").description("Manage checkout sessions");
64
+ // Create checkout
65
+ command
66
+ .command("create")
67
+ .description("Create a new checkout session")
68
+ .requiredOption("--product <id>", "Product ID")
69
+ .option("--customer <id>", "Customer ID (optional)")
70
+ .option("--success-url <url>", "Success redirect URL")
71
+ .option("--discount <code>", "Discount code")
72
+ .option("--request-id <id>", "Idempotency request ID")
73
+ .option("--json", "Output as JSON")
74
+ .action(async (options) => {
75
+ const spinner = (0, ora_1.default)("Creating checkout session...").start();
76
+ try {
77
+ const client = (0, api_1.getClient)();
78
+ // Build request params
79
+ const params = {
80
+ productId: options.product,
81
+ };
82
+ if (options.customer) {
83
+ params.customer = { id: options.customer };
84
+ }
85
+ if (options.successUrl) {
86
+ params.successUrl = options.successUrl;
87
+ }
88
+ if (options.discount) {
89
+ params.discountCode = options.discount;
90
+ }
91
+ if (options.requestId) {
92
+ params.requestId = options.requestId;
93
+ }
94
+ const checkout = (await client.checkouts.create(params));
95
+ spinner.stop();
96
+ if ((0, config_1.shouldOutputJson)(options.json)) {
97
+ output.outputJson(checkout);
98
+ return;
99
+ }
100
+ output.newline();
101
+ output.success("Checkout session created!");
102
+ output.newline();
103
+ output.outputKeyValue({
104
+ ID: checkout.id,
105
+ Status: formatStatus(checkout.status),
106
+ "Product ID": checkout.product || "-",
107
+ "Customer ID": checkout.customer || "-",
108
+ Mode: checkout.mode,
109
+ Created: checkout.createdAt ? output.formatDate(checkout.createdAt) : "N/A",
110
+ });
111
+ output.newline();
112
+ output.info("Checkout URL:");
113
+ console.log(chalk_1.default.cyan.bold(checkout.checkoutUrl));
114
+ output.newline();
115
+ output.dim("Share this URL with your customer to complete payment.");
116
+ output.newline();
117
+ }
118
+ catch (error) {
119
+ spinner.stop();
120
+ output.error(error instanceof Error ? error.message : "Failed to create checkout");
121
+ process.exit(1);
122
+ }
123
+ });
124
+ // Get checkout by ID
125
+ command
126
+ .command("get <checkout-id>")
127
+ .description("Get checkout session details")
128
+ .option("--json", "Output as JSON")
129
+ .action(async (checkoutId, options) => {
130
+ const spinner = (0, ora_1.default)("Fetching checkout...").start();
131
+ try {
132
+ const client = (0, api_1.getClient)();
133
+ const checkout = (await client.checkouts.retrieve(checkoutId));
134
+ spinner.stop();
135
+ if ((0, config_1.shouldOutputJson)(options.json)) {
136
+ output.outputJson(checkout);
137
+ return;
138
+ }
139
+ output.newline();
140
+ output.header("Checkout Session");
141
+ output.newline();
142
+ output.outputKeyValue({
143
+ ID: checkout.id,
144
+ Status: formatStatus(checkout.status),
145
+ "Product ID": checkout.product || "-",
146
+ "Customer ID": checkout.customer || "-",
147
+ Mode: checkout.mode,
148
+ Created: checkout.createdAt ? output.formatDate(checkout.createdAt) : "N/A",
149
+ });
150
+ if (checkout.checkoutUrl) {
151
+ output.newline();
152
+ output.dim("Checkout URL:");
153
+ console.log(chalk_1.default.cyan(checkout.checkoutUrl));
154
+ }
155
+ if (checkout.successUrl) {
156
+ output.newline();
157
+ output.dim("Success URL:");
158
+ console.log(checkout.successUrl);
159
+ }
160
+ if (checkout.expiresAt) {
161
+ output.newline();
162
+ output.dim("Expires:");
163
+ console.log(checkout.expiresAt ? output.formatDate(checkout.expiresAt) : "N/A");
164
+ }
165
+ output.newline();
166
+ }
167
+ catch (error) {
168
+ spinner.stop();
169
+ output.error(error instanceof Error ? error.message : "Failed to fetch checkout");
170
+ process.exit(1);
171
+ }
172
+ });
173
+ return command;
174
+ }
175
+ //# sourceMappingURL=checkouts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkouts.js","sourceRoot":"","sources":["../../src/commands/checkouts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createConfigCommand(): Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,wBAAgB,mBAAmB,IAAI,OAAO,CAkJ7C"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createConfigCommand = createConfigCommand;
37
+ const commander_1 = require("commander");
38
+ const config_1 = require("../lib/config");
39
+ const api_1 = require("../lib/api");
40
+ const auth_1 = require("../lib/auth");
41
+ const output = __importStar(require("../utils/output"));
42
+ const VALID_KEYS = ["environment", "output_format"];
43
+ const VALID_VALUES = {
44
+ environment: ["test", "live"],
45
+ output_format: ["table", "json"],
46
+ };
47
+ /**
48
+ * Displays current configuration (shared by 'show' subcommand and default action)
49
+ */
50
+ function displayConfig() {
51
+ const config = (0, config_1.loadConfig)();
52
+ output.header("Creem CLI Configuration");
53
+ output.newline();
54
+ output.outputKeyValue({
55
+ "Config file": (0, config_1.getConfigPath)(),
56
+ Environment: config.environment,
57
+ "Output format": config.output_format,
58
+ "API Key": config.api_key ? "[configured]" : "[not set]",
59
+ });
60
+ output.newline();
61
+ }
62
+ function createConfigCommand() {
63
+ const command = new commander_1.Command("config").description("View and manage CLI configuration");
64
+ // Show all config
65
+ command
66
+ .command("show")
67
+ .description("Display current configuration")
68
+ .option("--json", "Output as JSON")
69
+ .action((options) => {
70
+ if (options.json) {
71
+ const config = (0, config_1.loadConfig)();
72
+ // Don't expose full API key in JSON output
73
+ const safeConfig = {
74
+ ...config,
75
+ api_key: config.api_key ? "[REDACTED]" : undefined,
76
+ };
77
+ output.outputJson(safeConfig);
78
+ return;
79
+ }
80
+ displayConfig();
81
+ });
82
+ // Get a specific config value
83
+ command
84
+ .command("get <key>")
85
+ .description("Get a configuration value")
86
+ .option("--json", "Output as JSON")
87
+ .action((key, options) => {
88
+ const config = (0, config_1.loadConfig)();
89
+ if (key === "api_key") {
90
+ output.warning("API key cannot be displayed. Use `creem whoami` instead.");
91
+ return;
92
+ }
93
+ if (!VALID_KEYS.includes(key)) {
94
+ output.error(`Unknown config key: ${key}`);
95
+ output.info(`Valid keys: ${VALID_KEYS.join(", ")}`);
96
+ process.exit(1);
97
+ }
98
+ const value = config[key];
99
+ if (options.json) {
100
+ output.outputJson({ [key]: value });
101
+ }
102
+ else {
103
+ console.log(value);
104
+ }
105
+ });
106
+ // Set a config value
107
+ command
108
+ .command("set <key> <value>")
109
+ .description("Set a configuration value")
110
+ .action((key, value) => {
111
+ if (key === "api_key") {
112
+ output.warning("Use `creem login` to set your API key.");
113
+ return;
114
+ }
115
+ if (!VALID_KEYS.includes(key)) {
116
+ output.error(`Unknown config key: ${key}`);
117
+ output.info(`Valid keys: ${VALID_KEYS.join(", ")}`);
118
+ process.exit(1);
119
+ }
120
+ const validValues = VALID_VALUES[key];
121
+ if (validValues && !validValues.includes(value)) {
122
+ output.error(`Invalid value for ${key}: ${value}`);
123
+ output.info(`Valid values: ${validValues.join(", ")}`);
124
+ process.exit(1);
125
+ }
126
+ // Validate environment-key consistency when setting environment
127
+ if (key === "environment") {
128
+ const config = (0, config_1.loadConfig)();
129
+ if (config.api_key) {
130
+ try {
131
+ const keyEnv = (0, auth_1.detectEnvironment)(config.api_key);
132
+ if (keyEnv !== value) {
133
+ output.error(`Environment mismatch: your API key is for "${keyEnv}" but you're setting environment to "${value}".`);
134
+ output.info("Run `creem login` with the correct API key for your desired environment.");
135
+ process.exit(1);
136
+ }
137
+ }
138
+ catch {
139
+ // Invalid key format - let them set environment, login will catch it
140
+ }
141
+ }
142
+ }
143
+ (0, config_1.setConfigValue)(key, value);
144
+ // Reset client when environment changes so subsequent API calls use new endpoint
145
+ if (key === "environment") {
146
+ (0, api_1.resetClient)();
147
+ }
148
+ output.success(`Set ${key} = ${value}`);
149
+ });
150
+ // List available config keys
151
+ command
152
+ .command("list")
153
+ .description("List available configuration keys")
154
+ .option("--json", "Output as JSON")
155
+ .action((options) => {
156
+ const keys = [
157
+ {
158
+ key: "environment",
159
+ validValues: ["test", "live"],
160
+ description: "API environment (test or live mode)",
161
+ },
162
+ {
163
+ key: "output_format",
164
+ validValues: ["table", "json"],
165
+ description: "Default output format",
166
+ },
167
+ ];
168
+ if (options.json) {
169
+ output.outputJson(keys);
170
+ return;
171
+ }
172
+ output.header("Available Configuration Keys");
173
+ output.newline();
174
+ output.outputTable(["Key", "Valid Values", "Description"], keys.map((k) => [k.key, k.validValues.join(", "), k.description]));
175
+ output.newline();
176
+ });
177
+ // Default action (show config) - delegates to shared displayConfig()
178
+ command.action(() => {
179
+ displayConfig();
180
+ output.info('Tip: Use "creem config show --json" for JSON output');
181
+ });
182
+ return command;
183
+ }
184
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function createCustomersCommand(): Command;
3
+ //# sourceMappingURL=customers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customers.d.ts","sourceRoot":"","sources":["../../src/commands/customers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwIpC,wBAAgB,sBAAsB,IAAI,OAAO,CAuIhD"}