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,339 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Local Browser Automation for AI DevOps Framework
4
+ Privacy-first browser automation using LOCAL browsers only (no cloud services)
5
+
6
+ Author: AI DevOps Framework
7
+ Version: 1.4.0
8
+
9
+ PRIVACY & SECURITY:
10
+ - All browser automation runs locally on your machine
11
+ - No data sent to cloud services or external browsers
12
+ - Complete privacy and security with local-only operation
13
+ - User maintains full control over browser and data
14
+
15
+ IMPORTANT: This script is for educational purposes and personal use only.
16
+ Always respect website Terms of Service and use responsibly.
17
+ """
18
+
19
+ import time
20
+ import random
21
+ import os
22
+ from datetime import datetime
23
+
24
+ # Local browser automation imports (no cloud dependencies)
25
+ try:
26
+ from playwright.sync_api import sync_playwright, Page
27
+ PLAYWRIGHT_AVAILABLE = True
28
+ except ImportError:
29
+ PLAYWRIGHT_AVAILABLE = False
30
+
31
+ try:
32
+ from selenium import webdriver
33
+ from selenium.webdriver.chrome.options import Options as ChromeOptions
34
+ from selenium.webdriver.firefox.options import Options as FirefoxOptions
35
+ SELENIUM_AVAILABLE = True
36
+ except ImportError:
37
+ SELENIUM_AVAILABLE = False
38
+
39
+ class LocalBrowserAutomation:
40
+ """Local browser automation class with privacy-first approach"""
41
+
42
+ def __init__(self, headless: bool = False, delay_range: tuple = (2, 5)):
43
+ self.headless = headless
44
+ self.delay_range = delay_range
45
+ self.session_stats = {
46
+ 'actions_performed': 0,
47
+ 'pages_visited': 0,
48
+ 'errors': 0,
49
+ 'start_time': datetime.now(),
50
+ 'browser_type': 'local'
51
+ }
52
+
53
+ print("🔒 LOCAL BROWSER AUTOMATION - Privacy First")
54
+ print("✅ All automation runs locally on your machine")
55
+ print("✅ No data sent to cloud services")
56
+ print("✅ Complete privacy and security")
57
+ print("")
58
+
59
+ def random_delay(self, min_delay: float = None, max_delay: float = None):
60
+ """Add random delay to mimic human behavior"""
61
+ if min_delay is None:
62
+ min_delay = self.delay_range[0]
63
+ if max_delay is None:
64
+ max_delay = self.delay_range[1]
65
+
66
+ delay = random.uniform(min_delay, max_delay)
67
+ print(f"⏳ Human-like delay: {delay:.1f} seconds...")
68
+ time.sleep(delay)
69
+
70
+ def get_local_playwright_browser(self, browser_type="chromium"):
71
+ """Get a local Playwright browser instance"""
72
+ if not PLAYWRIGHT_AVAILABLE:
73
+ raise ImportError("Playwright not available. Install with: pip install playwright")
74
+
75
+ print(f"🎭 Starting LOCAL Playwright {browser_type} browser...")
76
+
77
+ p = sync_playwright().start()
78
+
79
+ # Browser configuration for privacy
80
+ browser_config = {
81
+ "headless": self.headless,
82
+ "args": [
83
+ "--no-first-run",
84
+ "--disable-background-timer-throttling",
85
+ "--disable-backgrounding-occluded-windows",
86
+ "--disable-renderer-backgrounding",
87
+ "--disable-features=TranslateUI",
88
+ "--disable-ipc-flooding-protection",
89
+ "--disable-web-security", # For local testing only
90
+ "--disable-features=VizDisplayCompositor"
91
+ ]
92
+ }
93
+
94
+ if browser_type == "chromium":
95
+ browser = p.chromium.launch(**browser_config)
96
+ elif browser_type == "firefox":
97
+ browser = p.firefox.launch(**browser_config)
98
+ elif browser_type == "webkit":
99
+ browser = p.webkit.launch(**browser_config)
100
+ else:
101
+ browser = p.chromium.launch(**browser_config)
102
+
103
+ print(f"✅ LOCAL {browser_type} browser started successfully")
104
+ return browser, p
105
+
106
+ def get_local_selenium_driver(self, browser_type="chrome"):
107
+ """Get a local Selenium WebDriver instance"""
108
+ if not SELENIUM_AVAILABLE:
109
+ raise ImportError("Selenium not available. Install with: pip install selenium")
110
+
111
+ print(f"🔧 Starting LOCAL Selenium {browser_type} driver...")
112
+
113
+ if browser_type == "chrome":
114
+ options = ChromeOptions()
115
+ if self.headless:
116
+ options.add_argument("--headless")
117
+
118
+ # Privacy and security options
119
+ options.add_argument("--no-sandbox")
120
+ options.add_argument("--disable-dev-shm-usage")
121
+ options.add_argument("--disable-blink-features=AutomationControlled")
122
+ options.add_argument("--disable-extensions")
123
+ options.add_argument("--disable-plugins")
124
+ options.add_argument("--disable-images") # Faster loading
125
+ options.add_argument("--disable-javascript") # Optional for scraping
126
+
127
+ # User agent for privacy
128
+ options.add_argument("--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
129
+
130
+ driver = webdriver.Chrome(options=options)
131
+
132
+ elif browser_type == "firefox":
133
+ options = FirefoxOptions()
134
+ if self.headless:
135
+ options.add_argument("--headless")
136
+
137
+ # Privacy options
138
+ options.set_preference("dom.webnotifications.enabled", False)
139
+ options.set_preference("media.volume_scale", "0.0")
140
+
141
+ driver = webdriver.Firefox(options=options)
142
+ else:
143
+ raise ValueError(f"Unsupported browser type: {browser_type}")
144
+
145
+ print(f"✅ LOCAL {browser_type} driver started successfully")
146
+ return driver
147
+
148
+ def linkedin_automation_playwright(self, email: str, password: str, max_likes: int = 10):
149
+ """LinkedIn automation using LOCAL Playwright browser"""
150
+ print("🔗 Starting LOCAL LinkedIn automation with Playwright...")
151
+ print("🔒 Privacy: All automation runs locally on your machine")
152
+
153
+ browser, playwright = self.get_local_playwright_browser()
154
+ context = browser.new_context(
155
+ user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
156
+ viewport={"width": 1920, "height": 1080}
157
+ )
158
+ page = context.new_page()
159
+
160
+ try:
161
+ # Login to LinkedIn
162
+ if not self._playwright_login(page, email, password):
163
+ return False
164
+
165
+ # Navigate to feed
166
+ print("📰 Navigating to LinkedIn feed...")
167
+ page.goto("https://www.linkedin.com/feed/")
168
+ page.wait_for_load_state("networkidle")
169
+
170
+ # Like posts on timeline
171
+ self._playwright_like_posts(page, max_likes)
172
+
173
+ # Print session summary
174
+ self._print_session_summary()
175
+
176
+ return True
177
+
178
+ except Exception as e:
179
+ print(f"❌ Error during LOCAL automation: {e}")
180
+ self.session_stats['errors'] += 1
181
+ return False
182
+ finally:
183
+ browser.close()
184
+ playwright.stop()
185
+ print("🔒 LOCAL browser closed - no data transmitted externally")
186
+
187
+ def _playwright_login(self, page: Page, email: str, password: str) -> bool:
188
+ """Login to LinkedIn using LOCAL Playwright"""
189
+ try:
190
+ print("🔐 Logging into LinkedIn using LOCAL browser...")
191
+ page.goto("https://www.linkedin.com/login")
192
+
193
+ # Fill login form
194
+ page.fill('input[name="session_key"]', email)
195
+ page.fill('input[name="session_password"]', password)
196
+
197
+ # Click login button
198
+ page.click('button[type="submit"]')
199
+
200
+ # Wait for navigation
201
+ page.wait_for_load_state("networkidle")
202
+
203
+ # Check if login was successful
204
+ if "feed" in page.url or "mynetwork" in page.url:
205
+ print("✅ Successfully logged into LinkedIn via LOCAL browser")
206
+ return True
207
+ else:
208
+ print("❌ Login failed - check credentials")
209
+ return False
210
+
211
+ except Exception as e:
212
+ print(f"❌ Login error: {e}")
213
+ return False
214
+
215
+ def _playwright_like_posts(self, page: Page, max_likes: int):
216
+ """Like posts on LinkedIn timeline using LOCAL Playwright"""
217
+ print(f"👍 Starting to like posts using LOCAL browser (max: {max_likes})...")
218
+
219
+ likes_given = 0
220
+ scroll_attempts = 0
221
+ max_scrolls = 5
222
+
223
+ while likes_given < max_likes and scroll_attempts < max_scrolls:
224
+ # Find like buttons that haven't been clicked
225
+ like_buttons = page.query_selector_all(
226
+ 'button[aria-label*="Like"][aria-pressed="false"]'
227
+ )
228
+
229
+ if not like_buttons:
230
+ print("📜 Scrolling to load more posts...")
231
+ page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
232
+ self.random_delay(3, 6)
233
+ scroll_attempts += 1
234
+ continue
235
+
236
+ # Like posts with random selection
237
+ for button in like_buttons[:min(3, max_likes - likes_given)]:
238
+ try:
239
+ # Scroll button into view
240
+ button.scroll_into_view_if_needed()
241
+ self.random_delay(1, 3)
242
+
243
+ # Click like button
244
+ button.click()
245
+ likes_given += 1
246
+ self.session_stats['actions_performed'] += 1
247
+
248
+ print(f"👍 Liked post {likes_given}/{max_likes} (LOCAL browser)")
249
+
250
+ # Random delay between likes
251
+ self.random_delay()
252
+
253
+ if likes_given >= max_likes:
254
+ break
255
+
256
+ except Exception as e:
257
+ print(f"⚠️ Error liking post: {e}")
258
+ self.session_stats['errors'] += 1
259
+ continue
260
+
261
+ # Scroll for more content
262
+ if likes_given < max_likes:
263
+ page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
264
+ self.random_delay(3, 6)
265
+ scroll_attempts += 1
266
+
267
+ print(f"✅ Completed LOCAL liking session: {likes_given} posts liked")
268
+
269
+ def _print_session_summary(self):
270
+ """Print automation session summary"""
271
+ duration = datetime.now() - self.session_stats['start_time']
272
+
273
+ print("\n" + "="*60)
274
+ print("📊 LOCAL Browser Automation Session Summary")
275
+ print("="*60)
276
+ print(f"🔒 Browser Type: LOCAL {self.session_stats['browser_type']}")
277
+ print(f"👍 Actions Performed: {self.session_stats['actions_performed']}")
278
+ print(f"📰 Pages Visited: {self.session_stats['pages_visited']}")
279
+ print(f"❌ Errors: {self.session_stats['errors']}")
280
+ print(f"⏱️ Duration: {duration}")
281
+ print(f"🕐 Started: {self.session_stats['start_time'].strftime('%Y-%m-%d %H:%M:%S')}")
282
+ print("🔒 Privacy: All data processed locally - no external transmission")
283
+ print("="*60)
284
+
285
+ def main():
286
+ """Main function for LOCAL browser automation"""
287
+ print("🔒 LOCAL Browser Automation for AI DevOps Framework")
288
+ print("✅ Privacy-first automation using LOCAL browsers only")
289
+ print("⚠️ IMPORTANT: Use responsibly and respect website Terms of Service")
290
+ print("")
291
+
292
+ # Check if LOCAL automation tools are available
293
+ if not PLAYWRIGHT_AVAILABLE and not SELENIUM_AVAILABLE:
294
+ print("❌ No LOCAL browser automation tools available")
295
+ print("Install with: pip install playwright selenium")
296
+ print("Then run: playwright install")
297
+ return
298
+
299
+ # Get credentials from environment
300
+ email = os.getenv('LINKEDIN_EMAIL')
301
+ password = os.getenv('LINKEDIN_PASSWORD')
302
+
303
+ if not email or not password:
304
+ print("🔐 LinkedIn credentials not found in environment variables")
305
+ print("Set LINKEDIN_EMAIL and LINKEDIN_PASSWORD environment variables")
306
+ print("Example: export LINKEDIN_EMAIL=your@email.com")
307
+ print(" export LINKEDIN_PASSWORD=yourpassword")
308
+ return
309
+
310
+ # Configuration
311
+ max_likes = int(os.getenv('LINKEDIN_MAX_LIKES', '10'))
312
+ headless = os.getenv('LINKEDIN_HEADLESS', 'false').lower() == 'true'
313
+
314
+ print(f"⚙️ LOCAL Browser Configuration:")
315
+ print(f" Email: {email}")
316
+ print(f" Max likes: {max_likes}")
317
+ print(f" Headless: {headless}")
318
+ print(f" Privacy: LOCAL browser only")
319
+ print("")
320
+
321
+ # Create LOCAL automation instance
322
+ automation = LocalBrowserAutomation(headless=headless)
323
+
324
+ # Run LOCAL automation
325
+ if PLAYWRIGHT_AVAILABLE:
326
+ print("🎭 Using LOCAL Playwright for automation")
327
+ success = automation.linkedin_automation_playwright(email, password, max_likes)
328
+ else:
329
+ print("❌ Playwright not available for LOCAL automation")
330
+ success = False
331
+
332
+ if success:
333
+ print("🎉 LOCAL LinkedIn automation completed successfully!")
334
+ print("🔒 All data processed locally - complete privacy maintained")
335
+ else:
336
+ print("❌ LOCAL LinkedIn automation failed")
337
+
338
+ if __name__ == "__main__":
339
+ main()