@canaryai/cli 0.2.5 → 0.2.7

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 (50) hide show
  1. package/dist/{chunk-ILEPYWZX.js → chunk-A44B2PEA.js} +2 -2
  2. package/dist/chunk-P5Z2Y5VV.js +94 -0
  3. package/dist/chunk-P5Z2Y5VV.js.map +1 -0
  4. package/dist/chunk-RL5Y6V3C.js +46918 -0
  5. package/dist/chunk-RL5Y6V3C.js.map +1 -0
  6. package/dist/{chunk-FIQBGAKW.js → chunk-TEHABH2E.js} +4 -4
  7. package/dist/{chunk-FIQBGAKW.js.map → chunk-TEHABH2E.js.map} +1 -1
  8. package/dist/chunk-VKVL7WBN.js +50 -0
  9. package/dist/chunk-XAA5VQ5N.js +37 -0
  10. package/dist/chunk-XAA5VQ5N.js.map +1 -0
  11. package/dist/{debug-workflow-PT3OUR3V.js → debug-workflow-ZFRF3JMY.js} +6 -3
  12. package/dist/{debug-workflow-PT3OUR3V.js.map → debug-workflow-ZFRF3JMY.js.map} +1 -1
  13. package/dist/dist-5CSYV6PJ.js +336 -0
  14. package/dist/dist-5CSYV6PJ.js.map +1 -0
  15. package/dist/{docs-RUZXLATL.js → docs-RPFT7ZJB.js} +5 -3
  16. package/dist/{docs-RUZXLATL.js.map → docs-RPFT7ZJB.js.map} +1 -1
  17. package/dist/{feature-flag-S5B5GLPP.js → feature-flag-2FDSKOVX.js} +2 -2
  18. package/dist/index.js +110 -15
  19. package/dist/index.js.map +1 -1
  20. package/dist/{issues-4ZEDHPLW.js → issues-6ZDNDSD6.js} +2 -2
  21. package/dist/{knobs-RKUVK3HC.js → knobs-MZRTYS3P.js} +2 -2
  22. package/dist/{local-browser-J6WGFLVD.js → local-browser-I2ANCFFH.js} +6 -3
  23. package/dist/{local-browser-J6WGFLVD.js.map → local-browser-I2ANCFFH.js.map} +1 -1
  24. package/dist/{mcp-HGYBMDYZ.js → mcp-EOWUKFEB.js} +14 -13
  25. package/dist/mcp-EOWUKFEB.js.map +1 -0
  26. package/dist/pdf-extract-XYDS42VL.js +13 -0
  27. package/dist/pdf-extract-XYDS42VL.js.map +1 -0
  28. package/dist/pdfjs-HMUKB5WW.js +35243 -0
  29. package/dist/pdfjs-HMUKB5WW.js.map +1 -0
  30. package/dist/{psql-WVIHMC6A.js → psql-2YPIRMDY.js} +2 -2
  31. package/dist/{record-MMFESD4M.js → record-TSF726OB.js} +7 -5
  32. package/dist/record-TSF726OB.js.map +1 -0
  33. package/dist/{redis-RGHECKV5.js → redis-A7GWM23E.js} +2 -2
  34. package/dist/{release-ZOD4Y2BF.js → release-L4IXOHDF.js} +2 -2
  35. package/dist/runner/preload.js +2 -2
  36. package/dist/src-SCKO6YUB.js +146 -0
  37. package/dist/src-SCKO6YUB.js.map +1 -0
  38. package/dist/test.js +2 -2
  39. package/package.json +2 -3
  40. package/dist/chunk-VLFUCAPZ.js +0 -12
  41. package/dist/mcp-HGYBMDYZ.js.map +0 -1
  42. package/dist/record-MMFESD4M.js.map +0 -1
  43. /package/dist/{chunk-ILEPYWZX.js.map → chunk-A44B2PEA.js.map} +0 -0
  44. /package/dist/{chunk-VLFUCAPZ.js.map → chunk-VKVL7WBN.js.map} +0 -0
  45. /package/dist/{feature-flag-S5B5GLPP.js.map → feature-flag-2FDSKOVX.js.map} +0 -0
  46. /package/dist/{issues-4ZEDHPLW.js.map → issues-6ZDNDSD6.js.map} +0 -0
  47. /package/dist/{knobs-RKUVK3HC.js.map → knobs-MZRTYS3P.js.map} +0 -0
  48. /package/dist/{psql-WVIHMC6A.js.map → psql-2YPIRMDY.js.map} +0 -0
  49. /package/dist/{redis-RGHECKV5.js.map → redis-A7GWM23E.js.map} +0 -0
  50. /package/dist/{release-ZOD4Y2BF.js.map → release-L4IXOHDF.js.map} +0 -0
package/dist/index.js CHANGED
@@ -17,9 +17,12 @@ import {
17
17
  resolveConfig,
18
18
  saveAuth
19
19
  } from "./chunk-PWWQGYFG.js";
20
+ import {
21
+ makeTempDirSync
22
+ } from "./chunk-XAA5VQ5N.js";
20
23
  import {
21
24
  __require
22
- } from "./chunk-VLFUCAPZ.js";
25
+ } from "./chunk-VKVL7WBN.js";
23
26
 
24
27
  // src/index.ts
25
28
  import { spawnSync as spawnSync2 } from "child_process";
@@ -120,7 +123,6 @@ import { spawn } from "child_process";
120
123
  import fs2 from "fs";
121
124
  import path2 from "path";
122
125
  import { fileURLToPath } from "url";
123
- import { makeTempDirSync } from "@chatsdet/tmp";
124
126
  async function run(request = {}) {
125
127
  const cwd = request.projectRoot ?? process.cwd();
126
128
  const stdio = request.stdio ?? "inherit";
@@ -634,11 +636,84 @@ function formatFailedTests(failedTests, appUrl) {
634
636
  }
635
637
  return lines.join("\n");
636
638
  }
639
+ var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
640
+ async function resolveTestConfig(apiUrl, token, propertyArg, environmentArg) {
641
+ if (!propertyArg && !environmentArg) return {};
642
+ const res = await fetch(`${apiUrl}/workflows/test-config`, {
643
+ headers: { Authorization: `Bearer ${token}` }
644
+ });
645
+ if (!res.ok) {
646
+ const text = await res.text();
647
+ throw new Error(`Failed to fetch test config: ${res.status} ${text}`);
648
+ }
649
+ const data = await res.json();
650
+ if (!data.ok || !data.properties) {
651
+ throw new Error(`Failed to fetch test config: ${data.error ?? "Unknown error"}`);
652
+ }
653
+ const { properties } = data;
654
+ let property;
655
+ if (propertyArg) {
656
+ if (UUID_RE.test(propertyArg)) {
657
+ property = properties.find((p) => p.id === propertyArg);
658
+ } else {
659
+ property = properties.find(
660
+ (p) => p.name.toLowerCase() === propertyArg.toLowerCase()
661
+ );
662
+ }
663
+ if (!property) {
664
+ const available = properties.map((p) => ` - ${p.name} (${p.id})`).join("\n");
665
+ throw new Error(
666
+ `Property "${propertyArg}" not found.
667
+ Available properties:
668
+ ${available}`
669
+ );
670
+ }
671
+ } else if (environmentArg) {
672
+ if (properties.length === 0) {
673
+ throw new Error("No properties found in your organization.");
674
+ }
675
+ if (properties.length > 1) {
676
+ const available = properties.map((p) => ` - ${p.name} (${p.id})`).join("\n");
677
+ throw new Error(
678
+ `--environment requires --property when multiple properties exist.
679
+ Available properties:
680
+ ${available}`
681
+ );
682
+ }
683
+ property = properties[0];
684
+ }
685
+ const result = {};
686
+ if (property) {
687
+ result.propertyId = property.id;
688
+ if (environmentArg) {
689
+ let env;
690
+ if (UUID_RE.test(environmentArg)) {
691
+ env = property.environments.find((e) => e.id === environmentArg);
692
+ } else {
693
+ env = property.environments.find(
694
+ (e) => e.name.toLowerCase() === environmentArg.toLowerCase()
695
+ );
696
+ }
697
+ if (!env) {
698
+ const available = property.environments.map((e) => ` - ${e.name}${e.isDefault ? " (default)" : ""} (${e.id})`).join("\n");
699
+ throw new Error(
700
+ `Environment "${environmentArg}" not found for property "${property.name}".
701
+ Available environments:
702
+ ${available}`
703
+ );
704
+ }
705
+ result.environmentId = env.id;
706
+ }
707
+ }
708
+ return result;
709
+ }
637
710
  async function runRemoteTest(argv) {
638
711
  const apiUrl = getArgValue3(argv, "--api-url") ?? process5.env.CANARY_API_URL ?? "https://api.trycanary.ai";
639
712
  const token = getArgValue3(argv, "--token") ?? process5.env.CANARY_API_TOKEN ?? await readStoredToken();
640
713
  const tag = getArgValue3(argv, "--tag");
641
714
  const namePattern = getArgValue3(argv, "--name-pattern");
715
+ const propertyArg = getArgValue3(argv, "--property");
716
+ const environmentArg = getArgValue3(argv, "--environment");
642
717
  const verbose = hasFlag2(argv, "--verbose", "-v");
643
718
  if (!token) {
644
719
  console.error("Error: No API token found.");
@@ -650,7 +725,18 @@ async function runRemoteTest(argv) {
650
725
  console.error(" canary test --remote --token cnry_...");
651
726
  process5.exit(1);
652
727
  }
728
+ let resolvedConfig = {};
729
+ if (propertyArg || environmentArg) {
730
+ try {
731
+ resolvedConfig = await resolveTestConfig(apiUrl, token, propertyArg, environmentArg);
732
+ } catch (err) {
733
+ console.error(`${err instanceof Error ? err.message : String(err)}`);
734
+ process5.exit(1);
735
+ }
736
+ }
653
737
  console.log("Starting remote workflow tests...");
738
+ if (resolvedConfig.propertyId) console.log(` Property: ${propertyArg}`);
739
+ if (resolvedConfig.environmentId) console.log(` Environment: ${environmentArg}`);
654
740
  if (tag) console.log(` Filtering by tag: ${tag}`);
655
741
  if (namePattern) console.log(` Filtering by name pattern: ${namePattern}`);
656
742
  console.log("");
@@ -658,6 +744,9 @@ async function runRemoteTest(argv) {
658
744
  if (tag) queryParams.set("tag", tag);
659
745
  if (namePattern) queryParams.set("namePattern", namePattern);
660
746
  const triggerUrl = `${apiUrl}/workflows/test-runs${queryParams.toString() ? `?${queryParams}` : ""}`;
747
+ const body = {};
748
+ if (resolvedConfig.propertyId) body.propertyId = resolvedConfig.propertyId;
749
+ if (resolvedConfig.environmentId) body.environmentId = resolvedConfig.environmentId;
661
750
  let triggerRes;
662
751
  try {
663
752
  triggerRes = await fetch(triggerUrl, {
@@ -665,7 +754,8 @@ async function runRemoteTest(argv) {
665
754
  headers: {
666
755
  Authorization: `Bearer ${token}`,
667
756
  "Content-Type": "application/json"
668
- }
757
+ },
758
+ body: JSON.stringify(body)
669
759
  });
670
760
  } catch (err) {
671
761
  console.error(`Failed to connect to API: ${err}`);
@@ -910,10 +1000,10 @@ function isSuperadminToken(token) {
910
1000
  // src/index.ts
911
1001
  var require2 = createRequire2(import.meta.url);
912
1002
  var pkg = require2("../package.json");
913
- var loadMcp = () => import("./mcp-HGYBMDYZ.js").then((m) => m.runMcp);
914
- var loadLocalBrowser = () => import("./local-browser-J6WGFLVD.js").then((m) => m.runLocalBrowser);
915
- var loadDebugWorkflow = () => import("./debug-workflow-PT3OUR3V.js").then((m) => m.runDebugWorkflow);
916
- var loadRecord = () => import("./record-MMFESD4M.js").then((m) => m.runRecord);
1003
+ var loadMcp = () => import("./mcp-EOWUKFEB.js").then((m) => m.runMcp);
1004
+ var loadLocalBrowser = () => import("./local-browser-I2ANCFFH.js").then((m) => m.runLocalBrowser);
1005
+ var loadDebugWorkflow = () => import("./debug-workflow-ZFRF3JMY.js").then((m) => m.runDebugWorkflow);
1006
+ var loadRecord = () => import("./record-TSF726OB.js").then((m) => m.runRecord);
917
1007
  var canary = { run };
918
1008
  var baseDir = typeof __dirname !== "undefined" ? __dirname : path4.dirname(fileURLToPath2(import.meta.url));
919
1009
  var preloadPath = path4.join(baseDir, "runner", "preload.js");
@@ -980,6 +1070,8 @@ function printHelp({ isSuperadmin }) {
980
1070
  "Remote test options:",
981
1071
  " --token <key> API key (or set CANARY_API_TOKEN)",
982
1072
  " --api-url <url> API URL (default: https://api.trycanary.ai)",
1073
+ " --property <name|id> Target a specific property",
1074
+ " --environment <name|id> Target a specific environment",
983
1075
  " --tag <tag> Filter workflows by tag",
984
1076
  " --name-pattern <pat> Filter workflows by name pattern",
985
1077
  " --verbose, -v Show all events",
@@ -1094,6 +1186,8 @@ function printTestHelp() {
1094
1186
  " --remote Run tests remotely (required)",
1095
1187
  " --token <key> API key (or set CANARY_API_TOKEN)",
1096
1188
  " --api-url <url> API URL (default: https://api.trycanary.ai)",
1189
+ " --property <name|id> Target a specific property",
1190
+ " --environment <name|id> Target a specific environment",
1097
1191
  " --tag <tag> Filter workflows by tag",
1098
1192
  " --name-pattern <pat> Filter workflows by name pattern",
1099
1193
  " --verbose, -v Show all events",
@@ -1102,7 +1196,8 @@ function printTestHelp() {
1102
1196
  " canary test Run all local tests",
1103
1197
  ' canary test --grep "login" Run tests matching "login"',
1104
1198
  " canary test --headed --workers 1 Debug with visible browser",
1105
- " canary test --remote --tag smoke Run remote smoke tests"
1199
+ " canary test --remote --tag smoke Run remote smoke tests",
1200
+ ' canary test --remote --property "My App" --environment staging'
1106
1201
  ].join("\n")
1107
1202
  );
1108
1203
  }
@@ -1190,37 +1285,37 @@ async function main(argv) {
1190
1285
  return;
1191
1286
  }
1192
1287
  if (command === "psql") {
1193
- const { runPsql } = await import("./psql-WVIHMC6A.js");
1288
+ const { runPsql } = await import("./psql-2YPIRMDY.js");
1194
1289
  await runPsql(rest);
1195
1290
  return;
1196
1291
  }
1197
1292
  if (command === "redis") {
1198
- const { runRedis } = await import("./redis-RGHECKV5.js");
1293
+ const { runRedis } = await import("./redis-A7GWM23E.js");
1199
1294
  await runRedis(rest);
1200
1295
  return;
1201
1296
  }
1202
1297
  if (command === "release") {
1203
- const { runRelease } = await import("./release-ZOD4Y2BF.js");
1298
+ const { runRelease } = await import("./release-L4IXOHDF.js");
1204
1299
  await runRelease(rest);
1205
1300
  return;
1206
1301
  }
1207
1302
  if (command === "docs") {
1208
- const { runDocs } = await import("./docs-RUZXLATL.js");
1303
+ const { runDocs } = await import("./docs-RPFT7ZJB.js");
1209
1304
  await runDocs(rest);
1210
1305
  return;
1211
1306
  }
1212
1307
  if (command === "feature-flag") {
1213
- const { runFeatureFlag } = await import("./feature-flag-S5B5GLPP.js");
1308
+ const { runFeatureFlag } = await import("./feature-flag-2FDSKOVX.js");
1214
1309
  await runFeatureFlag(rest);
1215
1310
  return;
1216
1311
  }
1217
1312
  if (command === "knobs") {
1218
- const { runKnobs } = await import("./knobs-RKUVK3HC.js");
1313
+ const { runKnobs } = await import("./knobs-MZRTYS3P.js");
1219
1314
  await runKnobs(rest);
1220
1315
  return;
1221
1316
  }
1222
1317
  if (command === "issues") {
1223
- const { runIssues } = await import("./issues-4ZEDHPLW.js");
1318
+ const { runIssues } = await import("./issues-6ZDNDSD6.js");
1224
1319
  await runIssues(rest);
1225
1320
  return;
1226
1321
  }