From 6fa5915dfd12345bd94dd49666c61f497fd12bfe Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 29 May 2026 13:44:39 +0000 Subject: [PATCH 1/5] 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/5] 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/5] 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/5] 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. From 6c0bc12dea85718fe65401057c57d0a126390a64 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 29 May 2026 20:23:47 +0000 Subject: [PATCH 5/5] feat(cli-bundle): prototype opt-in Hindsight agent-memory step MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds 05d-hindsight.sh modeled on the OpenViking step: opt-in via INSTALL_HINDSIGHT, sources .env, gates cleanly, and prints next-step hints. Installs the Hindsight client (npm by default, pip optional via pipx/pip --user) and can start the Dockerized server (API :8888, UI :9999) when HINDSIGHT_START_SERVER=true and Docker + an LLM key are present; otherwise prints the docker run command for manual start. - 05d-hindsight.sh: client install + optional Docker server - install.sh: wire step after 05c-openviking; header comment - .env.example: INSTALL_HINDSIGHT + HINDSIGHT_* config block - README.md / cli-bundle/README.md: document the prototype step Prototype only — not yet integrated into Claude Code as a memory backend; tracked for comparative testing against OpenViking. --- README.md | 9 ++- profiles/cli-bundle/.env.example | 12 ++++ profiles/cli-bundle/05d-hindsight.sh | 86 ++++++++++++++++++++++++++++ profiles/cli-bundle/README.md | 31 ++++++++++ profiles/cli-bundle/install.sh | 5 +- 5 files changed, 140 insertions(+), 3 deletions(-) create mode 100755 profiles/cli-bundle/05d-hindsight.sh diff --git a/README.md b/README.md index 1dec3af..7bc074a 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,8 @@ harness/ │ # print_manual_install_hint └── profiles/ ├── cli-bundle/ # 01-system → 02-claude → 03-codex → 04-antigravity - │ # → 05-cursor → 05b-opencode → 05c-openviking → 08-obsidian + │ # → 05-cursor → 05b-opencode → 05c-openviking + │ # → 05d-hindsight → 08-obsidian │ # → 06-mcp → 07-dream → 09-plugins ├── openclaw/ # 01-system → 02-openclaw ├── hermes/ # 01-system → 02-hermes @@ -159,6 +160,12 @@ Plus: - **Obsidian vault** (`08-obsidian.sh`) — shared workspace for every CLI. - **Dream mode** (`07-dream.sh`) — cron-driven `claude -p` invocation of `anthropic-skills:consolidate-memory` at `03:00`; log auto-rotates at 5 MiB. +- **Hindsight** (`05d-hindsight.sh`, _prototype, opt-in_) — agent-memory + client lib (`@vectorize-io/hindsight-client`) and an optional Dockerized + server (API `:8888`, UI `:9999`). Enable with `INSTALL_HINDSIGHT=true`; + start the server with `HINDSIGHT_START_SERVER=true` (needs Docker + an LLM + key). Tracked alongside OpenViking as an agent-memory backend to evaluate. + Upstream: Full docs: [profiles/cli-bundle/README.md](profiles/cli-bundle/README.md). diff --git a/profiles/cli-bundle/.env.example b/profiles/cli-bundle/.env.example index 534bb01..d6eda6e 100644 --- a/profiles/cli-bundle/.env.example +++ b/profiles/cli-bundle/.env.example @@ -10,6 +10,7 @@ INSTALL_ANTIGRAVITY=false INSTALL_CURSOR=false INSTALL_OPENCODE=false INSTALL_OPENVIKING=false +INSTALL_HINDSIGHT=false # --- Claude Code Auth --- # Optional. Leave empty to use OAuth via `claude login`. console.anthropic.com @@ -29,6 +30,17 @@ OPENAI_API_KEY= # No CLI auth needed. Configure your server with `ov config` (interactive). # Defaults to http://localhost:1933. https://github.com/volcengine/OpenViking +# --- Hindsight (agent-memory) — PROTOTYPE / opt-in --- +# Client libs + optional Docker server (API :8888, UI :9999). +# https://github.com/vectorize-io/hindsight +HINDSIGHT_NPM_CLIENT=true # install @vectorize-io/hindsight-client (npm) +HINDSIGHT_PIP_CLIENT=false # install hindsight-client (pipx/pip --user) +# Start the Dockerized server during install (needs Docker + an LLM key below). +HINDSIGHT_START_SERVER=false +# LLM provider: openai | anthropic | gemini | groq | ollama | lmstudio | minimax +HINDSIGHT_LLM_PROVIDER=openai +HINDSIGHT_LLM_API_KEY= + # --- Context7 (Upstash) --- # Optional. Free without key, higher rate limit with key from context7.com CONTEXT7_API_KEY= diff --git a/profiles/cli-bundle/05d-hindsight.sh b/profiles/cli-bundle/05d-hindsight.sh new file mode 100755 index 0000000..fbd9f88 --- /dev/null +++ b/profiles/cli-bundle/05d-hindsight.sh @@ -0,0 +1,86 @@ +#!/usr/bin/env bash +# ============================================================ +# 05d-hindsight.sh — Installs Hindsight agent-memory (client + optional server). +# Client: @vectorize-io/hindsight-client (npm) and/or hindsight-client (pip). +# Server: Docker image ghcr.io/vectorize-io/hindsight:latest +# API on :8888, UI on :9999. Needs an LLM provider + key. +# Upstream: https://github.com/vectorize-io/hindsight +# NOTE: prototype — opt-in via INSTALL_HINDSIGHT. Server start is gated again +# on HINDSIGHT_START_SERVER and the presence of Docker. +# ============================================================ +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_HINDSIGHT:-false}" != "true" ]]; then + echo "==> Hindsight install disabled (INSTALL_HINDSIGHT != true). Skipping." + exit 0 +fi + +export PATH="$HOME/.npm-global/bin:$HOME/.local/bin:$PATH" + +# --- Client libraries ----------------------------------------------------- +# Node/TS client (default on; matches the npm-first convention of this bundle). +if [[ "${HINDSIGHT_NPM_CLIENT:-true}" == "true" ]]; then + echo "==> Installing @vectorize-io/hindsight-client (npm)" + npm install -g @vectorize-io/hindsight-client +fi + +# Python client (opt-in). Uses pipx when available to avoid PEP 668 breakage. +if [[ "${HINDSIGHT_PIP_CLIENT:-false}" == "true" ]]; then + if command -v pipx >/dev/null 2>&1; then + echo "==> Installing hindsight-client (pipx)" + pipx install hindsight-client || pipx upgrade hindsight-client || true + elif command -v pip3 >/dev/null 2>&1; then + echo "==> Installing hindsight-client (pip3 --user)" + pip3 install --user -U hindsight-client + else + echo "WARN: neither pipx nor pip3 found — skipping Python client." + fi +fi + +# --- Server (Docker, opt-in) ---------------------------------------------- +if [[ "${HINDSIGHT_START_SERVER:-false}" == "true" ]]; then + if ! command -v docker >/dev/null 2>&1; then + echo "WARN: HINDSIGHT_START_SERVER=true but Docker is not installed." + echo " Install Docker, then run:" + echo " docker run --rm -d --pull always -p 8888:8888 -p 9999:9999 \\" + echo " -e HINDSIGHT_API_LLM_PROVIDER=${HINDSIGHT_LLM_PROVIDER:-openai} \\" + echo " -e HINDSIGHT_API_LLM_API_KEY= \\" + echo " -v \$HOME/.hindsight-docker:/home/hindsight/.pg0 \\" + echo " ghcr.io/vectorize-io/hindsight:latest" + elif [[ -z "${HINDSIGHT_LLM_API_KEY:-}" ]]; then + echo "WARN: HINDSIGHT_START_SERVER=true but HINDSIGHT_LLM_API_KEY is empty." + echo " Set it (and HINDSIGHT_LLM_PROVIDER) in .env, or start the server manually." + else + echo "==> Starting Hindsight server (Docker) — API :8888, UI :9999" + mkdir -p "$HOME/.hindsight-docker" + docker run --rm -d --pull always \ + --name hindsight \ + -p 8888:8888 -p 9999:9999 \ + -e "HINDSIGHT_API_LLM_PROVIDER=${HINDSIGHT_LLM_PROVIDER:-openai}" \ + -e "HINDSIGHT_API_LLM_API_KEY=${HINDSIGHT_LLM_API_KEY}" \ + -v "$HOME/.hindsight-docker:/home/hindsight/.pg0" \ + ghcr.io/vectorize-io/hindsight:latest + echo " Started. API: http://localhost:8888 · UI: http://localhost:9999" + fi +else + echo "==> Hindsight server start disabled (HINDSIGHT_START_SERVER != true)." + echo " Client installed. To run the server later (needs Docker + LLM key):" + echo " docker run --rm -d --pull always -p 8888:8888 -p 9999:9999 \\" + echo " -e HINDSIGHT_API_LLM_PROVIDER=${HINDSIGHT_LLM_PROVIDER:-openai} \\" + echo " -e HINDSIGHT_API_LLM_API_KEY= \\" + echo " -v \$HOME/.hindsight-docker:/home/hindsight/.pg0 \\" + echo " ghcr.io/vectorize-io/hindsight:latest" +fi + +echo "==> Hindsight step complete." diff --git a/profiles/cli-bundle/README.md b/profiles/cli-bundle/README.md index afb45e5..8105e11 100644 --- a/profiles/cli-bundle/README.md +++ b/profiles/cli-bundle/README.md @@ -110,6 +110,37 @@ crontab -l | grep -v claude-dream | crontab - rm ~/.claude/dream.sh ``` +## Hindsight (memória de agentes — protótipo, opt-in) + +[Hindsight](https://github.com/vectorize-io/hindsight) é um sistema de memória +de agentes (mesma categoria do OpenViking), com biblioteca cliente + servidor +Dockerizado (API `:8888`, UI `:9999`). Passo `05d-hindsight.sh`, **desligado por +padrão** — adicionado para avaliarmos depois. + +```env +INSTALL_HINDSIGHT=true # liga o passo +HINDSIGHT_NPM_CLIENT=true # instala @vectorize-io/hindsight-client (npm) +HINDSIGHT_PIP_CLIENT=false # instala hindsight-client (pipx/pip --user) +HINDSIGHT_START_SERVER=false # sobe o servidor via Docker no install +HINDSIGHT_LLM_PROVIDER=openai # openai|anthropic|gemini|groq|ollama|lmstudio|minimax +HINDSIGHT_LLM_API_KEY= # chave do provider (necessária p/ subir o servidor) +``` + +O passo instala o cliente e, se `HINDSIGHT_START_SERVER=true` **e** o Docker +estiver presente **e** houver `HINDSIGHT_LLM_API_KEY`, sobe o servidor: +```bash +docker run --rm -d --pull always -p 8888:8888 -p 9999:9999 \ + -e HINDSIGHT_API_LLM_PROVIDER=openai \ + -e HINDSIGHT_API_LLM_API_KEY= \ + -v $HOME/.hindsight-docker:/home/hindsight/.pg0 \ + ghcr.io/vectorize-io/hindsight:latest +``` +Caso contrário, apenas imprime o comando para você subir manualmente depois. +A API fica em `http://localhost:8888` e a UI em `http://localhost:9999`. + +> ⚠️ Protótipo: ainda não integrado ao Claude Code como backend de memória — +> serve para testes comparativos com o OpenViking. + ## Obsidian vault (workspace compartilhado entre CLIs) Vault único em `$OBSIDIAN_VAULT_DIR` (default `~/vault`) que todos os CLIs diff --git a/profiles/cli-bundle/install.sh b/profiles/cli-bundle/install.sh index e7fb74b..0ba71da 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 + OpenCode + OpenViking CLIs. -# All coexist on one host. Toggle individually in .env. +# Installs Claude Code + Codex + Antigravity + Cursor + OpenCode + OpenViking CLIs, +# plus optional Hindsight agent-memory (prototype). Toggle individually in .env. # ============================================================ set -euo pipefail @@ -30,6 +30,7 @@ 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/05d-hindsight.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"