Files
rose-ash/scripts/migrate-pages.sh
giles 6528ce78b9 Scripts: page migration helpers for one-per-file layout
Python + shell tooling used to split grouped index.sx files into
one-directory-per-page layout (see the hyperscript gallery migration).
name-mapping.json records the rename table; strip_names.py is a helper
for extracting component names from .sx sources.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 09:09:15 +00:00

390 lines
15 KiB
Bash
Executable File

#!/bin/bash
# migrate-pages.sh — Restructure SX page files so file paths match URL structure
# All moves use git mv. Directories created with mkdir -p.
# If source doesn't exist, skip with warning. If target exists, skip.
set -euo pipefail
cd /root/rose-ash
# Base directory for all moves
B="sx/sx"
# First, stage all current changes in sx/sx/ so that the one-per-file split
# files become tracked by git (they are currently untracked).
echo "=== Staging current sx/sx/ changes ==="
git add sx/sx/
echo " Done. $(git diff --cached --name-only | wc -l) files staged."
MOVED=0
SKIPPED=0
WARNINGS=0
safe_mv() {
local src="$B/$1"
local dst="$B/$2"
if [ ! -f "$src" ]; then
echo " WARN: source missing: $1"
WARNINGS=$((WARNINGS + 1))
return
fi
if [ -f "$dst" ]; then
echo " SKIP: target exists: $2"
SKIPPED=$((SKIPPED + 1))
return
fi
local dir
dir=$(dirname "$dst")
mkdir -p "$dir"
git mv "$src" "$dst"
echo " $1 -> $2"
MOVED=$((MOVED + 1))
}
echo ""
echo "=== HOME ==="
safe_mv "docs-content/home-content.sx" "home/index.sx"
echo ""
echo "=== GEOGRAPHY: core pages ==="
safe_mv "geography/capabilities.sx" "geography/capabilities/index.sx"
safe_mv "geography/modules.sx" "geography/modules/index.sx"
safe_mv "geography/eval-rules.sx" "geography/eval-rules/index.sx"
echo ""
echo "=== GEOGRAPHY: CEK ==="
safe_mv "geography/cek/cek-content.sx" "geography/cek/index.sx"
safe_mv "geography/cek/cek-demo-content.sx" "geography/cek/demo/index.sx"
safe_mv "geography/cek/cek-freeze-content.sx" "geography/cek/freeze/index.sx"
safe_mv "geography/cek/cek-content-address-content.sx" "geography/cek/content/index.sx"
# CEK islands (demo-* files)
for f in $B/geography/cek/demo-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
safe_mv "geography/cek/$base" "geography/cek/_islands/$base"
done
safe_mv "geography/cek/content-address-demo.sx" "geography/cek/_islands/content-address-demo.sx"
safe_mv "geography/cek/freeze-demo.sx" "geography/cek/_islands/freeze-demo.sx"
echo ""
echo "=== GEOGRAPHY: Reactive Islands index ==="
safe_mv "reactive-islands/index/reactive-islands-index-content.sx" "geography/reactive/index.sx"
for f in $B/reactive-islands/index/demo-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
safe_mv "reactive-islands/index/$base" "geography/reactive/_islands/$base"
done
echo ""
echo "=== GEOGRAPHY: Reactive Islands demo (examples) ==="
safe_mv "reactive-islands/demo/reactive-islands-demo-content.sx" "geography/reactive/examples/index.sx"
for f in $B/reactive-islands/demo/example-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
slug="${base#example-}"
slug="${slug%.sx}"
safe_mv "reactive-islands/demo/$base" "geography/reactive/examples/$slug/index.sx"
done
echo ""
echo "=== GEOGRAPHY: Marshes ==="
safe_mv "reactive-islands/marshes/reactive-islands-marshes-content.sx" "geography/marshes/index.sx"
for f in $B/reactive-islands/marshes/demo-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
safe_mv "reactive-islands/marshes/$base" "geography/marshes/_islands/$base"
done
for f in $B/reactive-islands/marshes/example-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
slug="${base#example-}"
slug="${slug%.sx}"
safe_mv "reactive-islands/marshes/$base" "geography/marshes/$slug/index.sx"
done
echo ""
echo "=== GEOGRAPHY: Reactive lib files ==="
safe_mv "reactive-islands/event-bridge.sx" "geography/reactive/_lib/event-bridge.sx"
safe_mv "reactive-islands/named-stores.sx" "geography/reactive/_lib/named-stores.sx"
safe_mv "reactive-islands/phase2.sx" "geography/reactive/_lib/phase2.sx"
safe_mv "reactive-islands/plan.sx" "geography/reactive/_lib/plan.sx"
safe_mv "reactive-islands/test-runner.sx" "geography/reactive/_lib/test-runner.sx"
safe_mv "reactive-islands/test-temperature.sx" "geography/reactive/_lib/test-temperature.sx"
safe_mv "reactive-islands/runner-placeholder/test-runner-placeholder.sx" "geography/reactive/_lib/test-runner-placeholder.sx"
# demo-cyst and demo-reactive-expressions → _lib
for f in $B/reactive-islands/demo-cyst/*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
safe_mv "reactive-islands/demo-cyst/$base" "geography/reactive/_lib/$base"
done
for f in $B/reactive-islands/demo-reactive-expressions/*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
safe_mv "reactive-islands/demo-reactive-expressions/$base" "geography/reactive/_lib/$base"
done
echo ""
echo "=== GEOGRAPHY: Scopes ==="
safe_mv "scopes/scopes-content.sx" "geography/scopes/index.sx"
for f in $B/scopes/demo-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
safe_mv "scopes/$base" "geography/scopes/_islands/$base"
done
safe_mv "scopes/scopes-demo-example.sx" "geography/scopes/_islands/scopes-demo-example.sx"
echo ""
echo "=== GEOGRAPHY: Provide ==="
safe_mv "provide/provide-content.sx" "geography/provide/index.sx"
for f in $B/provide/demo-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
safe_mv "provide/$base" "geography/provide/_islands/$base"
done
safe_mv "provide/provide-demo-example.sx" "geography/provide/_islands/provide-demo-example.sx"
echo ""
echo "=== GEOGRAPHY: Spreads ==="
safe_mv "spreads/spreads-content.sx" "geography/spreads/index.sx"
for f in $B/spreads/demo-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
safe_mv "spreads/$base" "geography/spreads/_islands/$base"
done
echo ""
echo "=== GEOGRAPHY: Reactive Runtime ==="
safe_mv "reactive-runtime/overview-content.sx" "geography/reactive-runtime/index.sx"
# Other content files → {slug}/index.sx (strip -content suffix)
for f in $B/reactive-runtime/*-content.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
[ "$base" = "overview-content.sx" ] && continue
slug="${base%-content.sx}"
safe_mv "reactive-runtime/$base" "geography/reactive-runtime/$slug/index.sx"
done
# demo-* → _islands
for f in $B/reactive-runtime/demo-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
safe_mv "reactive-runtime/$base" "geography/reactive-runtime/_islands/$base"
done
echo ""
echo "=== GEOGRAPHY: Hypermedia Reference ==="
safe_mv "reference/attrs-content.sx" "geography/hypermedia/reference/attributes/index.sx"
safe_mv "reference/headers-content.sx" "geography/hypermedia/reference/headers/index.sx"
safe_mv "reference/events-content.sx" "geography/hypermedia/reference/events/index.sx"
safe_mv "reference/js-api-content.sx" "geography/hypermedia/reference/js-api/index.sx"
# Reference shared files
safe_mv "reference/attr-detail-content.sx" "geography/hypermedia/reference/_shared/attr-detail-content.sx"
safe_mv "reference/attr-not-found.sx" "geography/hypermedia/reference/_shared/attr-not-found.sx"
safe_mv "reference/header-detail-content.sx" "geography/hypermedia/reference/_shared/header-detail-content.sx"
safe_mv "reference/event-detail-content.sx" "geography/hypermedia/reference/_shared/event-detail-content.sx"
# Reference index
safe_mv "examples/reference-index-content.sx" "geography/hypermedia/reference/index.sx"
# Example page shared
safe_mv "examples/page-content.sx" "geography/hypermedia/example/_shared/page-content.sx"
# Examples-content → example/{slug}/index.sx
for f in $B/examples-content/example-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
slug="${base#example-}"
slug="${slug%.sx}"
safe_mv "examples-content/$base" "geography/hypermedia/example/$slug/index.sx"
done
echo ""
echo "=== GEOGRAPHY: Isomorphism ==="
safe_mv "analyzer/bundle-analyzer-content.sx" "geography/isomorphism/bundle-analyzer/index.sx"
# Analyzer islands (non-content files)
for f in $B/analyzer/*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
[ "$base" = "bundle-analyzer-content.sx" ] && continue
safe_mv "analyzer/$base" "geography/isomorphism/bundle-analyzer/_islands/$base"
done
safe_mv "routing-analyzer/content.sx" "geography/isomorphism/routing-analyzer/index.sx"
safe_mv "routing-analyzer/routing-row.sx" "geography/isomorphism/routing-analyzer/_islands/routing-row.sx"
safe_mv "async-io-demo.sx" "geography/isomorphism/async-io/index.sx"
safe_mv "affinity-demo/content.sx" "geography/isomorphism/affinity/index.sx"
for f in $B/affinity-demo/aff-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
safe_mv "affinity-demo/$base" "geography/isomorphism/affinity/_islands/$base"
done
safe_mv "optimistic-demo.sx" "geography/isomorphism/optimistic/index.sx"
safe_mv "offline-demo.sx" "geography/isomorphism/offline/index.sx"
echo ""
echo "=== LANGUAGE: Docs ==="
safe_mv "docs-content/docs-introduction-content.sx" "language/doc/introduction/index.sx"
safe_mv "docs-content/docs-getting-started-content.sx" "language/doc/getting-started/index.sx"
safe_mv "docs-content/docs-components-content.sx" "language/doc/components/index.sx"
safe_mv "docs-content/docs-evaluator-content.sx" "language/doc/evaluator/index.sx"
safe_mv "docs-content/docs-primitives-content.sx" "language/doc/primitives/index.sx"
safe_mv "docs-content/docs-special-forms-content.sx" "language/doc/special-forms/index.sx"
safe_mv "docs-content/docs-server-rendering-content.sx" "language/doc/server-rendering/index.sx"
echo ""
echo "=== LANGUAGE: Spec ==="
safe_mv "specs/architecture-content.sx" "language/spec/index.sx"
safe_mv "specs/overview-content.sx" "language/spec/_shared/overview-content.sx"
safe_mv "specs/detail-content.sx" "language/spec/_shared/detail-content.sx"
safe_mv "specs/not-found.sx" "language/spec/_shared/not-found.sx"
echo ""
echo "=== LANGUAGE: Bootstrappers ==="
safe_mv "specs/bootstrappers-index-content.sx" "language/bootstrapper/index.sx"
safe_mv "specs/bootstrapper-js-content.sx" "language/bootstrapper/javascript/index.sx"
safe_mv "specs/bootstrapper-py-content.sx" "language/bootstrapper/python/index.sx"
safe_mv "specs/bootstrapper-self-hosting-content.sx" "language/bootstrapper/self-hosting/index.sx"
safe_mv "specs/bootstrapper-self-hosting-js-content.sx" "language/bootstrapper/self-hosting-js/index.sx"
echo ""
echo "=== LANGUAGE: Page helpers ==="
safe_mv "page-helpers-demo/content.sx" "language/bootstrapper/page-helpers/index.sx"
for f in $B/page-helpers-demo/demo-*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
safe_mv "page-helpers-demo/$base" "language/bootstrapper/page-helpers/_islands/$base"
done
echo ""
echo "=== LANGUAGE: Testing ==="
safe_mv "testing/overview-content.sx" "language/test/index.sx"
safe_mv "testing/runners-content.sx" "language/test/runners/index.sx"
safe_mv "testing/spec-content.sx" "language/test/_shared/spec-content.sx"
echo ""
echo "=== APPLICATIONS: HTMX ==="
safe_mv "htmx/demo-content.sx" "applications/htmx/index.sx"
safe_mv "htmx/_test/demo-content.sx" "applications/htmx/_test/demo-content.sx"
echo ""
echo "=== APPLICATIONS: Hyperscript ==="
safe_mv "hyperscript/playground-content.sx" "applications/hyperscript/index.sx"
safe_mv "hyperscript/htmx-content.sx" "applications/hyperscript/htmx/index.sx"
safe_mv "hyperscript/compile-result.sx" "applications/hyperscript/_islands/compile-result.sx"
safe_mv "hyperscript/example.sx" "applications/hyperscript/_islands/example.sx"
safe_mv "hyperscript/live-demo.sx" "applications/hyperscript/_islands/live-demo.sx"
safe_mv "hyperscript/playground.sx" "applications/hyperscript/_islands/playground.sx"
safe_mv "hyperscript/translation.sx" "applications/hyperscript/_islands/translation.sx"
echo ""
echo "=== APPLICATIONS: CSSX ==="
safe_mv "cssx/overview-content.sx" "applications/cssx/index.sx"
for f in $B/cssx/*-content.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
[ "$base" = "overview-content.sx" ] && continue
slug="${base%-content.sx}"
safe_mv "cssx/$base" "applications/cssx/$slug/index.sx"
done
echo ""
echo "=== APPLICATIONS: Protocols ==="
safe_mv "protocols/wire-format-content.sx" "applications/protocol/index.sx"
for f in $B/protocols/*-content.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
[ "$base" = "wire-format-content.sx" ] && continue
slug="${base%-content.sx}"
safe_mv "protocols/$base" "applications/protocol/$slug/index.sx"
done
echo ""
echo "=== APPLICATIONS: Standalone pages ==="
safe_mv "sx-urls.sx" "applications/sx-urls/index.sx"
safe_mv "native-browser.sx" "applications/native-browser/index.sx"
safe_mv "sxtp.sx" "applications/sxtp/index.sx"
echo ""
echo "=== APPLICATIONS: GraphQL ==="
safe_mv "graphql/demo-content.sx" "applications/graphql/index.sx"
safe_mv "graphql/parse-island.sx" "applications/graphql/_islands/parse-island.sx"
echo ""
echo "=== APPLICATIONS: Pretext ==="
safe_mv "pretext-demo/content.sx" "applications/pretext/index.sx"
safe_mv "pretext-demo/live.sx" "applications/pretext/_islands/live.sx"
safe_mv "pretext-demo/render-paragraph.sx" "applications/pretext/_islands/render-paragraph.sx"
echo ""
echo "=== ETC: Essays ==="
safe_mv "essays/index.sx" "etc/essay/index.sx"
# Philosophy essays → etc/philosophy/
safe_mv "essays/philosophy-index.sx" "etc/philosophy/index.sx"
safe_mv "essays/sx-manifesto.sx" "etc/philosophy/sx-manifesto/index.sx"
safe_mv "essays/godel-escher-bach.sx" "etc/philosophy/godel-escher-bach/index.sx"
safe_mv "essays/sx-and-wittgenstein.sx" "etc/philosophy/wittgenstein/index.sx"
safe_mv "essays/sx-and-dennett.sx" "etc/philosophy/dennett/index.sx"
safe_mv "essays/s-existentialism.sx" "etc/philosophy/existentialism/index.sx"
safe_mv "essays/platonic-sx.sx" "etc/philosophy/platonic-sx/index.sx"
# Regular essays → etc/essay/{name}/index.sx
PHILOSOPHY_ESSAYS="sx-manifesto godel-escher-bach sx-and-wittgenstein sx-and-dennett s-existentialism platonic-sx"
for f in $B/essays/*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
name="${base%.sx}"
[ "$name" = "index" ] && continue
[ "$name" = "philosophy-index" ] && continue
skip=false
for p in $PHILOSOPHY_ESSAYS; do
if [ "$name" = "$p" ]; then
skip=true
break
fi
done
$skip && continue
safe_mv "essays/$base" "etc/essay/$name/index.sx"
done
echo ""
echo "=== ETC: Plans ==="
safe_mv "plans/index.sx" "etc/plan/index.sx"
# Theorem prover (subdirectory)
safe_mv "plans/theorem-prover/plan-theorem-prover-content.sx" "etc/plan/theorem-prover/index.sx"
safe_mv "plans/theorem-prover/prove-phase1-row.sx" "etc/plan/theorem-prover/_islands/prove-phase1-row.sx"
safe_mv "plans/theorem-prover/prove-phase2-row.sx" "etc/plan/theorem-prover/_islands/prove-phase2-row.sx"
# Regular plan files → etc/plan/{name}/index.sx
for f in $B/plans/*.sx; do
[ -f "$f" ] || continue
base=$(basename "$f")
name="${base%.sx}"
[ "$name" = "index" ] && continue
safe_mv "plans/$base" "etc/plan/$name/index.sx"
done
echo ""
echo "=== TOOLS ==="
safe_mv "sx-tools/overview-content.sx" "tools/sx-tools/index.sx"
safe_mv "sx-tools-demos.sx" "tools/sx-tools/_lib/sx-tools-demos.sx"
safe_mv "sx-tools-editor.sx" "tools/sx-tools/_lib/sx-tools-editor.sx"
safe_mv "services-tools.sx" "tools/services/index.sx"
safe_mv "playground/content.sx" "tools/playground/index.sx"
safe_mv "playground/repl.sx" "tools/playground/_islands/repl.sx"
echo ""
echo "======================================="
echo "Migration complete!"
echo " Moved: $MOVED"
echo " Skipped: $SKIPPED"
echo " Warnings: $WARNINGS"
echo "======================================="