Pin the Node toolchain, remove runtime npm repair, make CI and E2E truthful
Template tests / tests (pull_request) Failing after 1m26s
Template tests / tests (pull_request) Failing after 1m26s
Phase 0 of the improvement plan (ai_prompts/prompt4.md): make the baseline reproducible and stop the test runner from masking real failures. - Pin Node >= 22.12 (engines + .nvmrc + engine-strict); every entry point fails fast with clear guidance instead of dying late with ERR_REQUIRE_ESM inside the packaging dependency graph. - electron-launcher.js is diagnostics-only: all runtime npm install/rebuild/ repair paths are removed. npm ci on the pinned toolchain is the only supported install path (README + GETTING_STARTED updated). - Refuse to silently launch unsandboxed on Linux: --no-sandbox now requires an explicit STEPFORGE_ALLOW_NO_SANDBOX/ELECTRON_DISABLE_SANDBOX opt-in and is otherwise a hard error with actionable fixes; user-namespace sandboxing is detected and preferred. - Click-capture E2E no longer converts startup crashes into "SKIPPED": the only allowed skip is the upfront absence of a display server. A missing shared library or crash now fails with the startup log. Same guard added to the startup smoke check. - GitHub CI: run on pull_request, pin Node from .nvmrc, drop the macOS matrix entry (not a support target), and audit production and full dependency trees as separate signals. Gitea CI: pull_request trigger + pinned Node. - Refresh package-lock on Node 22/npm 10 and remediate the form-data and undici advisories (npm audit: 0 vulnerabilities, prod and full tree). - Stop tracking generated machine-specific build reports (build/build_report.md, build/artifacts_manifest.json). Verified: 203 unit tests pass; repo-structure, startup-smoke, unit-workflows, sample-artifacts, and build-release checks pass locally with a real Electron launch. The click self-test now truthfully reports the pre-existing Linux arm/debounce capture failures (also red on Gitea CI main run 177) instead of hiding behind SKIPPED; that defect is scheduled for the capture-fix PR. Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
@@ -1,218 +0,0 @@
|
||||
{
|
||||
"format": "stepforge-artifacts-manifest",
|
||||
"version": 1,
|
||||
"generatedAt": "2026-06-11T21:54:13.294Z",
|
||||
"packageVersion": "0.1.0",
|
||||
"files": [
|
||||
{
|
||||
"kind": "artifact",
|
||||
"path": "artifacts/stepforge_0.1.0_amd64.deb",
|
||||
"size": 103691640,
|
||||
"sha256": "320faa345f5997905fdc831c045dbe243490a7b4328680d105934f2aec1b4ffb"
|
||||
},
|
||||
{
|
||||
"kind": "artifact",
|
||||
"path": "artifacts/stepforge_0.1.0_linux-x64.tar.gz",
|
||||
"size": 139378628,
|
||||
"sha256": "32971595d4df40b429cb41ba644e57b84351ec1239b4bbe8d5b82fe3b01a4cc9"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/guide.json",
|
||||
"size": 843,
|
||||
"sha256": "0d7760246d96a85a4d79c15c1ab1a7e481bd79e1d8ff29d177ac6d35ffe6cde6"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-01-open-users/original.png",
|
||||
"size": 13643,
|
||||
"sha256": "09e12f935511bb6fabb5637501aa7743516b96d990adfab62ccfa311a7b60606"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-01-open-users/step.json",
|
||||
"size": 1593,
|
||||
"sha256": "36deb8a8b51952a668e871a03b1c7fba2aaf72b1722fd2d88c7e5d5cbbd8da91"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-01-open-users/working.png",
|
||||
"size": 13643,
|
||||
"sha256": "09e12f935511bb6fabb5637501aa7743516b96d990adfab62ccfa311a7b60606"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-02-enable-policy/original.png",
|
||||
"size": 14031,
|
||||
"sha256": "b5e93a0ee74e2bdbbdf0871e901726dfbdc8b45dd648c959743520f92b02e7a2"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-02-enable-policy/step.json",
|
||||
"size": 1873,
|
||||
"sha256": "4b0b3b74f851d034a2769c69df2e9d0428373ae15009fb3e2100afb5c10f7ebb"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-02-enable-policy/working.png",
|
||||
"size": 14031,
|
||||
"sha256": "b5e93a0ee74e2bdbbdf0871e901726dfbdc8b45dd648c959743520f92b02e7a2"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-02a-permission-prompt/step.json",
|
||||
"size": 763,
|
||||
"sha256": "e8539addbe730e3a1baaa6898bf9779d2ce80564aecb3f196619d8c7ff67cbae"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-03-review-confirmation/original.png",
|
||||
"size": 13602,
|
||||
"sha256": "c96eedffdc5fd2eb9b63942cc00f1c8a91d01a0c5c2316c1d12d750b9b49e3d0"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-03-review-confirmation/step.json",
|
||||
"size": 1968,
|
||||
"sha256": "6f1cbb9d2ed32b89dec3d221822c6e973dbba42c11e93c2b35499179e8481532"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-03-review-confirmation/working.png",
|
||||
"size": 13602,
|
||||
"sha256": "c96eedffdc5fd2eb9b63942cc00f1c8a91d01a0c5c2316c1d12d750b9b49e3d0"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-04-legacy-note/step.json",
|
||||
"size": 506,
|
||||
"sha256": "c6f78405f86f4183612f5865820b2454471cbc47975e9c15e055e7bf742b1eba"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-data/library/guides/guide-sample-reset-password/steps/step-sample-05-deprecated-flow/step.json",
|
||||
"size": 536,
|
||||
"sha256": "709887c0a5debddc851216920ee3f6f2766e986059b21ac399e2533611ab5aed"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/docx/reset-a-password-in-admin-portal.docx",
|
||||
"size": 110463,
|
||||
"sha256": "be9e2b550b732fc6cd4a171b72749b49fe67730ee9969f69c23175688b0bea14"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/gif/reset-a-password-in-admin-portal.gif",
|
||||
"size": 32090,
|
||||
"sha256": "70a789c6ce1aa6154c65d0ee88a286d888fdfd9fd5c3045a14242e13df5ca263"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/html-rich/reset-a-password-in-admin-portal-rich.html",
|
||||
"size": 149884,
|
||||
"sha256": "70695d55c37d69abb191e65675f726eaa7aea6686a15a2e7d387195441e3ca8c"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/html-simple/reset-a-password-in-admin-portal.html",
|
||||
"size": 146646,
|
||||
"sha256": "860c774b9b8bfd821b22deadc21f8021dc66bc9cacf43702eecbf55e944c6a9a"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/image-bundle/reset-a-password-in-admin-portal-bundle.json",
|
||||
"size": 779,
|
||||
"sha256": "0108a63331925ea1fdd03326dd37dce1af3642a02d167e583d0d67b50fce27fa"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/image-bundle/steps-reset-a-password-in-admin-portal/001-open-admin-portal-users.png",
|
||||
"size": 31424,
|
||||
"sha256": "892a3174e9876ebfab4c879d6d579cf8ad6eba2f299ad95feff33adaf205e042"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/image-bundle/steps-reset-a-password-in-admin-portal/002-enable-the-reset-policy.png",
|
||||
"size": 38991,
|
||||
"sha256": "f1c79fb2baa1ef41dd85b04be59cc796f3822858654612044a22e27f20d0696a"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/image-bundle/steps-reset-a-password-in-admin-portal/004-review-the-confirmation.png",
|
||||
"size": 37274,
|
||||
"sha256": "32c5e15f8a04d6af01b7d139cff732872d5ce7e3e519be6ece99cca4167856ed"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/json/reset-a-password-in-admin-portal.json",
|
||||
"size": 6740,
|
||||
"sha256": "4a27376e75c3bb33fa8e1c4117c3314a04ec4766d67a9b5c729180d116d384d1"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/json/steps-reset-a-password-in-admin-portal/001-open-admin-portal-users.png",
|
||||
"size": 31424,
|
||||
"sha256": "892a3174e9876ebfab4c879d6d579cf8ad6eba2f299ad95feff33adaf205e042"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/json/steps-reset-a-password-in-admin-portal/002-enable-the-reset-policy.png",
|
||||
"size": 38991,
|
||||
"sha256": "f1c79fb2baa1ef41dd85b04be59cc796f3822858654612044a22e27f20d0696a"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/json/steps-reset-a-password-in-admin-portal/004-review-the-confirmation.png",
|
||||
"size": 37274,
|
||||
"sha256": "32c5e15f8a04d6af01b7d139cff732872d5ce7e3e519be6ece99cca4167856ed"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/markdown/reset-a-password-in-admin-portal.md",
|
||||
"size": 1186,
|
||||
"sha256": "16bbd2eb8850d8a55914abe9ece4d2aee465820fcd6c5ffde8925f37dd2b115b"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/markdown/steps-reset-a-password-in-admin-portal/001-open-admin-portal-users.png",
|
||||
"size": 31424,
|
||||
"sha256": "892a3174e9876ebfab4c879d6d579cf8ad6eba2f299ad95feff33adaf205e042"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/markdown/steps-reset-a-password-in-admin-portal/002-enable-the-reset-policy.png",
|
||||
"size": 38991,
|
||||
"sha256": "f1c79fb2baa1ef41dd85b04be59cc796f3822858654612044a22e27f20d0696a"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/markdown/steps-reset-a-password-in-admin-portal/004-review-the-confirmation.png",
|
||||
"size": 37274,
|
||||
"sha256": "32c5e15f8a04d6af01b7d139cff732872d5ce7e3e519be6ece99cca4167856ed"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/pdf/reset-a-password-in-admin-portal.pdf",
|
||||
"size": 103120,
|
||||
"sha256": "58a952a2f95653a91d4e662e4bc2ddcb0177de33e51a8f9e454cdf158ba3a795"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-exports/pptx/reset-a-password-in-admin-portal.pptx",
|
||||
"size": 117643,
|
||||
"sha256": "4ce1e82903b726c549e53235e3fd4c70cf647123ccd823052030e2e1b9449864"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-guide.sfgz",
|
||||
"size": 88427,
|
||||
"sha256": "313b88f48e53e5ad7fb4e0a8189700ba0f6be642ec2311b1a2fe7ea4f3dd0481"
|
||||
},
|
||||
{
|
||||
"kind": "sample",
|
||||
"path": "../examples/sample-manifest.json",
|
||||
"size": 1163,
|
||||
"sha256": "cb2920e7500758074f1f54867db1ed187d3304c8badbceb06fd611057bd6fe5d"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
# StepForge Build Report
|
||||
|
||||
Version: 0.1.0
|
||||
Generated: 2026-06-11T21:54:13.292Z
|
||||
Host: linux x64 (node v20.20.2)
|
||||
|
||||
## Outputs
|
||||
|
||||
- Portable tarball: artifacts/stepforge_0.1.0_linux-x64.tar.gz
|
||||
- Debian package: artifacts/stepforge_0.1.0_amd64.deb
|
||||
- Sample guide archive: ../examples/sample-guide.sfgz
|
||||
- Sample exports (9 formats): see examples/sample-exports/
|
||||
- Full artifact list with sha256 checksums: artifacts_manifest.json
|
||||
|
||||
## Packaging tool availability
|
||||
|
||||
| Tool | Status |
|
||||
|---|---|
|
||||
| dpkg-deb (Linux .deb) | available |
|
||||
| rpmbuild (Linux .rpm) | **missing** |
|
||||
| appimagetool (Linux AppImage) | **missing** |
|
||||
| makensis (Windows installer .exe) | **missing** |
|
||||
| wixl / WiX (Windows .msi) | **missing** |
|
||||
|
||||
Fallback policy: when a packaging tool is missing the build still produces
|
||||
the runnable app (portable tarball with launcher) plus whatever package
|
||||
formats the available tools allow. Windows artifacts are produced by
|
||||
`npm run package:windows` (electron-builder, portable .exe); .msi/.rpm/
|
||||
AppImage require the tools listed above and are skipped on this host.
|
||||
|
||||
## Offline guarantee
|
||||
|
||||
- The shipped app opens no sockets: no telemetry, update checks, license
|
||||
checks, cloud sync, or remote AI. See docs/SECURITY.md.
|
||||
- All exporters (PNG/GIF/PDF/DOCX/PPTX/ZIP) are implemented in-repo with
|
||||
Node built-ins; Electron is the only third-party dependency
|
||||
(dev-time fetch recorded in build/agent_audit.md).
|
||||
|
||||
## Verification
|
||||
|
||||
- `bash tests/run_test.sh` runs the workflow suites (node --test), a
|
||||
startup smoke test of the Electron launcher, the sample-artifact
|
||||
pipeline, and this release build.
|
||||
Reference in New Issue
Block a user