@poolzin/pool-bot 2026.3.13 → 2026.3.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +87 -0
- package/dist/agents/checkpoint-manager.js +291 -0
- package/dist/agents/poolbot-tools.js +5 -0
- package/dist/agents/subagent-announce-reliability.js +160 -0
- package/dist/agents/tool-result-truncation.js +299 -0
- package/dist/agents/tools/nodes-file-tool.js +197 -0
- package/dist/build-info.json +3 -3
- package/dist/cli/config-cli.js +60 -0
- package/dist/cron/cron-improvements.js +195 -0
- package/dist/discord/discord-improvements.js +167 -0
- package/dist/gateway/auth-rate-limit.js +19 -0
- package/dist/gateway/auth.js +41 -0
- package/dist/gateway/gateway-improvements.js +294 -0
- package/dist/gateway/node-command-policy.js +7 -2
- package/dist/infra/net/ssrf.js +15 -2
- package/dist/infra/shell-security.js +201 -0
- package/dist/memory/memory-improvements.js +239 -0
- package/dist/node-host/runner.js +146 -79
- package/dist/security/prototype-pollution.js +141 -0
- package/dist/security/webhook-security.js +253 -0
- package/dist/shared/net/ip.js +52 -1
- package/dist/slack/slack-improvements.js +225 -0
- package/dist/telegram/telegram-improvements.js +220 -0
- package/dist/ui-plugins/ui-plugins-improvements.js +191 -0
- package/docs/ANALISE_OPENCLAW_PROFISSIONAL.md +520 -0
- package/docs/competitive-analysis.md +421 -0
- package/docs/implementation-analysis.md +393 -0
- package/docs/plans/2026-03-11-file-operations-security-hardening.md +307 -0
- package/docs/plans/2026-03-11-integracao-projetos-poolbot.md +666 -0
- package/extensions/agency-agents/README.md +301 -0
- package/extensions/agency-agents/agents/CONTRIBUTING.md +353 -0
- package/extensions/agency-agents/agents/README.md +602 -0
- package/extensions/agency-agents/agents/design/design-brand-guardian.md +320 -0
- package/extensions/agency-agents/agents/design/design-image-prompt-engineer.md +234 -0
- package/extensions/agency-agents/agents/design/design-ui-designer.md +381 -0
- package/extensions/agency-agents/agents/design/design-ux-architect.md +467 -0
- package/extensions/agency-agents/agents/design/design-ux-researcher.md +327 -0
- package/extensions/agency-agents/agents/design/design-visual-storyteller.md +147 -0
- package/extensions/agency-agents/agents/design/design-whimsy-injector.md +436 -0
- package/extensions/agency-agents/agents/engineering/engineering-ai-engineer.md +144 -0
- package/extensions/agency-agents/agents/engineering/engineering-backend-architect.md +233 -0
- package/extensions/agency-agents/agents/engineering/engineering-devops-automator.md +374 -0
- package/extensions/agency-agents/agents/engineering/engineering-frontend-developer.md +223 -0
- package/extensions/agency-agents/agents/engineering/engineering-mobile-app-builder.md +491 -0
- package/extensions/agency-agents/agents/engineering/engineering-rapid-prototyper.md +460 -0
- package/extensions/agency-agents/agents/engineering/engineering-security-engineer.md +275 -0
- package/extensions/agency-agents/agents/engineering/engineering-senior-developer.md +174 -0
- package/extensions/agency-agents/agents/examples/README.md +48 -0
- package/extensions/agency-agents/agents/examples/nexus-spatial-discovery.md +852 -0
- package/extensions/agency-agents/agents/examples/workflow-landing-page.md +119 -0
- package/extensions/agency-agents/agents/examples/workflow-startup-mvp.md +155 -0
- package/extensions/agency-agents/agents/integrations/README.md +117 -0
- package/extensions/agency-agents/agents/integrations/aider/README.md +38 -0
- package/extensions/agency-agents/agents/integrations/antigravity/README.md +49 -0
- package/extensions/agency-agents/agents/integrations/claude-code/README.md +31 -0
- package/extensions/agency-agents/agents/integrations/cursor/README.md +38 -0
- package/extensions/agency-agents/agents/integrations/gemini-cli/README.md +36 -0
- package/extensions/agency-agents/agents/integrations/opencode/README.md +58 -0
- package/extensions/agency-agents/agents/integrations/windsurf/README.md +26 -0
- package/extensions/agency-agents/agents/marketing/marketing-app-store-optimizer.md +319 -0
- package/extensions/agency-agents/agents/marketing/marketing-content-creator.md +52 -0
- package/extensions/agency-agents/agents/marketing/marketing-growth-hacker.md +52 -0
- package/extensions/agency-agents/agents/marketing/marketing-instagram-curator.md +111 -0
- package/extensions/agency-agents/agents/marketing/marketing-reddit-community-builder.md +121 -0
- package/extensions/agency-agents/agents/marketing/marketing-social-media-strategist.md +123 -0
- package/extensions/agency-agents/agents/marketing/marketing-tiktok-strategist.md +123 -0
- package/extensions/agency-agents/agents/marketing/marketing-twitter-engager.md +124 -0
- package/extensions/agency-agents/agents/marketing/marketing-wechat-official-account.md +143 -0
- package/extensions/agency-agents/agents/marketing/marketing-xiaohongshu-specialist.md +136 -0
- package/extensions/agency-agents/agents/marketing/marketing-zhihu-strategist.md +160 -0
- package/extensions/agency-agents/agents/product/product-feedback-synthesizer.md +117 -0
- package/extensions/agency-agents/agents/product/product-sprint-prioritizer.md +152 -0
- package/extensions/agency-agents/agents/product/product-trend-researcher.md +157 -0
- package/extensions/agency-agents/agents/project-management/project-management-experiment-tracker.md +196 -0
- package/extensions/agency-agents/agents/project-management/project-management-project-shepherd.md +192 -0
- package/extensions/agency-agents/agents/project-management/project-management-studio-operations.md +198 -0
- package/extensions/agency-agents/agents/project-management/project-management-studio-producer.md +201 -0
- package/extensions/agency-agents/agents/project-management/project-manager-senior.md +133 -0
- package/extensions/agency-agents/agents/scripts/convert.sh +362 -0
- package/extensions/agency-agents/agents/scripts/install.sh +465 -0
- package/extensions/agency-agents/agents/scripts/lint-agents.sh +115 -0
- package/extensions/agency-agents/agents/spatial-computing/macos-spatial-metal-engineer.md +335 -0
- package/extensions/agency-agents/agents/spatial-computing/terminal-integration-specialist.md +68 -0
- package/extensions/agency-agents/agents/spatial-computing/visionos-spatial-engineer.md +52 -0
- package/extensions/agency-agents/agents/spatial-computing/xr-cockpit-interaction-specialist.md +30 -0
- package/extensions/agency-agents/agents/spatial-computing/xr-immersive-developer.md +30 -0
- package/extensions/agency-agents/agents/spatial-computing/xr-interface-architect.md +30 -0
- package/extensions/agency-agents/agents/specialized/agentic-identity-trust.md +367 -0
- package/extensions/agency-agents/agents/specialized/agents-orchestrator.md +365 -0
- package/extensions/agency-agents/agents/specialized/data-analytics-reporter.md +52 -0
- package/extensions/agency-agents/agents/specialized/data-consolidation-agent.md +58 -0
- package/extensions/agency-agents/agents/specialized/lsp-index-engineer.md +312 -0
- package/extensions/agency-agents/agents/specialized/report-distribution-agent.md +63 -0
- package/extensions/agency-agents/agents/specialized/sales-data-extraction-agent.md +65 -0
- package/extensions/agency-agents/agents/strategy/EXECUTIVE-BRIEF.md +95 -0
- package/extensions/agency-agents/agents/strategy/QUICKSTART.md +194 -0
- package/extensions/agency-agents/agents/strategy/coordination/agent-activation-prompts.md +401 -0
- package/extensions/agency-agents/agents/strategy/coordination/handoff-templates.md +357 -0
- package/extensions/agency-agents/agents/strategy/nexus-strategy.md +1110 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-0-discovery.md +178 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-1-strategy.md +238 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-2-foundation.md +278 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-3-build.md +286 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-4-hardening.md +332 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-5-launch.md +277 -0
- package/extensions/agency-agents/agents/strategy/playbooks/phase-6-operate.md +318 -0
- package/extensions/agency-agents/agents/strategy/runbooks/scenario-enterprise-feature.md +157 -0
- package/extensions/agency-agents/agents/strategy/runbooks/scenario-incident-response.md +217 -0
- package/extensions/agency-agents/agents/strategy/runbooks/scenario-marketing-campaign.md +187 -0
- package/extensions/agency-agents/agents/strategy/runbooks/scenario-startup-mvp.md +154 -0
- package/extensions/agency-agents/agents/support/support-analytics-reporter.md +363 -0
- package/extensions/agency-agents/agents/support/support-executive-summary-generator.md +210 -0
- package/extensions/agency-agents/agents/support/support-finance-tracker.md +440 -0
- package/extensions/agency-agents/agents/support/support-infrastructure-maintainer.md +616 -0
- package/extensions/agency-agents/agents/support/support-legal-compliance-checker.md +586 -0
- package/extensions/agency-agents/agents/support/support-support-responder.md +583 -0
- package/extensions/agency-agents/agents/testing/testing-accessibility-auditor.md +313 -0
- package/extensions/agency-agents/agents/testing/testing-api-tester.md +304 -0
- package/extensions/agency-agents/agents/testing/testing-evidence-collector.md +208 -0
- package/extensions/agency-agents/agents/testing/testing-performance-benchmarker.md +266 -0
- package/extensions/agency-agents/agents/testing/testing-reality-checker.md +236 -0
- package/extensions/agency-agents/agents/testing/testing-test-results-analyzer.md +303 -0
- package/extensions/agency-agents/agents/testing/testing-tool-evaluator.md +392 -0
- package/extensions/agency-agents/agents/testing/testing-workflow-optimizer.md +448 -0
- package/extensions/agency-agents/index.ts +733 -0
- package/extensions/agency-agents/node_modules/.bin/jiti +21 -0
- package/extensions/agency-agents/node_modules/.bin/tsc +21 -0
- package/extensions/agency-agents/node_modules/.bin/tsserver +21 -0
- package/extensions/agency-agents/node_modules/.bin/tsx +21 -0
- package/extensions/agency-agents/node_modules/.bin/vite +21 -0
- package/extensions/agency-agents/node_modules/.bin/vitest +21 -0
- package/extensions/agency-agents/node_modules/.bin/yaml +21 -0
- package/extensions/agency-agents/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/extensions/agency-agents/package.json +25 -0
- package/extensions/agency-agents/poolbot.plugin.json +11 -0
- package/extensions/agency-agents/src/AgencyAgentsService.test.ts +443 -0
- package/extensions/agency-agents/src/AgencyAgentsService.ts +288 -0
- package/extensions/agency-agents/src/types.ts +147 -0
- package/extensions/agency-agents/vitest.config.ts +8 -0
- package/extensions/hexstrike-ai/README.md +98 -0
- package/extensions/hexstrike-ai/node_modules/.bin/tsc +21 -0
- package/extensions/hexstrike-ai/node_modules/.bin/tsserver +21 -0
- package/extensions/hexstrike-ai/package.json +29 -0
- package/extensions/hexstrike-ai/poolbot.plugin.json +31 -0
- package/extensions/hexstrike-ai/src/client.ts +91 -0
- package/extensions/hexstrike-ai/src/index.ts +170 -0
- package/extensions/hexstrike-ai/src/server/hexstrike_mcp.py +5470 -0
- package/extensions/hexstrike-ai/src/server/hexstrike_server.py +17289 -0
- package/extensions/hexstrike-ai/src/server/requirements.txt +84 -0
- package/extensions/hexstrike-ai/src/server-manager.ts +83 -0
- package/extensions/hexstrike-ai/tsconfig.json +20 -0
- package/extensions/page-agent/README.md +159 -0
- package/extensions/page-agent/index.ts +595 -0
- package/extensions/page-agent/node_modules/.bin/jiti +21 -0
- package/extensions/page-agent/node_modules/.bin/playwright +21 -0
- package/extensions/page-agent/node_modules/.bin/tsc +21 -0
- package/extensions/page-agent/node_modules/.bin/tsserver +21 -0
- package/extensions/page-agent/node_modules/.bin/tsx +21 -0
- package/extensions/page-agent/node_modules/.bin/vitest +21 -0
- package/extensions/page-agent/node_modules/.bin/yaml +21 -0
- package/extensions/page-agent/package.json +43 -0
- package/extensions/page-agent/poolbot.plugin.json +24 -0
- package/extensions/page-agent/src/PageAgentService.test.ts +517 -0
- package/extensions/page-agent/src/PageAgentService.ts +636 -0
- package/extensions/page-agent/src/PoolBotPageController.test.ts +358 -0
- package/extensions/page-agent/src/PoolBotPageController.ts +245 -0
- package/extensions/page-agent/src/index.ts +20 -0
- package/extensions/page-agent/src/tools.test.ts +231 -0
- package/extensions/page-agent/src/tools.ts +167 -0
- package/extensions/page-agent/src/types.ts +198 -0
- package/extensions/xyops/README.md +227 -0
- package/extensions/xyops/index.ts +342 -0
- package/extensions/xyops/node_modules/.bin/jiti +21 -0
- package/extensions/xyops/node_modules/.bin/tsc +21 -0
- package/extensions/xyops/node_modules/.bin/tsserver +21 -0
- package/extensions/xyops/node_modules/.bin/tsx +21 -0
- package/extensions/xyops/node_modules/.bin/vitest +21 -0
- package/extensions/xyops/node_modules/.bin/yaml +21 -0
- package/extensions/xyops/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/extensions/xyops/package.json +39 -0
- package/extensions/xyops/poolbot.plugin.json +21 -0
- package/extensions/xyops/src/client.test.ts +467 -0
- package/extensions/xyops/src/client.ts +157 -0
- package/extensions/xyops/src/types.ts +147 -0
- package/extensions/xyops/vitest.config.ts +8 -0
- package/package.json +1 -1
|
@@ -0,0 +1,465 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# install.sh -- Install The Agency agents into your local agentic tool(s).
|
|
4
|
+
#
|
|
5
|
+
# Reads converted files from integrations/ and copies them to the appropriate
|
|
6
|
+
# config directory for each tool. Run scripts/convert.sh first if integrations/
|
|
7
|
+
# is missing or stale.
|
|
8
|
+
#
|
|
9
|
+
# Usage:
|
|
10
|
+
# ./scripts/install.sh [--tool <name>] [--interactive] [--no-interactive] [--help]
|
|
11
|
+
#
|
|
12
|
+
# Tools:
|
|
13
|
+
# claude-code -- Copy agents to ~/.claude/agents/
|
|
14
|
+
# antigravity -- Copy skills to ~/.gemini/antigravity/skills/
|
|
15
|
+
# gemini-cli -- Install extension to ~/.gemini/extensions/agency-agents/
|
|
16
|
+
# opencode -- Copy agents to .opencode/agent/ in current directory
|
|
17
|
+
# cursor -- Copy rules to .cursor/rules/ in current directory
|
|
18
|
+
# aider -- Copy CONVENTIONS.md to current directory
|
|
19
|
+
# windsurf -- Copy .windsurfrules to current directory
|
|
20
|
+
# all -- Install for all detected tools (default)
|
|
21
|
+
#
|
|
22
|
+
# Flags:
|
|
23
|
+
# --tool <name> Install only the specified tool
|
|
24
|
+
# --interactive Show interactive selector (default when run in a terminal)
|
|
25
|
+
# --no-interactive Skip interactive selector, install all detected tools
|
|
26
|
+
# --help Show this help
|
|
27
|
+
#
|
|
28
|
+
# Platform support:
|
|
29
|
+
# Linux, macOS (requires bash 3.2+), Windows Git Bash / WSL
|
|
30
|
+
|
|
31
|
+
set -euo pipefail
|
|
32
|
+
|
|
33
|
+
# ---------------------------------------------------------------------------
|
|
34
|
+
# Colours -- only when stdout is a real terminal
|
|
35
|
+
# ---------------------------------------------------------------------------
|
|
36
|
+
if [[ -t 1 ]]; then
|
|
37
|
+
C_GREEN=$'\033[0;32m'
|
|
38
|
+
C_YELLOW=$'\033[1;33m'
|
|
39
|
+
C_RED=$'\033[0;31m'
|
|
40
|
+
C_CYAN=$'\033[0;36m'
|
|
41
|
+
C_BOLD=$'\033[1m'
|
|
42
|
+
C_DIM=$'\033[2m'
|
|
43
|
+
C_RESET=$'\033[0m'
|
|
44
|
+
else
|
|
45
|
+
C_GREEN=''; C_YELLOW=''; C_RED=''; C_CYAN=''; C_BOLD=''; C_DIM=''; C_RESET=''
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
ok() { printf "${C_GREEN}[OK]${C_RESET} %s\n" "$*"; }
|
|
49
|
+
warn() { printf "${C_YELLOW}[!!]${C_RESET} %s\n" "$*"; }
|
|
50
|
+
err() { printf "${C_RED}[ERR]${C_RESET} %s\n" "$*" >&2; }
|
|
51
|
+
header() { printf "\n${C_BOLD}%s${C_RESET}\n" "$*"; }
|
|
52
|
+
dim() { printf "${C_DIM}%s${C_RESET}\n" "$*"; }
|
|
53
|
+
|
|
54
|
+
# ---------------------------------------------------------------------------
|
|
55
|
+
# Box drawing -- pure ASCII, fixed 52-char wide
|
|
56
|
+
# box_top / box_mid / box_bot -- structural lines
|
|
57
|
+
# box_row <text> -- content row, right-padded to fit
|
|
58
|
+
# ---------------------------------------------------------------------------
|
|
59
|
+
BOX_INNER=48 # chars between the two | walls
|
|
60
|
+
|
|
61
|
+
box_top() { printf " +"; printf '%0.s-' $(seq 1 $BOX_INNER); printf "+\n"; }
|
|
62
|
+
box_bot() { box_top; }
|
|
63
|
+
box_sep() { printf " |"; printf '%0.s-' $(seq 1 $BOX_INNER); printf "|\n"; }
|
|
64
|
+
box_row() {
|
|
65
|
+
# Strip ANSI escapes when measuring visible length
|
|
66
|
+
local raw="$1"
|
|
67
|
+
local visible
|
|
68
|
+
visible="$(printf '%s' "$raw" | sed 's/\x1b\[[0-9;]*m//g')"
|
|
69
|
+
local pad=$(( BOX_INNER - 2 - ${#visible} ))
|
|
70
|
+
if (( pad < 0 )); then pad=0; fi
|
|
71
|
+
printf " | %s%*s |\n" "$raw" "$pad" ''
|
|
72
|
+
}
|
|
73
|
+
box_blank() { printf " |%*s|\n" $BOX_INNER ''; }
|
|
74
|
+
|
|
75
|
+
# ---------------------------------------------------------------------------
|
|
76
|
+
# Paths
|
|
77
|
+
# ---------------------------------------------------------------------------
|
|
78
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
79
|
+
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
80
|
+
INTEGRATIONS="$REPO_ROOT/integrations"
|
|
81
|
+
|
|
82
|
+
ALL_TOOLS=(claude-code antigravity gemini-cli opencode cursor aider windsurf)
|
|
83
|
+
|
|
84
|
+
# ---------------------------------------------------------------------------
|
|
85
|
+
# Usage
|
|
86
|
+
# ---------------------------------------------------------------------------
|
|
87
|
+
usage() {
|
|
88
|
+
sed -n '3,28p' "$0" | sed 's/^# \{0,1\}//'
|
|
89
|
+
exit 0
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# ---------------------------------------------------------------------------
|
|
93
|
+
# Preflight
|
|
94
|
+
# ---------------------------------------------------------------------------
|
|
95
|
+
check_integrations() {
|
|
96
|
+
if [[ ! -d "$INTEGRATIONS" ]]; then
|
|
97
|
+
err "integrations/ not found. Run ./scripts/convert.sh first."
|
|
98
|
+
exit 1
|
|
99
|
+
fi
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
# ---------------------------------------------------------------------------
|
|
103
|
+
# Tool detection
|
|
104
|
+
# ---------------------------------------------------------------------------
|
|
105
|
+
detect_claude_code() { [[ -d "${HOME}/.claude" ]]; }
|
|
106
|
+
detect_antigravity() { [[ -d "${HOME}/.gemini/antigravity/skills" ]]; }
|
|
107
|
+
detect_gemini_cli() { command -v gemini >/dev/null 2>&1 || [[ -d "${HOME}/.gemini" ]]; }
|
|
108
|
+
detect_cursor() { command -v cursor >/dev/null 2>&1 || [[ -d "${HOME}/.cursor" ]]; }
|
|
109
|
+
detect_opencode() { command -v opencode >/dev/null 2>&1 || [[ -d "${HOME}/.config/opencode" ]]; }
|
|
110
|
+
detect_aider() { command -v aider >/dev/null 2>&1; }
|
|
111
|
+
detect_windsurf() { command -v windsurf >/dev/null 2>&1 || [[ -d "${HOME}/.codeium" ]]; }
|
|
112
|
+
|
|
113
|
+
is_detected() {
|
|
114
|
+
case "$1" in
|
|
115
|
+
claude-code) detect_claude_code ;;
|
|
116
|
+
antigravity) detect_antigravity ;;
|
|
117
|
+
gemini-cli) detect_gemini_cli ;;
|
|
118
|
+
opencode) detect_opencode ;;
|
|
119
|
+
cursor) detect_cursor ;;
|
|
120
|
+
aider) detect_aider ;;
|
|
121
|
+
windsurf) detect_windsurf ;;
|
|
122
|
+
*) return 1 ;;
|
|
123
|
+
esac
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
# Fixed-width labels: name (14) + detail (24) = 38 visible chars
|
|
127
|
+
tool_label() {
|
|
128
|
+
case "$1" in
|
|
129
|
+
claude-code) printf "%-14s %s" "Claude Code" "(claude.ai/code)" ;;
|
|
130
|
+
antigravity) printf "%-14s %s" "Antigravity" "(~/.gemini/antigravity)" ;;
|
|
131
|
+
gemini-cli) printf "%-14s %s" "Gemini CLI" "(gemini extension)" ;;
|
|
132
|
+
opencode) printf "%-14s %s" "OpenCode" "(opencode.ai)" ;;
|
|
133
|
+
cursor) printf "%-14s %s" "Cursor" "(.cursor/rules)" ;;
|
|
134
|
+
aider) printf "%-14s %s" "Aider" "(CONVENTIONS.md)" ;;
|
|
135
|
+
windsurf) printf "%-14s %s" "Windsurf" "(.windsurfrules)" ;;
|
|
136
|
+
esac
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
# ---------------------------------------------------------------------------
|
|
140
|
+
# Interactive selector
|
|
141
|
+
# ---------------------------------------------------------------------------
|
|
142
|
+
interactive_select() {
|
|
143
|
+
# bash 3-compatible arrays
|
|
144
|
+
declare -a selected=()
|
|
145
|
+
declare -a detected_map=()
|
|
146
|
+
|
|
147
|
+
local t
|
|
148
|
+
for t in "${ALL_TOOLS[@]}"; do
|
|
149
|
+
if is_detected "$t" 2>/dev/null; then
|
|
150
|
+
selected+=(1); detected_map+=(1)
|
|
151
|
+
else
|
|
152
|
+
selected+=(0); detected_map+=(0)
|
|
153
|
+
fi
|
|
154
|
+
done
|
|
155
|
+
|
|
156
|
+
while true; do
|
|
157
|
+
# --- header ---
|
|
158
|
+
printf "\n"
|
|
159
|
+
box_top
|
|
160
|
+
box_row "${C_BOLD} The Agency -- Tool Installer${C_RESET}"
|
|
161
|
+
box_bot
|
|
162
|
+
printf "\n"
|
|
163
|
+
printf " ${C_DIM}System scan: [*] = detected on this machine${C_RESET}\n"
|
|
164
|
+
printf "\n"
|
|
165
|
+
|
|
166
|
+
# --- tool rows ---
|
|
167
|
+
local i=0
|
|
168
|
+
for t in "${ALL_TOOLS[@]}"; do
|
|
169
|
+
local num=$(( i + 1 ))
|
|
170
|
+
local label
|
|
171
|
+
label="$(tool_label "$t")"
|
|
172
|
+
local dot
|
|
173
|
+
if [[ "${detected_map[$i]}" == "1" ]]; then
|
|
174
|
+
dot="${C_GREEN}[*]${C_RESET}"
|
|
175
|
+
else
|
|
176
|
+
dot="${C_DIM}[ ]${C_RESET}"
|
|
177
|
+
fi
|
|
178
|
+
local chk
|
|
179
|
+
if [[ "${selected[$i]}" == "1" ]]; then
|
|
180
|
+
chk="${C_GREEN}[x]${C_RESET}"
|
|
181
|
+
else
|
|
182
|
+
chk="${C_DIM}[ ]${C_RESET}"
|
|
183
|
+
fi
|
|
184
|
+
printf " %s %s) %s %s\n" "$chk" "$num" "$dot" "$label"
|
|
185
|
+
(( i++ )) || true
|
|
186
|
+
done
|
|
187
|
+
|
|
188
|
+
# --- controls ---
|
|
189
|
+
printf "\n"
|
|
190
|
+
printf " ------------------------------------------------\n"
|
|
191
|
+
printf " ${C_CYAN}[1-7]${C_RESET} toggle ${C_CYAN}[a]${C_RESET} all ${C_CYAN}[n]${C_RESET} none ${C_CYAN}[d]${C_RESET} detected\n"
|
|
192
|
+
printf " ${C_GREEN}[Enter]${C_RESET} install ${C_RED}[q]${C_RESET} quit\n"
|
|
193
|
+
printf "\n"
|
|
194
|
+
printf " >> "
|
|
195
|
+
read -r input </dev/tty
|
|
196
|
+
|
|
197
|
+
case "$input" in
|
|
198
|
+
q|Q)
|
|
199
|
+
printf "\n"; ok "Aborted."; exit 0 ;;
|
|
200
|
+
a|A)
|
|
201
|
+
for (( j=0; j<${#ALL_TOOLS[@]}; j++ )); do selected[$j]=1; done ;;
|
|
202
|
+
n|N)
|
|
203
|
+
for (( j=0; j<${#ALL_TOOLS[@]}; j++ )); do selected[$j]=0; done ;;
|
|
204
|
+
d|D)
|
|
205
|
+
for (( j=0; j<${#ALL_TOOLS[@]}; j++ )); do selected[$j]="${detected_map[$j]}"; done ;;
|
|
206
|
+
"")
|
|
207
|
+
local any=false
|
|
208
|
+
local s
|
|
209
|
+
for s in "${selected[@]}"; do [[ "$s" == "1" ]] && any=true && break; done
|
|
210
|
+
if $any; then
|
|
211
|
+
break
|
|
212
|
+
else
|
|
213
|
+
printf " ${C_YELLOW}Nothing selected -- pick a tool or press q to quit.${C_RESET}\n"
|
|
214
|
+
sleep 1
|
|
215
|
+
fi ;;
|
|
216
|
+
*)
|
|
217
|
+
local toggled=false
|
|
218
|
+
local num
|
|
219
|
+
for num in $input; do
|
|
220
|
+
if [[ "$num" =~ ^[0-9]+$ ]]; then
|
|
221
|
+
local idx=$(( num - 1 ))
|
|
222
|
+
if (( idx >= 0 && idx < ${#ALL_TOOLS[@]} )); then
|
|
223
|
+
if [[ "${selected[$idx]}" == "1" ]]; then
|
|
224
|
+
selected[$idx]=0
|
|
225
|
+
else
|
|
226
|
+
selected[$idx]=1
|
|
227
|
+
fi
|
|
228
|
+
toggled=true
|
|
229
|
+
fi
|
|
230
|
+
fi
|
|
231
|
+
done
|
|
232
|
+
if ! $toggled; then
|
|
233
|
+
printf " ${C_RED}Invalid. Enter a number 1-%s, or a command.${C_RESET}\n" "${#ALL_TOOLS[@]}"
|
|
234
|
+
sleep 1
|
|
235
|
+
fi ;;
|
|
236
|
+
esac
|
|
237
|
+
|
|
238
|
+
# Clear UI for redraw
|
|
239
|
+
local lines=$(( ${#ALL_TOOLS[@]} + 14 ))
|
|
240
|
+
local l
|
|
241
|
+
for (( l=0; l<lines; l++ )); do printf '\033[1A\033[2K'; done
|
|
242
|
+
done
|
|
243
|
+
|
|
244
|
+
# Build output array
|
|
245
|
+
SELECTED_TOOLS=()
|
|
246
|
+
local i=0
|
|
247
|
+
for t in "${ALL_TOOLS[@]}"; do
|
|
248
|
+
[[ "${selected[$i]}" == "1" ]] && SELECTED_TOOLS+=("$t")
|
|
249
|
+
(( i++ )) || true
|
|
250
|
+
done
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
# ---------------------------------------------------------------------------
|
|
254
|
+
# Installers
|
|
255
|
+
# ---------------------------------------------------------------------------
|
|
256
|
+
|
|
257
|
+
install_claude_code() {
|
|
258
|
+
local dest="${HOME}/.claude/agents"
|
|
259
|
+
local count=0
|
|
260
|
+
mkdir -p "$dest"
|
|
261
|
+
local dir f first_line
|
|
262
|
+
for dir in design engineering marketing product project-management \
|
|
263
|
+
testing support spatial-computing specialized; do
|
|
264
|
+
[[ -d "$REPO_ROOT/$dir" ]] || continue
|
|
265
|
+
while IFS= read -r -d '' f; do
|
|
266
|
+
first_line="$(head -1 "$f")"
|
|
267
|
+
[[ "$first_line" == "---" ]] || continue
|
|
268
|
+
cp "$f" "$dest/"
|
|
269
|
+
(( count++ )) || true
|
|
270
|
+
done < <(find "$REPO_ROOT/$dir" -maxdepth 1 -name "*.md" -type f -print0)
|
|
271
|
+
done
|
|
272
|
+
ok "Claude Code: $count agents -> $dest"
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
install_antigravity() {
|
|
276
|
+
local src="$INTEGRATIONS/antigravity"
|
|
277
|
+
local dest="${HOME}/.gemini/antigravity/skills"
|
|
278
|
+
local count=0
|
|
279
|
+
[[ -d "$src" ]] || { err "integrations/antigravity missing. Run convert.sh first."; return 1; }
|
|
280
|
+
mkdir -p "$dest"
|
|
281
|
+
local d
|
|
282
|
+
while IFS= read -r -d '' d; do
|
|
283
|
+
local name; name="$(basename "$d")"
|
|
284
|
+
mkdir -p "$dest/$name"
|
|
285
|
+
cp "$d/SKILL.md" "$dest/$name/SKILL.md"
|
|
286
|
+
(( count++ )) || true
|
|
287
|
+
done < <(find "$src" -mindepth 1 -maxdepth 1 -type d -print0)
|
|
288
|
+
ok "Antigravity: $count skills -> $dest"
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
install_gemini_cli() {
|
|
292
|
+
local src="$INTEGRATIONS/gemini-cli"
|
|
293
|
+
local dest="${HOME}/.gemini/extensions/agency-agents"
|
|
294
|
+
local count=0
|
|
295
|
+
[[ -d "$src" ]] || { err "integrations/gemini-cli missing. Run convert.sh first."; return 1; }
|
|
296
|
+
mkdir -p "$dest/skills"
|
|
297
|
+
cp "$src/gemini-extension.json" "$dest/gemini-extension.json"
|
|
298
|
+
local d
|
|
299
|
+
while IFS= read -r -d '' d; do
|
|
300
|
+
local name; name="$(basename "$d")"
|
|
301
|
+
mkdir -p "$dest/skills/$name"
|
|
302
|
+
cp "$d/SKILL.md" "$dest/skills/$name/SKILL.md"
|
|
303
|
+
(( count++ )) || true
|
|
304
|
+
done < <(find "$src/skills" -mindepth 1 -maxdepth 1 -type d -print0)
|
|
305
|
+
ok "Gemini CLI: $count skills -> $dest"
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
install_opencode() {
|
|
309
|
+
local src="$INTEGRATIONS/opencode/agent"
|
|
310
|
+
local dest="${PWD}/.opencode/agent"
|
|
311
|
+
local count=0
|
|
312
|
+
[[ -d "$src" ]] || { err "integrations/opencode missing. Run convert.sh first."; return 1; }
|
|
313
|
+
mkdir -p "$dest"
|
|
314
|
+
local f
|
|
315
|
+
while IFS= read -r -d '' f; do
|
|
316
|
+
cp "$f" "$dest/"; (( count++ )) || true
|
|
317
|
+
done < <(find "$src" -maxdepth 1 -name "*.md" -print0)
|
|
318
|
+
ok "OpenCode: $count agents -> $dest"
|
|
319
|
+
warn "OpenCode: project-scoped. Run from your project root to install there."
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
install_cursor() {
|
|
323
|
+
local src="$INTEGRATIONS/cursor/rules"
|
|
324
|
+
local dest="${PWD}/.cursor/rules"
|
|
325
|
+
local count=0
|
|
326
|
+
[[ -d "$src" ]] || { err "integrations/cursor missing. Run convert.sh first."; return 1; }
|
|
327
|
+
mkdir -p "$dest"
|
|
328
|
+
local f
|
|
329
|
+
while IFS= read -r -d '' f; do
|
|
330
|
+
cp "$f" "$dest/"; (( count++ )) || true
|
|
331
|
+
done < <(find "$src" -maxdepth 1 -name "*.mdc" -print0)
|
|
332
|
+
ok "Cursor: $count rules -> $dest"
|
|
333
|
+
warn "Cursor: project-scoped. Run from your project root to install there."
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
install_aider() {
|
|
337
|
+
local src="$INTEGRATIONS/aider/CONVENTIONS.md"
|
|
338
|
+
local dest="${PWD}/CONVENTIONS.md"
|
|
339
|
+
[[ -f "$src" ]] || { err "integrations/aider/CONVENTIONS.md missing. Run convert.sh first."; return 1; }
|
|
340
|
+
if [[ -f "$dest" ]]; then
|
|
341
|
+
warn "Aider: CONVENTIONS.md already exists at $dest (remove to reinstall)."
|
|
342
|
+
return 0
|
|
343
|
+
fi
|
|
344
|
+
cp "$src" "$dest"
|
|
345
|
+
ok "Aider: installed -> $dest"
|
|
346
|
+
warn "Aider: project-scoped. Run from your project root to install there."
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
install_windsurf() {
|
|
350
|
+
local src="$INTEGRATIONS/windsurf/.windsurfrules"
|
|
351
|
+
local dest="${PWD}/.windsurfrules"
|
|
352
|
+
[[ -f "$src" ]] || { err "integrations/windsurf/.windsurfrules missing. Run convert.sh first."; return 1; }
|
|
353
|
+
if [[ -f "$dest" ]]; then
|
|
354
|
+
warn "Windsurf: .windsurfrules already exists at $dest (remove to reinstall)."
|
|
355
|
+
return 0
|
|
356
|
+
fi
|
|
357
|
+
cp "$src" "$dest"
|
|
358
|
+
ok "Windsurf: installed -> $dest"
|
|
359
|
+
warn "Windsurf: project-scoped. Run from your project root to install there."
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
install_tool() {
|
|
363
|
+
case "$1" in
|
|
364
|
+
claude-code) install_claude_code ;;
|
|
365
|
+
antigravity) install_antigravity ;;
|
|
366
|
+
gemini-cli) install_gemini_cli ;;
|
|
367
|
+
opencode) install_opencode ;;
|
|
368
|
+
cursor) install_cursor ;;
|
|
369
|
+
aider) install_aider ;;
|
|
370
|
+
windsurf) install_windsurf ;;
|
|
371
|
+
esac
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
# ---------------------------------------------------------------------------
|
|
375
|
+
# Entry point
|
|
376
|
+
# ---------------------------------------------------------------------------
|
|
377
|
+
main() {
|
|
378
|
+
local tool="all"
|
|
379
|
+
local interactive_mode="auto"
|
|
380
|
+
|
|
381
|
+
while [[ $# -gt 0 ]]; do
|
|
382
|
+
case "$1" in
|
|
383
|
+
--tool) tool="${2:?'--tool requires a value'}"; shift 2; interactive_mode="no" ;;
|
|
384
|
+
--interactive) interactive_mode="yes"; shift ;;
|
|
385
|
+
--no-interactive) interactive_mode="no"; shift ;;
|
|
386
|
+
--help|-h) usage ;;
|
|
387
|
+
*) err "Unknown option: $1"; usage ;;
|
|
388
|
+
esac
|
|
389
|
+
done
|
|
390
|
+
|
|
391
|
+
check_integrations
|
|
392
|
+
|
|
393
|
+
# Validate explicit tool
|
|
394
|
+
if [[ "$tool" != "all" ]]; then
|
|
395
|
+
local valid=false t
|
|
396
|
+
for t in "${ALL_TOOLS[@]}"; do [[ "$t" == "$tool" ]] && valid=true && break; done
|
|
397
|
+
if ! $valid; then
|
|
398
|
+
err "Unknown tool '$tool'. Valid: ${ALL_TOOLS[*]}"
|
|
399
|
+
exit 1
|
|
400
|
+
fi
|
|
401
|
+
fi
|
|
402
|
+
|
|
403
|
+
# Decide whether to show interactive UI
|
|
404
|
+
local use_interactive=false
|
|
405
|
+
if [[ "$interactive_mode" == "yes" ]]; then
|
|
406
|
+
use_interactive=true
|
|
407
|
+
elif [[ "$interactive_mode" == "auto" && -t 0 && -t 1 && "$tool" == "all" ]]; then
|
|
408
|
+
use_interactive=true
|
|
409
|
+
fi
|
|
410
|
+
|
|
411
|
+
SELECTED_TOOLS=()
|
|
412
|
+
|
|
413
|
+
if $use_interactive; then
|
|
414
|
+
interactive_select
|
|
415
|
+
|
|
416
|
+
elif [[ "$tool" != "all" ]]; then
|
|
417
|
+
SELECTED_TOOLS=("$tool")
|
|
418
|
+
|
|
419
|
+
else
|
|
420
|
+
# Non-interactive: auto-detect
|
|
421
|
+
header "The Agency -- Scanning for installed tools..."
|
|
422
|
+
printf "\n"
|
|
423
|
+
local t
|
|
424
|
+
for t in "${ALL_TOOLS[@]}"; do
|
|
425
|
+
if is_detected "$t" 2>/dev/null; then
|
|
426
|
+
SELECTED_TOOLS+=("$t")
|
|
427
|
+
printf " ${C_GREEN}[*]${C_RESET} %s ${C_DIM}detected${C_RESET}\n" "$(tool_label "$t")"
|
|
428
|
+
else
|
|
429
|
+
printf " ${C_DIM}[ ] %s not found${C_RESET}\n" "$(tool_label "$t")"
|
|
430
|
+
fi
|
|
431
|
+
done
|
|
432
|
+
fi
|
|
433
|
+
|
|
434
|
+
if [[ ${#SELECTED_TOOLS[@]} -eq 0 ]]; then
|
|
435
|
+
warn "No tools selected or detected. Nothing to install."
|
|
436
|
+
printf "\n"
|
|
437
|
+
dim " Tip: use --tool <name> to force-install a specific tool."
|
|
438
|
+
dim " Available: ${ALL_TOOLS[*]}"
|
|
439
|
+
exit 0
|
|
440
|
+
fi
|
|
441
|
+
|
|
442
|
+
printf "\n"
|
|
443
|
+
header "The Agency -- Installing agents"
|
|
444
|
+
printf " Repo: %s\n" "$REPO_ROOT"
|
|
445
|
+
printf " Installing: %s\n" "${SELECTED_TOOLS[*]}"
|
|
446
|
+
printf "\n"
|
|
447
|
+
|
|
448
|
+
local installed=0 t
|
|
449
|
+
for t in "${SELECTED_TOOLS[@]}"; do
|
|
450
|
+
install_tool "$t"
|
|
451
|
+
(( installed++ )) || true
|
|
452
|
+
done
|
|
453
|
+
|
|
454
|
+
# Done box
|
|
455
|
+
local msg=" Done! Installed $installed tool(s)."
|
|
456
|
+
printf "\n"
|
|
457
|
+
box_top
|
|
458
|
+
box_row "${C_GREEN}${C_BOLD}${msg}${C_RESET}"
|
|
459
|
+
box_bot
|
|
460
|
+
printf "\n"
|
|
461
|
+
dim " Run ./scripts/convert.sh to regenerate after adding or editing agents."
|
|
462
|
+
printf "\n"
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
main "$@"
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# Validates agent markdown files:
|
|
4
|
+
# 1. YAML frontmatter must exist with name, description, color (ERROR)
|
|
5
|
+
# 2. Recommended sections checked but only warned (WARN)
|
|
6
|
+
# 3. File must have meaningful content
|
|
7
|
+
#
|
|
8
|
+
# Usage: ./scripts/lint-agents.sh [file ...]
|
|
9
|
+
# If no files given, scans all agent directories.
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
AGENT_DIRS=(
|
|
14
|
+
design
|
|
15
|
+
engineering
|
|
16
|
+
marketing
|
|
17
|
+
product
|
|
18
|
+
project-management
|
|
19
|
+
testing
|
|
20
|
+
support
|
|
21
|
+
spatial-computing
|
|
22
|
+
specialized
|
|
23
|
+
strategy
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
REQUIRED_FRONTMATTER=("name" "description" "color")
|
|
27
|
+
RECOMMENDED_SECTIONS=("Identity" "Core Mission" "Critical Rules")
|
|
28
|
+
|
|
29
|
+
errors=0
|
|
30
|
+
warnings=0
|
|
31
|
+
|
|
32
|
+
lint_file() {
|
|
33
|
+
local file="$1"
|
|
34
|
+
|
|
35
|
+
# 1. Check frontmatter delimiters
|
|
36
|
+
local first_line
|
|
37
|
+
first_line=$(head -1 "$file")
|
|
38
|
+
if [[ "$first_line" != "---" ]]; then
|
|
39
|
+
echo "ERROR $file: missing frontmatter opening ---"
|
|
40
|
+
errors=$((errors + 1))
|
|
41
|
+
return
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
# Extract frontmatter (between first and second ---)
|
|
45
|
+
local frontmatter
|
|
46
|
+
frontmatter=$(awk 'NR==1{next} /^---$/{exit} {print}' "$file")
|
|
47
|
+
|
|
48
|
+
if [[ -z "$frontmatter" ]]; then
|
|
49
|
+
echo "ERROR $file: empty or malformed frontmatter"
|
|
50
|
+
errors=$((errors + 1))
|
|
51
|
+
return
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# 2. Check required frontmatter fields
|
|
55
|
+
for field in "${REQUIRED_FRONTMATTER[@]}"; do
|
|
56
|
+
if ! echo "$frontmatter" | grep -qE "^${field}:"; then
|
|
57
|
+
echo "ERROR $file: missing frontmatter field '${field}'"
|
|
58
|
+
errors=$((errors + 1))
|
|
59
|
+
fi
|
|
60
|
+
done
|
|
61
|
+
|
|
62
|
+
# 3. Check recommended sections (warn only)
|
|
63
|
+
local body
|
|
64
|
+
body=$(awk 'BEGIN{n=0} /^---$/{n++; next} n>=2{print}' "$file")
|
|
65
|
+
|
|
66
|
+
for section in "${RECOMMENDED_SECTIONS[@]}"; do
|
|
67
|
+
if ! echo "$body" | grep -qi "$section"; then
|
|
68
|
+
echo "WARN $file: missing recommended section '${section}'"
|
|
69
|
+
warnings=$((warnings + 1))
|
|
70
|
+
fi
|
|
71
|
+
done
|
|
72
|
+
|
|
73
|
+
# 4. Check file has meaningful content
|
|
74
|
+
if [[ $(echo "$body" | wc -w) -lt 50 ]]; then
|
|
75
|
+
echo "WARN $file: body seems very short (< 50 words)"
|
|
76
|
+
warnings=$((warnings + 1))
|
|
77
|
+
fi
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# Collect files to lint
|
|
81
|
+
files=()
|
|
82
|
+
if [[ $# -gt 0 ]]; then
|
|
83
|
+
files=("$@")
|
|
84
|
+
else
|
|
85
|
+
for dir in "${AGENT_DIRS[@]}"; do
|
|
86
|
+
if [[ -d "$dir" ]]; then
|
|
87
|
+
while IFS= read -r f; do
|
|
88
|
+
files+=("$f")
|
|
89
|
+
done < <(find "$dir" -maxdepth 1 -name "*.md" -type f | sort)
|
|
90
|
+
fi
|
|
91
|
+
done
|
|
92
|
+
fi
|
|
93
|
+
|
|
94
|
+
if [[ ${#files[@]} -eq 0 ]]; then
|
|
95
|
+
echo "No agent files found."
|
|
96
|
+
exit 1
|
|
97
|
+
fi
|
|
98
|
+
|
|
99
|
+
echo "Linting ${#files[@]} agent files..."
|
|
100
|
+
echo ""
|
|
101
|
+
|
|
102
|
+
for file in "${files[@]}"; do
|
|
103
|
+
lint_file "$file"
|
|
104
|
+
done
|
|
105
|
+
|
|
106
|
+
echo ""
|
|
107
|
+
echo "Results: ${errors} error(s), ${warnings} warning(s) in ${#files[@]} files."
|
|
108
|
+
|
|
109
|
+
if [[ $errors -gt 0 ]]; then
|
|
110
|
+
echo "FAILED: fix the errors above before merging."
|
|
111
|
+
exit 1
|
|
112
|
+
else
|
|
113
|
+
echo "PASSED"
|
|
114
|
+
exit 0
|
|
115
|
+
fi
|