social-autoposter 1.6.111 → 1.6.112

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.
@@ -1,4 +1,4 @@
1
1
  {
2
- "version": "1.6.111",
3
- "installedAt": "2026-06-25T04:58:21.061Z"
2
+ "version": "1.6.112",
3
+ "installedAt": "2026-06-25T05:09:23.776Z"
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.6.111",
5
+ "version": "1.6.112",
6
6
  "description": "Draft, review, approve, and autopilot X/Twitter posts.",
7
7
  "long_description": "The disclaimer above is generic Claude boilerplate. S4L 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 end to end**\n\n2\\. Quit fully with CMD+Q, restart Claude, and paste the prompt into a new chat.",
8
8
  "author": {
@@ -249,10 +249,37 @@ class S4LMenuBar(rumps.App):
249
249
  self._send_to_claude(UPDATE_PROMPT)
250
250
 
251
251
  # ---- .mcpb self-update (menu-bar driven) ------------------------------
252
- EXT_DIR = os.path.expanduser(
253
- "~/Library/Application Support/Claude/Claude Extensions/"
254
- "local.mcpb.m13v.social-autoposter"
255
- )
252
+ @staticmethod
253
+ def _ext_dir():
254
+ """Resolve this plugin's Claude Desktop extension dir.
255
+
256
+ Claude derives the extension id from the manifest author, so it changed
257
+ `local.mcpb.m13v.social-autoposter` ->
258
+ `local.mcpb.s4l.ai.social-autoposter` when the author became "S4L.ai". A
259
+ hardcoded id silently breaks the self-update button on every fresh
260
+ install (the update unzips into a dir that doesn't exist, so the version
261
+ never advances and fixes never land). Pick the newest `*social-autoposter`
262
+ extension dir that actually has a manifest.json; fall back to the
263
+ historical id so old boxes are unaffected.
264
+ """
265
+ root = os.path.expanduser(
266
+ "~/Library/Application Support/Claude/Claude Extensions"
267
+ )
268
+ best, best_mtime = None, -1.0
269
+ try:
270
+ for name in os.listdir(root):
271
+ if not name.endswith("social-autoposter"):
272
+ continue
273
+ d = os.path.join(root, name)
274
+ if not os.path.exists(os.path.join(d, "manifest.json")):
275
+ continue
276
+ m = os.path.getmtime(d)
277
+ if m > best_mtime:
278
+ best, best_mtime = d, m
279
+ except OSError:
280
+ pass
281
+ return best or os.path.join(root, "local.mcpb.m13v.social-autoposter")
282
+
256
283
  MCPB_URL = (
257
284
  "https://github.com/m13v/social-autoposter/releases/latest/download/"
258
285
  "social-autoposter.mcpb"
@@ -275,7 +302,7 @@ class S4LMenuBar(rumps.App):
275
302
  transient failure). A change forces a title + menu repaint."""
276
303
  installed = None
277
304
  try:
278
- with open(os.path.join(self.EXT_DIR, "manifest.json")) as f:
305
+ with open(os.path.join(self._ext_dir(), "manifest.json")) as f:
279
306
  installed = (json.load(f) or {}).get("version")
280
307
  except Exception:
281
308
  return # not a .mcpb install (or no manifest) -> nothing to offer
@@ -314,7 +341,7 @@ class S4LMenuBar(rumps.App):
314
341
  if r.returncode != 0 or not os.path.exists(mcpb) or os.path.getsize(mcpb) < 100000:
315
342
  self._notify("S4L update failed", "Couldn't download the update — check your connection.")
316
343
  return
317
- r = subprocess.run(["unzip", "-oq", mcpb, "-d", self.EXT_DIR],
344
+ r = subprocess.run(["unzip", "-oq", mcpb, "-d", self._ext_dir()],
318
345
  capture_output=True, timeout=180)
319
346
  if r.returncode != 0:
320
347
  self._notify("S4L update failed", "Couldn't unpack the update.")
package/mcp/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m13v/social-autoposter-mcp",
3
- "version": "1.6.111",
3
+ "version": "1.6.112",
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": "social-autoposter",
3
- "version": "1.6.111",
3
+ "version": "1.6.112",
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"
@@ -14,7 +14,23 @@
14
14
  # Exits: 0 ok / already current, 2 download failed, 3 unpack failed, 4 no install.
15
15
  set -euo pipefail
16
16
 
17
- EXT_DIR="$HOME/Library/Application Support/Claude/Claude Extensions/local.mcpb.m13v.social-autoposter"
17
+ # Resolve the Claude Desktop extension dir. Claude derives its name from the
18
+ # manifest author, so the id changed `local.mcpb.m13v.social-autoposter` ->
19
+ # `local.mcpb.s4l.ai.social-autoposter` when the author became "S4L.ai". A
20
+ # hardcoded id silently breaks the updater on every fresh install (the box
21
+ # reported "no .mcpb install" for exactly this reason). Glob for any
22
+ # `*social-autoposter` extension dir that actually has a manifest.json, newest
23
+ # first, so this keeps working across future renames.
24
+ EXT_ROOT="$HOME/Library/Application Support/Claude/Claude Extensions"
25
+ EXT_DIR=""
26
+ if [ -d "$EXT_ROOT" ]; then
27
+ for d in "$EXT_ROOT"/*social-autoposter; do
28
+ [ -f "$d/manifest.json" ] || continue
29
+ if [ -z "$EXT_DIR" ] || [ "$d" -nt "$EXT_DIR" ]; then EXT_DIR="$d"; fi
30
+ done
31
+ fi
32
+ # Last-resort fallback to the historical id so behavior is unchanged on old boxes.
33
+ [ -n "$EXT_DIR" ] || EXT_DIR="$EXT_ROOT/local.mcpb.m13v.social-autoposter"
18
34
  MCPB_URL="https://github.com/m13v/social-autoposter/releases/latest/download/social-autoposter.mcpb"
19
35
  RELEASE_API="https://api.github.com/repos/m13v/social-autoposter/releases/latest"
20
36
  PY="/usr/bin/python3"