From 8fa4891075e1c91ed670e1d8ca939c028c89fac6 Mon Sep 17 00:00:00 2001 From: NuklearRabbit <145918611+NuklearRabbit@users.noreply.github.com> Date: Sat, 1 Aug 2026 17:32:40 +0200 Subject: [PATCH] chore: release ForgeFlow 0.10.5 --- README.md | 2 +- SOURCE_MANIFEST.txt | 17 ++- docs/RELEASE_NOTES_0.10.5.md | 10 ++ package-lock.json | 4 +- package.json | 3 +- reports/architecture-audit.json | 196 +++++++++++++------------ reports/architecture-audit.md | 5 +- scripts/verify.mjs | 9 +- src/renderer/mock-repository-bridge.js | 2 +- 9 files changed, 141 insertions(+), 107 deletions(-) create mode 100644 docs/RELEASE_NOTES_0.10.5.md diff --git a/README.md b/README.md index 3ac8708..6d83381 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ForgeFlow is een Windows-desktopapp voor wie Git, Gitea en eigen Docker- of Unraid-servers gebruikt. Je ziet in één werkruimte wat lokaal gewijzigd is, wat op Gitea staat en welke exacte commit op de server draait. ForgeFlow begeleidt je daarna veilig door review, commit, push, deployment en verificatie. -> Huidige release: **0.10.4** · [download de laatste Windows-release](https://gitea.itworx.tech/Jens/ForgeFlow/releases/latest) +> Huidige release: **0.10.5** · [download de laatste Windows-release](https://gitea.itworx.tech/Jens/ForgeFlow/releases/latest) ![ForgeFlow release-overzicht](docs/screenshots/overview.png) diff --git a/SOURCE_MANIFEST.txt b/SOURCE_MANIFEST.txt index 49a2541..720b875 100644 --- a/SOURCE_MANIFEST.txt +++ b/SOURCE_MANIFEST.txt @@ -1,4 +1,4 @@ -ForgeFlow 0.10.4 source manifest +ForgeFlow 0.10.5 source manifest SHA-256 BYTES PATH (The manifest excludes itself, dependencies and generated release artifacts.) cedceb71eb846d99c7c4019031833c1c7f93b84a1c6073aec7d2435dc744ca3d 703 .gitea/workflows/quality.yml @@ -37,6 +37,7 @@ f79908fb3dad98c38030c6e6be7c79a1999e0478ed9c2496923891954438daa1 4581 8d713471a437a8a55b00d7e1dd95290680862107bc4e586cf27d727f6274e46c 577 docs/RELEASE_NOTES_0.10.2.md 0942fb2c4a4f972296423b5232687f7389e2c6417a9d48a3244beef9dec907b9 1164 docs/RELEASE_NOTES_0.10.3.md 8f4a0fe6dc250ae210cc2fc1c57c46091822ae6c2a58caa76e0091f255f9f30d 775 docs/RELEASE_NOTES_0.10.4.md +05ed618f5a74a854363930128ca98939808517eedd28b9a508660a0c46e91d97 884 docs/RELEASE_NOTES_0.10.5.md a0c00ff76acd1682bb5e0e8dcf6589c9480da436c9c6d30780a1ed58b4dad94f 1770 docs/RELEASE_NOTES_0.2.0.md 5773ead01aa4c522c556295553787482d01b1f5242f053b2c61f120c4de4fa76 5963 docs/RELEASE_NOTES_0.3.0.md d46de73cf6c4cd5c2ba3f455a7a2af2e0d64ee9d94a97fd1a0bfb44e35c1624a 1093 docs/RELEASE_NOTES_0.3.1.md @@ -98,16 +99,16 @@ c230b931abf2293d2d44b7a69b94c35f1142c093cc46b88739a0de5cbd6d1896 1532 4a561ead5ba7cdfaf4efce91842a4308c5f2a77980205879d83835efb8a579db 1067 LICENSE 1f0f388df4397e548887bbc7579fd3c864581b86469c01703201ece7a6cbf931 13667 main.cjs 91a984a89dd57a084b9a2331763cacdb061582fb590f13df379d92c1a77a2ee1 352 OVERLAY-INSTRUCTIONS.md -58e26cc15df56efc6413b7c45a3dda0997a86758616da9c2479ef859091d475f 179806 package-lock.json -5b51588b7ef64f3a94ecad5fb5e5df4b26640614fdf5d69851875741a17e0c72 5474 package.json +790e0d43b1e4858b72132657bafd83a55c044732cfffbc4ef6e622d74d453a86 179806 package-lock.json +9567d1f28ab27a02361fbe7fce8e17c13558e6c0bfa58763ec27a2b5728dcf42 5512 package.json 2a597a5704c576783b8a72407fbc377fa7506b36a4596ea7f7bce126e394f837 1326 playwright.config.mjs 69318fdf054be7aa2fe86ead9847da9da65745d8d5de548c8346f3ba0afc4892 12175 preload.cjs abe5dd6fd68f2970cd19ef134094907c67219061d8fe9a1a08324c78de4ad437 484 PUBLISH-AND-ENABLE-UPDATE.cmd f018383f755352ca448e2ebb1e19b1dba412a3eb793d61e64b02953e300754fd 10538 Publish-ForgeFlow-Release.ps1 688fff7d2c989adb97ebb7fae38962656b70304a0aa5d27433c56adf7f136de0 4196 Publish-Missing-Binary-Release.ps1 -ae6ee934ace29cf16106b40ea669578b4d4f754dae0c06e162820a1d66d9ff0d 10313 README.md -1fa7bf646321e07e40d98f4a7529d5f748c600edd5283f62ee13574b4e97280f 14329 reports/architecture-audit.json -c1ff18f1367691332b189bb7589843a5e0bbde4817e3dd29df4ade7ea71dbd52 1114 reports/architecture-audit.md +49a88c060629741cb6e16e597a2d432ce4350d0e1fb4b574802b67d6b872ebe6 10313 README.md +8f8dc5ff0c2967563457e4027d795f6f515253e0a459ecca5a9f5bcf0b658870 14650 reports/architecture-audit.json +5e923f0096895f588fe66b187779cdb7cb5af6644010c6dcc4d55876930ae376 1220 reports/architecture-audit.md 509c7bcff5280349bd9f45ed6151f70372bad7010a9ea582c13e2ccab91fe0cd 6272 scripts/acceptance.mjs 8fe616851e6a089a59fd134905465019c33d26f6408ebd0613fff587b6c589e0 4400 scripts/apply-binary-update.ps1 706b49e001837c91134044d3af132d58fb14955245bc1d5c36b413eb65867002 10486 scripts/apply-source-update.ps1 @@ -121,7 +122,7 @@ b83d443f5724ac15393567f3a688aed8315fbe3e5966832c864a9466e0669464 8102 c76507857292c5713e1c699cf02e24b80265da39af2cecd148034bdb874adbb6 5246 scripts/test-authenticode-chain.ps1 4393f7dc5f417e6d601a68238f4e26791799a3634acec228fe4d79deaee85eb5 3109 scripts/validate-installed-connections.cjs e6127e1e62f39c70ddb1abf72f4d7e7b8e3f19ff1f219e1a3660353c2e0cdfac 2411 scripts/verify-release-signatures.mjs -f32f00dc6740019578e811d9fa1b8c38592394475005a5a98360f94fdac7b81d 18500 scripts/verify.mjs +b7fc78dfc7c94d62822109cb3c8c2e9566c9506b0a08f6cff8141ee93a04e530 18854 scripts/verify.mjs 0b9f03ba3c67ff7cdb2916a902ad8ce25e81a7c90b210e4ae52d2ad029efabf3 2353 scripts/write-release-checksums.mjs 619515f524cb89960370ffcbd3fafd3c0e178b95f69c5868b1dd44777f23ec1e 2081 setup-windows.ps1 dd613d04b366f2cd071a1685a414016a5fb008082ed1b4cb8b24b79c100f640a 2412 src/main/audit-service.cjs @@ -176,7 +177,7 @@ eef2f269ba4fbb76bf66ad328d481b461255d0acb753b30878dd4d4eaac57dc6 6924 a84da5aecbb16ce7983dba1f6d6aab1bf47b2e9a87c2933fa1afb8123f7ef7d6 1497 src/renderer/index.html 06180d9656dd254edfb6949c397f8e313954fc560ddcb22b3a35fce3c3e35655 21350 src/renderer/mock-bridge.js 5a2c0616a8a0ba23c182a8928abdf40a69612ce34c4cba47b1fd5f21fe5843d4 28617 src/renderer/mock-deployment-bridge.js -123518a4cfd47b7e510ffab9102a2fd82edc93754aaabd7bc0259d51dfce5d63 20032 src/renderer/mock-repository-bridge.js +f1d341459689f879b403b3769bca37209afe0f227cc8ac1dad7db7a96c747013 20032 src/renderer/mock-repository-bridge.js 94fa265c2fe9ca8d644f0ce9b620b6f85d9b25dca5802c4e9195b66dcbe80120 6522 src/renderer/operations.js 1fc4c28859f7283aa2b771a50f1fd26addc8862b97a09250f806930ab4483f7a 79874 src/renderer/styles.css 5230c238acb87381303ec30026906cf8a7163c33380859d351b268adfc26b4f4 100196 src/renderer/views.js diff --git a/docs/RELEASE_NOTES_0.10.5.md b/docs/RELEASE_NOTES_0.10.5.md new file mode 100644 index 0000000..fc5685f --- /dev/null +++ b/docs/RELEASE_NOTES_0.10.5.md @@ -0,0 +1,10 @@ +# ForgeFlow 0.10.5 + +## Consistent repository and deployment links + +- Every repository workspace now shows all configured deployment environments in a compact, directly actionable strip. +- The repository deployment tab includes every detected server workload linked to that repository, including its container, Compose identity, server and runtime state. +- A workload is only labelled linked when its repository and resolved profile both exist in the current ForgeFlow configuration. +- Stale or incomplete metadata is shown as **Link unresolved** and routed through explicit reconciliation instead of being presented as a healthy deployment. +- The global deployment inventory links directly to the correct repository deployment profile. +- Responsive browser coverage now verifies valid links, unresolved links, repository navigation and scrolling across dark/light and scaled layouts. diff --git a/package-lock.json b/package-lock.json index ec1b7dd..7427754 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "forgeflow", - "version": "0.10.4", + "version": "0.10.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "forgeflow", - "version": "0.10.4", + "version": "0.10.5", "dependencies": { "ssh2": "1.17.0" }, diff --git a/package.json b/package.json index 213e49d..9a90668 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "forgeflow", - "version": "0.10.4", + "version": "0.10.5", "private": true, "description": "Desktop release cockpit for local Git, Gitea Actions and controlled exact-commit deployments.", "main": "main.cjs", @@ -109,6 +109,7 @@ "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/CURRENT_STATE.md", "docs/MUTATION_MODEL.md", "docs/RELEASING.md", diff --git a/reports/architecture-audit.json b/reports/architecture-audit.json index 1806ae3..9545df6 100644 --- a/reports/architecture-audit.json +++ b/reports/architecture-audit.json @@ -1,5 +1,5 @@ { - "generatedAt": "2026-07-29T22:49:48.766Z", + "generatedAt": "2026-08-01T15:23:33.157Z", "thresholds": { "preferredMaximumLines": 750, "justificationRequiredLines": 1000 @@ -9,9 +9,9 @@ "cyclomaticHotspots": [ { "file": "src/renderer/actions/shell.js", - "lines": 506, - "branches": 98, - "functions": 84, + "lines": 518, + "branches": 101, + "functions": 86, "ipcHandlers": 0, "responsibilities": [ "inventory", @@ -20,50 +20,7 @@ "renderer", "updates" ], - "hotspotScore": 128 - }, - { - "file": "src/main/server-inventory.cjs", - "lines": 578, - "branches": 89, - "functions": 104, - "ipcHandlers": 0, - "responsibilities": [ - "inventory", - "deployment", - "git", - "security", - "updates" - ], - "hotspotScore": 119 - }, - { - "file": "src/main/git-service.cjs", - "lines": 632, - "branches": 98, - "functions": 109, - "ipcHandlers": 0, - "responsibilities": [ - "git" - ], - "hotspotScore": 98 - } - ], - "mixedResponsibilityModules": [ - { - "file": "src/renderer/actions/shell.js", - "lines": 506, - "branches": 98, - "functions": 84, - "ipcHandlers": 0, - "responsibilities": [ - "inventory", - "deployment", - "git", - "renderer", - "updates" - ], - "hotspotScore": 128 + "hotspotScore": 131 }, { "file": "src/main/server-inventory.cjs", @@ -82,9 +39,9 @@ }, { "file": "src/renderer/app.js", - "lines": 667, - "branches": 74, - "functions": 110, + "lines": 676, + "branches": 75, + "functions": 113, "ipcHandlers": 0, "responsibilities": [ "inventory", @@ -94,7 +51,66 @@ "security", "updates" ], - "hotspotScore": 114 + "hotspotScore": 115 + }, + { + "file": "src/main/git-service.cjs", + "lines": 632, + "branches": 98, + "functions": 109, + "ipcHandlers": 0, + "responsibilities": [ + "git" + ], + "hotspotScore": 98 + } + ], + "mixedResponsibilityModules": [ + { + "file": "src/renderer/actions/shell.js", + "lines": 518, + "branches": 101, + "functions": 86, + "ipcHandlers": 0, + "responsibilities": [ + "inventory", + "deployment", + "git", + "renderer", + "updates" + ], + "hotspotScore": 131 + }, + { + "file": "src/main/server-inventory.cjs", + "lines": 578, + "branches": 89, + "functions": 104, + "ipcHandlers": 0, + "responsibilities": [ + "inventory", + "deployment", + "git", + "security", + "updates" + ], + "hotspotScore": 119 + }, + { + "file": "src/renderer/app.js", + "lines": 676, + "branches": 75, + "functions": 113, + "ipcHandlers": 0, + "responsibilities": [ + "inventory", + "deployment", + "git", + "renderer", + "security", + "updates" + ], + "hotspotScore": 115 }, { "file": "src/main/ipc.cjs", @@ -130,9 +146,9 @@ }, { "file": "src/renderer/views.js", - "lines": 693, - "branches": 53, - "functions": 138, + "lines": 737, + "branches": 55, + "functions": 156, "ipcHandlers": 0, "responsibilities": [ "inventory", @@ -142,7 +158,7 @@ "security", "updates" ], - "hotspotScore": 93 + "hotspotScore": 95 }, { "file": "src/main/unraid-inventory-methods.cjs", @@ -176,8 +192,8 @@ }, { "file": "src/main/gitea-service.cjs", - "lines": 618, - "branches": 66, + "lines": 624, + "branches": 67, "functions": 57, "ipcHandlers": 0, "responsibilities": [ @@ -186,7 +202,7 @@ "security", "updates" ], - "hotspotScore": 86 + "hotspotScore": 87 }, { "file": "src/renderer/actions/deployment-profile.js", @@ -312,6 +328,35 @@ ], "hotspotScore": 73 }, + { + "file": "src/renderer/events.js", + "lines": 181, + "branches": 35, + "functions": 27, + "ipcHandlers": 0, + "responsibilities": [ + "inventory", + "deployment", + "git", + "renderer", + "security" + ], + "hotspotScore": 65 + }, + { + "file": "src/main/git-validator-service.cjs", + "lines": 600, + "branches": 43, + "functions": 77, + "ipcHandlers": 0, + "responsibilities": [ + "deployment", + "git", + "security", + "updates" + ], + "hotspotScore": 63 + }, { "file": "src/main/ssh-service.cjs", "lines": 333, @@ -341,35 +386,6 @@ ], "hotspotScore": 61 }, - { - "file": "src/renderer/events.js", - "lines": 172, - "branches": 31, - "functions": 26, - "ipcHandlers": 0, - "responsibilities": [ - "inventory", - "deployment", - "git", - "renderer", - "security" - ], - "hotspotScore": 61 - }, - { - "file": "src/main/git-validator-service.cjs", - "lines": 588, - "branches": 40, - "functions": 74, - "ipcHandlers": 0, - "responsibilities": [ - "deployment", - "git", - "security", - "updates" - ], - "hotspotScore": 60 - }, { "file": "src/main/unraid-deployment-service.cjs", "lines": 525, @@ -477,7 +493,7 @@ }, { "file": "src/renderer/mock-deployment-bridge.js", - "lines": 679, + "lines": 699, "branches": 11, "functions": 87, "ipcHandlers": 0, @@ -686,7 +702,7 @@ }, { "file": "src/main/ipc/repository-handlers.cjs", - "lines": 411, + "lines": 413, "branches": 16, "functions": 79, "ipcHandlers": 51, diff --git a/reports/architecture-audit.md b/reports/architecture-audit.md index 6a1044f..e3c802c 100644 --- a/reports/architecture-audit.md +++ b/reports/architecture-audit.md @@ -1,6 +1,6 @@ # ForgeFlow architecture audit -Generated 2026-07-29T22:49:48.766Z. Complexity is a deterministic decision-point count used for hotspot ranking, not a claim of exact McCabe complexity. +Generated 2026-08-01T15:23:33.157Z. Complexity is a deterministic decision-point count used for hotspot ranking, not a claim of exact McCabe complexity. ## Files above 750 lines @@ -18,8 +18,9 @@ No findings. | File | Lines | Decisions | Functions | IPC handlers | Responsibilities | |---|---:|---:|---:|---:|---| -| `src/renderer/actions/shell.js` | 506 | 98 | 84 | 0 | inventory, deployment, git, renderer, updates | +| `src/renderer/actions/shell.js` | 518 | 101 | 86 | 0 | inventory, deployment, git, renderer, updates | | `src/main/server-inventory.cjs` | 578 | 89 | 104 | 0 | inventory, deployment, git, security, updates | +| `src/renderer/app.js` | 676 | 75 | 113 | 0 | inventory, deployment, git, renderer, security, updates | | `src/main/git-service.cjs` | 632 | 98 | 109 | 0 | git | ## Interpretation diff --git a/scripts/verify.mjs b/scripts/verify.mjs index 3328c43..67d6c68 100644 --- a/scripts/verify.mjs +++ b/scripts/verify.mjs @@ -84,6 +84,7 @@ const required = [ "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/UPDATING.md", "docs/DIAGNOSTICS.md", "docs/DEPLOYMENT_SETUP.md", @@ -122,9 +123,9 @@ for (const file of required) await access(path.join(root, file)); const packageJson = JSON.parse( await readFile(path.join(root, "package.json"), "utf8"), ); -if (packageJson.version !== "0.10.4") +if (packageJson.version !== "0.10.5") throw new Error( - `Expected package version 0.10.4, got ${packageJson.version}.`, + `Expected package version 0.10.5, got ${packageJson.version}.`, ); const sourceManifest = await readFile( path.join(root, "SOURCE_MANIFEST.txt"), @@ -454,6 +455,10 @@ const release0104 = await readFile(path.join(root, "docs/RELEASE_NOTES_0.10.4.md for (const phrase of ["Windows PowerShell 5.1", "atomic status", "handshake-only", "existing installations"]) { if (!release0104.includes(phrase)) throw new Error(`0.10.4 release notes are missing: ${phrase}`); } +const release0105 = await readFile(path.join(root, "docs/RELEASE_NOTES_0.10.5.md"), "utf8"); +for (const phrase of ["repository workspace", "resolved profile", "Link unresolved", "reconciliation", "server workload"]) { + if (!release0105.includes(phrase)) throw new Error(`0.10.5 release notes are missing: ${phrase}`); +} const configSource = await readFile(path.join(root, "src/main/config-store.cjs"), "utf8"); for (const mode of ["server-git", "push-bundle", "monitor-only"]) { if (!configSource.includes(mode)) throw new Error(`Deployment configuration is missing mode: ${mode}`); diff --git a/src/renderer/mock-repository-bridge.js b/src/renderer/mock-repository-bridge.js index 3bfea9c..a034abf 100644 --- a/src/renderer/mock-repository-bridge.js +++ b/src/renderer/mock-repository-bridge.js @@ -5,7 +5,7 @@ function createMockRepositoryBridge(context) { await wait(80); snapshot(); return { - appVersion: "0.10.4-demo", + appVersion: "0.10.5-demo", platform: "win32", state: clone(state), git: { available: true, version: "git version 2.47.3" },