Add sample guide, sample exports, and enriched build report

- examples/: sample guide store, .sfgz share archive, and exported
  output in all nine formats (JSON/MD/HTML×2/PDF/GIF/images/DOCX/PPTX)
- build_report.md now records packaging tool availability, fallback
  policy, offline guarantee, and verification entrypoints
- artifacts_manifest.json with sha256 checksums for packages + samples
- CHANGELOG entries for the welcome screen and renderer fixes

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Iisyourdad
2026-06-10 21:33:58 -05:00
parent 03bd9b0e2b
commit a0a1bb5cfc
37 changed files with 1245 additions and 4 deletions
+16
View File
@@ -9,6 +9,22 @@ Initial release.
### Added ### Added
- Welcome screen on launch: app title with three actions — New Capture
(creates a guide, opens the editor, and starts a capture session),
Existing Workspace (guide library), and Settings. The brand button
returns to the welcome screen from any view.
### Fixed
- Renderer scripts no longer collide in the shared global scope (the app
previously failed to boot with a blank window).
- Focused-view toggle persists correctly (`step.focusedView.enabled`).
- Annotation style edits no longer steal input focus on each keystroke.
- Step list stays in sync after saves and undo/redo.
- Escape deselects the active annotation instead of deleting it.
### Added (initial feature set)
- Guide library with folders, favorites, title + full-text search, and a - Guide library with folders, favorites, title + full-text search, and a
quick-actions palette. quick-actions palette.
- Capture engine: full-screen / active-window / region capture, delay, - Capture engine: full-screen / active-window / region capture, delay,
+218
View File
@@ -0,0 +1,218 @@
{
"format": "stepforge-artifacts-manifest",
"version": 1,
"generatedAt": "2026-06-11T02:33:30.203Z",
"packageVersion": "0.1.0",
"files": [
{
"kind": "artifact",
"path": "artifacts/stepforge_0.1.0_amd64.deb",
"size": 103679916,
"sha256": "e568d19b18dbd5be3f2bde1c3e6b70ce79243ba697d625e0a5c1af3e2bd9733e"
},
{
"kind": "artifact",
"path": "artifacts/stepforge_0.1.0_linux-x64.tar.gz",
"size": 139347926,
"sha256": "0bd6ea1d2c42b74e0b7411427f047dc8cbcc293507172b53ce43116e5f1affac"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/guide.json",
"size": 928,
"sha256": "1fcb87d79d7c8d187256dafdefdd065d3bb3e2fc3b76c52a6003e147213ec1ba"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-0997fb48-b598-4319-8144-0ceef68a84f4/step.json",
"size": 784,
"sha256": "e6233ff39c5ee5e869900fe2db3208443fc126b02aca1175412bc5ab28c767ae"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-592cde3d-19e2-441a-a19b-53ccd4ac132c/original.png",
"size": 13643,
"sha256": "09e12f935511bb6fabb5637501aa7743516b96d990adfab62ccfa311a7b60606"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-592cde3d-19e2-441a-a19b-53ccd4ac132c/step.json",
"size": 1609,
"sha256": "36048ccb6e30c00d6b652a0959f794c841ba3b11ff2ba1d6d2afcc94eeed6634"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-592cde3d-19e2-441a-a19b-53ccd4ac132c/working.png",
"size": 13643,
"sha256": "09e12f935511bb6fabb5637501aa7743516b96d990adfab62ccfa311a7b60606"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-62da8044-c236-4012-9fce-15785c94bfa7/step.json",
"size": 547,
"sha256": "243b7b1d9e9697dce03eb5b80254fe898835f2f7a89c287e3a6d6cd305f660b9"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-8a33be62-08c7-4a5d-ab9d-9f415269d015/original.png",
"size": 13602,
"sha256": "c96eedffdc5fd2eb9b63942cc00f1c8a91d01a0c5c2316c1d12d750b9b49e3d0"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-8a33be62-08c7-4a5d-ab9d-9f415269d015/step.json",
"size": 1975,
"sha256": "32ee15cec46e2ce8c9fe289ab9848c461978bf3d3ff0625fbaf8c4958575e573"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-8a33be62-08c7-4a5d-ab9d-9f415269d015/working.png",
"size": 13602,
"sha256": "c96eedffdc5fd2eb9b63942cc00f1c8a91d01a0c5c2316c1d12d750b9b49e3d0"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-bf6e1f92-47c8-478b-ba42-d2a3fe93bc48/original.png",
"size": 14031,
"sha256": "b5e93a0ee74e2bdbbdf0871e901726dfbdc8b45dd648c959743520f92b02e7a2"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-bf6e1f92-47c8-478b-ba42-d2a3fe93bc48/step.json",
"size": 1886,
"sha256": "e707642d9fb4c2079075615836b26834cc1c053b6b2fb7eec0dc0b40029db614"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-bf6e1f92-47c8-478b-ba42-d2a3fe93bc48/working.png",
"size": 14031,
"sha256": "b5e93a0ee74e2bdbbdf0871e901726dfbdc8b45dd648c959743520f92b02e7a2"
},
{
"kind": "sample",
"path": "../examples/sample-data/library/guides/guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f/steps/step-c0addd40-3e96-495f-b196-d49c08518dba/step.json",
"size": 521,
"sha256": "3d89cd70a5294a4166d60e20b0d19408a834c31415e4319839577a8b18ccbce3"
},
{
"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": 149943,
"sha256": "9a449f2507f6f4b43d67589cb2f4f28682d8f6fdec15cc0541b26a81624a528b"
},
{
"kind": "sample",
"path": "../examples/sample-exports/html-simple/reset-a-password-in-admin-portal.html",
"size": 146646,
"sha256": "5cababe0b51a3590d3ceee4179760e0c2179e9ed340d85e1b65253e4275bb9d0"
},
{
"kind": "sample",
"path": "../examples/sample-exports/image-bundle/reset-a-password-in-admin-portal-bundle.json",
"size": 779,
"sha256": "24bae92a7d627ad65d9cea906f840fcfd46e44aa263ab927774daa49fef60f45"
},
{
"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": "7257af7b3df168df9656159f84e0f7b538437775dc2e716e7f87d00dd9d40efd"
},
{
"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": 88967,
"sha256": "4c36ae2ee22ca8da9fc066efaed72dc19084f8655b10162deb1528e2ebb3a0bf"
},
{
"kind": "sample",
"path": "../examples/sample-manifest.json",
"size": 1186,
"sha256": "2cecfc8eaef1a6b87aeac4692b6a22d2c6d81b533b18b15bc87db1bc3774b007"
}
]
}
+43
View File
@@ -0,0 +1,43 @@
# StepForge Build Report
Version: 0.1.0
Generated: 2026-06-11T02:33:30.201Z
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 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.
@@ -0,0 +1,29 @@
{
"schemaVersion": 1,
"guideId": "guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f",
"title": "Reset a password in Admin Portal",
"descriptionHtml": "<p>Offline sample guide showing capture, annotations, rich text, and exports.</p>",
"placeholders": {
"Product": "Admin Portal",
"Author": "StepForge",
"Department": "Support"
},
"flags": {
"focusedViewDefault": true,
"hideSkippedStepsInExports": true
},
"themeOverride": "system",
"createdAt": "2026-06-11T02:32:07Z",
"updatedAt": "2026-06-11T02:32:07Z",
"stepsOrder": [
"step-592cde3d-19e2-441a-a19b-53ccd4ac132c",
"step-bf6e1f92-47c8-478b-ba42-d2a3fe93bc48",
"step-0997fb48-b598-4319-8144-0ceef68a84f4",
"step-8a33be62-08c7-4a5d-ab9d-9f415269d015",
"step-c0addd40-3e96-495f-b196-d49c08518dba",
"step-62da8044-c236-4012-9fce-15785c94bfa7"
],
"favorite": false,
"linkedSource": null,
"exportProfiles": {}
}
@@ -0,0 +1,32 @@
{
"stepId": "step-0997fb48-b598-4319-8144-0ceef68a84f4",
"parentStepId": "step-bf6e1f92-47c8-478b-ba42-d2a3fe93bc48",
"kind": "empty",
"status": "todo",
"title": "Confirm permission prompt",
"descriptionHtml": "<p>Only administrators can complete this step.</p>",
"hidden": false,
"skipped": false,
"forceNewPage": false,
"focusedView": {
"enabled": false,
"zoom": 1,
"panX": 0.5,
"panY": 0.5
},
"image": null,
"extraImages": [],
"annotations": [],
"textBlocks": [
{
"id": "tb-e3aa7982-3eb4-4db1-a1af-fda7c72b46aa",
"position": "after-description",
"level": "warn",
"title": "Access",
"descriptionHtml": "<p>Admin rights required.</p>"
}
],
"codeBlocks": [],
"tableBlocks": [],
"links": []
}
@@ -0,0 +1,73 @@
{
"stepId": "step-592cde3d-19e2-441a-a19b-53ccd4ac132c",
"parentStepId": null,
"kind": "image",
"status": "todo",
"title": "Open [[Product]] users",
"descriptionHtml": "<p>Open the users list and select the target account.</p>",
"hidden": false,
"skipped": false,
"forceNewPage": false,
"focusedView": {
"enabled": true,
"zoom": 1.1,
"panX": 0.5,
"panY": 0.5
},
"image": {
"originalPath": "original.png",
"workingPath": "working.png",
"size": {
"width": 1280,
"height": 760
}
},
"extraImages": [],
"annotations": [
{
"id": "ann-54403181-b784-4d9b-9285-b9504a7c2f8d",
"type": "rect",
"x": 0.275,
"y": 0.18,
"w": 0.19,
"h": 0.18,
"text": "",
"style": {
"stroke": "#0068ff",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 6,
"fontSize": 0.022
}
},
{
"id": "ann-303a7cdc-4866-4667-8046-33ba7bfb8687",
"type": "number",
"x": 0.3,
"y": 0.08,
"w": 0.08,
"h": 0.12,
"text": "",
"style": {
"stroke": "#0068ff",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 3,
"fontSize": 0.022
},
"value": 1
}
],
"textBlocks": [
{
"id": "tb-69f3f373-12e6-4ecf-b93c-36f3b770bece",
"position": "after-description",
"level": "info",
"title": "Tip",
"descriptionHtml": "<p>Use the search box to avoid scrolling.</p>"
}
],
"codeBlocks": [],
"tableBlocks": [],
"links": []
}
@@ -0,0 +1,24 @@
{
"stepId": "step-62da8044-c236-4012-9fce-15785c94bfa7",
"parentStepId": null,
"kind": "empty",
"status": "todo",
"title": "Deprecated flow",
"descriptionHtml": "<p>This skipped step remains in the library but is excluded from exports.</p>",
"hidden": false,
"skipped": true,
"forceNewPage": false,
"focusedView": {
"enabled": false,
"zoom": 1,
"panX": 0.5,
"panY": 0.5
},
"image": null,
"extraImages": [],
"annotations": [],
"textBlocks": [],
"codeBlocks": [],
"tableBlocks": [],
"links": []
}
@@ -0,0 +1,100 @@
{
"stepId": "step-8a33be62-08c7-4a5d-ab9d-9f415269d015",
"parentStepId": null,
"kind": "image",
"status": "todo",
"title": "Review the confirmation",
"descriptionHtml": "<p>Confirm the summary and close the modal.</p>",
"hidden": false,
"skipped": false,
"forceNewPage": false,
"focusedView": {
"enabled": true,
"zoom": 1.1,
"panX": 0.5,
"panY": 0.5
},
"image": {
"originalPath": "original.png",
"workingPath": "working.png",
"size": {
"width": 1280,
"height": 760
}
},
"extraImages": [],
"annotations": [
{
"id": "ann-281ebcd6-e0e3-4304-9232-ee25353e2321",
"type": "blur",
"x": 0.49,
"y": 0.32,
"w": 0.21,
"h": 0.08,
"text": "",
"style": {
"stroke": "#9ca3af",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 2,
"fontSize": 0.022
},
"radius": 12
},
{
"id": "ann-6224b838-a39d-4fae-9b68-6a4f2f8af60d",
"type": "highlight",
"x": 0.47,
"y": 0.24,
"w": 0.28,
"h": 0.2,
"text": "",
"style": {
"stroke": "#f0a500",
"fill": "#ffeeb0",
"textColor": "#FFFFFF",
"strokeWidth": 2,
"fontSize": 0.022
}
},
{
"id": "ann-6dd50b00-6f29-431b-bee0-c217032af1a4",
"type": "number",
"x": 0.31,
"y": 0.08,
"w": 0.08,
"h": 0.12,
"text": "",
"style": {
"stroke": "#36a",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 3,
"fontSize": 0.022
},
"value": 3
}
],
"textBlocks": [],
"codeBlocks": [],
"tableBlocks": [
{
"id": "t1",
"rows": [
[
"Field",
"Value"
],
[
"Title",
"Admin Portal"
],
[
"Owner",
"Support"
]
]
}
],
"links": []
}
@@ -0,0 +1,88 @@
{
"stepId": "step-bf6e1f92-47c8-478b-ba42-d2a3fe93bc48",
"parentStepId": null,
"kind": "image",
"status": "todo",
"title": "Enable the reset policy",
"descriptionHtml": "<p>Make sure the policy is active before continuing.</p>",
"hidden": false,
"skipped": false,
"forceNewPage": false,
"focusedView": {
"enabled": true,
"zoom": 1.1,
"panX": 0.5,
"panY": 0.5
},
"image": {
"originalPath": "original.png",
"workingPath": "working.png",
"size": {
"width": 1280,
"height": 760
}
},
"extraImages": [],
"annotations": [
{
"id": "ann-80ff688a-e1ca-46e7-9519-0dd38240d9c3",
"type": "arrow",
"x": 0.47,
"y": 0.24,
"w": 0.23,
"h": -0.04,
"text": "",
"style": {
"stroke": "#14a375",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 5,
"fontSize": 0.022
}
},
{
"id": "ann-bd413182-4146-448b-95f8-72630f55437d",
"type": "tooltip",
"x": 0.53,
"y": 0.13,
"w": 0.17,
"h": 0.08,
"text": "Primary action",
"style": {
"stroke": "#111827",
"fill": "#111827",
"textColor": "#ffffff",
"strokeWidth": 3,
"fontSize": 0.022,
"tail": "bottom"
}
},
{
"id": "ann-537b3971-6361-4763-8424-da8980479507",
"type": "number",
"x": 0.31,
"y": 0.08,
"w": 0.08,
"h": 0.12,
"text": "",
"style": {
"stroke": "#14a375",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 3,
"fontSize": 0.022
},
"value": 2
}
],
"textBlocks": [],
"codeBlocks": [
{
"id": "cmd",
"language": "bash",
"code": "stepforge --capture --window --delay 300"
}
],
"tableBlocks": [],
"links": []
}
@@ -0,0 +1,24 @@
{
"stepId": "step-c0addd40-3e96-495f-b196-d49c08518dba",
"parentStepId": null,
"kind": "empty",
"status": "todo",
"title": "Legacy note",
"descriptionHtml": "<p>This hidden step exercises filtering in exports.</p>",
"hidden": true,
"skipped": false,
"forceNewPage": false,
"focusedView": {
"enabled": false,
"zoom": 1,
"panX": 0.5,
"panY": 0.5
},
"image": null,
"extraImages": [],
"annotations": [],
"textBlocks": [],
"codeBlocks": [],
"tableBlocks": [],
"links": []
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,30 @@
{
"format": "stepforge-image-bundle",
"version": 1,
"guide": {
"title": "Reset a password in Admin Portal",
"generatedAt": "2026-06-11T02:32:07.575Z"
},
"steps": [
{
"number": "1",
"title": "Open Admin Portal users",
"image": "steps-reset-a-password-in-admin-portal/001-open-admin-portal-users.png"
},
{
"number": "2",
"title": "Enable the reset policy",
"image": "steps-reset-a-password-in-admin-portal/002-enable-the-reset-policy.png"
},
{
"number": "2.1",
"title": "Confirm permission prompt",
"image": null
},
{
"number": "3",
"title": "Review the confirmation",
"image": "steps-reset-a-password-in-admin-portal/004-review-the-confirmation.png"
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

@@ -0,0 +1,255 @@
{
"format": "stepforge-guide",
"version": 1,
"generatedAt": "2026-06-11T02:32:07.575Z",
"guide": {
"title": "Reset a password in Admin Portal",
"descriptionHtml": "<p>Offline sample guide showing capture, annotations, rich text, and exports.</p>",
"createdAt": "2026-06-11T02:32:07Z",
"updatedAt": "2026-06-11T02:32:07Z"
},
"steps": [
{
"number": "1",
"kind": "image",
"status": "todo",
"title": "Open Admin Portal users",
"descriptionHtml": "<p>Open the users list and select the target account.</p>",
"descriptionText": "Open the users list and select the target account.",
"image": {
"relPath": "steps-reset-a-password-in-admin-portal/001-open-admin-portal-users.png",
"width": 1280,
"height": 760
},
"annotations": [
{
"id": "ann-54403181-b784-4d9b-9285-b9504a7c2f8d",
"type": "rect",
"x": 0.275,
"y": 0.18,
"w": 0.19,
"h": 0.18,
"text": "",
"style": {
"stroke": "#0068ff",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 6,
"fontSize": 0.022
}
},
{
"id": "ann-303a7cdc-4866-4667-8046-33ba7bfb8687",
"type": "number",
"x": 0.3,
"y": 0.08,
"w": 0.08,
"h": 0.12,
"text": "",
"style": {
"stroke": "#0068ff",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 3,
"fontSize": 0.022
},
"value": 1
}
],
"textBlocks": [
{
"position": "after-description",
"level": "info",
"title": "Tip",
"descriptionHtml": "<p>Use the search box to avoid scrolling.</p>"
}
],
"codeBlocks": [],
"tableBlocks": [],
"links": []
},
{
"number": "2",
"kind": "image",
"status": "todo",
"title": "Enable the reset policy",
"descriptionHtml": "<p>Make sure the policy is active before continuing.</p>",
"descriptionText": "Make sure the policy is active before continuing.",
"image": {
"relPath": "steps-reset-a-password-in-admin-portal/002-enable-the-reset-policy.png",
"width": 1280,
"height": 760
},
"annotations": [
{
"id": "ann-80ff688a-e1ca-46e7-9519-0dd38240d9c3",
"type": "arrow",
"x": 0.47,
"y": 0.24,
"w": 0.23,
"h": -0.04,
"text": "",
"style": {
"stroke": "#14a375",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 5,
"fontSize": 0.022
}
},
{
"id": "ann-bd413182-4146-448b-95f8-72630f55437d",
"type": "tooltip",
"x": 0.53,
"y": 0.13,
"w": 0.17,
"h": 0.08,
"text": "Primary action",
"style": {
"stroke": "#111827",
"fill": "#111827",
"textColor": "#ffffff",
"strokeWidth": 3,
"fontSize": 0.022,
"tail": "bottom"
}
},
{
"id": "ann-537b3971-6361-4763-8424-da8980479507",
"type": "number",
"x": 0.31,
"y": 0.08,
"w": 0.08,
"h": 0.12,
"text": "",
"style": {
"stroke": "#14a375",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 3,
"fontSize": 0.022
},
"value": 2
}
],
"textBlocks": [],
"codeBlocks": [
{
"id": "cmd",
"language": "bash",
"code": "stepforge --capture --window --delay 300"
}
],
"tableBlocks": [],
"links": []
},
{
"number": "2.1",
"kind": "empty",
"status": "todo",
"title": "Confirm permission prompt",
"descriptionHtml": "<p>Only administrators can complete this step.</p>",
"descriptionText": "Only administrators can complete this step.",
"image": null,
"annotations": [],
"textBlocks": [
{
"position": "after-description",
"level": "warn",
"title": "Access",
"descriptionHtml": "<p>Admin rights required.</p>"
}
],
"codeBlocks": [],
"tableBlocks": [],
"links": []
},
{
"number": "3",
"kind": "image",
"status": "todo",
"title": "Review the confirmation",
"descriptionHtml": "<p>Confirm the summary and close the modal.</p>",
"descriptionText": "Confirm the summary and close the modal.",
"image": {
"relPath": "steps-reset-a-password-in-admin-portal/004-review-the-confirmation.png",
"width": 1280,
"height": 760
},
"annotations": [
{
"id": "ann-281ebcd6-e0e3-4304-9232-ee25353e2321",
"type": "blur",
"x": 0.49,
"y": 0.32,
"w": 0.21,
"h": 0.08,
"text": "",
"style": {
"stroke": "#9ca3af",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 2,
"fontSize": 0.022
},
"radius": 12
},
{
"id": "ann-6224b838-a39d-4fae-9b68-6a4f2f8af60d",
"type": "highlight",
"x": 0.47,
"y": 0.24,
"w": 0.28,
"h": 0.2,
"text": "",
"style": {
"stroke": "#f0a500",
"fill": "#ffeeb0",
"textColor": "#FFFFFF",
"strokeWidth": 2,
"fontSize": 0.022
}
},
{
"id": "ann-6dd50b00-6f29-431b-bee0-c217032af1a4",
"type": "number",
"x": 0.31,
"y": 0.08,
"w": 0.08,
"h": 0.12,
"text": "",
"style": {
"stroke": "#36a",
"fill": "transparent",
"textColor": "#FFFFFF",
"strokeWidth": 3,
"fontSize": 0.022
},
"value": 3
}
],
"textBlocks": [],
"codeBlocks": [],
"tableBlocks": [
{
"id": "t1",
"rows": [
[
"Field",
"Value"
],
[
"Title",
"Admin Portal"
],
[
"Owner",
"Support"
]
]
}
],
"links": []
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

@@ -0,0 +1,56 @@
# Reset a password in Admin Portal
Offline sample guide showing capture, annotations, rich text, and exports.
## Contents
- [1. Open Admin Portal users](#step-1)
- [2. Enable the reset policy](#step-2)
- [2.1. Confirm permission prompt](#step-2-1)
- [3. Review the confirmation](#step-3)
<a id="step-1"></a>
## 1. Open Admin Portal users
Open the users list and select the target account.
![Step 1](steps-reset-a-password-in-admin-portal/001-open-admin-portal-users.png)
> **Note: Tip**
> Use the search box to avoid scrolling.
<a id="step-2"></a>
## 2. Enable the reset policy
Make sure the policy is active before continuing.
![Step 2](steps-reset-a-password-in-admin-portal/002-enable-the-reset-policy.png)
```bash
stepforge --capture --window --delay 300
```
<a id="step-2-1"></a>
### 2.1. Confirm permission prompt
Only administrators can complete this step.
> **Warning: Access**
> Admin rights required.
<a id="step-3"></a>
## 3. Review the confirmation
Confirm the summary and close the modal.
![Step 3](steps-reset-a-password-in-admin-portal/004-review-the-confirmation.png)
| Field | Value |
| --- | --- |
| Title | Admin Portal |
| Owner | Support |
Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.
+23
View File
@@ -0,0 +1,23 @@
{
"format": "stepforge-sample-manifest",
"version": 1,
"generatedAt": "2026-06-11T02:32:07.575Z",
"guideId": "guide-319c9f4d-4fa5-4399-81b5-258cc3393e1f",
"title": "Reset a password in Admin Portal",
"dataDir": "sample-data",
"note": "The sample guide is generated entirely offline from local assets.",
"archive": "sample-guide.sfgz",
"exports": {
"json": "sample-exports/json/reset-a-password-in-admin-portal.json",
"markdown": "sample-exports/markdown/reset-a-password-in-admin-portal.md",
"html-simple": "sample-exports/html-simple/reset-a-password-in-admin-portal.html",
"html-rich": "sample-exports/html-rich/reset-a-password-in-admin-portal-rich.html",
"pdf": "sample-exports/pdf/reset-a-password-in-admin-portal.pdf",
"gif": "sample-exports/gif/reset-a-password-in-admin-portal.gif",
"image-bundle": "sample-exports/image-bundle/reset-a-password-in-admin-portal-bundle.json",
"docx": "sample-exports/docx/reset-a-password-in-admin-portal.docx",
"pptx": "sample-exports/pptx/reset-a-password-in-admin-portal.pptx"
},
"substepId": "step-0997fb48-b598-4319-8144-0ceef68a84f4",
"slug": "reset-a-password-in-admin-portal"
}
+43 -4
View File
@@ -70,22 +70,61 @@ for (const rel of walk(examplesRoot, examplesRoot)) {
} }
const pkg = require(path.join(rootDir, 'package.json')); const pkg = require(path.join(rootDir, 'package.json'));
const { execSync } = require('node:child_process');
function toolAvailable(cmd) {
try { execSync(`command -v ${cmd}`, { stdio: 'pipe', shell: '/bin/bash' }); return true; } catch { return false; }
}
const tools = {
'dpkg-deb (Linux .deb)': toolAvailable('dpkg-deb'),
'rpmbuild (Linux .rpm)': toolAvailable('rpmbuild'),
'appimagetool (Linux AppImage)': toolAvailable('appimagetool'),
'makensis (Windows installer .exe)': toolAvailable('makensis'),
'wixl / WiX (Windows .msi)': toolAvailable('wixl'),
};
const toolRows = Object.entries(tools)
.map(([name, ok]) => `| ${name} | ${ok ? 'available' : '**missing**'} |`)
.join('\n');
const report = `# StepForge Build Report const report = `# StepForge Build Report
Version: ${pkg.version} Version: ${pkg.version}
Generated: ${new Date().toISOString()} Generated: ${new Date().toISOString()}
Host: ${process.platform} ${process.arch} (node ${process.version})
## Outputs ## Outputs
- Portable tarball: ${files.find((f) => f.path.endsWith('.tar.gz'))?.path || 'not generated'} - Portable tarball: ${files.find((f) => f.path.endsWith('.tar.gz'))?.path || 'not generated'}
- Debian package: ${files.find((f) => f.path.endsWith('.deb'))?.path || 'not generated'} - Debian package: ${files.find((f) => f.path.endsWith('.deb'))?.path || 'not generated'}
- Sample guide archive: ${files.find((f) => f.path.endsWith('sample-guide.sfgz'))?.path || 'not generated'} - Sample guide archive: ${files.find((f) => f.path.endsWith('sample-guide.sfgz'))?.path || 'not generated'}
- Sample exports (9 formats): see examples/sample-exports/
- Full artifact list with sha256 checksums: artifacts_manifest.json
## Notes ## Packaging tool availability
- The desktop shell is Electron. | Tool | Status |
- Core storage, exports, and archive handling are local-only. |---|---|
- Sample exports and package artifacts are written by the offline build scripts. ${toolRows}
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 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.
`; `;
fs.writeFileSync(reportFile, report); fs.writeFileSync(reportFile, report);