@stackmemoryai/stackmemory 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.
Files changed (162) hide show
  1. package/LICENSE +131 -64
  2. package/README.md +3 -1
  3. package/bin/claude-sm +16 -1
  4. package/bin/claude-smd +16 -1
  5. package/bin/codex-smd +16 -1
  6. package/bin/gemini-sm +16 -1
  7. package/bin/hermes-sm +21 -0
  8. package/bin/hermes-smd +21 -0
  9. package/bin/opencode-sm +16 -1
  10. package/dist/src/cli/codex-sm.js +51 -11
  11. package/dist/src/cli/commands/brain.js +206 -0
  12. package/dist/src/cli/commands/company-os.js +184 -0
  13. package/dist/src/cli/commands/context.js +5 -0
  14. package/dist/src/cli/commands/operator.js +127 -0
  15. package/dist/src/cli/commands/orchestrate.js +2 -0
  16. package/dist/src/cli/commands/orchestrator.js +3 -2
  17. package/dist/src/cli/commands/patterns.js +254 -0
  18. package/dist/src/cli/commands/portal.js +161 -0
  19. package/dist/src/cli/commands/scaffold.js +92 -0
  20. package/dist/src/cli/commands/setup.js +1 -4
  21. package/dist/src/cli/commands/sync.js +253 -0
  22. package/dist/src/cli/commands/tasks.js +130 -1
  23. package/dist/src/cli/commands/vision.js +221 -0
  24. package/dist/src/cli/hermes-sm.js +224 -0
  25. package/dist/src/cli/index.js +15 -10
  26. package/dist/src/cli/utils/real-cli-bin.js +72 -0
  27. package/dist/src/core/brain/brain-store.js +187 -0
  28. package/dist/src/core/brain/brain-sync.js +193 -0
  29. package/dist/src/core/brain/index.js +78 -0
  30. package/dist/src/core/brain/types.js +10 -0
  31. package/dist/src/core/cache/token-estimator.js +24 -1
  32. package/dist/src/core/config/feature-flags.js +2 -6
  33. package/dist/src/core/context/frame-database.js +44 -0
  34. package/dist/src/core/context/recursive-context-manager.js +1 -1
  35. package/dist/src/core/context/rehydration.js +2 -1
  36. package/dist/src/core/database/sqlite-adapter.js +14 -1
  37. package/dist/src/core/models/model-router.js +33 -1
  38. package/dist/src/core/models/provider-pricing.js +58 -4
  39. package/dist/src/core/patterns/index.js +22 -0
  40. package/dist/src/core/patterns/pattern-applier.js +39 -0
  41. package/dist/src/core/patterns/pattern-observer.js +157 -0
  42. package/dist/src/core/patterns/pattern-store.js +259 -0
  43. package/dist/src/core/patterns/types.js +19 -0
  44. package/dist/src/core/retrieval/llm-context-retrieval.js +5 -4
  45. package/dist/src/core/retrieval/unified-context-assembler.js +11 -66
  46. package/dist/src/core/skill-packs/types.js +14 -1
  47. package/dist/src/core/storage/cloud-sync-manager.js +116 -0
  48. package/dist/src/core/storage/cloud-sync.js +574 -0
  49. package/dist/src/core/storage/two-tier-storage.js +5 -1
  50. package/dist/src/core/tasks/master-tasks-template.js +43 -0
  51. package/dist/src/core/tasks/md-task-parser.js +138 -0
  52. package/dist/src/core/vision/index.js +27 -0
  53. package/dist/src/core/vision/signals.js +79 -0
  54. package/dist/src/core/vision/types.js +22 -0
  55. package/dist/src/core/vision/vision-file.js +146 -0
  56. package/dist/src/core/vision/vision-loop.js +220 -0
  57. package/dist/src/core/wiki/wiki-compiler.js +103 -1
  58. package/dist/src/daemon/daemon-config.js +45 -0
  59. package/dist/src/daemon/services/desire-path-service.js +566 -0
  60. package/dist/src/daemon/services/research-stream-service.js +320 -0
  61. package/dist/src/daemon/services/telemetry-service.js +192 -0
  62. package/dist/src/daemon/unified-daemon.js +28 -1
  63. package/dist/src/features/browser/cli-browser-agent.js +417 -0
  64. package/dist/src/features/browser/stagehand-workflows.js +578 -0
  65. package/dist/src/features/operator/adapter-factory.js +62 -0
  66. package/dist/src/features/operator/browser-adapter.js +109 -0
  67. package/dist/src/features/operator/desktop-adapter.js +125 -0
  68. package/dist/src/features/operator/index.js +39 -0
  69. package/dist/src/features/operator/llm-decision.js +137 -0
  70. package/dist/src/features/operator/operator-logger.js +92 -0
  71. package/dist/src/features/operator/overnight-runner.js +327 -0
  72. package/dist/src/features/operator/screen-adapter.js +91 -0
  73. package/dist/src/features/operator/session-manager.js +127 -0
  74. package/dist/src/features/operator/state-machine.js +227 -0
  75. package/dist/src/features/operator/task-queue.js +81 -0
  76. package/dist/src/features/portal/index.js +26 -0
  77. package/dist/src/features/portal/server.js +240 -0
  78. package/dist/src/features/portal/types.js +14 -0
  79. package/dist/src/features/portal/ui.js +195 -0
  80. package/dist/src/features/tasks/task-aware-context.js +2 -1
  81. package/dist/src/features/tui/simple-monitor.js +0 -23
  82. package/dist/src/features/tui/swarm-monitor.js +8 -66
  83. package/dist/src/{integrations/diffmem/index.js → features/web/client/hooks/use-socket.js} +6 -5
  84. package/dist/src/features/web/client/lib/utils.js +12 -0
  85. package/dist/src/features/web/client/stores/session-store.js +12 -0
  86. package/dist/src/features/web/server/gcp-billing.js +76 -0
  87. package/dist/src/features/web/server/index.js +10 -0
  88. package/dist/src/features/web/server/spend-calculator.js +228 -0
  89. package/dist/src/hooks/schemas.js +4 -1
  90. package/dist/src/integrations/anthropic/client.js +3 -2
  91. package/dist/src/integrations/claude-code/agent-bridge.js +0 -3
  92. package/dist/src/integrations/claude-code/subagent-client.js +218 -11
  93. package/dist/src/integrations/claude-code/task-coordinator.js +2 -1
  94. package/dist/src/integrations/linear/webhook-retry.js +196 -0
  95. package/dist/src/integrations/linear/webhook-server.js +18 -22
  96. package/dist/src/integrations/mcp/handlers/cloud-sync-handlers.js +101 -0
  97. package/dist/src/integrations/mcp/handlers/index.js +27 -52
  98. package/dist/src/integrations/mcp/server.js +122 -335
  99. package/dist/src/integrations/mcp/tool-alias-registry.js +0 -73
  100. package/dist/src/integrations/mcp/tool-definitions.js +111 -510
  101. package/dist/src/mcp/stackmemory-mcp-server.js +404 -379
  102. package/dist/src/orchestrators/multimodal/determinism.js +2 -1
  103. package/dist/src/orchestrators/multimodal/harness.js +2 -1
  104. package/dist/src/skills/recursive-agent-orchestrator.js +2 -4
  105. package/dist/src/utils/process-cleanup.js +1 -7
  106. package/docs/README.md +42 -0
  107. package/docs/guides/README_INSTALL.md +208 -0
  108. package/package.json +18 -9
  109. package/scripts/claude-code-wrapper.sh +11 -0
  110. package/scripts/claude-sm-setup.sh +12 -1
  111. package/scripts/codex-wrapper.sh +11 -0
  112. package/scripts/git-hooks/branch-context-manager.sh +11 -0
  113. package/scripts/git-hooks/post-checkout-stackmemory.sh +11 -0
  114. package/scripts/git-hooks/post-commit-stackmemory.sh +11 -0
  115. package/scripts/git-hooks/pre-commit-stackmemory.sh +11 -0
  116. package/scripts/hooks/cleanup-shell.sh +12 -1
  117. package/scripts/hooks/task-complete.sh +12 -1
  118. package/scripts/install-code-execution-hooks.sh +12 -1
  119. package/scripts/install-sweep-hook.sh +12 -0
  120. package/scripts/install.sh +11 -0
  121. package/scripts/opencode-wrapper.sh +11 -0
  122. package/scripts/portal/cloud-init.yaml +69 -0
  123. package/scripts/portal/setup.sh +69 -0
  124. package/scripts/portal/stackmemory-portal.service +34 -0
  125. package/scripts/setup-claude-integration.sh +12 -1
  126. package/scripts/smoke-init-db.sh +23 -0
  127. package/scripts/stackmemory-daemon.sh +11 -0
  128. package/scripts/verify-dist.cjs +11 -4
  129. package/dist/src/cli/commands/ralph.js +0 -1053
  130. package/dist/src/hooks/diffmem-hooks.js +0 -376
  131. package/dist/src/integrations/diffmem/client.js +0 -208
  132. package/dist/src/integrations/diffmem/config.js +0 -14
  133. package/dist/src/integrations/greptile/client.js +0 -101
  134. package/dist/src/integrations/greptile/config.js +0 -14
  135. package/dist/src/integrations/greptile/index.js +0 -11
  136. package/dist/src/integrations/mcp/handlers/cross-search-handlers.js +0 -188
  137. package/dist/src/integrations/mcp/handlers/diffmem-handlers.js +0 -455
  138. package/dist/src/integrations/mcp/handlers/greptile-handlers.js +0 -456
  139. package/dist/src/integrations/mcp/handlers/provider-handlers.js +0 -227
  140. package/dist/src/integrations/ralph/bridge/ralph-stackmemory-bridge.js +0 -863
  141. package/dist/src/integrations/ralph/context/context-budget-manager.js +0 -308
  142. package/dist/src/integrations/ralph/context/stackmemory-context-loader.js +0 -354
  143. package/dist/src/integrations/ralph/index.js +0 -17
  144. package/dist/src/integrations/ralph/learning/pattern-learner.js +0 -416
  145. package/dist/src/integrations/ralph/lifecycle/iteration-lifecycle.js +0 -448
  146. package/dist/src/integrations/ralph/loopmax.js +0 -488
  147. package/dist/src/integrations/ralph/monitoring/swarm-dashboard.js +0 -293
  148. package/dist/src/integrations/ralph/monitoring/swarm-registry.js +0 -107
  149. package/dist/src/integrations/ralph/orchestration/multi-loop-orchestrator.js +0 -508
  150. package/dist/src/integrations/ralph/patterns/compounding-engineering-pattern.js +0 -407
  151. package/dist/src/integrations/ralph/patterns/extended-coherence-sessions.js +0 -495
  152. package/dist/src/integrations/ralph/patterns/oracle-worker-pattern.js +0 -387
  153. package/dist/src/integrations/ralph/performance/performance-optimizer.js +0 -357
  154. package/dist/src/integrations/ralph/recovery/crash-recovery.js +0 -461
  155. package/dist/src/integrations/ralph/state/state-reconciler.js +0 -420
  156. package/dist/src/integrations/ralph/swarm/git-workflow-manager.js +0 -444
  157. package/dist/src/integrations/ralph/swarm/swarm-coordinator.js +0 -1005
  158. package/dist/src/integrations/ralph/visualization/ralph-debugger.js +0 -635
  159. package/scripts/ralph-loop-implementation.js +0 -404
  160. /package/dist/src/{integrations/diffmem/types.js → core/storage/cloud-sync-types.js} +0 -0
  161. /package/dist/src/{integrations/greptile → features/operator}/types.js +0 -0
  162. /package/dist/src/{integrations/ralph/types.js → features/web/client/next-env.d.js} +0 -0
@@ -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
@@ -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
 
@@ -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', "import('../dist/src/cli/codex-sm.js')");
51
- fileContains('bin/codex-smd', "import('../dist/src/cli/codex-sm-danger.js')");
52
- fileContains('bin/claude-sm', "import('../dist/src/cli/claude-sm.js')");
53
- fileContains('bin/claude-smd', "import('../dist/src/cli/claude-sm-danger.js')");
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 {