@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.
Files changed (186) hide show
  1. package/CHANGELOG.md +87 -0
  2. package/dist/agents/checkpoint-manager.js +291 -0
  3. package/dist/agents/poolbot-tools.js +5 -0
  4. package/dist/agents/subagent-announce-reliability.js +160 -0
  5. package/dist/agents/tool-result-truncation.js +299 -0
  6. package/dist/agents/tools/nodes-file-tool.js +197 -0
  7. package/dist/build-info.json +3 -3
  8. package/dist/cli/config-cli.js +60 -0
  9. package/dist/cron/cron-improvements.js +195 -0
  10. package/dist/discord/discord-improvements.js +167 -0
  11. package/dist/gateway/auth-rate-limit.js +19 -0
  12. package/dist/gateway/auth.js +41 -0
  13. package/dist/gateway/gateway-improvements.js +294 -0
  14. package/dist/gateway/node-command-policy.js +7 -2
  15. package/dist/infra/net/ssrf.js +15 -2
  16. package/dist/infra/shell-security.js +201 -0
  17. package/dist/memory/memory-improvements.js +239 -0
  18. package/dist/node-host/runner.js +146 -79
  19. package/dist/security/prototype-pollution.js +141 -0
  20. package/dist/security/webhook-security.js +253 -0
  21. package/dist/shared/net/ip.js +52 -1
  22. package/dist/slack/slack-improvements.js +225 -0
  23. package/dist/telegram/telegram-improvements.js +220 -0
  24. package/dist/ui-plugins/ui-plugins-improvements.js +191 -0
  25. package/docs/ANALISE_OPENCLAW_PROFISSIONAL.md +520 -0
  26. package/docs/competitive-analysis.md +421 -0
  27. package/docs/implementation-analysis.md +393 -0
  28. package/docs/plans/2026-03-11-file-operations-security-hardening.md +307 -0
  29. package/docs/plans/2026-03-11-integracao-projetos-poolbot.md +666 -0
  30. package/extensions/agency-agents/README.md +301 -0
  31. package/extensions/agency-agents/agents/CONTRIBUTING.md +353 -0
  32. package/extensions/agency-agents/agents/README.md +602 -0
  33. package/extensions/agency-agents/agents/design/design-brand-guardian.md +320 -0
  34. package/extensions/agency-agents/agents/design/design-image-prompt-engineer.md +234 -0
  35. package/extensions/agency-agents/agents/design/design-ui-designer.md +381 -0
  36. package/extensions/agency-agents/agents/design/design-ux-architect.md +467 -0
  37. package/extensions/agency-agents/agents/design/design-ux-researcher.md +327 -0
  38. package/extensions/agency-agents/agents/design/design-visual-storyteller.md +147 -0
  39. package/extensions/agency-agents/agents/design/design-whimsy-injector.md +436 -0
  40. package/extensions/agency-agents/agents/engineering/engineering-ai-engineer.md +144 -0
  41. package/extensions/agency-agents/agents/engineering/engineering-backend-architect.md +233 -0
  42. package/extensions/agency-agents/agents/engineering/engineering-devops-automator.md +374 -0
  43. package/extensions/agency-agents/agents/engineering/engineering-frontend-developer.md +223 -0
  44. package/extensions/agency-agents/agents/engineering/engineering-mobile-app-builder.md +491 -0
  45. package/extensions/agency-agents/agents/engineering/engineering-rapid-prototyper.md +460 -0
  46. package/extensions/agency-agents/agents/engineering/engineering-security-engineer.md +275 -0
  47. package/extensions/agency-agents/agents/engineering/engineering-senior-developer.md +174 -0
  48. package/extensions/agency-agents/agents/examples/README.md +48 -0
  49. package/extensions/agency-agents/agents/examples/nexus-spatial-discovery.md +852 -0
  50. package/extensions/agency-agents/agents/examples/workflow-landing-page.md +119 -0
  51. package/extensions/agency-agents/agents/examples/workflow-startup-mvp.md +155 -0
  52. package/extensions/agency-agents/agents/integrations/README.md +117 -0
  53. package/extensions/agency-agents/agents/integrations/aider/README.md +38 -0
  54. package/extensions/agency-agents/agents/integrations/antigravity/README.md +49 -0
  55. package/extensions/agency-agents/agents/integrations/claude-code/README.md +31 -0
  56. package/extensions/agency-agents/agents/integrations/cursor/README.md +38 -0
  57. package/extensions/agency-agents/agents/integrations/gemini-cli/README.md +36 -0
  58. package/extensions/agency-agents/agents/integrations/opencode/README.md +58 -0
  59. package/extensions/agency-agents/agents/integrations/windsurf/README.md +26 -0
  60. package/extensions/agency-agents/agents/marketing/marketing-app-store-optimizer.md +319 -0
  61. package/extensions/agency-agents/agents/marketing/marketing-content-creator.md +52 -0
  62. package/extensions/agency-agents/agents/marketing/marketing-growth-hacker.md +52 -0
  63. package/extensions/agency-agents/agents/marketing/marketing-instagram-curator.md +111 -0
  64. package/extensions/agency-agents/agents/marketing/marketing-reddit-community-builder.md +121 -0
  65. package/extensions/agency-agents/agents/marketing/marketing-social-media-strategist.md +123 -0
  66. package/extensions/agency-agents/agents/marketing/marketing-tiktok-strategist.md +123 -0
  67. package/extensions/agency-agents/agents/marketing/marketing-twitter-engager.md +124 -0
  68. package/extensions/agency-agents/agents/marketing/marketing-wechat-official-account.md +143 -0
  69. package/extensions/agency-agents/agents/marketing/marketing-xiaohongshu-specialist.md +136 -0
  70. package/extensions/agency-agents/agents/marketing/marketing-zhihu-strategist.md +160 -0
  71. package/extensions/agency-agents/agents/product/product-feedback-synthesizer.md +117 -0
  72. package/extensions/agency-agents/agents/product/product-sprint-prioritizer.md +152 -0
  73. package/extensions/agency-agents/agents/product/product-trend-researcher.md +157 -0
  74. package/extensions/agency-agents/agents/project-management/project-management-experiment-tracker.md +196 -0
  75. package/extensions/agency-agents/agents/project-management/project-management-project-shepherd.md +192 -0
  76. package/extensions/agency-agents/agents/project-management/project-management-studio-operations.md +198 -0
  77. package/extensions/agency-agents/agents/project-management/project-management-studio-producer.md +201 -0
  78. package/extensions/agency-agents/agents/project-management/project-manager-senior.md +133 -0
  79. package/extensions/agency-agents/agents/scripts/convert.sh +362 -0
  80. package/extensions/agency-agents/agents/scripts/install.sh +465 -0
  81. package/extensions/agency-agents/agents/scripts/lint-agents.sh +115 -0
  82. package/extensions/agency-agents/agents/spatial-computing/macos-spatial-metal-engineer.md +335 -0
  83. package/extensions/agency-agents/agents/spatial-computing/terminal-integration-specialist.md +68 -0
  84. package/extensions/agency-agents/agents/spatial-computing/visionos-spatial-engineer.md +52 -0
  85. package/extensions/agency-agents/agents/spatial-computing/xr-cockpit-interaction-specialist.md +30 -0
  86. package/extensions/agency-agents/agents/spatial-computing/xr-immersive-developer.md +30 -0
  87. package/extensions/agency-agents/agents/spatial-computing/xr-interface-architect.md +30 -0
  88. package/extensions/agency-agents/agents/specialized/agentic-identity-trust.md +367 -0
  89. package/extensions/agency-agents/agents/specialized/agents-orchestrator.md +365 -0
  90. package/extensions/agency-agents/agents/specialized/data-analytics-reporter.md +52 -0
  91. package/extensions/agency-agents/agents/specialized/data-consolidation-agent.md +58 -0
  92. package/extensions/agency-agents/agents/specialized/lsp-index-engineer.md +312 -0
  93. package/extensions/agency-agents/agents/specialized/report-distribution-agent.md +63 -0
  94. package/extensions/agency-agents/agents/specialized/sales-data-extraction-agent.md +65 -0
  95. package/extensions/agency-agents/agents/strategy/EXECUTIVE-BRIEF.md +95 -0
  96. package/extensions/agency-agents/agents/strategy/QUICKSTART.md +194 -0
  97. package/extensions/agency-agents/agents/strategy/coordination/agent-activation-prompts.md +401 -0
  98. package/extensions/agency-agents/agents/strategy/coordination/handoff-templates.md +357 -0
  99. package/extensions/agency-agents/agents/strategy/nexus-strategy.md +1110 -0
  100. package/extensions/agency-agents/agents/strategy/playbooks/phase-0-discovery.md +178 -0
  101. package/extensions/agency-agents/agents/strategy/playbooks/phase-1-strategy.md +238 -0
  102. package/extensions/agency-agents/agents/strategy/playbooks/phase-2-foundation.md +278 -0
  103. package/extensions/agency-agents/agents/strategy/playbooks/phase-3-build.md +286 -0
  104. package/extensions/agency-agents/agents/strategy/playbooks/phase-4-hardening.md +332 -0
  105. package/extensions/agency-agents/agents/strategy/playbooks/phase-5-launch.md +277 -0
  106. package/extensions/agency-agents/agents/strategy/playbooks/phase-6-operate.md +318 -0
  107. package/extensions/agency-agents/agents/strategy/runbooks/scenario-enterprise-feature.md +157 -0
  108. package/extensions/agency-agents/agents/strategy/runbooks/scenario-incident-response.md +217 -0
  109. package/extensions/agency-agents/agents/strategy/runbooks/scenario-marketing-campaign.md +187 -0
  110. package/extensions/agency-agents/agents/strategy/runbooks/scenario-startup-mvp.md +154 -0
  111. package/extensions/agency-agents/agents/support/support-analytics-reporter.md +363 -0
  112. package/extensions/agency-agents/agents/support/support-executive-summary-generator.md +210 -0
  113. package/extensions/agency-agents/agents/support/support-finance-tracker.md +440 -0
  114. package/extensions/agency-agents/agents/support/support-infrastructure-maintainer.md +616 -0
  115. package/extensions/agency-agents/agents/support/support-legal-compliance-checker.md +586 -0
  116. package/extensions/agency-agents/agents/support/support-support-responder.md +583 -0
  117. package/extensions/agency-agents/agents/testing/testing-accessibility-auditor.md +313 -0
  118. package/extensions/agency-agents/agents/testing/testing-api-tester.md +304 -0
  119. package/extensions/agency-agents/agents/testing/testing-evidence-collector.md +208 -0
  120. package/extensions/agency-agents/agents/testing/testing-performance-benchmarker.md +266 -0
  121. package/extensions/agency-agents/agents/testing/testing-reality-checker.md +236 -0
  122. package/extensions/agency-agents/agents/testing/testing-test-results-analyzer.md +303 -0
  123. package/extensions/agency-agents/agents/testing/testing-tool-evaluator.md +392 -0
  124. package/extensions/agency-agents/agents/testing/testing-workflow-optimizer.md +448 -0
  125. package/extensions/agency-agents/index.ts +733 -0
  126. package/extensions/agency-agents/node_modules/.bin/jiti +21 -0
  127. package/extensions/agency-agents/node_modules/.bin/tsc +21 -0
  128. package/extensions/agency-agents/node_modules/.bin/tsserver +21 -0
  129. package/extensions/agency-agents/node_modules/.bin/tsx +21 -0
  130. package/extensions/agency-agents/node_modules/.bin/vite +21 -0
  131. package/extensions/agency-agents/node_modules/.bin/vitest +21 -0
  132. package/extensions/agency-agents/node_modules/.bin/yaml +21 -0
  133. package/extensions/agency-agents/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  134. package/extensions/agency-agents/package.json +25 -0
  135. package/extensions/agency-agents/poolbot.plugin.json +11 -0
  136. package/extensions/agency-agents/src/AgencyAgentsService.test.ts +443 -0
  137. package/extensions/agency-agents/src/AgencyAgentsService.ts +288 -0
  138. package/extensions/agency-agents/src/types.ts +147 -0
  139. package/extensions/agency-agents/vitest.config.ts +8 -0
  140. package/extensions/hexstrike-ai/README.md +98 -0
  141. package/extensions/hexstrike-ai/node_modules/.bin/tsc +21 -0
  142. package/extensions/hexstrike-ai/node_modules/.bin/tsserver +21 -0
  143. package/extensions/hexstrike-ai/package.json +29 -0
  144. package/extensions/hexstrike-ai/poolbot.plugin.json +31 -0
  145. package/extensions/hexstrike-ai/src/client.ts +91 -0
  146. package/extensions/hexstrike-ai/src/index.ts +170 -0
  147. package/extensions/hexstrike-ai/src/server/hexstrike_mcp.py +5470 -0
  148. package/extensions/hexstrike-ai/src/server/hexstrike_server.py +17289 -0
  149. package/extensions/hexstrike-ai/src/server/requirements.txt +84 -0
  150. package/extensions/hexstrike-ai/src/server-manager.ts +83 -0
  151. package/extensions/hexstrike-ai/tsconfig.json +20 -0
  152. package/extensions/page-agent/README.md +159 -0
  153. package/extensions/page-agent/index.ts +595 -0
  154. package/extensions/page-agent/node_modules/.bin/jiti +21 -0
  155. package/extensions/page-agent/node_modules/.bin/playwright +21 -0
  156. package/extensions/page-agent/node_modules/.bin/tsc +21 -0
  157. package/extensions/page-agent/node_modules/.bin/tsserver +21 -0
  158. package/extensions/page-agent/node_modules/.bin/tsx +21 -0
  159. package/extensions/page-agent/node_modules/.bin/vitest +21 -0
  160. package/extensions/page-agent/node_modules/.bin/yaml +21 -0
  161. package/extensions/page-agent/package.json +43 -0
  162. package/extensions/page-agent/poolbot.plugin.json +24 -0
  163. package/extensions/page-agent/src/PageAgentService.test.ts +517 -0
  164. package/extensions/page-agent/src/PageAgentService.ts +636 -0
  165. package/extensions/page-agent/src/PoolBotPageController.test.ts +358 -0
  166. package/extensions/page-agent/src/PoolBotPageController.ts +245 -0
  167. package/extensions/page-agent/src/index.ts +20 -0
  168. package/extensions/page-agent/src/tools.test.ts +231 -0
  169. package/extensions/page-agent/src/tools.ts +167 -0
  170. package/extensions/page-agent/src/types.ts +198 -0
  171. package/extensions/xyops/README.md +227 -0
  172. package/extensions/xyops/index.ts +342 -0
  173. package/extensions/xyops/node_modules/.bin/jiti +21 -0
  174. package/extensions/xyops/node_modules/.bin/tsc +21 -0
  175. package/extensions/xyops/node_modules/.bin/tsserver +21 -0
  176. package/extensions/xyops/node_modules/.bin/tsx +21 -0
  177. package/extensions/xyops/node_modules/.bin/vitest +21 -0
  178. package/extensions/xyops/node_modules/.bin/yaml +21 -0
  179. package/extensions/xyops/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
  180. package/extensions/xyops/package.json +39 -0
  181. package/extensions/xyops/poolbot.plugin.json +21 -0
  182. package/extensions/xyops/src/client.test.ts +467 -0
  183. package/extensions/xyops/src/client.ts +157 -0
  184. package/extensions/xyops/src/types.ts +147 -0
  185. package/extensions/xyops/vitest.config.ts +8 -0
  186. 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