Community程式設計與開發github.com

qbarev/para-plugin

將當前工作目錄轉換為與此外掛連結的 PARA 儲藏庫 (vault),或者將已建立的儲藏庫更新至最新狀態。

para-plugin 是什麼?

此技能是一個用於初始化、遷移及同步 PARA 儲藏庫結構的專用外掛。它會檢查工作目錄的狀態,並引導使用者完成語言、PARA 資料夾位置、任務後端及領域模型等互動式設定。此技能會建立所需的 PARA 資料夾 (專案、領域、資源、封存、收件匣、範本)、筆記範本、ID 日誌、儲藏庫設定檔,並更新 CLAUDE.md 與 Obsidian 設定。它支援三種情境:設定全新儲藏庫 (情境 A)、將現有筆記遷入 PARA 結構 (情境 B),以及將舊版內嵌外掛佈局移轉至新版 (情境 C)。每個步驟都具有冪等性 (idempotent),表示重複執行只會補足缺失部分,而不會覆蓋現有內容。此技能會產生詳細的執行計畫,並在使用者確認後才套用變更,並在修改現有儲藏庫前提供快照備份。它相容於 Claude Code、Cursor、Codex 等使用 SKILL.md 文件的 AI 代理開發工具。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/qbarev/para-plugin/tree/HEAD/skills/init

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

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」並停止;絕不在另一個儲藏庫內部設定儲藏庫。

然後,按此順序決定,並說明找到的內容以及是哪種情況:

  1. 設定 — .claude/para/vault.md 存在 → 前往下方的「重新執行和遷移」。
  2. 情境 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)不會再被詢問。此次執行會補足其餘部分。
  3. 情境 B — 找到了筆記(上面的 find 列印了任何內容)。→「情境 B」。
  4. 情境 A — 否則:一個空資料夾,或僅包含非筆記檔案(一個全新 Obsidian 儲藏庫的 .obsidian/、一個 CLAUDE.md)。→ 步驟 2。

步驟 2 — 問題

一次一個,按此順序,跳過每個已預先回答的問題。每個問題顯示其選項,並且在有預設值時顯示預設值。

  1. 語言 (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
    
  2. PARA 資料夾 (PARA_DIR)。按情境的預設值:A — PARA,一個子資料夾,以便工具和筆記分開;B — .,以便 PARA 資料夾位於使用者自己的資料夾旁邊,除非「情境 B」另有說明。. 將 PARA 資料夾直接放入 REPO_ROOT。有效值:. 或一個資料夾名稱 — 沒有 /,不以 . 開頭,不是 PARA 資料夾名稱本身。

  3. 任務後端 (TASKS)。選項為 todoist、files 或 mcp;第一個是推薦的。用一行說明每個的含義:一個應用程式的收件匣和專案;儲藏庫中的任務筆記,無需應用程式;透過 MCP 連接的任何其他待辦事項應用程式。然後探查 — 下方的「探查後端」。探查失敗的值永遠不會被記錄。

  4. 領域模型 (areas.md)。一個問題:領域是否分組 — none,或群組的名稱(例如 Work、Home)?其他所有內容都是衍生並在計劃中顯示,使用者可以在其中更改它:

    鍵分組none
    GROUPING欄位名稱,除非使用者命名了一個(種子範本的鍵),否則為 spherenone
    GROUPS給定的名稱空
    PLACEMENTAreas/<GROUP>/<title>.mdAreas/<title>.md
    REVIEW_GROUPING每個群組一個區塊,沒有要報告的內容的群組被刪除一個平面列表
    PLACEMENT_CHECK筆記的 GROUPING 欄位必須命名其所屬的頂層資料夾none
    AREA_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 字串結尾,並且在獲得「是」(或預先給定的核准,在「預先給定的答案」設定的限制內)之前,不會套用任何內容。

計劃按此順序列出:

  1. REPO_ROOT(此資料夾)和 PARA_ROOT。
  2. 要建立的資料夾,以及缺失時的 ID 日誌。
  3. 要複製的範本,每個都附帶「範本」對其進行的更改。 在情境 B 中,這裡還包括:移動、專案、IGNORE、保留的重複項以及將會斷開的連結(「情境 B」、「計劃的 B 部分」)。
  4. 設定:vault.md 和 areas.md 的每個鍵及其值;對於 mcp,還有配接器表格 (mcp-generic.md 步驟 7 — 計劃的「是」就是該表格的「是」)。
  5. CLAUDE.md、.claude/settings.json、.obsidian/app.json、.obsidian/templates.json:每個新增的內容。每個會更改的現有值都是一行,顯示舊值和新值。
  6. 探查結果:後端已回應(包含收件匣計數),或 files。
  7. 不會執行哪些操作及其原因(已存在的範本、保留的值)。

步驟 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 — 報告

顯示已完成的摘要,包括任何警告(例如連結中斷)。

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

qbarev/para-plugin

Work with Archive in the Obsidian PARA vault — put a finished or abandoned project (folder and its project in the task app, such as Todoist) or a note into the archive, list what is already there, or restore something back into an active folder. Use when the user says "archive this", "move to archive", "close the project", "what is in the archive", "show the archive", "restore from the archive", "заархивируй", "перенеси в архив", "закрой проект", "что в архиве", "покажи архив", "верни из архива", "восстанови проект".

qbarev/para-plugin

Work with Areas in the Obsidian PARA vault — create an area of ongoing responsibility, or review which areas have gone quiet and what has drifted in them. Use when the user says "create an area", "new area", "review the areas", "which areas have gone quiet", "заведи область", "новая сфера", "добавь область", "обзор областей", "что по областям", "какие сферы провисают", "ревью сфер".

qbarev/para-plugin

Work with the inbox of the PARA vault, which lives in the task app's inbox — capture a raw thought into it, list what is sitting there unprocessed, or process captures one by one into their proper PARA folder. Use when the user wants to capture a note, mentions their task app's inbox (Todoist «Входящие», for example), or says "capture this", "add to the inbox", "what is in the inbox", "process the inbox", "запиши", "закинь в инбокс", "что в инбоксе", "покажи инбокс", "разбери инбокс", "разгреби инбокс".

qbarev/para-plugin

Work with Projects in the Obsidian PARA vault and their pairs in the task app — list the active projects, create a project (folder plus a project in the task app), summarize where a project stands, or add a task to a project in the task app (Todoist, for example). Use when the user says "list projects", "show projects", "what am I working on", "create a project", "new project", "project overview", "project status", "add a task", "какие проекты", "список проектов", "покажи проекты", "что у меня в работе", "заведи проект", "новый проект", "саммари по проекту", "обзор проекта", "что по проекту", "статус проекта", "где я по проекту", "добавь задачу", "заведи задачу".

相關技能