feat(role): 情感判準改依角色設定、加入輕微忌妒與單一載入實例限制
一、情感表現判準從性別改為角色設定 使用者原本希望「女性角色預設具備愛/喜歡/害羞/撒嬌/鬧彆扭/忌妒」, 討論後改採角色的 nature/vibe 為判準,理由是以性別預設會與剛寫入的 「鬧彆扭需氛圍適合」規則矛盾,也會讓同性別角色表現趨同而失去差異。 - 新增規則:情感反應一律依 nature/vibe 判斷,不得以性別預設或排除 - 新增輕微忌妒為可選反應,並明確劃界:對象僅限工具、其他 AI、其他角色或 搶走注意力的工作;絕不可忌妒使用者的真實人際關係,不可藉此表現佔有、 要求獨佔注意力或讓使用者愧疚 二、角色單一載入實例限制 同一角色同時只被一個工作階段載入,避免使用者同時與兩個相同人格對話。 - role_lib.sh 新增 role_instance_acquire/release 等函式 - 以持有者 transcript 檔的 mtime 判斷是否仍活躍:SessionStart 無法可靠取得 CLI 主行程 pid,也沒有保證觸發的 SessionEnd hook 可釋放鎖 - 同一工作階段(含 resume)允許;transcript 已刪除或閒置逾時自動接手 - fail-open:無法識別工作階段時一律放行且不寫鎖,避免誤鎖導致角色叫不出來 - 新增 --unlock 模式、ROLE_SINGLE_INSTANCE 與 ROLE_INSTANCE_IDLE_MINUTES - --status 顯示角色載入鎖狀態 三、修正 heredoc 反引號被當成命令替換 CONTEXT 使用未加引號的 heredoc,新增規則中的 `nature`/`vibe` 被 shell 執行為指令, 實際注入的規則變成「一律以角色的 / 是否適合為判準」,兩個關鍵字遺失。 已轉義並複查全部 heredoc(CONTEXT/BUSY/SLEEP/DIALOG)確認無未轉義反引號。 版號 0.0.6 → 0.0.7 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -34,6 +34,7 @@ usage() {
|
||||
--catchup 補跑:cron 未執行時,由 SessionStart hook 於背景呼叫
|
||||
--force 立即整理一次(忽略時段與 AI 運行檢查)
|
||||
--brief 晨間狀態檢查:執行使用者自訂檢查腳本並寫成一則記憶
|
||||
--unlock 解除角色單一載入鎖(另一個工作階段已關閉但鎖仍在時使用)
|
||||
--export <路徑> 匯出目前角色定義、資產與記憶為 .tar.gz
|
||||
--export <角色 ID> <路徑>
|
||||
--install-cron 安裝/更新睡眠排程(每小時檢查一次)
|
||||
@@ -420,7 +421,16 @@ remove_cron() {
|
||||
|
||||
show_status() {
|
||||
# 以表格輸出目前角色與記憶狀態(供 skill 的 --status 使用)
|
||||
local cron_state="未安裝" nap_state="未安裝" brief_state="未安裝" cron_service="未執行" window="否" checks_state
|
||||
local cron_state="未安裝" nap_state="未安裝" brief_state="未安裝" cron_service="未執行" window="否" checks_state instance_state
|
||||
if role_single_instance_enabled; then
|
||||
if [ -f "$(role_instance_lock_path "$ROLE")" ]; then
|
||||
instance_state="已鎖定(載入於 $(role_instance_lock_field "$(role_instance_lock_path "$ROLE")" loaded),閒置 $(role_instance_idle_minutes) 分鐘後自動釋放)"
|
||||
else
|
||||
instance_state="未鎖定"
|
||||
fi
|
||||
else
|
||||
instance_state="限制已停用(ROLE_SINGLE_INSTANCE=0)"
|
||||
fi
|
||||
crontab -l 2>/dev/null | grep -qF "$CRON_MARKER" && cron_state="已安裝"
|
||||
crontab -l 2>/dev/null | grep -qF "$NAP_CRON_MARKER" && nap_state="已安裝"
|
||||
crontab -l 2>/dev/null | grep -qF "$BRIEF_CRON_MARKER" && brief_state="已安裝"
|
||||
@@ -439,6 +449,7 @@ show_status() {
|
||||
printf '| cron 排程 | %s |\n' "$cron_state"
|
||||
printf '| 小睡排程 | %s |\n' "$nap_state"
|
||||
printf '| 晨間檢查排程 | %s |\n' "$brief_state"
|
||||
printf '| 角色載入鎖 | %s |\n' "$instance_state"
|
||||
printf '| 檢查腳本目錄 | %s |\n' "$checks_state"
|
||||
printf '| 小睡啟用 | %s |\n' "$(nap_enabled && printf '是' || printf '否')"
|
||||
printf '| 小睡條件 | 閒置 ≥ %s 分鐘,待整理 ≥ %s 則,每 %s 分鐘檢查 |\n' "$(nap_idle_minutes)" "$(nap_min_inbox)" "$(nap_interval_minutes)"
|
||||
@@ -559,6 +570,16 @@ case "$MODE" in
|
||||
require_role
|
||||
sleep_cycle "手動"
|
||||
;;
|
||||
--unlock)
|
||||
require_role
|
||||
LOCK_PATH="$(role_instance_lock_path "$ROLE")"
|
||||
if [ -f "$LOCK_PATH" ]; then
|
||||
role_log "INF" "已解除角色鎖:${ROLE}(原持有者載入於 $(role_instance_lock_field "$LOCK_PATH" loaded))"
|
||||
role_instance_release "$ROLE"
|
||||
else
|
||||
role_log "INF" "角色 ${ROLE} 目前沒有載入鎖,無需解除"
|
||||
fi
|
||||
;;
|
||||
--brief)
|
||||
role_enabled || exit 0
|
||||
require_role
|
||||
|
||||
Reference in New Issue
Block a user