Commit Graph

71919 Commits

Author SHA1 Message Date
Patrik Oldsberg d806b0cc9f Add automatic discovery of CLI modules from project dependencies
The CLI now scans the project root's dependencies and devDependencies
for packages with the cli-module role, loading them automatically.
Falls back to the built-in set with a deprecation warning when no
modules are found. Updated create-app templates and the monorepo root
to include all CLI modules as explicit devDependencies.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:43 +01:00
Patrik Oldsberg 64a96d9d9f Add bin entry points for standalone CLI module execution
Each CLI module package now includes a bin script and cli.ts entry
point, allowing modules to be executed directly via npx without
being wired into the main @backstage/cli package.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:43 +01:00
Patrik Oldsberg 401c1f7e24 Resolve CLI version dynamically in info module
The info command now tries to resolve the @backstage/cli version at
runtime instead of using a hardcoded relative path. This allows the
module to work standalone when the CLI package is not present. The
module's own version is always reported as infoModuleVersion.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:43 +01:00
Patrik Oldsberg c95a130f52 Add runCliModule helper for standalone module execution
Add a public `runCliModule` function to `@backstage/cli-node` that
allows CLI module packages to be executed directly as standalone
programs, without needing to be wired into a larger CLI host.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:43 +01:00
Patrik Oldsberg a151ad0814 Split CLI modules into separate packages
Extract each CLI module from packages/cli/src/modules/ into its own
package under packages/cli-module-*. This enables independent versioning
and clearer dependency boundaries for each CLI capability.

Module mapping:
- auth → @backstage/cli-module-auth
- build → @backstage/cli-module-build
- config → @backstage/cli-module-config
- create-github-app → @backstage/cli-module-create-github-app
- info → @backstage/cli-module-info
- lint → @backstage/cli-module-lint
- maintenance → @backstage/cli-module-maintenance
- migrate → @backstage/cli-module-migrate
- new → @backstage/cli-module-new
- test → @backstage/cli-module-test-jest
- translations → @backstage/cli-module-translations

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:43 +01:00
Patrik Oldsberg 18012b5802 Rename CliPlugin to CliModule and cli-plugin role to cli-module
Rename createCliPlugin to createCliModule, CliPlugin to CliModule, and
the cli-plugin package role to cli-module to better distinguish CLI
modules from other plugin types.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:43 +01:00
Patrik Oldsberg 1929a95b97 Rename BackstageCommand to CliCommand and CommandContext to CliCommandContext
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:43 +01:00
Patrik Oldsberg 7d055ef0c4 Merge cli-plugin-api into cli-node
Move createCliPlugin and related types from the standalone
@backstage/cli-plugin-api package into @backstage/cli-node and
remove the now-empty package.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:43 +01:00
Patrik Oldsberg a90939e138 Use opaque types for command graph nodes
Switch CommandGraph and CliInitializer to use OpaqueCommandTreeNode and
OpaqueCommandLeafNode from @internal/cli instead of raw $$type markers.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:42 +01:00
Patrik Oldsberg 28a438a9f2 Add documentation to cli-plugin-api and remove CliFeature type
Add thorough TSDoc comments to createCliPlugin, BackstageCommand,
CommandContext, and CliPlugin. Remove the CliFeature type alias in
favor of using CliPlugin directly.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:42 +01:00
Patrik Oldsberg 7e6ad01a21 Refine cli-plugin-api: use packageJson, inline types, rename context fields
Replace pluginId with packageJson input for createCliPlugin, remove
CommandExecuteFn type alias by inlining it, and rename
CommandContext.info.description to info.name.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:42 +01:00
Patrik Oldsberg 2e5f189cfa Add @internal/cli package for opaque CLI types
Move OpaqueCliPlugin to a new @internal/cli inline package, following the
same pattern as @internal/frontend. Both cli-plugin-api and cli import it
directly, and it gets bundled into their dists at build time.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:42 +01:00
Patrik Oldsberg d6caf7f13b Slim cli-plugin-api to only export createCliPlugin
Move error handling and lazy utilities back to @backstage/cli since they
are host-only concerns. The cli-plugin-api internals subpath provides
isCliPlugin and initializeCliPlugin for the CLI host.

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:42 +01:00
Patrik Oldsberg 0be3eab18b cli: initial cli-plugin-api
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
Made-with: Cursor
2026-03-14 12:40:42 +01:00
Patrik Oldsberg 94a885a2ef Add cli-plugin package role
Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
2026-03-14 12:39:21 +01:00
Charles de Dreuille 0733b76b75 Update Row.tsx
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
2026-03-14 10:44:22 +00:00
Charles de Dreuille 421641b0f5 Update Header.module.css
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
2026-03-14 10:41:32 +00:00
Charles de Dreuille 612c217c1f fix(ui): open external Table row hrefs in a new tab
Automatically apply `target="_blank"` and `rel="noopener noreferrer"` on
`Row` when `href` is an external link, so external links in default BUI
Table rows open in a new tab instead of navigating the current page.

`rel` tokens are merged rather than replaced, so consumer-provided tokens
(e.g. `rel="nofollow"`) are preserved while `noopener noreferrer` is
always enforced whenever `target="_blank"` is in effect.

Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
2026-03-14 10:37:13 +00:00
Charles de Dreuille 9318146af7 Update rename-header-css-classes.md
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
2026-03-14 10:32:58 +00:00
Charles de Dreuille 4ebcde9826 Update Header.tsx
Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
2026-03-14 10:31:24 +00:00
Gabriel Dugny 895563a1b7 fix(techdocs): Disable LighBox addon for images wrapped in links
Signed-off-by: Gabriel Dugny <gabriel.dugny@believe.com>

# Conflicts:
#	docs/features/techdocs/addons--new.md
#	docs/features/techdocs/addons.md

# Conflicts:
#	docs/features/techdocs/addons--new.md
2026-03-14 11:27:11 +01:00
Charles de Dreuille 17d6398e22 fix(ui): fix Container bottom margin clash in Header
- Changed Container default bottom spacing from padding-bottom to margin-bottom
- Prevented the Container margin-bottom from applying when used as the Header root element via mb="0"
- Renamed Header CSS classes from bui-HeaderPage* to bui-Header* to match the component name

Fixes https://linear.app/spotify/issue/BACUI-249

Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
Made-with: Cursor
2026-03-14 10:22:13 +00:00
Charles de Dreuille b99f6d5a93 fix(ui): fix Dialog content overflowing when no height prop is set
Replaces the invalid `min(auto, calc(100vh - 3rem))` CSS pattern with a
flex-based layout. The dialog now grows with its content by default and
scrolls when the content exceeds the viewport height. A fixed height can
still be applied via the `height` prop.

Signed-off-by: Charles de Dreuille <charles.dedreuille@gmail.com>
Made-with: Cursor
2026-03-14 07:20:04 +00:00
backstage-goalie[bot] 6f01c33a0e Merge pull request #33350 from backstage/renovate/npm-yauzl-vulnerability
chore(deps): update dependency yauzl to v3.2.1 [security]
2026-03-14 02:03:38 +00:00
renovate[bot] 527d055a78 chore(deps): update dependency yauzl to v3.2.1 [security]
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-14 00:58:20 +00:00
backstage-goalie[bot] 2a7ea8e79e Merge pull request #33348 from backstage/renovate/npm-undici-vulnerability
chore(deps): update dependency undici to v7.24.0 [security]
2026-03-14 00:45:26 +00:00
renovate[bot] 7e1f0f0a09 chore(deps): update dependency undici to v7.24.0 [security]
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-13 23:32:28 +00:00
Andre Wanlin cc11d289de Merge pull request #33345 from awanlin/docs/ai
[Docs] Added new AI section
2026-03-13 18:27:13 -05:00
Andre Wanlin 52fba1c57e Review feedback
Signed-off-by: Andre Wanlin <awanlin@spotify.com>
2026-03-13 17:59:21 -05:00
Andre Wanlin e4cd6aad70 Update docs/ai/index.md
Co-authored-by: Aramis Sennyey <159921952+aramissennyeydd@users.noreply.github.com>
Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com>
2026-03-13 17:57:09 -05:00
Andre Wanlin a148a319df Update docs/ai/index.md
Co-authored-by: Aramis Sennyey <159921952+aramissennyeydd@users.noreply.github.com>
Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com>
2026-03-13 17:56:43 -05:00
Andre Wanlin 34d5315991 Update docs/ai/index.md
Co-authored-by: Aramis Sennyey <159921952+aramissennyeydd@users.noreply.github.com>
Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com>
2026-03-13 17:56:30 -05:00
Andre Wanlin 8c19ddbadf Update docs/ai/index.md
Co-authored-by: Aramis Sennyey <159921952+aramissennyeydd@users.noreply.github.com>
Signed-off-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com>
2026-03-13 17:56:04 -05:00
Andre Wanlin 8aebd31e34 Minor adjustments
Signed-off-by: Andre Wanlin <awanlin@spotify.com>
2026-03-13 17:02:42 -05:00
Andre Wanlin f3a9100932 Feedback corrections
Signed-off-by: Andre Wanlin <awanlin@spotify.com>
2026-03-13 16:47:40 -05:00
Andre Wanlin 5abb339d57 Fixed typo
Signed-off-by: Andre Wanlin <awanlin@spotify.com>
2026-03-13 16:42:16 -05:00
Andre Wanlin 9b48446864 Added new AI section
Co-authored-by: Nawaraj <mbk36900@gmail.com>
Signed-off-by: Andre Wanlin <awanlin@spotify.com>
2026-03-13 16:38:16 -05:00
chanchalkhatri 434b0284a3 fix(microsite): correct blog typos and malformed punctuation (#33289)
Signed-off-by: chanchalkhatri19 <chanchal.khatri01@infosys.com>
2026-03-13 16:31:33 -04:00
Andre Wanlin 86f9affed8 Merge pull request #33218 from SanderDelden/feat/plugin-scaffolder-node-add-githelper-removal-function
plugin-scaffolder-node: Add function to gitHelpers to stage files for removal
2026-03-13 14:34:12 -05:00
Andre Wanlin b33e0498fd Merge pull request #33132 from abdellahhn/scaffolder-add-run-id-return-value-to-github-actions-dispatch-v2
feat(scaffolder): add returnWorkflowRunDetails to github:actions:dispatch action
2026-03-13 13:58:16 -05:00
Andre Wanlin d187a8b087 Merge pull request #32840 from iurylenonalves/docs-backstage-openapi
docs(catalog): add mention of backstage-openapi backend module to configuration
2026-03-13 13:35:09 -05:00
Jonathan Roebuck 5d4fc274a2 Update .changeset/bui-table-root-loading-prop.md
Co-authored-by: Johan Persson <johanopersson@gmail.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>
2026-03-13 18:29:27 +00:00
Jonathan Roebuck b838cc97b0 docs(ui): add changeset and docs for TableRoot loading prop
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>
2026-03-13 18:29:27 +00:00
Jonathan Roebuck 3ace9c54db feat(ui): add separate loading prop to TableRoot
Use spread for conditional selection props. Add a dedicated loading
prop and data-loading data attribute to TableRoot, distinct from
stale. Both set aria-busy and default to the same opacity, but
consumers can now style them independently.

Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>
2026-03-13 18:29:27 +00:00
Jonathan Roebuck a688c806bc refactor(ui): consolidate live region label logic
Move initial loading label into useLiveRegionLabel so all live
region logic is in one place.

Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>
2026-03-13 18:29:27 +00:00
Jonathan Roebuck 36d9e1b56e docs(ui): update changeset with affected component
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>
2026-03-13 18:29:26 +00:00
Jonathan Roebuck 4bd75da4cf docs(ui): fix changeset wording for Table loading state
Remove inaccurate aria-busy claim from changeset — react-aria-components
does not forward it to the DOM.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>
2026-03-13 18:29:26 +00:00
Jonathan Roebuck ddf90ae1fe chore(ui): remove Table tests and test setup
Removed per reviewer feedback — BUI Table relies on Storybook visual
tests rather than unit tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>
2026-03-13 18:29:26 +00:00
Jonathan Roebuck 6f56a0c0b0 fix(ui): address review feedback for Table skeleton loading
- Add @testing-library/jest-dom and @testing-library/react as explicit
  devDependencies for @backstage/ui
- Disable selection on TableRoot during initial loading to prevent
  interaction with skeleton rows
- Clarify test comment about aria-busy vs data-stale behavior

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>
2026-03-13 18:29:26 +00:00
Jonathan Roebuck 690786f84d feat(ui): replace Table loading text with skeleton rows
Add a skeleton loading state to the BUI Table component that shows the
table header with animated skeleton rows instead of plain "Loading..."
text. Includes accessibility support via aria-busy and live region
announcements.

BUCKS-2919

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Jonathan Roebuck <jroebuck@spotify.com>
2026-03-13 18:29:25 +00:00