Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
f91e8aa
checkpoint: pre-launch-audit-swarm state (prior 89-fix audit, uncommi…
NellInc Jun 4, 2026
a38b070
fix(launch-audit): batch A — verified-safe fixes across 20 files
NellInc Jun 4, 2026
3eb4bd1
fix(launch-audit): batch B — flagged-but-safe fixes + 280MB asset cle…
NellInc Jun 4, 2026
d886863
fix(launch-audit): batch C — recovered 20 silently-dropped assignments
NellInc Jun 4, 2026
2b34895
fix(launch-audit): batch D — 12-lane structured-audit findings (part 1)
NellInc Jun 4, 2026
f843c38
fix(launch-audit): batch D part 2 — recovered 30 rate-dropped assignm…
NellInc Jun 4, 2026
2f574bb
fix(launch-audit): batch E — high-value deferred findings (a11y inter…
NellInc Jun 4, 2026
6454b86
feat(ai): local WebGPU AI backend (Qwen3-4B via web-llm)
NellInc Jun 4, 2026
228b9d8
fix(launch-audit): GDPR — self-host Inter/JetBrains fonts + DRACO dec…
NellInc Jun 4, 2026
cba614d
fix(launch-audit): three dead scene-logic bugs (L1 HIGH)
NellInc Jun 4, 2026
51645d3
ci(launch-audit): gate Pages deploy on typecheck+lint+test (L12 HIGH)
NellInc Jun 4, 2026
5fab3d8
style(launch-audit): prettier-format drifted files
NellInc Jun 4, 2026
d77a06d
fix(launch-audit): batch F — third-pass completeness-sweep fixes
NellInc Jun 4, 2026
56ea99a
fix(launch-audit): batch G — verifiable-safe deferred backlog (Phase C)
NellInc Jun 4, 2026
64dad5c
fix(ai): commit WebGPU web worker host (was untracked)
NellInc Jun 4, 2026
ea962ba
docs(launch-audit): owner hand-off (FLAGS), legal drafts, audit summary
NellInc Jun 4, 2026
1ad81f2
refactor(launch-audit): delete 11 orphaned feature components
NellInc Jun 4, 2026
4b06b2a
feat(launch-audit): activate worker-ownership -> friction integration
NellInc Jun 4, 2026
e3765ad
config(launch-audit): canonical host -> www.millos.net
NellInc Jun 4, 2026
2c7eb4b
fix(scada-proxy): security criticals (separate backend)
NellInc Jun 4, 2026
58584f5
refactor(launch-audit): delete 8 orphaned dead-code utilities (~3000 …
NellInc Jun 4, 2026
c4c6ec6
docs(launch-audit): legal drafts — UK governing law + contact
NellInc Jun 4, 2026
d492a11
docs(launch-audit): record Round 2 outcomes + remaining owner follow-ups
NellInc Jun 4, 2026
e7f6e43
refactor(launch-audit): delete CelebrationSystem, CrisisEventSystem, …
NellInc Jun 5, 2026
dda4fbd
build(launch-audit): remove internal Asset Prototype Deck from prod +…
NellInc Jun 5, 2026
ac93a5b
feat(privacy): self-host the 3D <Text> font (remove last jsDelivr con…
NellInc Jun 5, 2026
d578596
docs(launch-audit): record Round 3 (recommendation brief executed) + …
NellInc Jun 5, 2026
63b0a15
fix(launch-audit): unblock blank 3D scene (font hang) + land Rounds 4…
NellInc Jun 5, 2026
1ae087a
fix(ui): stop SCADA/AI panel render loop (Maximum update depth)
NellInc Jun 5, 2026
a5fed80
fix(ai): Gemini model fallback chain + per-model pricing
NellInc Jun 12, 2026
acb8656
fix(multiplayer): host authority, role-gated handlers, star relay, ro…
NellInc Jun 12, 2026
bc9b1d2
fix(sim): revive material-flow tick, grain deliveries, shift handover…
NellInc Jun 12, 2026
a83fc0b
fix(ui): re-home stranded widgets, wire shortcuts modal, slice store …
NellInc Jun 12, 2026
a0c7a78
fix(graphics): GPU resource disposal, depthWrite on transparent overl…
NellInc Jun 12, 2026
e0de9f7
build(launch): un-force npm ci, SEO head on root redirect, e2e port i…
NellInc Jun 12, 2026
eb34091
chore(branding): VCP logo -> canonical transparent mark
NellInc Jun 15, 2026
b3ddb64
feat(audit): repo-wide audit-fix — gameplay activation, a11y, docs, g…
NellInc Jul 2, 2026
7f76895
feat(sim,graphics): truck parts resupply + parkland trees adopt canop…
NellInc Jul 2, 2026
ff00221
fix(ui,sim): widget UX, shift sync, 25% res default, sky seam, PA cad…
NellInc Jul 2, 2026
3e66cbb
Improve website SEO and discovery
NellInc Jul 13, 2026
a87d07c
checkpoint(assets,scene): forklift wheel simplification + corrugated …
NellInc Aug 2, 2026
ba01abb
checkpoint(v0.40): seal accepted refinement programme
NellInc Aug 2, 2026
91514ed
feat(v0.40): complete living mill refinement
NellInc Aug 3, 2026
87c67db
feat(v0.40): deepen operations and final visual polish
NellInc Aug 3, 2026
3cdaaf5
release(v0.40): integrate final refinement with main
NellInc Aug 3, 2026
ace94d4
fix(release): preserve historical Pages versions
NellInc Aug 3, 2026
83a96ca
fix(build): isolate versioned release output
NellInc Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 12 additions & 0 deletions .env.local.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# MillOS — local environment configuration
# Copy this file to `.env.local` for local development. `.env.local` is gitignored.
#
# IMPORTANT: There is NO build-time Gemini API key.
# The Gemini API key is entered at runtime in the in-app AI / Gemini settings modal
# and stored only in your browser's localStorage (key: "millos-ai-config").
# It is never embedded in the client bundle — see the commented `define` in vite.config.ts.
# The data you send to Gemini goes directly from your browser to Google.

# Enable the service worker during local development.
# (Production builds register it automatically; leave unset for normal `npm run dev`.)
# VITE_ENABLE_SW=true
14 changes: 5 additions & 9 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ jobs:
lint:
name: Lint
runs-on: ubuntu-latest
continue-on-error: true # Lint is advisory, don't block build
steps:
- name: Checkout
uses: actions/checkout@v6
Expand All @@ -26,19 +25,17 @@ jobs:
cache: 'npm'

- name: Install dependencies
run: npm ci --force
run: npm ci

- name: Run ESLint
run: npm run lint --if-present; exit 0
# TypeScript provides comprehensive type checking
run: npm run lint

- name: Check TypeScript
run: npm run typecheck --if-present || npx tsc --noEmit

test:
name: Test
runs-on: ubuntu-latest
continue-on-error: true # Vitest worker crashes don't affect actual test results
steps:
- name: Checkout
uses: actions/checkout@v6
Expand All @@ -50,11 +47,10 @@ jobs:
cache: 'npm'

- name: Install dependencies
run: npm ci --force
run: npm ci

- name: Run tests
# Exit 0 even if Vitest worker crashes (known issue) - actual test failures are in output
run: npm test -- --coverage --reporter=verbose || true
run: npm test -- --coverage --reporter=verbose

- name: Upload coverage
uses: codecov/codecov-action@v6
Expand All @@ -79,7 +75,7 @@ jobs:
cache: 'npm'

- name: Install dependencies
run: npm ci --force
run: npm ci

- name: Build application
run: npm run build
Expand Down
63 changes: 20 additions & 43 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,12 @@ concurrency:
jobs:
build:
runs-on: ubuntu-latest
env:
V030_SOURCE_SHA: 20bcbe044fc6d7ca7275999fec63ddce83fd49d0
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Setup Node
uses: actions/setup-node@v6
Expand All @@ -29,54 +33,27 @@ jobs:
- name: Install dependencies
run: npm ci --force

# Build v0.30 (current) to /v0.30/ subdirectory
- name: Build v0.30 current
run: VERSION=v0.30 npm run build

- name: Setup staging with v0.30 current
- name: Validate release source
run: |
# Vite copies public/ wholesale. Remove versioned archives before
# staging, because they are copied exactly once in the steps below.
rm -rf dist/v0.10 dist/v0.20 dist/v0.30
mkdir -p staging/v0.30
cp -r dist/* staging/v0.30/

# v0.20 is pre-built in public/v0.20/ - copy to staging
- name: Copy v0.20 to staging
run: cp -r public/v0.20 staging/v0.20

# v0.10 is pre-built in public/v0.10/ - copy to staging (legacy)
- name: Copy v0.10 to staging
run: cp -r public/v0.10 staging/v0.10
npm run typecheck
npm run lint
npm run format:check
npm test

# Copy music files to legacy versions for music backport
- name: Copy music files to v0.10
run: cp public/*.mp3 staging/v0.10/

- name: Copy music files to v0.20
run: cp public/*.mp3 staging/v0.20/

# Root redirects to v0.30 (current)
- name: Create root redirect
- name: Rebuild the deployed v0.30 release for preservation
run: |
cat > staging/index.html << 'EOF'
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="0;url=/v0.30/">
<title>Redirecting to MillOS</title>
</head>
<body>
<p>Redirecting to <a href="/v0.30/">MillOS v0.30</a>...</p>
</body>
</html>
EOF
git worktree add --detach "$RUNNER_TEMP/millos-v030" "$V030_SOURCE_SHA"
npm ci --force --ignore-scripts --prefix "$RUNNER_TEMP/millos-v030"
VERSION=v0.30 npm run build --prefix "$RUNNER_TEMP/millos-v030"

- name: Build current release
run: VERSION="v$(node -p "require('./package.json').version.split('.').slice(0, 2).join('.')")" npm run build

- name: Copy crawl control files to the site root
- name: Stage current and archived releases
run: |
cp public/robots.txt staging/robots.txt
cp public/sitemap.xml staging/sitemap.xml
npm run build:pages-staging -- \
--archive-build "v0.30=$RUNNER_TEMP/millos-v030/dist" \
--archive-source "v0.30=$V030_SOURCE_SHA"

- name: Setup Pages
uses: actions/configure-pages@v6
Expand Down
61 changes: 15 additions & 46 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,18 @@ jobs:
- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '20'
cache: 'npm'
node-version: '22'
cache: npm

- name: Install dependencies
run: npm ci
run: npm ci --force

- name: Validate release source
run: |
npm run typecheck
npm run lint
npm run format:check
npm test

- name: Build
run: npm run build
Expand All @@ -41,55 +48,17 @@ jobs:
OUTPUT: CHANGELOG.md

- name: Create release archive
run: |
tar -czvf millos-${{ github.ref_name }}.tar.gz dist/
run: tar -czvf "millos-${{ github.ref_name }}.tar.gz" dist/

- name: Create GitHub Release
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
with:
body: ${{ steps.changelog.outputs.content }}
files: |
millos-${{ github.ref_name }}.tar.gz
files: millos-${{ github.ref_name }}.tar.gz
draft: false
prerelease: ${{ contains(github.ref, 'alpha') || contains(github.ref, 'beta') || contains(github.ref, 'rc') }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

deploy-ghpages:
name: Deploy to GitHub Pages
runs-on: ubuntu-latest
needs: release
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}

steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm ci

- name: Build
run: npm run build

- name: Setup Pages
uses: actions/configure-pages@v4

- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: 'dist'

- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
# GitHub Pages deployment is owned solely by deploy.yml. Keeping release
# publication separate prevents a tag build from replacing the versioned site.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,6 @@ npm-debug.log*
/playwright-report/
/blob-report/
/playwright/.cache/

# Test coverage reports (regenerated by `npm run test:coverage`)
coverage/
6 changes: 6 additions & 0 deletions .impeccable/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"detector": {
"ignoreFiles": ["src/0.10 Archive/**"],
"ignoreRules": ["overused-font"]
}
}
Loading