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