dsh-soul-forging 0.1.1 → 0.1.3

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/bin/_common.sh CHANGED
@@ -6,8 +6,10 @@ set -uo pipefail
6
6
  # 直接按 $0 推上级会指到 node_modules/ 而不是包目录。必须先把链接解开。
7
7
  _SELF="$(readlink -f "${BASH_SOURCE[0]}" 2>/dev/null || echo "${BASH_SOURCE[0]}")"
8
8
  MEMKIT_ROOT="$(cd "$(dirname "$_SELF")/.." && pwd)"
9
- export MEMORY_DIR="${MEMORY_DIR:-$MEMKIT_ROOT/memory}"
10
- export BRAIN_DIR="${BRAIN_DIR:-$MEMKIT_ROOT/brain}"
9
+ # 数据放用户目录,不放 node_modules 里 —— 那里升级会被整个换掉,而且通常没写权限
10
+ export SOUL_DATA_DIR="${SOUL_DATA_DIR:-$HOME/.soul-forging}"
11
+ export MEMORY_DIR="${MEMORY_DIR:-$SOUL_DATA_DIR/memory}"
12
+ export BRAIN_DIR="${BRAIN_DIR:-$SOUL_DATA_DIR/brain}"
11
13
  export DOCS_DIR="${DOCS_DIR:-$MEMKIT_ROOT/docs}"
12
14
  export BIN_DIR="$MEMKIT_ROOT/bin"
13
15
  export BRAIN_PORT="${BRAIN_PORT:-3914}"
package/bin/brain CHANGED
@@ -15,6 +15,6 @@ fi
15
15
  QENC=$("$PY" -c 'import sys,urllib.parse;print(urllib.parse.quote(sys.argv[1]))' "$Q")
16
16
  OUT=$(curl -s -m 5 "$BRAIN_URL/text?q=$QENC&n=$N" 2>/dev/null)
17
17
  if [ -z "$OUT" ] || echo "$OUT" | grep -q "Connection refused"; then
18
- OUT=$("$PY" "$BRAIN_DIR/server.py" --query "$Q" -n "$N" 2>/dev/null)
18
+ OUT=$("$PY" "$MEMKIT_ROOT/brain/server.py" --query "$Q" -n "$N" 2>/dev/null)
19
19
  fi
20
20
  printf '%s\n' "$OUT"
package/bin/init-home CHANGED
@@ -14,10 +14,12 @@ fi
14
14
 
15
15
  mkdir -p "$TARGET"
16
16
  cp -a "$MEMKIT_ROOT/memory/." "$TARGET/"
17
+ # 数据目录也建出来(索引和服务写这里,别写进包目录)
18
+ mkdir -p "${BRAIN_DIR:-$(dirname "$TARGET")/brain}"
17
19
  echo "✓ 空白记忆库已铺到:$TARGET"
18
20
  echo
19
21
  echo "接下来:"
20
22
  echo " 1. 填 $TARGET/SOUL.md"
21
23
  echo " 2. 按 $TARGET/BOOTSTRAP.md 走一遍铸魂"
22
- echo " 3. 建索引:MEMORY_DIR=$TARGET python3 $MEMKIT_ROOT/brain/index.py"
23
- echo " 4. 起服务:MEMORY_DIR=$TARGET bash $MEMKIT_ROOT/bin/serve"
24
+ echo " 3. 建索引:python3 $MEMKIT_ROOT/brain/index.py"
25
+ echo " 4. 起服务:bash $MEMKIT_ROOT/bin/serve"
package/bin/serve CHANGED
@@ -6,7 +6,7 @@ if curl -s -m 2 "$BRAIN_URL/health" | grep -q '"ok": true'; then
6
6
  echo "已在跑:$BRAIN_URL"; exit 0
7
7
  fi
8
8
  mkdir -p "$BRAIN_DIR"
9
- nohup "$PY" "$BRAIN_DIR/server.py" >"$BRAIN_DIR/server.log" 2>&1 &
9
+ nohup "$PY" "$MEMKIT_ROOT/brain/server.py" >"$BRAIN_DIR/server.log" 2>&1 &
10
10
  sleep 1
11
11
  curl -s -m 2 "$BRAIN_URL/health" || { echo "起不来,看 $BRAIN_DIR/server.log"; exit 1; }
12
12
  echo
package/bin/sync CHANGED
@@ -9,9 +9,9 @@ exec 9>"$LOCK"
9
9
  if ! flock -n 9; then echo "同步已在运行,跳过"; exit 0; fi
10
10
 
11
11
  R="$BIN_DIR/runlog"; rc=0
12
- $R "live-summary" -- "$PY" "$BRAIN_DIR/fix-live-summary.py" || rc=$((rc+1))
12
+ $R "live-summary" -- "$PY" "$MEMKIT_ROOT/brain/fix-live-summary.py" || rc=$((rc+1))
13
13
  $R "archive-log" -- "$BIN_DIR/archive-log" || rc=$((rc+2))
14
- $R "index" -- "$PY" "$BRAIN_DIR/index.py" || rc=$((rc+4))
14
+ $R "index" -- "$PY" "$MEMKIT_ROOT/brain/index.py" || rc=$((rc+4))
15
15
  $R "reload" -- bash -c "curl -s -m 5 -X POST $BRAIN_URL/reload >/dev/null" || rc=$((rc+8))
16
16
  $R "check" -- "$BIN_DIR/soul" check || rc=$((rc+16))
17
17
  [ -n "${SOUL_BACKUP_CMD:-}" ] && { $R "backup" -- bash -c "$SOUL_BACKUP_CMD" || rc=$((rc+32)); }
package/brain/index.py CHANGED
@@ -16,9 +16,10 @@ import tempfile
16
16
  from datetime import datetime, timezone
17
17
 
18
18
  ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
19
- MEM = os.environ.get("MEMORY_DIR") or os.path.join(ROOT, "memory")
19
+ DATA_ROOT = os.environ.get("SOUL_DATA_DIR") or os.path.join(os.path.expanduser("~"), ".soul-forging")
20
+ MEM = os.environ.get("MEMORY_DIR") or os.path.join(DATA_ROOT, "memory")
20
21
  TECH = os.environ.get("DOCS_DIR") or os.path.join(ROOT, "docs")
21
- BRAIN = os.environ.get("BRAIN_DIR") or os.path.join(ROOT, "brain")
22
+ BRAIN = os.environ.get("BRAIN_DIR") or os.path.join(DATA_ROOT, "brain")
22
23
  LIVE = os.path.join(BRAIN, "live.jsonl")
23
24
  OUT = os.path.join(BRAIN, "entries.json")
24
25
 
package/brain/server.py CHANGED
@@ -28,7 +28,8 @@ from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
28
28
  from urllib.parse import urlparse, parse_qs
29
29
 
30
30
  ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
31
- BRAIN = os.environ.get("BRAIN_DIR") or os.path.join(ROOT, "brain")
31
+ DATA_ROOT = os.environ.get("SOUL_DATA_DIR") or os.path.join(os.path.expanduser("~"), ".soul-forging")
32
+ BRAIN = os.environ.get("BRAIN_DIR") or os.path.join(DATA_ROOT, "brain")
32
33
  ENTRIES = os.path.join(BRAIN, "entries.json")
33
34
  STATE = os.path.join(BRAIN, "state.json")
34
35
  PORT = int(os.environ.get("BRAIN_PORT") or 3914)
package/brain/soul_lib.py CHANGED
@@ -10,8 +10,9 @@ import re
10
10
  from datetime import datetime, timezone
11
11
 
12
12
  ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
13
- MEM = os.environ.get("MEMORY_DIR") or os.path.join(ROOT, "memory")
14
- BRAIN = os.environ.get("BRAIN_DIR") or os.path.join(ROOT, "brain")
13
+ DATA_ROOT = os.environ.get("SOUL_DATA_DIR") or os.path.join(os.path.expanduser("~"), ".soul-forging")
14
+ MEM = os.environ.get("MEMORY_DIR") or os.path.join(DATA_ROOT, "memory")
15
+ BRAIN = os.environ.get("BRAIN_DIR") or os.path.join(DATA_ROOT, "brain")
15
16
  DOCS = os.environ.get("DOCS_DIR") or os.path.join(ROOT, "docs")
16
17
  LIVE = os.path.join(BRAIN, "live.jsonl")
17
18
  STATE = os.path.join(BRAIN, "state.json")
package/install.sh CHANGED
@@ -21,10 +21,15 @@ else
21
21
  echo "! 没有 curl —— 检索会退化成「每次现算」,慢一点但能用"
22
22
  fi
23
23
 
24
- # 2) 记忆库结构
25
- for d in memory memory/core memory/identity memory/user memory/decisions memory/diary memory/raw brain docs/tech docs/debug; do
26
- [ -d "$d" ] || { mkdir -p "$d"; echo "✓ 补建 $d"; }
27
- done
24
+ # 2) 记忆库:没有就初始化到 ~/.soul-forging/memory(数据不放代码目录)
25
+ DATA="${SOUL_DATA_DIR:-$HOME/.soul-forging}"
26
+ if [ -d "$DATA/memory" ] && [ -n "$(ls -A "$DATA/memory" 2>/dev/null)" ]; then
27
+ echo "✓ 已有记忆库:$DATA/memory"
28
+ else
29
+ MEMORY_DIR="$DATA/memory" bash bin/init-home || true
30
+ fi
31
+ mkdir -p "$DATA/brain"
32
+ export MEMORY_DIR="$DATA/memory" BRAIN_DIR="$DATA/brain"
28
33
 
29
34
  # 3) 建索引
30
35
  echo
package/lib/plugin.js CHANGED
@@ -27,7 +27,7 @@ const PARTS = ['SOUL.md', 'MEMORY.md', 'index.md', 'NOW.md']
27
27
 
28
28
  function defaultMemoryDir() {
29
29
  // 不放在 node_modules 里——升级插件会把那里整个换掉。
30
- return process.env.MEMORY_DIR || join(homedir(), '.soul-forging', 'memory')
30
+ return process.env.MEMORY_DIR || join(process.env.SOUL_DATA_DIR || join(homedir(), '.soul-forging'), 'memory')
31
31
  }
32
32
 
33
33
  function readIf(p) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-soul-forging",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Separate Vessels, One Heart · 异体同心 —— 给 AI 的可迁移长期记忆与铸魂流程:markdown 记忆库 + 小脑检索 + 能长出来的性格。纯本地,不要服务器。",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/soul.py CHANGED
@@ -19,7 +19,8 @@ import os
19
19
  import sys
20
20
 
21
21
  ROOT = os.path.dirname(os.path.abspath(__file__)) # soul.py 就在仓库根目录
22
- MEM = os.environ.get("MEMORY_DIR") or os.path.join(ROOT, "memory")
22
+ DATA_ROOT = os.environ.get("SOUL_DATA_DIR") or os.path.join(os.path.expanduser("~"), ".soul-forging")
23
+ MEM = os.environ.get("MEMORY_DIR") or os.path.join(DATA_ROOT, "memory")
23
24
 
24
25
  # 注入顺序就是重要性顺序:先是谁,再是什么规矩,再是目录,最后是此刻。
25
26
  PARTS = ("SOUL.md", "MEMORY.md", "index.md", "NOW.md")