Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
266bbb6
Se actualizaron todas las dependencias, se incluye node 22
AugustoOM Jun 7, 2026
e62b53a
docs: define JFLAP 7.1 compatibility contract and implementation plan
AugustoOM Sep 5, 2026
88a1c28
test: add Vue and file-service checks with CI release gates
AugustoOM Sep 5, 2026
a85d876
fix(core): enforce document identity and machine-specific types
AugustoOM Sep 5, 2026
4fa3a97
fix(jff): preserve supported documents and reject lossy imports
AugustoOM Sep 6, 2026
2f0e1f1
fix(ui): protect text editing from graph shortcuts
AugustoOM Sep 6, 2026
4226d78
fix(ui): run nondeterministic finite automata correctly
AugustoOM Sep 6, 2026
49cc330
fix(simulator): report bounded run outcomes
AugustoOM Sep 6, 2026
a62f09d
test(jff): add vendor conformance corpus
AugustoOM Sep 6, 2026
9fd0c40
fix(simulator): support JFLAP string transition semantics
AugustoOM Sep 6, 2026
3615393
fix(ui): track saved document revisions
AugustoOM Sep 6, 2026
e87a6e2
feat(ui): protect and recover unsaved documents
AugustoOM Sep 6, 2026
8319d6b
feat(file-io): preserve paths and distinguish save as
AugustoOM Sep 6, 2026
0b0a69c
fix(core): restore graph order on undo
AugustoOM Sep 6, 2026
90fca12
fix(ui): flush inspector drafts before document actions
AugustoOM Sep 6, 2026
fbb88f8
fix(simulator): report incomplete bounded exploration
AugustoOM Sep 6, 2026
97d87ed
feat(simulator): define TM profiles and terminal outcomes
AugustoOM Sep 6, 2026
aa9c70f
fix(core): separate alphabets and repair machine analysis
AugustoOM Sep 6, 2026
9df9902
feat(simulator): expose complete execution traces
AugustoOM Sep 6, 2026
07766fc
feat(ui): add complete simulation replay
AugustoOM Sep 6, 2026
f1c2fc1
feat(ui): add batch input testing
AugustoOM Sep 6, 2026
6e920ec
docs(plan): mark simulation learning features complete
AugustoOM Sep 6, 2026
42d5cf0
feat(ui): make canvas gestures pointer-safe
AugustoOM Sep 6, 2026
7d069d0
feat(ui): add responsive high-DPI diagram viewport
AugustoOM Sep 6, 2026
780b037
feat(ui): add accessible semantic diagram editor
AugustoOM Sep 6, 2026
b7172ed
feat(export): render complete diagrams to PNG
AugustoOM Sep 6, 2026
f76cc48
perf: index graph execution and rendering
AugustoOM Sep 6, 2026
4322421
docs(plan): mark interaction and performance work complete
AugustoOM Sep 6, 2026
35eb28d
feat(desktop): centralize commands and protect native lifecycle
AugustoOM Sep 7, 2026
312dbc9
chore(deps): resolve production audit findings
AugustoOM Sep 7, 2026
144112e
chore(release): align project version metadata
AugustoOM Sep 7, 2026
e01075e
ci(release): gate signed GitHub desktop publishing
AugustoOM Sep 7, 2026
8ac803a
ci(release): smoke-test installed desktop bundles
AugustoOM Sep 7, 2026
39c50c8
feat(turing): support JFLAP multi-tape machines
AugustoOM Sep 7, 2026
fb408cb
feat(automata): add regex and finite-state conversions
AugustoOM Sep 7, 2026
60ca0ef
feat(jff): support regular-expression documents
AugustoOM Sep 7, 2026
5682990
feat(grammar): add JFF exchange and parsing workflows
AugustoOM Sep 7, 2026
d549274
feat(transducers): support JFLAP Mealy and Moore machines
AugustoOM Sep 7, 2026
e2eba18
feat(teaching): add L-system and pumping activities
AugustoOM Sep 7, 2026
b3043bb
feat(turing): execute and preserve building-block machines
AugustoOM Sep 7, 2026
0e9f142
feat(ui): expose finite-automata conversion tools
AugustoOM Sep 7, 2026
236d8fa
docs(plan): record desktop and JFLAP parity milestones
AugustoOM Sep 7, 2026
074bc65
fix(lifecycle): prompt when leaving the editor
AugustoOM Sep 7, 2026
d97bd1a
Merge branch 'master' into develop
AugustoOM Sep 7, 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
4 changes: 2 additions & 2 deletions .github/release-notes/desktop.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
Native desktop builds for Jauto.
Signed native desktop builds for Jauto. SHA-256 checksums are included in `SHA256SUMS.txt`.

Download the installer for your operating system from the assets below:

- Windows: use the `.msi` or `.exe` installer.
- macOS: use the `.dmg` installer.

The macOS build is unsigned for now, so macOS may ask you to confirm that you want to open it.
Windows installers are Authenticode-signed. The macOS DMG is signed with a Developer ID certificate, notarized by Apple, and stapled before publication.
47 changes: 47 additions & 0 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: Project checks

on:
pull_request:
push:
branches: [main, master, develop]

permissions:
contents: read

concurrency:
group: checks-${{ github.ref }}
cancel-in-progress: true

jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm audit --prod --audit-level moderate
- run: pnpm check:release-version
- run: pnpm lint
- run: pnpm test
- run: pnpm typecheck
- run: pnpm --filter @jauto/web build
- run: pnpm --filter @jauto/desktop build:frontend

native-check:
name: Native check (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [windows-latest, macos-latest]
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
with: { components: rustfmt }
- uses: swatinem/rust-cache@v2
with: { workspaces: apps/desktop/src-tauri }
- run: cargo fmt --manifest-path apps/desktop/src-tauri/Cargo.toml --check
- run: cargo check --manifest-path apps/desktop/src-tauri/Cargo.toml
204 changes: 144 additions & 60 deletions .github/workflows/desktop-release.yml
Original file line number Diff line number Diff line change
@@ -1,54 +1,99 @@
name: Desktop native releases
name: Signed desktop release

on:
push:
tags:
- 'v*'
- 'Beta'
tags: ['v*']
workflow_dispatch:
inputs:
release_tag:
description: 'GitHub Release tag to create or update, for example v0.2.0'
description: 'Version tag matching repository metadata, for example v0.2.0'
required: true
default: 'v0.2.0'

permissions:
contents: write

concurrency:
group: desktop-release-${{ github.ref }}-${{ inputs.release_tag }}
cancel-in-progress: false

jobs:
validate:
name: Validate release metadata and credentials
runs-on: ubuntu-latest
env:
RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.release_tag || github.ref_name }}
WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
steps:
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with: { node-version: 22 }
- name: Match tag to every project version
run: node scripts/check-release-version.mjs "$RELEASE_TAG"
- name: Require signing and notarization credentials
shell: bash
run: |
set -euo pipefail
required=(WINDOWS_CERTIFICATE WINDOWS_CERTIFICATE_PASSWORD APPLE_CERTIFICATE APPLE_CERTIFICATE_PASSWORD APPLE_SIGNING_IDENTITY APPLE_ID APPLE_PASSWORD APPLE_TEAM_ID)
for name in "${required[@]}"; do
if [ -z "${!name:-}" ]; then echo "Missing required release secret: $name"; exit 1; fi
done

quality:
name: Release quality gate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm
- run: pnpm install --frozen-lockfile
- run: pnpm audit --prod --audit-level moderate
- run: pnpm lint
- run: pnpm test
- run: pnpm typecheck
- run: pnpm --filter @jauto/web build
- run: pnpm --filter @jauto/desktop build:frontend

build:
name: Build ${{ matrix.label }}
name: Build and sign ${{ matrix.label }}
needs: [validate, quality]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- label: windows-x64
os: windows-latest
args: ''
- label: macos-universal
os: macos-latest
args: '--target universal-apple-darwin'

- { label: windows-x64, os: windows-latest }
- { label: macos-universal, os: macos-latest }
env:
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Enable pnpm
uses: pnpm/action-setup@v4

- name: Set up Node.js
uses: actions/setup-node@v4
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v6
- uses: actions/setup-node@v6
with:
node-version: 22
cache: pnpm
cache-dependency-path: pnpm-lock.yaml

- name: Set up Rust
uses: dtolnay/rust-toolchain@stable

- name: Add macOS universal targets
if: runner.os == 'macOS'
- uses: dtolnay/rust-toolchain@stable
- uses: swatinem/rust-cache@v2
with: { workspaces: apps/desktop/src-tauri }
- if: runner.os == 'macOS'
run: rustup target add aarch64-apple-darwin x86_64-apple-darwin

- name: Install dependencies
Expand All @@ -59,55 +104,94 @@ jobs:

- name: Build native desktop app
working-directory: apps/desktop
run: pnpm tauri build ${{ matrix.args }}

- name: Upload native installers
uses: actions/upload-artifact@v4
run: pnpm tauri build --config src-tauri/tauri.release.conf.json
- name: Build signed and notarized universal macOS installer
if: runner.os == 'macOS'
working-directory: apps/desktop
run: pnpm tauri build --target universal-apple-darwin
- name: Verify Windows signatures and installers
if: runner.os == 'Windows'
shell: pwsh
run: |
$files = Get-ChildItem apps/desktop/src-tauri/target/release/bundle -Recurse -Include *.exe,*.msi
if (-not $files) { throw 'No Windows installers were produced.' }
foreach ($file in $files) {
$signature = Get-AuthenticodeSignature $file.FullName
if ($signature.Status -ne 'Valid') { throw "Invalid signature on $($file.Name): $($signature.Status)" }
}
- name: Smoke-test installed Windows application
if: runner.os == 'Windows'
shell: pwsh
run: |
$msi = Get-ChildItem apps/desktop/src-tauri/target/release/bundle -Recurse -Filter *.msi | Select-Object -First 1
$installRoot = Join-Path $env:RUNNER_TEMP 'jauto-installed'
$process = Start-Process msiexec.exe -ArgumentList @('/a', $msi.FullName, '/qn', "TARGETDIR=$installRoot") -Wait -PassThru
if ($process.ExitCode -ne 0) { throw "MSI administrative install failed: $($process.ExitCode)" }
$executable = Get-ChildItem $installRoot -Recurse -Filter jauto.exe | Select-Object -First 1
if (-not $executable) { throw 'Installed jauto.exe was not found.' }
$app = Start-Process $executable.FullName -PassThru
Start-Sleep -Seconds 5
if ($app.HasExited -and $app.ExitCode -ne 0) { throw "Installed app exited with $($app.ExitCode)" }
if (-not $app.HasExited) { Stop-Process -Id $app.Id }
- name: Verify macOS signature and notarization
if: runner.os == 'macOS'
shell: bash
run: |
set -euo pipefail
app=$(find apps/desktop/src-tauri/target/universal-apple-darwin/release/bundle -name '*.app' -type d | head -1)
dmg=$(find apps/desktop/src-tauri/target/universal-apple-darwin/release/bundle -name '*.dmg' -type f | head -1)
test -n "$app" && test -n "$dmg"
codesign --verify --deep --strict --verbose=2 "$app"
xcrun stapler validate "$dmg"
- name: Smoke-test installed macOS application
if: runner.os == 'macOS'
shell: bash
run: |
set -euo pipefail
dmg=$(find apps/desktop/src-tauri/target/universal-apple-darwin/release/bundle -name '*.dmg' -type f | head -1)
mount_point="$RUNNER_TEMP/jauto-dmg"
installed_app="$RUNNER_TEMP/Jauto.app"
mkdir -p "$mount_point"
hdiutil attach "$dmg" -mountpoint "$mount_point" -nobrowse
cp -R "$mount_point/Jauto.app" "$installed_app"
hdiutil detach "$mount_point"
codesign --verify --deep --strict "$installed_app"
"$installed_app/Contents/MacOS/jauto" & app_pid=$!
sleep 5
kill -0 "$app_pid"
kill "$app_pid"
- uses: actions/upload-artifact@v7
with:
name: jauto-${{ matrix.label }}
if-no-files-found: error
path: |
apps/desktop/src-tauri/target/release/bundle/**/*.msi
apps/desktop/src-tauri/target/release/bundle/**/*.exe
apps/desktop/src-tauri/target/release/bundle/**/*.dmg
apps/desktop/src-tauri/target/release/bundle/**/*.app.tar.gz
apps/desktop/src-tauri/target/universal-apple-darwin/release/bundle/**/*.dmg
apps/desktop/src-tauri/target/universal-apple-darwin/release/bundle/**/*.app.tar.gz

publish:
name: Publish GitHub Release downloads
name: Publish GitHub Release
runs-on: ubuntu-latest
needs: build
env:
RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.release_tag || github.ref_name }}
GH_TOKEN: ${{ github.token }}
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Download native installers
uses: actions/download-artifact@v4
with:
path: release-assets

- name: Create or update GitHub Release
env:
GH_TOKEN: ${{ github.token }}
- uses: actions/checkout@v6
- uses: actions/download-artifact@v8
with: { path: release-assets }
- name: Create checksums
run: find release-assets -type f -print0 | sort -z | xargs -0 sha256sum > release-assets/SHA256SUMS.txt
- name: Create or update release
shell: bash
run: |
set -euo pipefail
prerelease=()
[[ "$RELEASE_TAG" == *-* ]] && prerelease=(--prerelease)
if gh release view "$RELEASE_TAG" >/dev/null 2>&1; then
gh release edit "$RELEASE_TAG" --title "Jauto $RELEASE_TAG" --notes-file .github/release-notes/desktop.md
gh release edit "$RELEASE_TAG" --title "Jauto $RELEASE_TAG" --notes-file .github/release-notes/desktop.md "${prerelease[@]}"
else
gh release create "$RELEASE_TAG" --target "$GITHUB_SHA" --title "Jauto $RELEASE_TAG" --notes-file .github/release-notes/desktop.md
fi

- name: Upload release assets
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
mapfile -t files < <(find release-assets -type f \( -name "*.msi" -o -name "*.exe" -o -name "*.dmg" -o -name "*.app.tar.gz" \))
if [ "${#files[@]}" -eq 0 ]; then
echo "No native installers were found."
exit 1
gh release create "$RELEASE_TAG" --target "$GITHUB_SHA" --title "Jauto $RELEASE_TAG" --notes-file .github/release-notes/desktop.md "${prerelease[@]}"
fi
mapfile -d '' files < <(find release-assets -type f -print0)
gh release upload "$RELEASE_TAG" "${files[@]}" --clobber
Loading