From 6fa5915dfd12345bd94dd49666c61f497fd12bfe Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 29 May 2026 13:44:39 +0000 Subject: [PATCH 1/4] feat(cli-bundle): add OpenViking CLI (ov) Adds OpenViking (@openviking/cli, `ov`) as a sixth coexisting CLI in the cli-bundle profile, following the npm-install pattern used by Codex. - New 05c-openviking.sh: npm global install, INSTALL_OPENVIKING toggle, prints `ov config` setup hint (server defaults to http://localhost:1933) - Wire into cli-bundle/install.sh after 05b-opencode - Add INSTALL_OPENVIKING=false toggle + auth note to .env.example - Document in README (profile table, CLI toggle table, repo layout) Upstream: https://github.com/volcengine/OpenViking --- README.md | 13 +++++----- profiles/cli-bundle/.env.example | 5 ++++ profiles/cli-bundle/05c-openviking.sh | 36 +++++++++++++++++++++++++++ profiles/cli-bundle/install.sh | 5 ++-- 4 files changed, 51 insertions(+), 8 deletions(-) create mode 100755 profiles/cli-bundle/05c-openviking.sh diff --git a/README.md b/README.md index 48d28c5..9046c6b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ fully configured, in a single command: | Profile | What you get | |--------------|-------------------------------------------------------------------------------------------------------| -| `cli-bundle` | Claude Code + OpenAI Codex + Google Antigravity + Cursor + **OpenCode** CLIs (any combination) | +| `cli-bundle` | Claude Code + OpenAI Codex + Google Antigravity + Cursor + **OpenCode** + **OpenViking** CLIs (any combination) | | `openclaw` | [OpenClaw](https://github.com/openclaw/openclaw) — local agent gateway on port `18789` | | `hermes` | [Hermes Agent](https://github.com/NousResearch/hermes-agent) (Nous Research, Python+uv) | | `paperclip` | [Paperclip](https://github.com/paperclipai/paperclip) — Node API + embedded Postgres :3100 | @@ -54,7 +54,7 @@ harness/ │ # install_gstack_for, print_manual_install_hint └── profiles/ ├── cli-bundle/ # 01-system → 02-claude → 03-codex → 04-antigravity - │ # → 05-cursor → 05b-opencode → 08-obsidian + │ # → 05-cursor → 05b-opencode → 05c-openviking → 08-obsidian │ # → 06-mcp → 07-dream → 09-plugins ├── openclaw/ # 01-system → 02-openclaw ├── hermes/ # 01-system → 02-hermes @@ -121,9 +121,9 @@ Why: these stacks compete for PATH entries, ports, systemd unit names, and memory on small VPSes. Coexistence isn't supported. If you *really* know better, `--force` bypasses the check. -The `cli-bundle` profile is the exception: it intentionally stacks **five** -thin CLI clients (Claude, Codex, Antigravity, Cursor, OpenCode) which have -disjoint config dirs and no port binds. +The `cli-bundle` profile is the exception: it intentionally stacks **six** +thin CLI clients (Claude, Codex, Antigravity, Cursor, OpenCode, OpenViking) +which have disjoint config dirs and no port binds. ## Pre-requisites @@ -140,7 +140,7 @@ disjoint config dirs and no port binds. ### `cli-bundle` -Five CLIs — toggle each in `.env`. Defaults: Claude `true`, others `false`. +Six CLIs — toggle each in `.env`. Defaults: Claude `true`, others `false`. | Toggle | CLI | Install path | |------------------------|----------------------|-------------------------------------------------------| @@ -149,6 +149,7 @@ Five CLIs — toggle each in `.env`. Defaults: Claude `true`, others `false`. | `INSTALL_ANTIGRAVITY` | Google Antigravity | upstream installer (`curl … \| bash`) | | `INSTALL_CURSOR` | Cursor agent | upstream installer (`curl … \| bash`) | | `INSTALL_OPENCODE` | OpenCode | upstream installer (`curl -fsSL https://opencode.ai/install \| bash`) | +| `INSTALL_OPENVIKING` | OpenViking (`ov`) | `npm i -g @openviking/cli` | Plus: diff --git a/profiles/cli-bundle/.env.example b/profiles/cli-bundle/.env.example index bcac35c..5e42c8a 100644 --- a/profiles/cli-bundle/.env.example +++ b/profiles/cli-bundle/.env.example @@ -9,6 +9,7 @@ INSTALL_CODEX=false INSTALL_ANTIGRAVITY=false INSTALL_CURSOR=false INSTALL_OPENCODE=false +INSTALL_OPENVIKING=false # --- Claude Code Auth --- # Optional. Leave empty to use OAuth via `claude login`. console.anthropic.com @@ -24,6 +25,10 @@ OPENAI_API_KEY= # --- Cursor CLI --- # Auth via `cursor-agent login`. No key needed here. +# --- OpenViking CLI (`ov`) --- +# No CLI auth needed. Configure your server with `ov config` (interactive). +# Defaults to http://localhost:1933. https://github.com/volcengine/OpenViking + # --- Context7 (Upstash) --- # Optional. Free without key, higher rate limit with key from context7.com CONTEXT7_API_KEY= diff --git a/profiles/cli-bundle/05c-openviking.sh b/profiles/cli-bundle/05c-openviking.sh new file mode 100755 index 0000000..16899e8 --- /dev/null +++ b/profiles/cli-bundle/05c-openviking.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# ============================================================ +# 05c-openviking.sh — Installs OpenViking CLI (`ov`). +# Package: @openviking/cli (npm). Connects to an OpenViking +# server (default http://localhost:1933). +# Upstream: https://github.com/volcengine/OpenViking +# Setup: `ov config` (interactive) to point at your server. +# ============================================================ +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ENV_FILE="$SCRIPT_DIR/.env" + +if [[ ! -f "$ENV_FILE" ]]; then + echo "ERROR: $ENV_FILE not found." + exit 1 +fi + +# shellcheck disable=SC1090 +set -a; source "$ENV_FILE"; set +a + +if [[ "${INSTALL_OPENVIKING:-false}" != "true" ]]; then + echo "==> OpenViking install disabled (INSTALL_OPENVIKING != true). Skipping." + exit 0 +fi + +export PATH="$HOME/.npm-global/bin:$PATH" + +echo "==> Installing @openviking/cli" +npm install -g @openviking/cli + +ov --version 2>/dev/null || ov status 2>/dev/null || true + +echo "==> OpenViking CLI installed." +echo " Configure your server with: ov config" +echo " (defaults to http://localhost:1933; override via OPENVIKING_CLI_CONFIG_FILE)" diff --git a/profiles/cli-bundle/install.sh b/profiles/cli-bundle/install.sh index cd646ad..e7fb74b 100755 --- a/profiles/cli-bundle/install.sh +++ b/profiles/cli-bundle/install.sh @@ -1,8 +1,8 @@ #!/usr/bin/env bash # ============================================================ # cli-bundle/install.sh -# Installs Claude Code + Codex + Antigravity + Cursor CLIs. -# All four coexist on one host. Toggle individually in .env. +# Installs Claude Code + Codex + Antigravity + Cursor + OpenCode + OpenViking CLIs. +# All coexist on one host. Toggle individually in .env. # ============================================================ set -euo pipefail @@ -29,6 +29,7 @@ bash "$SCRIPT_DIR/03-codex.sh" bash "$SCRIPT_DIR/04-antigravity.sh" bash "$SCRIPT_DIR/05-cursor.sh" bash "$SCRIPT_DIR/05b-opencode.sh" +bash "$SCRIPT_DIR/05c-openviking.sh" bash "$SCRIPT_DIR/08-obsidian.sh" # vault skeleton first; MCP step below registers it bash "$SCRIPT_DIR/06-mcp.sh" bash "$SCRIPT_DIR/07-dream.sh" From cec961395d411de01b3f4e5c8e7038ce79659b14 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 29 May 2026 14:08:53 +0000 Subject: [PATCH 2/4] feat(cli-bundle): remove GSD and gstack plugins Drops the GSD (Get Shit Done) and gstack plugins from the cli-bundle plugin step. superpowers and OpenSpec remain, along with the official Anthropic marketplace plugins. - 09-plugins.sh: remove GSD and gstack install blocks; drop now-unused base-packages.sh source and ~/.bun/bin from PATH - lib/plugins.sh: remove install_gstack_for(); tidy install_claude_plugin doc comment - lib/base-packages.sh: remove install_bun() (only gstack consumed it) - .env.example: drop INSTALL_GSD, INSTALL_GSTACK, GSTACK_TARGETS toggles - README.md / cli-bundle/README.md: update plugin tables and lib helper lists - .claude/TODO.md: drop GSD/gstack follow-ups --- .claude/TODO.md | 2 -- README.md | 8 +++---- lib/base-packages.sh | 19 --------------- lib/plugins.sh | 32 ++----------------------- profiles/cli-bundle/.env.example | 10 -------- profiles/cli-bundle/09-plugins.sh | 40 ++----------------------------- profiles/cli-bundle/README.md | 10 +------- 7 files changed, 8 insertions(+), 113 deletions(-) diff --git a/.claude/TODO.md b/.claude/TODO.md index 0f03bcd..29654f0 100644 --- a/.claude/TODO.md +++ b/.claude/TODO.md @@ -33,8 +33,6 @@ ## Plugins (v0.5.0+) - [ ] **Antigravity + superpowers**: confirm whether `antigravity extensions install ` is a real command. Replace manual hint with headless install if confirmed. -- [ ] gstack `./setup` — confirm non-interactive behaviour on fresh box (`--yes`-style flag?). Currently we assume it runs cleanly without prompts. -- [ ] GSD: legacy npm package conflict check (`get-shit-done-cc`, `get-shit-done-redux`) — auto-uninstall in 09-plugins.sh if found. - [ ] Superpowers OpenCode install is "fetch instructions" — investigate whether OpenCode has a headless prompt API to drive it programmatically. - [ ] Plugin verification: after install, run a sanity check (e.g. `claude -p "/plugin list"` and grep for the installed names). diff --git a/README.md b/README.md index 9046c6b..ec7d0dc 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Plus, on every profile: `cli-bundle` additionally bundles: - **MCP servers** for Claude (Context7, Linear, Slack, GitHub, Supabase, Sentry, Notion, Playwright, Filesystem, Obsidian) -- **Plugins** — GSD, gstack, superpowers, OpenSpec, plus the official Anthropic marketplace (Linear/Slack/GitHub/Notion/Atlassian/Asana/Figma/Sentry/Supabase/Vercel) +- **Plugins** — superpowers, OpenSpec, plus the official Anthropic marketplace (Linear/Slack/GitHub/Notion/Atlassian/Asana/Figma/Sentry/Supabase/Vercel) - **Obsidian vault** — shared workspace at `$OBSIDIAN_VAULT_DIR`, all CLIs read/write, optional git auto-sync - **Dream mode** — cron-driven memory consolidation for Claude @@ -47,11 +47,11 @@ harness/ │ ├── common.sh # mutex_check, mutex_set, load_env, banner │ ├── base-packages.sh # install_base_packages, install_db_clients, │ │ # install_headless_browser, install_node, -│ │ # install_pnpm, install_bun, install_uv +│ │ # install_pnpm, install_uv │ ├── obsidian.sh # setup_vault, sync_vault_now/install/uninstall │ └── plugins.sh # claude_headless, install_official_claude_plugin, │ # install_claude_plugin, install_openspec, -│ # install_gstack_for, print_manual_install_hint +│ # print_manual_install_hint └── profiles/ ├── cli-bundle/ # 01-system → 02-claude → 03-codex → 04-antigravity │ # → 05-cursor → 05b-opencode → 05c-openviking → 08-obsidian @@ -184,8 +184,6 @@ supports it; printed manual hint otherwise. | Plugin | Claude | Codex | Antigravity | Cursor | OpenCode | |------------------|----------|-------------------|----------------------------|----------------------|----------------------| -| GSD | headless | — | — | — | — | -| gstack | headless | — | — | — | headless | | superpowers | headless | manual `/plugins` | manual (not documented) | manual `/add-plugin` | manual fetch URL | | **OpenSpec** | universal (npm global, `/opsx:*` slash commands from any CLI) — invoked via `openspec init` per project | diff --git a/lib/base-packages.sh b/lib/base-packages.sh index cf7fb12..ce6b275 100644 --- a/lib/base-packages.sh +++ b/lib/base-packages.sh @@ -110,25 +110,6 @@ install_pnpm() { pnpm -v } -# Install Bun (JS runtime; required by gstack plugin). -install_bun() { - if command -v bun >/dev/null 2>&1; then - echo "==> bun $(bun --version) already installed" - return 0 - fi - echo "==> Installing bun (bun.sh)" - curl -fsSL https://bun.sh/install | bash - export PATH="$HOME/.bun/bin:$PATH" - if ! grep -q 'BUN_INSTALL' "$HOME/.bashrc" 2>/dev/null; then - cat >> "$HOME/.bashrc" <<'EOF' - -# Bun -export BUN_INSTALL="$HOME/.bun" -case ":$PATH:" in *":$BUN_INSTALL/bin:"*) ;; *) export PATH="$BUN_INSTALL/bin:$PATH";; esac -EOF - fi -} - # Install uv (Python package manager used by Hermes). install_uv() { if command -v uv >/dev/null 2>&1; then diff --git a/lib/plugins.sh b/lib/plugins.sh index a13cc06..6f19855 100644 --- a/lib/plugins.sh +++ b/lib/plugins.sh @@ -30,8 +30,8 @@ install_official_claude_plugin() { } # Install a Claude Code plugin from a marketplace. -# $1 = marketplace spec (e.g. "jnuyens/gsd-plugin" or "obra/superpowers-marketplace") -# $2 = plugin spec (e.g. "gsd@gsd-plugin" or "superpowers@claude-plugins-official") +# $1 = marketplace spec (e.g. "obra/superpowers-marketplace") +# $2 = plugin spec (e.g. "superpowers@superpowers-marketplace") install_claude_plugin() { local marketplace="$1" local plugin="$2" @@ -56,34 +56,6 @@ install_openspec() { openspec --version 2>/dev/null || true } -# Install gstack into a target CLI's skills dir. -# $1 = host name (claude, opencode, etc.) -install_gstack_for() { - local host="$1" - local target_dir="$HOME/.${host}/skills/gstack" - echo "==> Installing gstack for $host → $target_dir" - - if [[ -d "$target_dir/.git" ]]; then - git -C "$target_dir" fetch --depth 1 origin - git -C "$target_dir" reset --hard origin/HEAD - else - git clone --single-branch --depth 1 \ - https://github.com/garrytan/gstack.git "$target_dir" - fi - - pushd "$target_dir" >/dev/null || return 1 - if [[ -x ./setup ]]; then - if [[ "$host" == "claude" ]]; then - ./setup - else - ./setup --host "$host" - fi - else - echo "WARN: gstack/setup not found or not executable" - fi - popd >/dev/null || return 1 -} - # Tell the operator exactly what to type into a non-headless CLI. print_manual_install_hint() { local cli="$1" diff --git a/profiles/cli-bundle/.env.example b/profiles/cli-bundle/.env.example index 5e42c8a..bc1865d 100644 --- a/profiles/cli-bundle/.env.example +++ b/profiles/cli-bundle/.env.example @@ -107,19 +107,9 @@ OBSIDIAN_AUTOSYNC_SCHEDULE=*/15 * * * * # ============================================================ # Plugins (09-plugins.sh) # Coverage: -# GSD → Claude only -# gstack → any host listed in GSTACK_TARGETS (Claude + OpenCode supported) # superpowers → per-CLI toggles below # ============================================================ -# Get Shit Done (Claude-only plugin marketplace) -INSTALL_GSD=false - -# gstack — virtual engineering team (slash commands + skills) -INSTALL_GSTACK=false -# Space-separated list. Valid: claude opencode -GSTACK_TARGETS=claude - # OpenSpec — spec-driven development. Universal (works in any AI CLI via # /opsx:* slash commands once invoked from a project that ran `openspec init`). # Upstream: https://github.com/Fission-AI/OpenSpec diff --git a/profiles/cli-bundle/09-plugins.sh b/profiles/cli-bundle/09-plugins.sh index d7c2936..487f50d 100644 --- a/profiles/cli-bundle/09-plugins.sh +++ b/profiles/cli-bundle/09-plugins.sh @@ -1,10 +1,8 @@ #!/usr/bin/env bash # ============================================================ -# 09-plugins.sh — install GSD, gstack, superpowers across the CLIs. +# 09-plugins.sh — install superpowers + OpenSpec + official plugins. # # Coverage matrix: -# GSD → Claude only -# gstack → Claude, OpenCode (and any host listed in GSTACK_TARGETS) # superpowers → Claude (headless), Codex/Cursor/OpenCode (manual hints), # Antigravity (option (b) per RECOMMENDATIONS: no attempt, # just print hint with the warning that it is not officially @@ -26,42 +24,8 @@ set -a; source "$ENV_FILE"; set +a # shellcheck source=../../lib/plugins.sh source "$REPO_ROOT/lib/plugins.sh" -# shellcheck source=../../lib/base-packages.sh -source "$REPO_ROOT/lib/base-packages.sh" -export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$HOME/.opencode/bin:$HOME/.bun/bin:$PATH" - -# --- GSD (Claude only) ---------------------------------------------------- -if [[ "${INSTALL_GSD:-false}" == "true" ]]; then - if [[ "${INSTALL_CLAUDE:-true}" != "true" ]]; then - echo "WARN: INSTALL_GSD=true but Claude not installed — skipping." - else - install_claude_plugin "jnuyens/gsd-plugin" "gsd@gsd-plugin" - fi -fi - -# --- gstack (Claude + any host in GSTACK_TARGETS) ------------------------- -if [[ "${INSTALL_GSTACK:-false}" == "true" ]]; then - install_bun - TARGETS="${GSTACK_TARGETS:-claude}" - for host in $TARGETS; do - case "$host" in - claude) - if [[ "${INSTALL_CLAUDE:-true}" != "true" ]]; then - echo "WARN: gstack target 'claude' requested but INSTALL_CLAUDE != true. Skipping." - continue - fi - ;; - opencode) - if [[ "${INSTALL_OPENCODE:-false}" != "true" ]]; then - echo "WARN: gstack target 'opencode' requested but INSTALL_OPENCODE != true. Skipping." - continue - fi - ;; - esac - install_gstack_for "$host" - done -fi +export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$HOME/.opencode/bin:$PATH" # --- superpowers (multi-CLI) ---------------------------------------------- if [[ "${INSTALL_SUPERPOWERS:-false}" == "true" ]]; then diff --git a/profiles/cli-bundle/README.md b/profiles/cli-bundle/README.md index 5a768b0..95e0005 100644 --- a/profiles/cli-bundle/README.md +++ b/profiles/cli-bundle/README.md @@ -166,22 +166,17 @@ crontab -l | grep -v obsidian-vault-sync | crontab - rm ~/.local/bin/obsidian-vault-sync ``` -## Plugins (GSD, gstack, superpowers) +## Plugins (superpowers, OpenSpec) Opt-in plugin install handled by `09-plugins.sh`. Headless onde possível; hint manual onde não. | Plugin | Claude | Codex | Antigravity | Cursor | OpenCode | |--------------|-------------------|-------------------|-----------------------------|-------------------|-------------------| -| GSD | headless | — | — | — | — | -| gstack | headless (`./setup`) | — | — | — | headless (`./setup --host opencode`) | | superpowers | headless | manual `/plugins` | manual (não documentado) | manual `/add-plugin` | manual fetch URL | Toggles no `.env`: ```env -INSTALL_GSD=true # Claude only -INSTALL_GSTACK=true -GSTACK_TARGETS="claude opencode" # ou só "claude" INSTALL_SUPERPOWERS=true SUPERPOWERS_CLAUDE=true SUPERPOWERS_CODEX=true @@ -195,9 +190,6 @@ Rodar isolado: bash 09-plugins.sh ``` -**Bun**: gstack precisa de Bun. `09-plugins.sh` instala via `install_bun()` se -`INSTALL_GSTACK=true`. - **Antigravity superpowers**: docs upstream não cobrem. Toggle imprime hint manual com palpite (padrão Gemini CLI). Sem tentativa automática. From 6feb1de7c79e9979da5a684a70bd4f95b699a319 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 29 May 2026 14:54:56 +0000 Subject: [PATCH 3/4] feat(cli-bundle): add Tech Leads Club agent-skills registry Wires the @tech-leads-club/agent-skills CLI into the plugins step as an opt-in, non-interactive install across the CLIs that support it (claude-code, codex, cursor, opencode). Skills install globally so every project sees them. Ships a curated default skill set tuned for the MiranteGov / Municipium stack (Next.js + React Native, NestJS + Nx monorepo, GovTech accessibility + security): 29 skills spanning a11y, security review/threat-model, NestJS modular monolith + tactical DDD, Nx tooling, React/frontend quality, perf, Sentry, and ADR/RFC/TDD docs. - lib/plugins.sh: install_agent_skills() helper (npx, --global, repeated --skill/--agent flags) - 09-plugins.sh: INSTALL_AGENT_SKILLS block; resolves target agents to the intersection of installed CLIs and AGENT_SKILLS_AGENTS; baked-in curated default for AGENT_SKILLS_LIST - .env.example: INSTALL_AGENT_SKILLS, AGENT_SKILLS_AGENTS, AGENT_SKILLS_LIST - README.md / cli-bundle/README.md: document the registry and curated set All 29 curated skill names validated against the upstream catalog. --- README.md | 11 ++++++++++ lib/plugins.sh | 26 +++++++++++++++++++++++ profiles/cli-bundle/.env.example | 15 +++++++++++++ profiles/cli-bundle/09-plugins.sh | 35 +++++++++++++++++++++++++++++++ profiles/cli-bundle/README.md | 33 +++++++++++++++++++++++++++++ 5 files changed, 120 insertions(+) diff --git a/README.md b/README.md index ec7d0dc..1dec3af 100644 --- a/README.md +++ b/README.md @@ -186,6 +186,17 @@ supports it; printed manual hint otherwise. |------------------|----------|-------------------|----------------------------|----------------------|----------------------| | superpowers | headless | manual `/plugins` | manual (not documented) | manual `/add-plugin` | manual fetch URL | | **OpenSpec** | universal (npm global, `/opsx:*` slash commands from any CLI) — invoked via `openspec init` per project | +| **agent-skills** | non-interactive CLI install across claude-code / codex / cursor / opencode — curated, security-validated skill registry | + +### agent-skills (Tech Leads Club) + +[agent-skills](https://github.com/tech-leads-club/agent-skills) is a curated, +security-validated skill registry. `INSTALL_AGENT_SKILLS=true` installs a +default set tuned for web/mobile product work (Next.js + React Native, NestJS + +Nx monorepo, accessibility + security) globally to every installed CLI that +supports it. Override the skill list with `AGENT_SKILLS_LIST` and the target +CLIs with `AGENT_SKILLS_AGENTS` in `.env`. Browse the catalog with +`npx @tech-leads-club/agent-skills list`. Plus the **official Anthropic marketplace** (Claude-only, bundles pre-configured MCP + skills + slash commands): diff --git a/lib/plugins.sh b/lib/plugins.sh index 6f19855..99b680d 100644 --- a/lib/plugins.sh +++ b/lib/plugins.sh @@ -56,6 +56,32 @@ install_openspec() { openspec --version 2>/dev/null || true } +# Install Tech Leads Club agent-skills — a curated, security-validated skill +# registry. Runs the CLI non-interactively (`install --skill … --agent …`). +# $1 = space-separated skill names, $2 = space-separated agent identifiers. +# Skills are installed globally (user home) so every project sees them. +# Upstream: https://github.com/tech-leads-club/agent-skills +install_agent_skills() { + local skills="$1" + local agents="$2" + if ! command -v npx >/dev/null 2>&1; then + echo "ERROR: npx not on PATH — agent-skills requires Node.js >= 22." + return 1 + fi + if [[ -z "$skills" || -z "$agents" ]]; then + echo "WARN: no skills or agents resolved — skipping agent-skills." + return 0 + fi + echo "==> Installing agent-skills (global) → agents: $agents" + echo " skills: $skills" + # Intentional word-splitting: each name becomes a separate --skill/--agent arg. + # shellcheck disable=SC2086 + npx --yes @tech-leads-club/agent-skills install \ + --global \ + --skill $skills \ + --agent $agents +} + # Tell the operator exactly what to type into a non-headless CLI. print_manual_install_hint() { local cli="$1" diff --git a/profiles/cli-bundle/.env.example b/profiles/cli-bundle/.env.example index bc1865d..534bb01 100644 --- a/profiles/cli-bundle/.env.example +++ b/profiles/cli-bundle/.env.example @@ -118,6 +118,21 @@ OPENSPEC_VERSION=latest # Telemetry off (industry standard). Set to 1 to opt in. OPENSPEC_TELEMETRY=0 +# --- agent-skills (Tech Leads Club curated, security-validated registry) --- +# Installs skills across the AI CLIs that support them (claude-code, codex, +# cursor, opencode). Skills are installed globally (user home), so every +# project sees them. Upstream: https://github.com/tech-leads-club/agent-skills +INSTALL_AGENT_SKILLS=false +# Which installed CLIs to target (space-separated subset of: +# claude-code codex cursor opencode). Only those actually installed are used. +AGENT_SKILLS_AGENTS=claude-code codex cursor opencode +# Skills to install. Leave empty to use the curated default set baked into +# 09-plugins.sh (tuned for the MiranteGov/Municipium stack: Next.js + +# React Native, NestJS + Nx monorepo, GovTech accessibility + security). +# Set a space-separated list to override. Run `npx @tech-leads-club/agent-skills list` +# to browse the full catalog. +AGENT_SKILLS_LIST= + # --- Official Anthropic marketplace plugins (Claude-only) --- # Bundle pre-configured MCP + skills + slash commands. Richer than the raw # MCP registrations in 06-mcp.sh — either can be used (or both). diff --git a/profiles/cli-bundle/09-plugins.sh b/profiles/cli-bundle/09-plugins.sh index 487f50d..f6d2753 100644 --- a/profiles/cli-bundle/09-plugins.sh +++ b/profiles/cli-bundle/09-plugins.sh @@ -71,6 +71,41 @@ EOF fi fi +# --- agent-skills (Tech Leads Club curated registry) ---------------------- +# Security-validated skills installed across the AI CLIs that support them. +# Default skill set is curated for the MiranteGov / Municipium stack +# (Next.js + React Native, NestJS + Nx monorepo, GovTech a11y + security). +# Override AGENT_SKILLS_LIST / AGENT_SKILLS_AGENTS in .env to customize. +if [[ "${INSTALL_AGENT_SKILLS:-false}" == "true" ]]; then + # Curated default set (GovTech web/mobile stack). Override in .env. + AGENT_SKILLS_DEFAULT="accessibility web-quality-audit react-best-practices \ +security-best-practices security-threat-model security-ownership-map \ +nestjs-modular-monolith react-native-expert gh-address-comments docs-writer \ +tactical-ddd modular-design-principles domain-analysis coupling-analysis \ +react-composition-patterns frontend-blueprint nx-workspace nx-generate \ +nx-run-tasks nx-ci-monitor gh-fix-ci mermaid-studio frontend-design \ +core-web-vitals perf-web-optimization sentry create-adr create-rfc \ +technical-design-doc-creator" + AGENT_SKILLS_LIST="${AGENT_SKILLS_LIST:-$AGENT_SKILLS_DEFAULT}" + # Only target agents that are actually installed. + resolved_agents="" + for pair in "claude-code:${INSTALL_CLAUDE:-true}" \ + "codex:${INSTALL_CODEX:-false}" \ + "cursor:${INSTALL_CURSOR:-false}" \ + "opencode:${INSTALL_OPENCODE:-false}"; do + agent="${pair%%:*}"; enabled="${pair##*:}" + requested=" ${AGENT_SKILLS_AGENTS:-claude-code codex cursor opencode} " + if [[ "$enabled" == "true" && "$requested" == *" $agent "* ]]; then + resolved_agents="${resolved_agents:+$resolved_agents }$agent" + fi + done + if [[ -z "$resolved_agents" ]]; then + echo "WARN: INSTALL_AGENT_SKILLS=true but no matching CLI is installed — skipping." + else + install_agent_skills "$AGENT_SKILLS_LIST" "$resolved_agents" + fi +fi + # --- Official Anthropic marketplace plugins (Claude-only) ----------------- # These bundle pre-configured MCP servers + skills + slash commands. # Richer than the raw MCP registrations in 06-mcp.sh; either can be used. diff --git a/profiles/cli-bundle/README.md b/profiles/cli-bundle/README.md index 95e0005..afb45e5 100644 --- a/profiles/cli-bundle/README.md +++ b/profiles/cli-bundle/README.md @@ -219,6 +219,39 @@ openspec init # /opsx:plan ``` +### agent-skills (Tech Leads Club — registry curado) + +[agent-skills](https://github.com/tech-leads-club/agent-skills) é um registry +de skills validadas por segurança, instaladas via CLI npm não-interativo +(`agent-skills install --skill … --agent …`). Com `INSTALL_AGENT_SKILLS=true`, +o `09-plugins.sh` instala globalmente (no `$HOME`) um conjunto curado para o +stack dos produtos (Next.js + React Native, NestJS + Nx monorepo, e foco +GovTech em acessibilidade + segurança) em todos os CLIs instalados que o +suportam — `claude-code`, `codex`, `cursor`, `opencode`. Apenas os CLIs de +fato instalados são alvo. + +```env +INSTALL_AGENT_SKILLS=true +AGENT_SKILLS_AGENTS=claude-code codex cursor opencode # subconjunto +AGENT_SKILLS_LIST= # vazio = set curado +``` + +Conjunto curado padrão (29 skills): accessibility, web-quality-audit, +react-best-practices, security-best-practices, security-threat-model, +security-ownership-map, nestjs-modular-monolith, react-native-expert, +gh-address-comments, docs-writer, tactical-ddd, modular-design-principles, +domain-analysis, coupling-analysis, react-composition-patterns, +frontend-blueprint, nx-workspace, nx-generate, nx-run-tasks, nx-ci-monitor, +gh-fix-ci, mermaid-studio, frontend-design, core-web-vitals, +perf-web-optimization, sentry, create-adr, create-rfc, +technical-design-doc-creator. + +Para customizar, defina `AGENT_SKILLS_LIST` com uma lista separada por +espaços. Veja o catálogo completo com: +```bash +npx @tech-leads-club/agent-skills list +``` + ### Plugins oficiais da Anthropic (Claude only) Toggles separados pra cada plugin do marketplace `claude-plugins-official`: From aa34ad68bb6d86eaa32a5362ee8d417af7b7b68c Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 29 May 2026 20:17:04 +0000 Subject: [PATCH 4/4] docs(todo): add Hindsight agent-memory project to radar Tracks vectorize-io/hindsight for later evaluation as an alternative/ complement memory backend (same category as OpenViking) for the cli-bundle agents. Notes install paths (Docker/pip/npm + embedded) and upstream link. --- .claude/TODO.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.claude/TODO.md b/.claude/TODO.md index 29654f0..8307a54 100644 --- a/.claude/TODO.md +++ b/.claude/TODO.md @@ -2,6 +2,18 @@ > Changelog of structural decisions lives in [CHANGELOG.md](CHANGELOG.md). +## Radar (evaluate / test later — not yet committed to a profile) + +- [ ] **Hindsight** (vectorize-io) — agent memory system: agents that learn and + adapt over time (mental models, experience understanding), beyond plain + conversation-history recall. Python + TypeScript, MIT. + Install paths: Docker (`ghcr.io/vectorize-io/hindsight:latest`), + pip (`hindsight-client`), npm (`@vectorize-io/hindsight-client`); also + supports embedded Python use without a server. + Same category as OpenViking — evaluate as an alternative/complement memory + backend for the cli-bundle agents (esp. Claude Code / MiranteGov / + Municipium). Upstream: https://github.com/vectorize-io/hindsight + ## Blockers (must resolve before real-VPS install) - [x] **openclaw/02-openclaw.sh** — upstream is `npm i -g openclaw`. Replaced.