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,555 @@
1
+ #!/bin/bash
2
+ # shellcheck disable=SC2034,SC2155
3
+ # Postflight Verification Script
4
+ # Verifies release health after tag creation and GitHub release publication
5
+ #
6
+ # Usage: ./postflight-check.sh [--quick|--full|--ci-only|--security-only]
7
+ #
8
+ # Author: AI DevOps Framework
9
+ # Version: 1.0.0
10
+
11
+ set -euo pipefail
12
+
13
+ # Configuration
14
+ readonly TIMEOUT_CI=600 # 10 minutes for CI/CD
15
+ readonly TIMEOUT_TOOLS=300 # 5 minutes for code review tools
16
+ readonly POLL_INTERVAL=30 # Check every 30 seconds
17
+ readonly MAX_ATTEMPTS=20 # Maximum polling attempts
18
+
19
+ # Colors for output
20
+ readonly RED='\033[0;31m'
21
+ readonly GREEN='\033[0;32m'
22
+ readonly YELLOW='\033[1;33m'
23
+ readonly BLUE='\033[0;34m'
24
+ readonly NC='\033[0m'
25
+
26
+ # Repository info
27
+ readonly REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" || exit
28
+ readonly SONAR_PROJECT_KEY="marcusquinn_aidevops"
29
+ # Save the original working directory for git operations (supports worktrees)
30
+ readonly ORIGINAL_PWD="$PWD"
31
+
32
+ # Counters
33
+ PASSED=0
34
+ FAILED=0
35
+ WARNINGS=0
36
+ SKIPPED=0
37
+
38
+ print_header() {
39
+ echo -e "${BLUE}========================================${NC}"
40
+ echo -e "${BLUE} Postflight Verification${NC}"
41
+ echo -e "${BLUE}========================================${NC}"
42
+ echo "Started: $(date)"
43
+ echo ""
44
+ return 0
45
+ }
46
+
47
+ print_success() {
48
+ local message="$1"
49
+ echo -e "${GREEN}PASSED${NC} $message"
50
+ ((PASSED++))
51
+ return 0
52
+ }
53
+
54
+ print_warning() {
55
+ local message="$1"
56
+ echo -e "${YELLOW}WARNING${NC} $message"
57
+ ((WARNINGS++))
58
+ return 0
59
+ }
60
+
61
+ print_error() {
62
+ local message="$1"
63
+ echo -e "${RED}FAILED${NC} $message"
64
+ ((FAILED++))
65
+ return 0
66
+ }
67
+
68
+ print_skip() {
69
+ local message="$1"
70
+ echo -e "${BLUE}SKIPPED${NC} $message"
71
+ ((SKIPPED++))
72
+ return 0
73
+ }
74
+
75
+ print_info() {
76
+ local message="$1"
77
+ echo -e "${BLUE}INFO${NC} $message"
78
+ return 0
79
+ }
80
+
81
+ print_section() {
82
+ local title="$1"
83
+ echo ""
84
+ echo -e "${BLUE}--- $title ---${NC}"
85
+ return 0
86
+ }
87
+
88
+ # Check if gh CLI is available and authenticated
89
+ check_gh_cli() {
90
+ if ! command -v gh &> /dev/null; then
91
+ print_error "GitHub CLI (gh) not installed"
92
+ return 1
93
+ fi
94
+
95
+ if ! gh auth status &> /dev/null; then
96
+ print_error "GitHub CLI not authenticated. Run: gh auth login"
97
+ return 1
98
+ fi
99
+
100
+ return 0
101
+ }
102
+
103
+ # Get repository owner and name from original directory (works with worktrees)
104
+ get_repo_info() {
105
+ local remote_url
106
+ # Use original working directory's git context (saved before cd to REPO_ROOT)
107
+ remote_url=$(git -C "$ORIGINAL_PWD" remote get-url origin 2>/dev/null || echo "")
108
+
109
+ if [[ -z "$remote_url" ]]; then
110
+ echo ""
111
+ return 1
112
+ fi
113
+
114
+ # Extract owner/repo from various URL formats using parameter expansion
115
+ # (bash 3.2 compatible - regex capture groups don't work reliably on macOS)
116
+ local repo_path
117
+ if [[ "$remote_url" == *"github.com"* ]]; then
118
+ # Handle HTTPS: https://github.com/owner/repo.git
119
+ if [[ "$remote_url" == *"github.com/"* ]]; then
120
+ repo_path="${remote_url#*github.com/}"
121
+ # Handle SSH: git@github.com:owner/repo.git
122
+ elif [[ "$remote_url" == *"github.com:"* ]]; then
123
+ repo_path="${remote_url#*github.com:}"
124
+ else
125
+ echo ""
126
+ return 1
127
+ fi
128
+ # Remove .git suffix if present
129
+ repo_path="${repo_path%.git}"
130
+ if [[ -n "$repo_path" && "$repo_path" == *"/"* ]]; then
131
+ echo "$repo_path"
132
+ return 0
133
+ fi
134
+ fi
135
+
136
+ echo ""
137
+ return 1
138
+ }
139
+
140
+ # Check GitHub Actions CI/CD status
141
+ check_cicd_status() {
142
+ print_section "CI/CD Pipeline Status"
143
+
144
+ if ! check_gh_cli; then
145
+ return 1
146
+ fi
147
+
148
+ local repo
149
+ repo=$(get_repo_info)
150
+ if [[ -z "$repo" ]]; then
151
+ print_error "Could not determine repository"
152
+ return 1
153
+ fi
154
+
155
+ print_info "Repository: $repo"
156
+
157
+ # Get latest workflow run
158
+ local latest_run
159
+ latest_run=$(gh run list --repo "$repo" --limit=1 --json databaseId,status,conclusion,name 2>/dev/null || echo "")
160
+
161
+ if [[ -z "$latest_run" || "$latest_run" == "[]" ]]; then
162
+ print_warning "No workflow runs found"
163
+ return 0
164
+ fi
165
+
166
+ local run_id status conclusion name
167
+ run_id=$(echo "$latest_run" | jq -r '.[0].databaseId')
168
+ status=$(echo "$latest_run" | jq -r '.[0].status')
169
+ conclusion=$(echo "$latest_run" | jq -r '.[0].conclusion')
170
+ name=$(echo "$latest_run" | jq -r '.[0].name')
171
+
172
+ print_info "Latest run: $name (#$run_id)"
173
+ print_info "Status: $status, Conclusion: $conclusion"
174
+
175
+ # If still running, wait for completion
176
+ if [[ "$status" == "in_progress" || "$status" == "queued" ]]; then
177
+ print_info "Waiting for workflow to complete (timeout: ${TIMEOUT_CI}s)..."
178
+
179
+ local attempt=0
180
+ while [[ $attempt -lt $MAX_ATTEMPTS ]]; do
181
+ sleep "$POLL_INTERVAL"
182
+ ((attempt++))
183
+
184
+ local current_status
185
+ current_status=$(gh run view "$run_id" --repo "$repo" --json status,conclusion 2>/dev/null || echo "")
186
+
187
+ if [[ -z "$current_status" ]]; then
188
+ continue
189
+ fi
190
+
191
+ status=$(echo "$current_status" | jq -r '.status')
192
+ conclusion=$(echo "$current_status" | jq -r '.conclusion')
193
+
194
+ if [[ "$status" == "completed" ]]; then
195
+ break
196
+ fi
197
+
198
+ print_info "Still waiting... (attempt $attempt/$MAX_ATTEMPTS)"
199
+ done
200
+ fi
201
+
202
+ # Check final status
203
+ if [[ "$status" != "completed" ]]; then
204
+ print_error "Workflow did not complete within timeout"
205
+ return 1
206
+ fi
207
+
208
+ if [[ "$conclusion" == "success" ]]; then
209
+ print_success "CI/CD pipeline: $name"
210
+ elif [[ "$conclusion" == "failure" ]]; then
211
+ print_error "CI/CD pipeline failed: $name"
212
+ print_info "View logs: gh run view $run_id --repo $repo --log-failed"
213
+ return 1
214
+ else
215
+ print_warning "CI/CD pipeline conclusion: $conclusion"
216
+ fi
217
+
218
+ # Check all recent workflows
219
+ print_info "Checking all recent workflows..."
220
+ local all_runs
221
+ all_runs=$(gh run list --repo "$repo" --limit=5 --json name,conclusion,status 2>/dev/null || echo "[]")
222
+
223
+ local failed_count
224
+ failed_count=$(echo "$all_runs" | jq '[.[] | select(.conclusion == "failure")] | length')
225
+
226
+ if [[ "$failed_count" -gt 0 ]]; then
227
+ print_warning "$failed_count workflow(s) failed recently"
228
+ echo "$all_runs" | jq -r '.[] | select(.conclusion == "failure") | " - \(.name): \(.conclusion)"'
229
+ fi
230
+
231
+ return 0
232
+ }
233
+
234
+ # Check SonarCloud quality gate
235
+ check_sonarcloud() {
236
+ print_section "SonarCloud Analysis"
237
+
238
+ # Check quality gate status
239
+ local qg_response
240
+ qg_response=$(curl -s "https://sonarcloud.io/api/qualitygates/project_status?projectKey=$SONAR_PROJECT_KEY" 2>/dev/null || echo "")
241
+
242
+ if [[ -z "$qg_response" ]]; then
243
+ print_skip "Could not reach SonarCloud API"
244
+ return 0
245
+ fi
246
+
247
+ local qg_status
248
+ qg_status=$(echo "$qg_response" | jq -r '.projectStatus.status // "UNKNOWN"')
249
+
250
+ if [[ "$qg_status" == "OK" ]]; then
251
+ print_success "SonarCloud quality gate: PASSED"
252
+ elif [[ "$qg_status" == "ERROR" ]]; then
253
+ print_error "SonarCloud quality gate: FAILED"
254
+
255
+ # Get failing conditions
256
+ echo "$qg_response" | jq -r '.projectStatus.conditions[] | select(.status == "ERROR") | " - \(.metricKey): \(.actualValue) (threshold: \(.errorThreshold))"'
257
+ elif [[ "$qg_status" == "WARN" ]]; then
258
+ print_warning "SonarCloud quality gate: WARNING"
259
+ else
260
+ print_warning "SonarCloud quality gate status: $qg_status"
261
+ fi
262
+
263
+ # Get current metrics
264
+ local metrics_response
265
+ metrics_response=$(curl -s "https://sonarcloud.io/api/measures/component?component=$SONAR_PROJECT_KEY&metricKeys=bugs,vulnerabilities,code_smells,security_hotspots" 2>/dev/null || echo "")
266
+
267
+ if [[ -n "$metrics_response" ]]; then
268
+ print_info "Current metrics:"
269
+ echo "$metrics_response" | jq -r '.component.measures[] | " - \(.metric): \(.value)"' 2>/dev/null || true
270
+ fi
271
+
272
+ # Check for new issues
273
+ local issues_response
274
+ issues_response=$(curl -s "https://sonarcloud.io/api/issues/search?componentKeys=$SONAR_PROJECT_KEY&resolved=false&severities=BLOCKER,CRITICAL&ps=5" 2>/dev/null || echo "")
275
+
276
+ if [[ -n "$issues_response" ]]; then
277
+ local critical_count
278
+ critical_count=$(echo "$issues_response" | jq -r '.total // 0')
279
+
280
+ if [[ "$critical_count" -gt 0 ]]; then
281
+ print_warning "$critical_count blocker/critical issues found"
282
+ echo "$issues_response" | jq -r '.issues[] | " - [\(.severity)] \(.message)"' 2>/dev/null | head -5 || true
283
+ fi
284
+ fi
285
+
286
+ return 0
287
+ }
288
+
289
+ # Check Codacy status
290
+ check_codacy() {
291
+ print_section "Codacy Analysis"
292
+
293
+ local codacy_script="$REPO_ROOT/.agent/scripts/codacy-cli.sh"
294
+
295
+ if [[ -f "$codacy_script" ]]; then
296
+ if bash "$codacy_script" status &> /dev/null; then
297
+ print_success "Codacy CLI: Available"
298
+ print_info "Run 'bash $codacy_script analyze' for detailed analysis"
299
+ else
300
+ print_skip "Codacy CLI not configured"
301
+ fi
302
+ else
303
+ print_skip "Codacy CLI script not found"
304
+ fi
305
+
306
+ # Check via dashboard link
307
+ print_info "Dashboard: https://app.codacy.com/gh/marcusquinn/aidevops"
308
+
309
+ return 0
310
+ }
311
+
312
+ # Check security with Snyk
313
+ check_snyk() {
314
+ print_section "Security Scanning (Snyk)"
315
+
316
+ if ! command -v snyk &> /dev/null; then
317
+ print_skip "Snyk CLI not installed"
318
+ print_info "Install: brew tap snyk/tap && brew install snyk-cli"
319
+ return 0
320
+ fi
321
+
322
+ # Check authentication
323
+ if ! snyk auth check &> /dev/null 2>&1; then
324
+ print_skip "Snyk not authenticated"
325
+ print_info "Run: snyk auth"
326
+ return 0
327
+ fi
328
+
329
+ print_info "Running Snyk security scan..."
330
+
331
+ local snyk_output
332
+ local snyk_exit=0
333
+ snyk_output=$(snyk test --severity-threshold=high --json 2>/dev/null) || snyk_exit=$?
334
+
335
+ if [[ $snyk_exit -eq 0 ]]; then
336
+ print_success "Snyk: No high/critical vulnerabilities"
337
+ elif [[ $snyk_exit -eq 1 ]]; then
338
+ local vuln_count
339
+ vuln_count=$(echo "$snyk_output" | jq -r '.vulnerabilities | length // 0')
340
+ print_error "Snyk: $vuln_count vulnerabilities found"
341
+
342
+ # Show top vulnerabilities
343
+ echo "$snyk_output" | jq -r '.vulnerabilities[:5][] | " - [\(.severity)] \(.title) in \(.packageName)"' 2>/dev/null || true
344
+ else
345
+ print_warning "Snyk scan completed with warnings"
346
+ fi
347
+
348
+ return 0
349
+ }
350
+
351
+ # Check for exposed secrets
352
+ check_secrets() {
353
+ print_section "Secret Detection (Secretlint)"
354
+
355
+ if command -v secretlint &> /dev/null; then
356
+ print_info "Running Secretlint scan..."
357
+
358
+ if secretlint "**/*" --format compact 2>/dev/null; then
359
+ print_success "Secretlint: No secrets detected"
360
+ else
361
+ print_error "Secretlint: Potential secrets found"
362
+ return 1
363
+ fi
364
+ elif [[ -f "$REPO_ROOT/node_modules/.bin/secretlint" ]]; then
365
+ print_info "Running Secretlint (local)..."
366
+
367
+ if "$REPO_ROOT/node_modules/.bin/secretlint" "**/*" --format compact 2>/dev/null; then
368
+ print_success "Secretlint: No secrets detected"
369
+ else
370
+ print_error "Secretlint: Potential secrets found"
371
+ return 1
372
+ fi
373
+ else
374
+ print_skip "Secretlint not installed"
375
+ print_info "Install: npm install -g secretlint @secretlint/secretlint-rule-preset-recommend"
376
+ fi
377
+
378
+ return 0
379
+ }
380
+
381
+ # Check npm audit (if applicable)
382
+ check_npm_audit() {
383
+ print_section "Dependency Audit"
384
+
385
+ if [[ -f "$REPO_ROOT/package.json" ]]; then
386
+ if command -v npm &> /dev/null; then
387
+ print_info "Running npm audit..."
388
+
389
+ local audit_output
390
+ local audit_exit=0
391
+ audit_output=$(npm audit --audit-level=high --json 2>/dev/null) || audit_exit=$?
392
+
393
+ if [[ $audit_exit -eq 0 ]]; then
394
+ print_success "npm audit: No high/critical vulnerabilities"
395
+ else
396
+ local vuln_count
397
+ vuln_count=$(echo "$audit_output" | jq -r '.metadata.vulnerabilities.high + .metadata.vulnerabilities.critical // 0')
398
+ print_warning "npm audit: $vuln_count high/critical vulnerabilities"
399
+ fi
400
+ else
401
+ print_skip "npm not available"
402
+ fi
403
+ else
404
+ print_skip "No package.json found"
405
+ fi
406
+
407
+ return 0
408
+ }
409
+
410
+ # Run local quality checks
411
+ check_local_quality() {
412
+ print_section "Local Quality Checks"
413
+
414
+ local quality_script="$REPO_ROOT/.agent/scripts/linters-local.sh"
415
+
416
+ if [[ -f "$quality_script" ]]; then
417
+ print_info "Running linters-local.sh..."
418
+
419
+ if bash "$quality_script" &> /dev/null; then
420
+ print_success "Local quality checks passed"
421
+ else
422
+ print_warning "Local quality checks reported issues"
423
+ print_info "Run: bash $quality_script (for details)"
424
+ fi
425
+ else
426
+ print_skip "linters-local.sh not found"
427
+ fi
428
+
429
+ return 0
430
+ }
431
+
432
+ # Print summary
433
+ print_summary() {
434
+ echo ""
435
+ echo -e "${BLUE}========================================${NC}"
436
+ echo -e "${BLUE} Summary${NC}"
437
+ echo -e "${BLUE}========================================${NC}"
438
+ echo "Finished: $(date)"
439
+ echo ""
440
+ echo -e " ${GREEN}Passed:${NC} $PASSED"
441
+ echo -e " ${RED}Failed:${NC} $FAILED"
442
+ echo -e " ${YELLOW}Warnings:${NC} $WARNINGS"
443
+ echo -e " ${BLUE}Skipped:${NC} $SKIPPED"
444
+ echo ""
445
+
446
+ if [[ $FAILED -gt 0 ]]; then
447
+ echo -e "${RED}POSTFLIGHT VERIFICATION FAILED${NC}"
448
+ echo ""
449
+ echo "Recommended actions:"
450
+ echo " 1. Review failed checks above"
451
+ echo " 2. Consider rollback if critical issues found"
452
+ echo " 3. See: .agent/workflows/postflight.md#rollback-procedures"
453
+ return 1
454
+ elif [[ $WARNINGS -gt 0 ]]; then
455
+ echo -e "${YELLOW}POSTFLIGHT VERIFICATION PASSED WITH WARNINGS${NC}"
456
+ echo ""
457
+ echo "Review warnings above and address in next release if needed."
458
+ return 0
459
+ else
460
+ echo -e "${GREEN}POSTFLIGHT VERIFICATION PASSED${NC}"
461
+ return 0
462
+ fi
463
+ }
464
+
465
+ # Show usage
466
+ show_usage() {
467
+ echo "Usage: $0 [OPTIONS]"
468
+ echo ""
469
+ echo "Options:"
470
+ echo " --quick Run quick checks only (CI/CD + SonarCloud)"
471
+ echo " --full Run all checks (default)"
472
+ echo " --ci-only Run CI/CD checks only"
473
+ echo " --security-only Run security checks only"
474
+ echo " --help Show this help message"
475
+ echo ""
476
+ echo "Examples:"
477
+ echo " $0 # Run full postflight verification"
478
+ echo " $0 --quick # Quick check after minor release"
479
+ echo " $0 --security # Security-focused verification"
480
+ return 0
481
+ }
482
+
483
+ # Main function
484
+ main() {
485
+ local mode="full"
486
+
487
+ # Parse arguments
488
+ while [[ $# -gt 0 ]]; do
489
+ local arg="$1"
490
+ case "$arg" in
491
+ --quick)
492
+ mode="quick"
493
+ shift
494
+ ;;
495
+ --full)
496
+ mode="full"
497
+ shift
498
+ ;;
499
+ --ci-only)
500
+ mode="ci-only"
501
+ shift
502
+ ;;
503
+ --security-only)
504
+ mode="security-only"
505
+ shift
506
+ ;;
507
+ --help|-h)
508
+ show_usage
509
+ return 0
510
+ ;;
511
+ *)
512
+ echo "Unknown option: $arg"
513
+ show_usage
514
+ return 1
515
+ ;;
516
+ esac
517
+ done
518
+
519
+ print_header
520
+
521
+ cd "$REPO_ROOT" || exit
522
+
523
+ case "$mode" in
524
+ quick)
525
+ check_cicd_status || true
526
+ check_sonarcloud || true
527
+ ;;
528
+ ci-only)
529
+ check_cicd_status || true
530
+ ;;
531
+ security-only)
532
+ check_snyk || true
533
+ check_secrets || true
534
+ check_npm_audit || true
535
+ ;;
536
+ full)
537
+ check_cicd_status || true
538
+ check_sonarcloud || true
539
+ check_codacy || true
540
+ check_snyk || true
541
+ check_secrets || true
542
+ check_npm_audit || true
543
+ check_local_quality || true
544
+ ;;
545
+ *)
546
+ print_error "Unknown mode: $mode"
547
+ return 1
548
+ ;;
549
+ esac
550
+
551
+ print_summary
552
+ return $?
553
+ }
554
+
555
+ main "$@"