Files
MyAiConfiguration/scripts/build.sh
T

90 lines
3.4 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
root=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
shared="$root/shared"
output="$root/generated"
plugin_manifest="$root/adapters/plugins.tsv"
[ -f "$plugin_manifest" ] || { printf 'Missing plugin manifest: %s\n' "$plugin_manifest" >&2; exit 1; }
[ "$(awk 'NR > 1 && NF == 5 { count++ } END { print count + 0 }' "$plugin_manifest")" -eq 4 ] || { printf 'Plugin manifest must define exactly four plugins.\n' >&2; exit 1; }
copy_directory() {
local source=$1 destination=$2
mkdir -p "$destination"
cp -R "$source"/. "$destination"/
}
read_field() {
local path=$1 name=$2 value
value=$(sed -n "s/^${name}:[[:space:]]*//p" "$path" | head -n 1)
[ -n "$value" ] || { printf 'Missing %s in %s\n' "$name" "$path" >&2; exit 1; }
printf '%s' "$value"
}
quote_toml() {
local value=$1
value=${value//\\/\\\\}
value=${value//\"/\\\"}
value=${value//$'\r'/}
value=${value//$'\n'/\\n}
printf '"%s"' "$value"
}
bash "$shared/hooks/scripts/test-session-config.sh" "$root"
rm -rf -- "$output"
for platform in windows linux; do
mkdir -p "$output/codex-$platform" "$output/claude-$platform"
copy_directory "$shared/skills" "$output/codex-$platform/skills"
copy_directory "$shared/skills" "$output/claude-$platform/skills"
copy_directory "$shared/rules" "$output/codex-$platform/rules"
copy_directory "$shared/rules" "$output/claude-$platform/rules"
copy_directory "$shared/hooks" "$output/codex-$platform/hooks"
copy_directory "$shared/hooks" "$output/claude-$platform/hooks"
copy_directory "$shared/statusline" "$output/claude-$platform/statusline"
cp "$shared/global-instructions.md" "$output/codex-$platform/AGENTS.md"
cp "$shared/global-instructions.md" "$output/claude-$platform/CLAUDE.md"
cp "$root/adapters/codex/config/config.toml" "$output/codex-$platform/config.toml"
cp "$root/adapters/claude/config/settings.json" "$output/claude-$platform/settings.json"
for client in codex claude; do
agents_output="$output/$client-$platform/agents"
mkdir -p "$agents_output"
for agent in "$shared"/agents/*; do
metadata="$agent/agent.yml"
name=$(read_field "$metadata" name)
description=$(read_field "$metadata" description)
instructions=$(<"$agent/instructions.md")
if [ "$client" = codex ]; then
printf 'name = %s\ndescription = %s\ndeveloper_instructions = %s\n' "$(quote_toml "$name")" "$(quote_toml "$description")" "$(quote_toml "$instructions")" > "$agents_output/$name.toml"
else
printf '%s\nname: %s\ndescription: %s\n%s\n\n%s\n' '---' "$name" "$description" '---' "$instructions" > "$agents_output/$name.md"
fi
done
done
for client in codex claude; do
file=config.toml
[ "$client" != claude ] || file=settings.json
command=bash
script=flashbang.sh
statusline_script=statusline.sh
if [ "$platform" = windows ]; then
command='powershell -NoProfile -ExecutionPolicy Bypass -File'
script=flashbang.ps1
statusline_script=statusline.ps1
fi
path="$output/$client-$platform/$file"
content=$(<"$path")
content=${content//__HOOK_COMMAND__/$command}
content=${content//__WINDOWS_HOOK_COMMAND__/$command}
content=${content//__HOOK_SCRIPT__/$script}
content=${content//__WINDOWS_HOOK_SCRIPT__/$script}
content=${content//__STATUSLINE_COMMAND__/$command}
content=${content//__STATUSLINE_SCRIPT__/$statusline_script}
printf '%s\n' "$content" > "$path"
done
done
printf 'PASS build: codex-windows, claude-windows, codex-linux, claude-linux\n'