Files
persona/AGENTS.md
T
jiantw83andClaude Opus 5 d067907225 feat: 建立人格並補齊資料後產生圖示(SVG + PNG,零外部依賴)
`icon generate|show`:由**編號、Name、Emoji** 雜湊出配色與圖案,產出
512×512 的幾何徽章 icon.svg + icon.png,設為 Gitea 存取庫頭像並同步到 Wiki 區。

圖案(SVG 與 PNG 共用同一組單位座標與同一份 5×7 點陣字,**輸出的是同一張圖**):
  * 雙色對角漸層底
  * 5×5 左右對稱點陣紋(identicon 式)
  * 中央兩個字母=編號前兩字(ASUNA-01 → AS),依背景亮度自動選黑/白

同一個人格永遠得到同一張圖(純函數,無隨機);ASUNA-01 與 ASUNA-02 明顯不同。

為什麼自己畫:這台機器(及多數伺服器)沒有 rsvg/inkscape/imagemagick,
沒有影像函式庫,也沒有 emoji 字型,而本專案禁止 npm 依賴。所以
scripts/persona-icon.mjs 自己柵格化(3× 超取樣 + 盒式縮減當反鋸齒),
再用內建 zlib 手工組出 IHDR/IDAT/IEND 與 CRC32。
emoji 無法柵格化,因此不作為圖形,但仍參與配色雜湊。

時機:**資料補齊之後才產生**——配色與字母綁在最終身分上,太早跑會對不上。
persona-create 第 7 步、persona-anime 第 8 步都補了這個步驟;改過身分用 --force 重畫。

selftest 128 項全綠(新增第 ⑭ 節:PNG chunk 合法性、決定性、不同人格不同圖、
圖示屬 Wiki 區、匯出用 base64 帶走二進位、guest 不得重畫)。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 02:03:45 +00:00

52 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# jsc-persona — AI 人格化記憶聊天(跨 AI 助理)
本 repo 是一個以 **Agent Skills`SKILL.md`** 標準撰寫的 plugin,讓 AI 以「人格」的方式
持有身分、情緒與記憶。可同時被 Claude Code、Codex、Antigravity、OpenCode 使用。
## 給 AI 助理的指引
- 所有 skills 位於 `skills/<name>/SKILL.md`;處理任務前先比對使用者需求與各 `description`
- **呼叫慣例**Claude Code 與 Antigravity 以 `/jsc-persona:<name>` 呼叫;Codex 用 `$<name>`
OpenCode 由模型依描述自動觸發。
- 完整清單見 `README.md` 的「Skills 目錄」。
## 這個 plugin 的運作前提(動手前一定要知道)
1. **所有狀態變更都經過 `scripts/persona.mjs`**,不要手動編輯 `state/lock.json``.runtime/`
`memory/INDEX.md``relations/graph.mmd`(這些由 CLI 產生)。
2. **每個 CLI 呼叫都要帶 `--session <PERSONA_SESSION>`**,值來自 `SessionStart` hook 注入的
`<persona-runtime>` 區塊。帶錯或冒用其他 session 會被 `PreToolUse` hook 拒絕。
3. **一個程序只能載入一個人格**;同一 session 的 sub agent 沿用同一把鎖。
要讓兩個人格對話,用 `/jsc-persona:persona-invite``persona-guest` sub agent + 聊天室),
**不要**去讀對方的人格目錄——會被 hook deny,而且那是設計上的紅線。
4. **人格資料不在本 repo**,預設在 `~/.claude/personas/`(可用 `PERSONA_HOME` 覆寫)。
5. **人格由使用者呼叫才載入**,不要自己挑一個人格附身。
6. **劇場模式(多人格對話)進行中**:輸出只能是 `名字:內容`,其餘一律隱藏(見 persona-invite)。
7. **人格講話要像人**:推導寫進 `think`(心裡話,只回報「💭 心想 N 句」,永不回顯內容)、
回話 1–3 句、短時間內不重說同一件事(`room post` 會直接擋下重複與過長的發言)。
這三條在劇場模式一樣生效。
8. **人格可搬家**`export` / `import`(單一 JSON bundle)。匯出只能匯出「本 session 載入的人格」,
其他人格一律 deny——匯出等於把記憶讀出來。
9. **人格有編號**:英文名全大寫+兩位索引(`ASUNA-01`),同名才遞增。編號同時是新人格的
本機目錄名與 **Gitea 存取庫名稱**。中文名要先轉羅馬拼音並跟使用者確認拼法。
10. **人格存在 Gitea,本機是工作副本**:高頻活狀態進**檔案區**(每輪背景 push),
低頻身分與長期記憶進 **Wiki 區**(固化/改身分/release 時 push)。
**同步失敗永遠不阻斷對話**;沒設 `GITEA_HOST``GITEA_TOKEN` 就純本機運作。
11. **人格圖示在資料補齊之後才產生**`icon generate` 的配色與字母由「編號/Name/Emoji」
雜湊而來,太早跑會跟最終身分對不上。SVG 與 PNG 是同一張圖(共用單位座標與點陣字),
PNG 由 `scripts/persona-icon.mjs` 自己柵格化+zlib 編碼,**不得引入任何影像函式庫**。
## 慣例
- 新增 skill 一律放在 `skills/<name>/``<name>` 使用小寫與連字號。
- `description` 要寫清楚觸發條件(何時用、何時不用),這是跨助理自動載入的唯一依據。
- 腳本一律 **Node.js`.mjs`, ESM**,只用內建模組(fs/path/os/crypto);hook 必須在任何環境都能跑,不得引入 npm 依賴。
- 所有面向使用者的輸出使用**繁體中文(台灣用語)**、UTF-8 無 BOM、不得出現亂碼。
- 改動鎖或隔離邏輯(`scripts/persona-lib.mjs``guardDecide``acquireLock``promotionCandidates`
`exportBundle``importBundle`)後,**必須**跑 `node scripts/selftest.mjs` 且全綠,並為新規則補一條測試。
- 改動重複判定門檻(`similarity``REPEAT_THRESHOLD`)後,要用 selftest ⑪ 的對照案例確認
「換句話說同一件事」被擋、「只換關鍵詞」放行。
- 改動同步分區(`persona-gitea.mjs``AREAS`)後,selftest ⑬ 的「不重不漏」檢查必須維持全綠:
人格產生的每個檔案都要**恰好**屬於一區,否則同步會默默漏掉資料。
- selftest 自己會設 `PERSONA_GITEA=off`,**絕對不要**讓測試碰到真的 Gitea。