Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
d77e699
Add a Microsoft Store package that updates through the Store and keep…
Twest2 Oct 29, 2026
08fec86
Pass Store packaging flags without npm's double dash, which PowerShel…
Twest2 Oct 29, 2026
c4c5d61
Take the Store display name from identity.json, so any reserved name …
Twest2 Oct 29, 2026
24cff18
Keep a Store install's guides in the home folder, out of OneDrive's D…
Twest2 Oct 29, 2026
3202511
Warn in Guide storage when the library is in a OneDrive, Dropbox, Goo…
Twest2 Oct 29, 2026
742c13e
Move every Windows library to the home folder automatically, checked,…
Twest2 Oct 29, 2026
ed742d6
Add a Language setting and translatable interface text, and list the …
Twest2 Oct 29, 2026
63cd311
Let AI agents create, delete, reorder and replace guide content, snap…
Twest2 Oct 29, 2026
6806278
Translate the interface into French, Spanish, Russian, Simplified Chi…
Twest2 Oct 29, 2026
9565e0d
Document the Language setting, translating new text and the Store lis…
Twest2 Oct 29, 2026
8dd58be
Sync global placeholders, brand profiles and language with guides
Twest2 Oct 29, 2026
205b59c
Fix AI success messages and editor language switching
Twest2 Oct 29, 2026
2f2ca72
Keep failed library migrations retryable and report Store launch errors
Twest2 Oct 29, 2026
954c05d
Protect agent screenshot privacy and preserve concurrent guide structure
Twest2 Oct 29, 2026
dbbac66
Detect synced library folders beginning with dots
Twest2 Oct 29, 2026
5f65be4
Merge branch 'feat/178-translations' into HEAD
Twest2 Oct 29, 2026
e7eeb61
Local review integration of synced-folder warning
Twest2 Oct 29, 2026
eb7a5fb
Merge branch 'feat/184-agent-restructure' into HEAD
Twest2 Oct 29, 2026
6099b83
Describe destructive agent permissions accurately in Settings
Twest2 Oct 29, 2026
466f334
Fix shared settings validation and cross-device convergence
Twest2 Oct 29, 2026
f99d471
Allow agent editor regression tests to use renderer translations
Twest2 Oct 29, 2026
7d36308
Local review integration of accurate agent consent
Twest2 Oct 29, 2026
0f387d3
Merge branch 'feat/184-agent-restructure' into HEAD
Twest2 Oct 29, 2026
da126da
Merge branch 'feat/sync-shared-settings' into HEAD
Twest2 Oct 29, 2026
a9e9486
Translate expanded agent permissions for combined features
Twest2 Oct 29, 2026
2f2e93d
Support translated dialogs in synced folder UI tests
Twest2 Oct 29, 2026
989e69f
Merge branch 'feat/180-synced-folder-warning' into HEAD
Twest2 Oct 29, 2026
bfd88b4
Merge branch 'feat/178-translations' into HEAD
Twest2 Oct 29, 2026
02a6b3f
Preserve agent screenshot changes during stale editor saves
Twest2 Oct 29, 2026
b2238c2
Merge branch 'feat/184-agent-restructure' into HEAD
Twest2 Oct 29, 2026
9af4f22
Retain migrated libraries and recover interrupted copy activation
Twest2 Oct 29, 2026
7b98068
Keep language selection available when guide saves fail
Twest2 Oct 29, 2026
aa0f5a7
Merge concurrent agent edits and reject late writes to trashed guides
Twest2 Oct 29, 2026
59f7ba9
Clarify translated agent snapshot coverage
Twest2 Oct 29, 2026
5ed6259
Merge branch 'feat/178-microsoft-store' into HEAD
Twest2 Oct 29, 2026
cb2eb2d
Merge branch 'feat/178-translations' into HEAD
Twest2 Oct 29, 2026
7cb8edf
Local integration of baseline-aware agent saves
Twest2 Oct 29, 2026
c760827
Preserve per-value edit times and merge brand profile fields
Twest2 Oct 29, 2026
1d98bca
Reconcile concurrent guide details and document agent deletion scope
Twest2 Oct 29, 2026
64ebacf
Local integration of guide baseline reconciliation
Twest2 Oct 29, 2026
0a28a48
Merge branch 'feat/sync-shared-settings' into HEAD
Twest2 Oct 29, 2026
a0e30a6
Sync configurable recording shortcuts across computers
Twest2 Oct 29, 2026
67ca335
Merge branch 'feat/sync-shared-settings' into HEAD
Twest2 Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,19 @@ jobs:
- name: Run unit tests
run: npm test

# The Store package only builds on Windows (makeappx), so check it here,
# with a placeholder identity in place of the Partner Center one.
- name: Build Microsoft Store package
if: runner.os == 'Windows'
run: npm run package:windows:store:test

- uses: actions/upload-artifact@v4
if: runner.os == 'Windows'
with:
name: microsoft-store-test-package
path: releases/*.appx
if-no-files-found: error

# The installer runs the Chocolatey helper, and Update now its elevated
# script, with Windows PowerShell 5.1, not the pwsh that npm test finds,
# so check them there too.
Expand Down
13 changes: 13 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,19 @@ jobs:
path: releases/*.exe
if-no-files-found: error

# Built from the same stamped checkout, unsigned: Partner Center signs it.
# It is uploaded to Partner Center by hand, not attached to the release
# (docs/windows/MICROSOFT_STORE_RELEASE.md). Skipped until
# packaging/windows/store/identity.json is filled in.
- name: Package Microsoft Store .appx
run: node scripts/package-windows-store.js --if-configured

- uses: actions/upload-artifact@v4
with:
name: microsoft-store-package
path: releases/*.appx
if-no-files-found: ignore


build-linux:
needs: authorize-release
Expand Down
18 changes: 13 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,15 +114,19 @@ page and hands you a link to send. It's usually online in under a minute.

| Platform | Recommended | Guide |
| --- | --- | --- |
| **Windows 10 / 11** (64-bit) | Chocolatey, or the `.exe` (which can set up Chocolatey updates for you) | [Chocolatey](docs/windows/chocolatey.md) · [Windows](docs/windows_installation.md) |
| **Windows 10 / 11** (64-bit) | Microsoft Store, Chocolatey, or the `.exe` | [Microsoft Store](docs/windows/microsoft-store.md) · [Chocolatey](docs/windows/chocolatey.md) · [Windows](docs/windows_installation.md) |
| **Ubuntu 26.04** | APT repository | [Ubuntu](docs/linux/apt.md) |
| **Fedora 44 Workstation** | DNF repository | [Fedora](docs/linux/dnf.md) |
| **Other Linux** | Portable `.tar.gz` | [Linux overview](docs/linux/linux_install.md) |

Every build is also on the [Releases page](https://github.com/Twest2/StepForge/releases/latest).
Installing through Chocolatey, APT or DNF keeps StepForge up to date with the
rest of your system, and on Windows **Settings → About → Update now** installs
a new version in one click.
The Microsoft Store updates StepForge automatically. Installing through
Chocolatey, APT or DNF keeps StepForge up to date with the rest of your system,
and with Chocolatey, **Settings → About → Update now** installs a new version
in one click.

**Windows:** open [StepForge in the Microsoft Store](https://apps.microsoft.com/search?query=StepForge)
and click **Get**.

<details>
<summary><strong>Windows (Chocolatey)</strong> commands</summary>
Expand Down Expand Up @@ -219,6 +223,10 @@ was recorded with StepForge.
- **Publish to Confluence** (beta) on Confluence Cloud or your organization's
Data Center site, including sites that need a smart card (CAC).
- **Publish to Wiki.js** (beta), with the screenshots uploaded to the wiki.
- **Six languages.** English, plus French, Spanish, Russian, Simplified
Chinese and Japanese (beta). StepForge follows your system language, or
pick one in **Settings → General → Language**. Exported guides stay in
English.

**Optional, and off until you turn them on**

Expand Down Expand Up @@ -258,7 +266,7 @@ each optional feature sends.

**Installing**

- [Windows installer](docs/windows_installation.md) · [Chocolatey](docs/windows/chocolatey.md)
- [Microsoft Store](docs/windows/microsoft-store.md) · [Windows installer](docs/windows_installation.md) · [Chocolatey](docs/windows/chocolatey.md)
- [Linux overview](docs/linux/linux_install.md) · [Ubuntu](docs/linux/apt.md) · [Fedora](docs/linux/dnf.md)

**Contributing**
Expand Down
1 change: 1 addition & 0 deletions app/cloud-account.js
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ class CloudAccount {

listVersions() { return this.storage.listVersions(); }
listDeletions() { return this.storage.listDeletions(); }
listSettings() { return this.storage.listSettings(); }
listParts() { return this.storage.listParts(); }
upload(file) { return this.storage.upload(file); }
download(id, options) { return this.storage.download(id, options); }
Expand Down
32 changes: 23 additions & 9 deletions app/data-dir.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,39 @@ const os = require('node:os');
const path = require('node:path');
const { LibraryLocation } = require('../core/library-location');

/** The default library folder: STEPFORGE_DATA_DIR, else the per-user data folder. */
function resolveDataDir() {
/**
* The default library folder: STEPFORGE_DATA_DIR, else StepForge in the home
* folder on Windows (%USERPROFILE%\StepForge), else the per-user data folder.
*
* Windows used to keep it in %APPDATA%\stepforge. That folder doesn't survive
* uninstalling the Microsoft Store app (Windows deletes what a Store app
* writes under %APPDATA%), it is also Electron's profile, and every install
* type now shares one location. Not Documents: OneDrive, Dropbox and Google
* Drive often back it up, which would upload every guide and fight StepForge's
* own sync. A library in the old folder moves automatically (LibraryLocation).
*/
function resolveDataDir({ homeDir = os.homedir() } = {}) {
if (process.env.STEPFORGE_DATA_DIR) return process.env.STEPFORGE_DATA_DIR;
if (process.platform === 'win32') {
return path.join(process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming'), 'stepforge');
}
const xdg = process.env.XDG_DATA_HOME || path.join(os.homedir(), '.local', 'share');
if (process.platform === 'win32') return path.join(homeDir, 'StepForge');
const xdg = process.env.XDG_DATA_HOME || path.join(homeDir, '.local', 'share');
return path.join(xdg, 'stepforge');
}

/** The old Windows default, which LibraryLocation moves libraries out of. */
function legacyWindowsDataDir(env = process.env, homeDir = os.homedir()) {
return path.join(env.APPDATA || path.join(homeDir, 'AppData', 'Roaming'), 'stepforge');
}

/** The library-location bookkeeping the app keeps in Electron's userData folder. */
function libraryLocationFor(userDataDir) {
function libraryLocationFor(userDataDir, { homeDir } = {}) {
return new LibraryLocation({
// Keep this bootstrap setting outside the movable library so a selected
// destination can be resolved before the store is opened.
file: path.join(userDataDir, 'library-location.json'),
defaultPath: resolveDataDir(),
defaultPath: resolveDataDir({ homeDir }),
legacyPath: process.platform === 'win32' ? legacyWindowsDataDir(process.env, homeDir) : null,
override: process.env.STEPFORGE_DATA_DIR || null,
});
}

module.exports = { resolveDataDir, libraryLocationFor };
module.exports = { resolveDataDir, legacyWindowsDataDir, libraryLocationFor };
5 changes: 5 additions & 0 deletions app/google-drive.js
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,11 @@ class GoogleDrive {
return this.listAppData("trashed = false and appProperties has { key='stepforge' and value='deletion-v1' }");
}

// Global placeholders, branding and language (see core/shared-settings.js).
async listSettings() {
return this.listAppData("trashed = false and appProperties has { key='stepforge' and value='settings-v1' }");
}

// Files shared between versions (see core/cloud-parts.js).
async listParts() {
return this.listAppData("trashed = false and appProperties has { key='stepforge' and value='part-v1' }");
Expand Down
Loading
Loading