/ package.json
package.json
  1  {
  2    "name": "333-method-automation",
  3    "version": "1.0.0",
  4    "description": "Automated SERP→outreach pipeline for local business sites",
  5    "main": "src/poc.js",
  6    "type": "module",
  7    "scripts": {
  8      "all": "nice -n 19 node scripts/npm-logger.js all node src/all.js",
  9      "keywords": "nice -n 19 node scripts/npm-logger.js keywords node src/cli/keywords.js",
 10      "keywords:coverage": "node scripts/npm-logger.js keywords-coverage node scripts/analyze-keyword-coverage.js",
 11      "keywords:compare": "node scripts/npm-logger.js keywords-compare node scripts/compare-keywords.js",
 12      "keywords:recommend": "node scripts/npm-logger.js keywords-recommend node scripts/recommend-threshold.js",
 13      "keywords:expand": "node scripts/npm-logger.js keywords-expand node scripts/expand-low-keyword-countries.js",
 14      "serps": "nice -n 19 node scripts/npm-logger.js serps node src/cli/serps.js",
 15      "assets": "nice -n 19 node scripts/npm-logger.js assets node src/cli/assets.js",
 16      "scoring": "nice -n 19 node scripts/npm-logger.js scoring node src/cli/scoring.js",
 17      "rescoring": "nice -n 19 node scripts/npm-logger.js rescoring node src/cli/rescoring.js",
 18      "enrich": "nice -n 19 node scripts/npm-logger.js enrich node src/cli/enrich.js",
 19      "proposals": "nice -n 19 node scripts/npm-logger.js proposals node src/cli/proposals.js",
 20      "outreach": "nice -n 19 node scripts/npm-logger.js outreach node src/cli/outreach.js",
 21      "outreach:forms": "nice -n 19 node scripts/npm-logger.js outreach-forms node src/outreach/form.js run",
 22      "replies": "nice -n 19 node scripts/npm-logger.js replies node src/cli/replies.js",
 23      "reply-processor": "nice -n 19 node scripts/npm-logger.js reply-processor node src/cli/reply-processor.js",
 24      "poc": "nice -n 19 node scripts/npm-logger.js poc node src/poc.js",
 25      "mvp": "nice -n 19 node scripts/npm-logger.js mvp node src/mvp.js",
 26      "process": "nice -n 19 node scripts/npm-logger.js process node src/process.js",
 27      "init-db": "node scripts/npm-logger.js init-db node scripts/init-db.js",
 28      "db-migrate": "node scripts/npm-logger.js db-migrate node scripts/db-migrate.js",
 29      "backfill-keywords": "nice -n 19 node scripts/npm-logger.js backfill-keywords node scripts/backfill-keywords.js",
 30      "backfill-screenshots": "nice -n 19 node scripts/npm-logger.js backfill-screenshots node scripts/backfill-screenshots.js",
 31      "backfill-regex-contacts": "nice -n 19 node scripts/npm-logger.js backfill-regex-contacts node scripts/backfill-regex-contacts.js",
 32      "competitors": "nice -n 19 node scripts/npm-logger.js competitors node src/competitor-analysis.js",
 33      "proposals:v2": "nice -n 19 node scripts/npm-logger.js proposals-v2 node src/proposal-generator-v2.js",
 34      "retry": "nice -n 19 node scripts/npm-logger.js retry node src/retry-failed.js",
 35      "sync-unsubscribes": "nice -n 19 node scripts/npm-logger.js sync-unsubscribes node src/utils/sync-unsubscribes.js",
 36      "sync-email-events": "nice -n 19 node scripts/npm-logger.js sync-email-events node src/utils/sync-email-events.js",
 37      "sync-daemon": "nice -n 19 node scripts/npm-logger.js sync-daemon node src/sync-daemon.js",
 38      "profiles": "node scripts/npm-logger.js profiles node scripts/manage-profiles.js",
 39      "pricing:summary": "node scripts/npm-logger.js pricing-summary node src/utils/country-pricing.js summary",
 40      "pricing:get": "node scripts/npm-logger.js pricing-get node src/utils/country-pricing.js get",
 41      "pricing:tier": "node scripts/npm-logger.js pricing-tier node src/utils/country-pricing.js tier",
 42      "pricing:override": "node scripts/npm-logger.js pricing-override node src/utils/country-pricing.js override",
 43      "pricing:update": "nice -n 19 node scripts/npm-logger.js pricing-update node src/cron/weekly-repricing.js",
 44      "pricing:export": "node scripts/npm-logger.js pricing-export node src/api/pricing-export.js",
 45      "cron": "nice -n 19 node scripts/npm-logger.js cron node src/cron.js",
 46      "pipeline:service": "nice -n 19 node scripts/npm-logger.js pipeline-service node src/pipeline-service.js",
 47      "cron:list": "node scripts/npm-logger.js cron-list node src/cli/cron-manager.js list",
 48      "cron:enable": "node scripts/npm-logger.js cron-enable node src/cli/cron-manager.js enable",
 49      "cron:disable": "node scripts/npm-logger.js cron-disable node src/cli/cron-manager.js disable",
 50      "cron:add": "node scripts/npm-logger.js cron-add node src/cli/cron-manager.js add",
 51      "cron:remove": "node scripts/npm-logger.js cron-remove node src/cli/cron-manager.js remove",
 52      "cron:logs": "node scripts/npm-logger.js cron-logs node src/cli/cron-manager.js logs",
 53      "cron:stats": "node scripts/npm-logger.js cron-stats node src/cli/cron-manager.js stats",
 54      "cron:run": "node scripts/npm-logger.js cron-run node scripts/run-cron-job.js",
 55      "cron:migrate": "node scripts/npm-logger.js cron-migrate node scripts/migrate-cron-tasks.js",
 56      "cron:cleanup-stale": "node scripts/npm-logger.js cron-cleanup-stale node scripts/cleanup-stale-jobs.js",
 57      "watchdog:status": "cat /tmp/watchdog-status.txt 2>/dev/null || echo 'No status yet'",
 58      "monitor:status": "cat /tmp/watchdog-status.txt 2>/dev/null || echo 'No status yet'",
 59      "monitor:guardian": "node -e \"import('./src/cron/process-guardian.js').then(m => m.runProcessGuardian()).then(r => console.log(JSON.stringify(r, null, 2)))\"",
 60      "collect-metrics": "node scripts/npm-logger.js collect-metrics node scripts/collect-system-metrics.js",
 61      "status": "node src/cli/status.js",
 62      "credits": "node src/utils/openrouter-monitor.js",
 63      "credits:verbose": "node src/utils/openrouter-monitor.js --verbose",
 64      "credits:monitor": "node scripts/npm-logger.js credits-monitor node src/cron/monitor-openrouter-credits.js",
 65      "rate-limits": "node scripts/rate-limits.mjs",
 66      "rate-limits:clear": "node scripts/rate-limits.mjs --clear",
 67      "inbound:poll": "nice -n 19 node scripts/npm-logger.js inbound-poll node src/inbound/processor.js poll",
 68      "inbound:process-replies": "nice -n 19 node scripts/npm-logger.js inbound-process-replies node src/inbound/processor.js process-replies",
 69      "inbound:inbox": "nice -n 19 node scripts/npm-logger.js inbound-inbox node src/inbound/processor.js inbox",
 70      "inbound:thread": "nice -n 19 node scripts/npm-logger.js inbound-thread node src/inbound/processor.js thread",
 71      "inbound:stats": "nice -n 19 node scripts/npm-logger.js inbound-stats node src/inbound/processor.js stats",
 72      "inbound:email": "nice -n 19 node scripts/npm-logger.js inbound-email node src/inbound/email.js poll",
 73      "inbound:sms": "nice -n 19 node scripts/npm-logger.js inbound-sms node src/inbound/sms.js poll",
 74      "paypal:create-order": "nice -n 19 node scripts/npm-logger.js paypal-create-order node src/payment/paypal.js create-order",
 75      "paypal:verify": "nice -n 19 node scripts/npm-logger.js paypal-verify node src/payment/paypal.js verify",
 76      "paypal:webhook": "nice -n 19 node scripts/npm-logger.js paypal-webhook node src/payment/webhook-handler.js server",
 77      "paypal:poll": "nice -n 19 node scripts/npm-logger.js paypal-poll node src/payment/poll-paypal-events.js",
 78      "report:generate": "node scripts/npm-logger.js report-generate node src/reports/cro-report-generator.js generate",
 79      "report:daily": "node scripts/npm-logger.js report-daily node scripts/generate-daily-report.js",
 80      "benchmark:contacts": "node scripts/benchmark-contact-extraction.js",
 81      "benchmark:captcha": "node scripts/benchmark-captcha-providers.js",
 82      "report:pipeline": "node scripts/pipeline-progress-report.js",
 83      "export:business-plan": "node scripts/npm-logger.js export-business-plan node scripts/export-business-plan.js",
 84      "dedupe": "node scripts/npm-logger.js dedupe node scripts/dedupe-domains.js",
 85      "dedupe:dry-run": "node scripts/npm-logger.js dedupe-dry-run node scripts/dedupe-domains.js --dry-run",
 86      "dedupe:locale": "node scripts/npm-logger.js dedupe-locale node scripts/dedupe-locale-aware.js",
 87      "dedupe:locale:dry-run": "node scripts/npm-logger.js dedupe-locale-dry-run node scripts/dedupe-locale-aware.js --dry-run",
 88      "dedupe:outreaches": "node scripts/npm-logger.js dedupe-outreaches node scripts/dedupe-outreaches.js",
 89      "dedupe:outreaches:dry-run": "node scripts/npm-logger.js dedupe-outreaches-dry-run node scripts/dedupe-outreaches.js --dry-run",
 90      "validate-contacts": "node scripts/npm-logger.js validate-contacts node scripts/validate-contacts.js",
 91      "validate:emails": "node scripts/npm-logger.js validate-emails node scripts/validate-email-queue.js --yes",
 92      "validate:emails:dry-run": "node scripts/npm-logger.js validate-emails-dry-run node scripts/validate-email-queue.js --dry-run",
 93      "zerobounce:credits": "node -e \"import('./src/utils/zerobounce.js').then(m => m.checkCredits()).then(c => console.log('ZeroBounce credits:', c)).catch(e => console.error(e.message))\"",
 94      "cleanup:screenshots": "node scripts/npm-logger.js cleanup-screenshots node scripts/cleanup-ignored-screenshots.js",
 95      "cleanup:screenshots:dry-run": "node scripts/npm-logger.js cleanup-screenshots-dry-run node scripts/cleanup-ignored-screenshots.js --dry-run",
 96      "cleanup:uncropped": "node scripts/npm-logger.js cleanup-uncropped node scripts/delete-all-uncropped.js",
 97      "cleanup:uncropped:dry-run": "node scripts/npm-logger.js cleanup-uncropped-dry-run node scripts/delete-all-uncropped.js --dry-run",
 98      "cleanup:reset-failing": "node scripts/npm-logger.js cleanup-reset-failing node scripts/reset-failing-sites.js",
 99      "cleanup:reset-failing:dry-run": "node scripts/npm-logger.js cleanup-reset-failing-dry-run node scripts/reset-failing-sites.js --dry-run",
100      "dedupe:uncropped": "node scripts/npm-logger.js dedupe-uncropped node scripts/dedupe-uncropped-screenshots.js",
101      "dedupe:uncropped:dry-run": "node scripts/npm-logger.js dedupe-uncropped-dry-run node scripts/dedupe-uncropped-screenshots.js --dry-run",
102      "test:autocrop": "node scripts/npm-logger.js test-autocrop node scripts/test-sharp-autocrop.js",
103      "logs:rotate": "node src/utils/log-rotator.js",
104      "logs:rotate:dry-run": "node src/utils/log-rotator.js --dry-run",
105      "logs:rotate:30d": "node src/utils/log-rotator.js --days=30",
106      "test": "NODE_ENV=test LOGS_DIR=/tmp/test-logs DATABASE_PATH=/tmp/test-sites.db OPS_DB_PATH=/tmp/test-ops.db TEL_DB_PATH=/tmp/test-telemetry.db node_modules/.bin/c8 --reporter=html --reporter=text --reporter=json-summary node --import ./tests/helpers/setup-split-dbs.js --experimental-test-module-mocks --test --test-force-exit --test-concurrency=4 'tests/**/*.test.js'",
107      "posttest": "node scripts/notify-cron.js fullTestSuite",
108      "test:quarantined": "NODE_ENV=test LOGS_DIR=/tmp/test-logs DATABASE_PATH=/tmp/test-sites.db OPS_DB_PATH=/tmp/test-ops.db TEL_DB_PATH=/tmp/test-telemetry.db node --import ./tests/helpers/setup-split-dbs.js --experimental-test-module-mocks --test --test-force-exit '__quarantined_tests__/**/*.test.js'",
109      "test:unit": "NODE_ENV=test LOGS_DIR=/tmp/test-logs DATABASE_PATH=/tmp/test-sites.db node --experimental-test-module-mocks --test --test-concurrency=1 --test-force-exit 'tests/utils/rate-limiter.test.js' 'tests/utils/error-handler.test.js' 'tests/utils/logger.test.js' 'tests/compliance/email-compliance-supplement.test.js' 'tests/compliance/sms-compliance-supplement2.test.js'",
110      "test:integration": "NODE_ENV=test CI=true node --experimental-test-module-mocks --test --test-force-exit 'tests/**/*.integration.test.js' 2>&1 | tee .quality-reports/integration-tap.txt && node scripts/save-test-results.js .quality-reports/integration-tap.txt .quality-reports/integration-test-results.json || true",
111      "test:e2e": "NODE_ENV=test node --test tests/pipeline-e2e.test.js 2>&1 | tee .quality-reports/e2e-tap.txt && node scripts/save-test-results.js .quality-reports/e2e-tap.txt .quality-reports/e2e-test-results.json || true",
112      "test:e2e:sms": "NODE_ENV=test node --experimental-test-module-mocks --test --test-force-exit 'tests/outreach/outreach-sms-loopback.e2e.test.js'",
113      "test:reports": "NODE_ENV=test LOGS_DIR=/tmp/test-logs node --test tests/reports/auditandfix-delivery.test.js",
114      "test:checkout": "NODE_ENV=test node --test tests/e2e/auditandfix-checkout.test.js",
115      "test:geo": "NODE_ENV=test node --test tests/e2e/geo-detection.test.js",
116      "test:prefill": "NODE_ENV=test node --test tests/e2e/prefill-short-url.test.js",
117      "test:scan-nurture": "NODE_ENV=test node --test tests/e2e/scan-email-nurture.test.js",
118      "test:i18n": "NODE_ENV=test node --test tests/website/i18n-keys.test.js",
119      "test:all": "NODE_ENV=test LOGS_DIR=/tmp/test-logs DATABASE_PATH=/tmp/test-sites.db OPS_DB_PATH=/tmp/test-ops.db TEL_DB_PATH=/tmp/test-telemetry.db node_modules/.bin/c8 --reporter=html --reporter=text --reporter=json-summary node --import ./tests/helpers/setup-split-dbs.js --experimental-test-module-mocks --test --test-force-exit --test-concurrency=4 'tests/**/*.test.js' 2>&1 | tee .quality-reports/coverage.txt",
120      "test:watch": "NODE_ENV=test node --experimental-test-module-mocks --test --test-force-exit --watch tests/*.test.js",
121      "test:stealth": "node scripts/test-stealth.js",
122      "test:stealth:minimal": "node scripts/test-stealth.js minimal",
123      "test:stealth:standard": "node scripts/test-stealth.js standard",
124      "test:stealth:aggressive": "node scripts/test-stealth.js aggressive",
125      "test:prompts": "promptfoo eval --config config/promptfoo.yaml",
126      "test:prompts:view": "promptfoo view",
127      "lint": "eslint src/ scripts/",
128      "lint:fix": "eslint src/ scripts/ --fix",
129      "quality-check": "node scripts/quality-check.js",
130      "postquality-check": "node scripts/notify-cron.js unifiedAutofix fullTestSuite",
131      "sage:autofix": "node scripts/sage-auto-fix.js",
132      "autofix": "node scripts/unified-autofix.js",
133      "postautofix": "node scripts/notify-cron.js unifiedAutofix",
134      "autofix:summary": "node scripts/autofix-branch.js summary",
135      "autofix:ensure": "node scripts/autofix-branch.js ensure",
136      "autofix:delete": "node scripts/autofix-branch.js delete",
137      "autofix:logs": "node scripts/log-error-autofix.js",
138      "autofix:logs:dry-run": "node scripts/log-error-autofix.js --dry-run",
139      "coverage:monitor": "node scripts/overnight-coverage-monitor.js",
140      "autofix:logs:today": "node scripts/log-error-autofix.js --days=1",
141      "tests:generate": "node scripts/generate-tests.js",
142      "docs:update": "node scripts/update-stale-docs.js",
143      "security:audit": "node scripts/npm-logger.js security-audit better-npm-audit audit",
144      "security:audit:fix": "node scripts/npm-logger.js security-audit-fix npm audit fix",
145      "security:lint": "node scripts/npm-logger.js security-lint eslint src/ scripts/ --config eslint.config.js",
146      "security:snyk": "node scripts/npm-logger.js security-snyk sh -c 'snyk test --all-projects || true'",
147      "security:snyk:fix": "node scripts/npm-logger.js security-snyk-fix sh -c 'snyk fix || true'",
148      "security:semgrep": "node scripts/npm-logger.js security-semgrep sh -c 'semgrep --config=auto src/ scripts/ --json --output=.security-reports/semgrep.json || true'",
149      "security": "npm run security:audit && npm run security:lint && npm run security:snyk && npm run security:semgrep",
150      "security:fix": "npm run security:audit:fix && npm run lint:fix && npm run security:snyk:fix",
151      "security:scan": "node scripts/npm-logger.js security-scan node scripts/security-scan.js",
152      "security:scan:fix": "node scripts/npm-logger.js security-scan-fix node scripts/security-scan.js --fix",
153      "security:cron": "node scripts/npm-logger.js security-cron node scripts/security-cron.js",
154      "creds:check": "node scripts/check-rotation-schedule.js",
155      "maint:audit": "npm audit && npm outdated && npm test",
156      "maint:quick": "npm audit && npm run lint && npm test",
157      "maint:db": "sqlite3 db/sites.db 'PRAGMA integrity_check;' && sqlite3 db/sites.db 'PRAGMA optimize;'",
158      "maint:claude": "node scripts/npm-logger.js maint-claude node scripts/analyze-claude-md.js",
159      "maint:claude:optimize": "node scripts/npm-logger.js maint-claude-optimize node scripts/optimize-claude-md.js",
160      "maint:analysis": "node scripts/npm-logger.js maint-analysis node scripts/deep-code-analysis.js",
161      "maint:doc-check": "node scripts/npm-logger.js maint-doc-check node scripts/doc-code-check.js",
162      "deps:update": "node scripts/npm-logger.js deps-update node scripts/update-dependencies.js --level=minors",
163      "deps:update:patches": "node scripts/npm-logger.js deps-update-patches node scripts/update-dependencies.js --level=patches",
164      "deps:update:all": "node scripts/npm-logger.js deps-update-all node scripts/update-dependencies.js --level=all",
165      "deps:update:dry-run": "node scripts/npm-logger.js deps-update-dry-run node scripts/update-dependencies.js --level=minors --dry-run",
166      "prepare": "simple-git-hooks",
167      "score-api": "node src/api/free-score-api.js",
168      "scan-poller": "node src/api/free-score-api.js",
169      "dashboard": "source .venv/bin/activate && PYTHONPATH=$PWD python dashboard/run_with_logging.py dashboard/Overview.py",
170      "dashboard:install": "scripts/run-with-logging.sh dashboard-install bash -c 'source .venv/bin/activate && cd dashboard && python -m pip install -r requirements.txt'",
171      "dashboard:test": "scripts/run-with-logging.sh dashboard-test bash -c 'source .venv/bin/activate && PYTHONPATH=$PWD:$PYTHONPATH cd dashboard && pytest tests/'",
172      "dashboard:dev": "source .venv/bin/activate && PYTHONPATH=$PWD python dashboard/run_with_logging.py dashboard/Overview.py --server.runOnSave true",
173      "dashboard:precompute": "node scripts/npm-logger.js dashboard-precompute node src/cron/precompute-dashboard.js",
174      "dashboard:v2-api": "cd dashboard-v2/backend && uvicorn main:app --port 8502 --reload",
175      "dashboard:v2-dev": "cd dashboard-v2/frontend && npm run dev",
176      "dashboard:v2-install": "cd dashboard-v2/frontend && npm install",
177      "dashboard:v2-build": "cd dashboard-v2/frontend && npm run build",
178      "agent:run": "node scripts/npm-logger.js agent-run node src/agents/runner.js",
179      "agent:run:single": "nice -n 19 node src/agents/run-single.js",
180      "agent:list": "node src/cli/agent-manager.js list",
181      "agent:tasks": "node src/cli/agent-manager.js tasks",
182      "agent:logs": "node src/cli/agent-manager.js logs",
183      "agent:create": "node src/cli/agent-manager.js create",
184      "agent:workflow": "node src/cli/agent-manager.js workflow",
185      "agent:approvals": "node src/cli/agent-manager.js approvals",
186      "agent:approve": "node src/cli/agent-manager.js approve",
187      "agent:workflow:status": "node src/cli/agent-manager.js workflow-status",
188      "agent:stats": "node src/cli/agent-manager.js stats",
189      "agent:reset-breakers": "node scripts/npm-logger.js agent-reset-breakers node scripts/reset-agent-circuit-breakers.js",
190      "agent:reset-breakers:dry-run": "node scripts/npm-logger.js agent-reset-breakers-dry-run node scripts/reset-agent-circuit-breakers.js --dry-run",
191      "agent:reset-breakers:force": "node scripts/npm-logger.js agent-reset-breakers-force node scripts/reset-agent-circuit-breakers.js --force --cleanup-tasks",
192      "report:audit": "node scripts/npm-logger.js report-audit node src/reports/report-orchestrator.js",
193      "report:sample": "node scripts/npm-logger.js report-sample node scripts/generate-sample-report.js",
194      "purchases:list": "node scripts/npm-logger.js purchases-list node src/cli/purchases.js list",
195      "purchases:process": "node scripts/npm-logger.js purchases-process node src/cron/process-purchases.js",
196      "purchases:refund": "node scripts/npm-logger.js purchases-refund node src/cli/purchases.js refund"
197    },
198    "simple-git-hooks": {
199      "pre-commit": "sh scripts/check-pii.sh && sh scripts/check-required-files.sh && npx lint-staged && sh scripts/ai-review.sh",
200      "pre-push": "sh scripts/test-with-clean-env.sh npm run test:unit && npx better-npm-audit audit --level moderate"
201    },
202    "lint-staged": {
203      "*.{js,mjs,cjs}": [
204        "eslint --fix"
205      ]
206    },
207    "keywords": [
208      "automation",
209      "outreach",
210      "serp",
211      "local-business"
212    ],
213    "author": "",
214    "license": "MIT",
215    "engines": {
216      "node": ">=22.0.0",
217      "npm": ">=10.0.0"
218    },
219    "dependencies": {
220      "@anthropic-ai/sdk": "^0.71.2",
221      "axios": "^1.13.4",
222      "better-sqlite3": "^12.6.2",
223      "bottleneck": "^2.19.5",
224      "csv-parse": "^6.1.0",
225      "csv-stringify": "^6.6.0",
226      "dataforseo-client": "^2.0.18",
227      "dotenv": "^17.2.3",
228      "express": "^4.22.1",
229      "google-libphonenumber": "^3.2.44",
230      "jsdom": "^28.0.0",
231      "opossum": "^9.0.0",
232      "pdfkit": "^0.15.2",
233      "playwright": "^1.58.2",
234      "playwright-extra": "^4.3.6",
235      "puppeteer-extra-plugin-stealth": "^2.11.2",
236      "resend": "^6.8.0",
237      "sharp": "^0.33.5",
238      "twilio": "^5.12.0",
239      "user-agents": "^1.1.669"
240    },
241    "devDependencies": {
242      "@eslint/js": "^9.39.2",
243      "@tigtech/sage": "^0.1.0",
244      "better-npm-audit": "^3.11.0",
245      "c8": "^10.1.3",
246      "eslint": "^9.39.2",
247      "eslint-plugin-security": "^3.0.1",
248      "fastest-levenshtein": "^1.0.16",
249      "husky": "^9.1.7",
250      "lint-staged": "^16.2.7",
251      "promptfoo": "^0.121.2",
252      "simple-git-hooks": "^2.13.1"
253    }
254  }