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.
- package/.agent/AGENTS.md +614 -0
- package/.agent/accounts.md +65 -0
- package/.agent/aidevops/add-new-mcp-to-aidevops.md +456 -0
- package/.agent/aidevops/api-integrations.md +335 -0
- package/.agent/aidevops/architecture.md +510 -0
- package/.agent/aidevops/configs.md +274 -0
- package/.agent/aidevops/docs.md +244 -0
- package/.agent/aidevops/extension.md +311 -0
- package/.agent/aidevops/mcp-integrations.md +340 -0
- package/.agent/aidevops/mcp-troubleshooting.md +162 -0
- package/.agent/aidevops/memory-patterns.md +172 -0
- package/.agent/aidevops/providers.md +217 -0
- package/.agent/aidevops/recommendations.md +321 -0
- package/.agent/aidevops/requirements.md +301 -0
- package/.agent/aidevops/resources.md +214 -0
- package/.agent/aidevops/security-requirements.md +174 -0
- package/.agent/aidevops/security.md +350 -0
- package/.agent/aidevops/service-links.md +400 -0
- package/.agent/aidevops/services.md +357 -0
- package/.agent/aidevops/setup.md +153 -0
- package/.agent/aidevops/troubleshooting.md +389 -0
- package/.agent/aidevops.md +124 -0
- package/.agent/build-plus.md +244 -0
- package/.agent/content/guidelines.md +109 -0
- package/.agent/content.md +87 -0
- package/.agent/health.md +59 -0
- package/.agent/legal.md +59 -0
- package/.agent/loop-state/full-loop.local.md +16 -0
- package/.agent/loop-state/ralph-loop.local.md +10 -0
- package/.agent/marketing.md +440 -0
- package/.agent/memory/README.md +260 -0
- package/.agent/onboarding.md +796 -0
- package/.agent/plan-plus.md +245 -0
- package/.agent/research.md +100 -0
- package/.agent/sales.md +333 -0
- package/.agent/scripts/101domains-helper.sh +701 -0
- package/.agent/scripts/add-missing-returns.sh +140 -0
- package/.agent/scripts/agent-browser-helper.sh +311 -0
- package/.agent/scripts/agno-setup.sh +712 -0
- package/.agent/scripts/ahrefs-mcp-wrapper.js +168 -0
- package/.agent/scripts/aidevops-update-check.sh +71 -0
- package/.agent/scripts/ampcode-cli.sh +522 -0
- package/.agent/scripts/auto-version-bump.sh +156 -0
- package/.agent/scripts/autogen-helper.sh +512 -0
- package/.agent/scripts/beads-sync-helper.sh +596 -0
- package/.agent/scripts/closte-helper.sh +5 -0
- package/.agent/scripts/cloudron-helper.sh +321 -0
- package/.agent/scripts/codacy-cli-chunked.sh +581 -0
- package/.agent/scripts/codacy-cli.sh +442 -0
- package/.agent/scripts/code-audit-helper.sh +5 -0
- package/.agent/scripts/coderabbit-cli.sh +417 -0
- package/.agent/scripts/coderabbit-pro-analysis.sh +238 -0
- package/.agent/scripts/commands/code-simplifier.md +86 -0
- package/.agent/scripts/commands/full-loop.md +246 -0
- package/.agent/scripts/commands/postflight-loop.md +103 -0
- package/.agent/scripts/commands/recall.md +182 -0
- package/.agent/scripts/commands/remember.md +132 -0
- package/.agent/scripts/commands/save-todo.md +175 -0
- package/.agent/scripts/commands/session-review.md +154 -0
- package/.agent/scripts/comprehensive-quality-fix.sh +106 -0
- package/.agent/scripts/context-builder-helper.sh +522 -0
- package/.agent/scripts/coolify-cli-helper.sh +674 -0
- package/.agent/scripts/coolify-helper.sh +380 -0
- package/.agent/scripts/crawl4ai-examples.sh +401 -0
- package/.agent/scripts/crawl4ai-helper.sh +1078 -0
- package/.agent/scripts/crewai-helper.sh +681 -0
- package/.agent/scripts/dev-browser-helper.sh +513 -0
- package/.agent/scripts/dns-helper.sh +396 -0
- package/.agent/scripts/domain-research-helper.sh +917 -0
- package/.agent/scripts/dspy-helper.sh +285 -0
- package/.agent/scripts/dspyground-helper.sh +291 -0
- package/.agent/scripts/eeat-score-helper.sh +1242 -0
- package/.agent/scripts/efficient-return-fix.sh +92 -0
- package/.agent/scripts/extract-opencode-prompts.sh +128 -0
- package/.agent/scripts/find-missing-returns.sh +113 -0
- package/.agent/scripts/fix-auth-headers.sh +104 -0
- package/.agent/scripts/fix-common-strings.sh +254 -0
- package/.agent/scripts/fix-content-type.sh +100 -0
- package/.agent/scripts/fix-error-messages.sh +130 -0
- package/.agent/scripts/fix-misplaced-returns.sh +74 -0
- package/.agent/scripts/fix-remaining-literals.sh +152 -0
- package/.agent/scripts/fix-return-statements.sh +41 -0
- package/.agent/scripts/fix-s131-default-cases.sh +249 -0
- package/.agent/scripts/fix-sc2155-simple.sh +102 -0
- package/.agent/scripts/fix-shellcheck-critical.sh +187 -0
- package/.agent/scripts/fix-string-literals.sh +273 -0
- package/.agent/scripts/full-loop-helper.sh +773 -0
- package/.agent/scripts/generate-opencode-agents.sh +497 -0
- package/.agent/scripts/generate-opencode-commands.sh +1629 -0
- package/.agent/scripts/generate-skills.sh +366 -0
- package/.agent/scripts/git-platforms-helper.sh +640 -0
- package/.agent/scripts/gitea-cli-helper.sh +743 -0
- package/.agent/scripts/github-cli-helper.sh +702 -0
- package/.agent/scripts/gitlab-cli-helper.sh +682 -0
- package/.agent/scripts/gsc-add-user-helper.sh +325 -0
- package/.agent/scripts/gsc-sitemap-helper.sh +678 -0
- package/.agent/scripts/hetzner-helper.sh +485 -0
- package/.agent/scripts/hostinger-helper.sh +229 -0
- package/.agent/scripts/keyword-research-helper.sh +1815 -0
- package/.agent/scripts/langflow-helper.sh +544 -0
- package/.agent/scripts/linkedin-automation.py +241 -0
- package/.agent/scripts/linter-manager.sh +599 -0
- package/.agent/scripts/linters-local.sh +434 -0
- package/.agent/scripts/list-keys-helper.sh +488 -0
- package/.agent/scripts/local-browser-automation.py +339 -0
- package/.agent/scripts/localhost-helper.sh +744 -0
- package/.agent/scripts/loop-common.sh +806 -0
- package/.agent/scripts/mainwp-helper.sh +728 -0
- package/.agent/scripts/markdown-formatter.sh +338 -0
- package/.agent/scripts/markdown-lint-fix.sh +311 -0
- package/.agent/scripts/mass-fix-returns.sh +58 -0
- package/.agent/scripts/mcp-diagnose.sh +167 -0
- package/.agent/scripts/mcp-inspector-helper.sh +449 -0
- package/.agent/scripts/memory-helper.sh +650 -0
- package/.agent/scripts/monitor-code-review.sh +255 -0
- package/.agent/scripts/onboarding-helper.sh +706 -0
- package/.agent/scripts/opencode-github-setup-helper.sh +797 -0
- package/.agent/scripts/opencode-test-helper.sh +213 -0
- package/.agent/scripts/pagespeed-helper.sh +464 -0
- package/.agent/scripts/pandoc-helper.sh +362 -0
- package/.agent/scripts/postflight-check.sh +555 -0
- package/.agent/scripts/pre-commit-hook.sh +259 -0
- package/.agent/scripts/pre-edit-check.sh +169 -0
- package/.agent/scripts/qlty-cli.sh +356 -0
- package/.agent/scripts/quality-cli-manager.sh +525 -0
- package/.agent/scripts/quality-feedback-helper.sh +462 -0
- package/.agent/scripts/quality-fix.sh +263 -0
- package/.agent/scripts/quality-loop-helper.sh +1108 -0
- package/.agent/scripts/ralph-loop-helper.sh +836 -0
- package/.agent/scripts/ralph-upstream-check.sh +341 -0
- package/.agent/scripts/secretlint-helper.sh +847 -0
- package/.agent/scripts/servers-helper.sh +241 -0
- package/.agent/scripts/ses-helper.sh +619 -0
- package/.agent/scripts/session-review-helper.sh +404 -0
- package/.agent/scripts/setup-linters-wizard.sh +379 -0
- package/.agent/scripts/setup-local-api-keys.sh +330 -0
- package/.agent/scripts/setup-mcp-integrations.sh +472 -0
- package/.agent/scripts/shared-constants.sh +246 -0
- package/.agent/scripts/site-crawler-helper.sh +1487 -0
- package/.agent/scripts/snyk-helper.sh +940 -0
- package/.agent/scripts/sonarcloud-autofix.sh +193 -0
- package/.agent/scripts/sonarcloud-cli.sh +191 -0
- package/.agent/scripts/sonarscanner-cli.sh +455 -0
- package/.agent/scripts/spaceship-helper.sh +747 -0
- package/.agent/scripts/stagehand-helper.sh +321 -0
- package/.agent/scripts/stagehand-python-helper.sh +321 -0
- package/.agent/scripts/stagehand-python-setup.sh +441 -0
- package/.agent/scripts/stagehand-setup.sh +439 -0
- package/.agent/scripts/system-cleanup.sh +340 -0
- package/.agent/scripts/terminal-title-helper.sh +388 -0
- package/.agent/scripts/terminal-title-setup.sh +549 -0
- package/.agent/scripts/test-stagehand-both-integration.sh +317 -0
- package/.agent/scripts/test-stagehand-integration.sh +309 -0
- package/.agent/scripts/test-stagehand-python-integration.sh +341 -0
- package/.agent/scripts/todo-ready.sh +263 -0
- package/.agent/scripts/tool-version-check.sh +362 -0
- package/.agent/scripts/toon-helper.sh +469 -0
- package/.agent/scripts/twilio-helper.sh +917 -0
- package/.agent/scripts/updown-helper.sh +279 -0
- package/.agent/scripts/validate-mcp-integrations.sh +250 -0
- package/.agent/scripts/validate-version-consistency.sh +131 -0
- package/.agent/scripts/vaultwarden-helper.sh +597 -0
- package/.agent/scripts/vercel-cli-helper.sh +816 -0
- package/.agent/scripts/verify-mirrors.sh +169 -0
- package/.agent/scripts/version-manager.sh +831 -0
- package/.agent/scripts/webhosting-helper.sh +471 -0
- package/.agent/scripts/webhosting-verify.sh +238 -0
- package/.agent/scripts/wordpress-mcp-helper.sh +508 -0
- package/.agent/scripts/worktree-helper.sh +595 -0
- package/.agent/scripts/worktree-sessions.sh +577 -0
- package/.agent/seo/dataforseo.md +215 -0
- package/.agent/seo/domain-research.md +532 -0
- package/.agent/seo/eeat-score.md +659 -0
- package/.agent/seo/google-search-console.md +366 -0
- package/.agent/seo/gsc-sitemaps.md +282 -0
- package/.agent/seo/keyword-research.md +521 -0
- package/.agent/seo/serper.md +278 -0
- package/.agent/seo/site-crawler.md +387 -0
- package/.agent/seo.md +236 -0
- package/.agent/services/accounting/quickfile.md +159 -0
- package/.agent/services/communications/telfon.md +470 -0
- package/.agent/services/communications/twilio.md +569 -0
- package/.agent/services/crm/fluentcrm.md +449 -0
- package/.agent/services/email/ses.md +399 -0
- package/.agent/services/hosting/101domains.md +378 -0
- package/.agent/services/hosting/closte.md +177 -0
- package/.agent/services/hosting/cloudflare.md +251 -0
- package/.agent/services/hosting/cloudron.md +478 -0
- package/.agent/services/hosting/dns-providers.md +335 -0
- package/.agent/services/hosting/domain-purchasing.md +344 -0
- package/.agent/services/hosting/hetzner.md +327 -0
- package/.agent/services/hosting/hostinger.md +287 -0
- package/.agent/services/hosting/localhost.md +419 -0
- package/.agent/services/hosting/spaceship.md +353 -0
- package/.agent/services/hosting/webhosting.md +330 -0
- package/.agent/social-media.md +69 -0
- package/.agent/templates/plans-template.md +114 -0
- package/.agent/templates/prd-template.md +129 -0
- package/.agent/templates/tasks-template.md +108 -0
- package/.agent/templates/todo-template.md +89 -0
- package/.agent/tools/ai-assistants/agno.md +471 -0
- package/.agent/tools/ai-assistants/capsolver.md +326 -0
- package/.agent/tools/ai-assistants/configuration.md +221 -0
- package/.agent/tools/ai-assistants/overview.md +209 -0
- package/.agent/tools/ai-assistants/status.md +171 -0
- package/.agent/tools/ai-assistants/windsurf.md +193 -0
- package/.agent/tools/ai-orchestration/autogen.md +406 -0
- package/.agent/tools/ai-orchestration/crewai.md +445 -0
- package/.agent/tools/ai-orchestration/langflow.md +405 -0
- package/.agent/tools/ai-orchestration/openprose.md +487 -0
- package/.agent/tools/ai-orchestration/overview.md +362 -0
- package/.agent/tools/ai-orchestration/packaging.md +647 -0
- package/.agent/tools/browser/agent-browser.md +464 -0
- package/.agent/tools/browser/browser-automation.md +400 -0
- package/.agent/tools/browser/chrome-devtools.md +282 -0
- package/.agent/tools/browser/crawl4ai-integration.md +422 -0
- package/.agent/tools/browser/crawl4ai-resources.md +277 -0
- package/.agent/tools/browser/crawl4ai-usage.md +416 -0
- package/.agent/tools/browser/crawl4ai.md +585 -0
- package/.agent/tools/browser/dev-browser.md +341 -0
- package/.agent/tools/browser/pagespeed.md +260 -0
- package/.agent/tools/browser/playwright.md +266 -0
- package/.agent/tools/browser/playwriter.md +310 -0
- package/.agent/tools/browser/stagehand-examples.md +456 -0
- package/.agent/tools/browser/stagehand-python.md +483 -0
- package/.agent/tools/browser/stagehand.md +421 -0
- package/.agent/tools/build-agent/agent-review.md +224 -0
- package/.agent/tools/build-agent/build-agent.md +784 -0
- package/.agent/tools/build-mcp/aidevops-plugin.md +476 -0
- package/.agent/tools/build-mcp/api-wrapper.md +445 -0
- package/.agent/tools/build-mcp/build-mcp.md +240 -0
- package/.agent/tools/build-mcp/deployment.md +401 -0
- package/.agent/tools/build-mcp/server-patterns.md +632 -0
- package/.agent/tools/build-mcp/transports.md +366 -0
- package/.agent/tools/code-review/auditing.md +383 -0
- package/.agent/tools/code-review/automation.md +219 -0
- package/.agent/tools/code-review/best-practices.md +203 -0
- package/.agent/tools/code-review/codacy.md +151 -0
- package/.agent/tools/code-review/code-simplifier.md +174 -0
- package/.agent/tools/code-review/code-standards.md +309 -0
- package/.agent/tools/code-review/coderabbit.md +101 -0
- package/.agent/tools/code-review/management.md +155 -0
- package/.agent/tools/code-review/qlty.md +248 -0
- package/.agent/tools/code-review/secretlint.md +565 -0
- package/.agent/tools/code-review/setup.md +250 -0
- package/.agent/tools/code-review/snyk.md +563 -0
- package/.agent/tools/code-review/tools.md +230 -0
- package/.agent/tools/content/summarize.md +353 -0
- package/.agent/tools/context/augment-context-engine.md +468 -0
- package/.agent/tools/context/context-builder-agent.md +76 -0
- package/.agent/tools/context/context-builder.md +375 -0
- package/.agent/tools/context/context7.md +371 -0
- package/.agent/tools/context/dspy.md +302 -0
- package/.agent/tools/context/dspyground.md +374 -0
- package/.agent/tools/context/llm-tldr.md +219 -0
- package/.agent/tools/context/osgrep.md +488 -0
- package/.agent/tools/context/prompt-optimization.md +338 -0
- package/.agent/tools/context/toon.md +292 -0
- package/.agent/tools/conversion/pandoc.md +304 -0
- package/.agent/tools/credentials/api-key-management.md +154 -0
- package/.agent/tools/credentials/api-key-setup.md +224 -0
- package/.agent/tools/credentials/environment-variables.md +180 -0
- package/.agent/tools/credentials/vaultwarden.md +382 -0
- package/.agent/tools/data-extraction/outscraper.md +974 -0
- package/.agent/tools/deployment/coolify-cli.md +388 -0
- package/.agent/tools/deployment/coolify-setup.md +353 -0
- package/.agent/tools/deployment/coolify.md +345 -0
- package/.agent/tools/deployment/vercel.md +390 -0
- package/.agent/tools/git/authentication.md +132 -0
- package/.agent/tools/git/gitea-cli.md +193 -0
- package/.agent/tools/git/github-actions.md +207 -0
- package/.agent/tools/git/github-cli.md +223 -0
- package/.agent/tools/git/gitlab-cli.md +190 -0
- package/.agent/tools/git/opencode-github-security.md +350 -0
- package/.agent/tools/git/opencode-github.md +328 -0
- package/.agent/tools/git/opencode-gitlab.md +252 -0
- package/.agent/tools/git/security.md +196 -0
- package/.agent/tools/git.md +207 -0
- package/.agent/tools/opencode/oh-my-opencode.md +375 -0
- package/.agent/tools/opencode/opencode-anthropic-auth.md +446 -0
- package/.agent/tools/opencode/opencode.md +651 -0
- package/.agent/tools/social-media/bird.md +437 -0
- package/.agent/tools/task-management/beads.md +336 -0
- package/.agent/tools/terminal/terminal-title.md +251 -0
- package/.agent/tools/ui/shadcn.md +196 -0
- package/.agent/tools/ui/ui-skills.md +115 -0
- package/.agent/tools/wordpress/localwp.md +311 -0
- package/.agent/tools/wordpress/mainwp.md +391 -0
- package/.agent/tools/wordpress/scf.md +527 -0
- package/.agent/tools/wordpress/wp-admin.md +729 -0
- package/.agent/tools/wordpress/wp-dev.md +940 -0
- package/.agent/tools/wordpress/wp-preferred.md +398 -0
- package/.agent/tools/wordpress.md +95 -0
- package/.agent/workflows/branch/bugfix.md +63 -0
- package/.agent/workflows/branch/chore.md +95 -0
- package/.agent/workflows/branch/experiment.md +115 -0
- package/.agent/workflows/branch/feature.md +59 -0
- package/.agent/workflows/branch/hotfix.md +98 -0
- package/.agent/workflows/branch/refactor.md +92 -0
- package/.agent/workflows/branch/release.md +96 -0
- package/.agent/workflows/branch.md +347 -0
- package/.agent/workflows/bug-fixing.md +267 -0
- package/.agent/workflows/changelog.md +129 -0
- package/.agent/workflows/code-audit-remote.md +279 -0
- package/.agent/workflows/conversation-starter.md +69 -0
- package/.agent/workflows/error-feedback.md +578 -0
- package/.agent/workflows/feature-development.md +355 -0
- package/.agent/workflows/git-workflow.md +702 -0
- package/.agent/workflows/multi-repo-workspace.md +268 -0
- package/.agent/workflows/plans.md +709 -0
- package/.agent/workflows/postflight.md +604 -0
- package/.agent/workflows/pr.md +571 -0
- package/.agent/workflows/preflight.md +278 -0
- package/.agent/workflows/ralph-loop.md +773 -0
- package/.agent/workflows/release.md +498 -0
- package/.agent/workflows/session-manager.md +254 -0
- package/.agent/workflows/session-review.md +311 -0
- package/.agent/workflows/sql-migrations.md +631 -0
- package/.agent/workflows/version-bump.md +283 -0
- package/.agent/workflows/wiki-update.md +333 -0
- package/.agent/workflows/worktree.md +477 -0
- package/LICENSE +21 -0
- package/README.md +1446 -0
- package/VERSION +1 -0
- package/aidevops.sh +1746 -0
- package/bin/aidevops +21 -0
- package/package.json +75 -0
- package/scripts/npm-postinstall.js +60 -0
- 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
|