@m13v/s4l 1.7.6-rc.9 → 1.7.6
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/bin/cli.js +33 -9
- package/mcp/dist/index.js +290 -177
- package/mcp/dist/panel.html +31 -17
- package/mcp/dist/setup.js +27 -7
- package/mcp/dist/telemetry.js +15 -6
- package/mcp/dist/version.json +2 -2
- package/mcp/manifest.json +10 -2
- package/mcp/menubar/s4l_browser_foreground.py +7 -1
- package/mcp/menubar/s4l_card.py +63 -4
- package/mcp/menubar/s4l_card_canvas.py +62 -11
- package/mcp/menubar/s4l_menubar.py +380 -95
- package/mcp/menubar/s4l_state.py +119 -41
- package/mcp/package.json +1 -1
- package/package.json +1 -1
- package/scripts/account_resolver.py +58 -14
- package/scripts/amplitude_24h_signups.py +7 -4
- package/scripts/amplitude_signups.py +7 -4
- package/scripts/autopilot_stall_watch.py +8 -1
- package/scripts/browser_lifecycle.py +90 -0
- package/scripts/claude_job.py +70 -10
- package/scripts/dm_conversation.py +15 -12
- package/scripts/draft_prompt_core.py +132 -64
- package/scripts/engage_github.py +11 -5
- package/scripts/engage_reddit.py +12 -5
- package/scripts/engagement_signal_feedback.py +1 -4
- package/scripts/engagement_styles.py +144 -105
- package/scripts/feedback_digest.py +54 -11
- package/scripts/find_threads.py +9 -7
- package/scripts/github_tools.py +23 -10
- package/scripts/learned_preferences.py +112 -78
- package/scripts/li_discovery.py +4 -1
- package/scripts/link_tail.py +1 -1
- package/scripts/live_status.py +151 -0
- package/scripts/merge_review_queue.py +15 -2
- package/scripts/patches/browser-harness-focus-and-observability.patch +130 -0
- package/scripts/pick_project.py +7 -4
- package/scripts/pick_thread_target.py +64 -13
- package/scripts/pick_twitter_thread_target.py +7 -4
- package/scripts/platform_strike_events.py +139 -7
- package/scripts/post_github.py +376 -35
- package/scripts/post_reddit.py +202 -192
- package/scripts/preflight.sh +23 -3
- package/scripts/preview_reddit_card.py +38 -0
- package/scripts/project_stats.py +7 -4
- package/scripts/reddit_ban_check.py +324 -0
- package/scripts/reddit_browser.py +56 -19
- package/scripts/reddit_chat_sync.py +10 -11
- package/scripts/reddit_tools.py +20 -4
- package/scripts/release-mcpb.sh +47 -7
- package/scripts/run_moltbook_cycle.py +9 -5
- package/scripts/s4l_ctl.sh +2 -2
- package/scripts/s4l_posting_mode.py +67 -6
- package/scripts/scan_dm_candidates.py +15 -9
- package/scripts/scan_github_replies.py +9 -7
- package/scripts/scan_moltbook_replies.py +7 -6
- package/scripts/scan_reddit_replies.py +11 -7
- package/scripts/scan_twitter_mentions_browser.py +7 -6
- package/scripts/scan_twitter_thread_followups.py +7 -6
- package/scripts/schedule_state.py +8 -4
- package/scripts/score_twitter_candidates.py +8 -3
- package/scripts/setup_twitter_auth.py +20 -96
- package/scripts/snapshot.py +19 -0
- package/scripts/stats.py +12 -10
- package/scripts/strike_alert.py +165 -12
- package/scripts/sub_moderation_history.py +129 -0
- package/scripts/subreddit_bans_client.py +157 -0
- package/scripts/test_cross_language_parity.py +185 -0
- package/scripts/test_no_silent_fallbacks.py +84 -0
- package/scripts/test_percard_posting.py +3 -3
- package/scripts/test_stall_watch_batch_progression.py +99 -0
- package/scripts/top_performers.py +24 -0
- package/scripts/twitter_browser.py +22 -52
- package/scripts/twitter_gen_links.py +3 -3
- package/scripts/twitter_post_plan.py +4 -4
- package/scripts/virality.py +151 -0
- package/setup/SKILL.md +1 -1
- package/skill/engage-dm-replies.sh +11 -0
- package/skill/lib/reddit-backend.sh +1 -0
- package/skill/run-draft-and-publish.sh +16 -0
- package/skill/run-reddit-search-launchd.sh +1 -0
- package/skill/run-reddit-search.sh +10 -1
- package/skill/run-reddit-threads.sh +12 -0
- package/skill/run-twitter-cycle.sh +104 -88
package/README.md
CHANGED
|
@@ -157,7 +157,7 @@ The plugin exposes MCP tools for the user-facing workflow:
|
|
|
157
157
|
- `project_config` configures projects, products, voice, topics, and X auth.
|
|
158
158
|
- `engagement_mode` chooses personal-brand and product-promotion lanes.
|
|
159
159
|
- `dashboard` opens the review dashboard.
|
|
160
|
-
- `
|
|
160
|
+
- `approve_drafts` posts only the drafts the user selected.
|
|
161
161
|
- `get_stats` reads X/Twitter stats.
|
|
162
162
|
- `pause_s4l` pauses or resumes scheduled S4L jobs.
|
|
163
163
|
- `runtime` installs, updates, and diagnoses the local runtime.
|
package/bin/cli.js
CHANGED
|
@@ -434,19 +434,43 @@ function installBrowserHarness() {
|
|
|
434
434
|
// we don't control the upstream repo. If it stops applying, upstream has
|
|
435
435
|
// either merged the fix (detected; fine) or refactored (warn); never fail
|
|
436
436
|
// the install over it.
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
437
|
+
// Vendored fixes applied on top of the pin (we don't control upstream).
|
|
438
|
+
// Each: patch file + a sentinel (file, substring) that means "already
|
|
439
|
+
// present" (upstream merged it, or we applied it) so a non-applying patch
|
|
440
|
+
// only warns when the fix is genuinely absent. NEVER fail the install.
|
|
441
|
+
const vendoredPatches = [
|
|
442
|
+
{
|
|
443
|
+
file: 'browser-harness-loopback-cdp-proxy.patch',
|
|
444
|
+
sentinelFile: path.join('src', 'browser_harness', 'admin.py'),
|
|
445
|
+
sentinelStr: 'cdp_urlopen',
|
|
446
|
+
label: 'loopback-proxy',
|
|
447
|
+
absentWarn: 'CDP probes may 403 behind a system proxy',
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
// Suppress OS-focus-stealing Target.activateTarget on offscreen
|
|
451
|
+
// automation harnesses (twitter/reddit/linkedin) — the shared fix for
|
|
452
|
+
// the 2026-07 Chrome focus-pops. See helpers.py _is_offscreen_harness.
|
|
453
|
+
file: 'browser-harness-focus-and-observability.patch',
|
|
454
|
+
sentinelFile: path.join('src', 'browser_harness', 'helpers.py'),
|
|
455
|
+
sentinelStr: '_is_offscreen_harness',
|
|
456
|
+
label: 'focus-suppression + tab-event observability',
|
|
457
|
+
absentWarn: 'harness Chrome may steal OS focus on every tab switch',
|
|
458
|
+
},
|
|
459
|
+
];
|
|
460
|
+
for (const p of vendoredPatches) {
|
|
461
|
+
const patchPath = path.join(PKG_ROOT, 'scripts', 'patches', p.file);
|
|
462
|
+
if (!fs.existsSync(patchPath)) continue;
|
|
463
|
+
const chk = spawnSync('git', ['-C', harnessDir, 'apply', '--check', patchPath], { stdio: 'pipe' });
|
|
440
464
|
if (chk.status === 0) {
|
|
441
|
-
spawnSync('git', ['-C', harnessDir, 'apply',
|
|
442
|
-
console.log(
|
|
465
|
+
spawnSync('git', ['-C', harnessDir, 'apply', patchPath], { stdio: 'inherit' });
|
|
466
|
+
console.log(` applied ${p.label} patch to browser-harness`);
|
|
443
467
|
} else {
|
|
444
|
-
let
|
|
468
|
+
let present = false;
|
|
445
469
|
try {
|
|
446
|
-
|
|
470
|
+
present = fs.readFileSync(path.join(harnessDir, p.sentinelFile), 'utf-8').includes(p.sentinelStr);
|
|
447
471
|
} catch { /* file moved — fall through to the warning */ }
|
|
448
|
-
if (!
|
|
449
|
-
console.warn(
|
|
472
|
+
if (!present) {
|
|
473
|
+
console.warn(` WARNING: browser-harness ${p.label} patch no longer applies and the fix is absent upstream; ${p.absentWarn}.`);
|
|
450
474
|
}
|
|
451
475
|
}
|
|
452
476
|
}
|