171 Commits

Author SHA1 Message Date
rcourtman
ce69096dfe Improve issue triage with version-aware automation 2026-02-08 19:28:56 +00:00
rcourtman
b501820899 fix: use $HOME for cookie file in demo server workflow
The /tmp directory on the demo server isn't writable by the relay
user, causing the verification step's cookie file to silently fail.
This meant the /api/state request had no session cookie and returned
401, making the node count check report 0 nodes.

Use $HOME instead of /tmp for the cookie file path.
2026-02-04 17:58:05 +00:00
rcourtman
ac9003d105 fix: build pulse:test Docker image for integration tests
The docker-compose test stack expects a pulse:test image. Build it
from the Dockerfile before running docker compose.
2026-02-04 17:13:17 +00:00
rcourtman
04dbfa6329 fix: use docker compose plugin instead of standalone docker-compose
GitHub Actions runners no longer include the standalone docker-compose
binary. Use the docker compose plugin syntax instead.
2026-02-04 17:08:56 +00:00
rcourtman
cae9ed7332 fix: skip frontend rebuild in integration test job
The integration_tests job restores the pre-built frontend dist from
cache and copies it to the embed location, but then runs make build
which unconditionally rebuilds the frontend via npm — failing because
node_modules aren't installed. Use go build directly since the
frontend is already embedded.
2026-02-04 17:04:56 +00:00
rcourtman
e1e70fd78b Fix build workflow: remove obsolete pulse-sensor-proxy step
The cmd/pulse-sensor-proxy directory was removed in a previous refactor
but the workflow still referenced it, causing build failures.
2026-02-04 13:58:45 +00:00
rcourtman
07afa94d19 feat(security): add gitleaks secret scanning to pre-commit hook and CI
Add three layers of secret leak prevention:

1. .gitleaks.toml — config extending the default ruleset (~150 rules for
   AWS, GCP, Stripe, OpenAI, private keys, JWTs, etc.) with allowlists
   tuned to suppress false positives from test fixtures and docs.

2. .husky/pre-commit — enhanced with gitleaks protect --staged (graceful
   skip if not installed), sensitive file type blocking (.pem, .key, .enc,
   id_rsa, etc.), and broadened fallback patterns covering AWS, OpenAI,
   GCP, and private key headers alongside existing Stripe checks.

3. .github/workflows/build-and-test.yml — new secret-scan CI job using
   gitleaks-action that runs in parallel with build on every push/PR,
   serving as the last gate if someone bypasses local hooks.
2026-02-04 09:52:54 +00:00
rcourtman
655b8905c9 fix(ci): fix YAML quoting on line 494 2026-02-03 22:09:24 +00:00
rcourtman
5b48b37c4f fix(ci): replace emojis with ASCII in workflow 2026-02-03 22:07:12 +00:00
rcourtman
cb54cc5dc3 fix(ci): correct sparse-checkout syntax 2026-02-03 22:05:38 +00:00
rcourtman
75cda5011c fix(ci): wrap job-level if expressions 2026-02-03 22:04:23 +00:00
rcourtman
8fe6d9c753 chore: add comment to force workflow re-parse 2026-02-03 21:58:14 +00:00
rcourtman
a4916fc6ff perf(ci): parallelize release workflow for faster builds
Optimizations:
- Split monolithic preflight_tests into parallel jobs:
  - frontend_checks (lint) - ~2 min
  - backend_tests (Go tests) - ~5 min
  - docker_build (verify build) - ~5 min
- Skip arm64 builds for prereleases (RC/alpha/beta) - saves ~4 min
- Skip integration tests for prereleases - saves ~3 min
- Don't push staging images, just verify builds
- Merge version_guard into prepare job with sparse checkout
- Use frontend build cache across jobs

Expected time savings:
- RC releases: ~12 min → ~5-6 min (parallel + skip arm64/integration)
- Stable releases: ~12 min → ~8-9 min (parallel jobs)
2026-02-03 21:55:09 +00:00
rcourtman
1490a6e6e3 revert: remove dual-key license verification
Restored original license signing key from backup - key was never
compromised (private repo). Removes unnecessary dual-key complexity:

- Remove legacyPublicKey and SetLegacyPublicKey from license.go
- Simplify signature verification to single key
- Remove EmbeddedLegacyPublicKey from pubkey.go
- Remove PULSE_LICENSE_LEGACY_PUBLIC_KEY from Dockerfile and workflows
- Remove dual-key test
- Simplify mock.env
2026-02-03 21:29:21 +00:00
rcourtman
f810a003eb license: add dual-key verification 2026-02-03 20:45:00 +00:00
rcourtman
445c5c0587 Fix: remove install-sensor-proxy.sh from release workflow (script was removed) 2026-02-03 00:08:19 +00:00
rcourtman
17208cbf9d docs: update AI evaluation matrix and approval workflow documentation 2026-01-30 19:00:40 +00:00
rcourtman
252db2b720 ci: use git pull --rebase in helm-pages.yml to avoid push conflicts 2026-01-20 20:07:51 +00:00
rcourtman
9571f3ed0a ci: add PULSE_DATA_DIR to build-and-test.yml for Go unit tests 2026-01-20 20:06:42 +00:00
rcourtman
2798f89cf6 ci: increase helm smoke test timeout and add debug info 2026-01-20 19:53:22 +00:00
rcourtman
16afc93473 ci: improve demo server update robustness with pipefail and version check 2026-01-20 19:34:35 +00:00
rcourtman
8eb42f6b31 ci: set PULSE_DATA_DIR in test step to prevent /etc/pulse fallback 2026-01-20 18:00:07 +00:00
rcourtman
7d2e002caa fix: add sudo to mv command in deploy 2026-01-18 09:46:50 +00:00
rcourtman
a40be03963 fix: use sudo for systemctl commands in deploy 2026-01-18 09:43:47 +00:00
rcourtman
3114775aa9 fix: clean up stale files before deploy 2026-01-18 09:40:42 +00:00
rcourtman
bfe621eeb9 fix: use FRONTEND_PORT env var for health check port 2026-01-18 09:37:45 +00:00
rcourtman
4fbc08daba fix: use SSH key secret for demo server deployment 2026-01-18 09:32:19 +00:00
rcourtman
66fa6d45a7 chore: disable nightly demo deploys and switch to authkey 2026-01-18 09:26:12 +00:00
rcourtman
4e064aa0cc fix: build entire cmd/pulse package, not just main.go
The static binary build was only compiling main.go, missing bootstrap.go
and config.go which define osExit, bootstrapTokenCmd, and configCmd.
2026-01-13 09:06:21 +00:00
rcourtman
8eabd266fc fix(frontend): extend kiosk mode to Docker and Hosts pages
Kiosk mode (?kiosk=1) now hides the filter panel on all main views:
- Proxmox dashboard (already supported)
- Docker hosts page (added)
- Hosts overview page (added)

This ensures a clean display when using token auth for dashboard/kiosk
displays without the search and filter controls visible.

Follow-up fix for #1055
2026-01-11 12:16:20 +00:00
rcourtman
9a59c4459b fix(workflow): build frontend before building backend in demo deployment 2026-01-10 00:41:00 +00:00
rcourtman
5c4399d69f feat(agent): add DisableCeph toggle, report_ip remote config, and improved IP detection (#929) 2026-01-09 14:45:29 +00:00
rcourtman
3fdf753a5b Enhance devcontainer and CI workflows
- Add persistent volume mounts for Go/npm caches (faster rebuilds)
- Add shell config with helpful aliases and custom prompt
- Add comprehensive devcontainer documentation
- Add pre-commit hooks for Go formatting and linting
- Use go-version-file in CI workflows instead of hardcoded versions
- Simplify docker compose commands with --wait flag
- Add gitignore entries for devcontainer auth files

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 22:29:15 +00:00
rcourtman
5b7a68bcc0 fix: Add VERSION build arg to all Docker builds in CI workflows 2026-01-01 16:14:56 +00:00
rcourtman
034f086d9d fix: Ensure correct version injection in Docker builds (Related to #1005) 2026-01-01 16:11:47 +00:00
rcourtman
e0325e5cf9 fix(ci): test multi-arch Docker build in preflight before releasing
Previously, preflight only built amd64 images, so multi-arch failures
(like the QEMU timeout in 5.0.5) weren't caught until after the
release was published.

Now preflight builds linux/amd64,linux/arm64 staging images. If
multi-arch build fails, the release pipeline stops before publishing.

Combined with the Dockerfile fix (forcing amd64 for build stages),
this ensures Docker build issues are caught early.
2025-12-27 13:25:01 +00:00
rcourtman
9bd7e31843 fix: Handle 404 response in release existence check 2025-12-26 16:49:37 +00:00
rcourtman
4bcad25433 fix: Make release workflow idempotent for re-runs
- Check if tag exists before creating (skip if pointing to HEAD, fail with
  helpful message if pointing elsewhere)
- Check if draft release exists before creating (update existing draft)
- Add --clobber to all asset uploads to allow re-uploading on retry
2025-12-26 16:26:45 +00:00
rcourtman
e7a48fca8c fix(ci): add run-name to workflows for reliable tag extraction 2025-12-24 09:41:26 +00:00
rcourtman
53e5410e55 ci: disable cancel-in-progress to stop cancellation spam 2025-12-23 18:57:51 +00:00
rcourtman
11cdc5d279 fix(ci): restore arm64 Docker builds in publish workflow
The staging images in preflight are intentionally amd64-only for speed,
but the publish workflow was just copying them instead of building
multi-arch. Now builds linux/amd64,linux/arm64 from source at publish.

Related to #868
2025-12-22 20:03:39 +00:00
rcourtman
90bdd92e60 test: improve E2E test stability and reduce CI friction
- Remove flaky 'Settings persistence' test that tested basic CRUD
  (better covered by unit tests, was causing timing-sensitive failures)
- Make E2E workflow non-blocking with continue-on-error: true
  (E2E tests now run as smoke tests without blocking merges)

This keeps visibility into E2E issues while reducing false-positive
CI failures from timing-sensitive browser tests.
2025-12-19 23:31:30 +00:00
rcourtman
91178d2b24 Pass license public key to test Docker builds 2025-12-19 23:03:19 +00:00
rcourtman
7f05d87809 fix: add missing HandleLicenseFeatures method and related changes
- Add HandleLicenseFeatures handler that was missing from license_handlers.go
- Add /api/license/features route to router
- Update AI service and metadata provider
- Update frontend license API and components
- Fix CI build failure caused by tests referencing unimplemented method
2025-12-19 22:59:52 +00:00
rcourtman
98c4a08d64 fix(e2e): add debugging and container logging to diagnose CI failures
- Separate pretest (start containers) from test (run playwright) steps
- Add container log collection step that runs on failure
- Add verbose logging to pretest.mjs for better failure diagnosis
- Use PULSE_E2E_SKIP_DOCKER and PULSE_E2E_SKIP_PLAYWRIGHT_INSTALL flags
2025-12-19 15:48:35 +00:00
rcourtman
9bc63441a1 fix: eliminate race conditions in release workflow chain
The promote-floating-tags and helm-pages workflows now trigger
automatically via workflow_run when publish-docker.yml completes,
instead of being dispatched immediately by create-release.yml.

This ensures Docker images are fully available before:
- Floating tags (rc, latest, major.minor) are promoted
- Helm chart smoke tests try to pull the image

Key changes:
- promote-floating-tags.yml: Add workflow_run trigger, extract tag
  from triggering workflow, wait for BOTH pulse and agent images
- helm-pages.yml: Add workflow_run trigger, extract version from
  triggering workflow
- create-release.yml: Remove manual dispatch for these workflows
2025-12-18 19:33:39 +00:00
rcourtman
54fc259221 fix(ai): improve AI settings UX with validation and smart fallbacks
Backend:
- Add smart provider fallback when selected model's provider isn't configured
- Automatically switch to a model from a configured provider instead of failing
- Log warning when fallback occurs for visibility

Frontend (AISettings.tsx):
- Add helper functions to check if model's provider is configured
- Group model dropdown: configured providers first, unconfigured marked with ⚠️
- Add inline warning when selecting model from unconfigured provider
- Validate on save that model's provider is configured (or being added)
- Warn before clearing last configured provider (would disable AI)
- Warn before clearing provider that current model uses
- Add patrol interval validation (must be 0 or >= 10 minutes)
- Show red border + inline error for invalid patrol intervals 1-9
- Update patrol interval hint: '(0=off, 10+ to enable)'

These changes prevent confusing '500 Internal Server Error' and
'AI is not enabled or configured' errors when model/provider mismatch.
2025-12-17 18:30:19 +00:00
rcourtman
3c134ff4b8 fix(ci): pass explicit version to demo server update
Previously the workflow ran install.sh without --version, which caused it
to download the latest stable release instead of the target release tag.

This was causing the demo server to downgrade from RC versions to stable
when triggered via workflow_dispatch.
2025-12-15 16:11:49 +00:00
rcourtman
0fd5cb4643 perf(ci): use amd64-only for preflight staging images
Skip arm64 QEMU emulation in preflight tests - staging images are only
used for integration tests which run on amd64. This cuts ~20-30 minutes
off the release pipeline.

Multi-arch Docker images are still built in the final release job via
publish-docker.yml.
2025-12-15 14:27:34 +00:00
rcourtman
8bea6c6b99 fix: prevent race conditions in release workflows
- Remove 'release: published' triggers from publish-docker, promote-floating-tags, and helm-pages workflows
- All these workflows now only run via workflow_dispatch, triggered by create-release.yml in sequence
- Add image availability check in promote-floating-tags to wait for Docker images
- create-release.yml now dispatches: publish-docker, promote-floating-tags, helm-pages, update-demo-server
- This prevents the race condition where workflows triggered by release event run before Docker images are ready
2025-12-14 18:07:46 +00:00