Init
將會話起始的資料夾轉換為與此外掛連結的 PARA 儲藏庫,並維持該狀態:第二次執行會補足缺失的部分並遷移較舊的綱要。這是唯一會寫入儲藏庫設定的技能,也是唯一在沒有設定檔的情況下執行的技能。
它寫入的內容
以下所有內容,僅此而已。REPO_ROOT、PARA_DIR、PARA_ROOT 的定義如 paths.md 所述。
| 內容 | 位置 | 方式 |
|---|---|---|
| PARA 資料夾 | PARA_ROOT/ + Projects、Areas、Resources、Archive、Inbox、Templates | 缺失時建立 |
| 筆記範本 | PARA_ROOT/Templates/ | 從外掛植入,僅在缺失時執行(「範本」) |
| ID 日誌 | PARA_ROOT/Archive/.removed-ids | 僅標頭,僅在缺失時執行(project-id.md「日誌」) |
| 儲藏庫設定 | REPO_ROOT/.claude/para/vault.md、areas.md;僅當 TASKS 為 mcp 時,adapter.md | 從 config.example/ 複製;絕不覆寫 |
| 外掛區塊 | REPO_ROOT/CLAUDE.md | 僅在標記之間(「CLAUDE.md」) |
| 技能權限 | REPO_ROOT/.claude/settings.json | 合併,絕不取代(「設定」) |
| Obsidian 設定 | REPO_ROOT/.obsidian/app.json、templates.json | 合併(「Obsidian」) |
| 使用者的筆記和資料夾 (僅 B) | 從它們原本的位置到 PARA 資料夾 | 移動,絕不編輯 — 僅限已核准計劃中列出的移動(「情境 B」) |
| 專案概覽 (僅 B) | PARA_ROOT/Projects/PROJ-xxxx <title>/ | 新增,針對使用者稱為專案的資料夾(「情境 B」) |
| 概覽中的配對鍵 (僅 C) | PARA_ROOT/Projects/、PARA_ROOT/Archive/ | 僅重新命名一個 frontmatter 鍵,不做其他事(scenario-c.md) |
| 儲藏庫的規劃檔案 (僅 C) | REPO_ROOT/.claude/local/planning.md | 新增,從舊工具中提取(scenario-c.md) |
| 舊的內嵌工具 (僅 C) | REPO_ROOT/.claude/、CLAUDE.md、舊範本的文件 | 移至 macOS 垃圾桶,層級 2(scenario-c.md) |
基礎層
在執行前閱讀,每個檔案相對於此技能基礎目錄為 ../../para/<file>.md(以及 ../../config.example/、../../lang/、../../templates/ 亦同):
../../para/paths.md— 始終:兩個根目錄、「語言」、用於TASKS的配接器。init寫入的所有內容都必須與其一致。../../para/tasks.md— 操作、「配對」、「後端缺失」../../para/adapters/mcp-generic.md— 當TASKS為mcp時;任何其他值的配接器由paths.md命名../../para/note-format.md— 範本必須符合的 frontmatter 綱要../../para/migrations.md— 外掛目前的SCHEMA以及遷移的執行方式../../para/claude-md-block.md— 用於CLAUDE.md的區塊../../para/confirm.md— 層級;下面的計劃是init如何滿足它們../../para/project-id.md— 「日誌」:ID 日誌的標頭(步驟 5.1)../../config.example/vault.md、areas.md、adapter.md— 設定的形狀- 僅情境 B:
../../para/move.md(移動如何保持連結)、project-id.md(發出 ID)、../../para/thresholds.md(領域過時閾值和「mtime 的限制」)、paths.md「IGNORE」 ../../lang/<LANG>.md,一旦LANG已知:init.*字串- 僅情境 C,以及重新執行時 C 的殘留:此技能基礎目錄中的
scenario-c.md— 關於舊佈局的所有內容;還有../../para/move.md(垃圾桶)
以下的 SKILL_DIR 是此技能的基礎目錄,如同工具鏈所宣告。
整個執行的規則
REPO_ROOT是會話的工作目錄,作為絕對路徑 (pwd)。這是外掛從工作目錄獲取根目錄的唯一地方:init將其寫下供所有其他技能使用。計劃會說明是哪個資料夾,因此如果在錯誤的地方開始會話,會在寫入任何內容之前被捕捉到。- 在計劃獲得「是」之前,不會寫入任何內容。 檢查、詢問和探查任務後端都是唯讀的。
vault.md最後才寫入。 它是標記儲藏庫已設定的檔案;中斷的執行不會留下vault.md,下一次執行會重新開始,發現工作已完成。- 每個步驟都是冪等的:缺失時建立,存在時合併,絕不覆寫。連續執行兩次
init,第二次不會改變任何東西。 - 引用每個路徑(
paths.md「規則」)。REPO_ROOT可能包含空格。 - 語言。 在選擇
LANG之前,使用使用者書寫的語言(如果沒有任何依據,則使用英文 — 例如一個裸的/para:init)。從那時起,所有內容都使用LANG,依據paths.md「語言」,包括剩餘的問題;計劃和報告標題是init.*字串。
預先給定的答案
$ARGUMENTS 可能已攜帶答案:語言、PARA_DIR(「default」表示建議的那個)、任務後端、領域模型、情境 B 中的排序答案(按資料夾或根筆記,以及重複名稱)、快照答案以及計劃的核准。接受每個給定的答案,不要再次詢問;只詢問缺失的部分。不是有效選項的答案會再次詢問,並說明原因。
預先給定的核准意味著:顯示計劃,然後立即套用,無需等待 — 但僅在計劃的每一行都新增某些東西(一個資料夾、一個檔案、一個鍵、一個條目)時才如此。如果有一行更改或取代了已存在的內容(不同的 Obsidian 值、不同的 CLAUDE.md 區塊、遷移中的範本、現有 vault.md 中的 REPO_ROOT),則為層級 2 (confirm.md):即使如此,也會顯示計劃並等待「是」。
情境 B 的移動有兩種,這是關於預先核准如何涵蓋它們的唯一陳述。使用者在自己的答案中決定的移動(B3,或 $ARGUMENTS 中的排序答案)會改變筆記的位置,但絕不改變其內容,而 confirm.md 將移動放在層級 1:計劃的「是」,無論是當時給定的還是預先給定的,都涵蓋它。僅由規則決定的移動(B2:移至 Archive/ 或 Resources/)是 init 對使用者筆記的自行判斷:它需要對顯示該移動的計劃進行即時的「是」,即使預先給定了核准。無論如何,都會在移動之前提供快照(步驟 4)。預先回答的排序問題不會被詢問;未回答的問題會被詢問,並且在回答之前,無論是否核准,都不會套用任何內容。
步驟 1 — 檢查
唯讀。找出該資料夾是什麼並命名情境。
REPO_ROOT=$(pwd)
ls -A "$REPO_ROOT"
ls "$REPO_ROOT/.claude" "$REPO_ROOT/.claude/para" "$REPO_ROOT/.claude/skills" 2>/dev/null
# 舊的內嵌佈局(情境 C):其設定資料夾或其基礎層
ls -d "$REPO_ROOT/.claude/para/local" "$REPO_ROOT/.claude/para/paths.md" 2>/dev/null # old-layout
# 名稱類似舊版內嵌技能的技能資料夾:僅回報,本身不會構成 C
for s in inbox projects areas resources archive remove vault-lint; do
[ -f "$REPO_ROOT/.claude/skills/$s/SKILL.md" ] && echo "old skill: $s"; done
# 筆記:每個不在 REPO_ROOT 點條目下的 .md 檔案,但儲存庫自己的檔案和範本除外
# (點條目是相對於 REPO_ROOT 修剪的,因此本身位於點目錄下的儲藏庫仍然可見)
find "$REPO_ROOT" -mindepth 1 -name '.*' -prune -o -name "*.md" -not -path "*/Templates/*" \
! -path "$REPO_ROOT/CLAUDE.md" ! -path "$REPO_ROOT/README.md" ! -path "$REPO_ROOT/CHANGELOG.md" -print | head -50
# 此資料夾上方的儲藏庫:init 是在子資料夾中啟動的
d=$(dirname "$REPO_ROOT")
while [ "$d" != "/" ] && [ "$d" != "$HOME" ]; do
{ [ -e "$d/.claude/para/vault.md" ] || [ -d "$d/.obsidian" ]; } && echo "vault above: $d"
d=$(dirname "$d")
done
在執行任何其他操作之前,若發生以下情況則停止:
REPO_ROOT是$HOME或/— 不是一個儲藏庫;指出這一點。- 在上方找到了一個儲藏庫 — 顯示「從
<那個資料夾>執行/para:init」並停止;絕不在另一個儲藏庫內部設定儲藏庫。
然後,按此順序決定,並說明找到的內容以及是哪種情況:
- 設定 —
.claude/para/vault.md存在 → 前往下方的「重新執行和遷移」。 - 情境 C — 舊的內嵌工具,透過其舊的基礎層或設定(僅限於上面的
old-layout行)辨識:其設定資料夾local/或.claude/para/內部的基礎層檔案paths.md。→「情境 C」。 一個名稱類似舊技能的技能資料夾(old skill:行)但缺少上述兩者,則不是 C:根據下面的規則轉到 B 或 A。說明找到的是哪個資料夾,並且init不會動它;計劃中的「not done」會再次提及它。 一個僅包含此外掛設定檔案 (areas.md、adapter.md) 且沒有vault.md的.claude/para/目錄不是 C:它是init在寫入vault.md之前被中斷或拒絕的首次執行。就像它不存在一樣,根據下面的規則轉到 B 或 A,但這些檔案是儲藏庫的設定 — 絕不覆寫 — 並且它們已回答的問題(問題 4 的areas.md)不會再被詢問。此次執行會補足其餘部分。 - 情境 B — 找到了筆記(上面的
find列印了任何內容)。→「情境 B」。 - 情境 A — 否則:一個空資料夾,或僅包含非筆記檔案(一個全新 Obsidian 儲藏庫的
.obsidian/、一個CLAUDE.md)。→ 步驟 2。
步驟 2 — 問題
一次一個,按此順序,跳過每個已預先回答的問題。每個問題顯示其選項,並且在有預設值時顯示預設值。
-
語言 (
LANG)。選項是此外掛附帶的語言:同時具有lang/<code>.md和templates/<code>/的語言代碼 (paths.md「語言」):for f in "$SKILL_DIR"/../../lang/*.md; do l=$(basename "$f" .md) [ -d "$SKILL_DIR/../../templates/$l" ] && echo "$l"; done -
PARA 資料夾 (
PARA_DIR)。按情境的預設值:A —PARA,一個子資料夾,以便工具和筆記分開;B —.,以便 PARA 資料夾位於使用者自己的資料夾旁邊,除非「情境 B」另有說明。.將 PARA 資料夾直接放入REPO_ROOT。有效值:.或一個資料夾名稱 — 沒有/,不以.開頭,不是 PARA 資料夾名稱本身。 -
任務後端 (
TASKS)。選項為todoist、files或mcp;第一個是推薦的。用一行說明每個的含義:一個應用程式的收件匣和專案;儲藏庫中的任務筆記,無需應用程式;透過 MCP 連接的任何其他待辦事項應用程式。然後探查 — 下方的「探查後端」。探查失敗的值永遠不會被記錄。 -
領域模型 (
areas.md)。一個問題:領域是否分組 —none,或群組的名稱(例如 Work、Home)?其他所有內容都是衍生並在計劃中顯示,使用者可以在其中更改它:鍵 分組 noneGROUPING欄位名稱,除非使用者命名了一個(種子範本的鍵),否則為 spherenoneGROUPS給定的名稱 空 PLACEMENTAreas/<GROUP>/<title>.mdAreas/<title>.mdREVIEW_GROUPING每個群組一個區塊,沒有要報告的內容的群組被刪除 一個平面列表 PLACEMENT_CHECK筆記的 GROUPING欄位必須命名其所屬的頂層資料夾noneAREA_TASK_PROJECTSGROUPS的名稱一個名稱: areas.review.heading字串
探查後端
探查是 inbox.list,根據所選值的配接器執行 (paths.md)。它是唯讀的;空的收件匣是成功的。僅列印計數,從不列印捕獲內容。
files— 無需探查:配接器是磁碟,並且「後端缺失」不可能發生 (tasks.md)。mcp— 立即執行adapters/mcp-generic.md的步驟 1–6。步驟 1 找不到任何工具是探查失敗。步驟 6 是在使用者同意並且應用程式有收件匣時進行的探查;否則計劃會說明映射未經驗證。步驟 7–8 屬於計劃和下面的「步驟 5」。- 任何其他值 — 根據其配接器執行
inbox.list。如果配接器的工具不在此會話中,或者呼叫失敗:用一行說明 (tasks.md「後端缺失」),不要記錄該值,而是提供files作為替代 — 或者連接應用程式並再次執行/para:init。絕不寫入探查未成功的TASKS值,也絕不記錄一個值同時承諾稍後切換。
步驟 3 — 計劃
一份包含所有將被建立、合併或更改的內容的清單,以 init.plan.heading 字串為標題。這是一個使用者可以編輯的提案,而不是一個宣告:編輯會產生一個新的計劃,並再次顯示。它以 init.plan.approve 字串結尾,並且在獲得「是」(或預先給定的核准,在「預先給定的答案」設定的限制內)之前,不會套用任何內容。
計劃按此順序列出:
REPO_ROOT(此資料夾)和PARA_ROOT。- 要建立的資料夾,以及缺失時的 ID 日誌。
- 要複製的範本,每個都附帶「範本」對其進行的更改。
在情境 B 中,這裡還包括:移動、專案、
IGNORE、保留的重複項以及將會斷開的連結(「情境 B」、「計劃的 B 部分」)。 - 設定:
vault.md和areas.md的每個鍵及其值;對於mcp,還有配接器表格 (mcp-generic.md步驟 7 — 計劃的「是」就是該表格的「是」)。 CLAUDE.md、.claude/settings.json、.obsidian/app.json、.obsidian/templates.json:每個新增的內容。每個會更改的現有值都是一行,顯示舊值和新值。- 探查結果:後端已回應(包含收件匣計數),或
files。 - 不會執行哪些操作及其原因(已存在的範本、保留的值)。
步驟 4 — 快照 (僅 B 和 C)
在套用觸及現有儲藏庫的計劃之前,提供一個 zip 副本放在旁邊 — 總是詢問,拒絕會被接受,預先給定的答案會被採用。它與計劃的核准在同一則訊息中詢問 (init.snapshot 字串),以便使用者一次回答:
zip_path="$(dirname "$REPO_ROOT")/$(basename "$REPO_ROOT")-backup-$(date +%Y-%m-%d).zip"
ditto -c -k --keepParent "$REPO_ROOT" "$zip_path"
情境 A 沒有要保存的內容,會跳過此步驟。
步驟 5 — 套用
依序執行計劃中的每一行。每行執行後,報告其結果。
5.1 資料夾和 ID 日誌
mkdir -p "$PARA_ROOT/"{Projects,Areas,Resources,Archive,Inbox,Templates}
echo "# Removed project ids" > "$PARA_ROOT/Archive/.removed-ids"
5.2 範本
# 將每個種子範本複製到 Templates/,套用欄位調整
for t in "$SKILL_DIR"/../../templates/$LANG/*.md; do
base=$(basename "$t")
dest="$PARA_ROOT/Templates/$base"
if [ ! -f "$dest" ]; then
# 套用 frontmatter 調整
cp "$t" "$dest"
fi
done
5.3 設定
# vault.md
cp "$SKILL_DIR/../../config.example/vault.md" "$REPO_ROOT/.claude/para/vault.md"
# areas.md
cp "$SKILL_DIR/../../config.example/areas.md" "$REPO_ROOT/.claude/para/areas.md"
# adapter.md (僅當 TASKS 為 mcp 時)
if [ "$TASKS" = "mcp" ]; then
cp "$SKILL_DIR/../../config.example/adapter.md" "$REPO_ROOT/.claude/para/adapter.md"
fi
5.4 CLAUDE.md 區塊
# 在 REPO_ROOT/CLAUDE.md 中插入或取代外掛區塊
# 使用 ../para/claude-md-block.md 中定義的區塊
5.5 設定合併
# 將 .claude/settings.json、.obsidian/app.json、.obsidian/templates.json 合併
步驟 6 — 報告
顯示已完成的摘要,包括任何警告(例如連結中斷)。