deployment-service.cjs sat at 52% and unraid-deploy-key-host.cjs at 39% of its functions, both hidden behind a healthy aggregate. They are now at 100% lines and functions, tested through real HTTP endpoints and by intercepting the shell script the key host sends, rather than by mocking the boundary away. What is pinned down: a successful workflow run still fails when the server cannot prove it runs that exact commit; a rollback ends as rolled-back rather than success; an unreachable status endpoint is never treated as healthy; a failed poll is recorded on the operation instead of losing it; deploy keys stay repository-scoped under the server base path with a pinned host key; promotion verifies the candidate before swapping atomically; and revocation moves key material to recovery instead of deleting it. Two assumptions turned out to be wrong and the tests follow the real behaviour: the previous-SHA check runs before the already-live check, and a rollback against an unreachable endpoint surfaces the underlying network error. Covering clone-target exposed a real defect: a remote ending in "....git" yielded the folder name "...". Windows strips trailing dots, so that resolves back to the project root itself, past an escape guard that only looks for "..". A dots-only name now falls back to "repository", consistent with how an empty name was already handled. As a side effect "." and ".." resolve to a usable folder instead of raising an error. Coverage gates: the aggregate moves to 85/85/68, and a new per-module gate (60 statements, 50 functions, 36 branches) stops a single module from silently collapsing behind the total. It reuses the data from the first run, so the suite is not executed twice. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
172 lines
5.8 KiB
JSON
172 lines
5.8 KiB
JSON
{
|
|
"name": "forgeflow",
|
|
"version": "0.10.12",
|
|
"private": true,
|
|
"description": "Desktop release cockpit for local Git, Gitea Actions and controlled exact-commit deployments.",
|
|
"main": "main.cjs",
|
|
"type": "module",
|
|
"scripts": {
|
|
"start": "electron .",
|
|
"dev": "electron . --dev",
|
|
"demo": "node scripts/serve-demo.mjs",
|
|
"test": "node --test tests/*.test.mjs",
|
|
"lint": "eslint .",
|
|
"coverage": "c8 --check-coverage --lines 85 --functions 85 --branches 68 --statements 85 node --test tests/*.test.mjs && npm run coverage:modules",
|
|
"coverage:modules": "c8 report --check-coverage --per-file --include src/** --statements 60 --lines 60 --functions 50 --branches 36 --reporter=text-summary",
|
|
"verify": "node scripts/verify.mjs",
|
|
"dist:win": "electron-builder --win nsis portable && node scripts/write-release-checksums.mjs && node scripts/verify-release-signatures.mjs && node scripts/prune-dist.mjs",
|
|
"dist:linux": "electron-builder --linux AppImage && node scripts/prune-dist.mjs",
|
|
"dist:mac": "electron-builder --mac dmg && node scripts/prune-dist.mjs",
|
|
"doctor": "node scripts/doctor.mjs",
|
|
"acceptance": "node scripts/acceptance.mjs",
|
|
"acceptance:isolated": "node --test tests/production-acceptance.test.mjs",
|
|
"architecture:audit": "node scripts/architecture-audit.mjs",
|
|
"test:browser": "playwright test",
|
|
"test:browser:ci": "playwright test --reporter=line,html",
|
|
"test:signing": "powershell.exe -NoProfile -ExecutionPolicy Bypass -File scripts/test-authenticode-chain.ps1",
|
|
"connections:check": "electron scripts/validate-installed-connections.cjs",
|
|
"deployments:audit": "electron scripts/audit-installed-deployments.cjs",
|
|
"release:binary": "electron scripts/publish-binary-release.cjs",
|
|
"manifest": "node scripts/generate-source-manifest.mjs",
|
|
"check": "npm run verify && npm run lint && npm test",
|
|
"quality": "npm run check && npm run coverage"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "9.39.5",
|
|
"@playwright/test": "1.62.0",
|
|
"c8": "12.0.0",
|
|
"electron": "43.2.0",
|
|
"electron-builder": "26.15.3",
|
|
"eslint": "9.39.5"
|
|
},
|
|
"build": {
|
|
"appId": "be.jenscaers.forgeflow",
|
|
"productName": "ForgeFlow",
|
|
"asar": true,
|
|
"files": [
|
|
"main.cjs",
|
|
"preload.cjs",
|
|
"src/**/*",
|
|
"package.json",
|
|
"build/icon.png",
|
|
"build/icon.ico",
|
|
"docs/SETUP_GUIDE.md",
|
|
"docs/DIAGNOSTICS.md",
|
|
"docs/STATUS_ENDPOINT.md",
|
|
"examples/gitea-actions/**/*",
|
|
"examples/server/**/*",
|
|
"README.md",
|
|
"START_HERE.md",
|
|
"docs/DEPLOYMENT_SETUP.md",
|
|
"docs/SECURITY.md",
|
|
"docs/TEST_MATRIX.md",
|
|
"docs/RELEASE_NOTES_0.3.0.md",
|
|
"docs/RELEASE_NOTES_0.3.1.md",
|
|
"docs/RELEASE_NOTES_0.3.2.md",
|
|
"docs/UPDATING.md",
|
|
"scripts/apply-source-update.ps1",
|
|
"scripts/apply-binary-update.ps1",
|
|
"scripts/prune-dist.mjs",
|
|
"docs/RELEASE_NOTES_0.4.0.md",
|
|
"docs/LUMAOPS_SERVER_AUDIT.md",
|
|
"docs/SSH_UNRAID_DEPLOYMENT.md",
|
|
"docs/RELEASE_NOTES_0.4.1.md",
|
|
"docs/RELEASE_NOTES_0.4.2.md",
|
|
"docs/RELEASE_NOTES_0.4.3.md",
|
|
"docs/RELEASE_NOTES_0.4.4.md",
|
|
"docs/RELEASE_NOTES_0.4.5.md",
|
|
"docs/RELEASE_NOTES_0.5.0.md",
|
|
"docs/RELEASE_NOTES_0.5.1.md",
|
|
"PUBLISH-AND-ENABLE-UPDATE.cmd",
|
|
"Publish-ForgeFlow-Release.ps1",
|
|
"Publish-Missing-Binary-Release.ps1",
|
|
"docs/RELEASE_NOTES_0.5.2.md",
|
|
"docs/RELEASE_NOTES_0.5.3.md",
|
|
"docs/RELEASE_NOTES_0.5.4.md",
|
|
"START-FORGEFLOW-OVERLAY.ps1",
|
|
"docs/RELEASE_NOTES_0.6.0.md",
|
|
"docs/RELEASE_AUDIT_0.6.0.md",
|
|
"docs/RELEASE_NOTES_0.6.1.md",
|
|
"docs/RELEASE_NOTES_0.7.0.md",
|
|
"docs/RELEASE_NOTES_0.8.0.md",
|
|
"docs/RELEASE_NOTES_0.8.1.md",
|
|
"docs/RELEASE_NOTES_0.8.2.md",
|
|
"docs/RELEASE_NOTES_0.8.3.md",
|
|
"docs/RELEASE_NOTES_0.8.4.md",
|
|
"docs/RELEASE_NOTES_0.8.5.md",
|
|
"docs/RELEASE_NOTES_0.8.6.md",
|
|
"docs/RELEASE_NOTES_0.8.7.md",
|
|
"docs/RELEASE_NOTES_0.8.8.md",
|
|
"docs/RELEASE_NOTES_0.8.9.md",
|
|
"docs/RELEASE_NOTES_0.9.0.md",
|
|
"docs/RELEASE_NOTES_0.9.1.md",
|
|
"docs/ACCEPTANCE.md",
|
|
"docs/RELEASE_NOTES_0.9.2.md",
|
|
"docs/RELEASE_NOTES_0.9.3.md",
|
|
"docs/RELEASE_NOTES_0.9.4.md",
|
|
"docs/RELEASE_NOTES_0.9.5.md",
|
|
"docs/RELEASE_NOTES_0.10.0.md",
|
|
"docs/RELEASE_NOTES_0.10.1.md",
|
|
"docs/RELEASE_NOTES_0.10.2.md",
|
|
"docs/RELEASE_NOTES_0.10.3.md",
|
|
"docs/RELEASE_NOTES_0.10.4.md",
|
|
"docs/RELEASE_NOTES_0.10.5.md",
|
|
"docs/RELEASE_NOTES_0.10.6.md",
|
|
"docs/RELEASE_NOTES_0.10.7.md",
|
|
"docs/RELEASE_NOTES_0.10.8.md",
|
|
"docs/RELEASE_NOTES_0.10.9.md",
|
|
"docs/RELEASE_NOTES_0.10.10.md",
|
|
"docs/RELEASE_NOTES_0.10.11.md",
|
|
"docs/RELEASE_NOTES_0.10.12.md",
|
|
"docs/CURRENT_STATE.md",
|
|
"docs/MUTATION_MODEL.md",
|
|
"docs/RELEASING.md",
|
|
"docs/COVERAGE_POLICY.md",
|
|
"docs/DEPENDENCY_AUDIT.md",
|
|
"docs/PRODUCTION_READINESS_1.0.md",
|
|
"docs/ERROR_CODES.md"
|
|
],
|
|
"asarUnpack": [
|
|
"scripts/apply-binary-update.ps1"
|
|
],
|
|
"directories": {
|
|
"output": "dist"
|
|
},
|
|
"win": {
|
|
"target": [
|
|
"nsis",
|
|
"portable"
|
|
],
|
|
"icon": "build/icon.ico"
|
|
},
|
|
"nsis": {
|
|
"artifactName": "${productName}-Setup-${version}-${os}-${arch}.${ext}"
|
|
},
|
|
"portable": {
|
|
"artifactName": "${productName}-Portable-${version}-${os}-${arch}.${ext}"
|
|
},
|
|
"linux": {
|
|
"target": [
|
|
"AppImage"
|
|
],
|
|
"category": "Development",
|
|
"icon": "build/icon.png"
|
|
},
|
|
"mac": {
|
|
"target": [
|
|
"dmg"
|
|
],
|
|
"category": "public.app-category.developer-tools",
|
|
"icon": "build/icon.png"
|
|
},
|
|
"artifactName": "${productName}-${version}-${os}-${arch}.${ext}"
|
|
},
|
|
"engines": {
|
|
"node": ">=22"
|
|
},
|
|
"author": "Jens",
|
|
"dependencies": {
|
|
"ssh2": "1.17.0"
|
|
}
|
|
}
|