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,259 @@
1
+ #!/bin/bash
2
+ # shellcheck disable=SC2034,SC2155,SC2317,SC2329,SC2016,SC2181,SC1091,SC2154,SC2015,SC2086,SC2129,SC2030,SC2031,SC2119,SC2120,SC2001,SC2162,SC2088,SC2089,SC2090,SC2029,SC2006,SC2153
3
+ # Pre-commit hook for multi-platform quality validation
4
+ # Install with: cp .agent/scripts/pre-commit-hook.sh .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit
5
+
6
+ set -euo pipefail
7
+
8
+ # Color codes for output
9
+ readonly RED='\033[0;31m'
10
+ readonly GREEN='\033[0;32m'
11
+ readonly YELLOW='\033[1;33m'
12
+ readonly BLUE='\033[0;34m'
13
+ readonly NC='\033[0m' # No Color
14
+
15
+ print_success() {
16
+ local message="$1"
17
+ echo -e "${GREEN}✅ $message${NC}"
18
+ return 0
19
+ }
20
+
21
+ print_warning() {
22
+ local message="$1"
23
+ echo -e "${YELLOW}⚠️ $message${NC}"
24
+ return 0
25
+ }
26
+
27
+ print_error() {
28
+ local message="$1"
29
+ echo -e "${RED}❌ $message${NC}"
30
+ return 0
31
+ }
32
+
33
+ print_info() {
34
+ local message="$1"
35
+ echo -e "${BLUE}ℹ️ $message${NC}"
36
+ return 0
37
+ }
38
+
39
+ # Get list of modified shell files
40
+ get_modified_shell_files() {
41
+ git diff --cached --name-only --diff-filter=ACM | grep '\.sh$' || true
42
+ return 0
43
+ }
44
+
45
+ validate_return_statements() {
46
+ local violations=0
47
+
48
+ print_info "Validating return statements..."
49
+
50
+ for file in "$@"; do
51
+ if [[ -f "$file" ]]; then
52
+ # Check for functions without return statements
53
+ local functions
54
+ functions=$(grep -c "^[a-zA-Z_][a-zA-Z0-9_]*() {" "$file" || echo "0")
55
+ local returns
56
+ returns=$(grep -c "return [01]" "$file" || echo "0")
57
+
58
+ if [[ $functions -gt 0 && $returns -lt $functions ]]; then
59
+ print_error "Missing return statements in $file"
60
+ ((violations++))
61
+ fi
62
+ fi
63
+ done
64
+
65
+ return $violations
66
+ }
67
+
68
+ validate_positional_parameters() {
69
+ local violations=0
70
+
71
+ print_info "Validating positional parameters..."
72
+
73
+ for file in "$@"; do
74
+ if [[ -f "$file" ]] && grep -n '\$[1-9]' "$file" | grep -v 'local.*=.*\$[1-9]' > /dev/null; then
75
+ print_error "Direct positional parameter usage in $file"
76
+ grep -n '\$[1-9]' "$file" | grep -v 'local.*=.*\$[1-9]' | head -3
77
+ ((violations++))
78
+ fi
79
+ done
80
+
81
+ return $violations
82
+ }
83
+
84
+ validate_string_literals() {
85
+ local violations=0
86
+
87
+ print_info "Validating string literals..."
88
+
89
+ for file in "$@"; do
90
+ if [[ -f "$file" ]]; then
91
+ # Check for repeated string literals
92
+ local repeated
93
+ repeated=$(grep -o '"[^"]*"' "$file" | sort | uniq -c | awk '$1 >= 3' | wc -l || echo "0")
94
+
95
+ if [[ $repeated -gt 0 ]]; then
96
+ print_warning "Repeated string literals in $file (consider using constants)"
97
+ grep -o '"[^"]*"' "$file" | sort | uniq -c | awk '$1 >= 3 {print " " $1 "x: " $2}' | head -3
98
+ ((violations++))
99
+ fi
100
+ fi
101
+ done
102
+
103
+ return $violations
104
+ }
105
+
106
+ run_shellcheck() {
107
+ local violations=0
108
+
109
+ print_info "Running ShellCheck validation..."
110
+
111
+ for file in "$@"; do
112
+ if [[ -f "$file" ]] && ! shellcheck "$file"; then
113
+ print_error "ShellCheck violations in $file"
114
+ ((violations++))
115
+ fi
116
+ done
117
+
118
+ return $violations
119
+ }
120
+
121
+ check_secrets() {
122
+ local violations=0
123
+
124
+ print_info "Checking for exposed secrets (Secretlint)..."
125
+
126
+ # Get staged files
127
+ local staged_files
128
+ staged_files=$(git diff --cached --name-only --diff-filter=ACMR | tr '\n' ' ')
129
+
130
+ if [[ -z "$staged_files" ]]; then
131
+ print_info "No files to check for secrets"
132
+ return 0
133
+ fi
134
+
135
+ # Check if secretlint is available
136
+ if command -v secretlint &> /dev/null; then
137
+ if echo "$staged_files" | xargs secretlint --format compact 2>/dev/null; then
138
+ print_success "No secrets detected in staged files"
139
+ else
140
+ print_error "Potential secrets detected in staged files!"
141
+ print_info "Review the findings and either:"
142
+ print_info " 1. Remove the secrets from your code"
143
+ print_info " 2. Add to .secretlintignore if false positive"
144
+ print_info " 3. Use // secretlint-disable-line comment"
145
+ ((violations++))
146
+ fi
147
+ elif [[ -f "node_modules/.bin/secretlint" ]]; then
148
+ if echo "$staged_files" | xargs ./node_modules/.bin/secretlint --format compact 2>/dev/null; then
149
+ print_success "No secrets detected in staged files"
150
+ else
151
+ print_error "Potential secrets detected in staged files!"
152
+ ((violations++))
153
+ fi
154
+ elif command -v npx &> /dev/null && [[ -f ".secretlintrc.json" ]]; then
155
+ if echo "$staged_files" | xargs npx secretlint --format compact 2>/dev/null; then
156
+ print_success "No secrets detected in staged files"
157
+ else
158
+ print_error "Potential secrets detected in staged files!"
159
+ ((violations++))
160
+ fi
161
+ else
162
+ print_warning "Secretlint not available (install: npm install secretlint --save-dev)"
163
+ fi
164
+
165
+ return $violations
166
+ }
167
+
168
+ check_quality_standards() {
169
+ print_info "Checking current quality standards..."
170
+
171
+ # Check SonarCloud status if curl is available
172
+ if command -v curl &> /dev/null && command -v jq &> /dev/null; then
173
+ local response
174
+ if response=$(curl -s --max-time 10 "https://sonarcloud.io/api/issues/search?componentKeys=marcusquinn_aidevops&impactSoftwareQualities=MAINTAINABILITY&resolved=false&ps=1" 2>/dev/null); then
175
+ local total_issues
176
+ total_issues=$(echo "$response" | jq -r '.total // 0' 2>/dev/null || echo "unknown")
177
+
178
+ if [[ "$total_issues" != "unknown" ]]; then
179
+ print_info "Current SonarCloud issues: $total_issues"
180
+
181
+ if [[ $total_issues -gt 200 ]]; then
182
+ print_warning "High issue count detected. Consider running quality fixes."
183
+ fi
184
+ fi
185
+ fi
186
+ fi
187
+ return 0
188
+ }
189
+
190
+ main() {
191
+ echo -e "${BLUE}🎯 Pre-commit Quality Validation${NC}"
192
+ echo -e "${BLUE}================================${NC}"
193
+
194
+ # Get modified shell files
195
+ local modified_files
196
+ mapfile -t modified_files < <(get_modified_shell_files)
197
+
198
+ if [[ ${#modified_files[@]} -eq 0 ]]; then
199
+ print_info "No shell files modified, skipping quality checks"
200
+ return 0
201
+ fi
202
+
203
+ print_info "Checking ${#modified_files[@]} modified shell files:"
204
+ printf ' %s\n' "${modified_files[@]}"
205
+ echo ""
206
+
207
+ local total_violations=0
208
+
209
+ # Run validation checks
210
+ validate_return_statements "${modified_files[@]}" || ((total_violations += $?))
211
+ echo ""
212
+
213
+ validate_positional_parameters "${modified_files[@]}" || ((total_violations += $?))
214
+ echo ""
215
+
216
+ validate_string_literals "${modified_files[@]}" || ((total_violations += $?))
217
+ echo ""
218
+
219
+ run_shellcheck "${modified_files[@]}" || ((total_violations += $?))
220
+ echo ""
221
+
222
+ check_secrets || ((total_violations += $?))
223
+ echo ""
224
+
225
+ check_quality_standards
226
+ echo ""
227
+
228
+ # Optional CodeRabbit CLI review (if available)
229
+ if [[ -f ".agent/scripts/coderabbit-cli.sh" ]] && command -v coderabbit &> /dev/null; then
230
+ print_info "🤖 Running CodeRabbit CLI review..."
231
+ if bash .agent/scripts/coderabbit-cli.sh review > /dev/null 2>&1; then
232
+ print_success "CodeRabbit CLI review completed"
233
+ else
234
+ print_info "CodeRabbit CLI review skipped (setup required)"
235
+ fi
236
+ echo ""
237
+ fi
238
+
239
+ # Final decision
240
+ if [[ $total_violations -eq 0 ]]; then
241
+ print_success "🎉 All quality checks passed! Commit approved."
242
+ return 0
243
+ else
244
+ print_error "❌ Quality violations detected ($total_violations total)"
245
+ echo ""
246
+ print_info "To fix issues automatically, run:"
247
+ print_info " ./.agent/scripts/quality-fix.sh"
248
+ echo ""
249
+ print_info "To check current status, run:"
250
+ print_info " ./.agent/scripts/linters-local.sh"
251
+ echo ""
252
+ print_info "To bypass this check (not recommended), use:"
253
+ print_info " git commit --no-verify"
254
+
255
+ return 1
256
+ fi
257
+ }
258
+
259
+ main "$@"
@@ -0,0 +1,169 @@
1
+ #!/bin/bash
2
+ # =============================================================================
3
+ # Pre-Edit Git Branch Check
4
+ # =============================================================================
5
+ # Run this BEFORE any file edit to enforce the git workflow.
6
+ # Returns exit code 1 if on main/master branch (should create branch first).
7
+ #
8
+ # Usage:
9
+ # ~/.aidevops/agents/scripts/pre-edit-check.sh
10
+ # ~/.aidevops/agents/scripts/pre-edit-check.sh --loop-mode --task "description"
11
+ #
12
+ # Exit codes:
13
+ # 0 - OK to proceed (on feature branch, or docs-only on main in loop mode)
14
+ # 1 - STOP (on protected branch, interactive mode)
15
+ # 2 - Create worktree (loop mode detected code task on main)
16
+ #
17
+ # AI assistants should call this before any Edit/Write tool and STOP if it
18
+ # returns a warning about being on main branch.
19
+ # =============================================================================
20
+
21
+ set -euo pipefail
22
+
23
+ # =============================================================================
24
+ # Loop Mode Support
25
+ # =============================================================================
26
+ # When --loop-mode is passed, the script auto-decides based on task description:
27
+ # - Docs-only tasks (README, CHANGELOG, docs/) -> stay on main (exit 0)
28
+ # - Code tasks (feature, fix, implement, etc.) -> signal worktree needed (exit 2)
29
+
30
+ LOOP_MODE=false
31
+ TASK_DESC=""
32
+
33
+ while [[ $# -gt 0 ]]; do
34
+ case $1 in
35
+ --loop-mode)
36
+ LOOP_MODE=true
37
+ shift
38
+ ;;
39
+ --task)
40
+ TASK_DESC="$2"
41
+ shift 2
42
+ ;;
43
+ *)
44
+ shift
45
+ ;;
46
+ esac
47
+ done
48
+
49
+ # Function to detect if task is docs-only
50
+ is_docs_only() {
51
+ local task="$1"
52
+ # Use tr for lowercase (portable across bash versions including macOS default bash 3.x)
53
+ local task_lower
54
+ task_lower=$(echo "$task" | tr '[:upper:]' '[:lower:]')
55
+
56
+ # Code change indicators (negative match - if present, NOT docs-only)
57
+ # These take precedence over docs patterns
58
+ local code_patterns="feature|fix|bug|implement|refactor|add.*function|update.*code|create.*script|modify.*config|change.*logic|new.*api|endpoint|enhance|port|ssl|helper"
59
+
60
+ # Docs-only indicators (positive match)
61
+ local docs_patterns="^readme|^changelog|^documentation|docs/|typo|spelling|comment only|license only|^update readme|^update changelog|^update docs"
62
+
63
+ # Check for code patterns first (takes precedence)
64
+ if echo "$task_lower" | grep -qE "$code_patterns"; then
65
+ return 1 # Not docs-only
66
+ fi
67
+
68
+ # Check for docs patterns
69
+ if echo "$task_lower" | grep -qE "$docs_patterns"; then
70
+ return 0 # Is docs-only
71
+ fi
72
+
73
+ # Default: not docs-only (safer to create branch)
74
+ return 1
75
+ }
76
+
77
+ # Colors
78
+ RED='\033[0;31m'
79
+ GREEN='\033[0;32m'
80
+ YELLOW='\033[1;33m'
81
+ BOLD='\033[1m'
82
+ NC='\033[0m'
83
+
84
+ # Check if we're in a git repository
85
+ if ! git rev-parse --is-inside-work-tree &>/dev/null; then
86
+ echo -e "${YELLOW}Not in a git repository - no branch check needed${NC}"
87
+ exit 0
88
+ fi
89
+
90
+ # Get current branch
91
+ current_branch=$(git branch --show-current 2>/dev/null || echo "")
92
+
93
+ if [[ -z "$current_branch" ]]; then
94
+ echo -e "${YELLOW}Detached HEAD state - consider creating a branch${NC}"
95
+ exit 0
96
+ fi
97
+
98
+ # Check if on main or master
99
+ if [[ "$current_branch" == "main" || "$current_branch" == "master" ]]; then
100
+ # Loop mode: auto-decide based on task description
101
+ if [[ "$LOOP_MODE" == "true" ]]; then
102
+ if is_docs_only "$TASK_DESC"; then
103
+ echo -e "${YELLOW}LOOP-AUTO${NC}: Docs-only task detected, staying on $current_branch"
104
+ echo "LOOP_DECISION=stay"
105
+ exit 0
106
+ else
107
+ # Auto-create worktree for code changes
108
+ echo -e "${YELLOW}LOOP-AUTO${NC}: Code task detected, worktree required"
109
+ echo "LOOP_DECISION=worktree"
110
+ exit 2 # Special exit code for "create worktree"
111
+ fi
112
+ fi
113
+
114
+ # Interactive mode: show warning and exit
115
+ echo ""
116
+ echo -e "${RED}${BOLD}======================================================${NC}"
117
+ echo -e "${RED}${BOLD} STOP - ON PROTECTED BRANCH: $current_branch${NC}"
118
+ echo -e "${RED}${BOLD}======================================================${NC}"
119
+ echo ""
120
+ echo -e "${YELLOW}You must create a branch before making changes.${NC}"
121
+ echo ""
122
+ echo "Suggested branch names based on change type:"
123
+ echo " feature/description - New functionality"
124
+ echo " bugfix/description - Bug fixes"
125
+ echo " chore/description - Maintenance, docs, config"
126
+ echo " hotfix/description - Urgent production fixes"
127
+ echo " refactor/description - Code restructuring"
128
+ echo ""
129
+ echo -e "${BOLD}Create a worktree (keeps main repo on main):${NC}"
130
+ echo ""
131
+ echo " ~/.aidevops/agents/scripts/worktree-helper.sh add {type}/{description}"
132
+ echo " cd ../{repo}-{type}-{description}"
133
+ echo ""
134
+ echo -e "${YELLOW}Why worktrees? The main repo directory should ALWAYS stay on main.${NC}"
135
+ echo -e "${YELLOW}Using 'git checkout -b' here leaves the repo on a feature branch,${NC}"
136
+ echo -e "${YELLOW}which breaks parallel sessions and causes merge conflicts.${NC}"
137
+ echo ""
138
+ echo -e "${RED}DO NOT proceed with edits until on a feature branch.${NC}"
139
+ echo ""
140
+ exit 1
141
+ else
142
+ # Check if this is the main repo directory (not a worktree) on a feature branch
143
+ # This is a warning - the main repo should stay on main
144
+ git_common_dir=$(git rev-parse --git-common-dir 2>/dev/null)
145
+ git_dir=$(git rev-parse --git-dir 2>/dev/null)
146
+
147
+ # If git-dir equals git-common-dir, this is the main worktree (not a linked worktree)
148
+ is_main_worktree=false
149
+ if [[ "$git_dir" == "$git_common_dir" ]] || [[ "$git_dir" == ".git" ]]; then
150
+ is_main_worktree=true
151
+ fi
152
+
153
+ if [[ "$is_main_worktree" == "true" ]]; then
154
+ echo -e "${YELLOW}WARNING${NC} - Main repo is on feature branch: ${BOLD}$current_branch${NC}"
155
+ echo -e "${YELLOW}The main repo directory should stay on 'main' for parallel safety.${NC}"
156
+ echo -e "${YELLOW}Consider using a worktree instead, or switch back to main when done.${NC}"
157
+ echo ""
158
+ else
159
+ echo -e "${GREEN}OK${NC} - On branch: ${BOLD}$current_branch${NC}"
160
+ fi
161
+
162
+ # Sync terminal tab title with repo/branch (silent, non-blocking)
163
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" || exit
164
+ if [[ -x "$SCRIPT_DIR/terminal-title-helper.sh" ]]; then
165
+ "$SCRIPT_DIR/terminal-title-helper.sh" sync 2>/dev/null || true
166
+ fi
167
+
168
+ exit 0
169
+ fi