Add Akeyless plugin workspace#9436
Conversation
Migrate the Akeyless frontend and backend plugins into a new workspace, including catalog-linked discovery, phase 2 CRUD for static secrets, dev environments, and changeset for initial release. Signed-off-by: baraka-akeyless <barak.a@akeyless.io> Co-authored-by: Cursor <cursoragent@cursor.com>
Signed-off-by: baraka-akeyless <barak.a@akeyless.io> Co-authored-by: Cursor <cursoragent@cursor.com>
Changed Packages
|
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Adds a new Akeyless Backstage workspace with a frontend plugin (entity card + table + optional static-secret CRUD UI) and a matching backend plugin (Akeyless auth + list + optional CRUD endpoints), along with workspace scaffolding and repository plumbing (labeler, CODEOWNERS, tooling configs).
Changes:
- Introduces
@backstage-community/plugin-akeyless(frontend) with entity card/table and optional static-secret CRUD dialogs. - Introduces
@backstage-community/plugin-akeyless-backend(backend) exposing list + CRUD endpoints with config-driven auth and path-scope enforcement. - Adds a new
workspaces/akeylessworkspace (Backstage/Yarn tooling, example entities, configs) and updates repo automation (labeler/CODEOWNERS/resolutions).
Reviewed changes
Copilot reviewed 47 out of 50 changed files in this pull request and generated 8 comments.
Show a summary per file
| File | Description |
|---|---|
| workspaces/akeyless/tsconfig.json | Adds workspace TypeScript configuration for packages/plugins compilation. |
| workspaces/akeyless/plugins/akeyless/src/plugin.ts | Registers the classic frontend plugin and API factory. |
| workspaces/akeyless/plugins/akeyless/src/plugin.test.ts | Adds a minimal smoke test for plugin export. |
| workspaces/akeyless/plugins/akeyless/src/index.ts | Exposes public frontend plugin API (plugin, card, constants, api ref/types). |
| workspaces/akeyless/plugins/akeyless/src/constants.ts | Defines entity annotation constants and default secret type filters. |
| workspaces/akeyless/plugins/akeyless/src/conditions.ts | Adds availability predicate based on entity annotations. |
| workspaces/akeyless/plugins/akeyless/src/components/SecretCrudDialog/index.ts | Exports CRUD dialog component and mode type. |
| workspaces/akeyless/plugins/akeyless/src/components/SecretCrudDialog/SecretCrudDialog.tsx | Implements create/edit dialog UI and submission handling. |
| workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/index.tsx | Exports the table component and entity-to-config helper. |
| workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx | Implements table rendering, listing, view value modal, and CRUD actions. |
| workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessCard/index.ts | Exports the entity card wrapper. |
| workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessCard/EntityAkeylessCard.tsx | Renders missing-annotation empty state or the secrets table. |
| workspaces/akeyless/plugins/akeyless/src/api.ts | Adds frontend API ref + client for calling the backend endpoints. |
| workspaces/akeyless/plugins/akeyless/src/alpha.tsx | Adds new-frontend-system (alpha) extensions (API + entity card/content). |
| workspaces/akeyless/plugins/akeyless/package.json | Defines frontend plugin package metadata, deps, and entrypoints. |
| workspaces/akeyless/plugins/akeyless/README.md | Documents frontend installation and entity annotations. |
| workspaces/akeyless/plugins/akeyless/.eslintrc.js | Adds plugin-local ESLint config factory hookup. |
| workspaces/akeyless/plugins/akeyless-backend/src/types/akeyless-modules.d.ts | Adds ambient typings for Akeyless SDK modules used by the backend. |
| workspaces/akeyless/plugins/akeyless-backend/src/service/router.ts | Provides legacy-style createRouter entrypoint. |
| workspaces/akeyless/plugins/akeyless-backend/src/service/plugin.ts | Registers the new backend plugin with core services and auth policy. |
| workspaces/akeyless/plugins/akeyless-backend/src/service/akeylessApi.ts | Implements Akeyless SDK client (auth, list recursion, CRUD). |
| workspaces/akeyless/plugins/akeyless-backend/src/service/AkeylessBuilder.ts | Builds the Express router and enforces CRUD + path scope checks. |
| workspaces/akeyless/plugins/akeyless-backend/src/service/AkeylessBuilder.test.ts | Adds backend tests for health + CRUD-disabled behavior. |
| workspaces/akeyless/plugins/akeyless-backend/src/pathUtils.ts | Adds path normalization/joining and scope assertion helpers. |
| workspaces/akeyless/plugins/akeyless-backend/src/index.ts | Exports backend entrypoints and default backend plugin. |
| workspaces/akeyless/plugins/akeyless-backend/src/config.ts | Adds backend config parsing + profile/method validation. |
| workspaces/akeyless/plugins/akeyless-backend/package.json | Defines backend plugin package metadata and dependencies. |
| workspaces/akeyless/plugins/akeyless-backend/config.d.ts | Adds configuration schema typings for consumers. |
| workspaces/akeyless/plugins/akeyless-backend/README.md | Documents backend install, config examples, and REST API. |
| workspaces/akeyless/plugins/akeyless-backend/.eslintrc.js | Adds plugin-local ESLint config factory hookup. |
| workspaces/akeyless/package.json | Adds the workspace package definition and tooling scripts. |
| workspaces/akeyless/examples/entities.yaml | Adds example catalog entities with Akeyless annotations. |
| workspaces/akeyless/bcp.json | Adds Backstage community plugin settings for this workspace. |
| workspaces/akeyless/backstage.json | Pins Backstage version for the workspace (1.51.0). |
| workspaces/akeyless/app-config.yaml | Adds a runnable local app config for the workspace. |
| workspaces/akeyless/README.md | Adds workspace-level documentation and dev instructions. |
| workspaces/akeyless/.yarnrc.yml | Adds Yarn plugin-backstage configuration. |
| workspaces/akeyless/.yarn/plugins/@yarnpkg/plugin-backstage.cjs | Adds the Backstage Yarn plugin bundle to the workspace. |
| workspaces/akeyless/.prettierignore | Adds workspace Prettier ignore patterns. |
| workspaces/akeyless/.gitignore | Adds workspace ignore rules. |
| workspaces/akeyless/.eslintrc.js | Adds workspace ESLint base config forwarding. |
| workspaces/akeyless/.eslintignore | Adds workspace ESLint ignore for Playwright config. |
| workspaces/akeyless/.dockerignore | Adds workspace Docker ignore patterns. |
| workspaces/akeyless/.changeset/config.json | Adds Changesets configuration for publishing. |
| workspaces/akeyless/.changeset/akeyless-initial-release.md | Adds initial release changeset for both packages. |
| workspaces/akeyless/.changeset/README.md | Adds Changesets README. |
| scripts/set-resolutions.js | Updates repo script to include the new workspace package in resolution updates. |
| .github/pr-labeler.yml | Adds workspace/akeyless PR labeling rules and area-maintainers scope. |
| .github/CODEOWNERS | Adds CODEOWNERS entry for the new workspace. |
Comments suppressed due to low confidence (4)
workspaces/akeyless/plugins/akeyless/package.json:1
- The package entrypoints (
main/types/exports) point atsrc/*, butfilesonly publishesdist. As published, consumers will fail to resolve the entrypoints (and Node can’t execute TS/TSX). Setmain/types/exportsto the builtdist/*outputs (and include an./alphadist target), or includesrcinfiles(not recommended for published packages). This is critical for publish/install correctness.
workspaces/akeyless/plugins/akeyless/package.json:1 - The package entrypoints (
main/types/exports) point atsrc/*, butfilesonly publishesdist. As published, consumers will fail to resolve the entrypoints (and Node can’t execute TS/TSX). Setmain/types/exportsto the builtdist/*outputs (and include an./alphadist target), or includesrcinfiles(not recommended for published packages). This is critical for publish/install correctness.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - This
.catch(() => …)swallows all errors fromlistSecrets, which can mislead users into thinking there are simply “No items found” when the real problem is auth/config/404/etc. Consider propagating the error so the existingerrorrender path is used, or capture the error per-path (and render an error row / post an alert) rather than silently returning an empty result.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - If fetching the current secret value fails, the edit dialog still opens with an empty value, and the user can accidentally overwrite the secret with an empty string by clicking Save. A safer approach is to (a) only open the edit dialog after the value load succeeds, or (b) add a loading/error state to the edit dialog and disable submit until the initial value is loaded (and show an error if it can’t be fetched).
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Export public API types with release tags, generate report.api.md files, and dedupe workspace lockfile for verify step. Signed-off-by: baraka-akeyless <barak.a@akeyless.io> Co-authored-by: Cursor <cursoragent@cursor.com>
Prevent yarn dedupe from resolving @types/node to v25, which conflicts with webpack-env types during strict type checking. Signed-off-by: baraka-akeyless <barak.a@akeyless.io> Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 50 out of 53 changed files in this pull request and generated 3 comments.
Comments suppressed due to low confidence (8)
workspaces/akeyless/plugins/akeyless/package.json:1
- This package publishes only "dist" (via "files"), but "main"/"types"/"exports" currently point to "src/*". When published, consumers may not be able to resolve the entrypoints because "src" won't be included. Fix by pointing "main"/"types"/"exports"/"typesVersions" to the built artifacts in "dist" (or include "src" in "files" if publishing TS sources is intentional).
workspaces/akeyless/plugins/akeyless/package.json:1 - This package publishes only "dist" (via "files"), but "main"/"types"/"exports" currently point to "src/*". When published, consumers may not be able to resolve the entrypoints because "src" won't be included. Fix by pointing "main"/"types"/"exports"/"typesVersions" to the built artifacts in "dist" (or include "src" in "files" if publishing TS sources is intentional).
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - Throwing during render will crash the entity page if EntityAkeylessTable is rendered without valid annotations (including cases like whitespace-only values). Prefer rendering an in-UI error/empty state (e.g., MissingAnnotationEmptyState or an Alert) so the rest of the app remains usable.
workspaces/akeyless/plugins/akeyless/src/conditions.ts:1 - This treats whitespace-only annotation values as "available" (e.g., " "), which can lead to downstream failures (e.g., parsing into an empty path list and then throwing). Consider trimming and checking for a non-empty string (e.g., value?.trim().length > 0) before returning true.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - If the secret-types annotation is present but parses to an empty list (e.g., empty string, commas only, whitespace), "itemTypes" becomes [] and the backend will be asked to list with no types, likely returning nothing. Consider falling back to DEFAULT_SECRET_TYPES when the parsed list is empty.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - Links that open a new tab/window should include rel="noopener noreferrer" to prevent reverse-tabnabbing. If
@backstage/core-componentsLink forwards "rel" to the underlying anchor, add it here for each target="_blank".
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - Links that open a new tab/window should include rel="noopener noreferrer" to prevent reverse-tabnabbing. If
@backstage/core-componentsLink forwards "rel" to the underlying anchor, add it here for each target="_blank".
workspaces/akeyless/plugins/akeyless/src/api.ts:1 - This is part of the public API surface (exported in index.ts), but the methods are missing JSDoc. Adding brief docs for each method (params + behavior, especially for "contextPath" semantics and error behavior) will improve API Extractor output and consumer usability.
Restore set-resolutions shebang, improve error handling and path safety tests, align backend health/docs with CRUD behavior, and update API reports. Signed-off-by: baraka-akeyless <barak.a@akeyless.io> Co-authored-by: Cursor <cursoragent@cursor.com>
ae445ec to
465e25a
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 51 out of 54 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (20)
workspaces/akeyless/plugins/akeyless/package.json:1
- The package is configured to publish only "dist" (via "files"), but "main"/"types"/"exports" all point at source files under "src/*". This will break consumers because those files won’t be included in the published tarball. Fix by either (A) publishing source (add "src" to "files") or (B) pointing "main"/"types"/"exports" to the built outputs in "dist" (typical for Backstage packages).
workspaces/akeyless/plugins/akeyless/package.json:1 - The package is configured to publish only "dist" (via "files"), but "main"/"types"/"exports" all point at source files under "src/*". This will break consumers because those files won’t be included in the published tarball. Fix by either (A) publishing source (add "src" to "files") or (B) pointing "main"/"types"/"exports" to the built outputs in "dist" (typical for Backstage packages).
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - Several icon-only controls/links have no accessible name (e.g., wrapping and with only an icon). Add an explicit accessible label (e.g., aria-label on Link/IconButton, or visually-hidden text) so screen readers can announce what each control does.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - Several icon-only controls/links have no accessible name (e.g., wrapping and with only an icon). Add an explicit accessible label (e.g., aria-label on Link/IconButton, or visually-hidden text) so screen readers can announce what each control does.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - Several icon-only controls/links have no accessible name (e.g., wrapping and with only an icon). Add an explicit accessible label (e.g., aria-label on Link/IconButton, or visually-hidden text) so screen readers can announce what each control does.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - Several icon-only controls/links have no accessible name (e.g., wrapping and with only an icon). Add an explicit accessible label (e.g., aria-label on Link/IconButton, or visually-hidden text) so screen readers can announce what each control does.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - Several icon-only controls/links have no accessible name (e.g., wrapping and with only an icon). Add an explicit accessible label (e.g., aria-label on Link/IconButton, or visually-hidden text) so screen readers can announce what each control does.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - The table introduces substantial new behavior (annotation parsing, list aggregation across paths, CRUD enablement gating, and multiple dialog flows for view/edit/delete). The current frontend tests only assert the plugin export; please add targeted tests for akeylessSecretConfig parsing + key UI flows (e.g., CRUD enabled/disabled, error row, and opening view/edit/delete dialogs) to prevent regressions.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - The table introduces substantial new behavior (annotation parsing, list aggregation across paths, CRUD enablement gating, and multiple dialog flows for view/edit/delete). The current frontend tests only assert the plugin export; please add targeted tests for akeylessSecretConfig parsing + key UI flows (e.g., CRUD enabled/disabled, error row, and opening view/edit/delete dialogs) to prevent regressions.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - The table introduces substantial new behavior (annotation parsing, list aggregation across paths, CRUD enablement gating, and multiple dialog flows for view/edit/delete). The current frontend tests only assert the plugin export; please add targeted tests for akeylessSecretConfig parsing + key UI flows (e.g., CRUD enabled/disabled, error row, and opening view/edit/delete dialogs) to prevent regressions.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - The table introduces substantial new behavior (annotation parsing, list aggregation across paths, CRUD enablement gating, and multiple dialog flows for view/edit/delete). The current frontend tests only assert the plugin export; please add targeted tests for akeylessSecretConfig parsing + key UI flows (e.g., CRUD enabled/disabled, error row, and opening view/edit/delete dialogs) to prevent regressions.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - The table introduces substantial new behavior (annotation parsing, list aggregation across paths, CRUD enablement gating, and multiple dialog flows for view/edit/delete). The current frontend tests only assert the plugin export; please add targeted tests for akeylessSecretConfig parsing + key UI flows (e.g., CRUD enabled/disabled, error row, and opening view/edit/delete dialogs) to prevent regressions.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - The table introduces substantial new behavior (annotation parsing, list aggregation across paths, CRUD enablement gating, and multiple dialog flows for view/edit/delete). The current frontend tests only assert the plugin export; please add targeted tests for akeylessSecretConfig parsing + key UI flows (e.g., CRUD enabled/disabled, error row, and opening view/edit/delete dialogs) to prevent regressions.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - The table introduces substantial new behavior (annotation parsing, list aggregation across paths, CRUD enablement gating, and multiple dialog flows for view/edit/delete). The current frontend tests only assert the plugin export; please add targeted tests for akeylessSecretConfig parsing + key UI flows (e.g., CRUD enabled/disabled, error row, and opening view/edit/delete dialogs) to prevent regressions.
workspaces/akeyless/plugins/akeyless-backend/src/service/akeylessApi.ts:1 - The backend caches the Akeyless auth token indefinitely and never retries authentication on auth failures. If the token expires (common for API tokens), the backend may enter a permanent failure mode until restart. Consider tracking token expiry (if the SDK returns it) or clearing/re-authenticating the token on 401/403 responses from the Akeyless SDK calls.
workspaces/akeyless/plugins/akeyless-backend/src/service/akeylessApi.ts:1 - The backend caches the Akeyless auth token indefinitely and never retries authentication on auth failures. If the token expires (common for API tokens), the backend may enter a permanent failure mode until restart. Consider tracking token expiry (if the SDK returns it) or clearing/re-authenticating the token on 401/403 responses from the Akeyless SDK calls.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - Using join(',') to create dependency keys is brittle (paths/types containing commas can cause false cache hits) and obscures intent. Prefer a stable memoized key (e.g., JSON.stringify of the arrays) or a deep-compare dependency helper so dependency tracking accurately reflects changes in secretPaths/itemTypes.
workspaces/akeyless/plugins/akeyless/src/components/EntityAkeylessTable/EntityAkeylessTable.tsx:1 - Using join(',') to create dependency keys is brittle (paths/types containing commas can cause false cache hits) and obscures intent. Prefer a stable memoized key (e.g., JSON.stringify of the arrays) or a deep-compare dependency helper so dependency tracking accurately reflects changes in secretPaths/itemTypes.
workspaces/akeyless/plugins/akeyless/src/components/SecretCrudDialog/SecretCrudDialog.tsx:1 - Name is trimmed before submit, but value is submitted as-is and the button only checks
+ "!value" +. If whitespace-only values should be rejected, consider using+ "!value.trim()" +for consistency. If whitespace is valid, it may be worth documenting that explicitly in the UI/helper text.
workspaces/akeyless/plugins/akeyless/src/components/SecretCrudDialog/SecretCrudDialog.tsx:1 - Name is trimmed before submit, but value is submitted as-is and the button only checks
+ "!value" +. If whitespace-only values should be rejected, consider using+ "!value.trim()" +for consistency. If whitespace is valid, it may be worth documenting that explicitly in the UI/helper text.
|
Community contribution adding Akeyless secrets plugin, please review |
|
Hello Community, |
|
Hello Community, |
|
Hey @awanlin |
awanlin
left a comment
There was a problem hiding this comment.
Hi @baraka-akeyless, this is a volunteer run repo where reviewers are doing so on their own time as they have capacity. If you need to have fast turn around time then you're better off hosting this your self. Self-hosting is a pretty common pattern across the community and organizations that have built plugins for their own services.
Given that, are you open to this having slow review or will you self host? If you still want to contribute it here I'll give it look over next Friday if time permits.
|
@awanlin thanks for your reply. |
Expand README documentation, improve accessibility labels, add frontend tests, re-authenticate on expired Akeyless tokens, and tighten CRUD validation. Signed-off-by: baraka-akeyless <barak.a@akeyless.io> Co-authored-by: Cursor <cursoragent@cursor.com>
Use TestApiRegistry varargs for alert API mock, dedupe yarn.lock duplicates, and fix SecretCrudDialog close timing plus config docs. Signed-off-by: baraka-akeyless <barak.a@akeyless.io> Co-authored-by: Cursor <cursoragent@cursor.com>
awanlin
left a comment
There was a problem hiding this comment.
Nice work @baraka-akeyless, thanks for following up on the various Copilot comments, most of my comments should be pretty easy to address 👍
Add akeyless-common for shared types, default allowCrud to false with stronger docs, mark auth secrets with @visibility secret, replace ambient SDK module declarations with a typed wrapper, bump Backstage to 1.53.0, and align README/frontend system wording with current conventions. Signed-off-by: baraka-akeyless <barak.a@akeyless.io> Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: baraka_akeyless <79786471+baraka-akeyless@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: baraka_akeyless <79786471+baraka-akeyless@users.noreply.github.com>
Reformat the API table after Copilot Autofix and keep only the akeyless workspace entry in set-resolutions.js per maintainer review. Signed-off-by: baraka-akeyless <barak.a@akeyless.io> Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: baraka_akeyless <79786471+baraka-akeyless@users.noreply.github.com>
Include akeylessApi in the listSecrets effect deps, avoid JSON.stringify in dependency arrays, and key EntityAkeylessTable by entity ref so UI state does not leak across catalog entities. Signed-off-by: baraka-akeyless <barak.a@akeyless.io> Co-authored-by: Cursor <cursoragent@cursor.com>
|
@awanlin Thanks for the feedback. |
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: baraka_akeyless <79786471+baraka-akeyless@users.noreply.github.com>
| export function normalizeAnnotatedPath(path: string): string { | ||
| const segments = path.trim().split('/').filter(Boolean); | ||
| return segments.length === 0 ? '/' : `/${segments.join('/')}`; | ||
| } |
| const openViewDialog = useCallback( | ||
| async (secret: AkeylessSecret) => { | ||
| setViewSecret(secret); | ||
| setViewVisible(false); | ||
| setViewValue(undefined); | ||
| setViewLoading(true); | ||
| try { | ||
| const response = await akeylessApi.getStaticSecretValue( | ||
| secret.fullPath, | ||
| secret.path, | ||
| ); | ||
| setViewValue(response.value); | ||
| } catch (viewError) { | ||
| alertApi.post({ | ||
| message: | ||
| viewError instanceof Error | ||
| ? viewError.message | ||
| : 'Failed to load secret value', | ||
| severity: 'error', | ||
| }); | ||
| setViewSecret(undefined); | ||
| } finally { | ||
| setViewLoading(false); | ||
| } | ||
| }, |
| private async getToken(): Promise<string> { | ||
| if (!this.token) { | ||
| this.token = await this.authenticate(); | ||
| } | ||
| return this.token; |
Summary
workspaces/akeylessworkspace with@backstage-community/plugin-akeylessand@backstage-community/plugin-akeyless-backend@baraka-akeylessas CODEOWNERStandalone development repo: https://github.com/akeyless-community/akeyless-backstage-plugin
Test plan
yarn installinworkspaces/akeylessyarn workspace @backstage-community/plugin-akeyless-backend testyarn workspace @backstage-community/plugin-akeyless testyarn workspace @backstage-community/plugin-akeyless-backend lintyarn workspace @backstage-community/plugin-akeyless lintyarn tsc && yarn build:allinworkspaces/akeylessAKEYLESS_*credentials and annotated catalog entityMade with Cursor