From 8f0f0df7d6ecfb31f28d9f37e2d3a52113c06b3b Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Wed, 11 Feb 2026 11:59:12 -0600 Subject: [PATCH] refactor: unified setup.sh replaces sync-skills.sh - Single script handles skills, agents, and instructions - Works locally (cloned repo) and remotely (curl, no clone) - Auto-generated manifests (agents.list, instructions.list) - update-lists command regenerates manifests from directory contents - Removed sync-skills.sh (folded into setup.sh) - Rewrote assets README to be concise and actionable - Updated all references in Agents.md and skills.md --- Agents.md | 7 +- assets/README.md | 145 ++++++++++--------- assets/agents.list | 10 ++ assets/instructions.list | 1 + assets/setup.sh | 248 +++++++++++++++++++++++++++++++++ assets/sync-skills.sh | 26 ---- docs/ai/images/skills-find.png | Bin 0 -> 43988 bytes docs/ai/skills.md | 55 +++++--- 8 files changed, 378 insertions(+), 114 deletions(-) create mode 100644 assets/agents.list create mode 100644 assets/instructions.list create mode 100755 assets/setup.sh delete mode 100644 assets/sync-skills.sh create mode 100644 docs/ai/images/skills-find.png diff --git a/Agents.md b/Agents.md index f26f7f3..68b66b8 100644 --- a/Agents.md +++ b/Agents.md @@ -76,8 +76,11 @@ If you update any file in this repo, commit and push right away so other develop This repo uses a skills manifest to standardize skills across developers. 1. Review the curated list under assets/. -2. Run ./assets/sync-skills.sh (uses the `npx skills` CLI). -3. Restart your editor if needed. +2. Run `./assets/setup.sh skills` (or `skills ios`, `skills android`). +3. Run `./assets/setup.sh agents` to install agents. +4. Run `./assets/setup.sh instructions` to install instructions. +5. Or run `./assets/setup.sh all ios` to install everything at once. +6. Restart your editor if needed. ## Suggested Agent Request Template - Goal: (one sentence) diff --git a/assets/README.md b/assets/README.md index 733c6ae..2ff4076 100644 --- a/assets/README.md +++ b/assets/README.md @@ -1,80 +1,97 @@ -# Assets (Staging) +# AI Assets -This folder stages non-guide assets for a future migration to a dedicated distribution repo. +One script installs everything. No manual copy/paste. No cloning required. -Contents: -- agents/: Agent prompt files -- instructions/: Repo-level instruction files -- ios-skills.yaml, android-skills.yaml, shared-skills.yaml: Curated skills lists -- sync-skills.sh: Installs skills from a curated list using the skills CLI +## Quick Start -Do not add handbook content here. Use docs/ai for the guide. +### Option 1 — You Cloned This Repo -## Install Skills (Platform Lists) -Run the sync script with the list you want. Restart your editor if skills do not appear. - -### iOS ```bash -SKILLS_FILE=./assets/ios-skills.yaml ./assets/sync-skills.sh +# Install everything for iOS +./assets/setup.sh all ios + +# Or pick what you need +./assets/setup.sh skills ios +./assets/setup.sh agents +./assets/setup.sh instructions ``` -### Android +### Option 2 — No Clone (Run Remotely) + +Point the script at the repo and run. Nothing to download first. + ```bash -SKILLS_FILE=./assets/android-skills.yaml ./assets/sync-skills.sh +# Set the base URL once (get this from your team lead) +export ASSETS_BASE_URL="https://gitlab.com//mobile-ai-docs/-/raw/develop/assets" + +# Install everything for iOS — one command +bash <(curl -fsSL "$ASSETS_BASE_URL/setup.sh") all ios + +# Or pick what you need +bash <(curl -fsSL "$ASSETS_BASE_URL/setup.sh") skills ios +bash <(curl -fsSL "$ASSETS_BASE_URL/setup.sh") agents +bash <(curl -fsSL "$ASSETS_BASE_URL/setup.sh") instructions ``` -### Shared (All Platforms) +That's it. + +--- + +## Commands + +| Command | What It Does | +|---------|-------------| +| `setup.sh skills [platform]` | Install skills from a curated YAML list | +| `setup.sh agents` | Install all agent prompt files | +| `setup.sh instructions` | Install all instruction rule files | +| `setup.sh all [platform]` | All of the above in one shot | +| `setup.sh update-lists` | Regenerate manifests from directory contents (local only) | +| `setup.sh help` | Print usage | + +### Platforms (for skills) + +| Platform | List File | +|----------|-----------| +| `ios` | ios-skills.yaml | +| `android` | android-skills.yaml | +| `shared` (default) | shared-skills.yaml | + +## Where Things Get Installed + +| Asset | Default Location | Override | +|-------|-----------------|----------| +| Skills | Managed by `npx skills` CLI | — | +| Agents | `~/.copilot/agents/` | `AGENTS_DIR` | +| Instructions | `./instructions/` | `INSTRUCTIONS_DIR` | + +## Adding New Assets + +When you add a new agent or instruction file to `assets/agents/` or `assets/instructions/`, run: + ```bash -SKILLS_FILE=./assets/shared-skills.yaml ./assets/sync-skills.sh +./assets/setup.sh update-lists ``` -### iOS + Shared -```bash -SKILLS_FILE=./assets/shared-skills.yaml ./assets/sync-skills.sh -SKILLS_FILE=./assets/ios-skills.yaml ./assets/sync-skills.sh +This regenerates `agents.list` and `instructions.list` so remote installs pick up the new files. Commit the updated lists. + +## Folder Structure + +``` +assets/ + setup.sh ← the installer + agents.list ← auto-generated manifest + instructions.list ← auto-generated manifest + ios-skills.yaml ← curated iOS skills + android-skills.yaml ← curated Android skills + shared-skills.yaml ← curated cross-platform skills + agents/ ← agent prompt files + instructions/ ← instruction rule files ``` -### Android + Shared -```bash -SKILLS_FILE=./assets/shared-skills.yaml ./assets/sync-skills.sh -SKILLS_FILE=./assets/android-skills.yaml ./assets/sync-skills.sh -``` +## Environment Variables -## Run Without Cloning The Repo (All Assets) -This installs skills, agents, and instructions without cloning. Set the base URL once and reuse it. - -```bash -export ASSETS_BASE_URL="https:///org/ai-assets/raw/main/assets" - -curl -fsSL "$ASSETS_BASE_URL/sync-skills.sh" -o /tmp/sync-skills.sh -curl -fsSL "$ASSETS_BASE_URL/ios-skills.yaml" -o /tmp/ios-skills.yaml - -chmod +x /tmp/sync-skills.sh -SKILLS_FILE=/tmp/ios-skills.yaml /tmp/sync-skills.sh - -mkdir -p ~/.agents/agents ./instructions -curl -fsSL "$ASSETS_BASE_URL/agents/.agent.md" -o ~/.agents/agents/.agent.md -curl -fsSL "$ASSETS_BASE_URL/instructions/.instructions.md" -o ./instructions/.instructions.md -``` - -Notes: -- The base URL is only defined once. -- Cloning the repo is still recommended if you want updates and version history. - -## Install Agents (Clone And Copy) -Agents are prompt files that live under assets/agents. - -```bash -git clone git@:org/ai-assets.git -mkdir -p ~/.agents/agents -cp -R ai-assets/agents/* ~/.agents/agents/ -``` - -## Install Instructions (Clone And Copy) -Instructions are repo-level rule files. Copy them into your project. - -```bash -git clone git@:org/ai-assets.git -mkdir -p ./instructions -cp -R ai-assets/instructions/* ./instructions/ -``` \ No newline at end of file +| Variable | Purpose | Required? | +|----------|---------|-----------| +| `ASSETS_BASE_URL` | Base URL for remote downloads | Only without a clone | +| `AGENTS_DIR` | Custom agents install path | No | +| `INSTRUCTIONS_DIR` | Custom instructions install path | No | \ No newline at end of file diff --git a/assets/agents.list b/assets/agents.list new file mode 100644 index 0000000..497a176 --- /dev/null +++ b/assets/agents.list @@ -0,0 +1,10 @@ +arch.agent.md +debug.agent.md +principal-software-engineer.agent.md +prompt-builder.agent.md +prompt-engineer.agent.md +software-engineer-agent-v1.agent.md +task-planner.agent.md +task-researcher.agent.md +tech-debt-remediation-plan.agent.md +thinking-beast-mode.agent.md diff --git a/assets/instructions.list b/assets/instructions.list new file mode 100644 index 0000000..431b076 --- /dev/null +++ b/assets/instructions.list @@ -0,0 +1 @@ +swift.instructions.md diff --git a/assets/setup.sh b/assets/setup.sh new file mode 100755 index 0000000..aa5ebe2 --- /dev/null +++ b/assets/setup.sh @@ -0,0 +1,248 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ───────────────────────────────────────────────────────────────────── +# Mobile AI Assets Installer +# +# One script to install skills, agents, and instructions. +# Works both locally (cloned repo) and remotely (curl, no clone). +# +# Local: ./assets/setup.sh agents +# Remote: export ASSETS_BASE_URL="https://..." +# bash <(curl -fsSL "$ASSETS_BASE_URL/setup.sh") agents +# ───────────────────────────────────────────────────────────────────── + +VERSION="1.0.0" + +# ── Configuration (override with env vars) ─────────────────────────── +ASSETS_BASE_URL="${ASSETS_BASE_URL:-}" +AGENTS_DIR="${AGENTS_DIR:-$HOME/.copilot/agents}" +INSTRUCTIONS_DIR="${INSTRUCTIONS_DIR:-./instructions}" + +# ── Colors ─────────────────────────────────────────────────────────── +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +BOLD='\033[1m' +NC='\033[0m' + +# ── Helpers ────────────────────────────────────────────────────────── +info() { printf "${BLUE}▸${NC} %s\n" "$*"; } +ok() { printf "${GREEN}✓${NC} %s\n" "$*"; } +warn() { printf "${YELLOW}!${NC} %s\n" "$*"; } +fail() { printf "${RED}✗${NC} %s\n" "$*" >&2; exit 1; } +heading() { printf "\n${BOLD}── %s ──${NC}\n" "$*"; } + +# ── Mode Detection ─────────────────────────────────────────────────── +# Detect if running from a cloned repo or remotely via curl. +MODE="" +ASSETS_DIR="" + +detect_mode() { + local script_dir + script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" || script_dir="" + + if [[ -n "$script_dir" && -f "$script_dir/agents.list" ]]; then + MODE="local" + ASSETS_DIR="$script_dir" + elif [[ -n "$ASSETS_BASE_URL" ]]; then + MODE="remote" + else + fail "Set ASSETS_BASE_URL to run without a clone. Example: + export ASSETS_BASE_URL=\"https://gitlab.com/org/repo/-/raw/main/assets\" + bash <(curl -fsSL \"\$ASSETS_BASE_URL/setup.sh\") agents" + fi +} + +# ── Fetch / Download ──────────────────────────────────────────────── +# Read a file from the local clone or download it from the remote URL. +fetch() { + local path="$1" + if [[ "$MODE" == "local" ]]; then + cat "$ASSETS_DIR/$path" + else + curl -fsSL "$ASSETS_BASE_URL/$path" + fi +} + +# Download a file to a destination path. +download_to() { + local src="$1" dest="$2" + mkdir -p "$(dirname "$dest")" + if [[ "$MODE" == "local" ]]; then + cp "$ASSETS_DIR/$src" "$dest" + else + curl -fsSL "$ASSETS_BASE_URL/$src" -o "$dest" + fi +} + +# ── Commands ───────────────────────────────────────────────────────── + +# -- skills [platform] ------------------------------------------------ +cmd_skills() { + local platform="${1:-shared}" + local manifest="${platform}-skills.yaml" + + heading "Skills ($platform)" + + local yaml + yaml="$(fetch "$manifest")" || fail "Could not fetch $manifest" + + local installs + installs=$(echo "$yaml" | sed -n 's/^[[:space:]]*install:[[:space:]]*//p' | sed 's/^"//;s/"$//') + + if [[ -z "$installs" ]]; then + warn "No install entries in $manifest — nothing to do." + return 0 + fi + + local count=0 + while IFS= read -r entry; do + [[ -z "$entry" ]] && continue + read -r -a args <<< "$entry" + info "npx skills add ${args[*]}" + npx skills add "${args[@]}" + count=$((count + 1)) + done <<< "$installs" + + ok "$count skill(s) installed. Restart your editor if they don't appear." +} + +# -- agents ------------------------------------------------------------ +cmd_agents() { + heading "Agents → $AGENTS_DIR" + + local list + list="$(fetch "agents.list")" || fail "Could not fetch agents.list" + + mkdir -p "$AGENTS_DIR" + + local count=0 + while IFS= read -r file; do + [[ -z "$file" || "$file" == \#* ]] && continue + info "$file" + download_to "agents/$file" "$AGENTS_DIR/$file" + count=$((count + 1)) + done <<< "$list" + + ok "$count agent(s) installed." +} + +# -- instructions ------------------------------------------------------ +cmd_instructions() { + heading "Instructions → $INSTRUCTIONS_DIR" + + local list + list="$(fetch "instructions.list")" || fail "Could not fetch instructions.list" + + mkdir -p "$INSTRUCTIONS_DIR" + + local count=0 + while IFS= read -r file; do + [[ -z "$file" || "$file" == \#* ]] && continue + info "$file" + download_to "instructions/$file" "$INSTRUCTIONS_DIR/$file" + count=$((count + 1)) + done <<< "$list" + + ok "$count instruction(s) installed." +} + +# -- all [platform] ---------------------------------------------------- +cmd_all() { + local platform="${1:-shared}" + cmd_skills "$platform" + cmd_agents + cmd_instructions + printf "\n" + ok "All done." +} + +# -- update-lists (local only) ----------------------------------------- +# Regenerate agents.list and instructions.list from directory contents. +cmd_update_lists() { + if [[ "$MODE" != "local" ]]; then + fail "update-lists only works from a cloned repo." + fi + + heading "Updating manifests" + + # agents.list + local agents_dir="$ASSETS_DIR/agents" + if [[ -d "$agents_dir" ]]; then + find "$agents_dir" -maxdepth 1 -type f -name '*.agent.md' \ + | xargs -I{} basename {} \ + | sort > "$ASSETS_DIR/agents.list" + ok "agents.list → $(wc -l < "$ASSETS_DIR/agents.list" | tr -d ' ') file(s)" + else + warn "No agents/ directory found — skipping." + fi + + # instructions.list + local instr_dir="$ASSETS_DIR/instructions" + if [[ -d "$instr_dir" ]]; then + find "$instr_dir" -maxdepth 1 -type f -name '*.instructions.md' \ + | xargs -I{} basename {} \ + | sort > "$ASSETS_DIR/instructions.list" + ok "instructions.list → $(wc -l < "$ASSETS_DIR/instructions.list" | tr -d ' ') file(s)" + else + warn "No instructions/ directory found — skipping." + fi +} + +# -- help -------------------------------------------------------------- +cmd_help() { + cat < [platform] + +${BOLD}COMMANDS${NC} + skills [platform] Install skills from a curated list + agents Install all agent prompt files + instructions Install all instruction files + all [platform] Install everything at once + update-lists Regenerate agents.list / instructions.list (local only) + help Show this message + +${BOLD}PLATFORMS${NC} (for skills) + ios iOS-specific skills + android Android-specific skills + shared Cross-platform skills (default) + +${BOLD}EXAMPLES${NC} + ${GREEN}# Cloned repo${NC} + ./assets/setup.sh skills ios + ./assets/setup.sh agents + ./assets/setup.sh all ios + + ${GREEN}# No clone — run directly from the remote repo${NC} + export ASSETS_BASE_URL="https://gitlab.com/org/repo/-/raw/main/assets" + bash <(curl -fsSL "\$ASSETS_BASE_URL/setup.sh") skills ios + bash <(curl -fsSL "\$ASSETS_BASE_URL/setup.sh") agents + bash <(curl -fsSL "\$ASSETS_BASE_URL/setup.sh") all ios + +${BOLD}ENVIRONMENT VARIABLES${NC} + ASSETS_BASE_URL Base URL for remote downloads (required without clone) + AGENTS_DIR Install location for agents (default: ~/.copilot/agents) + INSTRUCTIONS_DIR Install location for instructions (default: ./instructions) + SKILLS_FILE Override the skills YAML path (local mode only) + +EOF +} + +# ── Main ───────────────────────────────────────────────────────────── +detect_mode + +case "${1:-help}" in + skills) cmd_skills "${2:-shared}" ;; + agents) cmd_agents ;; + instructions) cmd_instructions ;; + all) cmd_all "${2:-shared}" ;; + update-lists) cmd_update_lists ;; + help|--help|-h) cmd_help ;; + *) fail "Unknown command: $1. Run 'setup.sh help' for usage." ;; +esac diff --git a/assets/sync-skills.sh b/assets/sync-skills.sh deleted file mode 100644 index 565d8da..0000000 --- a/assets/sync-skills.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -MANIFEST_DEFAULT="$ROOT_DIR/assets/shared-skills.yaml" -MANIFEST="${SKILLS_FILE:-$MANIFEST_DEFAULT}" - -if [[ ! -f "$MANIFEST" ]]; then - echo "Missing skills manifest: $MANIFEST" >&2 - exit 1 -fi - -INSTALLS=$(sed -n 's/^[[:space:]]*install:[[:space:]]*//p' "$MANIFEST" | sed 's/^"//;s/"$//') - -if [[ -z "$INSTALLS" ]]; then - echo "No install entries found in: $MANIFEST" >&2 - exit 1 -fi - -while IFS= read -r INSTALL; do - [[ -z "$INSTALL" ]] && continue - read -r -a ARGS <<< "$INSTALL" - npx skills add "${ARGS[@]}" -done <<< "$INSTALLS" - -echo "Done. Restart your editor if skills do not appear." diff --git a/docs/ai/images/skills-find.png b/docs/ai/images/skills-find.png new file mode 100644 index 0000000000000000000000000000000000000000..ad226fafe67219ea629069a7bb0127360e8855aa GIT binary patch literal 43988 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:org/ai-assets.git -mkdir -p ~/.agents/agents -cp -R ai-assets/agents/* ~/.agents/agents/ +./assets/setup.sh skills ios ``` -If your team provides a sync script, use that instead of manual copy. +Or remotely without cloning: +```bash +bash <(curl -fsSL "$ASSETS_BASE_URL/setup.sh") skills ios +``` + +## How to Download Agents +Run the setup script: +```bash +./assets/setup.sh agents +``` + +Or remotely without cloning: +```bash +bash <(curl -fsSL "$ASSETS_BASE_URL/setup.sh") agents +``` + +Agents are installed to `~/.copilot/agents/` by default. Override with the `AGENTS_DIR` environment variable. ## How to Enable or Configure Skills - Follow the instructions provided in each skill's README or SKILL file.