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>
390 lines
15 KiB
Bash
Executable File
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 "======================================="
|