@trycadence/cli 0.1.4 → 0.1.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 (2) hide show
  1. package/dist/cadence +55 -9
  2. package/package.json +1 -1
package/dist/cadence CHANGED
@@ -1552,6 +1552,7 @@ var knownCommandPaths = [
1552
1552
  ["changesets", "create"],
1553
1553
  ["changesets", "list"],
1554
1554
  ["changesets", "get"],
1555
+ ["changesets", "context"],
1555
1556
  ["changesets", "current"],
1556
1557
  ["changesets", "notes", "get"],
1557
1558
  ["changesets", "notes", "put"],
@@ -1977,16 +1978,46 @@ async function readStoredCredential(store, server) {
1977
1978
  if (!await store.isAvailable()) {
1978
1979
  return null;
1979
1980
  }
1980
- const rawCredential = await store.getCredential(server);
1981
- return rawCredential ? decodeCredential(rawCredential) : null;
1981
+ for (const key of credentialStoreKeysForServer(server)) {
1982
+ const rawCredential = await store.getCredential(key);
1983
+ if (rawCredential) {
1984
+ return decodeCredential(rawCredential);
1985
+ }
1986
+ }
1987
+ return null;
1982
1988
  }
1983
- function normalizeServerForCredentialLock(server) {
1989
+ async function writeStoredCredential(store, server, credential) {
1990
+ await store.setCredential(normalizeServerForCredentialStore(server), encodeCredential(credential));
1991
+ }
1992
+ async function deleteStoredCredential(store, server) {
1993
+ for (const key of credentialStoreKeysForServer(server)) {
1994
+ await store.deleteCredential(key);
1995
+ }
1996
+ }
1997
+ function normalizeServerForCredentialStore(server) {
1984
1998
  try {
1985
1999
  return new URL(server).toString().replace(/\/$/, "");
1986
2000
  } catch {
1987
2001
  return server.trim();
1988
2002
  }
1989
2003
  }
2004
+ function credentialStoreKeysForServer(server) {
2005
+ const keys = [normalizeServerForCredentialStore(server)];
2006
+ const trimmed = server.trim();
2007
+ if (trimmed && !keys.includes(trimmed)) {
2008
+ keys.push(trimmed);
2009
+ }
2010
+ try {
2011
+ const serialized = new URL(trimmed).toString();
2012
+ if (!keys.includes(serialized)) {
2013
+ keys.push(serialized);
2014
+ }
2015
+ } catch {}
2016
+ return keys;
2017
+ }
2018
+ function normalizeServerForCredentialLock(server) {
2019
+ return normalizeServerForCredentialStore(server);
2020
+ }
1990
2021
  function credentialRefreshLockPath(config) {
1991
2022
  const normalizedServer = normalizeServerForCredentialLock(config.server);
1992
2023
  const serverHash = createHash("sha256").update(normalizedServer).digest("hex").slice(0, 24);
@@ -2112,10 +2143,11 @@ function helpText() {
2112
2143
  " cadence sessions start --ticket <ticket-id> [--changeset <changeset-id>] [--actor <actor-id>] [--project <project-id>] [--json]",
2113
2144
  " cadence sessions end <session-id> --summary <summary> [--project <project-id>] [--json]",
2114
2145
  " cadence sessions files <session-id> --file <path> [--file <path>] [--kind <added|modified|deleted|renamed|unknown>] [--changeset <changeset-id>] [--project <project-id>] [--json]",
2115
- " cadence changesets create --ticket <ticket-id> --branch <branch> [--base-branch <branch>] [--project <project-id>] [--json]",
2146
+ " cadence changesets create --ticket <ticket-id> --branch <branch> --base-branch <branch> [--project <project-id>] [--json]",
2116
2147
  " cadence intake dismiss <intake-id> --reason <reason> [--project <project-id>] [--json]",
2117
2148
  " cadence sessions current [--project <project-id>] [--ticket <ticket-id>] [--changeset <changeset-id>] [--json]",
2118
2149
  " cadence changesets current [--branch current|<branch>] [--project <project-id>] [--json]",
2150
+ " cadence changesets context <changeset-id> [--project <project-id>] [--json]",
2119
2151
  " cadence changesets get <changeset-id> [--project <project-id>] [--json]",
2120
2152
  " cadence changesets list [--project <project-id>] [--ticket <ticket-id>] [--status <status>] [--json]",
2121
2153
  " cadence changesets notes get [--changeset <id>|--branch current|<branch>] [--project <project-id>] [--json]",
@@ -2173,7 +2205,7 @@ async function readFreshAccessToken(config, store, authClient) {
2173
2205
  const refreshed = await authClient.auth.cli.refresh({
2174
2206
  refreshToken: lockedCredential.refreshToken
2175
2207
  });
2176
- await store.setCredential(config.server, encodeCredential(refreshed));
2208
+ await writeStoredCredential(store, config.server, refreshed);
2177
2209
  return refreshed.accessToken;
2178
2210
  } catch (error) {
2179
2211
  const recoveredCredential = await readStoredCredential(store, config.server);
@@ -2561,7 +2593,7 @@ async function runAuthCommand(parsed, options) {
2561
2593
  if (poll.status === "denied") {
2562
2594
  throw new CliError("AUTH_LOGIN_DENIED", "Cadence browser login was denied.");
2563
2595
  }
2564
- await store.setCredential(config.server, encodeCredential(poll.credential));
2596
+ await writeStoredCredential(store, config.server, poll.credential);
2565
2597
  await mergeConfigFile(config.globalConfigPath, { server: config.server });
2566
2598
  await writeInteractiveStatus("Cadence CLI login approved. Credential stored.", options);
2567
2599
  data = {
@@ -2590,7 +2622,7 @@ async function runAuthCommand(parsed, options) {
2590
2622
  break;
2591
2623
  case "auth.logout":
2592
2624
  await requireCredentialStore(store);
2593
- await store.deleteCredential(config.server);
2625
+ await deleteStoredCredential(store, config.server);
2594
2626
  data = {
2595
2627
  server: config.server,
2596
2628
  credentialRemoved: true
@@ -2674,6 +2706,14 @@ async function runReadCommand(parsed, options) {
2674
2706
  query: await changesetLookupFromOptions(parsed, options)
2675
2707
  });
2676
2708
  break;
2709
+ case "changesets.context":
2710
+ data = await client.changesets.context({
2711
+ projectId,
2712
+ query: {
2713
+ changesetId: requireArg(parsed, 0, "<changeset-id>")
2714
+ }
2715
+ });
2716
+ break;
2677
2717
  case "changesets.list":
2678
2718
  data = await client.changesets.list({
2679
2719
  projectId,
@@ -2944,7 +2984,7 @@ async function runIntakeCommand(parsed, options) {
2944
2984
  changeset: {
2945
2985
  ticketId: requireOption(parsed, "ticket"),
2946
2986
  branchName: requireOption(parsed, "branch"),
2947
- baseBranch: parsed.options["base-branch"] ?? "main",
2987
+ baseBranch: requireOption(parsed, "base-branch"),
2948
2988
  ...parsed.options.session ? { sessionId: parsed.options.session } : {},
2949
2989
  ...commandMetadata()
2950
2990
  }
@@ -3009,6 +3049,12 @@ function normalizeError(error) {
3009
3049
  if (error.message === "INTAKE_ALREADY_DECIDED" || error.message.includes("INTAKE_ALREADY_DECIDED")) {
3010
3050
  return new CliError("INTAKE_ALREADY_DECIDED", "INTAKE_ALREADY_DECIDED");
3011
3051
  }
3052
+ if (typeof error === "object" && error !== null && "data" in error) {
3053
+ const data = error.data;
3054
+ if (data?.serviceDetails) {
3055
+ return new CliError("API_ERROR", error.message || "Unexpected CLI error.", data.serviceDetails);
3056
+ }
3057
+ }
3012
3058
  return new CliError("API_ERROR", error.message || "Unexpected CLI error.");
3013
3059
  }
3014
3060
  function commandNameFromArgv(argv) {
@@ -3052,7 +3098,7 @@ async function runCli(argv, options = {}) {
3052
3098
  if (parsed.command.name === "auth.login" || parsed.command.name === "auth.status" || parsed.command.name === "auth.logout") {
3053
3099
  return await runAuthCommand(parsed, options);
3054
3100
  }
3055
- if (parsed.command.name === "events.list" || parsed.command.name === "work.overview" || parsed.command.name === "tickets.get" || parsed.command.name === "tickets.list" || parsed.command.name === "sessions.current" || parsed.command.name === "changesets.get" || parsed.command.name === "changesets.current" || parsed.command.name === "changesets.list" || parsed.command.name === "changesets.notes.get") {
3101
+ if (parsed.command.name === "events.list" || parsed.command.name === "work.overview" || parsed.command.name === "tickets.get" || parsed.command.name === "tickets.list" || parsed.command.name === "sessions.current" || parsed.command.name === "changesets.get" || parsed.command.name === "changesets.context" || parsed.command.name === "changesets.current" || parsed.command.name === "changesets.list" || parsed.command.name === "changesets.notes.get") {
3056
3102
  return await runReadCommand(parsed, options);
3057
3103
  }
3058
3104
  if (parsed.command.name === "projects.list") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trycadence/cli",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {