@stackmemoryai/stackmemory 1.10.5 → 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/LICENSE +131 -64
- package/README.md +107 -24
- package/bin/claude-sm +16 -1
- package/bin/claude-smd +16 -1
- package/bin/codex-smd +16 -1
- package/bin/gemini-sm +16 -1
- package/bin/hermes-sm +21 -0
- package/bin/hermes-smd +21 -0
- package/bin/opencode-sm +16 -1
- package/dist/src/cli/claude-sm.js +266 -84
- package/dist/src/cli/codex-sm.js +225 -33
- package/dist/src/cli/commands/bench.js +209 -2
- package/dist/src/cli/commands/brain.js +206 -0
- package/dist/src/cli/commands/cache.js +126 -0
- package/dist/src/cli/commands/company-os.js +184 -0
- package/dist/src/cli/commands/context.js +5 -0
- package/dist/src/cli/commands/daemon.js +41 -0
- package/dist/src/cli/commands/handoff.js +40 -9
- package/dist/src/cli/commands/onboard.js +70 -3
- package/dist/src/cli/commands/operator.js +127 -0
- package/dist/src/cli/commands/optimize.js +117 -0
- package/dist/src/cli/commands/orchestrate.js +232 -5
- package/dist/src/cli/commands/orchestrator.js +315 -26
- package/dist/src/cli/commands/pack.js +322 -0
- package/dist/src/cli/commands/patterns.js +254 -0
- package/dist/src/cli/commands/portal.js +161 -0
- package/dist/src/cli/commands/scaffold.js +92 -0
- package/dist/src/cli/commands/search.js +40 -1
- package/dist/src/cli/commands/setup.js +178 -11
- package/dist/src/cli/commands/skills.js +10 -1
- package/dist/src/cli/commands/state.js +265 -0
- package/dist/src/cli/commands/sync.js +253 -0
- package/dist/src/cli/commands/tasks.js +130 -1
- package/dist/src/cli/commands/vision.js +221 -0
- package/dist/src/cli/gemini-sm.js +19 -29
- package/dist/src/cli/hermes-sm.js +224 -0
- package/dist/src/cli/index.js +105 -39
- package/dist/src/cli/opencode-sm.js +38 -21
- package/dist/src/cli/utils/determinism-watcher.js +66 -0
- package/dist/src/cli/utils/real-cli-bin.js +116 -0
- package/dist/src/core/brain/brain-store.js +187 -0
- package/dist/src/core/brain/brain-sync.js +193 -0
- package/dist/src/core/brain/index.js +78 -0
- package/dist/src/core/brain/types.js +10 -0
- package/dist/src/core/cache/content-cache.js +238 -0
- package/dist/src/{integrations/diffmem → core/cache}/index.js +5 -5
- package/dist/src/core/cache/token-estimator.js +39 -0
- package/dist/src/core/config/feature-flags.js +2 -6
- package/dist/src/core/context/frame-database.js +79 -27
- package/dist/src/core/context/recursive-context-manager.js +1 -1
- package/dist/src/core/context/rehydration.js +2 -1
- package/dist/src/core/cross-search/cross-project-search.js +269 -0
- package/dist/src/core/cross-search/index.js +10 -0
- package/dist/src/core/database/sqlite-adapter.js +14 -84
- package/dist/src/core/extensions/provider-adapter.js +5 -0
- package/dist/src/core/models/model-router.js +54 -2
- package/dist/src/core/models/provider-pricing.js +58 -4
- package/dist/src/core/monitoring/logger.js +2 -1
- package/dist/src/core/optimization/trace-optimizer.js +413 -0
- package/dist/src/core/patterns/index.js +22 -0
- package/dist/src/core/patterns/pattern-applier.js +39 -0
- package/dist/src/core/patterns/pattern-observer.js +157 -0
- package/dist/src/core/patterns/pattern-store.js +259 -0
- package/dist/src/core/patterns/types.js +19 -0
- package/dist/src/core/provenance/confidence-scorer.js +128 -0
- package/dist/src/core/provenance/index.js +40 -0
- package/dist/src/core/provenance/provenance-store.js +194 -0
- package/dist/src/core/provenance/types.js +82 -0
- package/dist/src/core/retrieval/llm-context-retrieval.js +5 -4
- package/dist/src/core/retrieval/unified-context-assembler.js +11 -66
- package/dist/src/core/session/project-handoff.js +64 -0
- package/dist/src/core/session/session-manager.js +28 -0
- package/dist/src/core/shared-state/canonical-store.js +564 -0
- package/dist/src/core/skill-packs/index.js +18 -0
- package/dist/src/core/skill-packs/parser.js +42 -0
- package/dist/src/core/skill-packs/registry.js +224 -0
- package/dist/src/core/skill-packs/types.js +79 -0
- package/dist/src/core/storage/cloud-sync-manager.js +116 -0
- package/dist/src/core/storage/cloud-sync.js +574 -0
- package/dist/src/core/storage/two-tier-storage.js +5 -1
- package/dist/src/core/tasks/master-tasks-template.js +43 -0
- package/dist/src/core/tasks/md-task-parser.js +138 -0
- package/dist/src/core/trace/trace-event-store.js +282 -0
- package/dist/src/core/vision/index.js +27 -0
- package/dist/src/core/vision/signals.js +79 -0
- package/dist/src/core/vision/types.js +22 -0
- package/dist/src/core/vision/vision-file.js +146 -0
- package/dist/src/core/vision/vision-loop.js +220 -0
- package/dist/src/core/wiki/wiki-compiler.js +103 -1
- package/dist/src/daemon/daemon-config.js +52 -0
- package/dist/src/daemon/services/desire-path-service.js +566 -0
- package/dist/src/daemon/services/github-service.js +126 -0
- package/dist/src/daemon/services/research-stream-service.js +320 -0
- package/dist/src/daemon/services/telemetry-service.js +192 -0
- package/dist/src/daemon/unified-daemon.js +58 -1
- package/dist/src/features/browser/cli-browser-agent.js +417 -0
- package/dist/src/features/browser/stagehand-workflows.js +578 -0
- package/dist/src/features/operator/adapter-factory.js +62 -0
- package/dist/src/features/operator/browser-adapter.js +109 -0
- package/dist/src/features/operator/desktop-adapter.js +125 -0
- package/dist/src/features/operator/index.js +39 -0
- package/dist/src/features/operator/llm-decision.js +137 -0
- package/dist/src/features/operator/operator-logger.js +92 -0
- package/dist/src/features/operator/overnight-runner.js +327 -0
- package/dist/src/features/operator/screen-adapter.js +91 -0
- package/dist/src/features/operator/session-manager.js +127 -0
- package/dist/src/features/operator/state-machine.js +227 -0
- package/dist/src/features/operator/task-queue.js +81 -0
- package/dist/src/features/portal/index.js +26 -0
- package/dist/src/features/portal/server.js +240 -0
- package/dist/src/features/portal/types.js +14 -0
- package/dist/src/features/portal/ui.js +195 -0
- package/dist/src/features/sweep/pty-wrapper.js +13 -5
- package/dist/src/features/tasks/task-aware-context.js +2 -1
- package/dist/src/features/tui/simple-monitor.js +0 -23
- package/dist/src/features/tui/swarm-monitor.js +8 -66
- package/dist/src/features/web/client/hooks/use-socket.js +12 -0
- package/dist/src/{core/merge/index.js → features/web/client/lib/utils.js} +8 -4
- package/dist/src/features/web/client/next-env.d.js +4 -0
- package/dist/src/features/web/client/stores/session-store.js +12 -0
- package/dist/src/features/web/server/gcp-billing.js +76 -0
- package/dist/src/features/web/server/index.js +10 -0
- package/dist/src/features/web/server/spend-calculator.js +228 -0
- package/dist/src/hooks/schemas.js +6 -1
- package/dist/src/integrations/anthropic/client.js +3 -2
- package/dist/src/integrations/claude-code/agent-bridge.js +0 -3
- package/dist/src/integrations/claude-code/subagent-client.js +307 -11
- package/dist/src/integrations/claude-code/task-coordinator.js +2 -1
- package/dist/src/integrations/github/pr-state.js +158 -0
- package/dist/src/integrations/linear/client.js +4 -1
- package/dist/src/integrations/linear/webhook-retry.js +196 -0
- package/dist/src/integrations/linear/webhook-server.js +18 -22
- package/dist/src/integrations/mcp/handlers/cloud-sync-handlers.js +101 -0
- package/dist/src/integrations/mcp/handlers/index.js +40 -84
- package/dist/src/integrations/mcp/server.js +542 -641
- package/dist/src/integrations/mcp/tool-alias-registry.js +297 -0
- package/dist/src/integrations/mcp/tool-definitions.js +152 -682
- package/dist/src/mcp/stackmemory-mcp-server.js +571 -231
- package/dist/src/orchestrators/multimodal/determinism.js +244 -0
- package/dist/src/orchestrators/multimodal/harness.js +149 -78
- package/dist/src/orchestrators/multimodal/providers.js +44 -3
- package/dist/src/skills/recursive-agent-orchestrator.js +2 -4
- package/dist/src/utils/hook-installer.js +0 -8
- package/dist/src/utils/process-cleanup.js +1 -7
- package/docs/README.md +42 -0
- package/docs/guides/README_INSTALL.md +208 -0
- package/package.json +27 -9
- package/packs/coding/python-fastapi/instructions.md +60 -0
- package/packs/coding/python-fastapi/pack.yaml +28 -0
- package/packs/coding/typescript-react/instructions.md +47 -0
- package/packs/coding/typescript-react/pack.yaml +28 -0
- package/packs/core/commands/capture.md +32 -0
- package/packs/core/commands/learn.md +73 -0
- package/packs/core/commands/next.md +36 -0
- package/packs/core/commands/restart.md +58 -0
- package/packs/core/commands/restore.md +29 -0
- package/packs/core/commands/start.md +57 -0
- package/packs/core/commands/stop.md +65 -0
- package/packs/core/commands/summary.md +40 -0
- package/packs/core/manifest.json +24 -0
- package/packs/ops/decision-recovery/instructions.md +65 -0
- package/packs/ops/decision-recovery/pack.yaml +89 -0
- package/scripts/claude-code-wrapper.sh +11 -0
- package/scripts/claude-sm-setup.sh +12 -1
- package/scripts/codex-wrapper.sh +11 -0
- package/scripts/git-hooks/branch-context-manager.sh +11 -0
- package/scripts/git-hooks/post-checkout-stackmemory.sh +11 -0
- package/scripts/git-hooks/post-commit-stackmemory.sh +11 -0
- package/scripts/git-hooks/pre-commit-stackmemory.sh +11 -0
- package/scripts/hooks/cleanup-shell.sh +12 -1
- package/scripts/hooks/task-complete.sh +12 -1
- package/scripts/install-code-execution-hooks.sh +12 -1
- package/scripts/install-sweep-hook.sh +12 -0
- package/scripts/install.sh +11 -0
- package/scripts/opencode-wrapper.sh +11 -0
- package/scripts/portal/cloud-init.yaml +69 -0
- package/scripts/portal/setup.sh +69 -0
- package/scripts/portal/stackmemory-portal.service +34 -0
- package/scripts/setup-claude-integration.sh +12 -1
- package/scripts/smoke-init-db.sh +23 -0
- package/scripts/stackmemory-daemon.sh +11 -0
- package/scripts/verify-dist.cjs +11 -4
- package/dist/src/cli/commands/ralph.js +0 -1053
- package/dist/src/cli/commands/team.js +0 -168
- package/dist/src/core/context/shared-context-layer.js +0 -620
- package/dist/src/core/context/stack-merge-resolver.js +0 -748
- package/dist/src/core/merge/conflict-detector.js +0 -430
- package/dist/src/core/merge/resolution-engine.js +0 -557
- package/dist/src/core/merge/stack-diff.js +0 -531
- package/dist/src/core/merge/unified-merge-resolver.js +0 -302
- package/dist/src/hooks/diffmem-hooks.js +0 -376
- package/dist/src/integrations/diffmem/client.js +0 -208
- package/dist/src/integrations/diffmem/config.js +0 -14
- package/dist/src/integrations/greptile/client.js +0 -101
- package/dist/src/integrations/greptile/config.js +0 -14
- package/dist/src/integrations/greptile/index.js +0 -11
- package/dist/src/integrations/mcp/handlers/cord-handlers.js +0 -397
- package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +0 -455
- package/dist/src/integrations/mcp/handlers/greptile-handlers.js +0 -456
- package/dist/src/integrations/mcp/handlers/provider-handlers.js +0 -227
- package/dist/src/integrations/mcp/handlers/team-handlers.js +0 -211
- package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -863
- package/dist/src/integrations/ralph/context/context-budget-manager.js +0 -308
- package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +0 -391
- package/dist/src/integrations/ralph/index.js +0 -17
- package/dist/src/integrations/ralph/learning/pattern-learner.js +0 -435
- package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +0 -448
- package/dist/src/integrations/ralph/loopmax.js +0 -488
- package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +0 -293
- package/dist/src/integrations/ralph/monitoring/swarm-registry.js +0 -107
- package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -508
- package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -407
- package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +0 -495
- package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +0 -387
- package/dist/src/integrations/ralph/performance/performance-optimizer.js +0 -357
- package/dist/src/integrations/ralph/recovery/crash-recovery.js +0 -461
- package/dist/src/integrations/ralph/state/state-reconciler.js +0 -420
- package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +0 -444
- package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +0 -1007
- package/dist/src/integrations/ralph/visualization/ralph-debugger.js +0 -635
- package/scripts/ralph-loop-implementation.js +0 -404
- /package/dist/src/core/{merge → cache}/types.js +0 -0
- /package/dist/src/{integrations/diffmem/types.js → core/storage/cloud-sync-types.js} +0 -0
- /package/dist/src/{integrations/greptile/types.js → core/trace/trace-event.js} +0 -0
- /package/dist/src/{integrations/ralph → features/operator}/types.js +0 -0
package/scripts/install.sh
CHANGED
|
@@ -4,6 +4,17 @@
|
|
|
4
4
|
|
|
5
5
|
set -e
|
|
6
6
|
|
|
7
|
+
# Use Node version from .nvmrc
|
|
8
|
+
export NVM_DIR="$HOME/.nvm"
|
|
9
|
+
if [ -s "$NVM_DIR/nvm.sh" ]; then
|
|
10
|
+
. "$NVM_DIR/nvm.sh"
|
|
11
|
+
nvm use 2>/dev/null
|
|
12
|
+
elif [ -d "$HOME/.nvm/versions/node" ]; then
|
|
13
|
+
NODE_VER=$(cat "$(dirname "$0")/../.nvmrc" 2>/dev/null || echo "20")
|
|
14
|
+
NODE_PATH=$(ls -d "$HOME/.nvm/versions/node/v${NODE_VER}"* 2>/dev/null | head -1)
|
|
15
|
+
[ -n "$NODE_PATH" ] && export PATH="$NODE_PATH/bin:$PATH"
|
|
16
|
+
fi
|
|
17
|
+
|
|
7
18
|
YELLOW='\033[1;33m'
|
|
8
19
|
GREEN='\033[0;32m'
|
|
9
20
|
BLUE='\033[0;34m'
|
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
# OpenCode wrapper with StackMemory integration
|
|
4
4
|
# Usage: Add alias to ~/.zshrc: alias opencode-sm='~/Dev/stackmemory/scripts/opencode-wrapper.sh'
|
|
5
5
|
|
|
6
|
+
# Use Node version from .nvmrc
|
|
7
|
+
export NVM_DIR="$HOME/.nvm"
|
|
8
|
+
if [ -s "$NVM_DIR/nvm.sh" ]; then
|
|
9
|
+
. "$NVM_DIR/nvm.sh"
|
|
10
|
+
nvm use 2>/dev/null
|
|
11
|
+
elif [ -d "$HOME/.nvm/versions/node" ]; then
|
|
12
|
+
NODE_VER=$(cat "$(dirname "$0")/../.nvmrc" 2>/dev/null || echo "20")
|
|
13
|
+
NODE_PATH=$(ls -d "$HOME/.nvm/versions/node/v${NODE_VER}"* 2>/dev/null | head -1)
|
|
14
|
+
[ -n "$NODE_PATH" ] && export PATH="$NODE_PATH/bin:$PATH"
|
|
15
|
+
fi
|
|
16
|
+
|
|
6
17
|
# Check for auto-sync flag
|
|
7
18
|
AUTO_SYNC=false
|
|
8
19
|
SYNC_INTERVAL=5
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#cloud-config
|
|
2
|
+
# StackMemory Portal — Hetzner Cloud-Init
|
|
3
|
+
#
|
|
4
|
+
# Paste this into the Hetzner Cloud "Cloud config" box when creating a server
|
|
5
|
+
# (Ubuntu 24.04, a CX22 is plenty: 2 vCPU / 4 GB, ~€4.5/mo). On first boot it
|
|
6
|
+
# installs tmux, Node, Claude Code, StackMemory, and Tailscale, then starts the
|
|
7
|
+
# portal as a systemd service.
|
|
8
|
+
#
|
|
9
|
+
# Set TS_AUTHKEY to a Tailscale auth key (https://login.tailscale.com/admin/settings/keys)
|
|
10
|
+
# to auto-join your tailnet. Otherwise SSH in afterwards and run `tailscale up`.
|
|
11
|
+
#
|
|
12
|
+
# After boot, find the access URL + token with:
|
|
13
|
+
# journalctl -u stackmemory-portal --no-pager | grep -i token
|
|
14
|
+
|
|
15
|
+
package_update: true
|
|
16
|
+
packages:
|
|
17
|
+
- tmux
|
|
18
|
+
- git
|
|
19
|
+
- curl
|
|
20
|
+
- ca-certificates
|
|
21
|
+
- build-essential
|
|
22
|
+
- python3
|
|
23
|
+
|
|
24
|
+
write_files:
|
|
25
|
+
- path: /etc/stackmemory-portal.env
|
|
26
|
+
permissions: "0600"
|
|
27
|
+
content: |
|
|
28
|
+
# Set this to a Tailscale auth key to auto-join the tailnet on boot.
|
|
29
|
+
TS_AUTHKEY=
|
|
30
|
+
- path: /etc/systemd/system/stackmemory-portal.service
|
|
31
|
+
permissions: "0644"
|
|
32
|
+
content: |
|
|
33
|
+
[Unit]
|
|
34
|
+
Description=StackMemory Portal (browser terminal for Claude Code)
|
|
35
|
+
After=network-online.target tailscaled.service
|
|
36
|
+
Wants=network-online.target
|
|
37
|
+
|
|
38
|
+
[Service]
|
|
39
|
+
Type=simple
|
|
40
|
+
User=root
|
|
41
|
+
WorkingDirectory=/root/work
|
|
42
|
+
Environment=HOME=/root
|
|
43
|
+
Environment=NODE_ENV=production
|
|
44
|
+
ExecStart=/usr/bin/env stackmemory portal start --port 7799 --session claude --cwd /root/work
|
|
45
|
+
Restart=always
|
|
46
|
+
RestartSec=3
|
|
47
|
+
|
|
48
|
+
[Install]
|
|
49
|
+
WantedBy=multi-user.target
|
|
50
|
+
|
|
51
|
+
runcmd:
|
|
52
|
+
# Node.js 20.x
|
|
53
|
+
- curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
|
|
54
|
+
- apt-get install -y nodejs
|
|
55
|
+
# Claude Code + StackMemory + node-pty (browser terminal backend)
|
|
56
|
+
- npm install -g @anthropic-ai/claude-code @stackmemoryai/stackmemory node-pty
|
|
57
|
+
# Tailscale
|
|
58
|
+
- curl -fsSL https://tailscale.com/install.sh | sh
|
|
59
|
+
- bash -c 'set -a; . /etc/stackmemory-portal.env; set +a; [ -n "$TS_AUTHKEY" ] && tailscale up --authkey "$TS_AUTHKEY" --ssh || true'
|
|
60
|
+
# Working dir + start the portal
|
|
61
|
+
- mkdir -p /root/work
|
|
62
|
+
- systemctl daemon-reload
|
|
63
|
+
- systemctl enable --now stackmemory-portal
|
|
64
|
+
|
|
65
|
+
final_message: |
|
|
66
|
+
StackMemory Portal is up after $UPTIME seconds.
|
|
67
|
+
1. If you didn't set TS_AUTHKEY: run `tailscale up` over SSH.
|
|
68
|
+
2. Authenticate Claude (max plan): `tmux attach -t claude` then log in. Detach with Ctrl-b d.
|
|
69
|
+
3. Get the URL + token: `journalctl -u stackmemory-portal --no-pager | grep -i token`
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# StackMemory Portal — VPS setup script.
|
|
4
|
+
#
|
|
5
|
+
# Provisions a fresh Debian/Ubuntu box (e.g. a Hetzner CX22, ~€4.5/mo) to run
|
|
6
|
+
# Claude Code 24/7 inside tmux, reachable from a browser over Tailscale.
|
|
7
|
+
#
|
|
8
|
+
# curl -fsSL https://raw.githubusercontent.com/stackmemoryai/stackmemory/main/scripts/portal/setup.sh | bash
|
|
9
|
+
#
|
|
10
|
+
# Idempotent: safe to re-run. Re-run after editing PORTAL_* env vars below.
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
PORTAL_USER="${PORTAL_USER:-$(whoami)}"
|
|
14
|
+
PORTAL_PORT="${PORTAL_PORT:-7799}"
|
|
15
|
+
PORTAL_SESSION="${PORTAL_SESSION:-claude}"
|
|
16
|
+
PORTAL_WORKDIR="${PORTAL_WORKDIR:-$HOME/work}"
|
|
17
|
+
NODE_MAJOR="${NODE_MAJOR:-20}"
|
|
18
|
+
|
|
19
|
+
log() { printf '\033[36m[portal-setup]\033[0m %s\n' "$*"; }
|
|
20
|
+
have() { command -v "$1" >/dev/null 2>&1; }
|
|
21
|
+
|
|
22
|
+
SUDO=""
|
|
23
|
+
if [ "$(id -u)" -ne 0 ]; then
|
|
24
|
+
if have sudo; then SUDO="sudo"; fi
|
|
25
|
+
fi
|
|
26
|
+
|
|
27
|
+
log "1/6 Installing base packages (tmux, git, curl, build tools)…"
|
|
28
|
+
if have apt-get; then
|
|
29
|
+
$SUDO apt-get update -y
|
|
30
|
+
$SUDO apt-get install -y tmux git curl ca-certificates build-essential python3
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
log "2/6 Installing Node.js ${NODE_MAJOR}.x…"
|
|
34
|
+
if ! have node || [ "$(node -p 'process.versions.node.split(".")[0]' 2>/dev/null || echo 0)" -lt "$NODE_MAJOR" ]; then
|
|
35
|
+
curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | $SUDO -E bash -
|
|
36
|
+
$SUDO apt-get install -y nodejs
|
|
37
|
+
fi
|
|
38
|
+
log " node $(node -v) / npm $(npm -v)"
|
|
39
|
+
|
|
40
|
+
log "3/6 Installing Claude Code + StackMemory…"
|
|
41
|
+
have claude || $SUDO npm install -g @anthropic-ai/claude-code
|
|
42
|
+
$SUDO npm install -g @stackmemoryai/stackmemory
|
|
43
|
+
# node-pty powers the browser terminal; build tools above let it compile.
|
|
44
|
+
$SUDO npm install -g node-pty || log " (node-pty global install failed — install it in the portal's working dir)"
|
|
45
|
+
|
|
46
|
+
log "4/6 Installing Tailscale…"
|
|
47
|
+
if ! have tailscale; then
|
|
48
|
+
curl -fsSL https://tailscale.com/install.sh | $SUDO sh
|
|
49
|
+
fi
|
|
50
|
+
log " Run 'sudo tailscale up' to join your tailnet (prints an auth URL)."
|
|
51
|
+
|
|
52
|
+
log "5/6 Preparing working directory at ${PORTAL_WORKDIR}…"
|
|
53
|
+
mkdir -p "$PORTAL_WORKDIR"
|
|
54
|
+
|
|
55
|
+
log "6/6 Next steps:"
|
|
56
|
+
cat <<EOF
|
|
57
|
+
|
|
58
|
+
StackMemory Portal is installed. To finish:
|
|
59
|
+
|
|
60
|
+
1. Join Tailscale: sudo tailscale up
|
|
61
|
+
2. Authenticate Claude: tmux new -s ${PORTAL_SESSION} 'claude' # log in (max plan), then detach: Ctrl-b d
|
|
62
|
+
3. Start the portal: stackmemory portal start --port ${PORTAL_PORT} --session ${PORTAL_SESSION} --cwd ${PORTAL_WORKDIR}
|
|
63
|
+
4. Open the printed http://100.x.y.z:${PORTAL_PORT}/?token=... URL from any device on your tailnet.
|
|
64
|
+
|
|
65
|
+
For 24/7 operation, install the systemd service:
|
|
66
|
+
sudo cp scripts/portal/stackmemory-portal.service /etc/systemd/system/
|
|
67
|
+
sudo systemctl enable --now stackmemory-portal
|
|
68
|
+
|
|
69
|
+
EOF
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# StackMemory Portal — systemd unit
|
|
2
|
+
#
|
|
3
|
+
# Runs the browser terminal portal 24/7. The Claude Code agent itself lives in
|
|
4
|
+
# a detached tmux session, so it survives portal restarts and browser closes.
|
|
5
|
+
#
|
|
6
|
+
# Install:
|
|
7
|
+
# sudo cp scripts/portal/stackmemory-portal.service /etc/systemd/system/
|
|
8
|
+
# sudo systemctl daemon-reload
|
|
9
|
+
# sudo systemctl enable --now stackmemory-portal
|
|
10
|
+
# journalctl -u stackmemory-portal -f # logs (incl. the access URL/token)
|
|
11
|
+
#
|
|
12
|
+
# EDIT BEFORE USE: set User=, WorkingDirectory=, and HOME to match your box.
|
|
13
|
+
# The defaults below assume the common Hetzner "run as root" layout.
|
|
14
|
+
|
|
15
|
+
[Unit]
|
|
16
|
+
Description=StackMemory Portal (browser terminal for Claude Code)
|
|
17
|
+
After=network-online.target tailscaled.service
|
|
18
|
+
Wants=network-online.target
|
|
19
|
+
|
|
20
|
+
[Service]
|
|
21
|
+
Type=simple
|
|
22
|
+
User=root
|
|
23
|
+
WorkingDirectory=/root/work
|
|
24
|
+
# HOME must be set so the portal finds ~/.stackmemory and Claude's credentials.
|
|
25
|
+
Environment=HOME=/root
|
|
26
|
+
Environment=NODE_ENV=production
|
|
27
|
+
# Bind to 0.0.0.0 so the Tailscale (100.x) address is reachable; Tailscale
|
|
28
|
+
# itself restricts who can connect, and the portal also requires its token.
|
|
29
|
+
ExecStart=/usr/bin/env stackmemory portal start --port 7799 --session claude --cwd /root/work
|
|
30
|
+
Restart=always
|
|
31
|
+
RestartSec=3
|
|
32
|
+
|
|
33
|
+
[Install]
|
|
34
|
+
WantedBy=multi-user.target
|
|
@@ -5,6 +5,17 @@
|
|
|
5
5
|
|
|
6
6
|
set -e
|
|
7
7
|
|
|
8
|
+
# Use Node version from .nvmrc
|
|
9
|
+
export NVM_DIR="$HOME/.nvm"
|
|
10
|
+
if [ -s "$NVM_DIR/nvm.sh" ]; then
|
|
11
|
+
. "$NVM_DIR/nvm.sh"
|
|
12
|
+
nvm use 2>/dev/null
|
|
13
|
+
elif [ -d "$HOME/.nvm/versions/node" ]; then
|
|
14
|
+
NODE_VER=$(cat "$(git rev-parse --show-toplevel)/.nvmrc" 2>/dev/null || echo "20")
|
|
15
|
+
NODE_PATH=$(ls -d "$HOME/.nvm/versions/node/v${NODE_VER}"* 2>/dev/null | head -1)
|
|
16
|
+
[ -n "$NODE_PATH" ] && export PATH="$NODE_PATH/bin:$PATH"
|
|
17
|
+
fi
|
|
18
|
+
|
|
8
19
|
echo "🚀 Setting up StackMemory integration with Claude Desktop..."
|
|
9
20
|
|
|
10
21
|
# Colors for output
|
|
@@ -180,4 +191,4 @@ if pgrep -x "Claude" > /dev/null; then
|
|
|
180
191
|
open -a "Claude"
|
|
181
192
|
echo -e "${GREEN}✅ Claude Desktop restarted!${NC}"
|
|
182
193
|
fi
|
|
183
|
-
fi
|
|
194
|
+
fi
|
package/scripts/smoke-init-db.sh
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env bash
|
|
2
2
|
set -euo pipefail
|
|
3
3
|
|
|
4
|
+
# Use Node version from .nvmrc
|
|
5
|
+
export NVM_DIR="$HOME/.nvm"
|
|
6
|
+
if [ -s "$NVM_DIR/nvm.sh" ]; then
|
|
7
|
+
. "$NVM_DIR/nvm.sh"
|
|
8
|
+
nvm use 2>/dev/null
|
|
9
|
+
elif [ -d "$HOME/.nvm/versions/node" ]; then
|
|
10
|
+
NODE_VER=$(cat "$(dirname "$0")/../.nvmrc" 2>/dev/null || echo "20")
|
|
11
|
+
NODE_PATH=$(ls -d "$HOME/.nvm/versions/node/v${NODE_VER}"* 2>/dev/null | head -1)
|
|
12
|
+
[ -n "$NODE_PATH" ] && export PATH="$NODE_PATH/bin:$PATH"
|
|
13
|
+
fi
|
|
14
|
+
|
|
4
15
|
# Smoke test: verify wrappers auto-init StackMemory and create context.db
|
|
5
16
|
#
|
|
6
17
|
# Steps:
|
|
@@ -55,6 +66,17 @@ run_case() {
|
|
|
55
66
|
( "${cmd[@]}" ) >/dev/null 2>&1
|
|
56
67
|
local rc=$?
|
|
57
68
|
set -e
|
|
69
|
+
|
|
70
|
+
# Use Node version from .nvmrc
|
|
71
|
+
export NVM_DIR="$HOME/.nvm"
|
|
72
|
+
if [ -s "$NVM_DIR/nvm.sh" ]; then
|
|
73
|
+
. "$NVM_DIR/nvm.sh"
|
|
74
|
+
nvm use 2>/dev/null
|
|
75
|
+
elif [ -d "$HOME/.nvm/versions/node" ]; then
|
|
76
|
+
NODE_VER=$(cat "$(git rev-parse --show-toplevel)/.nvmrc" 2>/dev/null || echo "20")
|
|
77
|
+
NODE_PATH=$(ls -d "$HOME/.nvm/versions/node/v${NODE_VER}"* 2>/dev/null | head -1)
|
|
78
|
+
[ -n "$NODE_PATH" ] && export PATH="$NODE_PATH/bin:$PATH"
|
|
79
|
+
fi
|
|
58
80
|
if [[ -f .stackmemory/context.db ]]; then
|
|
59
81
|
echo "$name: DB_OK (rc=$rc)"
|
|
60
82
|
else
|
|
@@ -75,3 +97,4 @@ else
|
|
|
75
97
|
exit 1
|
|
76
98
|
fi
|
|
77
99
|
|
|
100
|
+
|
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
# StackMemory background daemon
|
|
4
4
|
# Automatically saves context every 5 minutes and on exit
|
|
5
5
|
|
|
6
|
+
# Use Node version from .nvmrc
|
|
7
|
+
export NVM_DIR="$HOME/.nvm"
|
|
8
|
+
if [ -s "$NVM_DIR/nvm.sh" ]; then
|
|
9
|
+
. "$NVM_DIR/nvm.sh"
|
|
10
|
+
nvm use 2>/dev/null
|
|
11
|
+
elif [ -d "$HOME/.nvm/versions/node" ]; then
|
|
12
|
+
NODE_VER=$(cat "$(dirname "$0")/../.nvmrc" 2>/dev/null || echo "20")
|
|
13
|
+
NODE_PATH=$(ls -d "$HOME/.nvm/versions/node/v${NODE_VER}"* 2>/dev/null | head -1)
|
|
14
|
+
[ -n "$NODE_PATH" ] && export PATH="$NODE_PATH/bin:$PATH"
|
|
15
|
+
fi
|
|
16
|
+
|
|
6
17
|
INTERVAL=${1:-300} # Default 5 minutes
|
|
7
18
|
PID_FILE="/tmp/stackmemory-daemon.pid"
|
|
8
19
|
|
package/scripts/verify-dist.cjs
CHANGED
|
@@ -43,14 +43,21 @@ function main() {
|
|
|
43
43
|
join(dist, 'cli/codex-sm-danger.js'),
|
|
44
44
|
join(dist, 'cli/claude-sm.js'),
|
|
45
45
|
join(dist, 'cli/claude-sm-danger.js'),
|
|
46
|
+
join(dist, 'cli/hermes-sm.js'),
|
|
47
|
+
join(dist, 'cli/opencode-sm.js'),
|
|
48
|
+
join(dist, 'cli/gemini-sm.js'),
|
|
46
49
|
];
|
|
47
50
|
requiredFiles.forEach(checkFile);
|
|
48
51
|
|
|
49
52
|
// 2) Bin launchers reference dist/src/* (ESM dynamic import)
|
|
50
|
-
fileContains('bin/codex-sm', "
|
|
51
|
-
fileContains('bin/codex-smd', "
|
|
52
|
-
fileContains('bin/claude-sm', "
|
|
53
|
-
fileContains('bin/claude-smd', "
|
|
53
|
+
fileContains('bin/codex-sm', "../dist/src/cli/codex-sm.js");
|
|
54
|
+
fileContains('bin/codex-smd', "../dist/src/cli/codex-sm-danger.js");
|
|
55
|
+
fileContains('bin/claude-sm', "../dist/src/cli/claude-sm.js");
|
|
56
|
+
fileContains('bin/claude-smd', "../dist/src/cli/claude-sm-danger.js");
|
|
57
|
+
fileContains('bin/hermes-sm', "../dist/src/cli/hermes-sm.js");
|
|
58
|
+
fileContains('bin/hermes-smd', "../dist/src/cli/hermes-sm.js");
|
|
59
|
+
fileContains('bin/opencode-sm', "../dist/src/cli/opencode-sm.js");
|
|
60
|
+
fileContains('bin/gemini-sm', "../dist/src/cli/gemini-sm.js");
|
|
54
61
|
|
|
55
62
|
// 3) package.json scripts point to correct paths
|
|
56
63
|
try {
|