@backstage/create-app 0.8.2-next.1 → 0.8.2

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 (148) hide show
  1. package/CHANGELOG.md +22 -1
  2. package/dist/createApp.cjs.js +1 -1
  3. package/dist/createApp.cjs.js.map +1 -1
  4. package/dist/lib/versions.cjs.js +78 -74
  5. package/dist/lib/versions.cjs.js.map +1 -1
  6. package/dist/package.json.cjs.js +1 -1
  7. package/dist/packages/app-defaults/package.json.cjs.js +1 -1
  8. package/dist/packages/backend-defaults/package.json.cjs.js +1 -1
  9. package/dist/packages/catalog-client/package.json.cjs.js +1 -1
  10. package/dist/packages/catalog-model/package.json.cjs.js +1 -1
  11. package/dist/packages/cli/package.json.cjs.js +1 -1
  12. package/dist/packages/cli-defaults/package.json.cjs.js +1 -1
  13. package/dist/packages/config/package.json.cjs.js +1 -1
  14. package/dist/packages/core-app-api/package.json.cjs.js +1 -1
  15. package/dist/packages/core-compat-api/package.json.cjs.js +1 -1
  16. package/dist/packages/core-components/package.json.cjs.js +1 -1
  17. package/dist/packages/core-plugin-api/package.json.cjs.js +1 -1
  18. package/dist/packages/errors/package.json.cjs.js +1 -1
  19. package/dist/packages/frontend-defaults/package.json.cjs.js +1 -1
  20. package/dist/packages/frontend-plugin-api/package.json.cjs.js +1 -1
  21. package/dist/packages/frontend-test-utils/package.json.cjs.js +1 -1
  22. package/dist/packages/integration-react/package.json.cjs.js +1 -1
  23. package/dist/packages/repo-tools/package.json.cjs.js +1 -1
  24. package/dist/packages/test-utils/package.json.cjs.js +1 -1
  25. package/dist/packages/theme/package.json.cjs.js +1 -1
  26. package/dist/packages/ui/package.json.cjs.js +1 -1
  27. package/dist/plugins/api-docs/package.json.cjs.js +1 -1
  28. package/dist/plugins/app-backend/package.json.cjs.js +1 -1
  29. package/dist/plugins/app-react/package.json.cjs.js +1 -1
  30. package/dist/plugins/app-visualizer/package.json.cjs.js +1 -1
  31. package/dist/plugins/auth/package.json.cjs.js +6 -0
  32. package/dist/plugins/auth/package.json.cjs.js.map +1 -0
  33. package/dist/plugins/auth-backend/package.json.cjs.js +1 -1
  34. package/dist/plugins/auth-backend-module-github-provider/package.json.cjs.js +1 -1
  35. package/dist/plugins/auth-backend-module-guest-provider/package.json.cjs.js +1 -1
  36. package/dist/plugins/auth-node/package.json.cjs.js +1 -1
  37. package/dist/plugins/catalog/package.json.cjs.js +1 -1
  38. package/dist/plugins/catalog-backend/package.json.cjs.js +1 -1
  39. package/dist/plugins/catalog-backend-module-logs/package.json.cjs.js +1 -1
  40. package/dist/plugins/catalog-backend-module-scaffolder-entity-model/package.json.cjs.js +1 -1
  41. package/dist/plugins/catalog-common/package.json.cjs.js +1 -1
  42. package/dist/plugins/catalog-graph/package.json.cjs.js +1 -1
  43. package/dist/plugins/catalog-import/package.json.cjs.js +1 -1
  44. package/dist/plugins/catalog-react/package.json.cjs.js +1 -1
  45. package/dist/plugins/kubernetes/package.json.cjs.js +1 -1
  46. package/dist/plugins/kubernetes-backend/package.json.cjs.js +1 -1
  47. package/dist/plugins/mcp-actions-backend/package.json.cjs.js +6 -0
  48. package/dist/plugins/mcp-actions-backend/package.json.cjs.js.map +1 -0
  49. package/dist/plugins/notifications/package.json.cjs.js +1 -1
  50. package/dist/plugins/notifications-backend/package.json.cjs.js +1 -1
  51. package/dist/plugins/org/package.json.cjs.js +1 -1
  52. package/dist/plugins/permission-backend/package.json.cjs.js +1 -1
  53. package/dist/plugins/permission-backend-module-policy-allow-all/package.json.cjs.js +1 -1
  54. package/dist/plugins/permission-common/package.json.cjs.js +1 -1
  55. package/dist/plugins/permission-node/package.json.cjs.js +1 -1
  56. package/dist/plugins/permission-react/package.json.cjs.js +1 -1
  57. package/dist/plugins/proxy-backend/package.json.cjs.js +1 -1
  58. package/dist/plugins/scaffolder/package.json.cjs.js +1 -1
  59. package/dist/plugins/scaffolder-backend/package.json.cjs.js +1 -1
  60. package/dist/plugins/scaffolder-backend-module-github/package.json.cjs.js +1 -1
  61. package/dist/plugins/scaffolder-backend-module-notifications/package.json.cjs.js +1 -1
  62. package/dist/plugins/search/package.json.cjs.js +1 -1
  63. package/dist/plugins/search-backend/package.json.cjs.js +1 -1
  64. package/dist/plugins/search-backend-module-catalog/package.json.cjs.js +1 -1
  65. package/dist/plugins/search-backend-module-pg/package.json.cjs.js +1 -1
  66. package/dist/plugins/search-backend-module-techdocs/package.json.cjs.js +1 -1
  67. package/dist/plugins/search-backend-node/package.json.cjs.js +1 -1
  68. package/dist/plugins/search-react/package.json.cjs.js +1 -1
  69. package/dist/plugins/signals/package.json.cjs.js +1 -1
  70. package/dist/plugins/signals-backend/package.json.cjs.js +1 -1
  71. package/dist/plugins/techdocs/package.json.cjs.js +1 -1
  72. package/dist/plugins/techdocs-backend/package.json.cjs.js +1 -1
  73. package/dist/plugins/techdocs-module-addons-contrib/package.json.cjs.js +1 -1
  74. package/dist/plugins/techdocs-react/package.json.cjs.js +1 -1
  75. package/dist/plugins/user-settings/package.json.cjs.js +1 -1
  76. package/package.json +4 -4
  77. package/templates/default-app/app-config.yaml.hbs +38 -0
  78. package/templates/default-app/package.json.hbs +1 -14
  79. package/templates/default-app/packages/app/e2e-tests/app.test.ts +7 -1
  80. package/templates/default-app/packages/app/package.json.hbs +22 -26
  81. package/templates/default-app/packages/app/src/App.test.tsx +1 -1
  82. package/templates/default-app/packages/app/src/App.tsx +5 -110
  83. package/templates/default-app/packages/app/src/index.tsx +1 -1
  84. package/templates/default-app/packages/backend/package.json.hbs +1 -0
  85. package/templates/default-app/packages/backend/src/index.ts +3 -0
  86. package/templates/default-app/playwright.config.ts +3 -3
  87. package/templates/default-app/yarn.lock +12 -1
  88. package/templates/{next-app → legacy-app}/app-config.yaml.hbs +30 -9
  89. package/templates/{next-app → legacy-app}/package.json.hbs +14 -1
  90. package/templates/{next-app → legacy-app}/packages/app/e2e-tests/app.test.ts +1 -7
  91. package/templates/legacy-app/packages/app/package.json.hbs +76 -0
  92. package/templates/{next-app → legacy-app}/packages/app/src/App.test.tsx +1 -1
  93. package/templates/legacy-app/packages/app/src/App.tsx +112 -0
  94. package/templates/{next-app → legacy-app}/packages/app/src/index.tsx +1 -1
  95. package/templates/{next-app → legacy-app}/packages/backend/package.json.hbs +1 -0
  96. package/templates/{next-app → legacy-app}/packages/backend/src/index.ts +3 -0
  97. package/templates/next-app/packages/app/package.json.hbs +0 -71
  98. package/templates/next-app/packages/app/src/App.tsx +0 -7
  99. /package/templates/{next-app → default-app}/packages/app/src/modules/nav/LogoFull.tsx +0 -0
  100. /package/templates/{next-app → default-app}/packages/app/src/modules/nav/LogoIcon.tsx +0 -0
  101. /package/templates/{next-app → default-app}/packages/app/src/modules/nav/Sidebar.tsx +0 -0
  102. /package/templates/{next-app → default-app}/packages/app/src/modules/nav/SidebarLogo.tsx +0 -0
  103. /package/templates/{next-app → default-app}/packages/app/src/modules/nav/index.ts +0 -0
  104. /package/templates/{next-app → legacy-app}/.dockerignore +0 -0
  105. /package/templates/{next-app → legacy-app}/.eslintignore +0 -0
  106. /package/templates/{next-app → legacy-app}/.eslintrc.js.hbs +0 -0
  107. /package/templates/{next-app → legacy-app}/.gitignore.hbs +0 -0
  108. /package/templates/{next-app → legacy-app}/.prettierignore +0 -0
  109. /package/templates/{next-app → legacy-app}/.yarn/releases/yarn-4.4.1.cjs +0 -0
  110. /package/templates/{next-app → legacy-app}/.yarnrc.yml.hbs +0 -0
  111. /package/templates/{next-app → legacy-app}/README.md +0 -0
  112. /package/templates/{default-app → legacy-app}/app-config.local.yaml +0 -0
  113. /package/templates/{next-app → legacy-app}/app-config.production.yaml +0 -0
  114. /package/templates/{next-app → legacy-app}/backstage.json.hbs +0 -0
  115. /package/templates/{next-app → legacy-app}/catalog-info.yaml.hbs +0 -0
  116. /package/templates/{next-app → legacy-app}/examples/entities.yaml +0 -0
  117. /package/templates/{next-app → legacy-app}/examples/org.yaml +0 -0
  118. /package/templates/{next-app → legacy-app}/examples/template/content/catalog-info.yaml +0 -0
  119. /package/templates/{next-app → legacy-app}/examples/template/content/index.js +0 -0
  120. /package/templates/{next-app → legacy-app}/examples/template/content/package.json +0 -0
  121. /package/templates/{next-app → legacy-app}/examples/template/template.yaml +0 -0
  122. /package/templates/{next-app → legacy-app}/packages/README.md +0 -0
  123. /package/templates/{next-app → legacy-app}/packages/app/.eslintignore +0 -0
  124. /package/templates/{next-app → legacy-app}/packages/app/.eslintrc.js.hbs +0 -0
  125. /package/templates/{next-app → legacy-app}/packages/app/public/android-chrome-192x192.png +0 -0
  126. /package/templates/{next-app → legacy-app}/packages/app/public/apple-touch-icon.png +0 -0
  127. /package/templates/{next-app → legacy-app}/packages/app/public/favicon-16x16.png +0 -0
  128. /package/templates/{next-app → legacy-app}/packages/app/public/favicon-32x32.png +0 -0
  129. /package/templates/{next-app → legacy-app}/packages/app/public/favicon.ico +0 -0
  130. /package/templates/{next-app → legacy-app}/packages/app/public/index.html +0 -0
  131. /package/templates/{next-app → legacy-app}/packages/app/public/manifest.json +0 -0
  132. /package/templates/{next-app → legacy-app}/packages/app/public/robots.txt +0 -0
  133. /package/templates/{next-app → legacy-app}/packages/app/public/safari-pinned-tab.svg +0 -0
  134. /package/templates/{default-app → legacy-app}/packages/app/src/apis.ts +0 -0
  135. /package/templates/{default-app → legacy-app}/packages/app/src/components/Root/LogoFull.tsx +0 -0
  136. /package/templates/{default-app → legacy-app}/packages/app/src/components/Root/LogoIcon.tsx +0 -0
  137. /package/templates/{default-app → legacy-app}/packages/app/src/components/Root/Root.tsx +0 -0
  138. /package/templates/{default-app → legacy-app}/packages/app/src/components/Root/index.ts +0 -0
  139. /package/templates/{default-app → legacy-app}/packages/app/src/components/catalog/EntityPage.tsx +0 -0
  140. /package/templates/{default-app → legacy-app}/packages/app/src/components/search/SearchPage.tsx +0 -0
  141. /package/templates/{next-app → legacy-app}/packages/app/src/setupTests.ts +0 -0
  142. /package/templates/{next-app → legacy-app}/packages/backend/.eslintrc.js.hbs +0 -0
  143. /package/templates/{next-app → legacy-app}/packages/backend/Dockerfile +0 -0
  144. /package/templates/{next-app → legacy-app}/packages/backend/README.md +0 -0
  145. /package/templates/{next-app → legacy-app}/playwright.config.ts +0 -0
  146. /package/templates/{next-app → legacy-app}/plugins/README.md +0 -0
  147. /package/templates/{next-app → legacy-app}/tsconfig.json +0 -0
  148. /package/templates/{next-app → legacy-app}/yarn.lock +0 -0
@@ -1,112 +1,7 @@
1
- import { Navigate, Route } from 'react-router-dom';
2
- import { apiDocsPlugin, ApiExplorerPage } from '@backstage/plugin-api-docs';
3
- import {
4
- CatalogEntityPage,
5
- CatalogIndexPage,
6
- catalogPlugin,
7
- } from '@backstage/plugin-catalog';
8
- import {
9
- CatalogImportPage,
10
- catalogImportPlugin,
11
- } from '@backstage/plugin-catalog-import';
12
- import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder';
13
- import { orgPlugin } from '@backstage/plugin-org';
14
- import { SearchPage } from '@backstage/plugin-search';
15
- import {
16
- TechDocsIndexPage,
17
- techdocsPlugin,
18
- TechDocsReaderPage,
19
- } from '@backstage/plugin-techdocs';
20
- import { TechDocsAddons } from '@backstage/plugin-techdocs-react';
21
- import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib';
22
- import { UserSettingsPage } from '@backstage/plugin-user-settings';
23
- import { apis } from './apis';
24
- import { entityPage } from './components/catalog/EntityPage';
25
- import { searchPage } from './components/search/SearchPage';
26
- import { Root } from './components/Root';
1
+ import { createApp } from '@backstage/frontend-defaults';
2
+ import catalogPlugin from '@backstage/plugin-catalog/alpha';
3
+ import { navModule } from './modules/nav';
27
4
 
28
- import {
29
- AlertDisplay,
30
- OAuthRequestDialog,
31
- SignInPage,
32
- } from '@backstage/core-components';
33
- import { createApp } from '@backstage/app-defaults';
34
- import { AppRouter, FlatRoutes } from '@backstage/core-app-api';
35
- import { CatalogGraphPage } from '@backstage/plugin-catalog-graph';
36
- import { RequirePermission } from '@backstage/plugin-permission-react';
37
- import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha';
38
- import { NotificationsPage } from '@backstage/plugin-notifications';
39
- import { SignalsDisplay } from '@backstage/plugin-signals';
40
-
41
- const app = createApp({
42
- apis,
43
- bindRoutes({ bind }) {
44
- bind(catalogPlugin.externalRoutes, {
45
- createComponent: scaffolderPlugin.routes.root,
46
- viewTechDoc: techdocsPlugin.routes.docRoot,
47
- createFromTemplate: scaffolderPlugin.routes.selectedTemplate,
48
- });
49
- bind(apiDocsPlugin.externalRoutes, {
50
- registerApi: catalogImportPlugin.routes.importPage,
51
- });
52
- bind(scaffolderPlugin.externalRoutes, {
53
- registerComponent: catalogImportPlugin.routes.importPage,
54
- viewTechDoc: techdocsPlugin.routes.docRoot,
55
- });
56
- bind(orgPlugin.externalRoutes, {
57
- catalogIndex: catalogPlugin.routes.catalogIndex,
58
- });
59
- },
60
- components: {
61
- SignInPage: props => <SignInPage {...props} auto providers={['guest']} />,
62
- },
5
+ export default createApp({
6
+ features: [catalogPlugin, navModule],
63
7
  });
64
-
65
- const routes = (
66
- <FlatRoutes>
67
- <Route path="/" element={<Navigate to="catalog" />} />
68
- <Route path="/catalog" element={<CatalogIndexPage />} />
69
- <Route
70
- path="/catalog/:namespace/:kind/:name"
71
- element={<CatalogEntityPage />}
72
- >
73
- {entityPage}
74
- </Route>
75
- <Route path="/docs" element={<TechDocsIndexPage />} />
76
- <Route
77
- path="/docs/:namespace/:kind/:name/*"
78
- element={<TechDocsReaderPage />}
79
- >
80
- <TechDocsAddons>
81
- <ReportIssue />
82
- </TechDocsAddons>
83
- </Route>
84
- <Route path="/create" element={<ScaffolderPage />} />
85
- <Route path="/api-docs" element={<ApiExplorerPage />} />
86
- <Route
87
- path="/catalog-import"
88
- element={
89
- <RequirePermission permission={catalogEntityCreatePermission}>
90
- <CatalogImportPage />
91
- </RequirePermission>
92
- }
93
- />
94
- <Route path="/search" element={<SearchPage />}>
95
- {searchPage}
96
- </Route>
97
- <Route path="/settings" element={<UserSettingsPage />} />
98
- <Route path="/catalog-graph" element={<CatalogGraphPage />} />
99
- <Route path="/notifications" element={<NotificationsPage />} />
100
- </FlatRoutes>
101
- );
102
-
103
- export default app.createRoot(
104
- <>
105
- <AlertDisplay />
106
- <OAuthRequestDialog />
107
- <SignalsDisplay />
108
- <AppRouter>
109
- <Root>{routes}</Root>
110
- </AppRouter>
111
- </>,
112
- );
@@ -3,4 +3,4 @@ import ReactDOM from 'react-dom/client';
3
3
  import App from './App';
4
4
  import '@backstage/ui/css/styles.css';
5
5
 
6
- ReactDOM.createRoot(document.getElementById('root')!).render(<App />);
6
+ ReactDOM.createRoot(document.getElementById('root')!).render(App.createRoot());
@@ -27,6 +27,7 @@
27
27
  "@backstage/plugin-catalog-backend-module-logs": "^{{version '@backstage/plugin-catalog-backend-module-logs'}}",
28
28
  "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "^{{version '@backstage/plugin-catalog-backend-module-scaffolder-entity-model'}}",
29
29
  "@backstage/plugin-kubernetes-backend": "^{{version '@backstage/plugin-kubernetes-backend'}}",
30
+ "@backstage/plugin-mcp-actions-backend": "^{{version '@backstage/plugin-mcp-actions-backend'}}",
30
31
  "@backstage/plugin-notifications-backend": "^{{version '@backstage/plugin-notifications-backend'}}",
31
32
  "@backstage/plugin-permission-backend": "^{{version '@backstage/plugin-permission-backend'}}",
32
33
  "@backstage/plugin-permission-backend-module-allow-all-policy": "^{{version '@backstage/plugin-permission-backend-module-allow-all-policy'}}",
@@ -63,4 +63,7 @@ backend.add(import('@backstage/plugin-kubernetes-backend'));
63
63
  backend.add(import('@backstage/plugin-notifications-backend'));
64
64
  backend.add(import('@backstage/plugin-signals-backend'));
65
65
 
66
+ // mcp actions plugin
67
+ backend.add(import('@backstage/plugin-mcp-actions-backend'));
68
+
66
69
  backend.start();
@@ -24,7 +24,7 @@ export default defineConfig({
24
24
  timeout: 60_000,
25
25
 
26
26
  expect: {
27
- timeout: 5_000,
27
+ timeout: 30_000,
28
28
  },
29
29
 
30
30
  // Run your local dev server before starting the tests
@@ -33,9 +33,9 @@ export default defineConfig({
33
33
  : [
34
34
  {
35
35
  command: 'yarn start app',
36
- port: 3000,
36
+ url: 'http://localhost:3000',
37
37
  reuseExistingServer: true,
38
- timeout: 60_000,
38
+ timeout: 120_000,
39
39
  },
40
40
  {
41
41
  command: 'yarn start backend',
@@ -1 +1,12 @@
1
- # intentionally left empty
1
+ # This file is generated by running "yarn install" inside your project.
2
+ # Manual changes might be lost - proceed with caution!
3
+
4
+ __metadata:
5
+ version: 8
6
+ cacheKey: 10
7
+
8
+ "root-workspace-0b6124@workspace:.":
9
+ version: 0.0.0-use.local
10
+ resolution: "root-workspace-0b6124@workspace:."
11
+ languageName: unknown
12
+ linkType: soft
@@ -2,15 +2,6 @@ app:
2
2
  title: Scaffolded Backstage App
3
3
  baseUrl: http://localhost:3000
4
4
 
5
- # Enable all packages by default, this will discover packages from packages/app/package.json
6
- packages: all
7
-
8
- extensions:
9
- # Configure the catalog index page to be the root page, this is normally mounted on /catalog
10
- - page:catalog:
11
- config:
12
- path: /
13
-
14
5
  organization:
15
6
  name: My Company
16
7
 
@@ -39,6 +30,12 @@ backend:
39
30
  database:
40
31
  client: better-sqlite3
41
32
  connection: ':memory:'
33
+ # see https://backstage.io/docs/ai/mcp-actions#actions-configuration for more details
34
+ actions:
35
+ pluginSources:
36
+ - auth
37
+ - catalog
38
+ - scaffolder
42
39
  # workingDirectory: /tmp # Use this to configure a working directory for the scaffolder, defaults to the OS temp-dir
43
40
 
44
41
  integrations:
@@ -76,6 +73,25 @@ auth:
76
73
  providers:
77
74
  # See https://backstage.io/docs/auth/guest/provider
78
75
  guest: {}
76
+ # see https://backstage.io/docs/ai/mcp-actions#dynamic-client-registration
77
+ # to learn more about dynamic client registration
78
+ experimentalDynamicClientRegistration:
79
+ enabled: false
80
+ # Optional: limit valid callback URLs for added security
81
+ # allowedRedirectUriPatterns:
82
+ # - cursor://*
83
+ # see https://backstage.io/docs/ai/mcp-actions#client-id-metadata-documents
84
+ # to learn more about client id metadata documents
85
+ experimentalClientIdMetadataDocuments:
86
+ enabled: true
87
+ # Optional: restrict which `client_id` URLs are allowed (defaults to ['*'])
88
+ # allowedClientIdPatterns:
89
+ # - 'https://example.com/*'
90
+ # - 'https://*.trusted-domain.com/*'
91
+ # Optional: restrict which redirect URIs are allowed (defaults to ['*'])
92
+ # allowedRedirectUriPatterns:
93
+ # - 'http://localhost:*'
94
+ # - 'https://*.example.com/*'
79
95
 
80
96
  scaffolder:
81
97
  # see https://backstage.io/docs/features/software-templates/configuration for software template options
@@ -120,3 +136,8 @@ kubernetes:
120
136
  permission:
121
137
  # setting this to `false` will disable permissions
122
138
  enabled: true
139
+
140
+ # see https://backstage.io/docs/ai/mcp-actions for more details
141
+ mcpActions:
142
+ name: 'My Company Backstage' # defaults to "backstage"
143
+ description: 'Tools for managing your software catalog, creating new services from templates, and exploring your developer portal' # optional
@@ -27,7 +27,20 @@
27
27
  "new": {
28
28
  "globals": {
29
29
  "license": "UNLICENSED"
30
- }
30
+ },
31
+ "templates": [
32
+ "@backstage/cli-module-new/templates/legacy-frontend-plugin",
33
+ "@backstage/cli-module-new/templates/backend-plugin",
34
+ "@backstage/cli-module-new/templates/backend-plugin-module",
35
+ "@backstage/cli-module-new/templates/plugin-web-library",
36
+ "@backstage/cli-module-new/templates/plugin-node-library",
37
+ "@backstage/cli-module-new/templates/plugin-common-library",
38
+ "@backstage/cli-module-new/templates/web-library",
39
+ "@backstage/cli-module-new/templates/node-library",
40
+ "@backstage/cli-module-new/templates/cli-module",
41
+ "@backstage/cli-module-new/templates/catalog-provider-module",
42
+ "@backstage/cli-module-new/templates/scaffolder-backend-module"
43
+ ]
31
44
  }
32
45
  }
33
46
  },
@@ -23,11 +23,5 @@ test('App should render the welcome page', async ({ page }) => {
23
23
  await expect(enterButton).toBeVisible();
24
24
  await enterButton.click();
25
25
 
26
- const nav = page.getByRole('navigation');
27
- await expect(
28
- nav.getByRole('link', { name: 'Catalog', exact: true }),
29
- ).toBeVisible();
30
- await expect(
31
- page.getByRole('link', { name: 'APIs', exact: true }),
32
- ).toBeVisible();
26
+ await expect(page.getByText('My Company Catalog')).toBeVisible();
33
27
  });
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "app",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "bundled": true,
6
+ "backstage": {
7
+ "role": "frontend"
8
+ },
9
+ "scripts": {
10
+ "start": "backstage-cli package start",
11
+ "build": "backstage-cli package build",
12
+ "clean": "backstage-cli package clean",
13
+ "test": "backstage-cli package test",
14
+ "lint": "backstage-cli package lint"
15
+ },
16
+ "dependencies": {
17
+ "@backstage/app-defaults": "^{{version '@backstage/app-defaults'}}",
18
+ "@backstage/catalog-model": "^{{version '@backstage/catalog-model'}}",
19
+ "@backstage/cli": "^{{version '@backstage/cli'}}",
20
+ "@backstage/core-app-api": "^{{version '@backstage/core-app-api'}}",
21
+ "@backstage/core-components": "^{{version '@backstage/core-components'}}",
22
+ "@backstage/core-plugin-api": "^{{version '@backstage/core-plugin-api'}}",
23
+ "@backstage/integration-react": "^{{version '@backstage/integration-react'}}",
24
+ "@backstage/plugin-api-docs": "^{{version '@backstage/plugin-api-docs'}}",
25
+ "@backstage/plugin-catalog": "^{{version '@backstage/plugin-catalog'}}",
26
+ "@backstage/plugin-catalog-common": "^{{version '@backstage/plugin-catalog-common'}}",
27
+ "@backstage/plugin-catalog-graph": "^{{version '@backstage/plugin-catalog-graph'}}",
28
+ "@backstage/plugin-catalog-import": "^{{version '@backstage/plugin-catalog-import'}}",
29
+ "@backstage/plugin-catalog-react": "^{{version '@backstage/plugin-catalog-react'}}",
30
+ "@backstage/plugin-kubernetes": "^{{version '@backstage/plugin-kubernetes'}}",
31
+ "@backstage/plugin-notifications": "^{{ version '@backstage/plugin-notifications'}}",
32
+ "@backstage/plugin-org": "^{{version '@backstage/plugin-org'}}",
33
+ "@backstage/plugin-permission-react": "^{{version '@backstage/plugin-permission-react'}}",
34
+ "@backstage/plugin-scaffolder": "^{{version '@backstage/plugin-scaffolder'}}",
35
+ "@backstage/plugin-search": "^{{version '@backstage/plugin-search'}}",
36
+ "@backstage/plugin-search-react": "^{{version '@backstage/plugin-search-react'}}",
37
+ "@backstage/plugin-signals": "^{{ version '@backstage/plugin-signals'}}",
38
+ "@backstage/plugin-techdocs": "^{{version '@backstage/plugin-techdocs'}}",
39
+ "@backstage/plugin-techdocs-module-addons-contrib": "^{{version '@backstage/plugin-techdocs-module-addons-contrib'}}",
40
+ "@backstage/plugin-techdocs-react": "^{{version '@backstage/plugin-techdocs-react'}}",
41
+ "@backstage/plugin-user-settings": "^{{version '@backstage/plugin-user-settings'}}",
42
+ "@backstage/theme": "^{{version '@backstage/theme'}}",
43
+ "@backstage/ui": "^{{version '@backstage/ui'}}",
44
+ "@material-ui/core": "^4.12.2",
45
+ "@material-ui/icons": "^4.9.1",
46
+ "react": "^18.0.2",
47
+ "react-dom": "^18.0.2",
48
+ "react-router": "^6.30.2",
49
+ "react-router-dom": "^6.30.2"
50
+ },
51
+ "devDependencies": {
52
+ "@backstage/test-utils": "^{{version '@backstage/test-utils'}}",
53
+ "@playwright/test": "^1.32.3",
54
+ "@testing-library/dom": "^9.0.0",
55
+ "@testing-library/jest-dom": "^6.0.0",
56
+ "@testing-library/react": "^14.0.0",
57
+ "@testing-library/user-event": "^14.0.0",
58
+ "@types/react-dom": "*",
59
+ "cross-env": "^7.0.0"
60
+ },
61
+ "browserslist": {
62
+ "production": [
63
+ ">0.2%",
64
+ "not dead",
65
+ "not op_mini all"
66
+ ],
67
+ "development": [
68
+ "last 1 chrome version",
69
+ "last 1 firefox version",
70
+ "last 1 safari version"
71
+ ]
72
+ },
73
+ "files": [
74
+ "dist"
75
+ ]
76
+ }
@@ -19,7 +19,7 @@ describe('App', () => {
19
19
  ] as any,
20
20
  };
21
21
 
22
- const rendered = render(App.createRoot());
22
+ const rendered = render(<App />);
23
23
 
24
24
  await waitFor(() => {
25
25
  expect(rendered.baseElement).toBeInTheDocument();
@@ -0,0 +1,112 @@
1
+ import { Navigate, Route } from 'react-router-dom';
2
+ import { apiDocsPlugin, ApiExplorerPage } from '@backstage/plugin-api-docs';
3
+ import {
4
+ CatalogEntityPage,
5
+ CatalogIndexPage,
6
+ catalogPlugin,
7
+ } from '@backstage/plugin-catalog';
8
+ import {
9
+ CatalogImportPage,
10
+ catalogImportPlugin,
11
+ } from '@backstage/plugin-catalog-import';
12
+ import { ScaffolderPage, scaffolderPlugin } from '@backstage/plugin-scaffolder';
13
+ import { orgPlugin } from '@backstage/plugin-org';
14
+ import { SearchPage } from '@backstage/plugin-search';
15
+ import {
16
+ TechDocsIndexPage,
17
+ techdocsPlugin,
18
+ TechDocsReaderPage,
19
+ } from '@backstage/plugin-techdocs';
20
+ import { TechDocsAddons } from '@backstage/plugin-techdocs-react';
21
+ import { ReportIssue } from '@backstage/plugin-techdocs-module-addons-contrib';
22
+ import { UserSettingsPage } from '@backstage/plugin-user-settings';
23
+ import { apis } from './apis';
24
+ import { entityPage } from './components/catalog/EntityPage';
25
+ import { searchPage } from './components/search/SearchPage';
26
+ import { Root } from './components/Root';
27
+
28
+ import {
29
+ AlertDisplay,
30
+ OAuthRequestDialog,
31
+ SignInPage,
32
+ } from '@backstage/core-components';
33
+ import { createApp } from '@backstage/app-defaults';
34
+ import { AppRouter, FlatRoutes } from '@backstage/core-app-api';
35
+ import { CatalogGraphPage } from '@backstage/plugin-catalog-graph';
36
+ import { RequirePermission } from '@backstage/plugin-permission-react';
37
+ import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha';
38
+ import { NotificationsPage } from '@backstage/plugin-notifications';
39
+ import { SignalsDisplay } from '@backstage/plugin-signals';
40
+
41
+ const app = createApp({
42
+ apis,
43
+ bindRoutes({ bind }) {
44
+ bind(catalogPlugin.externalRoutes, {
45
+ createComponent: scaffolderPlugin.routes.root,
46
+ viewTechDoc: techdocsPlugin.routes.docRoot,
47
+ createFromTemplate: scaffolderPlugin.routes.selectedTemplate,
48
+ });
49
+ bind(apiDocsPlugin.externalRoutes, {
50
+ registerApi: catalogImportPlugin.routes.importPage,
51
+ });
52
+ bind(scaffolderPlugin.externalRoutes, {
53
+ registerComponent: catalogImportPlugin.routes.importPage,
54
+ viewTechDoc: techdocsPlugin.routes.docRoot,
55
+ });
56
+ bind(orgPlugin.externalRoutes, {
57
+ catalogIndex: catalogPlugin.routes.catalogIndex,
58
+ });
59
+ },
60
+ components: {
61
+ SignInPage: props => <SignInPage {...props} auto providers={['guest']} />,
62
+ },
63
+ });
64
+
65
+ const routes = (
66
+ <FlatRoutes>
67
+ <Route path="/" element={<Navigate to="catalog" />} />
68
+ <Route path="/catalog" element={<CatalogIndexPage />} />
69
+ <Route
70
+ path="/catalog/:namespace/:kind/:name"
71
+ element={<CatalogEntityPage />}
72
+ >
73
+ {entityPage}
74
+ </Route>
75
+ <Route path="/docs" element={<TechDocsIndexPage />} />
76
+ <Route
77
+ path="/docs/:namespace/:kind/:name/*"
78
+ element={<TechDocsReaderPage />}
79
+ >
80
+ <TechDocsAddons>
81
+ <ReportIssue />
82
+ </TechDocsAddons>
83
+ </Route>
84
+ <Route path="/create" element={<ScaffolderPage />} />
85
+ <Route path="/api-docs" element={<ApiExplorerPage />} />
86
+ <Route
87
+ path="/catalog-import"
88
+ element={
89
+ <RequirePermission permission={catalogEntityCreatePermission}>
90
+ <CatalogImportPage />
91
+ </RequirePermission>
92
+ }
93
+ />
94
+ <Route path="/search" element={<SearchPage />}>
95
+ {searchPage}
96
+ </Route>
97
+ <Route path="/settings" element={<UserSettingsPage />} />
98
+ <Route path="/catalog-graph" element={<CatalogGraphPage />} />
99
+ <Route path="/notifications" element={<NotificationsPage />} />
100
+ </FlatRoutes>
101
+ );
102
+
103
+ export default app.createRoot(
104
+ <>
105
+ <AlertDisplay />
106
+ <OAuthRequestDialog />
107
+ <SignalsDisplay />
108
+ <AppRouter>
109
+ <Root>{routes}</Root>
110
+ </AppRouter>
111
+ </>,
112
+ );
@@ -3,4 +3,4 @@ import ReactDOM from 'react-dom/client';
3
3
  import App from './App';
4
4
  import '@backstage/ui/css/styles.css';
5
5
 
6
- ReactDOM.createRoot(document.getElementById('root')!).render(App.createRoot());
6
+ ReactDOM.createRoot(document.getElementById('root')!).render(<App />);
@@ -27,6 +27,7 @@
27
27
  "@backstage/plugin-catalog-backend-module-logs": "^{{version '@backstage/plugin-catalog-backend-module-logs'}}",
28
28
  "@backstage/plugin-catalog-backend-module-scaffolder-entity-model": "^{{version '@backstage/plugin-catalog-backend-module-scaffolder-entity-model'}}",
29
29
  "@backstage/plugin-kubernetes-backend": "^{{version '@backstage/plugin-kubernetes-backend'}}",
30
+ "@backstage/plugin-mcp-actions-backend": "^{{version '@backstage/plugin-mcp-actions-backend'}}",
30
31
  "@backstage/plugin-notifications-backend": "^{{version '@backstage/plugin-notifications-backend'}}",
31
32
  "@backstage/plugin-permission-backend": "^{{version '@backstage/plugin-permission-backend'}}",
32
33
  "@backstage/plugin-permission-backend-module-allow-all-policy": "^{{version '@backstage/plugin-permission-backend-module-allow-all-policy'}}",
@@ -63,4 +63,7 @@ backend.add(import('@backstage/plugin-kubernetes-backend'));
63
63
  backend.add(import('@backstage/plugin-notifications-backend'));
64
64
  backend.add(import('@backstage/plugin-signals-backend'));
65
65
 
66
+ // mcp actions plugin
67
+ backend.add(import('@backstage/plugin-mcp-actions-backend'));
68
+
66
69
  backend.start();
@@ -1,71 +0,0 @@
1
- {
2
- "name": "app",
3
- "version": "0.0.0",
4
- "private": true,
5
- "bundled": true,
6
- "backstage": {
7
- "role": "frontend"
8
- },
9
- "scripts": {
10
- "start": "backstage-cli package start",
11
- "build": "backstage-cli package build",
12
- "clean": "backstage-cli package clean",
13
- "test": "backstage-cli package test",
14
- "lint": "backstage-cli package lint"
15
- },
16
- "dependencies": {
17
- "@backstage/cli": "^{{ version '@backstage/cli'}}",
18
- "@backstage/core-components": "^{{ version '@backstage/core-components'}}",
19
- "@backstage/core-plugin-api": "^{{ version '@backstage/core-plugin-api'}}",
20
- "@backstage/frontend-defaults": "^{{ version '@backstage/frontend-defaults'}}",
21
- "@backstage/frontend-plugin-api": "^{{ version '@backstage/frontend-plugin-api'}}",
22
- "@backstage/integration-react": "^{{ version '@backstage/integration-react'}}",
23
- "@backstage/plugin-api-docs": "^{{ version '@backstage/plugin-api-docs'}}",
24
- "@backstage/plugin-app-react": "^{{ version '@backstage/plugin-app-react'}}",
25
- "@backstage/plugin-app-visualizer": "^{{ version '@backstage/plugin-app-visualizer'}}",
26
- "@backstage/plugin-catalog": "^{{ version '@backstage/plugin-catalog'}}",
27
- "@backstage/plugin-catalog-graph": "^{{ version '@backstage/plugin-catalog-graph'}}",
28
- "@backstage/plugin-catalog-import": "^{{ version '@backstage/plugin-catalog-import'}}",
29
- "@backstage/plugin-kubernetes": "^{{ version '@backstage/plugin-kubernetes'}}",
30
- "@backstage/plugin-notifications": "^{{ version '@backstage/plugin-notifications'}}",
31
- "@backstage/plugin-org": "^{{ version '@backstage/plugin-org'}}",
32
- "@backstage/plugin-scaffolder": "^{{ version '@backstage/plugin-scaffolder'}}",
33
- "@backstage/plugin-search": "^{{ version '@backstage/plugin-search'}}",
34
- "@backstage/plugin-signals": "^{{ version '@backstage/plugin-signals'}}",
35
- "@backstage/plugin-techdocs": "^{{ version '@backstage/plugin-techdocs'}}",
36
- "@backstage/plugin-techdocs-module-addons-contrib": "^{{ version '@backstage/plugin-techdocs-module-addons-contrib'}}",
37
- "@backstage/plugin-user-settings": "^{{ version '@backstage/plugin-user-settings'}}",
38
- "@backstage/ui": "^{{ version '@backstage/ui'}}",
39
- "@material-ui/core": "^4.12.2",
40
- "@material-ui/icons": "^4.9.1",
41
- "react": "^18.0.2",
42
- "react-dom": "^18.0.2",
43
- "react-router": "^6.30.2",
44
- "react-router-dom": "^6.30.2"
45
- },
46
- "devDependencies": {
47
- "@backstage/frontend-test-utils": "^{{ version '@backstage/frontend-test-utils'}}",
48
- "@playwright/test": "^1.32.3",
49
- "@testing-library/dom": "^9.0.0",
50
- "@testing-library/jest-dom": "^6.0.0",
51
- "@testing-library/react": "^14.0.0",
52
- "@testing-library/user-event": "^14.0.0",
53
- "@types/react-dom": "*",
54
- "cross-env": "^7.0.0"
55
- },
56
- "browserslist": {
57
- "production": [
58
- ">0.2%",
59
- "not dead",
60
- "not op_mini all"
61
- ],
62
- "development": [
63
- "last 1 chrome version",
64
- "last 1 firefox version",
65
- "last 1 safari version"
66
- ]
67
- },
68
- "files": [
69
- "dist"
70
- ]
71
- }
@@ -1,7 +0,0 @@
1
- import { createApp } from '@backstage/frontend-defaults';
2
- import catalogPlugin from '@backstage/plugin-catalog/alpha';
3
- import { navModule } from './modules/nav';
4
-
5
- export default createApp({
6
- features: [catalogPlugin, navModule],
7
- });
File without changes