Releases: greenarmor/gesf
v1.5.8 — Fixes regression in v1.5.7 where all dashbaord tabs become unclickable
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— Restoredwindow.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 --checkon 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@latestIf 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
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 initvia 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 withgenesis_governance_record_idpackages/web-dashboard/src/template.ts—openAssignModalrenders inline create form whengovRecordsForAssignis empty; newsubmitCreateAndAssignForm()does create-record + assign-fix in sequencepackages/web-dashboard/src/index.test.ts— +2 tests (inline create form JS renders when empty; governance records render ingovRecordsForAssignwhen 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@latestExisting 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 --forcev1.5.6 — Security Gating & CI/CD Auto-Aware Workflows
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.yaml→pnpm install --frozen-lockfile+pnpm auditpackage-lock.json→npm ci+npm audityarn.lock→yarn 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.gesignoreprocessing, 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 initmissing in CI —.ges/is gitignored, soges audit --cifailed with "GESF not initialized." Addedges init --forcestep before audit incompliance.yml.- Broken GitHub Actions — Removed
Socket-security/socket-security-action(wrong repo name, required unconfigured API token) andgoogle/osv-scanner-action@v2(version doesn't exist, redundant with Trivy) fromsupply-chain.yml. - pnpm version conflict —
pnpm/action-setup@v4withversion: 9conflicted withpackageManager: "pnpm@11.4.0"inpackage.json(ERR_PNPM_BAD_PM_VERSION). Removed version pin — now auto-detects frompackage.json. npm cion pnpm repo — GESF uses pnpm but workflow rannpm ci(nopackage-lock.json). Fixed with auto-detecting package manager steps.- Version drift — GESF version was hardcoded as
"1.5.5"in cicd-generator. Now importsGESF_VERSIONfrom@greenarmor/ges-coredynamically. - Country hardcoded — Generated workflows always used
--country "US-CA". Now flows fromconfig.countryset duringges init. - Trivy
continue-on-error: true— Dependency scanner was advisory-only. Trivy now usesexit-code: '1'(hard gate). Package manager audit remains advisory (inconsistent exit codes across pnpm versions).
Changes to Generated Workflows (for consumers)
Removed
ges scan --cifrom 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 ciis guarded bypackage-lock.jsoncheck- Country flows from config (not hardcoded)
- GESF version is dynamic
Upgrade Guide
For GESF repo
- Pull
master— workflows in.github/workflows/are updated - No migration needed — existing workflows are overwritten on next
ges init
For consumer projects
- Update:
npm install -g @greenarmor/ges@1.5.6 - Re-run:
ges init --force - Review generated
.github/workflows/— all 5 are updated - (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
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 --versionshows 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 installges update --disable-checks— silence all update notificationsges 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 componentsFull 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.shto generate
Install / upgrade:
npm install -g @greenarmor/ges@1.5.5
# or
npx @greenarmor/ges@1.5.5 --versionFull changelog: v1.5.4...v1.5.5
v1.5.4 — Governance
Release v1.5.4 — Governance Subcommand Next-Action Menus
Patch release.
ges governance list,show, andverifynow 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-awareselect()menu after read-only subcommands. Dispatches chosen action viaexecSync. - Updated
listaction (line 422) — callsshowGovernanceNextAction(root, records)after printing records. Also handles empty-state (calls the helper, which still offers "Create new record"). - Updated
showaction (line 564) — callsshowGovernanceNextAction(root, [record], record.id)after printing the full provenance chain. - Updated
verifyaction (line 619) — callsshowGovernanceNextAction(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 listFull changelog: v1.5.3...v1.5.4
v1.5.3 - CLI Interactive Menus & Documentation Completeness
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 newges assignuser 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:lineformat) - Data storage —
.ges/fix-assignments.jsonstructure - 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/gesExisting projects continue to work unchanged. No migration needed.
v1.5.2 — Atomic File Writes (Corruption Prevention)
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 |
New — safeWriteJson, 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@latestIf you use the MCP server:
npm install -g @greenarmor/ges-mcp-server@latestAll 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
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@latestThe 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
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_resolveactions - 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 unassignedfix_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: manualVia 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:
- Open Fixes Detail tab
- Each pending finding shows "+ Assign to Governance Record"
- Click → select governance record → enter assignee → save
- Assigned findings show status badge, linked record, assignee
- 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...
v1.4.3 — Leaner, Faster, Harder
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 initwizard with all 13 project types - ✅
ges dashboardserver 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@latestIf you use the MCP server:
npm install -g @greenarmor/ges-mcp-server@latestWhat'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 setupon Linux and Windows