@canaryai/cli 0.1.6 → 0.1.11

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 (37) hide show
  1. package/README.md +52 -1
  2. package/dist/bin.js +1 -6
  3. package/dist/bin.js.map +1 -1
  4. package/dist/{chunk-7OCVIDC7.js → chunk-DGUM43GV.js} +1 -2
  5. package/dist/{chunk-55MFLJD7.js → chunk-G2X3H7AM.js} +1 -3
  6. package/dist/{chunk-55MFLJD7.js.map → chunk-G2X3H7AM.js.map} +1 -1
  7. package/dist/chunk-HJ2JWIJ7.js +91 -0
  8. package/dist/chunk-HJ2JWIJ7.js.map +1 -0
  9. package/dist/{chunk-7AP5KRVU.js → chunk-ROTCL5WO.js} +1 -3
  10. package/dist/{chunk-7AP5KRVU.js.map → chunk-ROTCL5WO.js.map} +1 -1
  11. package/dist/{chunk-Z6I3ZXZL.js → chunk-VYBCH4ZP.js} +2 -3
  12. package/dist/{chunk-Z6I3ZXZL.js.map → chunk-VYBCH4ZP.js.map} +1 -1
  13. package/dist/feature-flag-PN5IFFQR.js +226 -0
  14. package/dist/feature-flag-PN5IFFQR.js.map +1 -0
  15. package/dist/index.js +1207 -8
  16. package/dist/index.js.map +1 -1
  17. package/dist/knobs-DAG7HD2F.js +286 -0
  18. package/dist/knobs-DAG7HD2F.js.map +1 -0
  19. package/dist/{local-browser-5LJ7UPOH.js → local-browser-VOBIUIGT.js} +4 -5
  20. package/dist/{local-browser-5LJ7UPOH.js.map → local-browser-VOBIUIGT.js.map} +1 -1
  21. package/dist/{mcp-P2B24MTM.js → mcp-I6FCGDDR.js} +5 -6
  22. package/dist/{mcp-P2B24MTM.js.map → mcp-I6FCGDDR.js.map} +1 -1
  23. package/dist/psql-A3BADRQN.js +124 -0
  24. package/dist/psql-A3BADRQN.js.map +1 -0
  25. package/dist/redis-N2DSDDQU.js +130 -0
  26. package/dist/redis-N2DSDDQU.js.map +1 -0
  27. package/dist/runner/preload.js +2 -3
  28. package/dist/runner/preload.js.map +1 -1
  29. package/dist/test.js +2 -3
  30. package/dist/test.js.map +1 -1
  31. package/package.json +3 -4
  32. package/dist/bin.d.ts +0 -2
  33. package/dist/chunk-UBYYNMML.js +0 -21
  34. package/dist/chunk-UBYYNMML.js.map +0 -1
  35. package/dist/chunk-YA43CE6P.js +0 -781
  36. package/dist/chunk-YA43CE6P.js.map +0 -1
  37. /package/dist/{chunk-7OCVIDC7.js.map → chunk-DGUM43GV.js.map} +0 -0
@@ -0,0 +1,226 @@
1
+ import {
2
+ readStoredApiUrl,
3
+ readStoredToken
4
+ } from "./chunk-HJ2JWIJ7.js";
5
+ import "./chunk-DGUM43GV.js";
6
+
7
+ // src/feature-flag.ts
8
+ import process from "process";
9
+ var ENV_URLS = {
10
+ prod: "https://api.trycanary.ai",
11
+ production: "https://api.trycanary.ai",
12
+ dev: "https://api.dev.trycanary.ai",
13
+ local: "http://localhost:3000"
14
+ };
15
+ function getArgValue(argv, key) {
16
+ const index = argv.indexOf(key);
17
+ if (index === -1 || index >= argv.length - 1) return void 0;
18
+ return argv[index + 1];
19
+ }
20
+ function hasFlag(argv, ...flags) {
21
+ return flags.some((flag) => argv.includes(flag));
22
+ }
23
+ async function resolveConfig(argv) {
24
+ const storedApiUrl = await readStoredApiUrl();
25
+ const env = getArgValue(argv, "--env");
26
+ if (env && !ENV_URLS[env]) {
27
+ console.error(`Unknown environment: ${env}`);
28
+ console.error("Valid environments: prod, dev, local");
29
+ process.exit(1);
30
+ }
31
+ const apiUrl = getArgValue(argv, "--api-url") ?? (env ? ENV_URLS[env] : void 0) ?? process.env.CANARY_API_URL ?? storedApiUrl ?? "https://api.trycanary.ai";
32
+ const token = getArgValue(argv, "--token") ?? process.env.CANARY_API_TOKEN ?? await readStoredToken();
33
+ if (!token) {
34
+ console.error("Error: No API token found.");
35
+ console.error("Run: canary login");
36
+ process.exit(1);
37
+ }
38
+ return { apiUrl, token };
39
+ }
40
+ async function apiRequest(apiUrl, token, method, path, body) {
41
+ const res = await fetch(`${apiUrl}${path}`, {
42
+ method,
43
+ headers: {
44
+ Authorization: `Bearer ${token}`,
45
+ "Content-Type": "application/json"
46
+ },
47
+ ...body ? { body: JSON.stringify(body) } : {}
48
+ });
49
+ if (res.status === 401) {
50
+ console.error("Error: Unauthorized. Your session may have expired.");
51
+ console.error("Run: canary login");
52
+ process.exit(1);
53
+ }
54
+ const json = await res.json();
55
+ return json;
56
+ }
57
+ async function handleList(argv, apiUrl, token) {
58
+ const jsonOutput = hasFlag(argv, "--json");
59
+ const res = await fetch(`${apiUrl}/superadmin/feature-flags`, {
60
+ headers: { Authorization: `Bearer ${token}` }
61
+ });
62
+ if (res.status === 401) {
63
+ console.error("Error: Unauthorized. Your session may have expired.");
64
+ console.error("Run: canary login");
65
+ process.exit(1);
66
+ }
67
+ const json = await res.json();
68
+ if (!json.ok) {
69
+ console.error(`Error: ${json.error}`);
70
+ process.exit(1);
71
+ }
72
+ const flags = json.flags ?? [];
73
+ if (jsonOutput) {
74
+ console.log(JSON.stringify(flags, null, 2));
75
+ return;
76
+ }
77
+ if (flags.length === 0) {
78
+ console.log("No feature flags found.");
79
+ return;
80
+ }
81
+ for (const flag of flags) {
82
+ const gates = flag.gates ?? [];
83
+ const gateStr = gates.length > 0 ? gates.map((g) => `${g.gateType}:${g.gateValue}`).join(", ") : "(no gates)";
84
+ console.log(` ${flag.name} ${flag.description ?? ""} [${gateStr}]`);
85
+ }
86
+ }
87
+ async function handleCreate(argv, apiUrl, token) {
88
+ const name = argv[0];
89
+ if (!name || name.startsWith("--")) {
90
+ console.error("Error: Missing flag name.");
91
+ console.error("Usage: canary feature-flag create <name> [--description <text>]");
92
+ process.exit(1);
93
+ }
94
+ const description = getArgValue(argv, "--description") ?? null;
95
+ const result = await apiRequest(apiUrl, token, "POST", "/superadmin/feature-flags", {
96
+ name,
97
+ description
98
+ });
99
+ if (!result.ok) {
100
+ console.error(`Error: ${result.error}`);
101
+ process.exit(1);
102
+ }
103
+ console.log(`Created feature flag: ${name}`);
104
+ }
105
+ async function handleDelete(argv, apiUrl, token) {
106
+ const name = argv[0];
107
+ if (!name || name.startsWith("--")) {
108
+ console.error("Error: Missing flag name.");
109
+ console.error("Usage: canary feature-flag delete <name>");
110
+ process.exit(1);
111
+ }
112
+ const result = await apiRequest(
113
+ apiUrl,
114
+ token,
115
+ "DELETE",
116
+ `/superadmin/feature-flags/${encodeURIComponent(name)}`
117
+ );
118
+ if (!result.ok) {
119
+ console.error(`Error: ${result.error}`);
120
+ process.exit(1);
121
+ }
122
+ console.log(`Deleted feature flag: ${name}`);
123
+ }
124
+ async function handleEnable(argv, apiUrl, token) {
125
+ const name = argv[0];
126
+ const orgId = getArgValue(argv, "--org");
127
+ if (!name || name.startsWith("--")) {
128
+ console.error("Error: Missing flag name.");
129
+ console.error("Usage: canary feature-flag enable <name> --org <orgId>");
130
+ process.exit(1);
131
+ }
132
+ if (!orgId) {
133
+ console.error("Error: Missing --org <orgId>.");
134
+ console.error("Usage: canary feature-flag enable <name> --org <orgId>");
135
+ process.exit(1);
136
+ }
137
+ const result = await apiRequest(
138
+ apiUrl,
139
+ token,
140
+ "POST",
141
+ `/superadmin/feature-flags/${encodeURIComponent(name)}/organizations/${encodeURIComponent(orgId)}`
142
+ );
143
+ if (!result.ok) {
144
+ console.error(`Error: ${result.error}`);
145
+ process.exit(1);
146
+ }
147
+ console.log(`Enabled ${name} for org ${orgId}`);
148
+ }
149
+ async function handleDisable(argv, apiUrl, token) {
150
+ const name = argv[0];
151
+ const orgId = getArgValue(argv, "--org");
152
+ if (!name || name.startsWith("--")) {
153
+ console.error("Error: Missing flag name.");
154
+ console.error("Usage: canary feature-flag disable <name> --org <orgId>");
155
+ process.exit(1);
156
+ }
157
+ if (!orgId) {
158
+ console.error("Error: Missing --org <orgId>.");
159
+ console.error("Usage: canary feature-flag disable <name> --org <orgId>");
160
+ process.exit(1);
161
+ }
162
+ const result = await apiRequest(
163
+ apiUrl,
164
+ token,
165
+ "DELETE",
166
+ `/superadmin/feature-flags/${encodeURIComponent(name)}/organizations/${encodeURIComponent(orgId)}`
167
+ );
168
+ if (!result.ok) {
169
+ console.error(`Error: ${result.error}`);
170
+ process.exit(1);
171
+ }
172
+ console.log(`Disabled ${name} for org ${orgId}`);
173
+ }
174
+ function printFeatureFlagHelp() {
175
+ console.log(
176
+ [
177
+ "Usage: canary feature-flag <sub-command> [options]",
178
+ "",
179
+ "Sub-commands:",
180
+ " list List all feature flags",
181
+ " create <name> [--description <text>] Create a new flag",
182
+ " delete <name> Delete a flag and all its gates",
183
+ " enable <name> --org <orgId> Enable a flag for an organization",
184
+ " disable <name> --org <orgId> Disable a flag for an organization",
185
+ "",
186
+ "Options:",
187
+ " --env <env> Target environment (prod, dev, local)",
188
+ " --json Output as JSON (list only)",
189
+ " --api-url <url> API URL override (takes precedence over --env)",
190
+ " --token <key> API token override"
191
+ ].join("\n")
192
+ );
193
+ }
194
+ async function runFeatureFlag(argv) {
195
+ const [subCommand, ...rest] = argv;
196
+ if (!subCommand || subCommand === "help" || hasFlag(argv, "--help", "-h")) {
197
+ printFeatureFlagHelp();
198
+ return;
199
+ }
200
+ const { apiUrl, token } = await resolveConfig(argv);
201
+ switch (subCommand) {
202
+ case "list":
203
+ await handleList(rest, apiUrl, token);
204
+ break;
205
+ case "create":
206
+ await handleCreate(rest, apiUrl, token);
207
+ break;
208
+ case "delete":
209
+ await handleDelete(rest, apiUrl, token);
210
+ break;
211
+ case "enable":
212
+ await handleEnable(rest, apiUrl, token);
213
+ break;
214
+ case "disable":
215
+ await handleDisable(rest, apiUrl, token);
216
+ break;
217
+ default:
218
+ console.error(`Unknown sub-command: ${subCommand}`);
219
+ printFeatureFlagHelp();
220
+ process.exit(1);
221
+ }
222
+ }
223
+ export {
224
+ runFeatureFlag
225
+ };
226
+ //# sourceMappingURL=feature-flag-PN5IFFQR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/feature-flag.ts"],"sourcesContent":["/**\n * CLI Feature Flag Management\n *\n * Allows superadmins to manage feature flags via the CLI.\n */\n\nimport process from \"node:process\";\nimport { readStoredToken, readStoredApiUrl } from \"./auth.js\";\n\nconst ENV_URLS: Record<string, string> = {\n prod: \"https://api.trycanary.ai\",\n production: \"https://api.trycanary.ai\",\n dev: \"https://api.dev.trycanary.ai\",\n local: \"http://localhost:3000\",\n};\n\ntype FeatureFlag = {\n id: string;\n name: string;\n description: string | null;\n createdAt: string;\n};\n\ntype FeatureFlagListResponse = {\n ok: boolean;\n flags?: Array<FeatureFlag & { gates?: Array<{ gateType: string; gateValue: string }> }>;\n error?: string;\n};\n\ntype ApiResponse = {\n ok: boolean;\n error?: string;\n flag?: FeatureFlag;\n};\n\nfunction getArgValue(argv: string[], key: string): string | undefined {\n const index = argv.indexOf(key);\n if (index === -1 || index >= argv.length - 1) return undefined;\n return argv[index + 1];\n}\n\nfunction hasFlag(argv: string[], ...flags: string[]): boolean {\n return flags.some((flag) => argv.includes(flag));\n}\n\nasync function resolveConfig(argv: string[]) {\n const storedApiUrl = await readStoredApiUrl();\n const env = getArgValue(argv, \"--env\");\n\n if (env && !ENV_URLS[env]) {\n console.error(`Unknown environment: ${env}`);\n console.error(\"Valid environments: prod, dev, local\");\n process.exit(1);\n }\n\n const apiUrl =\n getArgValue(argv, \"--api-url\") ??\n (env ? ENV_URLS[env] : undefined) ??\n process.env.CANARY_API_URL ??\n storedApiUrl ??\n \"https://api.trycanary.ai\";\n\n const token =\n getArgValue(argv, \"--token\") ?? process.env.CANARY_API_TOKEN ?? (await readStoredToken());\n\n if (!token) {\n console.error(\"Error: No API token found.\");\n console.error(\"Run: canary login\");\n process.exit(1);\n }\n\n return { apiUrl, token };\n}\n\nasync function apiRequest(\n apiUrl: string,\n token: string,\n method: string,\n path: string,\n body?: Record<string, unknown>\n): Promise<ApiResponse> {\n const res = await fetch(`${apiUrl}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n ...(body ? { body: JSON.stringify(body) } : {}),\n });\n\n if (res.status === 401) {\n console.error(\"Error: Unauthorized. Your session may have expired.\");\n console.error(\"Run: canary login\");\n process.exit(1);\n }\n\n const json = (await res.json()) as ApiResponse;\n return json;\n}\n\nasync function handleList(argv: string[], apiUrl: string, token: string): Promise<void> {\n const jsonOutput = hasFlag(argv, \"--json\");\n const res = await fetch(`${apiUrl}/superadmin/feature-flags`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (res.status === 401) {\n console.error(\"Error: Unauthorized. Your session may have expired.\");\n console.error(\"Run: canary login\");\n process.exit(1);\n }\n\n const json = (await res.json()) as FeatureFlagListResponse;\n\n if (!json.ok) {\n console.error(`Error: ${json.error}`);\n process.exit(1);\n }\n\n const flags = json.flags ?? [];\n\n if (jsonOutput) {\n console.log(JSON.stringify(flags, null, 2));\n return;\n }\n\n if (flags.length === 0) {\n console.log(\"No feature flags found.\");\n return;\n }\n\n for (const flag of flags) {\n const gates = flag.gates ?? [];\n const gateStr =\n gates.length > 0\n ? gates.map((g) => `${g.gateType}:${g.gateValue}`).join(\", \")\n : \"(no gates)\";\n console.log(` ${flag.name} ${flag.description ?? \"\"} [${gateStr}]`);\n }\n}\n\nasync function handleCreate(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag create <name> [--description <text>]\");\n process.exit(1);\n }\n\n const description = getArgValue(argv, \"--description\") ?? null;\n const result = await apiRequest(apiUrl, token, \"POST\", \"/superadmin/feature-flags\", {\n name,\n description,\n });\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Created feature flag: ${name}`);\n}\n\nasync function handleDelete(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag delete <name>\");\n process.exit(1);\n }\n\n const result = await apiRequest(\n apiUrl,\n token,\n \"DELETE\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Deleted feature flag: ${name}`);\n}\n\nasync function handleEnable(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n const orgId = getArgValue(argv, \"--org\");\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag enable <name> --org <orgId>\");\n process.exit(1);\n }\n\n if (!orgId) {\n console.error(\"Error: Missing --org <orgId>.\");\n console.error(\"Usage: canary feature-flag enable <name> --org <orgId>\");\n process.exit(1);\n }\n\n const result = await apiRequest(\n apiUrl,\n token,\n \"POST\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/organizations/${encodeURIComponent(orgId)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Enabled ${name} for org ${orgId}`);\n}\n\nasync function handleDisable(argv: string[], apiUrl: string, token: string): Promise<void> {\n const name = argv[0];\n const orgId = getArgValue(argv, \"--org\");\n\n if (!name || name.startsWith(\"--\")) {\n console.error(\"Error: Missing flag name.\");\n console.error(\"Usage: canary feature-flag disable <name> --org <orgId>\");\n process.exit(1);\n }\n\n if (!orgId) {\n console.error(\"Error: Missing --org <orgId>.\");\n console.error(\"Usage: canary feature-flag disable <name> --org <orgId>\");\n process.exit(1);\n }\n\n const result = await apiRequest(\n apiUrl,\n token,\n \"DELETE\",\n `/superadmin/feature-flags/${encodeURIComponent(name)}/organizations/${encodeURIComponent(orgId)}`\n );\n\n if (!result.ok) {\n console.error(`Error: ${result.error}`);\n process.exit(1);\n }\n\n console.log(`Disabled ${name} for org ${orgId}`);\n}\n\nfunction printFeatureFlagHelp(): void {\n console.log(\n [\n \"Usage: canary feature-flag <sub-command> [options]\",\n \"\",\n \"Sub-commands:\",\n \" list List all feature flags\",\n \" create <name> [--description <text>] Create a new flag\",\n \" delete <name> Delete a flag and all its gates\",\n \" enable <name> --org <orgId> Enable a flag for an organization\",\n \" disable <name> --org <orgId> Disable a flag for an organization\",\n \"\",\n \"Options:\",\n \" --env <env> Target environment (prod, dev, local)\",\n \" --json Output as JSON (list only)\",\n \" --api-url <url> API URL override (takes precedence over --env)\",\n \" --token <key> API token override\",\n ].join(\"\\n\")\n );\n}\n\nexport async function runFeatureFlag(argv: string[]): Promise<void> {\n const [subCommand, ...rest] = argv;\n\n if (!subCommand || subCommand === \"help\" || hasFlag(argv, \"--help\", \"-h\")) {\n printFeatureFlagHelp();\n return;\n }\n\n const { apiUrl, token } = await resolveConfig(argv);\n\n switch (subCommand) {\n case \"list\":\n await handleList(rest, apiUrl, token);\n break;\n case \"create\":\n await handleCreate(rest, apiUrl, token);\n break;\n case \"delete\":\n await handleDelete(rest, apiUrl, token);\n break;\n case \"enable\":\n await handleEnable(rest, apiUrl, token);\n break;\n case \"disable\":\n await handleDisable(rest, apiUrl, token);\n break;\n default:\n console.error(`Unknown sub-command: ${subCommand}`);\n printFeatureFlagHelp();\n process.exit(1);\n }\n}\n"],"mappings":"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","names":[]}