@meridiona/meridian-darwin-arm64 1.24.6 → 1.25.0

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/VERSION CHANGED
@@ -1 +1 @@
1
- 1.24.6
1
+ 1.25.0
package/bin/meridian CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meridiona/meridian-darwin-arm64",
3
- "version": "1.24.6",
3
+ "version": "1.25.0",
4
4
  "description": "Prebuilt Meridian app for macOS arm64 (daemon binary + dashboard + Python services). Installed via @meridiona/meridian.",
5
5
  "homepage": "https://github.com/Meridiona/meridian",
6
6
  "repository": {
@@ -0,0 +1,48 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ com.meridiona.a11y-helper — runs meridian-a11y-helper as a launchd
4
+ LaunchAgent. The helper enables macOS accessibility on Electron/Chromium
5
+ apps (Claude, Codex, Slack, …) by setting AXManualAccessibility on the
6
+ frontmost app, so screenpipe can capture their a11y tree instead of the
7
+ app staying invisible (see scripts/a11y-helper/main.swift for the full
8
+ story).
9
+
10
+ Runs as its OWN agent (not a meridian-daemon child) on purpose: macOS
11
+ attributes a child's TCC permissions to its parent, and the daemon binary
12
+ changes on every release — the Accessibility grant must key to this
13
+ stable helper binary instead.
14
+
15
+ Install via scripts/install-a11y-helper-daemon.sh which copies the
16
+ committed helper binary to ~/.meridian/bin/, substitutes the placeholders
17
+ below, and bootstraps the agent.
18
+
19
+ Uninstall:
20
+ launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.meridiona.a11y-helper.plist
21
+ rm ~/Library/LaunchAgents/com.meridiona.a11y-helper.plist
22
+ -->
23
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
24
+ <plist version="1.0">
25
+ <dict>
26
+ <key>Label</key>
27
+ <string>com.meridiona.a11y-helper</string>
28
+
29
+ <key>ProgramArguments</key>
30
+ <array>
31
+ <string>{{HELPER_BIN}}</string>
32
+ </array>
33
+
34
+ <key>StandardOutPath</key>
35
+ <string>{{HOME}}/.meridian/logs/a11y-helper.log</string>
36
+ <key>StandardErrorPath</key>
37
+ <string>{{HOME}}/.meridian/logs/a11y-helper-error.log</string>
38
+
39
+ <key>RunAtLoad</key>
40
+ <true/>
41
+ <key>KeepAlive</key>
42
+ <true/>
43
+ <key>ThrottleInterval</key>
44
+ <integer>10</integer>
45
+ <key>ProcessType</key>
46
+ <string>Background</string>
47
+ </dict>
48
+ </plist>
@@ -23,7 +23,7 @@
23
23
  <array>
24
24
  <string>/bin/sh</string>
25
25
  <string>-c</string>
26
- <string>exec {{SCREENPIPE_BIN}} record --disable-audio</string>
26
+ <string>exec {{SCREENPIPE_BIN}} record --disable-audio --use-pii-removal</string>
27
27
  </array>
28
28
 
29
29
  <key>EnvironmentVariables</key>
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env bash
2
+ # meridian — normalises screenpipe activity into structured app sessions
3
+ # Install meridian-a11y-helper as a launchd LaunchAgent under the current user.
4
+ # The helper enables macOS accessibility on Electron/Chromium apps so
5
+ # screenpipe can capture them — see scripts/a11y-helper/main.swift.
6
+ #
7
+ # ./scripts/install-a11y-helper-daemon.sh
8
+ #
9
+ # Re-running is safe — it bootouts the existing agent, refreshes the binary
10
+ # and plist, and reloads.
11
+ #
12
+ # The helper binary is copied to ~/.meridian/bin/ ONLY when its bytes differ
13
+ # from the committed artifact. The copy is byte-identical to the committed
14
+ # binary, so macOS's Accessibility grant (keyed to the binary's code hash)
15
+ # survives meridian updates that don't touch the helper.
16
+
17
+ set -euo pipefail
18
+
19
+ LABEL="com.meridiona.a11y-helper"
20
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
21
+ TEMPLATE="${SCRIPT_DIR}/com.meridiona.a11y-helper.plist"
22
+ SRC_BIN="${SCRIPT_DIR}/a11y-helper/meridian-a11y-helper"
23
+
24
+ DEST_DIR="${HOME}/.meridian/bin"
25
+ DEST_BIN="${DEST_DIR}/meridian-a11y-helper"
26
+
27
+ LAUNCH_AGENTS="${HOME}/Library/LaunchAgents"
28
+ PLIST_DEST="${LAUNCH_AGENTS}/${LABEL}.plist"
29
+ GUI_TARGET="gui/$(id -u)"
30
+
31
+ if [[ ! -f "${TEMPLATE}" ]]; then
32
+ echo "✗ template not found: ${TEMPLATE}" >&2
33
+ exit 1
34
+ fi
35
+ if [[ ! -f "${SRC_BIN}" ]]; then
36
+ echo "✗ helper binary not found: ${SRC_BIN} (build with scripts/a11y-helper/build.sh)" >&2
37
+ exit 1
38
+ fi
39
+
40
+ mkdir -p "${DEST_DIR}" "${HOME}/.meridian/logs" "${LAUNCH_AGENTS}"
41
+
42
+ # Copy only when the bytes changed — an unnecessary rewrite is harmless for
43
+ # TCC (same hash) but skipping it keeps mtimes meaningful for debugging.
44
+ if ! cmp -s "${SRC_BIN}" "${DEST_BIN}" 2>/dev/null; then
45
+ cp "${SRC_BIN}" "${DEST_BIN}"
46
+ chmod +x "${DEST_BIN}"
47
+ echo "→ installed helper binary: ${DEST_BIN}"
48
+ else
49
+ echo "→ helper binary unchanged: ${DEST_BIN}"
50
+ fi
51
+
52
+ echo "→ writing ${PLIST_DEST}"
53
+ sed \
54
+ -e "s|{{HOME}}|${HOME}|g" \
55
+ -e "s|{{HELPER_BIN}}|${DEST_BIN}|g" \
56
+ "${TEMPLATE}" > "${PLIST_DEST}"
57
+
58
+ if ! plutil -lint "${PLIST_DEST}" >/dev/null; then
59
+ echo "✗ plist failed validation" >&2
60
+ exit 1
61
+ fi
62
+
63
+ echo "→ bootout ${LABEL} (if loaded)"
64
+ launchctl bootout "${GUI_TARGET}/${LABEL}" 2>/dev/null || true
65
+ _bootout_wait=0
66
+ while launchctl print "${GUI_TARGET}/${LABEL}" >/dev/null 2>&1; do
67
+ sleep 1
68
+ _bootout_wait=$(( _bootout_wait + 1 ))
69
+ if [[ "${_bootout_wait}" -ge 15 ]]; then
70
+ echo "⚠ ${LABEL} still in launchd domain after 15s — proceeding anyway" >&2
71
+ break
72
+ fi
73
+ done
74
+
75
+ echo "→ bootstrap ${LABEL}"
76
+ launchctl enable "${GUI_TARGET}/${LABEL}" 2>/dev/null || true
77
+ launchctl bootstrap "${GUI_TARGET}" "${PLIST_DEST}"
78
+ launchctl enable "${GUI_TARGET}/${LABEL}"
79
+ launchctl kickstart -k "${GUI_TARGET}/${LABEL}"
80
+
81
+ echo
82
+ echo "✓ a11y-helper installed and started"
83
+ echo
84
+ echo "⚠ One-time permission: add ${DEST_BIN}"
85
+ echo " to System Settings → Privacy & Security → Accessibility and toggle it on."
86
+ echo " Until granted, Electron apps (Claude, Codex, Slack, …) stay invisible to capture."
87
+ echo
88
+ echo "Useful follow-ups:"
89
+ echo " launchctl print ${GUI_TARGET}/${LABEL} # status"
90
+ echo " tail -f ~/.meridian/logs/a11y-helper.log # live log (shows trust state + pokes)"
@@ -10,7 +10,7 @@
10
10
  set -euo pipefail
11
11
 
12
12
  APP_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
13
- SCREENPIPE_VERSION="0.3.350"
13
+ SCREENPIPE_VERSION="0.4.6"
14
14
  MLX_PORT="${MLX_PORT:-7823}"
15
15
  UI_PORT="${MERIDIAN_UI_PORT:-3939}" # dashboard port (override via MERIDIAN_UI_PORT)
16
16
  SKIP_PERMISSIONS=0
@@ -217,8 +217,12 @@ PLIST
217
217
  configure_editor_accessibility() {
218
218
  local support_root="${HOME}/Library/Application Support"
219
219
  local editors=("Code" "Cursor" "Antigravity IDE")
220
- local any=0 ed dir settings
221
- for ed in "${editors[@]}"; do
220
+ # App bundles, index-matched to `editors`, for running-process detection.
221
+ local app_bundles=("Visual Studio Code.app" "Cursor.app" "Antigravity IDE.app")
222
+ local any=0 i ed dir settings
223
+ local needs_restart=()
224
+ for i in "${!editors[@]}"; do
225
+ ed="${editors[$i]}"
222
226
  dir="${support_root}/${ed}"
223
227
  [[ -d "$dir" ]] || continue # editor not installed → skip
224
228
  any=1
@@ -236,8 +240,21 @@ configure_editor_accessibility() {
236
240
  # JSONC-tolerant, so this preserves existing keys/comments/formatting.
237
241
  perl -0777 -i -pe 's/\{/\{\n\t"editor.accessibilitySupport": "on",/ unless $done++' "$settings"
238
242
  fi
239
- ok "${ed}: enabled editor.accessibilitySupport = on (restart the editor)"
243
+ ok "${ed}: enabled editor.accessibilitySupport = on"
244
+ # The setting is read ONCE at editor boot. If the editor is running
245
+ # right now, it booted before this write and will keep capturing
246
+ # nothing until relaunched — these apps routinely run for days, so
247
+ # without an explicit restart the setting sits inert on disk and the
248
+ # editor's activity is silently invisible to screenpipe.
249
+ if pgrep -qf "/Applications/${app_bundles[$i]}/" 2>/dev/null; then
250
+ needs_restart+=("${ed}")
251
+ fi
240
252
  done
253
+ if [[ ${#needs_restart[@]} -gt 0 ]]; then
254
+ warn "RESTART REQUIRED: ${needs_restart[*]} — running editors only read"
255
+ warn "editor.accessibilitySupport at launch. Quit and reopen them now, or"
256
+ warn "their activity will NOT be captured until the next relaunch."
257
+ fi
241
258
  [[ "$any" -eq 0 ]] && info "No VS Code / Cursor / Antigravity install found — skipping editor a11y setup"
242
259
  return 0
243
260
  }
@@ -482,6 +499,14 @@ if [[ "${_macos_major:-0}" -ge 26 ]]; then
482
499
  fi
483
500
 
484
501
  # ── 5. macOS permissions for screenpipe (manual — can't be automated) ────────
502
+ # Stage the a11y helper binary first so its path exists when the user adds it
503
+ # in the Accessibility pane below (the agent itself is installed in §6).
504
+ if [[ -f "${APP_ROOT}/scripts/a11y-helper/meridian-a11y-helper" ]]; then
505
+ mkdir -p "${HOME}/.meridian/bin"
506
+ cmp -s "${APP_ROOT}/scripts/a11y-helper/meridian-a11y-helper" "${HOME}/.meridian/bin/meridian-a11y-helper" 2>/dev/null \
507
+ || cp "${APP_ROOT}/scripts/a11y-helper/meridian-a11y-helper" "${HOME}/.meridian/bin/meridian-a11y-helper"
508
+ chmod +x "${HOME}/.meridian/bin/meridian-a11y-helper"
509
+ fi
485
510
  if [[ "${SKIP_PERMISSIONS}" -eq 0 ]]; then
486
511
  echo "→ screenpipe needs 2 macOS permissions: Screen Recording and Accessibility."
487
512
  echo " (Audio capture is disabled, so no Microphone permission is required.)"
@@ -489,7 +514,10 @@ if [[ "${SKIP_PERMISSIONS}" -eq 0 ]]; then
489
514
  open "x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture" 2>/dev/null || true
490
515
  read -r -p " Press Enter to open Accessibility settings… " _ || true
491
516
  open "x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility" 2>/dev/null || true
492
- read -r -p " Press Enter once both are granted… " _ || true
517
+ echo " In the SAME Accessibility pane, also add the a11y helper (+ → ⌘⇧G → paste):"
518
+ echo " ${HOME}/.meridian/bin/meridian-a11y-helper"
519
+ echo " Without it, Electron apps (Claude, Codex, Slack, …) stay invisible to capture."
520
+ read -r -p " Press Enter once all are granted… " _ || true
493
521
  fi
494
522
 
495
523
  # Enable a11y mode in installed VS Code-family editors (idempotent). Without
@@ -523,6 +551,11 @@ fi
523
551
  info "Installing screenpipe launchd agent…"
524
552
  bash "${APP_ROOT}/scripts/install-screenpipe-daemon.sh" || warn "screenpipe agent install failed"
525
553
 
554
+ # a11y-helper: enables accessibility on Electron apps so screenpipe can
555
+ # capture them (Claude, Codex, Slack, …) — see scripts/a11y-helper/main.swift.
556
+ info "Installing a11y-helper launchd agent…"
557
+ bash "${APP_ROOT}/scripts/install-a11y-helper-daemon.sh" || warn "a11y-helper agent install failed"
558
+
526
559
  # MLX: skip restart + model-load wait when server was already healthy and
527
560
  # neither the venv nor the Python source files changed.
528
561
  _PY_SRC_STAMP="${HOME}/.meridian/py-src.sha256"
@@ -571,6 +604,13 @@ _final_ui_hash="${_new_ui_hash:-${_OLD_UI_HASH}}"
571
604
 
572
605
  ok "all daemons installed"
573
606
 
607
+ # Install session-summary Claude Code command so `claude -p /session-summary` resolves.
608
+ _skill_src="${APP_ROOT}/services/skills/coding-agent/session-summary/SKILL.md"
609
+ _skill_dst="${HOME}/.claude/commands/session-summary.md"
610
+ mkdir -p "${HOME}/.claude/commands"
611
+ cp "${_skill_src}" "${_skill_dst}"
612
+ ok "session-summary command → ~/.claude/commands/session-summary.md"
613
+
574
614
  # Pipeline smoke test — verify both LLM stages return valid output (no DB writes).
575
615
  echo ""
576
616
  info "Running pipeline smoke test (this exercises the model — may take ~30s)…"
@@ -648,7 +648,7 @@ case "$CMD" in
648
648
  uninstall) cmd_uninstall ;;
649
649
  permissions) cmd_permissions ;;
650
650
  version|--version|-v) cat "${REPO_ROOT}/VERSION" 2>/dev/null || echo "unknown" ;;
651
- worklog-status|pm-worklog|coding-agent-hook|coding-agent-summarise|coding-agent-classify) cmd_daemon_passthrough "$CMD" "$@" ;;
651
+ worklog-status|pm-worklog|coding-agent-hook|coding-agent-summarise|coding-agent-classify|coding-agent-install-skill) cmd_daemon_passthrough "$CMD" "$@" ;;
652
652
  --help|-h|help|"") cmd_help ;;
653
653
  *) err "unknown command: ${CMD}"; echo; cmd_help; exit 1 ;;
654
654
  esac
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "meridian-agents"
7
- version = "1.24.6"
7
+ version = "1.25.0"
8
8
  description = "Meridian agents — hermes task linking and Jira progress updates for meridian.db"
9
9
  requires-python = ">=3.11"
10
10
  authors = [{ name = "Meridiona" }]
@@ -0,0 +1,7 @@
1
+ ---
2
+ description: Summarise a coding-agent session transcript for a Jira work-log.
3
+ ---
4
+
5
+ You summarise ONE work-burst of a developer's coding-agent session for a Jira work-log. The transcript is timestamped as `[<ISO ts>] [role] <message>`. Write a factual prose summary of 10-40 sentences: name the files edited, commands run, errors hit, decisions made, tests/validations performed, and any rework or blockers (an approach abandoned, a failed build/test, something deleted and rebuilt). State ONLY what is in the transcript — never invent files, tickets, commands, or outcomes. No preamble, no markdown headings, no bullet lists — just clear paragraphs. If an 'EARLIER IN THIS SESSION' section is present, do not repeat it; summarise only this burst.
6
+
7
+ Return JSON with `summary` (the prose) and `blockers` (a list of distinct blockers / failures / rework, possibly empty).
package/ui.tar.gz ADDED
Binary file