@meridiona/meridian-darwin-arm64 1.24.6 → 1.26.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 +1 -1
- package/bin/meridian +0 -0
- package/package.json +1 -1
- package/scripts/a11y-helper/meridian-a11y-helper +0 -0
- package/scripts/bootstrap.sh +2 -1
- package/scripts/com.meridiona.a11y-helper.plist +48 -0
- package/scripts/com.meridiona.screenpipe.plist +1 -1
- package/scripts/install-a11y-helper-daemon.sh +90 -0
- package/scripts/install-from-bundle.sh +45 -5
- package/scripts/meridian-cli.sh +1 -1
- package/services/pyproject.toml +1 -1
- package/services/skills/coding-agent/session-summary/SKILL.md +7 -0
- package/ui.tar.gz +0 -0
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.26.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.
|
|
3
|
+
"version": "1.26.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": {
|
|
Binary file
|
package/scripts/bootstrap.sh
CHANGED
|
@@ -111,6 +111,7 @@ else
|
|
|
111
111
|
echo ""
|
|
112
112
|
echo " meridian setup"
|
|
113
113
|
echo ""
|
|
114
|
-
echo " This grants macOS Screen Recording + Accessibility to screenpipe"
|
|
114
|
+
echo " This grants macOS Screen Recording + Accessibility to screenpipe,"
|
|
115
|
+
echo " enables Accessibility for the a11y-helper daemon (for Electron apps),"
|
|
115
116
|
echo " and collects your Jira / GitHub / Linear credentials."
|
|
116
117
|
fi
|
|
@@ -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.
|
|
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
|
-
|
|
221
|
-
|
|
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
|
|
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
|
-
|
|
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)…"
|
package/scripts/meridian-cli.sh
CHANGED
|
@@ -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
|
package/services/pyproject.toml
CHANGED
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "meridian-agents"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.26.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
|