aidevops 2.52.1

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 (329) hide show
  1. package/.agent/AGENTS.md +614 -0
  2. package/.agent/accounts.md +65 -0
  3. package/.agent/aidevops/add-new-mcp-to-aidevops.md +456 -0
  4. package/.agent/aidevops/api-integrations.md +335 -0
  5. package/.agent/aidevops/architecture.md +510 -0
  6. package/.agent/aidevops/configs.md +274 -0
  7. package/.agent/aidevops/docs.md +244 -0
  8. package/.agent/aidevops/extension.md +311 -0
  9. package/.agent/aidevops/mcp-integrations.md +340 -0
  10. package/.agent/aidevops/mcp-troubleshooting.md +162 -0
  11. package/.agent/aidevops/memory-patterns.md +172 -0
  12. package/.agent/aidevops/providers.md +217 -0
  13. package/.agent/aidevops/recommendations.md +321 -0
  14. package/.agent/aidevops/requirements.md +301 -0
  15. package/.agent/aidevops/resources.md +214 -0
  16. package/.agent/aidevops/security-requirements.md +174 -0
  17. package/.agent/aidevops/security.md +350 -0
  18. package/.agent/aidevops/service-links.md +400 -0
  19. package/.agent/aidevops/services.md +357 -0
  20. package/.agent/aidevops/setup.md +153 -0
  21. package/.agent/aidevops/troubleshooting.md +389 -0
  22. package/.agent/aidevops.md +124 -0
  23. package/.agent/build-plus.md +244 -0
  24. package/.agent/content/guidelines.md +109 -0
  25. package/.agent/content.md +87 -0
  26. package/.agent/health.md +59 -0
  27. package/.agent/legal.md +59 -0
  28. package/.agent/loop-state/full-loop.local.md +16 -0
  29. package/.agent/loop-state/ralph-loop.local.md +10 -0
  30. package/.agent/marketing.md +440 -0
  31. package/.agent/memory/README.md +260 -0
  32. package/.agent/onboarding.md +796 -0
  33. package/.agent/plan-plus.md +245 -0
  34. package/.agent/research.md +100 -0
  35. package/.agent/sales.md +333 -0
  36. package/.agent/scripts/101domains-helper.sh +701 -0
  37. package/.agent/scripts/add-missing-returns.sh +140 -0
  38. package/.agent/scripts/agent-browser-helper.sh +311 -0
  39. package/.agent/scripts/agno-setup.sh +712 -0
  40. package/.agent/scripts/ahrefs-mcp-wrapper.js +168 -0
  41. package/.agent/scripts/aidevops-update-check.sh +71 -0
  42. package/.agent/scripts/ampcode-cli.sh +522 -0
  43. package/.agent/scripts/auto-version-bump.sh +156 -0
  44. package/.agent/scripts/autogen-helper.sh +512 -0
  45. package/.agent/scripts/beads-sync-helper.sh +596 -0
  46. package/.agent/scripts/closte-helper.sh +5 -0
  47. package/.agent/scripts/cloudron-helper.sh +321 -0
  48. package/.agent/scripts/codacy-cli-chunked.sh +581 -0
  49. package/.agent/scripts/codacy-cli.sh +442 -0
  50. package/.agent/scripts/code-audit-helper.sh +5 -0
  51. package/.agent/scripts/coderabbit-cli.sh +417 -0
  52. package/.agent/scripts/coderabbit-pro-analysis.sh +238 -0
  53. package/.agent/scripts/commands/code-simplifier.md +86 -0
  54. package/.agent/scripts/commands/full-loop.md +246 -0
  55. package/.agent/scripts/commands/postflight-loop.md +103 -0
  56. package/.agent/scripts/commands/recall.md +182 -0
  57. package/.agent/scripts/commands/remember.md +132 -0
  58. package/.agent/scripts/commands/save-todo.md +175 -0
  59. package/.agent/scripts/commands/session-review.md +154 -0
  60. package/.agent/scripts/comprehensive-quality-fix.sh +106 -0
  61. package/.agent/scripts/context-builder-helper.sh +522 -0
  62. package/.agent/scripts/coolify-cli-helper.sh +674 -0
  63. package/.agent/scripts/coolify-helper.sh +380 -0
  64. package/.agent/scripts/crawl4ai-examples.sh +401 -0
  65. package/.agent/scripts/crawl4ai-helper.sh +1078 -0
  66. package/.agent/scripts/crewai-helper.sh +681 -0
  67. package/.agent/scripts/dev-browser-helper.sh +513 -0
  68. package/.agent/scripts/dns-helper.sh +396 -0
  69. package/.agent/scripts/domain-research-helper.sh +917 -0
  70. package/.agent/scripts/dspy-helper.sh +285 -0
  71. package/.agent/scripts/dspyground-helper.sh +291 -0
  72. package/.agent/scripts/eeat-score-helper.sh +1242 -0
  73. package/.agent/scripts/efficient-return-fix.sh +92 -0
  74. package/.agent/scripts/extract-opencode-prompts.sh +128 -0
  75. package/.agent/scripts/find-missing-returns.sh +113 -0
  76. package/.agent/scripts/fix-auth-headers.sh +104 -0
  77. package/.agent/scripts/fix-common-strings.sh +254 -0
  78. package/.agent/scripts/fix-content-type.sh +100 -0
  79. package/.agent/scripts/fix-error-messages.sh +130 -0
  80. package/.agent/scripts/fix-misplaced-returns.sh +74 -0
  81. package/.agent/scripts/fix-remaining-literals.sh +152 -0
  82. package/.agent/scripts/fix-return-statements.sh +41 -0
  83. package/.agent/scripts/fix-s131-default-cases.sh +249 -0
  84. package/.agent/scripts/fix-sc2155-simple.sh +102 -0
  85. package/.agent/scripts/fix-shellcheck-critical.sh +187 -0
  86. package/.agent/scripts/fix-string-literals.sh +273 -0
  87. package/.agent/scripts/full-loop-helper.sh +773 -0
  88. package/.agent/scripts/generate-opencode-agents.sh +497 -0
  89. package/.agent/scripts/generate-opencode-commands.sh +1629 -0
  90. package/.agent/scripts/generate-skills.sh +366 -0
  91. package/.agent/scripts/git-platforms-helper.sh +640 -0
  92. package/.agent/scripts/gitea-cli-helper.sh +743 -0
  93. package/.agent/scripts/github-cli-helper.sh +702 -0
  94. package/.agent/scripts/gitlab-cli-helper.sh +682 -0
  95. package/.agent/scripts/gsc-add-user-helper.sh +325 -0
  96. package/.agent/scripts/gsc-sitemap-helper.sh +678 -0
  97. package/.agent/scripts/hetzner-helper.sh +485 -0
  98. package/.agent/scripts/hostinger-helper.sh +229 -0
  99. package/.agent/scripts/keyword-research-helper.sh +1815 -0
  100. package/.agent/scripts/langflow-helper.sh +544 -0
  101. package/.agent/scripts/linkedin-automation.py +241 -0
  102. package/.agent/scripts/linter-manager.sh +599 -0
  103. package/.agent/scripts/linters-local.sh +434 -0
  104. package/.agent/scripts/list-keys-helper.sh +488 -0
  105. package/.agent/scripts/local-browser-automation.py +339 -0
  106. package/.agent/scripts/localhost-helper.sh +744 -0
  107. package/.agent/scripts/loop-common.sh +806 -0
  108. package/.agent/scripts/mainwp-helper.sh +728 -0
  109. package/.agent/scripts/markdown-formatter.sh +338 -0
  110. package/.agent/scripts/markdown-lint-fix.sh +311 -0
  111. package/.agent/scripts/mass-fix-returns.sh +58 -0
  112. package/.agent/scripts/mcp-diagnose.sh +167 -0
  113. package/.agent/scripts/mcp-inspector-helper.sh +449 -0
  114. package/.agent/scripts/memory-helper.sh +650 -0
  115. package/.agent/scripts/monitor-code-review.sh +255 -0
  116. package/.agent/scripts/onboarding-helper.sh +706 -0
  117. package/.agent/scripts/opencode-github-setup-helper.sh +797 -0
  118. package/.agent/scripts/opencode-test-helper.sh +213 -0
  119. package/.agent/scripts/pagespeed-helper.sh +464 -0
  120. package/.agent/scripts/pandoc-helper.sh +362 -0
  121. package/.agent/scripts/postflight-check.sh +555 -0
  122. package/.agent/scripts/pre-commit-hook.sh +259 -0
  123. package/.agent/scripts/pre-edit-check.sh +169 -0
  124. package/.agent/scripts/qlty-cli.sh +356 -0
  125. package/.agent/scripts/quality-cli-manager.sh +525 -0
  126. package/.agent/scripts/quality-feedback-helper.sh +462 -0
  127. package/.agent/scripts/quality-fix.sh +263 -0
  128. package/.agent/scripts/quality-loop-helper.sh +1108 -0
  129. package/.agent/scripts/ralph-loop-helper.sh +836 -0
  130. package/.agent/scripts/ralph-upstream-check.sh +341 -0
  131. package/.agent/scripts/secretlint-helper.sh +847 -0
  132. package/.agent/scripts/servers-helper.sh +241 -0
  133. package/.agent/scripts/ses-helper.sh +619 -0
  134. package/.agent/scripts/session-review-helper.sh +404 -0
  135. package/.agent/scripts/setup-linters-wizard.sh +379 -0
  136. package/.agent/scripts/setup-local-api-keys.sh +330 -0
  137. package/.agent/scripts/setup-mcp-integrations.sh +472 -0
  138. package/.agent/scripts/shared-constants.sh +246 -0
  139. package/.agent/scripts/site-crawler-helper.sh +1487 -0
  140. package/.agent/scripts/snyk-helper.sh +940 -0
  141. package/.agent/scripts/sonarcloud-autofix.sh +193 -0
  142. package/.agent/scripts/sonarcloud-cli.sh +191 -0
  143. package/.agent/scripts/sonarscanner-cli.sh +455 -0
  144. package/.agent/scripts/spaceship-helper.sh +747 -0
  145. package/.agent/scripts/stagehand-helper.sh +321 -0
  146. package/.agent/scripts/stagehand-python-helper.sh +321 -0
  147. package/.agent/scripts/stagehand-python-setup.sh +441 -0
  148. package/.agent/scripts/stagehand-setup.sh +439 -0
  149. package/.agent/scripts/system-cleanup.sh +340 -0
  150. package/.agent/scripts/terminal-title-helper.sh +388 -0
  151. package/.agent/scripts/terminal-title-setup.sh +549 -0
  152. package/.agent/scripts/test-stagehand-both-integration.sh +317 -0
  153. package/.agent/scripts/test-stagehand-integration.sh +309 -0
  154. package/.agent/scripts/test-stagehand-python-integration.sh +341 -0
  155. package/.agent/scripts/todo-ready.sh +263 -0
  156. package/.agent/scripts/tool-version-check.sh +362 -0
  157. package/.agent/scripts/toon-helper.sh +469 -0
  158. package/.agent/scripts/twilio-helper.sh +917 -0
  159. package/.agent/scripts/updown-helper.sh +279 -0
  160. package/.agent/scripts/validate-mcp-integrations.sh +250 -0
  161. package/.agent/scripts/validate-version-consistency.sh +131 -0
  162. package/.agent/scripts/vaultwarden-helper.sh +597 -0
  163. package/.agent/scripts/vercel-cli-helper.sh +816 -0
  164. package/.agent/scripts/verify-mirrors.sh +169 -0
  165. package/.agent/scripts/version-manager.sh +831 -0
  166. package/.agent/scripts/webhosting-helper.sh +471 -0
  167. package/.agent/scripts/webhosting-verify.sh +238 -0
  168. package/.agent/scripts/wordpress-mcp-helper.sh +508 -0
  169. package/.agent/scripts/worktree-helper.sh +595 -0
  170. package/.agent/scripts/worktree-sessions.sh +577 -0
  171. package/.agent/seo/dataforseo.md +215 -0
  172. package/.agent/seo/domain-research.md +532 -0
  173. package/.agent/seo/eeat-score.md +659 -0
  174. package/.agent/seo/google-search-console.md +366 -0
  175. package/.agent/seo/gsc-sitemaps.md +282 -0
  176. package/.agent/seo/keyword-research.md +521 -0
  177. package/.agent/seo/serper.md +278 -0
  178. package/.agent/seo/site-crawler.md +387 -0
  179. package/.agent/seo.md +236 -0
  180. package/.agent/services/accounting/quickfile.md +159 -0
  181. package/.agent/services/communications/telfon.md +470 -0
  182. package/.agent/services/communications/twilio.md +569 -0
  183. package/.agent/services/crm/fluentcrm.md +449 -0
  184. package/.agent/services/email/ses.md +399 -0
  185. package/.agent/services/hosting/101domains.md +378 -0
  186. package/.agent/services/hosting/closte.md +177 -0
  187. package/.agent/services/hosting/cloudflare.md +251 -0
  188. package/.agent/services/hosting/cloudron.md +478 -0
  189. package/.agent/services/hosting/dns-providers.md +335 -0
  190. package/.agent/services/hosting/domain-purchasing.md +344 -0
  191. package/.agent/services/hosting/hetzner.md +327 -0
  192. package/.agent/services/hosting/hostinger.md +287 -0
  193. package/.agent/services/hosting/localhost.md +419 -0
  194. package/.agent/services/hosting/spaceship.md +353 -0
  195. package/.agent/services/hosting/webhosting.md +330 -0
  196. package/.agent/social-media.md +69 -0
  197. package/.agent/templates/plans-template.md +114 -0
  198. package/.agent/templates/prd-template.md +129 -0
  199. package/.agent/templates/tasks-template.md +108 -0
  200. package/.agent/templates/todo-template.md +89 -0
  201. package/.agent/tools/ai-assistants/agno.md +471 -0
  202. package/.agent/tools/ai-assistants/capsolver.md +326 -0
  203. package/.agent/tools/ai-assistants/configuration.md +221 -0
  204. package/.agent/tools/ai-assistants/overview.md +209 -0
  205. package/.agent/tools/ai-assistants/status.md +171 -0
  206. package/.agent/tools/ai-assistants/windsurf.md +193 -0
  207. package/.agent/tools/ai-orchestration/autogen.md +406 -0
  208. package/.agent/tools/ai-orchestration/crewai.md +445 -0
  209. package/.agent/tools/ai-orchestration/langflow.md +405 -0
  210. package/.agent/tools/ai-orchestration/openprose.md +487 -0
  211. package/.agent/tools/ai-orchestration/overview.md +362 -0
  212. package/.agent/tools/ai-orchestration/packaging.md +647 -0
  213. package/.agent/tools/browser/agent-browser.md +464 -0
  214. package/.agent/tools/browser/browser-automation.md +400 -0
  215. package/.agent/tools/browser/chrome-devtools.md +282 -0
  216. package/.agent/tools/browser/crawl4ai-integration.md +422 -0
  217. package/.agent/tools/browser/crawl4ai-resources.md +277 -0
  218. package/.agent/tools/browser/crawl4ai-usage.md +416 -0
  219. package/.agent/tools/browser/crawl4ai.md +585 -0
  220. package/.agent/tools/browser/dev-browser.md +341 -0
  221. package/.agent/tools/browser/pagespeed.md +260 -0
  222. package/.agent/tools/browser/playwright.md +266 -0
  223. package/.agent/tools/browser/playwriter.md +310 -0
  224. package/.agent/tools/browser/stagehand-examples.md +456 -0
  225. package/.agent/tools/browser/stagehand-python.md +483 -0
  226. package/.agent/tools/browser/stagehand.md +421 -0
  227. package/.agent/tools/build-agent/agent-review.md +224 -0
  228. package/.agent/tools/build-agent/build-agent.md +784 -0
  229. package/.agent/tools/build-mcp/aidevops-plugin.md +476 -0
  230. package/.agent/tools/build-mcp/api-wrapper.md +445 -0
  231. package/.agent/tools/build-mcp/build-mcp.md +240 -0
  232. package/.agent/tools/build-mcp/deployment.md +401 -0
  233. package/.agent/tools/build-mcp/server-patterns.md +632 -0
  234. package/.agent/tools/build-mcp/transports.md +366 -0
  235. package/.agent/tools/code-review/auditing.md +383 -0
  236. package/.agent/tools/code-review/automation.md +219 -0
  237. package/.agent/tools/code-review/best-practices.md +203 -0
  238. package/.agent/tools/code-review/codacy.md +151 -0
  239. package/.agent/tools/code-review/code-simplifier.md +174 -0
  240. package/.agent/tools/code-review/code-standards.md +309 -0
  241. package/.agent/tools/code-review/coderabbit.md +101 -0
  242. package/.agent/tools/code-review/management.md +155 -0
  243. package/.agent/tools/code-review/qlty.md +248 -0
  244. package/.agent/tools/code-review/secretlint.md +565 -0
  245. package/.agent/tools/code-review/setup.md +250 -0
  246. package/.agent/tools/code-review/snyk.md +563 -0
  247. package/.agent/tools/code-review/tools.md +230 -0
  248. package/.agent/tools/content/summarize.md +353 -0
  249. package/.agent/tools/context/augment-context-engine.md +468 -0
  250. package/.agent/tools/context/context-builder-agent.md +76 -0
  251. package/.agent/tools/context/context-builder.md +375 -0
  252. package/.agent/tools/context/context7.md +371 -0
  253. package/.agent/tools/context/dspy.md +302 -0
  254. package/.agent/tools/context/dspyground.md +374 -0
  255. package/.agent/tools/context/llm-tldr.md +219 -0
  256. package/.agent/tools/context/osgrep.md +488 -0
  257. package/.agent/tools/context/prompt-optimization.md +338 -0
  258. package/.agent/tools/context/toon.md +292 -0
  259. package/.agent/tools/conversion/pandoc.md +304 -0
  260. package/.agent/tools/credentials/api-key-management.md +154 -0
  261. package/.agent/tools/credentials/api-key-setup.md +224 -0
  262. package/.agent/tools/credentials/environment-variables.md +180 -0
  263. package/.agent/tools/credentials/vaultwarden.md +382 -0
  264. package/.agent/tools/data-extraction/outscraper.md +974 -0
  265. package/.agent/tools/deployment/coolify-cli.md +388 -0
  266. package/.agent/tools/deployment/coolify-setup.md +353 -0
  267. package/.agent/tools/deployment/coolify.md +345 -0
  268. package/.agent/tools/deployment/vercel.md +390 -0
  269. package/.agent/tools/git/authentication.md +132 -0
  270. package/.agent/tools/git/gitea-cli.md +193 -0
  271. package/.agent/tools/git/github-actions.md +207 -0
  272. package/.agent/tools/git/github-cli.md +223 -0
  273. package/.agent/tools/git/gitlab-cli.md +190 -0
  274. package/.agent/tools/git/opencode-github-security.md +350 -0
  275. package/.agent/tools/git/opencode-github.md +328 -0
  276. package/.agent/tools/git/opencode-gitlab.md +252 -0
  277. package/.agent/tools/git/security.md +196 -0
  278. package/.agent/tools/git.md +207 -0
  279. package/.agent/tools/opencode/oh-my-opencode.md +375 -0
  280. package/.agent/tools/opencode/opencode-anthropic-auth.md +446 -0
  281. package/.agent/tools/opencode/opencode.md +651 -0
  282. package/.agent/tools/social-media/bird.md +437 -0
  283. package/.agent/tools/task-management/beads.md +336 -0
  284. package/.agent/tools/terminal/terminal-title.md +251 -0
  285. package/.agent/tools/ui/shadcn.md +196 -0
  286. package/.agent/tools/ui/ui-skills.md +115 -0
  287. package/.agent/tools/wordpress/localwp.md +311 -0
  288. package/.agent/tools/wordpress/mainwp.md +391 -0
  289. package/.agent/tools/wordpress/scf.md +527 -0
  290. package/.agent/tools/wordpress/wp-admin.md +729 -0
  291. package/.agent/tools/wordpress/wp-dev.md +940 -0
  292. package/.agent/tools/wordpress/wp-preferred.md +398 -0
  293. package/.agent/tools/wordpress.md +95 -0
  294. package/.agent/workflows/branch/bugfix.md +63 -0
  295. package/.agent/workflows/branch/chore.md +95 -0
  296. package/.agent/workflows/branch/experiment.md +115 -0
  297. package/.agent/workflows/branch/feature.md +59 -0
  298. package/.agent/workflows/branch/hotfix.md +98 -0
  299. package/.agent/workflows/branch/refactor.md +92 -0
  300. package/.agent/workflows/branch/release.md +96 -0
  301. package/.agent/workflows/branch.md +347 -0
  302. package/.agent/workflows/bug-fixing.md +267 -0
  303. package/.agent/workflows/changelog.md +129 -0
  304. package/.agent/workflows/code-audit-remote.md +279 -0
  305. package/.agent/workflows/conversation-starter.md +69 -0
  306. package/.agent/workflows/error-feedback.md +578 -0
  307. package/.agent/workflows/feature-development.md +355 -0
  308. package/.agent/workflows/git-workflow.md +702 -0
  309. package/.agent/workflows/multi-repo-workspace.md +268 -0
  310. package/.agent/workflows/plans.md +709 -0
  311. package/.agent/workflows/postflight.md +604 -0
  312. package/.agent/workflows/pr.md +571 -0
  313. package/.agent/workflows/preflight.md +278 -0
  314. package/.agent/workflows/ralph-loop.md +773 -0
  315. package/.agent/workflows/release.md +498 -0
  316. package/.agent/workflows/session-manager.md +254 -0
  317. package/.agent/workflows/session-review.md +311 -0
  318. package/.agent/workflows/sql-migrations.md +631 -0
  319. package/.agent/workflows/version-bump.md +283 -0
  320. package/.agent/workflows/wiki-update.md +333 -0
  321. package/.agent/workflows/worktree.md +477 -0
  322. package/LICENSE +21 -0
  323. package/README.md +1446 -0
  324. package/VERSION +1 -0
  325. package/aidevops.sh +1746 -0
  326. package/bin/aidevops +21 -0
  327. package/package.json +75 -0
  328. package/scripts/npm-postinstall.js +60 -0
  329. package/setup.sh +2366 -0
@@ -0,0 +1,366 @@
1
+ #!/bin/bash
2
+ # shellcheck disable=SC2329
3
+ # =============================================================================
4
+ # Generate Agent Skills SKILL.md Files
5
+ # =============================================================================
6
+ # Creates SKILL.md index files for Agent Skills compatibility while maintaining
7
+ # the aidevops pattern of {name}.md + {name}/ folder structure.
8
+ #
9
+ # This script generates lightweight SKILL.md stubs that reference the actual
10
+ # content in existing .md files, enabling cross-tool compatibility with:
11
+ # - OpenCode, Cursor, Claude Code, VS Code, GitHub Copilot, etc.
12
+ #
13
+ # Pattern:
14
+ # wordpress.md + wordpress/ → wordpress/SKILL.md (generated)
15
+ # wordpress/wp-dev.md → wordpress/wp-dev/SKILL.md (generated)
16
+ #
17
+ # Usage:
18
+ # ./generate-skills.sh [--dry-run] [--clean]
19
+ #
20
+ # Options:
21
+ # --dry-run Show what would be generated without writing files
22
+ # --clean Remove all generated SKILL.md files
23
+ # =============================================================================
24
+
25
+ set -euo pipefail
26
+
27
+ # Configuration
28
+ AGENTS_DIR="${AIDEVOPS_AGENTS_DIR:-$HOME/.aidevops/agents}"
29
+ DRY_RUN=false
30
+ CLEAN=false
31
+
32
+ # Colors
33
+ GREEN='\033[0;32m'
34
+ BLUE='\033[0;34m'
35
+ YELLOW='\033[1;33m'
36
+ RED='\033[0;31m'
37
+ NC='\033[0m'
38
+
39
+ # Parse arguments
40
+ while [[ $# -gt 0 ]]; do
41
+ case $1 in
42
+ --dry-run)
43
+ DRY_RUN=true
44
+ shift
45
+ ;;
46
+ --clean)
47
+ CLEAN=true
48
+ shift
49
+ ;;
50
+ *)
51
+ echo -e "${RED}Unknown option: $1${NC}"
52
+ exit 1
53
+ ;;
54
+ esac
55
+ done
56
+
57
+ # =============================================================================
58
+ # Helper Functions
59
+ # =============================================================================
60
+
61
+ log_info() {
62
+ echo -e "${BLUE}$1${NC}"
63
+ return 0
64
+ }
65
+
66
+ log_success() {
67
+ echo -e "${GREEN}✓${NC} $1"
68
+ return 0
69
+ }
70
+
71
+ log_warning() {
72
+ echo -e "${YELLOW}⚠${NC} $1"
73
+ return 0
74
+ }
75
+
76
+ log_error() {
77
+ echo -e "${RED}✗${NC} $1"
78
+ return 0
79
+ }
80
+
81
+ # Extract frontmatter field from markdown file
82
+ extract_frontmatter_field() {
83
+ local file="$1"
84
+ local field="$2"
85
+
86
+ if [[ ! -f "$file" ]]; then
87
+ return 1
88
+ fi
89
+
90
+ # Extract value between --- markers
91
+ awk -v field="$field" '
92
+ /^---$/ { in_frontmatter = !in_frontmatter; next }
93
+ in_frontmatter && $0 ~ "^" field ":" {
94
+ sub("^" field ": *", "")
95
+ gsub(/^["'"'"']|["'"'"']$/, "") # Remove quotes
96
+ print
97
+ exit
98
+ }
99
+ ' "$file"
100
+ return 0
101
+ }
102
+
103
+ # Extract description from file - tries frontmatter first, then first heading
104
+ extract_description() {
105
+ local file="$1"
106
+ local desc
107
+
108
+ # Try frontmatter first
109
+ desc=$(extract_frontmatter_field "$file" "description")
110
+ if [[ -n "$desc" ]]; then
111
+ echo "$desc"
112
+ return
113
+ fi
114
+
115
+ # Try first heading (# Title - Description pattern or just # Title)
116
+ local heading
117
+ heading=$(grep -m1 "^# " "$file" 2>/dev/null | sed 's/^# //')
118
+ if [[ -n "$heading" ]]; then
119
+ # If heading has " - ", take the part after
120
+ if [[ "$heading" == *" - "* ]]; then
121
+ echo "${heading#* - }"
122
+ else
123
+ echo "$heading"
124
+ fi
125
+ return
126
+ fi
127
+
128
+ # Fallback to filename
129
+ echo "$(basename "$file" .md) skill"
130
+ }
131
+
132
+ # Convert name to valid skill name (lowercase, hyphens only)
133
+ to_skill_name() {
134
+ local name="$1"
135
+ echo "$name" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]/-/g' | sed 's/--*/-/g' | sed 's/^-\|-$//g'
136
+ return 0
137
+ }
138
+
139
+ # Capitalize first letter (portable)
140
+ capitalize() {
141
+ local str="$1"
142
+ local first
143
+ local rest
144
+ first=$(echo "$str" | cut -c1 | tr '[:lower:]' '[:upper:]')
145
+ rest=$(echo "$str" | cut -c2-)
146
+ echo "${first}${rest}"
147
+ return 0
148
+ }
149
+
150
+ # Generate SKILL.md content for a folder with parent .md
151
+ generate_folder_skill() {
152
+ local folder_path="$1"
153
+ local parent_md="$2"
154
+ local folder_name
155
+ folder_name=$(basename "$folder_path")
156
+ local skill_name
157
+ skill_name=$(to_skill_name "$folder_name")
158
+
159
+ # Extract description from parent .md
160
+ local description
161
+ description=$(extract_description "$parent_md")
162
+
163
+ # List subskills in folder
164
+ local subskills=""
165
+ while IFS= read -r subfile; do
166
+ if [[ -n "$subfile" ]]; then
167
+ local subname
168
+ subname=$(basename "$subfile" .md)
169
+ local subdesc
170
+ subdesc=$(extract_frontmatter_field "$subfile" "description")
171
+ if [[ -n "$subdesc" ]]; then
172
+ subskills="${subskills}
173
+ - ${subname}: ${subdesc}"
174
+ else
175
+ subskills="${subskills}
176
+ - ${subname}"
177
+ fi
178
+ fi
179
+ done < <(find "$folder_path" -maxdepth 1 -name "*.md" -not -name "SKILL.md" -type f 2>/dev/null | sort)
180
+
181
+ # Generate SKILL.md content
182
+ local title
183
+ title=$(capitalize "$folder_name")
184
+
185
+ echo "---"
186
+ echo "name: ${skill_name}"
187
+ echo "description: ${description}"
188
+ echo "---"
189
+ echo ""
190
+ echo "# ${title}"
191
+ echo ""
192
+ echo "See [${folder_name}.md](../${folder_name}.md) for full instructions."
193
+ if [[ -n "$subskills" ]]; then
194
+ echo ""
195
+ echo "## Subskills"
196
+ echo "$subskills"
197
+ fi
198
+ return 0
199
+ }
200
+
201
+ # Generate SKILL.md content for a leaf .md file
202
+ generate_leaf_skill() {
203
+ local md_file="$1"
204
+ local filename
205
+ filename=$(basename "$md_file" .md)
206
+ local skill_name
207
+ skill_name=$(to_skill_name "$filename")
208
+
209
+ # Extract description
210
+ local description
211
+ description=$(extract_description "$md_file")
212
+
213
+ # Get relative path to the .md file from the new folder
214
+ local relative_path="../${filename}.md"
215
+
216
+ local title
217
+ title=$(capitalize "$filename")
218
+
219
+ echo "---"
220
+ echo "name: ${skill_name}"
221
+ echo "description: ${description}"
222
+ echo "---"
223
+ echo ""
224
+ echo "# ${title}"
225
+ echo ""
226
+ echo "See [${filename}.md](${relative_path}) for full instructions."
227
+ return 0
228
+ }
229
+
230
+ # =============================================================================
231
+ # Clean Mode
232
+ # =============================================================================
233
+
234
+ if [[ "$CLEAN" == true ]]; then
235
+ log_info "Cleaning generated SKILL.md files..."
236
+
237
+ count=0
238
+ while IFS= read -r skill_file; do
239
+ if [[ "$DRY_RUN" == true ]]; then
240
+ log_warning "Would remove: $skill_file"
241
+ else
242
+ rm -f "$skill_file"
243
+ log_success "Removed: $skill_file"
244
+ fi
245
+ ((count++)) || true
246
+ done < <(find "$AGENTS_DIR" -name "SKILL.md" -type f 2>/dev/null)
247
+
248
+ if [[ $count -eq 0 ]]; then
249
+ log_info "No SKILL.md files found to clean"
250
+ else
251
+ log_info "Cleaned $count SKILL.md files"
252
+ fi
253
+ exit 0
254
+ fi
255
+
256
+ # =============================================================================
257
+ # Generate Mode
258
+ # =============================================================================
259
+
260
+ log_info "Generating Agent Skills SKILL.md files..."
261
+ log_info "Source: $AGENTS_DIR"
262
+
263
+ if [[ "$DRY_RUN" == true ]]; then
264
+ log_warning "DRY RUN - no files will be written"
265
+ fi
266
+
267
+ generated=0
268
+ skipped=0
269
+
270
+ # Pattern 1: Folders with matching parent .md files
271
+ # e.g., wordpress.md + wordpress/ → wordpress/SKILL.md
272
+ log_info ""
273
+ log_info "Pattern 1: Folders with parent .md files"
274
+
275
+ while IFS= read -r folder; do
276
+ folder_name=$(basename "$folder")
277
+ parent_md="$AGENTS_DIR/${folder_name}.md"
278
+ skill_file="$folder/SKILL.md"
279
+
280
+ # Skip special folders
281
+ if [[ "$folder_name" == "scripts" || "$folder_name" == "memory" || "$folder_name" == "templates" ]]; then
282
+ continue
283
+ fi
284
+
285
+ if [[ -f "$parent_md" ]]; then
286
+ if [[ "$DRY_RUN" == true ]]; then
287
+ log_success "Would generate: $skill_file (from $parent_md)"
288
+ else
289
+ mkdir -p "$folder"
290
+ generate_folder_skill "$folder" "$parent_md" > "$skill_file"
291
+ log_success "Generated: $skill_file"
292
+ fi
293
+ ((generated++)) || true
294
+ fi
295
+ done < <(find "$AGENTS_DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | sort)
296
+
297
+ # Pattern 2: Nested folders without parent .md but with children
298
+ # e.g., tools/browser/ with playwright.md, etc.
299
+ log_info ""
300
+ log_info "Pattern 2: Nested folders with child .md files"
301
+
302
+ while IFS= read -r folder; do
303
+ folder_name=$(basename "$folder")
304
+ skill_file="$folder/SKILL.md"
305
+
306
+ # Skip if already handled or special
307
+ if [[ -f "$skill_file" ]]; then
308
+ continue
309
+ fi
310
+
311
+ # Check if folder has .md files
312
+ md_count=$(find "$folder" -maxdepth 1 -name "*.md" -type f 2>/dev/null | wc -l)
313
+ if [[ $md_count -gt 0 ]]; then
314
+ # Create a minimal SKILL.md for discovery
315
+ local_name=$(to_skill_name "$folder_name")
316
+
317
+ if [[ "$DRY_RUN" == true ]]; then
318
+ log_success "Would generate: $skill_file (folder index)"
319
+ else
320
+ # Build subskill list
321
+ subskills=""
322
+ while IFS= read -r subfile; do
323
+ subname=$(basename "$subfile" .md)
324
+ subdesc=$(extract_frontmatter_field "$subfile" "description")
325
+ if [[ -n "$subdesc" ]]; then
326
+ subskills="${subskills}
327
+ - ${subname}: ${subdesc}"
328
+ else
329
+ subskills="${subskills}
330
+ - ${subname}"
331
+ fi
332
+ done < <(find "$folder" -maxdepth 1 -name "*.md" -not -name "SKILL.md" -type f 2>/dev/null | sort)
333
+
334
+ title=$(capitalize "$folder_name")
335
+ {
336
+ echo "---"
337
+ echo "name: ${local_name}"
338
+ echo "description: ${title} tools and utilities"
339
+ echo "---"
340
+ echo ""
341
+ echo "# ${title}"
342
+ echo ""
343
+ echo "This folder contains ${folder_name} subskills:"
344
+ echo "$subskills"
345
+ } > "$skill_file"
346
+ log_success "Generated: $skill_file"
347
+ fi
348
+ ((generated++)) || true
349
+ fi
350
+ done < <(find "$AGENTS_DIR" -mindepth 2 -type d 2>/dev/null | sort)
351
+
352
+ # =============================================================================
353
+ # Summary
354
+ # =============================================================================
355
+
356
+ log_info ""
357
+ log_info "Generation complete:"
358
+ log_info " Generated: $generated SKILL.md files"
359
+ log_info " Skipped: $skipped (already exist or excluded)"
360
+
361
+ if [[ "$DRY_RUN" == true ]]; then
362
+ log_warning ""
363
+ log_warning "This was a dry run. Run without --dry-run to generate files."
364
+ fi
365
+
366
+ exit 0