feat: installer v2 — selective install, interactive TUI, consolidate cluster

One coherent, dependency-free installer (bash 3.2+, zero deps) that
consolidates 7 conflicting install.sh PRs and fixes #532.

Selective install (compose freely; empty = everything):
- --division / --agent / --agents-file filter across both source tools and
  the flat converted outputs via a slug-based allow-set (#157, #487)
- --list [tools|teams|agents] and --dry-run

Install mechanics:
- --link symlink vs copy (#233); --path + env-var fallbacks (#216);
  auto-run convert.sh when integration files are missing (#426);
  resolve_tool_path dynamic detection (#327); set -e-safe increments (#505)

Interactive wizard (pure bash):
- Tools -> Teams -> Review, arrow-key nav, space toggle, a/n all/none,
  live / search, live agent counts, inline OpenCode capacity warning,
  alt-screen takeover with trap-based Ctrl-C restore, non-TTY fallback

#532: installing a subset keeps you under OpenCode's ~119 scanner cap
(upstream anomalyco/opencode#27988); installer warns when exceeded; README
documents it.

New scripts/lib.sh holds shared frontmatter/slug helpers (used by
convert.sh too) + ANSI/TUI primitives.

Closes #157, #216, #233, #327, #426, #487, #505.

Co-Authored-By: kienbui1995 <kienbui1995@users.noreply.github.com>
Co-Authored-By: Shiven0504 <Shiven0504@users.noreply.github.com>
Co-Authored-By: rounakkumarsingh <rounakkumarsingh@users.noreply.github.com>
Co-Authored-By: toukanno <toukanno@users.noreply.github.com>
Co-Authored-By: ilyaivasyk <ilyaivasyk@users.noreply.github.com>
Co-Authored-By: Jason2031 <Jason2031@users.noreply.github.com>
Co-Authored-By: ShaoJiaZhen <ShaoJiaZhen@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Michael Sitarzewski
2026-06-05 00:21:52 -05:00
parent 3fd9542983
commit f2db3d4e3a
5 changed files with 714 additions and 177 deletions
+5 -23
View File
@@ -62,6 +62,10 @@ REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
OUT_DIR="$REPO_ROOT/integrations"
TODAY="$(date +%Y-%m-%d)"
# Shared helpers (get_field, get_body, slugify, ...)
# shellcheck source=lib.sh
. "$SCRIPT_DIR/lib.sh"
AGENT_DIRS=(
academic design engineering finance game-development marketing paid-media product project-management
sales security spatial-computing specialized strategy support testing
@@ -81,29 +85,7 @@ parallel_jobs_default() {
echo 4
}
# --- Frontmatter helpers ---
# Extract a single field value from YAML frontmatter block.
# Usage: get_field <field> <file>
get_field() {
local field="$1" file="$2"
awk -v f="$field" '
/^---$/ { fm++; next }
fm == 1 && $0 ~ "^" f ": " { sub("^" f ": ", ""); print; exit }
' "$file"
}
# Strip the leading frontmatter block and return only the body.
# Usage: get_body <file>
get_body() {
awk 'BEGIN{fm=0} /^---$/{fm++; next} fm>=2{print}' "$1"
}
# Convert a human-readable agent name to a lowercase kebab-case slug.
# "Frontend Developer" → "frontend-developer"
slugify() {
echo "$1" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//'
}
# --- Frontmatter helpers: get_field / get_body / slugify now live in lib.sh ---
# Escape a value for a TOML basic string, including control characters that
# cannot appear raw in TOML source.