feat: sync developer-cli from amplitude/javascript@083b16f59710#4
feat: sync developer-cli from amplitude/javascript@083b16f59710#4ekim-amplitude wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Autofix Details
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: Internal monorepo path in docs
- Replaced the internal monorepo file path with product-neutral wording about updating the OAuth client allowlist in Amplitude's backend configuration.
Or push these changes by commenting:
@cursor push bed6d983ca
Preview (bed6d983ca)
diff --git a/docs/cli.md b/docs/cli.md
--- a/docs/cli.md
+++ b/docs/cli.md
@@ -83,8 +83,8 @@
Route-level scopes are defined on each OpenAPI operation (`x-required-scopes`).
When adding new CLI scopes, the Hydra device client allowlist must be updated
-out-of-band (client IDs in `server/packages/api-server/src/oauthConfig.ts`)
-before default login can request them.
+out-of-band in Amplitude's backend OAuth client configuration before default
+login can request them.
## Global flagsYou can send follow-ups to the cloud agent here.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Autofix Details
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: Profile creation error omits flags
- Updated the loginBaseUrl usage error to list --region, --env, and --base-url as valid options for creating a profile.
Or push these changes by commenting:
@cursor push 9b65af7650
Preview (9b65af7650)
diff --git a/src/auth-commands.ts b/src/auth-commands.ts
--- a/src/auth-commands.ts
+++ b/src/auth-commands.ts
@@ -122,7 +122,9 @@
if (args.existing) {
return args.existing.base_url;
}
- throw usageError('Creating a profile requires --region <us|eu>.');
+ throw usageError(
+ 'Creating a profile requires --region <us|eu>, --env, or --base-url <url>.',
+ );
}
/**You can send follow-ups to the cloud agent here.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
There are 3 total unresolved issues (including 2 from previous reviews).
Bugbot Autofix prepared a fix for the issue found in the latest run.
- ✅ Fixed: OpenAPI leaks internal product names
- Removed Nova/Dash product names and internal type identifiers from the Chart definition and ChartType descriptions in both bundled OpenAPI files, replacing them with public-facing copy that still documents the unknown mapping behavior.
Or push these changes by commenting:
@cursor push da593148ef
Preview (da593148ef)
diff --git a/openapi/bundled/openapi.bundled.json b/openapi/bundled/openapi.bundled.json
--- a/openapi/bundled/openapi.bundled.json
+++ b/openapi/bundled/openapi.bundled.json
@@ -2370,13 +2370,13 @@
"definition": {
"type": "object",
"additionalProperties": true,
- "description": "Read-only chart definition. Returned only when `include_definition=true`\non GET chart. Shape is unstable and may change with Nova/Dash versions;\nnot intended for authoring.\n"
+ "description": "Read-only chart definition. Returned only when `include_definition=true`\non GET chart. Shape is unstable and may change over time; not intended\nfor authoring.\n"
}
}
},
"ChartType": {
"type": "string",
- "description": "Public chart type discriminator (snake_case). Maps from internal Dash types\n(e.g. `eventsSegmentation` → `event_segmentation`). All values may appear on\nlist/get; query returns `422` (`unsupported_chart_type`) for types outside\nthe v1 supported matrix.\n\nInternal-only or deprecated Dash types (e.g. `asql`, `eventsLog`) are not\nexposed on the public wire; those charts surface as `unknown`.\n\nNew chart types may be added over time. An internal type the adapter cannot\nmap is surfaced as `unknown` rather than failing the response, so the wire\nvalue is always one of the members below. Clients should treat `unknown` as\n\"a chart type this API version does not model yet\".\n",
+ "description": "Public chart type discriminator (snake_case). All values may appear on\nlist/get; query returns `422` (`unsupported_chart_type`) for types outside\nthe v1 supported matrix.\n\nUnsupported chart types surface as `unknown` on the public wire.\n\nNew chart types may be added over time. A chart type this API version does not\nrecognize is surfaced as `unknown` rather than failing the response, so the wire\nvalue is always one of the members below. Clients should treat `unknown` as\n\"a chart type this API version does not model yet\".\n",
"enum": [
"event_segmentation",
"sessions",
diff --git a/openapi/bundled/openapi.bundled.yaml b/openapi/bundled/openapi.bundled.yaml
--- a/openapi/bundled/openapi.bundled.yaml
+++ b/openapi/bundled/openapi.bundled.yaml
@@ -1833,23 +1833,21 @@
additionalProperties: true
description: |
Read-only chart definition. Returned only when `include_definition=true`
- on GET chart. Shape is unstable and may change with Nova/Dash versions;
- not intended for authoring.
+ on GET chart. Shape is unstable and may change over time; not intended
+ for authoring.
ChartType:
type: string
description: |
- Public chart type discriminator (snake_case). Maps from internal Dash types
- (e.g. `eventsSegmentation` → `event_segmentation`). All values may appear on
+ Public chart type discriminator (snake_case). All values may appear on
list/get; query returns `422` (`unsupported_chart_type`) for types outside
the v1 supported matrix.
- Internal-only or deprecated Dash types (e.g. `asql`, `eventsLog`) are not
- exposed on the public wire; those charts surface as `unknown`.
+ Unsupported chart types surface as `unknown` on the public wire.
- New chart types may be added over time. An internal type the adapter cannot
- map is surfaced as `unknown` rather than failing the response, so the wire
- value is always one of the members below. Clients should treat `unknown` as
- "a chart type this API version does not model yet".
+ New chart types may be added over time. A chart type this API version does
+ not recognize is surfaced as `unknown` rather than failing the response, so
+ the wire value is always one of the members below. Clients should treat
+ `unknown` as "a chart type this API version does not model yet".
enum:
- event_segmentation
- sessionsYou can send follow-ups to the cloud agent here.
Reviewed by Cursor Bugbot for commit 26e1ff0. Configure here.
|
Bugbot Autofix prepared fixes for both issues found in the latest run.
Or push these changes by commenting: Preview (d4aa2c8719)diff --git a/docs/cli.md b/docs/cli.md
--- a/docs/cli.md
+++ b/docs/cli.md
@@ -82,12 +82,6 @@
Route-level scopes are defined on each OpenAPI operation (`x-required-scopes`).
-When adding new CLI scopes, register them on the Hydra device-flow OAuth client
-for each target environment (for example `amplitude-developer-api-device-staging`
-on staging, `amplitude-developer-api-v0` on prod). This is an out-of-band Hydra
-admin change — coordinate with SecEng before shipping CLI changes that request
-new scopes by default.
-
## Global flags
| Flag / env | Purpose |
diff --git a/openapi/bundled/openapi.bundled.json b/openapi/bundled/openapi.bundled.json
--- a/openapi/bundled/openapi.bundled.json
+++ b/openapi/bundled/openapi.bundled.json
@@ -1414,7 +1414,7 @@
"tags": ["Analytics"],
"operationId": "queryChart",
"summary": "Query chart",
- "description": "Computes and returns normalized results for a saved chart. v1 supports\n`event_segmentation`, `sessions`, `funnels`, and `retention` chart types;\nother chart types return `422` with `error_code: unsupported_chart_type`.\nResults are DAC-filtered for the authenticated caller.\n\nThis POST computes a result and does not mutate state. It is therefore a\nread operation and does not require an `Idempotency-Key`.\n\nOmitting `time_range` uses the chart's saved range; if the chart has no\nsaved range, the server defaults to the last 30 days.\n\nQuery is synchronous with bounded defaults. Expensive queries may return\n`504` when exceeding the server timeout; async query jobs are planned for\na follow-up slice. Retryable responses (`429`, `502`, `504`) populate\n`retry_after_seconds` in the problem body when a delay is advised.\n",
+ "description": "Computes and returns normalized results for a saved chart. v1 supports\n`event_segmentation`, `sessions`, `funnels`, and `retention` chart types;\nother chart types return `422` with `error_code: unsupported_chart_type`.\nResults respect the authenticated caller's chart access permissions.\n\nThis POST computes a result and does not mutate state. It is therefore a\nread operation and does not require an `Idempotency-Key`.\n\nOmitting `time_range` uses the chart's saved range; if the chart has no\nsaved range, the server defaults to the last 30 days.\n\nQuery is synchronous with bounded defaults. Expensive queries may return\n`504` when exceeding the server timeout; async query jobs are planned for\na follow-up slice. Retryable responses (`429`, `502`, `504`) populate\n`retry_after_seconds` in the problem body when a delay is advised.\n",
"x-required-scopes": ["read:analytics"],
"requestBody": {
"required": false,
@@ -2370,13 +2370,13 @@
"definition": {
"type": "object",
"additionalProperties": true,
- "description": "Read-only chart definition. Returned only when `include_definition=true`\non GET chart. Shape is unstable and may change with Nova/Dash versions;\nnot intended for authoring.\n"
+ "description": "Read-only chart definition. Returned only when `include_definition=true`\non GET chart. Shape is unstable and may change between API versions;\nnot intended for authoring.\n"
}
}
},
"ChartType": {
"type": "string",
- "description": "Public chart type discriminator (snake_case). Maps from internal Dash types\n(e.g. `eventsSegmentation` → `event_segmentation`). All values may appear on\nlist/get; query returns `422` (`unsupported_chart_type`) for types outside\nthe v1 supported matrix.\n\nInternal-only or deprecated Dash types (e.g. `asql`, `eventsLog`) are not\nexposed on the public wire; those charts surface as `unknown`.\n\nNew chart types may be added over time. An internal type the adapter cannot\nmap is surfaced as `unknown` rather than failing the response, so the wire\nvalue is always one of the members below. Clients should treat `unknown` as\n\"a chart type this API version does not model yet\".\n",
+ "description": "Public chart type discriminator (snake_case). All values may appear on\nlist/get; query returns `422` (`unsupported_chart_type`) for types outside\nthe v1 supported matrix.\n\nCharts whose type is not modeled in this API version surface as `unknown`\nrather than failing the response.\n\nNew chart types may be added over time. Clients should treat `unknown` as\n\"a chart type this API version does not model yet\".\n",
"enum": [
"event_segmentation",
"sessions",
@@ -2396,7 +2396,7 @@
},
"ChartQueryRequest": {
"type": "object",
- "description": "v1 query parameters. Filter and group-by overrides are intentionally omitted\nuntil Tier 2 allowlist validation is defined.\n",
+ "description": "v1 query parameters. Filter and group-by overrides are intentionally omitted\nuntil override validation is supported in a future version.\n",
"properties": {
"time_range": {
"$ref": "#/components/schemas/TimeRange"
diff --git a/openapi/bundled/openapi.bundled.yaml b/openapi/bundled/openapi.bundled.yaml
--- a/openapi/bundled/openapi.bundled.yaml
+++ b/openapi/bundled/openapi.bundled.yaml
@@ -1028,7 +1028,7 @@
Computes and returns normalized results for a saved chart. v1 supports
`event_segmentation`, `sessions`, `funnels`, and `retention` chart types;
other chart types return `422` with `error_code: unsupported_chart_type`.
- Results are DAC-filtered for the authenticated caller.
+ Results respect the authenticated caller's chart access permissions.
This POST computes a result and does not mutate state. It is therefore a
read operation and does not require an `Idempotency-Key`.
@@ -1833,22 +1833,19 @@
additionalProperties: true
description: |
Read-only chart definition. Returned only when `include_definition=true`
- on GET chart. Shape is unstable and may change with Nova/Dash versions;
+ on GET chart. Shape is unstable and may change between API versions;
not intended for authoring.
ChartType:
type: string
description: |
- Public chart type discriminator (snake_case). Maps from internal Dash types
- (e.g. `eventsSegmentation` → `event_segmentation`). All values may appear on
+ Public chart type discriminator (snake_case). All values may appear on
list/get; query returns `422` (`unsupported_chart_type`) for types outside
the v1 supported matrix.
- Internal-only or deprecated Dash types (e.g. `asql`, `eventsLog`) are not
- exposed on the public wire; those charts surface as `unknown`.
+ Charts whose type is not modeled in this API version surface as `unknown`
+ rather than failing the response.
- New chart types may be added over time. An internal type the adapter cannot
- map is surfaced as `unknown` rather than failing the response, so the wire
- value is always one of the members below. Clients should treat `unknown` as
+ New chart types may be added over time. Clients should treat `unknown` as
"a chart type this API version does not model yet".
enum:
- event_segmentation
@@ -1869,7 +1866,7 @@
type: object
description: |
v1 query parameters. Filter and group-by overrides are intentionally omitted
- until Tier 2 allowlist validation is defined.
+ until override validation is supported in a future version.
properties:
time_range:
$ref: '#/components/schemas/TimeRange'You can send follow-ups to the cloud agent here. |
Mirror monorepo developer-cli/ at 083b16f59710c3d1f9c6d27e6452b157fb102936. Includes: - Charts commands (list/get/query) and read:analytics in default login scopes (MCP-472) - OAuth device-flow login (start/poll), agent/JSON output mode, structured errors - External sync guards and public-hygiene cleanup (MCP-431 #138033, #138056) - Add fastest-levenshtein dependency (monorepo parity) Verified: pnpm check:developer-cli-external-ready, sync --verify (423 tests) Co-authored-by: Cursor <cursoragent@cursor.com>
26e1ff0 to
3462da6
Compare


Summary
Single squashed sync of
developer-cli/from monorepoamplitude/javascript@083b16f59710(master).Brings
@amplitude/developer-cliup to date with charts, OAuth device-flow login, agent/JSON output mode, and public-hygiene fixes for the external package.Source
amplitude/javascript083b16f59710masterserver/packages/api-server/developer-cliWhat ships
Analytics & API surface (MCP-472)
amp charts list,get,queryread:analyticsAuth & agent workflow
amp auth login start/amp auth login pollwith pending-login store--profile(defaults todefault);--region us|eufor prod targeting--forcefor cross-region retargets; logout/list/status JSON paths--env/--base-url: hidden from help and usage errors but still functionalPublic hygiene (MCP-431)
check:developer-cli-external-readybefore syncExternal-only
fastest-levenshteintopackage.json(monorepo dependency parity)Verification
Synced with
bash scripts/sync-developer-cli-external.sh … --verifyafter internal #138056 merge.Release notes (draft)
Note
Medium Risk
Touches credential storage, OAuth device flow, and profile/region targeting with broad test coverage, but behavior changes how login and flags work for scripts and agents.
Overview
Vendoring sync that expands the Analytics surface and reshapes how
ampauthenticates for humans vs agents.Charts: Regenerated OpenAPI bundle and CLI manifest add
charts list,get, andquery(read:analytics). Default OAuth login scopes now includeread:analytics.Auth & profiles: User-facing docs center on
--region us|euand an implicitdefaultprofile when--profileis omitted. Newamp auth login start/pollimplement a two-phase device flow with a pending-login store, JSON{status,message,…}on stdout, exit 75 while authorization is still pending, and--timeouton poll. Non-interactiveauth logindelegates tostart.--forceblocks silent cross-region retargets onlogin,pat, andstart;logoutcan cancel in-flight logins and clears pending state on--all.auth listandauth statusgain JSON output; status shows US/EU region for prod hosts. EU PAT guidance usesapp.eu.amplitude.com.CLI hardening: Global flags are split so auth-only options (e.g.
--timeout,--flow) are rejected on generated API commands instead of being silently ignored. Parse errors useCliErrorwith optional “did you mean” hints (fastest-levenshtein).AGENTS.mddocuments the enforced checklist for adding or changing commands.Docs: README/
docs/cli.mddrop prominent--base-url/ local-server sections; smoke checklist adds charts read.Reviewed by Cursor Bugbot for commit 3462da6. Bugbot is set up for automated code reviews on this repo. Configure here.