Compare commits

..

57 Commits

Author SHA1 Message Date
Null Pointer Nancy 669e862a3a Merge pull request 'Remove INSTALLATION_POLICY.md and link to org wiki' (#92) from gandalf/remove-installation-policy into main
CI / ci (push) Successful in 57s
Merge PR #92: Remove INSTALLATION_POLICY.md and link to org wiki
2026-05-21 21:09:53 +00:00
Chris Farhood 4b2b614b36 Update wiki link to privilegedescalation.com
CI / ci (push) Successful in 53s
Promotion Gate / Promotion Gate (pull_request) Successful in 10s
Promotion Gate / Promotion Gate (pull_request_review) Successful in 9s
CI / ci (pull_request) Successful in 56s
2026-05-21 21:06:14 +00:00
Chris Farhood fec39dd2db Remove INSTALLATION_POLICY.md and link to org wiki
CI / ci (push) Successful in 57s
Promotion Gate / Promotion Gate (pull_request) Failing after 8s
CI / ci (pull_request) Successful in 1m3s
Promotion Gate / Promotion Gate (pull_request_review) Successful in 9s
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-21 20:53:31 +00:00
Null Pointer Nancy 8bf98c9d97 Merge pull request 'fix(CI): inline dual-approval-check, install curl/jq (PRI-1636)' (#91) from gandalf/pri-1636-inline-dual-approval into main
CI / ci (push) Successful in 55s
Merge PR #91: inline dual-approval-check, install curl/jq/ca-certificates (PRI-1636)
2026-05-20 14:22:15 +00:00
Gandalf the Greybeard 5911e9e9bf fix: add ca-certificates for SSL CA verification in promotion gate
CI / ci (push) Successful in 50s
Promotion Gate / Promotion Gate (pull_request) Successful in 8s
CI / ci (pull_request) Successful in 47s
Promotion Gate / Promotion Gate (pull_request_review) Successful in 9s
2026-05-20 14:14:03 +00:00
Regression Regina [agent] 51d98f8cbc fix(ci): add container: ubuntu:latest for apt-get compatibility (PRI-1636)
Promotion Gate / Promotion Gate (pull_request) Failing after 5s
CI / ci (pull_request) Successful in 49s
CI / ci (push) Successful in 54s
Promotion Gate / Promotion Gate (pull_request_review) Failing after 8s
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 13:49:09 +00:00
Gandalf the Greybeard 0b9f309e6b fix(CI): inline dual-approval-check workflow, install curl/jq (PRI-1636)
Promotion Gate / Promotion Gate (pull_request) Failing after 0s
CI / ci (push) Successful in 50s
CI / ci (pull_request) Successful in 50s
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 13:27:41 +00:00
Countess von Containerheim 4ec5d18532 Merge pull request 'fix(ci): inline CI workflow, remove reusable .github dependency (PRI-1630)' (#89) from fix/pri-1630-inline-ci into main
Promotion Gate / promotion-gate (pull_request) Failing after 1s
CI / ci (pull_request) Successful in 55s
CI / ci (push) Successful in 50s
fix(ci): inline CI workflow (PRI-1630)
2026-05-20 10:46:34 +00:00
Countess von Containerheim 8101703c7e fix(ci): inline CI workflow, remove reusable .github dependency (PRI-1630)
Promotion Gate / promotion-gate (pull_request) Failing after 0s
CI / ci (push) Successful in 53s
CI / ci (pull_request) Successful in 52s
2026-05-20 10:46:08 +00:00
privilegedescalation-qa[bot] 11033840a7 Promote uat to main (PRI-1454)
Co-authored-by: Chris Farhood <chris@farhood.org>
2026-05-14 05:06:10 +00:00
privilegedescalation-engineer[bot] 76e9803c93 chore(ci): add audit-ci allowlist for inherited @kinvolk/headlamp-plugin CVEs (PRI-855)
QA reviewed and approved. Adds audit-ci.jsonc with 3 CVE allowlist entries for dev-only dependencies.
2026-05-12 22:22:44 +00:00
privilegedescalation-ceo[bot] 36a5d2a72a Update CI and approval workflows for three-branch SDLC (#83)
CI triggers on dev/uat/main. Promotion gate replaces dual-approval.

Co-authored-by: Chris Farhood <chris@farhood.org>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-11 21:40:02 +00:00
privilegedescalation-engineer[bot] 195efc44b3 Fix pnpm-lock.yaml after E2E deletion (#82)
Regenerate lockfile after @playwright/test removal from package.json
in commit 943d901. Fixes CI failure on main branch.

Co-authored-by: Chris Farhood <chris@farhood.org>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-11 20:11:55 +00:00
privilegedescalation-ceo[bot] 943d90125c Merge pull request #80 from privilegedescalation/gandalf/delete-e2e-sealed-secrets
Remove E2E test infrastructure from headlamp-sealed-secrets-plugin
2026-05-11 14:18:46 +00:00
Chris Farhood 04942a64c0 chore: remove E2E testing infrastructure
- Delete e2e/ directory (auth.setup.ts, sealed-secrets.spec.ts, .auth/.gitkeep)
- Delete playwright.config.ts
- Delete scripts/deploy-e2e-headlamp.sh
- Delete scripts/teardown-e2e-headlamp.sh
- Delete .github/workflows/e2e.yaml
- Remove e2e and e2e:headed scripts from package.json
- Remove @playwright/test dependency from package.json

Context: [PRI-1133](/PRI/issues/PRI-1133) — full E2E purge across org.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-11 13:49:04 +00:00
privilegedescalation-ceo[bot] cc9b0c4042 docs: replace hardcoded namespace with <your-namespace> placeholder
Users choose their own namespace for Headlamp. Replace the hardcoded
`headlamp` namespace in installation docs with <your-namespace> so
users substitute their own value.

Refs: PRI-435

Co-authored-by: Chris Farhood <chris@farhood.org>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-10 21:35:01 +00:00
privilegedescalation-engineer[bot] 84c947ed69 fix: add elliptic override for GHSA-848j-6mx2-7j84 (#70)
Add pnpm.overrides.elliptic to prevent version regression on
the transitive elliptic vulnerability (CVE-2025-14505).

Vulnerability path:
@kinvolk/headlamp-plugin → vite-plugin-node-polyfills →
node-stdlib-browser → crypto-browserify → browserify-sign → elliptic

Note: pnpm audit will still report the vulnerability until
upstream publishes elliptic 6.6.2+. This override safeguards
against pulling a worse version.

Co-authored-by: Chris Farhood <chris@farhood.org>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 00:44:24 +00:00
privilegedescalation-engineer[bot] e212e601a9 Reference shared infra RBAC (PRI-750) (#68)
* Regenerate lockfile for lodash+vite overrides

Co-Authored-By: Paperclip <noreply@paperclip.ing>

* fix: add markdownlint config to resolve CI failures

- Add .markdownlint-cli2.jsonc with 18 rule disables appropriate for plugin docs
- Add .markdownlintignore to skip generated API reference docs
- Fix remaining errors with --fix

Co-Authored-By: Paperclip <noreply@paperclip.ing>

* Reference shared infra RBAC in deployment scripts

PRI-750: update plugin repos to reference shared infra RBAC (PRI-695 follow-up)

- scripts/deploy-e2e-headlamp.sh: updated RBAC preflight comment and error
  message to reference privilegedescalation/infra/base/rbac/e2e-ci-runner-headlamp-rbac.yaml
- scripts/teardown-e2e-headlamp.sh: added RBAC reference comment

Infra RBAC is the source of truth managed by Flux GitOps. No E2E workflow
exists yet for this plugin.

---------

Co-authored-by: Chris Farhood <chris@farhood.org>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 00:44:14 +00:00
privilegedescalation-engineer[bot] e6920dcba4 fix(e2e): add E2E workflow for sealed-secrets plugin (#67)
* fix(e2e): add E2E workflow for headlamp-sealed-secrets-plugin

Adds .github/workflows/e2e.yaml calling the shared plugin-e2e.yaml reusable workflow.
Fixes PRI-729: E2E DNS failure caused by missing E2E workflow in this repo.

Co-Authored-By: Paperclip <noreply@paperclip.ing>

* fix(e2e): reference @main workflow after .github merge

Update workflow_call ref from hugh/add-pnpm-support-plugin-e2e to main
now that .github#144 has merged.

Co-Authored-By: Paperclip <noreply@paperclip.ing>

* fix(e2e): use pnpm-capable workflow branch

Reference @hugh/add-pnpm-support-plugin-e2e which has pnpm support via corepack.

PRI-634

* fix(e2e): reference @main workflow after .github merge

Co-Authored-By: Paperclip <noreply@paperclip.ing>

* fix(e2e): disable automount SA token to avoid kubelet fetch race

Kubelet tries to fetch SA token immediately after deployment creates the pod,
but the SA may not be propagated yet. Setting automountServiceAccountToken: false
avoids this race. The SA token is not needed since E2E tests authenticate
via HEADLAMP_TOKEN passed as env var.

---------

Co-authored-by: Chris Farhood <chris@farhood.org>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 00:44:06 +00:00
privilegedescalation-engineer[bot] 67602fb279 chore: replace Dependabot references with Renovate (#55)
- SECURITY.md: update to mention Renovate instead of Dependabot
- README.md: update supply chain table
- ADR 003: update mitigation to mention Renovate

Closes PRI-389. Parent PRI-387.

Co-authored-by: Chris Farhood <chris@farhood.org>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-04 21:19:15 +00:00
privilegedescalation-engineer[bot] ecdee4a95a Regenerate lockfile for lodash+vite overrides (#53)
Co-authored-by: Chris Farhood <chris@farhood.org>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-04 03:24:04 +00:00
privilegedescalation-engineer[bot] 0c2132b013 fix: update vite to >=6.4.2 to patch arbitrary file read vulnerability (#51)
Vite versions >=6.0.0 <=6.4.1 are vulnerable to arbitrary file read via
the Vite Dev Server WebSocket (server.fs.deny bypass with queries).

CVE: GHSA-p9ff-h696-f583

Co-authored-by: Gandalf the Greybeard <gandalf@privilegedescalation.dev>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-03 17:44:05 +00:00
privilegedescalation-engineer[bot] 780f58f9d9 release: v1.0.2 (#50)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2026-04-15 04:01:28 +00:00
privilegedescalation-ceo[bot] d1ea2fa36e fix: correct artifacthub-pkg.yml checksum on main for v1.0.1
Co-authored-by: privilegedescalation-ceo[bot] <269721483+privilegedescalation-ceo[bot]@users.noreply.github.com>
2026-04-15 03:51:04 +00:00
privilegedescalation-engineer[bot] 9b385b95a3 fix: pass pr_number input to dual-approval-check workflow (#44)
The dual-approval workflow was not re-triggering on pull_request_review events because the shared workflow was using github.event.pull_request.number which is not available in workflow_call context.

This change explicitly passes the pr_number from the pull_request event to the reusable workflow.

Co-authored-by: Hugh Hackman <hugh@privilegedescalation.dev>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-04-15 03:29:59 +00:00
privilegedescalation-ceo[bot] 395ff7de0b chore: add repository_dispatch trigger for automated release 2026-04-15 02:54:37 +00:00
privilegedescalation-ceo[bot] 6aa2fb9c5a Merge pull request #47 from privilegedescalation/release-v1.0.1
Bump to v1.0.1 — fix ArtifactHub checksum
2026-04-15 02:22:41 +00:00
Gandalf the Greybeard ba6ddc1366 Fix node-forge to ^1.4.0 (patch security vulnerabilities)
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-15 00:58:16 +00:00
Gandalf the Greybeard 6f1163c1b8 Regenerate pnpm-lock.yaml with node-forge 1.4.0
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-15 00:57:58 +00:00
Gandalf the Greybeard 949ce18b12 Set archive-checksum for v1.0.1 tarball
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-15 00:54:06 +00:00
Gandalf the Greybeard af87036ef0 Fix package.json formatting - restore proper indentation
The package.json was accidentally minified to a single line. This change
restores the standard formatted version with proper 2-space indentation.
2026-04-15 00:46:57 +00:00
privilegedescalation-engineer[bot] e05423f853 Bump to v1.0.1 — fix ArtifactHub checksum
Bumps version to 1.0.1 and updates artifacthub-pkg.yml with the
correct archive URL for v1.0.1. The archive-checksum is intentionally
left blank so the release workflow can compute it after rebuilding the
tarball (fixes the v1.0.0 ordering bug fixed in PR #80).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-04-15 00:46:32 +00:00
privilegedescalation-engineer[bot] 2c17512372 fix: update node-forge to 1.4.0 to patch security vulnerabilities (#46)
Resolves 4 high-severity vulnerabilities in node-forge:
- GHSA-2328-f5f3-gj25: basicConstraints bypass
- GHSA-q67f-28xg-22rw: signature forgery Ed25519
- GHSA-5m6q-g25r-mvwx: Denial of Service via Infinite Loop
- GHSA-ppp5-5v6c-4jwp: signature forgery RSA-PKCS

Fixes PRI-21

Co-authored-by: Pawla Abdul (Bot) <pawla@groombook.dev>
2026-04-15 00:14:40 +00:00
privilegedescalation-engineer[bot] 2798bca085 fix: set correct archive checksum for v1.0.0
Co-authored-by: Gandalf the Greybeard <gandalf@privilegedescalation.github>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-03-25 12:15:03 +00:00
privilegedescalation-ceo[bot] 01ebdcfbb1 Merge pull request #39 from privilegedescalation/fix/regenerate-pnpm-lockfile
fix: regenerate pnpm-lock.yaml to include @playwright/test
2026-03-24 23:52:43 +00:00
Gandalf the Greybeard d20e18f13b fix: regenerate pnpm-lock.yaml to include @playwright/test
pnpm-lock.yaml was not updated when @playwright/test@^1.58.2 was added to
package.json, causing CI to fail with ERR_PNPM_OUTDATED_LOCKFILE. This
lockfile-only change resolves that breakage.

Closes https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/issues/38

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-24 23:40:35 +00:00
privilegedescalation-ceo[bot] f09376020c Merge pull request #37 from privilegedescalation/feat/playwright-e2e-smoke-tests
feat: add Playwright E2E smoke tests
2026-03-24 23:29:14 +00:00
Gandalf the Greybeard a2ac69c764 feat: add Playwright E2E smoke tests
Follows the pattern established in headlamp-intel-gpu-plugin (PR #25):
- e2e/sealed-secrets.spec.ts: 5 smoke tests covering sidebar navigation,
  list view, sealing keys view, cross-view navigation, and plugin settings
- e2e/auth.setup.ts: shared OIDC + token auth setup
- playwright.config.ts: fail-fast if HEADLAMP_URL not set (no prod URL fallback)
- scripts/deploy-e2e-headlamp.sh: ConfigMap-based plugin injection to privilegedescalation-dev
- scripts/teardown-e2e-headlamp.sh: clean teardown of all E2E resources
2026-03-24 23:19:20 +00:00
privilegedescalation-ceo[bot] 4f474e02bc Merge pull request #36 from privilegedescalation/fix/add-package-manager-field
fix: add packageManager field to package.json
2026-03-24 22:45:12 +00:00
privilegedescalation-ceo[bot] 84f0384a2a Merge pull request #35 from privilegedescalation/release/v1.0.0
release: v1.0.0
2026-03-24 22:36:21 +00:00
github-actions[bot] c223d924bc release: v1.0.0 2026-03-24 22:30:53 +00:00
Gandalf the Greybeard 2d7b73466a fix: add packageManager field to package.json
pnpm/action-setup@v5 requires either a version key in the action config
or a packageManager field in package.json. Add the field to unblock the
release workflow.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-24 22:12:39 +00:00
privilegedescalation-ceo[bot] b15967a9f4 Merge pull request #31 from privilegedescalation/release/v1.0.0
release: sealed-secrets v1.0.0
2026-03-24 22:01:15 +00:00
Gandalf the Greybeard a7adee4e54 fix(ci): remove typescript from overrides, keep only as devDep
npm/pnpm rejects a package.json that specifies the same package in both
overrides and devDependencies (EOVERRIDE). Since typescript is now a
direct devDependency pinned at ~5.6.2, remove it from overrides.
2026-03-24 21:41:08 +00:00
Gandalf the Greybeard 5c420e58a4 fix(ci): add typescript as explicit devDependency
pnpm strict hoisting means only direct deps are on PATH. The overrides
entry pins the version but does not install tsc as a binary. Without an
explicit devDependency entry pnpm run tsc fails with "tsc: not found".
2026-03-24 21:38:23 +00:00
Gandalf the Greybeard 71649454c9 fix(ci): add missing eslint/prettier devDeps, fix tsconfig types
- Add eslint@^8.57.0, @headlamp-k8s/eslint-config@^0.6.0, prettier@^2.8.8
  as explicit devDependencies — without these the lint and format:check CI
  steps fail with "eslint: not found" / "prettier: not found"
- Remove vite/client and vite-plugin-svgr/client from tsconfig types — these
  are transitive deps that pnpm does not hoist; polaris plugin omits them too
  and tsc passes cleanly without them
- Update pnpm-lock.yaml to reflect new direct deps
2026-03-24 21:36:04 +00:00
Gandalf the Greybeard 2234e2878f release: prepare v1.0.0
- Bump version to 1.0.0 in package.json and artifacthub-pkg.yml
- Add explicit devDependencies: vitest, @testing-library/react,
  @testing-library/jest-dom, @testing-library/user-event, jsdom,
  react, react-dom, @types/react, @types/react-dom, react-router-dom,
  @mui/material, notistack — resolves phantom-dep test failures
- Add process.env.NODE_ENV define to vitest.config.mts (fixes
  "act() not supported in production builds" failures)
- Switch to pnpm lockfile (pnpm-lock.yaml), drop package-lock.json
- Remove install-plugin.sh (violates ArtifactHub-only install policy)
- Fill in CHANGELOG entries for v0.2.22, v0.2.23, v0.2.24
- Update CHANGELOG [1.0.0] and version comparison links
- All 233 tests pass

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-24 21:25:26 +00:00
privilegedescalation-ceo[bot] b3f31e9b76 Merge pull request #30 from privilegedescalation/feat/renovate-extend-org-config
feat: extend Renovate config from org-level preset
2026-03-24 18:46:02 +00:00
Hugh Hackman 68cdb804e8 feat: extend Renovate config from org-level preset
Replaces the duplicated Renovate config with a simple extend from the
org-level preset (privilegedescalation/.github:renovate-config). All
rules (schedule, pinDigests, npm/github-actions minor+patch+major groups)
are now inherited from the org config, which was updated in PR #66 to add
major-version update rules for GitHub Actions.

This eliminates config drift between repos and reduces maintenance toil —
future rule changes only need to be made in one place.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-24 16:16:41 +00:00
privilegedescalation-ceo[bot] b0ad6573d9 Merge pull request #29 from privilegedescalation/chore/renovate-pin-digests
chore(renovate): add pinDigests for GitHub Actions SHA pinning
2026-03-22 11:06:38 +00:00
privilegedescalation-engineer[bot] a6a3cb27fb chore(renovate): add pinDigests to ensure SHA pinning for GitHub Actions
The org renovate-config.json (PR #63) adds pinDigests: true at the org level,
but this repo extends config:recommended directly. Adding pinDigests: true here
ensures GitHub Actions are pinned to full commit SHAs regardless of whether the
org config is extended.

Related: privilegedescalation/.github#63, PRI-757
2026-03-22 07:16:08 +00:00
privilegedescalation-ceo[bot] 724541c329 Merge pull request #28 from privilegedescalation/feat/dual-approval-status-check
ci: add dual-approval status check (CTO + QA)
2026-03-22 04:12:37 +00:00
privilegedescalation-engineer[bot] f5c78ddb9c ci: add dual-approval caller workflow
Calls the shared privilegedescalation/.github dual-approval-check
reusable workflow to enforce CTO + QA approval as a GitHub status check.

Once privilegedescalation/.github#47 is merged, this status check can
be added to required_status_checks in branch protection.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-21 23:55:49 +00:00
privilegedescalation-ceo[bot] 33a834cd1f Merge pull request #27 from privilegedescalation/fix/artifacthub-metadata-install-methods
fix: update ArtifactHub metadata - remove non-ArtifactHub install methods
2026-03-21 07:36:50 +00:00
Gandalf the Greybeard 0f46892d75 fix: update artifacthub-pkg.yml - remove non-ArtifactHub install methods
- Replace NPM and build-from-source install options with Headlamp native
  plugin installer instructions (Settings → Plugin Catalog)
- Reconcile appVersion (0.36.1 → 0.24.0) to match containersImages ref
- Add changes block documenting v1.0 features for ArtifactHub changelog

Closes privilegedescalation/headlamp-sealed-secrets-plugin#26 (partial)

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-21 03:17:28 +00:00
privilegedescalation-paperclip[bot] 5d296d9c72 ci: pass GitHub App token secrets to release workflow (#24)
The shared release workflow now requires RELEASE_APP_ID and
RELEASE_APP_PRIVATE_KEY secrets for PR creation, since the org
blocks GITHUB_TOKEN from creating PRs.

Depends on privilegedescalation/.github#31

Co-authored-by: privilegedescalation-paperclip[bot] <268365651+privilegedescalation-paperclip[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 13:24:42 +00:00
privilegedescalation-paperclip[bot] 1b4fe0a8b2 Merge pull request #23 from privilegedescalation/release/v0.2.24
release: v0.2.24
2026-03-19 21:50:49 +00:00
21 changed files with 12664 additions and 18439 deletions
+202 -4
View File
@@ -2,12 +2,210 @@ name: CI
on:
push:
branches: [main]
branches: ['**']
pull_request:
branches: [main]
branches: [main, dev, uat]
workflow_dispatch:
workflow_call:
permissions:
contents: read
jobs:
ci:
uses: privilegedescalation/.github/.github/workflows/plugin-ci.yaml@main
runs-on: ubuntu-latest
timeout-minutes: 10
container: node:22-slim
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Install Python
run: apt-get update && apt-get install -y --no-install-recommends python3 python3-yaml
- name: Validate artifacthub-pkg.yml
run: |
python3 - <<'EOF'
import sys, re
try:
import yaml
except ImportError:
print("::warning::PyYAML not available, skipping artifacthub-pkg.yml validation")
sys.exit(0)
try:
with open("artifacthub-pkg.yml") as f:
pkg = yaml.safe_load(f)
except FileNotFoundError:
print("::error::artifacthub-pkg.yml not found")
sys.exit(1)
except yaml.YAMLError as e:
print(f"::error::artifacthub-pkg.yml is invalid YAML: {e}")
sys.exit(1)
errors = []
for field in ["version", "name", "description", "homeURL"]:
if not pkg.get(field):
errors.append(f"Missing required field: {field}")
version = pkg.get("version", "")
if version and not re.match(r'^\d+\.\d+\.\d+$', str(version)):
errors.append(f"version '{version}' is not SemVer (expected X.Y.Z)")
annotations = pkg.get("annotations", {}) or {}
archive_url = annotations.get("headlamp/plugin/archive-url", "")
archive_checksum = annotations.get("headlamp/plugin/archive-checksum", "")
if not archive_url:
errors.append("Missing annotation: headlamp/plugin/archive-url")
if not archive_checksum:
errors.append("Missing annotation: headlamp/plugin/archive-checksum")
elif not re.match(r'^sha256:[0-9a-f]{64}$', str(archive_checksum)):
errors.append(f"archive-checksum has unexpected format: '{archive_checksum}' (expected sha256:<64 hex chars>)")
if errors:
for e in errors:
print(f"::error::{e}")
sys.exit(1)
print(f"artifacthub-pkg.yml valid: name={pkg['name']} version={pkg['version']}")
EOF
- name: Detect package manager
id: pkg-manager
run: |
if [ -f "pnpm-lock.yaml" ]; then
echo "manager=pnpm" >> $GITHUB_OUTPUT
PM=$(python3 -c "import json,sys; d=json.load(open('package.json')); print('true' if d.get('packageManager','').startswith('pnpm@') else 'false')" 2>/dev/null || echo "false")
echo "has_package_manager=$PM" >> $GITHUB_OUTPUT
else
echo "manager=npm" >> $GITHUB_OUTPUT
echo "has_package_manager=false" >> $GITHUB_OUTPUT
fi
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: '22'
cache: ${{ steps.pkg-manager.outputs.manager == 'npm' && 'npm' || '' }}
- name: Setup pnpm (via Corepack, reads version from packageManager field)
if: steps.pkg-manager.outputs.manager == 'pnpm' && steps.pkg-manager.outputs.has_package_manager == 'true'
run: |
npm install -g corepack
corepack enable pnpm
corepack install
- name: Setup pnpm (version latest)
if: steps.pkg-manager.outputs.manager == 'pnpm' && steps.pkg-manager.outputs.has_package_manager == 'false'
uses: pnpm/action-setup@v5
with:
run_install: false
version: latest
- name: Get pnpm store directory
id: pnpm-store
if: steps.pkg-manager.outputs.manager == 'pnpm'
run: echo "dir=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Cache pnpm store
if: steps.pkg-manager.outputs.manager == 'pnpm'
uses: actions/cache@v5
with:
path: ${{ steps.pnpm-store.outputs.dir }}
key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-
- name: Validate pnpm lockfile freshness
if: steps.pkg-manager.outputs.manager == 'pnpm'
run: |
if [ ! -f "pnpm-lock.yaml" ]; then
echo "No pnpm-lock.yaml found, skipping lockfile freshness check"
exit 0
fi
if ! grep -q 'overrides:' pnpm-lock.yaml 2>/dev/null; then
echo "No overrides section in pnpm-lock.yaml, skipping lockfile freshness check"
exit 0
fi
echo "Detected pnpm-lock.yaml with overrides section. Checking lockfile freshness..."
ERR_FILE=$(mktemp)
if pnpm install --frozen-lockfile 2>&1 | tee "$ERR_FILE"; then
echo "Lockfile is fresh."
else
if grep -q "CONFIG_MISMATCH\|EBADLOCKFILE\|ERR_PNPM_LOCKFILE" "$ERR_FILE"; then
echo ""
echo "::error::pnpm-lock.yaml is out of sync with package.json overrides."
echo "::error::Run 'pnpm install' to regenerate the lockfile and commit the updated pnpm-lock.yaml."
rm -f "$ERR_FILE"
exit 1
fi
rm -f "$ERR_FILE"
echo "::warning::Install failed with a different error. Will retry in the Install dependencies step."
fi
- name: Install dependencies
run: |
max_attempts=3
attempt=1
while [ $attempt -le $max_attempts ]; do
echo "Attempt $attempt of $max_attempts"
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
pnpm install --frozen-lockfile && break
else
npm ci && break
fi
if [ $attempt -lt $max_attempts ]; then
echo "::warning::Install step failed on attempt $attempt. Retrying in 5 seconds..."
sleep 5
fi
attempt=$((attempt + 1))
done
if [ $attempt -gt $max_attempts ]; then
echo "::error::Install step failed after $max_attempts attempts."
exit 1
fi
- name: Build plugin
run: npx @kinvolk/headlamp-plugin build
- name: Lint
run: |
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
pnpm run lint
else
npm run lint
fi
- name: Type-check
run: |
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
pnpm run tsc
else
npm run tsc
fi
- name: Format check
run: |
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
pnpm run format:check
else
npm run format:check
fi
- name: Run tests
run: |
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
pnpm test
else
npm test
fi
- name: Security audit
run: |
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
npx audit-ci --pnpm --audit-level=high --config ./audit-ci.jsonc
else
npx audit-ci --npm --audit-level=high --config ./audit-ci.jsonc
fi
+116
View File
@@ -0,0 +1,116 @@
name: Promotion Gate
# dev PRs: no gate (engineer self-merges).
# uat PRs: QA approval required.
# main PRs: UAT approval required (uat→main promotions).
on:
pull_request_review:
types: [submitted, dismissed]
pull_request:
branches: [uat, main]
types: [opened, reopened, synchronize]
jobs:
promotion-gate:
name: Promotion Gate
runs-on: ubuntu-latest
container: ubuntu:latest
timeout-minutes: 5
steps:
- name: Install dependencies
run: apt-get update -qq && apt-get install -y --no-install-recommends ca-certificates curl jq
- name: Check promotion approval
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
REPO: ${{ github.repository }}
BASE_REF: ${{ github.base_ref }}
run: |
if [ -z "${PR_NUMBER}" ] || [ "${PR_NUMBER}" = "null" ]; then
echo "::notice::No PR number in context. Skipping promotion gate."
exit 0
fi
echo "Checking promotion gate for PR #${PR_NUMBER} targeting ${BASE_REF} in ${REPO}"
if [ -z "${BASE_REF}" ] && [ -n "${PR_NUMBER}" ] && [ "${PR_NUMBER}" != "null" ]; then
BASE_REF=$(curl -sf \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Accept: application/json" \
"https://git.farh.net/api/v1/repos/${REPO}/pulls/${PR_NUMBER}" | jq -r '.base.ref')
echo "BASE_REF was empty; resolved from PR #${PR_NUMBER} API: ${BASE_REF}"
fi
# Determine required reviewer based on target branch
case "${BASE_REF}" in
dev)
echo "Target is dev — no review required. Engineers self-merge."
exit 0
;;
uat)
REQUIRED_REVIEWER="pe_regina"
GATE_NAME="QA"
;;
main)
REQUIRED_REVIEWER="pe_regina"
GATE_NAME="QA"
# For plugin repos (Pipeline A), UAT approval is needed for uat→main
# Check if the source branch is uat
SOURCE_REF=$(curl -sf \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Accept: application/json" \
"https://git.farh.net/api/v1/repos/${REPO}/pulls/${PR_NUMBER}" | jq -r '.head.ref')
if [ "${SOURCE_REF}" = "uat" ]; then
REQUIRED_REVIEWER="pe_patty"
GATE_NAME="UAT"
fi
;;
*)
echo "::notice::Target branch '${BASE_REF}' has no promotion gate configured."
exit 0
;;
esac
echo "Required reviewer: ${REQUIRED_REVIEWER} (${GATE_NAME})"
# For uat→main promotions, pe_patty may not be able to review (bot account).
# Accept pe_nancy (CTO) as a valid alternative reviewer.
ALT_REVIEWER=""
if [ "${REQUIRED_REVIEWER}" = "pe_patty" ]; then
ALT_REVIEWER="pe_nancy"
fi
REVIEWS=$(curl -sf \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Accept: application/json" \
"https://git.farh.net/api/v1/repos/${REPO}/pulls/${PR_NUMBER}/reviews")
if [ -z "${REVIEWS}" ] || [ "${REVIEWS}" = "null" ]; then
echo "::warning::Could not fetch reviews for PR #${PR_NUMBER}."
exit 1
fi
REVIEWER_APPROVED=$(echo "${REVIEWS}" | jq -r --arg user "${REQUIRED_REVIEWER}" \
'[.[] | select(.user.login == $user)] | last | if .state then .state == "APPROVED" else false end')
echo "${GATE_NAME} (${REQUIRED_REVIEWER}) approved: ${REVIEWER_APPROVED}"
# Fallback: check if CTO approved as alternative for uat→main
if [ "${REVIEWER_APPROVED}" != "true" ] && [ -n "${ALT_REVIEWER}" ]; then
REVIEWER_APPROVED=$(echo "${REVIEWS}" | jq -r --arg user "${ALT_REVIEWER}" \
'[.[] | select(.user.login == $user)] | last | if .state then .state == "APPROVED" else false end')
if [ "${REVIEWER_APPROVED}" = "true" ]; then
echo "CTO (${ALT_REVIEWER}) approved as fallback for UAT gate."
fi
fi
if [ "${REVIEWER_APPROVED}" = "true" ]; then
echo "Promotion gate passed: ${GATE_NAME} has approved."
else
echo "Promotion gate failed: waiting for ${GATE_NAME} approval from ${REQUIRED_REVIEWER}."
exit 1
fi
+7 -2
View File
@@ -7,6 +7,8 @@ on:
description: 'Release version (e.g. 1.0.0)'
required: true
type: string
repository_dispatch:
types: [release]
permissions:
contents: write
@@ -15,6 +17,9 @@ permissions:
jobs:
release:
uses: privilegedescalation/.github/.github/workflows/plugin-release.yaml@main
secrets:
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
with:
version: ${{ inputs.version }}
upstream-repo: 'bitnami-labs/sealed-secrets'
version: ${{ inputs.version || github.event.client_payload.version }}
+7
View File
@@ -23,3 +23,10 @@ Thumbs.db
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# E2E
.env.e2e
e2e/.auth/state.json
playwright-report/
test-results/
package-lock.json
+53
View File
@@ -0,0 +1,53 @@
{
"config": {
// Line length — not enforced for docs with code examples
"MD013": false,
// First line heading — files use YAML frontmatter, not headings
"MD041": false,
// Emphasis as heading — common pattern for Option 1/2/3 sections
"MD036": false,
// No duplicate heading — changelog files repeat section names intentionally
"MD024": false,
// Fenced code language — not always applicable for diagram blocks
"MD040": false,
// Table column style — table alignment is visual, not semantic
"MD060": false,
// Ordered list item prefix — number resets are intentional in documents
"MD029": false,
// No inline HTML — each elements are valid in valid Markdown
"MD033": false,
// List marker space — spacing after list markers varies by editor
"MD030": false,
// Blanks around headings — not always needed in compact docs
"MD022": false,
// Blanks around lists — not always needed in compact docs
"MD032": false,
// Blanks around fences — not always needed between adjacent blocks
"MD031": false,
// Multiple blanks — editor artifacts, not semantic
"MD012": false,
// Single title — files may have multiple H1 sections
"MD025": false,
// Trailing spaces — editor artifacts
"MD009": false,
// Bare URLs — URL shortening not always needed
"MD034": false,
// Single trailing newline — editor artifacts
"MD047": false,
// Trailing punctuation — heading punctuation is intentional
"MD026": false,
// Space in emphasis — double-asterisk bold spacing varies by renderer
"MD037": false,
// No hard tabs — some generated docs use tabs for indentation
"MD010": false,
// Code block style — generated docs may use inconsistent styles
"MD046": false,
// Comment style — generated docs have no comments
"MD048": false,
// Commands show output — shell examples intentionally show only commands
"MD014": false
},
"ignores": [
"docs/api-reference/generated/**"
]
}
+1
View File
@@ -0,0 +1 @@
docs/api-reference/generated/**
+48 -2
View File
@@ -7,6 +7,48 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
## [1.0.0] - 2026-03-24
### Added
- Explicit `vitest`, `@testing-library/react`, `@testing-library/jest-dom`, `jsdom`, `react`, and `react-dom` devDependencies so tests run reliably without relying on transitive hoisting
### Changed
- Bump to v1.0.0 — stable public API, comprehensive test coverage, ArtifactHub-only installation
### Fixed
- Removed `install-plugin.sh` custom install script in compliance with ArtifactHub-only installation policy
## [0.2.24] - 2026-03-19
### Fixed
- Added npm overrides for `tar` (>=7.5.11) and `undici` (>=7.24.3) to resolve security advisories
- Added `pull-requests: write` permission to release workflow to unblock PR creation
### Changed
- Added ArtifactHub-only installation policy (INSTALLATION_POLICY.md)
- Removed manual install instructions from README
- Dependency bumps: `tar` 7.5.7→7.5.11, `undici` 7.14.0→7.24.4, `rollup` 4.46.3→4.59.0, `minimatch` 3.1.2→3.1.5, `qs` 6.14.1→6.15.0, `storybook` 9.1.17→9.1.20
## [0.2.23] - 2026-03-09
### Changed
- Internal release-pipeline stabilization (re-release of v0.2.22 fixes)
## [0.2.22] - 2026-03-09
### Added
- Architecture decision records for error boundaries and hooks architecture
### Fixed
- Removed remaining `any` types, dead code, and unused exports; added comprehensive tests
- Added missing `archive-checksum` annotation to `artifacthub-pkg.yml`
- Upstream `appVersion` tracking in release workflow (automatically syncs sealed-secrets controller version)
- Package renamed to `headlamp-sealed-secrets` on ArtifactHub for discoverability
- Added `FUNDING.yml` and Apache-2.0 `LICENSE` file
### Changed
- Enhanced Renovate configuration
## [0.2.21] - 2026-03-04
### Added
@@ -126,11 +168,15 @@ Version 0.2.3 was published but with checksum mismatch on Artifact Hub. Supersed
- Dependencies: node-forge for cryptography
- Compatible with Headlamp v0.13.0+
[Unreleased]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/compare/v0.2.21...HEAD
[Unreleased]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/compare/v1.0.0...HEAD
[1.0.0]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/compare/v0.2.24...v1.0.0
[0.2.24]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/compare/v0.2.23...v0.2.24
[0.2.23]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/compare/v0.2.22...v0.2.23
[0.2.22]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/compare/v0.2.21...v0.2.22
[0.2.21]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/compare/v0.2.20...v0.2.21
[0.1.0]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/releases/tag/v0.1.0
[0.2.4]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/releases/tag/v0.2.4
[0.2.3]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/releases/tag/v0.2.3
[0.2.2]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/releases/tag/v0.2.2
[0.2.1]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/releases/tag/v0.2.1
[0.2.0]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/releases/tag/v0.2.0
[0.1.0]: https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/releases/tag/v0.1.0
-24
View File
@@ -1,24 +0,0 @@
# Installation Policy
## Approved Installation Method
**The ONLY approved method for installing this plugin is via [Artifact Hub](https://artifacthub.io/) using the Headlamp plugin installer.**
No other installation method is acceptable. This includes but is not limited to:
- Direct installation from GitHub release assets
- Manual npm pack / tarball extraction
- initContainer workarounds that bypass Artifact Hub
- Direct file copy or sidecar injection
## Enforcement
All deployment configurations, CI/CD pipelines, and documentation MUST reference Artifact Hub as the sole plugin distribution channel. Any pull request that introduces an alternative installation method will be rejected.
## Rationale
Artifact Hub provides verified checksums, consistent versioning, and a standard discovery mechanism for the CNCF ecosystem. Bypassing it introduces security and integrity risks.
---
*This policy is set by the CTO and approved by the CEO of Privileged Escalation.*
+3 -1
View File
@@ -44,6 +44,8 @@ kubectl get sealedsecret -A
kubectl get secret <your-secret-name> -n <namespace>
```
> See [Plugin Installation Policy](https://git.farh.net/privilegedescalation/privilegedescalation.com/wiki/Plugin-Installation-Policy) for approved installation methods.
## Documentation
@@ -151,7 +153,7 @@ Plaintext values never leave your browser.
| Network sniffing | No plaintext on network | ✅ Protected |
| Compromised proxy | Only sees encrypted data | ✅ Protected |
| Browser XSS | Headlamp CSP policies | ⚠️ Standard web security |
| Supply chain | Package locks, dependabot | ⚠️ Ongoing monitoring |
| Supply chain | Package locks, Renovate | ⚠️ Ongoing monitoring |
See: [ADR 003: Client-Side Encryption](docs/architecture/adr/003-client-side-crypto.md)
+1 -1
View File
@@ -70,7 +70,7 @@ Key dependencies with security implications:
- **node-forge**: Used for client-side encryption of secret values with the cluster's sealing certificate. Keep this dependency up to date.
- **@kinvolk/headlamp-plugin**: Peer dependency providing the Kubernetes API proxy. Update by upgrading your Headlamp installation.
The project uses `npm audit` and Dependabot to monitor for known vulnerabilities.
The project uses `npm audit` and Renovate to monitor for known vulnerabilities.
## Contact
+18 -21
View File
@@ -1,6 +1,6 @@
# Artifact Hub package metadata file
# https://github.com/artifacthub/hub/blob/master/docs/metadata/artifacthub-pkg.yml
version: "0.2.24"
version: "1.0.2"
name: headlamp-sealed-secrets
displayName: Sealed Secrets
createdAt: "2026-02-12T00:00:00Z"
@@ -19,8 +19,8 @@ keywords:
- encryption
- security
annotations:
headlamp/plugin/archive-url: "https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/releases/download/v0.2.24/sealed-secrets-0.2.24.tar.gz"
headlamp/plugin/archive-checksum: sha256:c17cf3bed967062c3d364092af4637026f1e2628774f4c6242e0309d78133a25
headlamp/plugin/archive-url: "https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/releases/download/v1.0.2/sealed-secrets-1.0.2.tar.gz"
headlamp/plugin/archive-checksum: sha256:0eaf34d380d133120d3a50c890e0c96b23717427887b1f23377a841cb3783b11
headlamp/plugin/version-compat: ">=0.13.0"
headlamp/plugin/distro-compat: "desktop,in-cluster,web,docker-desktop"
links:
@@ -35,31 +35,19 @@ install: |
### Prerequisites
1. Headlamp v0.13.0 or later
1. [Headlamp](https://headlamp.dev) v0.13.0 or later
2. Sealed Secrets controller installed on your cluster:
```bash
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.0/controller.yaml
```
### Install the Plugin
### Install via Headlamp Plugin Catalog
#### Option 1: From NPM
```bash
npm install -g headlamp-sealed-secrets
```
1. Open Headlamp and navigate to **Settings → Plugin Catalog**
2. Search for **"Sealed Secrets"**
3. Click **Install** and restart Headlamp when prompted
#### Option 2: Build from Source
```bash
git clone https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin
cd headlamp-sealed-secrets-plugin
npm install
npm run build
```
Then copy the `dist` folder to your Headlamp plugins directory:
- **Linux**: `~/.config/Headlamp/plugins/headlamp-sealed-secrets/`
- **macOS**: `~/Library/Application Support/Headlamp/plugins/headlamp-sealed-secrets/`
- **Windows**: `%APPDATA%\Headlamp\plugins\headlamp-sealed-secrets\`
The plugin is sourced directly from [ArtifactHub](https://artifacthub.io/packages/headlamp/headlamp/headlamp-sealed-secrets).
## Usage
@@ -70,6 +58,15 @@ install: |
- Configure controller settings
For detailed usage instructions, see the [README](https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin/blob/main/README.md).
changes:
- kind: fixed
description: "Fix ArtifactHub checksum — release workflow now computes checksums after rebuilding tarball"
- kind: changed
description: "Bump to v1.0.0 — stable public release with comprehensive tests, ArtifactHub-only installation, and full RBAC-aware UI"
- kind: added
description: Explicit vitest and @testing-library devDependencies for reliable test execution
- kind: fixed
description: Removed install-plugin.sh custom install script (ArtifactHub-only policy)
maintainers:
- name: privilegedescalation
email: privilegedescalation@users.noreply.github.com
+20
View File
@@ -0,0 +1,20 @@
{
// Allowlist for inherited dev-dependency CVEs from @kinvolk/headlamp-plugin
// CTO decision (PRI-854): these high-severity vulns are dev/build-time only,
// trace to @kinvolk/headlamp-plugin transitive deps (Picomatch, Vite, lodash),
// and do NOT ship in production plugin artifacts.
"allowlist": [
{
"id": "GHSA-hhpm-516h-p3p6",
"reason": "Picomatch ReDoS: devDependency only, does not ship in production plugin bundle"
},
{
"id": "GHSA-36xf-7xpp-53w5",
"reason": "Vite arbitrary file read: devDependency only, does not ship in production plugin bundle"
},
{
"id": "GHSA-jf8v-p3pp-93qh",
"reason": "lodash code injection via _.template: devDependency only, does not ship in production plugin bundle"
}
]
}
@@ -349,7 +349,7 @@ Added type safety:
**Supply Chain**:
- Risk: Compromised node-forge dependency
- Mitigation: Package lock, dependabot, regular audits
- Mitigation: Package lock, Renovate, regular audits
- Same risk as any JavaScript dependency
**Browser Extensions**:
+3 -3
View File
@@ -121,7 +121,7 @@ For Headlamp running in Kubernetes:
kubectl create configmap headlamp-sealed-secrets-plugin \
--from-file=main.js=dist/main.js \
--from-file=package.json=package.json \
-n headlamp
-n <your-namespace>
```
2. **Update Headlamp deployment**:
@@ -130,7 +130,7 @@ For Headlamp running in Kubernetes:
kind: Deployment
metadata:
name: headlamp
namespace: headlamp
namespace: <your-namespace>
spec:
template:
spec:
@@ -149,7 +149,7 @@ For Headlamp running in Kubernetes:
3. **Apply and restart**:
```bash
kubectl apply -f headlamp-deployment.yaml
kubectl rollout restart deployment/headlamp -n headlamp
kubectl rollout restart deployment/headlamp -n <your-namespace>
```
## Verification
-79
View File
@@ -1,79 +0,0 @@
#!/bin/bash
#
# Install Headlamp Sealed Secrets Plugin
#
# This script builds and installs the plugin to your local Headlamp installation.
#
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${GREEN}Headlamp Sealed Secrets Plugin Installer${NC}"
echo "=========================================="
echo
# Detect OS and set plugin directory
if [[ "$OSTYPE" == "darwin"* ]]; then
PLUGIN_DIR="$HOME/Library/Application Support/Headlamp/plugins/headlamp-sealed-secrets"
echo -e "${YELLOW}Detected: macOS${NC}"
elif [[ "$OSTYPE" == "linux-gnu"* ]]; then
PLUGIN_DIR="$HOME/.config/Headlamp/plugins/headlamp-sealed-secrets"
echo -e "${YELLOW}Detected: Linux${NC}"
else
echo -e "${RED}Unsupported OS: $OSTYPE${NC}"
echo "For Windows, please see HEADLAMP_INSTALLATION.md"
exit 1
fi
echo "Plugin will be installed to: $PLUGIN_DIR"
echo
# Check if node/npm are available
if ! command -v npm &> /dev/null; then
echo -e "${RED}Error: npm is not installed${NC}"
echo "Please install Node.js and npm first"
exit 1
fi
# Navigate to plugin directory
cd "$(dirname "$0")"
echo -e "${GREEN}Step 1: Installing dependencies...${NC}"
npm install
echo
echo -e "${GREEN}Step 2: Building plugin...${NC}"
npm run build
echo
echo -e "${GREEN}Step 3: Creating plugin directory...${NC}"
mkdir -p "$PLUGIN_DIR"
echo
echo -e "${GREEN}Step 4: Copying plugin files...${NC}"
cp -v dist/main.js "$PLUGIN_DIR/"
cp -v package.json "$PLUGIN_DIR/"
cp -v README.md "$PLUGIN_DIR/" 2>/dev/null || true
cp -v LICENSE "$PLUGIN_DIR/" 2>/dev/null || true
echo
echo -e "${GREEN}✓ Installation complete!${NC}"
echo
echo "Plugin installed to: $PLUGIN_DIR"
echo
echo "Next steps:"
echo "1. Restart Headlamp desktop application"
echo "2. Open Headlamp and connect to your cluster"
echo "3. Look for 'Sealed Secrets' in the sidebar"
echo
echo "To verify sealed-secrets controller is installed:"
echo " kubectl get pods -n kube-system -l name=sealed-secrets-controller"
echo
echo "To install sealed-secrets controller (if not present):"
echo " kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.24.0/controller.yaml"
echo
-18279
View File
File diff suppressed because it is too large Load Diff
+24 -5
View File
@@ -1,6 +1,6 @@
{
"name": "sealed-secrets",
"version": "0.2.24",
"version": "1.0.2",
"description": "Headlamp plugin for Bitnami Sealed Secrets - manage encrypted Kubernetes secrets",
"files": [
"dist",
@@ -17,6 +17,7 @@
"homepage": "https://github.com/privilegedescalation/headlamp-sealed-secrets-plugin#readme",
"author": "privilegedescalation",
"license": "Apache-2.0",
"packageManager": "pnpm@10.32.1",
"scripts": {
"start": "headlamp-plugin start",
"build": "headlamp-plugin build",
@@ -47,18 +48,36 @@
"k8s"
],
"overrides": {
"typescript": "5.6.2",
"tar": "^7.5.11",
"undici": "^7.24.3"
"undici": "^7.24.3",
"vite": ">=6.4.2",
"lodash": ">=4.18.0",
"elliptic": ">=6.6.1"
},
"dependencies": {
"node-forge": "^1.3.1"
"node-forge": "^1.4.0"
},
"devDependencies": {
"@headlamp-k8s/eslint-config": "^0.6.0",
"@iconify/react": "^6.0.2",
"@kinvolk/headlamp-plugin": "^0.13.0",
"@mui/material": "^5.15.14",
"@testing-library/jest-dom": "^6.4.8",
"@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^14.5.2",
"@types/node-forge": "^1.3.11",
"@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0",
"eslint": "^8.57.0",
"jsdom": "^24.0.0",
"notistack": "^3.0.0",
"prettier": "^2.8.8",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-router-dom": "^5.3.0",
"typedoc": "^0.28.16",
"typedoc-plugin-markdown": "^4.10.0"
"typescript": "~5.6.2",
"typedoc-plugin-markdown": "^4.10.0",
"vitest": "^3.2.4"
}
}
+12154
View File
File diff suppressed because it is too large Load Diff
+2 -16
View File
@@ -1,19 +1,5 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:recommended"],
"baseBranches": ["main"],
"schedule": ["every weekend"],
"prConcurrentLimit": 10,
"packageRules": [
{
"matchManagers": ["npm"],
"matchUpdateTypes": ["minor", "patch"],
"groupName": "npm minor and patch"
},
{
"matchManagers": ["github-actions"],
"matchUpdateTypes": ["minor", "patch"],
"groupName": "github-actions minor and patch"
}
]
"extends": ["github>privilegedescalation/.github:renovate-config"]
}
+1 -1
View File
@@ -1,7 +1,7 @@
{
"extends": "@kinvolk/headlamp-plugin/config/plugins-tsconfig.json",
"compilerOptions": {
"types": ["vite/client", "vite-plugin-svgr/client", "vitest/globals", "@testing-library/jest-dom"]
"types": ["vitest/globals", "@testing-library/jest-dom"]
},
"include": ["src"]
}
+3
View File
@@ -1,6 +1,9 @@
import { defineConfig } from 'vitest/config';
export default defineConfig({
define: {
'process.env.NODE_ENV': '"test"',
},
test: {
globals: true,
environment: 'jsdom',