初始化
一個輕薄的包裝器。所有工作都在 scripts/init.sh 中;這個技能存在的目的是詢問兩個腳本無法自行回答的問題,然後執行它。
1. 詢問
用一條簡短的訊息詢問人類:
- 記憶目錄 — 此儲存庫持久性記憶的位置。如果他們沒有理由想要其他名稱,建議使用
.agent-memory。 - 記憶語言 — 筆記撰寫時使用的語言。這與代理回應時使用的語言無關(請參閱
agent-memory);如果他們沒有偏好,建議使用en。
不要默默地猜測這兩個值 — 錯誤的記憶目錄後續移動起來很麻煩,而這只需要一個簡單的問題。
2. 執行腳本
在執行之前 — 這是寫入部分,它會將檔案佈署到 --repo . — 確認該目錄確實是人類想要設定的儲存庫。同一個環境中可能同時開啟多個專案(尤其是 Cursor),而技能執行的 shell 不一定是用戶正在交談的那一個。用一行文字指明目錄名稱就足夠了。
這兩種環境都不應被信任能將插件根目錄傳遞給技能,因此不要依賴單一變數。Claude Code 會設定 CLAUDE_PLUGIN_ROOT,Cursor 會設定 CURSOR_PLUGIN_ROOT(2026 年 8 月 26 日測量),但各自只在某些上下文中設定,而這裡無法區分一個未設定的變數和一個已設定的變數。以與安裝後 .floppy/run 定位插件相同的方式定位插件 — 這兩個環境變數,然後是開發用的 AI_FLOPPY_HOME,最後是插件快取下最新的檢出目錄 — 如果沒有解析到任何一個,則大聲失敗,並提供安裝命令。這重複了 shim/run 的搜索邏輯(shim/run:11-26),而不是從那裡讀取,因為在此儲存庫中 .floppy/run 尚不存在 — 建立它正是下面腳本要做的第一件事,而該搜尋通常存在於此插件複製到消費者中的唯一檔案中,該檔案必須保持自包含。執行:
has_scripts() { [[ -n "${1:-}" ]] && ls "$1"/scripts/*.sh >/dev/null 2>&1; }
if has_scripts "${CLAUDE_PLUGIN_ROOT:-}"; then
floppy_root="$CLAUDE_PLUGIN_ROOT"
elif has_scripts "${CURSOR_PLUGIN_ROOT:-}"; then
floppy_root="$CURSOR_PLUGIN_ROOT"
elif has_scripts "${AI_FLOPPY_HOME:-}"; then
floppy_root="$AI_FLOPPY_HOME"
else
floppy_root="$(ls -d "$HOME"/.claude/plugins/cache/*/floppy/*/ 2>/dev/null | sort -V | tail -n1)"
fi
if ! has_scripts "$floppy_root"; then
echo "x 找不到 floppy 插件(快取目錄下沒有 scripts/*.sh 被視為未找到)。" >&2
echo " 安裝方式:/plugin marketplace add spscream/ai-floppy && /plugin install floppy" >&2
echo " 如果已安裝,請重新安裝:`plugin update` 在版本不變時是無效操作。" >&2
exit 1
fi
bash "$floppy_root/scripts/init.sh" \
--repo . --memory-dir <他們的答案> --language <他們的答案>
這只能以這種方式運行 — 直接透過腳本,而不是透過 .floppy/run — 因為在此儲存庫中 .floppy/run 尚不存在;建立它正是腳本做的第一件事。
3. 報告
以簡短形式回讀腳本自身的輸出:建立了什麼,以及哪些已經存在且未被觸動(腳本會按檔案說明)。稍後在同一個儲存庫上再次執行此操作不會改變任何東西 — 這是設計使然,而不是值得道歉的限制。
明確指出 quota.lock 並未被建立 — 原因請參閱 agent-memory,並說明一旦有值得測量的語料庫時,它將需要一個真實的測量,而不是在此之前。