Single-commit clean baseline after security scrub of niche-tells, project codenames, internal jargon, and contributor-email leaks. Contents: - 100 Rust crates (_primitives/_rust/) - 37 agent manifests (_manifests/) + generated specs (_generated/) - 67 user-invocable skills (skills/) - 33 hooks (hooks/) - Composition blocks (_blocks/) - Documentation (docs/, README.md) - TS adapter packages (_ts_packages/) - Assembler (_assembler/) - Roles (_roles/) - Templates (_templates/) - Forgejo CI (.forgejo/) Author: Denis Parfionovich <info@greendragon.info> License: see LICENSE.
78 lines
2.1 KiB
Bash
78 lines
2.1 KiB
Bash
# shellcheck shell=bash
|
|
# lib-bin.sh — install entry-point scripts from kit's `bin/` into
|
|
# `~/.claude/bin/`. Today this is just `keisei` (TUI splash → claude),
|
|
# but the cube is generic so future entry points (e.g. `keisei-status`,
|
|
# `keisei-doctor`) can ship the same way.
|
|
#
|
|
# Constructor Pattern: 1 file = 1 concern (bin install + symlink),
|
|
# <200 LOC.
|
|
#
|
|
# Public API:
|
|
# install_bin -> copy kit/bin/* → ~/.claude/bin/<name>
|
|
# (symlink preferred, copy as fallback)
|
|
#
|
|
# Reads globals: $KIT_DIR, $HOME_DIR.
|
|
# Requires: say / warn / err from lib-log.sh.
|
|
|
|
# Target directory for entry-point scripts. Stays under ~/.claude/ so
|
|
# everything KeiSeiKit installs lives in one tree.
|
|
_keisei_bin_dir() {
|
|
printf '%s\n' "$HOME_DIR/.claude/bin"
|
|
}
|
|
|
|
# Install all executable scripts from $KIT_DIR/bin/ into ~/.claude/bin/.
|
|
# Idempotent: re-running replaces existing symlinks/files.
|
|
#
|
|
# Strategy:
|
|
# - Symlink when possible (lets `keisei --help` reflect kit edits live).
|
|
# - Fall back to copy if symlink would dangle (e.g. install + delete kit).
|
|
install_bin() {
|
|
local src="$KIT_DIR/bin"
|
|
local dst
|
|
dst="$(_keisei_bin_dir)"
|
|
|
|
if [ ! -d "$src" ]; then
|
|
say "no bin/ in kit — skipping"
|
|
return 0
|
|
fi
|
|
|
|
mkdir -p "$dst"
|
|
|
|
local count=0
|
|
for f in "$src"/*; do
|
|
[ -f "$f" ] || continue
|
|
local name
|
|
name="$(basename "$f")"
|
|
local target="$dst/$name"
|
|
|
|
# Replace existing entry deterministically — symlink > copy.
|
|
if [ -L "$target" ] || [ -f "$target" ]; then
|
|
rm -f "$target"
|
|
fi
|
|
|
|
if ln -s "$f" "$target" 2>/dev/null; then
|
|
:
|
|
else
|
|
cp -f "$f" "$target"
|
|
fi
|
|
chmod +x "$target" 2>/dev/null || chmod +x "$f"
|
|
count=$((count + 1))
|
|
done
|
|
|
|
if [ "$count" -gt 0 ]; then
|
|
say "bin: installed $count entry-point script(s) → $dst"
|
|
else
|
|
say "bin: nothing to install"
|
|
fi
|
|
}
|
|
|
|
# Print one-line status for the summary banner.
|
|
bin_summary() {
|
|
local dst
|
|
dst="$(_keisei_bin_dir)"
|
|
if [ -d "$dst" ]; then
|
|
local n
|
|
n=$(find "$dst" -maxdepth 1 -type l -o -type f 2>/dev/null | wc -l | tr -d ' ')
|
|
printf 'bin: %s entry-point(s) under %s\n' "$n" "$dst"
|
|
fi
|
|
}
|