bitfab-cli 0.2.399 → 0.2.400

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/index.js +19 -16
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -26022,14 +26022,17 @@ Run ${platform2.loginHint} to re-authenticate.`);
26022
26022
  }
26023
26023
 
26024
26024
  // ../bitfab-plugin-lib/dist/commands/switchOrg.js
26025
- async function requestSwitch(serviceUrl, apiKey, clerkOrganizationId) {
26025
+ async function requestSwitch(serviceUrl, apiKey, authOrganizationId) {
26026
26026
  const res = await fetch(`${serviceUrl}/api/plugin/organizations/switch`, {
26027
26027
  method: "POST",
26028
26028
  headers: {
26029
26029
  Authorization: `Bearer ${apiKey}`,
26030
26030
  "Content-Type": "application/json"
26031
26031
  },
26032
- body: JSON.stringify({ clerkOrganizationId })
26032
+ body: JSON.stringify({
26033
+ authOrganizationId,
26034
+ clerkOrganizationId: authOrganizationId
26035
+ })
26033
26036
  });
26034
26037
  if (!res.ok) {
26035
26038
  throw new Error(`Failed to switch organization (HTTP ${res.status})`);
@@ -26038,9 +26041,9 @@ async function requestSwitch(serviceUrl, apiKey, clerkOrganizationId) {
26038
26041
  }
26039
26042
  var ARGS = [
26040
26043
  {
26041
- name: "clerkOrganizationId",
26044
+ name: "authOrganizationId",
26042
26045
  required: false,
26043
- description: "Clerk organization ID to make active. Discover IDs with the list_organizations MCP tool."
26046
+ description: "Organization ID to make active. Discover IDs with the list_organizations MCP tool."
26044
26047
  }
26045
26048
  ];
26046
26049
  async function runSwitchOrg(platform2) {
@@ -26049,21 +26052,21 @@ async function runSwitchOrg(platform2) {
26049
26052
  })[0] ?? null;
26050
26053
  const { apiKey, serviceUrl } = requireAuth(platform2.loginHint);
26051
26054
  if (!target) {
26052
- console.error("Usage: switchOrg <clerkOrganizationId>");
26055
+ console.error("Usage: switchOrg <authOrganizationId>");
26053
26056
  console.error("Discover org ids with the list_organizations MCP tool, then pass one here.");
26054
26057
  process.exit(1);
26055
26058
  }
26056
26059
  try {
26057
26060
  const result = await requestSwitch(serviceUrl, apiKey, target);
26058
26061
  if (result.status === "not-member") {
26059
- emitJson({ event: "not-member", clerkOrganizationId: target });
26062
+ emitJson({ event: "not-member", authOrganizationId: target });
26060
26063
  return;
26061
26064
  }
26062
26065
  saveCredentials(result.apiKey);
26063
26066
  emitJson({
26064
26067
  event: "switched",
26065
26068
  status: result.status,
26066
- clerkOrganizationId: result.clerkOrganizationId,
26069
+ authOrganizationId: result.authOrganizationId ?? result.clerkOrganizationId ?? target,
26067
26070
  organizationName: result.organizationName,
26068
26071
  apiKey: result.apiKey
26069
26072
  });
@@ -31220,8 +31223,8 @@ var setupFlow = Flow.parse({
31220
31223
  description: "Open a sign-in window and wait for authentication. Relay the printed sign-in link as a fallback."
31221
31224
  },
31222
31225
  switchOrg: {
31223
- description: "List the user's Bitfab orgs (no args), or switch the plugin's active org and replace the local API key (with a <clerkOrganizationId> arg)",
31224
- args: "[<clerkOrganizationId>]"
31226
+ description: "List the user's Bitfab orgs (no args), or switch the plugin's active org and replace the local API key (with a <authOrganizationId> arg)",
31227
+ args: "[<authOrganizationId>]"
31225
31228
  },
31226
31229
  startTemplatePreview: {
31227
31230
  description: "Print a template preview link and exit.",
@@ -32230,7 +32233,7 @@ Then, for anything not healthy, name the most likely cause and the fix:
32230
32233
  - **Root not replayable**, two failure modes, with the fix matched to each: **(a) the root takes unserializable inputs** (live SDK/DB clients, HTTP req/res, streams, opaque contexts), with or without a replay registry module: move the trace boundary inward to a serializable-input function or refactor to introduce one; **(b) a bare trace-processor-only key** ({{traceProcessorNames}}) whose root is the processor's empty-input span: add a \`withTrace\`/\`trace\` root that wraps the run and takes its input in a supported subtree runtime, or route the run through the run wrapper ({{traceProcessorRootWrappers}}). Use a manual \`withSpan\`/\`@span\` root only when opt-out is technically unavailable. Either way, re-instrument via \`{{cmd}}setup modify\` (or \`{{cmd}}setup instrument\` for a fresh boundary). This is a code change, recommended here, not applied blanket.
32231
32234
  - **Opt-out roots without subtree capture**: every trace is the root alone, so tracing looks healthy and the traces are useless for per-step diagnosis, replay mocking, and prompt iteration. For TypeScript, use the installed SDK and wire the matching adapter into the build behind the server entrypoint, preserving existing config wrappers such as Sentry. For Python, this is a runtime upgrade to 3.12+; report it rather than attempting it.
32232
32235
  - **Instrumented but no traces**: the app hasn't run with tracing enabled, or \`BITFAB_API_KEY\` isn't set in the run environment. Run the app with the key loaded.
32233
- - **Key set but traces aren't visible in the browser**: the API key is bound to a different Clerk org/tenant than the browser session. A key resolves \`API key \u2192 organization_id \u2192 clerk_organization_id \u2192 Clerk tenant\` at creation time; browser visibility requires both to be the same tenant.
32236
+ - **Key set but traces aren't visible in the browser**: the API key belongs to a different organization than the one the browser is showing. A key is bound to one organization when it is created, and the browser shows the signed-in user's active organization. Have the user pick the key's organization in the in-app org switcher; if it isn't listed, the signed-in user isn't a member of it.
32234
32237
  - **Nothing instrumented**: run \`{{cmd}}setup instrument\`.
32235
32238
  - **Want to change what's captured**: run \`{{cmd}}setup modify\`.
32236
32239
 
@@ -32294,7 +32297,7 @@ For unusual monorepos or private registries, defer to \`{{cmd}}update\`. Report
32294
32297
  stepStyle: "list",
32295
32298
  intro: `Switch which Bitfab organization the plugin reads and writes. Triggered explicitly by \`{{cmd}}setup switch-org\` (or natural-language asks like "switch org" / "change org" / "switch to the <name> org" / "I'm in the wrong org"). The plugin's org is set by the API key in \`~/.config/bitfab/credentials.json\`; this lists the user's orgs, switches to the chosen one, and replaces that local key. Requires authentication. Does **not** open Bitfab.
32296
32299
 
32297
- **The live browser does not follow on its own.** Switching persists the new active org server-side (so future sign-ins default to it) and replaces the plugin's key, but a browser tab that's already signed in keeps showing the old org until its session is re-minted. The org actually flips in the browser on the **next** Bitfab open (a fresh session whose org check runs Clerk's client-side \`setActive\`) or when the user picks the org from the in-app org switcher.
32300
+ **The live browser does not follow on its own.** Switching persists the new active org server-side (so future sign-ins default to it) and replaces the plugin's key, but a browser tab that's already signed in keeps showing the old org until its session is re-minted. The org actually flips in the browser on the **next** Bitfab open (a fresh session whose org check sets the active organization in the browser) or when the user picks the org from the in-app org switcher.
32298
32301
 
32299
32302
  **The plugin key and the app's runtime key are separate.** Switching replaces only the plugin's credential in \`~/.config/bitfab/credentials.json\`. The \`BITFAB_API_KEY\` your application reads at runtime (from a \`.env\`-style file) is untouched, so traces your code sends keep landing in the **old** org until that key is updated too. The last step offers to do that.`,
32300
32303
  steps: [
@@ -32327,7 +32330,7 @@ If **already authenticated**, continue to step {{step:switch-org/pick-org}}. If
32327
32330
  kind: "branch",
32328
32331
  toolCalls: ["listOrganizations", "ask"],
32329
32332
  title: "List the orgs and choose a target",
32330
- body: `Call {{tool:listOrganizations}} to list the organizations the signed-in user belongs to. Each entry has a name, the user's role, an \`id:\` (the \`clerkOrganizationId\`), and the org the plugin uses now is marked \`[current]\`.
32333
+ body: `Call {{tool:listOrganizations}} to list the organizations the signed-in user belongs to. Each entry has a name, the user's role, an \`id:\` (the \`authOrganizationId\`), and the org the plugin uses now is marked \`[current]\`.
32331
32334
 
32332
32335
  Choose the target org:
32333
32336
  - **If the user already named an org** (in their request), match it case-insensitively by name against the list and use that org's \`id\`. If the name matches none, or matches more than one, fall through to asking.
@@ -32352,15 +32355,15 @@ Only ever use an \`id\` value returned by {{tool:listOrganizations}}; never inve
32352
32355
  toolCalls: ["bash"],
32353
32356
  commandCalls: ["switchOrg"],
32354
32357
  title: "Switch and confirm",
32355
- body: `Switch to the chosen org by passing its \`clerkOrganizationId\`:
32358
+ body: `Switch to the chosen org by passing its \`authOrganizationId\`:
32356
32359
 
32357
32360
  \`\`\`bash
32358
- {{command:switchOrg}} <clerkOrganizationId>
32361
+ {{command:switchOrg}} <authOrganizationId>
32359
32362
  \`\`\`
32360
32363
 
32361
32364
  The command prints one JSON line; act on it:
32362
- - \`{"event":"switched","status":"switched"|"already-aligned","clerkOrganizationId":"...","organizationName":"...","apiKey":"..."}\`: success. The plugin now reads and writes that org and its API key has been replaced locally. Tell the user in one line: the plugin is now connected to **<organizationName>**. Then tell them to select **<organizationName>** with the in-app org switcher to align their browser with the plugin. Opening a plugin page link does not change the browser's active organization. Hold on to the \`apiKey\` value from this JSON; the next step uses it to sync the app's local key, and you must never echo that value to the user.
32363
- - \`{"event":"not-member","clerkOrganizationId":"..."}\`: the user isn't a member of that org. Report it; do not retry.
32365
+ - \`{"event":"switched","status":"switched"|"already-aligned","authOrganizationId":"...","organizationName":"...","apiKey":"..."}\`: success. The plugin now reads and writes that org and its API key has been replaced locally. Tell the user in one line: the plugin is now connected to **<organizationName>**. Then tell them to select **<organizationName>** with the in-app org switcher to align their browser with the plugin. Opening a plugin page link does not change the browser's active organization. Hold on to the \`apiKey\` value from this JSON; the next step uses it to sync the app's local key, and you must never echo that value to the user.
32366
+ - \`{"event":"not-member","authOrganizationId":"..."}\`: the user isn't a member of that org. Report it; do not retry.
32364
32367
  - \`{"event":"error","reason":"..."}\`: report the reason.
32365
32368
 
32366
32369
  Do not print or ask for the API key, and do not surface the \`apiKey\` value to the user; the command replaces the plugin's copy for you and hands you that value solely for the next step.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bitfab-cli",
3
- "version": "0.2.399",
3
+ "version": "0.2.400",
4
4
  "description": "Install and configure the Bitfab plugin in Claude Code, Codex, or Cursor, or the Bitfab skill pack in Amp (Alpha).",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",