@meridiona/meridian-darwin-arm64 1.12.0 → 1.14.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/bootstrap.sh +109 -0
- package/scripts/install-from-bundle.sh +25 -48
- package/services/pyproject.toml +6 -1
- package/services/uv.lock +3253 -0
- package/ui.tar.gz +0 -0
- package/services/requirements-mlx.lock +0 -112
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.14.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.14.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,109 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# meridian — normalises screenpipe activity into structured app sessions
|
|
3
|
+
#
|
|
4
|
+
# Bootstrap installer. Fixes the npm global prefix when it is root-owned (the
|
|
5
|
+
# most common reason `npm install -g` fails with EACCES on a stock macOS Node
|
|
6
|
+
# install), installs @meridiona/meridian, then hands off to `meridian setup`.
|
|
7
|
+
#
|
|
8
|
+
# One-liner usage (download + inspect first if you prefer):
|
|
9
|
+
# curl -fsSL https://raw.githubusercontent.com/Meridiona/meridian/main/scripts/bootstrap.sh | bash
|
|
10
|
+
#
|
|
11
|
+
# Or run directly from a clone:
|
|
12
|
+
# bash scripts/bootstrap.sh
|
|
13
|
+
#
|
|
14
|
+
# Re-running is safe — all steps are idempotent.
|
|
15
|
+
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
info() { printf '→ %s\n' "$*"; }
|
|
19
|
+
ok() { printf ' ✓ %s\n' "$*"; }
|
|
20
|
+
warn() { printf ' ⚠ %s\n' "$*" >&2; }
|
|
21
|
+
err() { printf '✗ %s\n' "$*" >&2; exit 1; }
|
|
22
|
+
|
|
23
|
+
# ── 0. Platform + safety guards ──────────────────────────────────────────────
|
|
24
|
+
[[ "$(uname -s)" == "Darwin" ]] || err "Meridian requires macOS."
|
|
25
|
+
[[ "$(uname -m)" == "arm64" ]] || err "Meridian requires Apple Silicon (arm64)."
|
|
26
|
+
[[ "$(id -u)" -ne 0 ]] || err "Do not run as root / with sudo. Re-run as your normal user."
|
|
27
|
+
|
|
28
|
+
# ── 1. Homebrew ───────────────────────────────────────────────────────────────
|
|
29
|
+
command -v brew >/dev/null 2>&1 \
|
|
30
|
+
|| err "Homebrew is required. Install it from https://brew.sh then re-run."
|
|
31
|
+
ok "Homebrew"
|
|
32
|
+
|
|
33
|
+
# ── 2. Node.js ────────────────────────────────────────────────────────────────
|
|
34
|
+
if ! command -v node >/dev/null 2>&1; then
|
|
35
|
+
info "Installing Node.js via Homebrew…"
|
|
36
|
+
brew install node
|
|
37
|
+
fi
|
|
38
|
+
ok "Node $(node --version)"
|
|
39
|
+
|
|
40
|
+
# ── 3. npm global prefix — ensure it is user-writable ─────────────────────
|
|
41
|
+
# A system Node install (/usr/local) has a root-owned prefix; npm install -g
|
|
42
|
+
# fails with EACCES. Fix: redirect the prefix to ~/.npm-global (user-owned)
|
|
43
|
+
# and add ~/.npm-global/bin to PATH in the user's shell profile. This is a
|
|
44
|
+
# permanent, one-time change — subsequent `npm install -g` commands (including
|
|
45
|
+
# `meridian update`) just work without sudo.
|
|
46
|
+
npm_global_writable() {
|
|
47
|
+
local prefix; prefix="$(npm config get prefix 2>/dev/null || true)"
|
|
48
|
+
[[ -n "$prefix" && -w "${prefix}/lib/node_modules" ]]
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
NPM_GLOBAL="${HOME}/.npm-global"
|
|
52
|
+
|
|
53
|
+
if npm_global_writable; then
|
|
54
|
+
ok "npm prefix already user-writable — no fix needed"
|
|
55
|
+
else
|
|
56
|
+
_old_prefix="$(npm config get prefix 2>/dev/null || true)"
|
|
57
|
+
info "npm prefix (${_old_prefix}) is root-owned — redirecting to ${NPM_GLOBAL}…"
|
|
58
|
+
mkdir -p "${NPM_GLOBAL}"
|
|
59
|
+
npm config set prefix "${NPM_GLOBAL}"
|
|
60
|
+
|
|
61
|
+
# Patch the user's shell profile so the fix survives new terminals.
|
|
62
|
+
_profile=""
|
|
63
|
+
case "${SHELL:-}" in
|
|
64
|
+
*/zsh) _profile="${ZDOTDIR:-${HOME}}/.zshrc" ;;
|
|
65
|
+
*/bash) _profile="${HOME}/.bash_profile" ;;
|
|
66
|
+
esac
|
|
67
|
+
_export='export PATH="${HOME}/.npm-global/bin:${PATH}"'
|
|
68
|
+
if [[ -n "${_profile}" ]] && ! grep -qF '.npm-global/bin' "${_profile}" 2>/dev/null; then
|
|
69
|
+
{
|
|
70
|
+
printf '\n# Added by meridian bootstrap — npm global prefix\n'
|
|
71
|
+
printf '%s\n' "${_export}"
|
|
72
|
+
} >> "${_profile}"
|
|
73
|
+
ok "Added ~/.npm-global/bin to PATH in ${_profile}"
|
|
74
|
+
warn "Open a new terminal (or run: source ${_profile}) after setup to pick up PATH."
|
|
75
|
+
fi
|
|
76
|
+
|
|
77
|
+
# Apply for this session so meridian is immediately on PATH after install.
|
|
78
|
+
export PATH="${NPM_GLOBAL}/bin:${PATH}"
|
|
79
|
+
ok "npm prefix → ${NPM_GLOBAL} (user-writable, no sudo needed)"
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
# ── 4. Install @meridiona/meridian ───────────────────────────────────────────
|
|
83
|
+
info "Installing @meridiona/meridian@latest…"
|
|
84
|
+
npm install -g @meridiona/meridian@latest
|
|
85
|
+
ok "meridian installed ($(meridian --version 2>/dev/null || echo 'version unknown'))"
|
|
86
|
+
|
|
87
|
+
# ── 5. Hand off to meridian setup ────────────────────────────────────────────
|
|
88
|
+
echo ""
|
|
89
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
90
|
+
echo " meridian is installed. Running setup now…"
|
|
91
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
92
|
+
echo ""
|
|
93
|
+
|
|
94
|
+
# When run interactively (direct bash invocation), exec meridian setup so it
|
|
95
|
+
# owns the terminal for the permission walkthrough. When piped (curl | bash)
|
|
96
|
+
# there is no TTY for interactive prompts — skip permissions and print a
|
|
97
|
+
# reminder; the user runs `meridian setup` once they have a full terminal.
|
|
98
|
+
if [[ -t 0 && -t 1 ]]; then
|
|
99
|
+
exec meridian setup
|
|
100
|
+
else
|
|
101
|
+
meridian setup --skip-permissions
|
|
102
|
+
echo ""
|
|
103
|
+
echo " Next step: open a new terminal and run:"
|
|
104
|
+
echo ""
|
|
105
|
+
echo " meridian setup"
|
|
106
|
+
echo ""
|
|
107
|
+
echo " This grants macOS Screen Recording + Accessibility to screenpipe"
|
|
108
|
+
echo " and collects your Jira / GitHub / Linear credentials."
|
|
109
|
+
fi
|
|
@@ -197,7 +197,17 @@ command -v node >/dev/null 2>&1 || { info "Installing Node.js…"; brew install
|
|
|
197
197
|
PYTHON_BIN=""
|
|
198
198
|
for p in python3.11 python3; do command -v "$p" >/dev/null 2>&1 && { PYTHON_BIN="$(command -v "$p")"; break; }; done
|
|
199
199
|
[[ -n "${PYTHON_BIN}" ]] || { info "Installing Python 3.11…"; brew install python@3.11; PYTHON_BIN="$(command -v python3.11)"; }
|
|
200
|
-
|
|
200
|
+
# uv is the package/venv manager for Python services. Install via Homebrew (already
|
|
201
|
+
# required by this installer) rather than the astral curl|sh installer.
|
|
202
|
+
UV_BIN=""
|
|
203
|
+
if command -v uv >/dev/null 2>&1; then
|
|
204
|
+
UV_BIN="$(command -v uv)"
|
|
205
|
+
else
|
|
206
|
+
info "Installing uv (Python package manager)…"
|
|
207
|
+
brew install uv
|
|
208
|
+
UV_BIN="$(command -v uv)"
|
|
209
|
+
fi
|
|
210
|
+
ok "node + python ($(${PYTHON_BIN} --version 2>&1)) + uv ($(${UV_BIN} --version 2>&1))"
|
|
201
211
|
|
|
202
212
|
if ! command -v screenpipe >/dev/null 2>&1; then
|
|
203
213
|
info "Installing screenpipe ${SCREENPIPE_VERSION} via npm…"
|
|
@@ -258,56 +268,23 @@ else
|
|
|
258
268
|
fi
|
|
259
269
|
|
|
260
270
|
# ── 4. Python venv + MLX deps ────────────────────────────────────────────────
|
|
261
|
-
#
|
|
262
|
-
#
|
|
263
|
-
#
|
|
264
|
-
#
|
|
265
|
-
#
|
|
271
|
+
# uv reads services/uv.lock (hashed, cross-platform, committed) and installs the
|
|
272
|
+
# exact pinned set with no PyPI resolution at install time. On subsequent runs
|
|
273
|
+
# `uv sync --frozen` is a no-op when the venv is already up-to-date — faster than
|
|
274
|
+
# the old DEPS_STAMP approach and handles cross-version upgrades correctly.
|
|
275
|
+
# PYTHON_BIN is the brew-installed Python we know runs MLX/Metal; --python pins
|
|
276
|
+
# the interpreter used when uv creates a fresh venv (existing venvs are unchanged).
|
|
266
277
|
VENV="${APP_ROOT}/services/.venv"
|
|
267
|
-
DEPS_STAMP="${VENV}/.meridian-deps-hash"
|
|
268
|
-
# Reproducible runtime: install the exact pinned set from requirements-mlx.lock,
|
|
269
|
-
# not the [mlx] extra resolved fresh from PyPI within version ranges (where a new
|
|
270
|
-
# upstream release could break a fresh install). Hash the lock (its source of
|
|
271
|
-
# truth) so a changed lock re-pips; fall back to pyproject when no lock shipped.
|
|
272
|
-
MLX_LOCK="${APP_ROOT}/services/requirements-mlx.lock"
|
|
273
|
-
deps_hash() {
|
|
274
|
-
local f="${MLX_LOCK}"; [[ -f "$f" ]] || f="${APP_ROOT}/services/pyproject.toml"
|
|
275
|
-
shasum -a 256 "$f" 2>/dev/null | cut -d' ' -f1
|
|
276
|
-
}
|
|
277
|
-
want_hash="$(deps_hash)"
|
|
278
|
-
|
|
279
|
-
fresh_venv=0
|
|
280
|
-
if [[ ! -x "${VENV}/bin/python" ]]; then
|
|
281
|
-
info "Creating Python venv…"
|
|
282
|
-
rm -rf "${VENV}"
|
|
283
|
-
"${PYTHON_BIN}" -m venv "${VENV}"
|
|
284
|
-
fresh_venv=1
|
|
285
|
-
fi
|
|
286
278
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
if [[ -f "${MLX_LOCK}" ]]; then
|
|
295
|
-
# Pinned lock + the local package WITHOUT re-resolving its deps.
|
|
296
|
-
"${VENV}/bin/pip" install --quiet -r "${MLX_LOCK}" \
|
|
297
|
-
&& "${VENV}/bin/pip" install --quiet --no-deps -e "${APP_ROOT}/services" \
|
|
298
|
-
&& _deps_ok=1
|
|
299
|
-
else
|
|
300
|
-
warn "no requirements-mlx.lock in bundle — resolving [mlx] from version ranges (not pinned)"
|
|
301
|
-
"${VENV}/bin/pip" install --quiet -e "${APP_ROOT}/services[mlx]" && _deps_ok=1
|
|
302
|
-
fi
|
|
303
|
-
if [[ "${_deps_ok}" -eq 1 ]]; then
|
|
304
|
-
[[ -n "${want_hash}" ]] && printf '%s\n' "${want_hash}" > "${DEPS_STAMP}"
|
|
305
|
-
ok "Python services ready"
|
|
306
|
-
else
|
|
307
|
-
warn "pip install failed — leaving venv as-is; re-run 'meridian setup' to retry"
|
|
308
|
-
fi
|
|
279
|
+
info "Installing Python + MLX deps (mlx-lm/outlines/fastapi; first run may download a few hundred MB)…"
|
|
280
|
+
if "${UV_BIN}" sync \
|
|
281
|
+
--project "${APP_ROOT}/services" \
|
|
282
|
+
--extra mlx \
|
|
283
|
+
--frozen \
|
|
284
|
+
--python "${PYTHON_BIN}"; then
|
|
285
|
+
ok "Python services ready ($(${VENV}/bin/python --version 2>&1))"
|
|
309
286
|
else
|
|
310
|
-
|
|
287
|
+
warn "uv sync failed — leaving venv as-is; re-run 'meridian setup' to retry"
|
|
311
288
|
fi
|
|
312
289
|
|
|
313
290
|
# ── 5. macOS permissions for screenpipe (manual — can't be automated) ────────
|
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.14.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" }]
|
|
@@ -51,6 +51,11 @@ pm_worklog_update = [
|
|
|
51
51
|
[project.scripts]
|
|
52
52
|
meridian-server = "agents.server:main"
|
|
53
53
|
|
|
54
|
+
[tool.uv]
|
|
55
|
+
# Lock all extras so `uv lock` produces a complete, reproducible uv.lock.
|
|
56
|
+
# install-from-bundle.sh installs the mlx extra via `uv sync --extra mlx --frozen`.
|
|
57
|
+
constraint-dependencies = []
|
|
58
|
+
|
|
54
59
|
[tool.setuptools.packages.find]
|
|
55
60
|
where = ["."]
|
|
56
61
|
include = ["agents", "agents.*"]
|