@m13v/s4l 1.7.1-rc.3 → 1.7.1-rc.4

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/mcp/dist/index.js CHANGED
@@ -1835,6 +1835,18 @@ tool("project_config", {
1835
1835
  // as expected. Once connect_x succeeds, run the full phase immediately
1836
1836
  // to verify persistence, CDP, and the durable cookie mirror.
1837
1837
  doctorReport = await runDoctorPhase("full");
1838
+ // Only mark x_verified once doctor confirms all X checks pass (session valid,
1839
+ // cookies persisted, CDP responding, keychain accessible). This prevents the
1840
+ // autopilot from starting if X connection didn't actually persist.
1841
+ if (doctorReport?.ok) {
1842
+ completeOnboardingMilestone("x_verified", {
1843
+ x_session: doctorReport.checks?.find(c => c.id === "x_session")?.status,
1844
+ x_cookies: doctorReport.checks?.find(c => c.id === "x_cookie_sqlite")?.status,
1845
+ });
1846
+ }
1847
+ else {
1848
+ recordOnboardingAttempt("x_verified", { doctor_ok: false });
1849
+ }
1838
1850
  }
1839
1851
  else {
1840
1852
  blockOnboardingMilestone("x_connected", `x_${r.state || "not_connected"}`, r.error || r.note || summarizeXAuth(r), { state: r.state || "not_connected" });
@@ -3225,6 +3237,18 @@ async function ensureQueueKickerInstalled() {
3225
3237
  detail: "no ready project or active persona yet",
3226
3238
  };
3227
3239
  }
3240
+ // Additional gate: X must be connected and verified before autopilot starts.
3241
+ // This prevents wasted cycles against a logged-out x.com if X connection didn't
3242
+ // persist after import/login. x_verified milestone only completes after doctor
3243
+ // confirms X session and cookies are valid.
3244
+ const onboardingState = onboardingSnapshot();
3245
+ const xVerified = onboardingState?.milestones?.some((m) => m.id === "x_verified" && m.status === "complete");
3246
+ if (!xVerified) {
3247
+ return {
3248
+ ok: false,
3249
+ detail: "X not yet verified (awaiting explicit pre-flight confirmation)",
3250
+ };
3251
+ }
3228
3252
  const logDir = path.join(repoDir(), "skill", "logs");
3229
3253
  try {
3230
3254
  fs.mkdirSync(logDir, { recursive: true });
@@ -14,6 +14,7 @@ export const ONBOARDING_MILESTONES = [
14
14
  "environment_checked",
15
15
  "runtime_ready",
16
16
  "x_connected",
17
+ "x_verified",
17
18
  "profile_scanned",
18
19
  "mode_chosen",
19
20
  "project_ready",
@@ -1,4 +1,4 @@
1
1
  {
2
- "version": "1.7.1-rc.3",
3
- "installedAt": "2026-07-07T20:42:48.680Z"
2
+ "version": "1.7.1-rc.4",
3
+ "installedAt": "2026-07-07T21:09:29.839Z"
4
4
  }
package/mcp/manifest.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "dxt_version": "0.1",
3
3
  "name": "social-autoposter",
4
4
  "display_name": "S4L",
5
- "version": "1.7.1-rc.3",
5
+ "version": "1.7.1-rc.4",
6
6
  "description": "Draft, review, approve, and autopilot X/Twitter posts.",
7
7
  "long_description": "## **⚠️ The disclaimer above is generic Claude boilerplate.** Anthropic shows the same warning on every plugin regardless of what it does; any plugin has the same level of access as any app you download from the internet.\n\nS4L is an open source product developed by Mediar.ai Incorporated, a VC-backed San Francisco-based startup.\n\nTo get started:\n\n1\\. Copy this prompt: **Set me up on S4L plugin end to end**\n\n2\\. Quit with CMD+Q, reopen Claude, paste into a new chat.\n\nWhat happens next:\n\n* About every 5 minutes S4L scans X for posts that match your topics and drafts replies in your voice.\n* Drafts show up as review cards, usually the first within a few minutes. Nothing is posted automatically; you approve each one.\n* Posting autopilot stays off until you explicitly turn it on.",
8
8
  "author": {
@@ -479,7 +479,11 @@ class S4LMenuBar(rumps.App):
479
479
  # occlusion probe also reads not-visible during fullscreen apps and the
480
480
  # locked screen, so acting on it would false-fire; the remote fix is the
481
481
  # restart_menubar MCP tool.
482
- self._icon_check_due_at = 0.0
482
+ # First probe at +60s, not immediately: the window server takes a few
483
+ # seconds to place a fresh status item (occlusion reads not-visible and
484
+ # the frame sits at x=0 until then — measured 2026-07-07), so an eager
485
+ # probe would log a false "hidden" on every single process start.
486
+ self._icon_check_due_at = time.monotonic() + 60.0
483
487
  self._icon_hidden_since = None
484
488
  self._icon_last_on_screen = "unprobed"
485
489
  self._icon_watch_started = time.monotonic()
package/mcp/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m13v/s4l-mcp",
3
- "version": "1.7.1-rc.3",
3
+ "version": "1.7.1-rc.4",
4
4
  "private": true,
5
5
  "description": "Desktop MCP client for social-autoposter (X/Twitter rail): manual draft/review/approve loop, autopilot control, and stats. Thin wrapper over the existing pipeline scripts.",
6
6
  "license": "MIT",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m13v/s4l",
3
- "version": "1.7.1-rc.3",
3
+ "version": "1.7.1-rc.4",
4
4
  "description": "Automated social posting pipeline for Reddit, X/Twitter, LinkedIn, and Moltbook. Install as a Claude Code agent skill.",
5
5
  "bin": {
6
6
  "social-autoposter": "bin/cli.js",