ma7engine: ядро, шаблон панели, скаффолдер и доктор
Первый коммит существующего состояния. Ядро кладётся под git ради того, чтобы половины разъезжались в продуктовые репозитории через git subtree, а не копированием: subtree делает настоящий merge, хранит историю и умеет отдавать правки обратно. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019LeBkZLiQrvdECf5nfgiMz
This commit is contained in:
Executable
+116
@@ -0,0 +1,116 @@
|
||||
#!/bin/sh
|
||||
# Обновляет вендоренную копию ядра (ma7engine) в панели:
|
||||
# ma7engine/core/browser → <панель>/frontend/src/core (браузерная половина)
|
||||
# ma7engine/core/server → <панель>/backend/core (серверная половина)
|
||||
#
|
||||
# Панель из одной папки, где сервер лежит рядом с фронтом (server.ts в корне,
|
||||
# как в awg-ui), получает серверную часть в <панель>/core.
|
||||
#
|
||||
# Зачем копия, а не алиас прямо на соседнюю папку: контекст сборки образа
|
||||
# панели — её собственный каталог (COPY frontend/ ./ в Dockerfile), и путь,
|
||||
# уходящий выше него, внутри контейнера не разрешится. При копии пути
|
||||
# ./src/core и ./core одинаковы в деве, в tsc --noEmit и в Docker, и Dockerfile
|
||||
# трогать не нужно вообще.
|
||||
#
|
||||
# Файл кладётся в репозиторий потребителя (frontend/scripts/), потому что
|
||||
# вызывать его нужно и тогда, когда ma7engine рядом нет.
|
||||
#
|
||||
# Использование: npm run update (или sh scripts/update.sh)
|
||||
# Где искать ядро: $MA7ENGINE, иначе перебор кандидатов ниже — первый
|
||||
# существующий выигрывает, выбранный путь печатается.
|
||||
set -eu
|
||||
|
||||
abspath() { (CDPATH= cd -- "$1" 2>/dev/null && pwd); }
|
||||
|
||||
here=$(abspath "$(dirname -- "$0")")
|
||||
app=$(dirname "$here") # .../<панель>/frontend или корень панели из одной папки
|
||||
panel=$(dirname "$app") # .../<панель> или каталог, где лежат панели
|
||||
|
||||
# Ядро может лежать где угодно относительно панели: рядом с продуктовым
|
||||
# репозиторием, рядом с остальными панелями или внутри самого репозитория.
|
||||
# Перебираем, вместо того чтобы зашивать одну раскладку — переезд ядра иначе
|
||||
# молча уводит синхронизацию на старую копию.
|
||||
#
|
||||
# Порядок — от ближнего к дальнему: панель, у которой ядро лежит рядом, не
|
||||
# должна утащить копию из каталога уровнем выше (такая копия обычно старая —
|
||||
# именно от неё и уезжает синхронизация молча).
|
||||
CANDIDATES="
|
||||
$app/../ma7engine
|
||||
$app/../../ma7engine
|
||||
$app/../../../ma7engine
|
||||
$app/../../../admins/ma7engine
|
||||
"
|
||||
|
||||
find_engine() {
|
||||
if [ -n "${MA7ENGINE:-}" ]; then
|
||||
if [ ! -d "$MA7ENGINE/core/browser" ]; then
|
||||
echo "update: в MA7ENGINE=$MA7ENGINE нет каталога core/browser" >&2
|
||||
exit 1
|
||||
fi
|
||||
abspath "$MA7ENGINE"
|
||||
return
|
||||
fi
|
||||
for candidate in $CANDIDATES; do
|
||||
if [ -d "$candidate/core/browser" ]; then
|
||||
abspath "$candidate"
|
||||
return
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# Куда класть серверную половину. Панели без своего сервера не получают её вовсе.
|
||||
server_target() {
|
||||
if [ -d "$panel/backend" ]; then echo "$panel/backend/core"
|
||||
elif [ -f "$app/server.ts" ]; then echo "$app/core"
|
||||
fi
|
||||
}
|
||||
|
||||
# Скрипт обязан запускаться из фронта панели: $app определяется как каталог
|
||||
# уровнем выше scripts/, и запущенный не оттуда он молча создаёт постороннюю
|
||||
# src/core рядом с чем угодно. index.html — маркер vite-фронта.
|
||||
if [ ! -f "$app/index.html" ]; then
|
||||
echo "update: $app не похож на фронт панели (нет index.html)." >&2
|
||||
echo " Скрипт запускается из <панель>/frontend: npm run update" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
front_to=$app/src/core
|
||||
server_to=$(server_target)
|
||||
|
||||
engine=$(find_engine)
|
||||
|
||||
if [ -z "$engine" ]; then
|
||||
# В контейнере ядра нет — оно уже приехало внутри src/core (и backend/core)
|
||||
# вместе с остальными исходниками. Это норма, а не ошибка сборки.
|
||||
if [ -d "$front_to" ] || { [ -n "$server_to" ] && [ -d "$server_to" ]; }; then
|
||||
echo "update: ma7engine рядом не найден, использую уже синхронизированные копии"
|
||||
exit 0
|
||||
fi
|
||||
echo "update: ma7engine не найден ни в одном из мест:" >&2
|
||||
for candidate in $CANDIDATES; do echo " $candidate" >&2; done
|
||||
echo " Укажи путь через MA7ENGINE=/путь/к/ma7engine" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "update: ядро — $engine"
|
||||
|
||||
copy() { # copy <откуда> <куда> <подпись>
|
||||
[ -d "$1" ] || return 0
|
||||
rm -rf "$2"
|
||||
mkdir -p "$(dirname "$2")"
|
||||
cp -R "$1" "$2"
|
||||
echo " $3: $1 → $2"
|
||||
}
|
||||
|
||||
copy "$engine/core/browser" "$front_to" "фронт"
|
||||
if [ -n "$server_to" ]; then
|
||||
copy "$engine/core/server" "$server_to" "сервер"
|
||||
fi
|
||||
|
||||
# Доктор едет вместе с ядром: проверки в панели должны быть те же, что в ядре,
|
||||
# иначе панель отчитывается о соответствии по устаревшему списку. Кладётся
|
||||
# рядом с этим скриптом — оттуда его зовёт `npm run doctor`.
|
||||
if [ -f "$engine/scripts/doctor.mjs" ]; then
|
||||
cp "$engine/scripts/doctor.mjs" "$here/doctor.mjs"
|
||||
echo " доктор: $engine/scripts/doctor.mjs → $here/doctor.mjs"
|
||||
fi
|
||||
Reference in New Issue
Block a user