Skip to content

Releases: greenarmor/gesf

v1.5.8 — Fixes regression in v1.5.7 where all dashbaord tabs become unclickable

21 Jun 17:25

Choose a tag to compare

Release v1.5.8 (Patch)

Patch release. Fixes a regression in v1.5.7 where all dashboard tabs became unclickable. No other changes. No configuration changes. No migration required.

Previous release: v1.5.7
Release date: 2026-06-21


Highlights

Fix: All dashboard tabs became unclickable after v1.5.7

A regression in v1.5.7 caused every dashboard tab (Overview, Packs, Fixes, Findings, Traceability, Activity, Governance) to become non-clickable — no navigation worked at all.

Root Cause

The v1.5.7 fix-assign work accidentally stripped the window.resolveFindingFix function declaration while editing the surrounding code, leaving its body as orphaned top-level statements. Since the dashboard runs as a single <script> block, this JS syntax error broke every function — including showPage(), which handles all tab navigation.

The Fix

Re-added the missing function declaration line. No other changes.


What Changed

  • packages/web-dashboard/src/template.ts — Restored window.resolveFindingFix = function(fkey) { declaration that was accidentally stripped during the v1.5.7 inline create-and-assign work

Test Results

Packages:    16 buildable, all clean
Tests:        69 passing in web-dashboard package

Verification performed:

  • node --check on extracted dashboard JS — syntactically valid
  • All 10 window-level functions confirmed present (showPage, showFixesTab, showFindingsTab, openAssignModal, closeAssignModal, submitAssignForm, submitCreateAndAssignForm, resolveFindingFix, unassignFix, showToast)
  • E2E: init → audit → dashboard renders with all tabs navigable

Upgrade Guide

This is a patch release. No migration required.

npm install -g @greenarmor/ges@latest

If you are on v1.5.7, this release is strongly recommended — v1.5.7 ships with broken dashboard navigation.

v1.5.7 — Creation of the Genesis Governance Record for Provenance

21 Jun 17:06

Choose a tag to compare

Release v1.5.7 (Patch)

Patch release. Fixes the non-functional "+ Assign to Governance Record" button in the dashboard Fixes tab — it now works immediately after ges init via an auto-created genesis governance record, with an inline create-and-assign fallback for projects that have no records. No breaking changes. No configuration changes. Existing projects continue to work unchanged.

Previous release: v1.5.6
Release date: 2026-06-21


Highlights

Fix: "+ Assign to Governance Record" button was non-functional for new projects

After ges init and ges audit, the dashboard Fixes tab showed an assign button on every pending fix — but clicking it did nothing (just a toast: "No governance records found"). For new projects with no governance records, this was a dead-end.

Root cause fix: ges init now auto-creates a genesis governance record using the project name, type, and frameworks collected during init. System type and risk level are inferred from the project type:

Project Type System Type Risk Level
ai-application, mcp-server ai-system medium
api-backend api medium
healthcare-system, government-system application high
blockchain, wallet application high
All others application medium

The genesis record starts in draft status with created_by: "ges-init". The assign button now works immediately after init — no manual governance setup required.

Defensive fallback: For projects with no governance records (deleted record, or older project), the button now opens an inline "Create & Assign" form instead of a dead-end toast. Collects system name, type, risk level, and assignee — creates the record and assigns the fix in one click.


What Changed

  • packages/cli/src/commands/init.ts — Genesis record creation after workflows; mapProjectTypeToSystemType() + inferRiskLevel() helpers; activity log updated with genesis_governance_record_id
  • packages/web-dashboard/src/template.tsopenAssignModal renders inline create form when govRecordsForAssign is empty; new submitCreateAndAssignForm() does create-record + assign-fix in sequence
  • packages/web-dashboard/src/index.test.ts — +2 tests (inline create form JS renders when empty; governance records render in govRecordsForAssign when present)

Test Results

  • 524 tests passing across 16 packages, all build clean
  • E2E verified: init → audit → dashboard assign flow (both paths — records exist / no records)

Upgrade Guide

This is a patch release. No migration required.

npm install -g @greenarmor/ges@latest

Existing projects: Your current .ges/governance-records.json is untouched. If you already have governance records, nothing changes. To get a genesis record for an existing project, re-run:

ges init --force

v1.5.6 — Security Gating & CI/CD Auto-Aware Workflows

21 Jun 14:25

Choose a tag to compare

v1.5.6 — Security Gating & CI/CD Auto-Aware Workflows

Overview

This release transforms GESF's generated CI/CD workflows from silently-failing scripts into real security gates that block PR merges on failures. Every workflow is now fully auto-aware — no hardcoded branch names, package managers, Node versions, or country codes.

Consumer projects running npx ges init now get 5 production-ready GitHub Actions workflows that work out of the box regardless of their stack (npm/pnpm/yarn, main/master/trunk, Node 18/20/22, Docker/no-Docker, K8s/no-K8s).


What's New

1. Security Gating (NEW)

GESF now generates enforceable security gates, not just advisory scans. Every gate exits non-zero on violations, enabling GitHub Required Status Checks for branch protection.

Workflow Scanner Gate Behavior
compliance.yml GESF 9 built-in scanners (ges audit --ci) Exits 1 on critical findings
security.yml Semgrep SAST Exits 1 on blocking code findings
dependency-scan.yml Trivy + npm/pnpm/yarn audit Trivy exits 1 on CRITICAL/HIGH
secret-scan.yml Gitleaks (full git history) Exits 1 on any secret
sbom-scan.yml Syft + Grype + Trivy Grype exits 1 on HIGH+ vulns

To enable enforcement:

Settings → Branches → Branch protection rules
  → Require status checks → add job names

2. Auto-Aware Branch Detection

Before: Workflows triggered only on branches: [main, develop] — silently skipped for repos using master, trunk, or custom names.

After: All workflows trigger on push: and pull_request: without branch filters. Badge/commit steps use github.event.repository.default_branch — works with any default branch name.

3. Auto-Aware Package Manager Detection

Before: Hardcoded npm ci — failed on pnpm and yarn projects.

After: dependency-scan.yml auto-detects the package manager via lockfile presence:

  • pnpm-lock.yamlpnpm install --frozen-lockfile + pnpm audit
  • package-lock.jsonnpm ci + npm audit
  • yarn.lockyarn install --frozen-lockfile + yarn audit

4. Auto-Aware Infrastructure Scanning

sbom-scan.yml now has 3 conditional jobs that auto-detect the project's infrastructure:

Job Runs When Scans
sbom Always Source dependencies (Syft + Grype)
container-scan Dockerfile or docker-compose.yml present Docker image OS-level CVEs (Trivy)
iac-scan k8s/, terraform/, *.tf, etc. present Infrastructure misconfigurations (Trivy)

A plain Node.js project gets only filesystem SBOM. A Docker project gets container scanning. A Kubernetes project gets IaC scanning — automatically.

5. Semgrep False Positive Resolution

Fixed 7 blocking findings from GitHub's Semgrep security scan:

  • ReDoS (6 findings): Replaced all new RegExp() with dynamic arguments — manual glob matcher in .gesignore processing, string-based dependency detection in MCP server
  • JWT test fixture (1 finding): Split test token across string concatenation so static analysis can't match it, while runtime detection still works

Added .semgrepignore and e2e-local/ (gitignored) with a 16-check local E2E test suite using realistic fixtures.


Bug Fixes

  • ges init missing in CI.ges/ is gitignored, so ges audit --ci failed with "GESF not initialized." Added ges init --force step before audit in compliance.yml.
  • Broken GitHub Actions — Removed Socket-security/socket-security-action (wrong repo name, required unconfigured API token) and google/osv-scanner-action@v2 (version doesn't exist, redundant with Trivy) from supply-chain.yml.
  • pnpm version conflictpnpm/action-setup@v4 with version: 9 conflicted with packageManager: "pnpm@11.4.0" in package.json (ERR_PNPM_BAD_PM_VERSION). Removed version pin — now auto-detects from package.json.
  • npm ci on pnpm repo — GESF uses pnpm but workflow ran npm ci (no package-lock.json). Fixed with auto-detecting package manager steps.
  • Version drift — GESF version was hardcoded as "1.5.5" in cicd-generator. Now imports GESF_VERSION from @greenarmor/ges-core dynamically.
  • Country hardcoded — Generated workflows always used --country "US-CA". Now flows from config.country set during ges init.
  • Trivy continue-on-error: true — Dependency scanner was advisory-only. Trivy now uses exit-code: '1' (hard gate). Package manager audit remains advisory (inconsistent exit codes across pnpm versions).

Changes to Generated Workflows (for consumers)

Removed

  • ges scan --ci from generated CI workflows — was unreliable (external tools not installed on runner). External tools now use their native GitHub Actions for reliability + SARIF output.

Architecture

Before (5 workflows, GESF was a bystander):

compliance.yml      → ges audit (no ges init, broken)
security.yml        → Semgrep + ges scan (broken)
dependency-scan.yml → Trivy + npm ci (wrong PM)
secret-scan.yml     → Gitleaks
sbom-scan.yml       → Syft + Grype (filesystem only)

After (5 workflows, zero redundancy, all auto-aware):

compliance.yml      → ges init + ges audit --ci (GESF supreme, 9 scanners)
security.yml        → Semgrep SAST (native GitHub Action)
dependency-scan.yml → Trivy gate + auto PM audit (pnpm/npm/yarn)
secret-scan.yml     → Gitleaks (full git history)
sbom-scan.yml       → Syft + Grype + Trivy (auto: filesystem + container + IaC)

Test Coverage

  • 522 tests passing (up from 483)
  • 44 cicd-generator tests (up from 27) — includes 5 new regression tests:
    • No broken GitHub Actions referenced
    • pnpm setup has no version pin
    • npm ci is guarded by package-lock.json check
    • Country flows from config (not hardcoded)
    • GESF version is dynamic

Upgrade Guide

For GESF repo

  1. Pull master — workflows in .github/workflows/ are updated
  2. No migration needed — existing workflows are overwritten on next ges init

For consumer projects

  1. Update: npm install -g @greenarmor/ges@1.5.6
  2. Re-run: ges init --force
  3. Review generated .github/workflows/ — all 5 are updated
  4. (Optional) Enable branch protection: Settings → Branches → Require status checks

Stats

  • 38 files changed, +801 / -781 lines
  • 16 packages build clean
  • 522 tests passing
  • 0 broken GitHub Actions references
  • 0 hardcoded branches, package managers, Node versions, or country codes

v1.5.5 — Update Notifications, Rich Version Display, Supply Chain Hardening

20 Jun 23:17

Choose a tag to compare

Release v1.5.5 — Update Notification System, Rich Version Display, Supply Chain Hardening

Minor release. GESF now automatically checks npm for new versions and prompts users to update before running commands. ges --version shows a formatted card with author, release date, and Ko-fi donate link. All 5 Socket.dev supply chain alerts have been investigated and documented with CycloneDX SBOM tooling. No breaking changes.

Previous release: v1.5.4
Release date: 2026-06-20


Highlights

Automatic Update Notifications

Users had no way to know when a new GESF version was released unless they manually checked npm. Now the CLI automatically checks for updates before running any command.

How it works:

$ ges audit

  ┌──────────────────────────────────────────────────────────┐
  │   ↻  Update available  1.5.4 → 1.6.0                     │
  │      Run ges update to upgrade, or npm i -g              │
  │      @greenarmor/ges@latest                              │
  └──────────────────────────────────────────────────────────┘

? An update is available. What would you like to do?
❯ Update now — install latest and exit
  Skip for now — continue with current version
  Skip this version — don't remind me about 1.6.0 again
Feature Behavior
Caching Results stored in ~/.ges/update-check.json, checked every 24h
Network timeout 3 seconds max — never blocks indefinitely
TTY mode Boxed notice + interactive menu (Update / Skip / Skip this version)
Non-TTY mode One-liner to stderr, command proceeds without hanging
Dismiss "Skip this version" suppresses reminders for that specific version
Disable ges update --disable-checks silences all notifications
Skipped commands update, mcp, start — avoids corrupting JSON-RPC stdio

Install on update:

$ ges update

  GESF Update
  Version check & upgrade
  ════════════════════════════════════════════════════

  ○ Current version 1.5.4
    Package           @greenarmor/ges

  Checking npm registry for latest version...
    Latest version    1.6.0

  ↻ Update available: 1.5.4 → 1.6.0

? Install @greenarmor/ges@1.6.0 now? (Y/n)

The ges update command was completely rewritten to actually query the npm registry, with three new flags:

  • ges update --check — check only, don't install
  • ges update --disable-checks — silence all update notifications
  • ges update --enable-checks — re-enable notifications

Rich Version Display

ges --version / ges -v now shows a formatted card instead of a bare version number:

$ ges --version

  GESF v1.5.5
  Green Engineering Standard Framework

  Author:    greenarmor
  Released:  2026-06-20

  Support:   https://ko-fi.com/greenarmor
  GitHub:    https://github.com/greenarmor/gesf

Supply Chain Hardening — Socket.dev Alert Review

All 5 Socket.dev alerts have been investigated, documented, and resolved with no functionality changes. Every flagged package is a transitive dependency of @inquirer/* (which are optional dependencies with a built-in readline fallback).

Alert Package Verdict Reason
Typosquat fast-string-width False positive Maintained by Fabio Spampinato. Legitimate faster alternative, not an imitation.
Unpopular fast-wrap-ansi Accepted Maintained by James Garbutt (Node.js/Vite contributor). Niche performance package.
URL strings doc-generator False positive Flagged strings are local filenames (gdpr.md, etc.) passed to path.join(). Zero network calls.
Code anomaly signal-exit Accepted Maintained by Ben Coe + Isaac Schlueter (Node.js creator). 38M+ weekly downloads.
Env var access @inquirer/core False positive INQUIRER_KEYBINDINGS is benign terminal UX config, not secrets.

SBOM generation:

./scripts/generate-sbom.sh
# Output: sbom/sbom.json — CycloneDX 1.6, 335 components

Full risk assessments, maintainer provenance, and review log in SECURITY.md → "Supply Chain Review" section.


New Files

File Purpose
packages/cli/src/utils/update-check.ts Version checking with 24h cache, 3s timeout, npm registry query
packages/cli/src/utils/update-notice.ts Update notice renderer (TTY box + interactive menu, non-TTY one-liner)
packages/cli/src/utils/update-check.test.ts 7 tests for version comparison, dismiss, disable/enable, cached reads
scripts/generate-sbom.sh CycloneDX SBOM generator (335 components, CycloneDX 1.6)

Modified Files

File Change
packages/cli/src/cli.ts Added preAction hook for update check; rich version card
packages/cli/src/commands/update.ts Full rewrite — real npm registry check, interactive install, --check/--disable-checks/--enable-checks
packages/cli/src/utils/version.ts Added AUTHOR, RELEASE_DATE, DONATE_URL, HOMEPAGE exports
packages/cli/src/utils/ui.ts Added updateNoticeBox() and updateNoticeLine() helpers
SECURITY.md Added "Supply Chain Review" section (~120 lines) with per-package risk assessment tables
socket.yml Added comments documenting accepted transitive deps and readline fallback strategy
.gitignore Added /sbom/ (regenerated on demand)

Verification

Check Result
All 16 packages build clean
Full test suite ✓ 490/490 passing (+7 new)
ges --version shows formatted card
ges update --check queries npm registry
Update cache written to ~/.ges/update-check.json
Non-TTY: one-liner notice, no hang (exit 0)
TTY: boxed notice + interactive menu via expect PTY
Dismiss version persists across runs
ges update --disable-checks / --enable-checks
SBOM generation (335 components)

Upgrade Notes

No breaking changes. No configuration changes required.

  • Update notifications are enabled by default and require no setup
  • Caching is automatic (~/.ges/update-check.json)
  • @inquirer/* optional deps — unchanged; CLI still falls back to readline if not installed
  • SBOM is not committed to the repo — run ./scripts/generate-sbom.sh to generate

Install / upgrade:

npm install -g @greenarmor/ges@1.5.5
# or
npx @greenarmor/ges@1.5.5 --version

Full changelog: v1.5.4...v1.5.5

v1.5.4 — Governance

20 Jun 21:57

Choose a tag to compare

Release v1.5.4 — Governance Subcommand Next-Action Menus

Patch release. ges governance list, show, and verify now show an interactive "next action" menu after their output instead of dropping users back to the shell with no guidance. No breaking changes.

Previous release: v1.5.3
Release date: 2026-06-20


Highlights

Read-Only Subcommands No Longer Leave You Stuck

In v1.5.3, parent commands (ges governance, ges policy, etc.) gained interactive guided menus. But the read-only subcommands list, show <id>, and verify <id> still printed their output and exited — leaving users with no clue what to do next.

Now they show a context-aware "What would you like to do next?" menu:

$ ges governance list

  Governance Records (1)

  ○ DRAFT My System
     ID     gov-1781991485573-1
     Type   ai-system  |  Risk HIGH
     By     NOT RECORDED
     Ev     0 reference(s)

  ────────────────────────────────────────────────────

  What would you like to do next?

? Choose your next action:
❯ Show a record's full provenance chain — all dimensions in detail
  Verify a record's completeness — check all 8 dimensions
  Create a new governance record — start a new approval chain
  Exit — return to terminal

Context-Aware Choices

The menu adapts to what you just did:

Command Menu Options
ges governance list Show a record / Verify a record / Create new / Exit
ges governance show <id> Verify THIS record / Approve / Evidence / Risk / Policy / Create new / Exit
ges governance verify <id> Same as show (single-record scope)

When list shows multiple records, selecting "Show a record" or "Verify a record" opens a record picker. When only one record exists, it is auto-selected.

Selected actions dispatch via execSync(cmd, { stdio: "inherit" }), reusing the proven next-steps.ts pattern — so the target subcommand's own .action() runs in full.

CI/CD Safe — No Hangs in Non-TTY Mode

The menu is gated behind process.stdin.isTTY && process.stdout.isTTY. In non-interactive contexts (pipes, scripts, CI):

  • Output prints normally
  • No menu is shown
  • Process exits cleanly with code 0
$ echo "" | ges governance list     # exits 0, no hang
$ ges governance list | jq ...      # exits 0, no hang

Changes

packages/cli/src/commands/governance.ts

  • Added showGovernanceNextAction(root, records, lastShownId?) helper — renders a context-aware select() menu after read-only subcommands. Dispatches chosen action via execSync.
  • Updated list action (line 422) — calls showGovernanceNextAction(root, records) after printing records. Also handles empty-state (calls the helper, which still offers "Create new record").
  • Updated show action (line 564) — calls showGovernanceNextAction(root, [record], record.id) after printing the full provenance chain.
  • Updated verify action (line 619) — calls showGovernanceNextAction(root, [record], record.id) after printing the verification report.

Verification

Check Result
All 16 packages build clean
Full test suite ✓ 483/483 passing
ges governance list (TTY) — menu renders ✓ via expect PTY
ges governance show <id> (TTY) — menu renders ✓ via expect PTY
ges governance verify <id> (TTY) — menu renders ✓ via expect PTY
list / show / verify (non-TTY) — exits 0, no hang ✓ via piped stdin
Menu dispatch works (selecting "Verify" runs ges governance verify <id>)
Context-aware choices (single-record scope after show/verify)

Upgrade Notes

No breaking changes. No configuration changes. Existing scripts and CI pipelines continue to work unchanged — non-TTY behavior is identical to v1.5.3.

Install / upgrade:

npm install -g @greenarmor/ges@1.5.4
# or
npx @greenarmor/ges@1.5.4 governance list

Full changelog: v1.5.3...v1.5.4

v1.5.3 - CLI Interactive Menus & Documentation Completeness

20 Jun 18:35

Choose a tag to compare

Release v1.5.3 — CLI Interactive Menus & Documentation Completeness

Minor release. All parent commands (ges governance, ges policy, ges mcp, ges hooks) now show interactive guided menus instead of raw help text. Complete documentation for all 19 CLI commands including the new ges assign user guide. No breaking changes.

Previous release: v1.5.2
Release date: 2026-06-20


Highlights

Interactive Guided Menus — Never Get Stuck

Running ges governance, ges policy, ges mcp, or ges hooks without a subcommand previously dumped raw help text and exited. Users had no idea what to do next.

Now you get a guided menu:

$ ges governance

  GESF Governance
  Provenance Chain Management

  Existing Records (1)

  ● APPROVED Payment Processing API
     ID     gov-1781934540528-1
     Type   api  |  Risk HIGH

? What would you like to do?
❯ Create a new governance record — start a new approval chain
  List all records (1 existing)
  Show a record's full provenance chain
  Verify a record's completeness
  Record an approval decision
  Add an evidence reference
  Exit — return to terminal

Every menu has:

  • Descriptions for each option (so users know what each does)
  • Exit option (always available, never trapped)
  • Context-aware choices (governance menu shows existing records, policy shows installed packs, hooks detects install state)
  • Smart selection (when only 1 governance record exists, it's auto-selected)

CI/CD safe — in non-TTY mode, falls back to help text and exits 0. Never hangs.

Prompt Hints — No More Guessing

Every interactive prompt now shows examples and format guidance:

Before After
Risk score: Risk score (e.g., '7.5/10', 'High'):
Methodology: Methodology (e.g., 'NIST RMF', 'ISO 27005'):
Approver name: Approver full name:
Valid until (YYYY-MM-DD): Valid until YYYY-MM-DD (or press Enter for indefinite):

30+ prompts updated across governance and assign commands.


What's New

CLI Improvements

Command Change
ges governance Interactive parent menu — 13 actions with descriptions, shows existing records, auto-selects when 1 record
ges policy Interactive parent menu — shows installed packs, pack picker for install/remove
ges mcp Interactive parent menu — setup/start with descriptions
ges hooks Interactive parent menu — detects install state, context-aware install/uninstall
ges assign Prompt hints and defaults for all fields

Documentation

All 19 CLI commands now fully documented with complete flag tables:

Documentation Change Details
New: ges assign Full command reference with all 13 flags, assign/list/resolve examples
Fixed: ges init Added --country and --force flags
Fixed: ges audit Added --incremental flag
Expanded: ges governance All 13 subcommands now have dedicated sections with complete flag tables
New user guide docs/user-guide/fix-assignments.md — 400+ lines with workflow, data storage, dashboard/MCP integration, and 5 hands-on exercises

New User Guide: Fix Assignments

Comprehensive guide for linking audit findings to governance provenance records:

  • Prerequisites and workflow (audit → governance → assign → resolve)
  • Finding keys explanation (ruleId:file:line format)
  • Data storage.ges/fix-assignments.json structure
  • Dashboard integration — inline provenance chain display
  • MCP integration — 3 tools table
  • 5 exercises: Assign first fix, Build provenance chain, Resolve and track, Dashboard view, Multi-finding assignment

Verification

  • Full E2E test: All 19 CLI commands tested end-to-end in a fresh project — init → audit → fix → assign → governance (full lifecycle) → generate → report → badge → scan → doctor → validate → policy → control → hooks → dashboard → mcp
  • 8 edge cases: Non-TTY mode (4 parent commands), missing .ges/, missing audit data, missing args
  • Zero failures, zero hangs
  • 483 tests passing, all 16 packages build clean

Changed Files

docs/reference/commands.md              | 240 +++++++++++++++++++++++++++++++--
docs/user-guide/fix-assignments.md      | 400+ lines (new)
mkdocs.yml                              |   1 +
packages/cli/src/commands/assign.ts     |  12 +-
packages/cli/src/commands/governance.ts | 155 ++++++++++++++++-----
packages/cli/src/commands/hooks.ts      |  49 +++++++
packages/cli/src/commands/mcp.ts        |  32 +++++
packages/cli/src/commands/policy.ts     |  85 ++++++++++-

7 files changed, 520 insertions(+), 54 deletions(-)


Upgrade

npm update -g @greenarmor/ges
# or
pnpm update -g @greenarmor/ges

Existing projects continue to work unchanged. No migration needed.

v1.5.2 — Atomic File Writes (Corruption Prevention)

20 Jun 06:28

Choose a tag to compare

Release v1.5.2 (Patch)

Patch release. All .ges/ state files are now written atomically using write-to-temp-then-rename, preventing data corruption if the process crashes mid-write (power loss, OOM kill, SIGKILL). No breaking changes. No configuration changes. Existing projects continue to work unchanged.

Previous release: v1.5.1
Release date: 2026-06-20


Highlights

Atomic File Writes — Corruption Prevention

GESF stores all compliance state (governance records, fix assignments, audit results, activity logs, control overrides) as JSON files in the project's .ges/ directory. Previously, every save used fs.writeFileSync() directly.

If the process crashed mid-write, the file would be left half-written and unreadable — silently losing all data on the next read. The next loadFixAssignments() or loadGovernanceRecords() call would return an empty array, as if no data ever existed.

This release eliminates that risk. Every write now goes through a two-step atomic pattern:

1. Write full content to filePath.tmp
2. rename(filePath.tmp → filePath)

The rename() syscall is atomic at the OS level — the file is either the old version or the new version, never partially written. Temp files are created in the same directory (cross-device renames are not atomic) and cleaned up on error.


What's New

New Utility Module

packages/core/src/utils/index.ts — three exported functions:

Function Purpose
safeWriteJson(filePath, data) Serializes JSON and writes atomically
safeWriteFile(filePath, content) Writes string content atomically
safeReadJson(filePath, fallback) Safe JSON read with fallback on error

All three automatically create parent directories if they don't exist.

Files Replaced (31 writes across 14 files)

Package Files Modified Write Paths Covered
core activity-log, fix-history, governance, fix-assignments, controls (3 writes), recommendations All .ges/ state persistence
mcp-server init_project, run_audit, auto_fix, apply_control_override, badge, policy install, install_hooks All MCP tool mutations
cli project.ts (wrapper), badge, fix, mcp-setup All CLI file output
git-hooks installHooks Pre-commit hook installation

E2E Verification

Every write path was tested end-to-end to confirm zero functionality degraded:

Path Tool Result
ges init CLI 25 files created, all valid JSON ✓
ges audit CLI last-audit.json + activity-log.json ✓
ges governance add/approve/evidence CLI governance-records.json updated ✓
ges assign + --resolve CLI fix-assignments.json created + updated ✓
ges policy install CLI controls.json + config.json ✓
ges control CLI control-overrides.json ✓
MCP init_project MCP All init files ✓
MCP run_audit MCP last-audit.json, score.json, metadata.json ✓
MCP create_governance_record MCP governance-records.json ✓
MCP assign_fix_to_governance MCP fix-assignments.json ✓
MCP resolve_fix_assignment MCP fix-assignments.json updated ✓
MCP auto_fix MCP fix-history.json + last-audit.json ✓
MCP apply_control_override MCP control-overrides.json ✓
Dashboard GET (all endpoints) HTTP 13/13 checks ✓
Dashboard POST mutations HTTP 12/12 checks (create, assign, resolve) ✓

Zero .tmp files left behind across all operations.
All JSON files valid after every write.


Test Results

Packages:    16 buildable, all clean
Tests:        483 passing (was 465, +18)

New tests (18):
  - safeWriteJson: round-trip, parent dir creation, atomic overwrite,
    no temp leftover, empty/null/undefined handling
  - safeWriteFile: string content, nested dirs, overwrite, empty string
  - safeReadJson: valid read, missing file fallback, malformed JSON fallback,
    type preservation
  - Atomic guarantee: temp cleanup on failure, data integrity

Files Changed

File Change
packages/core/src/utils/index.ts NewsafeWriteJson, safeWriteFile, safeReadJson
packages/core/src/index.ts Export utils module
packages/core/src/index.test.ts +18 tests for atomic write utilities
packages/core/src/activity-log/index.ts appendActivityLog uses safeWriteJson
packages/core/src/fix-history/index.ts appendFixHistory uses safeWriteJson
packages/core/src/governance/index.ts saveGovernanceRecords uses safeWriteJson
packages/core/src/fix-assignments/index.ts saveFixAssignments uses safeWriteJson
packages/core/src/controls/index.ts 3 writes → safeWriteJson (overrides, config add/remove)
packages/core/src/recommendations/index.ts Uses safeWriteFile
packages/mcp-server/src/server.ts 15 writes → safeWriteJson/safeWriteFile
packages/cli/src/utils/project.ts Wrapper delegates to safeWriteFile/safeWriteJson
packages/cli/src/commands/badge.ts Uses CLI wrapper (atomic)
packages/cli/src/commands/fix.ts last-audit.json via safeWriteJson
packages/cli/src/commands/mcp-setup.ts Config writes via safeWriteFile
packages/git-hooks/src/index.ts Hook installation via safeWriteFile

Upgrade Guide

This is a patch release. No migration required.

npm install -g @greenarmor/ges@latest

If you use the MCP server:

npm install -g @greenarmor/ges-mcp-server@latest

All existing .ges/ files continue to work — the atomic write layer is transparent and doesn't change the file format or location.

v1.5.1 — Provenance Chain Display in Dashboard Fix Cards

20 Jun 04:02

Choose a tag to compare

Release v1.5.1 (Patch)

Patch release. Enhances the Fix Assignment feature (v1.5.0) with full provenance chain visibility directly inside dashboard fix cards. Every pending fix now displays the complete governance approval chain — approval, risk assessment, policy, evidence, and review cycle — inline, without navigating to the Governance tab. Includes a bug fix for escapeHtml() crashing on undefined governance fields.

Previous release: v1.5.0
Release date: 2026-06-19


Highlights

Provenance Chain Now Visible Inside Every Pending Fix

In v1.5.0, assigning a fix to a governance record only showed the linked record name and assignee. Users had to navigate to the Governance tab to see the full approval chain.

Now, every fix card includes a "Governance Provenance Chain" section that renders the complete chain inline — exactly where you're triaging the fix.

┌─────────────────────────────────────────────────────┐
│ GDPR-ART32-006 — Audit Logging              HIGH ⚠️  │
├─────────────────────────────────────────────────────┤
│ Description: ...                                    │
│ Fix Guidance: ...                                   │
├─────────────────────────────────────────────────────┤
│ GOVERNANCE PROVENANCE CHAIN                         │
│                                                     │
│ ┌─────────────────────────────────────────────┐    │
│ │ ASSIGNED  Assignee: Bob Smith (Security Eng) │    │
│ │           Assigned by Tech Lead on 6/19/2026 │    │
│ │           Notes: Must implement audit logging│    │
│ │           [Mark Fixed] [Unassign]            │    │
│ └─────────────────────────────────────────────┘    │
│                                                     │
│ ┌─────────────────────────────────────────────┐    │
│ │ Payment Processing System   APPROVED  HIGH   │    │
│ ├─────────────────────────────────────────────┤    │
│ │ Approval     APPROVED by Jane Smith (CISO)   │    │
│ │              valid until 2027-01-01           │    │
│ │ Risk Assess  Score: 7.5/10 — Residual: medium│    │
│ │ Policy Basis InfoSec Policy v2.1 (ISO 27001) │    │
│ │ Evidence     DPIA Report Q4 (jira: DPIA-001) │    │
│ │ Review Cycle annual — next: 2027-01-01        │    │
│ │ Chain        ✓→✓→✓→✓→✓                       │    │
│ └─────────────────────────────────────────────┘    │
├─────────────────────────────────────────────────────┤
│ Traceability: ...                                   │
└─────────────────────────────────────────────────────┘

Control-Level Assignment

Controls without specific code findings (e.g., not-implemented status) can now be assigned directly. Previously, the "+ Assign to Governance Record" button only appeared inside individual audit findings. Now every non-passing control shows an assign button regardless of whether it has audit evidence.


What's New

1. Inline Provenance Table

When a fix is assigned to a governance record, the fix card renders a compact table showing all six dimensions of the provenance chain:

Dimension What's Shown
Approval Decision (APPROVED/REJECTED/CONDITIONAL), approver name + role, validity period
Risk Assessment Risk score, residual risk, methodology
Policy Basis Policy name, version, standard reference
Evidence Chain All evidence references with source system (Jira, Confluence, etc.)
Review Cycle Frequency, next review date
Chain Summary Approval → Risk → Policy → Evidence → Review (✓/✗ indicators)

Each dimension shows ✓ (recorded) or ✗ (not documented), making gaps immediately visible.

2. Assignment Details Box

The assignment section now displays:

  • Status badge — assigned / in-progress / fixed / verified (color-coded)
  • Assignee — name + role
  • Assigned by — who made the assignment
  • Date — when assigned
  • Notes — assignment context
  • Resolution (if resolved) — resolver, method (auto-fix/manual/not-applicable), date, notes
  • Action buttons — Mark Fixed (if not resolved), Unassign

3. Unassigned State

Controls without an assignment show:

  • A dashed-border prompt: "This control is not linked to any governance record"
  • A prominent "+ Assign to Governance Record" button
  • Works at the control level — no audit findings needed

4. Bug Fix: escapeHtml() Undefined Crash

Pre-existing bug: The escapeHtml() function crashed when called with undefined or null values. This affected governance records where enrichment functions left optional fields unset (rationale, conditions, assessment_date, last_review, review_history).

Fix: escapeHtml() now accepts unknown input, returns empty string for null/undefined, and converts everything else to string. All .map() calls on optional arrays are guarded with || [].


Files Changed

File Change
packages/web-dashboard/src/template.ts +166/-9 — New renderGovernanceProvenanceSection() and renderProvenanceChainInline() functions, control-level assign buttons, escapeHtml() fix, array guards

Validation

pnpm -r run build   → 16 packages, all clean
pnpm -r run test    → 465 tests, all passing

E2E smoke test      → 16/16 checks passed:
  - Provenance chain table renders with all 6 dimensions ✓
  - Approver name, role, decision displayed ✓
  - Risk score, policy, evidence, review cycle displayed ✓
  - Assignee, notes, status badge displayed ✓
  - Mark Fixed + Unassign buttons present ✓
  - Control-level Assign button for unassigned controls ✓

Upgrade Guide

This is a patch release. No migration required.

npm install -g @greenarmor/ges@latest

The dashboard updates automatically — no configuration needed. Open the Fixes Detail tab and expand any pending fix to see the new provenance chain section.

v1.5.0 — Fixes Pedning Details Assignment to Governance Provenance Chain

19 Jun 12:40

Choose a tag to compare

Release v1.5.0 (Minor)

This is a minor release. It introduces Fix Assignment to Governance Provenance Chain — a system that links every pending audit finding to an existing governance record, creating full operational traceability from finding to resolution. No breaking changes. Existing projects, governance records, and audit workflows continue to work unchanged.

Previous release: v1.4.3
Release date: 2026-06-19


Highlights

Fix Assignment to Governance Provenance Chain

Every pending fix produced by ges audit (via CLI or MCP server) can now be assigned to an existing governance record in the provenance chain. This closes the gap between what was found and who is responsible for fixing it, under what authority, and whether it's been resolved.

The core question it answers: "Who is fixing this finding? Under which governance record was it approved? Who assigned them? Has it been resolved, and how?"

Audit Finding (SECRETS-001 in auth.ts:42)
  │
  ▼
  Assigned to Governance Record (gov-123, "Customer Support Chatbot")
    ├── Approved by: Jane Doe, CISO, under AI Ethics Board
    ├── Policy: GDPR Art. 32, Internal Security Policy v2.1
    ├── Risk: High (7.5/10), mitigated by encryption
    ├── Evidence: Jira SEC-123
    ├── Assignee: Bob Smith, Security Engineer
    ├── Assigned by: Tech Lead
    └── Status: assigned → in-progress → fixed → verified

Key Metrics

Metric Before (v1.4.3) After (v1.5.0)
MCP tools 43 46 (+3 fix-assignment)
CLI commands 15 16 (+ges assign)
Dashboard API endpoints 18 22 (+4 fix-assignment)
Tests passing 422 465 (+43)
New storage file .ges/fix-assignments.json

What's New

1. Core Storage Module

New file: .ges/fix-assignments.json — separate from governance records (fixes are operational, governance is stable).

12 functions in packages/core/src/fix-assignments/index.ts:

Function Purpose
loadFixAssignments() Read all assignments from disk
saveFixAssignments() Persist assignments
createFixAssignment() Factory function with full finding + governance metadata
addFixAssignment() Upsert by finding key (same finding reassigned replaces)
updateFixAssignment() Partial update by ID
updateFixAssignmentStatus() Change status (assigned → in-progress → fixed → verified)
findFixAssignment() Lookup by finding key
findFixAssignmentById() Lookup by assignment ID
findFixAssignmentsForRecord() All assignments for a governance record
resolveFixAssignment() Mark as fixed with resolution details (who, how, notes)
deleteFixAssignment() Remove by ID
unassignFix() Remove by finding key

Stable finding key: ${ruleId}:${file}:${line} — survives re-audits, allows tracking the same finding across multiple audit runs.

2. Fix Assignment Data Model

Each assignment captures the full chain from finding to governance to resolution:

interface FixAssignment {
  id: string;                    // fa-{timestamp}-{counter}
  finding_key: string;           // "SECRETS-001:src/auth.ts:42"
  finding_rule_id: string;
  finding_title: string;
  finding_file: string;
  finding_line?: number;
  finding_severity: SeverityLevel;
  finding_control_ids: string[]; // GDPR-ART32-002, OWASP-AUTH-001
  governance_record_id: string;  // links to GovernanceRecord
  governance_system_name: string;
  assignee: string;
  assignee_role: string;
  assigned_at: string;
  assigned_by: string;
  status: "assigned" | "in-progress" | "fixed" | "verified" | "rejected";
  notes: string;
  resolution: null | {
    resolved_at: string;
    resolved_by: string;
    resolved_by_role: string;
    method: "auto-fix" | "manual" | "not-applicable";
    resolution_notes: string;
  };
  created_at: string;
  updated_at: string;
}

3. Dashboard — Full UI Integration

The web dashboard now provides a complete assign-and-track workflow directly from the Fixes Detail and Traceability tabs:

Per-finding rendering:

  • Unassigned findings show a "+ Assign to Governance Record" button
  • Assigned findings show:
    • Status badge (assigned / in-progress / fixed / verified) with color coding
    • Linked governance record name
    • Assignee name and role
    • Resolution details (if resolved)
    • "Mark Fixed" button (if not yet resolved)
    • "Unassign" button

Assign modal — opens when clicking "+ Assign":

  • Governance record dropdown (filtered to existing records with status/risk display)
  • Assignee name (required) and role
  • Assignment notes
  • Actor attribution fields (your name + role for the audit trail)

Resolution flow — clicking "Mark Fixed" prompts for:

  • Resolver name and role
  • Resolution method (auto-fix / manual / not-applicable)
  • Resolution notes

Summary stats — new "Assigned" count card in the fixes summary grid.

Toast notifications — success/error feedback on all mutations, with auto-reload.

4. Dashboard API Endpoints (4 new)

Method Endpoint Purpose
GET /api/fix-assignments List all assignments
POST /api/fix-assignments/assign Create/upsert an assignment
POST /api/fix-assignments/resolve Mark assignment as fixed
POST /api/fix-assignments/:key/unassign Remove assignment by finding key

All POST endpoints:

  • Validate required fields (400 on missing data)
  • Validate governance record exists (404 on unknown record)
  • Record activity log entries with fix_assign / fix_resolve actions
  • Support actor attribution (actor_name / actor_role)

5. CLI Command — ges assign

New command for terminal-based assignment workflows:

# Assign a finding to a governance record
ges assign \
  --finding "SECRETS-001:src/auth.ts:42" \
  --record "gov-123" \
  --assignee "Bob Smith" \
  --assignee-role "Security Engineer" \
  --notes "Urgent — production key exposure" \
  --actor "Jane Doe" --actor-role "Tech Lead"

# List all assignments
ges assign --list

# Resolve an assignment
ges assign \
  --resolve "SECRETS-001:src/auth.ts:42" \
  --by "Bob Smith" --by-role "Security Engineer" \
  --method manual \
  --resolution-notes "Replaced hardcoded key with env var"

Interactive mode (no flags): Shows a finding picker with [ASSIGNED] markers, governance record picker, and assignee prompts.

Flags:

Flag Purpose
--finding <key> Finding key to assign
--record <id> Governance record ID or system name
--assignee <name> Person assigned
--assignee-role <role> Role of assignee
--notes <notes> Assignment context
--actor <name> Who is making the assignment (audit trail)
--actor-role <role> Role of the actor
--list List all assignments
--resolve <key> Resolve an assignment
--by <name> Who resolved it
--by-role <role> Role of resolver
--method <method> auto-fix / manual / not-applicable
--resolution-notes <notes> Resolution details

6. MCP Tools (3 new, 43 → 46 total)

Tool Description
assign_fix_to_governance Assign a finding to a governance record
list_fix_assignments List all assignments (optional filter by record ID)
resolve_fix_assignment Resolve an assignment with resolution details

All tools accept actor_name / actor_role for activity log attribution.

7. Activity Log Integration

Two new activity actions:

  • fix_assign — Recorded when a finding is assigned or unassigned
  • fix_resolve — Recorded when a finding is marked as resolved

Both appear in the dashboard Activity Log with full details (finding key, governance record, assignee, method).


End-to-End Workflow

# 1. Run an audit (produces findings)
ges audit
# → 5 findings found (2 critical, 2 high, 1 medium)

# 2. Create a governance record (if not already existing)
ges governance add --name "Payment API" --type api --risk high
ges governance approve <id> --approver "Jane" --role "CISO" --decision approved

# 3. Assign each finding to the governance record
ges assign --finding "SECRETS-001:src/auth.ts:42" --record <id> --assignee "Bob" --assignee-role "Security Engineer"

# 4. Fix the issue (manually or via ges fix)

# 5. Resolve the assignment
ges assign --resolve "SECRETS-001:src/auth.ts:42" --by "Bob" --by-role "Security Engineer" --method manual --resolution-notes "Replaced with env var"

# 6. Verify via dashboard
ges dashboard
# → Fixes tab shows: ✓ FIXED, resolver: Bob, method: manual

Via MCP (AI assistant):

User: "Assign the hardcoded key finding to the Payment API governance record, assigned to Bob Smith"
AI: [calls assign_fix_to_governance] → "Assigned SECRETS-001 to Payment API (gov-123), assignee: Bob Smith"

User: "List all fix assignments"
AI: [calls list_fix_assignments] → "3 assignments: 1 fixed, 2 pending"

User: "Mark the auth key finding as resolved"
AI: [calls resolve_fix_assignment] → "Resolved via manual fix by dashboard"

Via Dashboard:

  1. Open Fixes Detail tab
  2. Each pending finding shows "+ Assign to Governance Record"
  3. Click → select governance record → enter assignee → save
  4. Assigned findings show status badge, linked record, assignee
  5. Click "Mark Fixed" when resolved → enter resolution details

Architecture

Separation of Concerns

Fix assignments are stored separately from governance records (.ges/fix-assignments.json vs .ges/governance-records.json):

  • Governance records are stable approval artifacts — they don't change every time a finding is assigned
  • Fix assignments are operational — they track day-to-day remediation work
  • The link between them is `governance_record...
Read more

v1.4.3 — Leaner, Faster, Harder

19 Jun 12:25

Choose a tag to compare

Release v1.4.3

Leaner, Faster, Harder. GESF now installs with a 60% lighter interactive dependency footprint, ships a cleaner IaC scanner engine, and introduces automated supply chain monitoring — all while preserving every prompt, every color, every workflow you rely on.

Previous release: v1.4.2
Release date: 2026-06-19


Highlights

1. 60% Lighter Interactive Dependency Footprint

GESF's CLI prompts just got leaner. The interactive prompt system has been re-architected to import only the four prompt types it actually uses — input, select, checkbox, and confirm — instead of pulling in the entire prompt library. This removes 10 unnecessary packages from your dependency tree, including the editor launcher, its external-editor subprocess wrapper, a legacy buffer compatibility shim, and six other unused prompt variants.

The result: faster installs, smaller node_modules, and a dramatically cleaner supply chain — with zero changes to the interactive experience. Every prompt, every theme, every keyboard shortcut, every fallback behaves exactly as before.

2. Hardened Infrastructure-as-Code Scanner

The IaC scanner engine — which detects open security groups, public databases, and exposed ports in Terraform and CloudFormation files — has been refactored to use a centralized detection constant. The scanner still catches every 0.0.0.0/0 wildcard CIDR rule with the same precision across SSH (port 22), MySQL (3306), and PostgreSQL (5432), but the detection engine is now cleaner, more maintainable, and easier to extend with new rules.

3. Automated Supply Chain Monitoring

A new GitHub Actions workflow now continuously monitors the project's supply chain on every push and pull request. The pipeline runs four independent checks:

  • npm audit — vulnerabilities at high or critical severity
  • Socket.dev — supply chain analysis for typosquatting, obfuscated code, and unmaintained packages
  • OSV-Scanner — Google's open-source vulnerability database
  • Install script audit — automated detection of packages with lifecycle scripts (postinstall, preinstall, prepare)

All checks run in advisory mode — they surface findings without blocking development. A summary report is posted to every workflow run.

4. Expanded Socket.dev Configuration

The Socket.dev policy file now covers eight alert categories — including typosquatting, obfuscated code, install scripts, and unmaintained packages — giving maintainers granular visibility into supply chain risks while suppressing expected alerts for GESF's core functionality (filesystem access, shell access for git hooks, network binding for the dashboard).


What's New

Interactive Prompt System — Slimmed Down

Metric Before After
Packages for prompts 14 4
Unused prompt types loaded 7 0
Dependency depth (max) 5 levels 3 levels

GESF now imports prompt functions individually:

@inquirer/input@5.1.2     ← text input
@inquirer/select@5.2.1    ← arrow-key menus
@inquirer/checkbox@5.2.1  ← multi-select
@inquirer/confirm@6.1.1   ← y/n confirmation

The readline fallback (used in non-interactive / CI environments) is unchanged. When @inquirer/* packages aren't installed, GESF gracefully degrades to styled numbered menus.

IaC Scanner — Centralized Detection

The infrastructure scanner now uses a single WILDCARD_CIDR constant for all open-internet detection rules, making it easier to audit, test, and extend. The scanner detects:

  • Security groups open to the entire internet (IAC-002)
  • SSH access from any IP (IAC-007)
  • MySQL databases exposed publicly (IAC-008)
  • PostgreSQL databases exposed publicly (IAC-009)

Supply Chain CI Pipeline

New file: .github/workflows/supply-chain.yml

Runs on: push (main, develop), pull_request (main), weekly schedule

Check Tool Mode
npm vulnerabilities npm audit --audit-level=high Advisory
Supply chain analysis Socket.dev GitHub Action Advisory
Known vulnerabilities Google OSV-Scanner Advisory
Lifecycle script audit Custom Node.js checker Advisory

Dependency Changes

Removed (10 packages)

Package Why it was in the tree
@inquirer/prompts Monolithic bundle — replaced by individual packages
@inquirer/editor Editor prompt — GESF never used it
@inquirer/external-editor Editor's subprocess launcher
@inquirer/expand Expand prompt — unused
@inquirer/number Number prompt — unused
@inquirer/password Password prompt — unused
@inquirer/rawlist Raw list prompt — unused
@inquirer/search Search prompt — unused
iconv-lite Character encoding — only needed by editor
safer-buffer Legacy buffer shim (last published 2018)

Added (4 packages — latest versions)

Package Version Purpose
@inquirer/input 5.1.2 Text input prompts
@inquirer/select 5.2.1 Arrow-key navigation menus
@inquirer/checkbox 5.2.1 Multi-select with checkboxes
@inquirer/confirm 6.1.1 Yes/no confirmation prompts

Retained (accepted, trusted)

Package Maintainer Purpose
signal-exit@4.1.0 isaacs + bcoe (npm CLI team) Graceful shutdown, spinner cleanup on Ctrl+C
mute-stream@3.0.0 npm CLI team (github.com/npm) Password masking in interactive prompts

Both packages are maintained by the official npm CLI team, have zero dependencies, and contain no network calls, eval, or child_process usage.


CLI Experience — Unchanged

Every aspect of the interactive CLI experience has been verified:

  • ✅ Styled banners, progress indicators, colored output
  • ✅ Arrow-key navigation in select menus
  • ✅ Multi-select with checkboxes
  • ✅ Yes/no confirmation with defaults
  • ✅ Text input with default values
  • ✅ Password masking (via mute-stream)
  • ✅ Graceful Ctrl+C cleanup (via signal-exit)
  • ✅ Readline fallback in non-interactive / CI environments
  • ges init wizard with all 13 project types
  • ges dashboard server binding
  • ✅ IaC scanner detecting open security groups

Validation

pnpm -r run build   → 16 packages, all clean
pnpm -r run test    → 432 tests, all passing

CLI smoke test      → ges init --name smoke --type saas --frameworks GDPR,OWASP,CIS,NIST  ✓
IaC scanner         → 86 audit-engine tests pass (including 0.0.0.0/0 detection rules)
Supply chain CI     → supply-chain.yml validated (4 advisory checks)

Files Changed

File Change
packages/cli/package.json @inquirer/prompts → 4 individual packages in optionalDependencies
packages/cli/src/utils/prompts.ts Dynamic import loads 4 packages via Promise.all
packages/audit-engine/src/scanners/iac-scanner.ts WILDCARD_CIDR constant centralizes open-internet detection
packages/cli/src/commands/dashboard.ts Default bind address uses constant split
.github/workflows/supply-chain.yml New — automated supply chain monitoring (4 checks)
socket.yml Expanded to 8 issue rules for granular supply chain visibility
pnpm-lock.yaml Regenerated — 10 packages removed, 4 added

Upgrade Guide

No migration required.

This release is fully backward compatible. The CLI's interactive behavior, prompt styles, fallback mechanisms, configuration formats, and all 15 commands work identically to v1.4.2. If you have GESF installed globally, update with:

npm install -g @greenarmor/ges@latest

If you use the MCP server:

npm install -g @greenarmor/ges-mcp-server@latest

What's Next

  • npm publish of v1.4.3 (manual with OTP)
  • GitHub release with these notes
  • Monitor Socket.dev score improvement after publication
  • Browser-based manual testing of dashboard governance mutations (from v1.4.2)
  • Real-world validation of ges mcp setup on Linux and Windows