Init
セッションが開始されたフォルダを、このプラグインに接続されたPARA保管庫に変換し、その状態を維持します。2回目の実行では、不足している部分を補完し、古いスキーマを移行します。これは、保管庫の設定を書き込む唯一のスキルであり、設定がなくても実行できる唯一のスキルです。
書き込むもの
以下に示すもののみを書き込みます。それ以外は書き込みません。REPO_ROOT、PARA_DIR、PARA_ROOTはpaths.mdで定義されている通りです。
| 対象 | 場所 | 方法 |
|---|---|---|
| PARAフォルダ | PARA_ROOT/ + Projects, Areas, Resources, Archive, Inbox, Templates | 存在しない場合に作成 |
| ノートテンプレート | PARA_ROOT/Templates/ | プラグインからシード、存在しない場合のみ(「Templates」) |
| IDジャーナル | PARA_ROOT/Archive/.removed-ids | ヘッダー行のみ、存在しない場合のみ(project-id.md 「The journal」) |
| 保管庫設定 | REPO_ROOT/.claude/para/vault.md, areas.md; adapter.mdはTASKSがmcpの場合のみ | config.example/からコピー、上書きはしない |
| プラグインブロック | REPO_ROOT/CLAUDE.md | マーカー間のみ(「CLAUDE.md」) |
| スキル権限 | REPO_ROOT/.claude/settings.json | マージ、置き換えない(「Settings」) |
| 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/ | 1つのフロントマターキーをリネーム、それ以外は変更しない(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— 常に:2つのルート、「Language」、TASKSのアダプタ。initが書き込むものはすべてこれと一致する必要があります。../../para/tasks.md— 操作、「Pairing」、「Backend missing」../../para/adapters/mcp-generic.md—TASKSがmcpの場合のみ。他の値に対するアダプタはpaths.mdで指定されます。../../para/note-format.md— テンプレートが一致する必要があるフロントマタースキーマ../../para/migrations.md— プラグインの現在のSCHEMAと移行の実行方法../../para/claude-md-block.md—CLAUDE.mdのためのブロック../../para/confirm.md— ティア。以下の計画はinitがそれらをどのように満たすかを示します。../../para/project-id.md— 「The journal」:IDジャーナルのヘッダー(ステップ5.1)../../config.example/vault.md,areas.md,adapter.md— 設定のテンプレート- シナリオBのみ:
../../para/move.md(移動がリンクを維持する方法)、project-id.md(IDの発行)、../../para/thresholds.md(エリアの非アクティブしきい値と「The limit of 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を2回連続で実行しても、2回目は何も変更されません。 - すべてのパスを引用符で囲むこと(
paths.md「Rules」)。REPO_ROOTにはスペースが含まれる可能性があります。 - 言語。
LANGが選択されるまでは、ユーザーが使用した言語で話します(手がかりがない場合は英語 — 裸の/para:initなど)。その後は、paths.md「Language」に従って、残りの質問を含めすべてLANGで行われます。計画とレポートの見出しはinit.*文字列です。
事前に指定された回答
$ARGUMENTSには既に回答が含まれている場合があります:言語、PARA_DIR(「デフォルト」は提案されたものを意味します)、タスクバックエンド、エリアモデル、シナリオBのソート回答(フォルダごとまたはルートノートごと、および重複名の場合)、スナップショット回答、計画の承認。指定された回答はすべて受け入れ、再度質問しません。不足しているものだけを質問します。有効な選択肢ではない回答は、その理由を説明して再度質問されます。
事前に指定された承認は、計画を表示し、待たずに適用することを意味します — ただし、計画の各行が何か(フォルダ、ファイル、キー、エントリ)を追加する場合のみ。既に存在するものを変更または置き換える行(異なるObsidian値、異なるCLAUDE.mdブロック、移行中のテンプレート、既存のvault.md内のREPO_ROOT)はティア2(confirm.md)です:計画が表示され、initはその場合でも「はい」を待ちます。
シナリオBの移動には2種類あり、これが事前承認がそれらをどのようにカバーするかについての唯一の声明です。ユーザーが自身の回答(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/またはそのベースレイヤーファイルpaths.mdが.claude/para/内にある場合。→ 「シナリオC」。 古いスキルのいずれかに似た名前のスキルフォルダ(old skill:行)があり、上記のいずれもない場合は、Cではありません。以下のルールに従ってBまたはAに進みます。どのフォルダが見つかり、initがそれをそのままにするかを伝えます。計画の「未実行」部分で再度言及されます。 このプラグインの設定ファイル(areas.md、adapter.md)のみを含み、vault.mdを含まない.claude/para/はCではありません。これは、vault.mdの前に中断または拒否されたinitの初回実行です。それがないものとして、以下のBまたはAに進みます。ただし、それらのファイルは保管庫の設定であり — 決して上書きされません — そして、それらが既に回答している質問(areas.mdの質問4)は再度質問されません。実行は残りを補完します。 - シナリオB — ノートが見つかった場合(上記の
findコマンドが何かを出力した場合)。→ 「シナリオB」。 - シナリオA — それ以外:空のフォルダ、またはノート以外のファイルのみを含むフォルダ(新しいObsidian保管庫の
.obsidian/、CLAUDE.mdなど)。→ ステップ2。
ステップ2 — 質問
一度に1つずつ、この順序で、事前に回答されたものはスキップします。各質問は、その選択肢と、デフォルトがある場合はそれを表示します。
-
言語(
LANG)。選択肢はプラグインに含まれる言語です:lang/<code>.mdとtemplates/<code>/の両方を持つコード(paths.md「Language」):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に直接配置します。有効な値:.または1つのフォルダ名 —/を含まない、.で始まらない、PARAフォルダ名のいずれでもない。 -
タスクバックエンド(
TASKS)。選択肢はtodoist、files、またはmcp。最初のものが推奨されます。それぞれの意味を1行で伝えます:アプリの受信箱とプロジェクト。保管庫内のタスクノート、アプリなし。MCP経由で接続された他のToDoアプリ。次にプローブします — 以下の「バックエンドのプローブ」。プローブに失敗した値は記録されません。 -
エリアモデル(
areas.md)。1つの質問:エリアはグループ化されますか —none、またはグループの名前(例:Work, Home)?その他はすべて導出され、計画に表示され、ユーザーが変更できます:キー グループ化 noneGROUPINGフィールド名。ユーザーが指定しない限り sphere(シードテンプレートのキー)noneGROUPS指定された名前 空 PLACEMENTAreas/<GROUP>/<title>.mdAreas/<title>.mdREVIEW_GROUPINGグループごとに1ブロック、報告するものがないグループは省略 1つのフラットリスト PLACEMENT_CHECKノートの GROUPINGフィールドは、そのノートが属するトップレベルフォルダの名前と一致する必要があるnoneAREA_TASK_PROJECTSGROUPS名1つの名前: areas.review.heading文字列
バックエンドのプローブ
プローブはinbox.listで、選択された値のアダプタに従って実行されます(paths.md)。読み取り専用です。空の受信箱は成功です。カウントのみを出力し、キャプチャは出力しません。
files— プローブするものはありません:アダプタはディスクであり、「Backend missing」は発生しません(tasks.md)。mcp— 今すぐadapters/mcp-generic.mdのステップ1〜6を実行します。ステップ1でツールが見つからない場合はプローブ失敗です。ユーザーが同意し、アプリに受信箱がある場合、ステップ6がプローブです。それ以外の場合、計画はマッピングが未検証であると伝えます。ステップ7〜8は計画と以下の「ステップ5」に属します。- その他の値 — そのアダプタに従って
inbox.listを実行します。アダプタのツールがこのセッションにない場合、または呼び出しが失敗した場合:1行でその旨を伝え(tasks.md「Backend missing」)、値を記録せず、代わりにfilesを提供するか、アプリを接続して/para:initを再度実行するように提案します。プローブが成功しなかったTASKS値を書き込むことは決してなく、後で切り替えることを約束しながら値を記録することも決してありません。
ステップ3 — 計画
作成、マージ、または変更されるすべてのものの1つのリスト。init.plan.heading文字列を先頭に付けます。これはユーザーが編集する提案であり、発表ではありません。編集により新しい計画が作成され、再度表示されます。init.plan.approve文字列で終了し、「はい」が確認されるまでは何も適用されません(または、事前に指定された承認が「事前に指定された回答」で設定された制限内で行われた場合)。
計画では、この順序で示します:
REPO_ROOT(このフォルダ)とPARA_ROOT。- 作成するフォルダ、および存在しない場合のIDジャーナル。
- コピーするテンプレート。それぞれに「Templates」が行う変更を加えます。
シナリオ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には保存するものがないため、これをスキップします。
...