Introduce CatalogModelKindSummary, CatalogModelRelationSummary,
CatalogModelAnnotationSummary, CatalogModelLabelSummary, and
CatalogModelTagSummary as reduced views of the full model data.
Add listKinds(), listRelations(), and getMetadata() methods to
CatalogModel for retrieving these summaries. Add a new action for
fetching a markdown-formatted catalog model description, useful for
informing LLMs about the catalog structure.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
* docs: frontend plugin golden path guide
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* add changeset
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* Apply suggestion from @aramissennyeydd
Signed-off-by: Aramis Sennyey <159921952+aramissennyeydd@users.noreply.github.com>
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* fix template
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* fix template test
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* print stderr on failure
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* try writing directly
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* maybe this?
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* address feedback
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* fix: avoid destructuring FetchApi and fix template issues
- Use fetchApi.fetch() instead of destructuring to preserve this binding
- Add discoveryApi and fetchApi to useAsync dependency array
- Use react-use/esm/useAsync to match repo conventions
- Replace waitFor + getAllByText with findByText in error test
- Update HTTP client doc to match template changes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* fix: address docs review feedback
- Use stronger guidance tone in scaffolding guide intro
- Slim down file tree to show folder structure only
- Mention that plugin path depends on chosen plugin ID
- Link to installation docs for non-discovery case
- Quote page:todo YAML key to avoid parse errors
- Remove "new" from "new frontend system" in template README
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* fix: improve error handling in e2e plugin creation
- Narrow error to non-null object before using in operator
- Also write error.stdout since tools like Jest report to stdout
- Avoid variable shadowing with outer scope stdout/stderr
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* revert: keep destructured fetch from FetchApi
Destructuring fetch from FetchApi is fine — revert to original
pattern while keeping the dependency array and other fixes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* feat: use @backstage/ui components in frontend plugin template
Replace core-components layout and table with @backstage/ui equivalents:
- Use HeaderPage and Container instead of Page, Header, Content, ContentHeader
- Use BUI Table with useTable and CellText instead of core-components Table
- Add @backstage/ui to template package.json dependencies
- Update poking-around docs to reflect BUI component usage
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* fix: add example data when backend request fails
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* better logging setup
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* address feedback
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* better config driven example
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* debug logs
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* fix build failure related to unknown version
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* revert e2e run changes
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Aramis Sennyey <159921952+aramissennyeydd@users.noreply.github.com>
* skip the discovery api for now
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* remove another ref
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
* Apply suggestions from code review
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: Aramis Sennyey <159921952+aramissennyeydd@users.noreply.github.com>
---------
Signed-off-by: aramissennyeydd <aramis.sennyey@doordash.com>
Signed-off-by: Aramis Sennyey <159921952+aramissennyeydd@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Node.js 22.21.0+ and 24.5.0+ support proxy configuration natively
via NODE_USE_ENV_PROXY=1 and --use-env-proxy, making the legacy
global-agent and undici proxy workarounds unnecessary.
Rather than removing the function immediately, deprecate it with
context-aware runtime warnings that guide users based on their
current configuration:
- Users with GLOBAL_AGENT_* vars are told to switch to standard
HTTP_PROXY/HTTPS_PROXY and set NODE_USE_ENV_PROXY=1.
- Users with HTTP_PROXY/HTTPS_PROXY but no NODE_USE_ENV_PROXY are
told to set it.
- Users who have already opted in to Node.js built-in proxy see no
warning, and the legacy bootstrap is skipped entirely.
See #33444
Signed-off-by: Jon Koops <jonkoops@gmail.com>
These empty `{}` files were accidentally committed during the template
directory rename and override the properly templated package.json
generated from package.json.hbs, causing E2E tests to fail.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
The new frontend system app takes longer to compile and render on
Windows CI runners. Switch from port-based to URL-based server
readiness detection and increase expect timeout to 30s to avoid
flaky failures on slow runners.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
The test was updated to use the default-app template (renamed from
next-app), but the mock version list was missing packages that this
template requires such as @backstage/core-compat-api,
@backstage/frontend-defaults, @backstage/frontend-plugin-api, and
others. Also sorted the mock entries alphabetically.
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
Refactor the postgres database creation retry loop to avoid an
unnecessary sleep after the final failed attempt, and improve
readability by using named variables.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Fredrik Adelöw <freben@spotify.com>
* fix(cli-module-actions): show schema flags in execute --help
When an action ID is provided with --help, fetch the action schema and
display action-specific flags. Falls back to generic help if auth fails.
Signed-off-by: benjdlambert <ben@blam.sh>
* fix(cli-module-actions): show schema flags in execute --help and fix build errors (#33518)
* feat(cli-module-actions): improve CLI output formatting and UX
- Pretty grouped list output with colored headers and action titles
- Custom help rendering for execute --help with markdown descriptions
- Support complex schema types (object, array, union) as JSON flags
- Show server error details instead of generic status codes
- Accept multiple plugin IDs in sources add/remove
Signed-off-by: benjdlambert <ben@blam.sh>
* fix(cli-module-auth): preserve instance metadata on re-login
Signed-off-by: benjdlambert <ben@blam.sh>
* fix: address code review feedback
- Extract triplicated cli() config into showGenericHelp helper
- Strip ANSI escape sequences before rendering server markdown
- Configure marked-terminal extension once via lazy singleton
- Parallelize listGrouped HTTP requests with Promise.all
- Log actual error message in execute help catch block
- Fix marked version in declarations.d.ts comment
- Add tests for sourcesAdd/sourcesRemove batch operations
- Add test for execute JSON parse error path
- Add tests for login metadata preservation on re-auth
Signed-off-by: benjdlambert <ben@blam.sh>
* fix: use RegExp constructor to satisfy no-control-regex lint rule
Signed-off-by: benjdlambert <ben@blam.sh>
* fix: improve ANSI stripping, default info.usage, add renderMarkdown comment
- Extend stripAnsiEscapes to cover OSC, DCS, APC, PM sequences
- Default info.usage to avoid undefined in help output
- Document why marked.use() is called per invocation
Signed-off-by: benjdlambert <ben@blam.sh>
* fix: use strip-ansi, fresh Marked instance, add allOf support
- Replace hand-rolled ANSI stripping with strip-ansi package
- Use fresh Marked instance per call instead of mutating global singleton
- Add allOf to complex type detection alongside anyOf/oneOf
- Add happy-path test for valid JSON complex flag parsing
- Bump changeset to minor for new user-facing capabilities
Signed-off-by: benjdlambert <ben@blam.sh>
* refactor: collapse listGrouped into list on ActionsClient
Signed-off-by: benjdlambert <ben@blam.sh>
* refactor: clean up cli-module-actions structure
- Extract shared pluginSourcesSchema into lib/pluginSources.ts
- Merge schemaToFlags and getComplexKeys into single return value
- Move CleyeFlag-to-FlagInfo conversion into format.ts
- Extract parseArgs and showActionHelp from execute command body
Signed-off-by: benjdlambert <ben@blam.sh>
---------
Signed-off-by: benjdlambert <ben@blam.sh>
Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Form field descriptions were visually rendered but not connected
to inputs via aria-describedby, making them invisible to screen
readers.
Added a descriptionSlot prop to FieldLabel that renders the
description as a React Aria <Text slot="description"> element,
letting React Aria automatically wire up aria-describedby on
the associated input.
Applied to TextField, PasswordField, SearchField, Select,
RadioGroup, and CheckboxGroup. Slider already handled this
manually and is unchanged.
Also added a missing WithDescription story for RadioGroup.
Signed-off-by: Johan Persson <johanopersson@gmail.com>
Replace `humanizeEntityRef(parseEntityRef(owner), { defaultKind: 'group' })`
with `entityPresentationSnapshot(ref, { defaultKind: 'group' }).primaryTitle`
in the OwnershipCard's `useGetEntities` hook. This was the last remaining
usage of the deprecated function in the codebase.
Signed-off-by: Marat Dyatko <maratd@spotify.com>
Made-with: Cursor
Signed-off-by: Marat Dyatko <maratd@spotify.com>
Made-with: Cursor
Signed-off-by: Marat Dyatko <maratd@spotify.com>
Made-with: Cursor
The existing tests never exercised `getQueryParams` because the mock
catalog API always returned empty items. These new tests verify that the
generated query parameters include correctly humanized owner entity refs,
handle multiple owners, and group entities by kind and type.
Made-with: Cursor
Signed-off-by: Marat Dyatko <maratd@spotify.com>
Made-with: Cursor
Made href resolution always-on in useDefinition instead of requiring
each component to opt in via resolveHref: true. The hook now always
calls useInRouterContext/useHref and only applies the resolved value
when an href prop is actually provided, preventing href from leaking
into components that don't accept it.
Removed the resolveHref field from ComponentConfig, the
ResolveHrefConstraint type, and resolveHref: true from all 14
component definitions. Also removed a now-unnecessary type cast
in the Text component.
Signed-off-by: Johan Persson <johanopersson@gmail.com>