Init
세션이 시작된 폴더를 이 플러그인에 연결된 PARA 볼트로 전환하고, 그 상태를 유지합니다. 두 번째 실행 시 누락된 항목을 채우고 이전 스키마를 마이그레이션합니다. 볼트의 설정을 쓰는 유일한 스킬이며, 설정 없이 실행되는 유일한 스킬입니다.
쓰는 항목
아래 항목만을 쓰며, 그 외에는 아무것도 쓰지 않습니다. 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; TASKS가 mcp일 때만 adapter.md | 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/ | 하나의 프론트매터 키 이름만 변경, 그 외에는 아무것도 변경하지 않음(scenario-c.md) |
| 볼트 계획 파일 (C만) | REPO_ROOT/.claude/local/planning.md | 새로 생성, 이전 도구에서 가져옴(scenario-c.md) |
| 이전 포함 도구 (C만) | REPO_ROOT/.claude/, CLAUDE.md, 이전 템플릿 문서 | macOS 휴지통(Tier 2)으로 이동(scenario-c.md) |
기본 레이어
실행 전에 다음 파일을 읽습니다. 각 파일은 이 스킬의 기본 디렉토리 기준 ../../para/<file>.md에 있습니다(그리고 ../../config.example/, ../../lang/, ../../templates/도 동일한 방식):
../../para/paths.md— 항상: 두 개의 루트, «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을 두 번 연속 실행해도 두 번째에는 아무것도 변경되지 않습니다. - 모든 경로를 따옴표로 묶습니다(
paths.md«Rules»).REPO_ROOT에는 공백이 포함될 수 있습니다. - 언어.
LANG이 선택될 때까지는 사용자가 작성한 언어로 말합니다(아무런 단서가 없으면 영어 — 예:/para:init). 그 이후에는paths.md«Language»에 따라LANG으로 모든 것을 진행하며, 나머지 질문도 포함합니다. 계획 및 보고서 제목은init.*문자열입니다.
사전에 제공된 답변
$ARGUMENTS에는 이미 답변이 포함될 수 있습니다: 언어, PARA_DIR(«the default»는 제안된 값을 의미), 작업 백엔드, Areas 모델, 시나리오 B의 정렬 답변(폴더별 또는 루트 노트별, 중복 이름에 대한), 스냅샷 답변 및 계획 승인. 제공된 모든 답변을 받아들이고 다시 묻지 않습니다. 누락된 것만 묻습니다. 유효한 선택이 아닌 답변은 이유를 설명하고 다시 묻습니다.
사전에 제공된 승인은 다음을 의미합니다: 계획을 보여주고, 기다리지 않고 적용하십시오 — 단, 계획의 모든 줄이 무언가(폴더, 파일, 키, 항목)를 추가하는 경우에만 해당됩니다. 이미 존재하는 것을 변경하거나 교체하는 줄(예: 다른 Obsidian 값, 다른 CLAUDE.md 블록, 마이그레이션의 템플릿, 기존 vault.md의 REPO_ROOT)은 Tier 2(confirm.md)입니다. 이 경우 계획이 표시되고 init은 그때도 '예'를 기다립니다.
시나리오 B의 이동은 두 가지 종류가 있으며, 이것이 사전 승인이 이를 어떻게 다루는지에 대한 유일한 설명입니다. 사용자가 자신의 답변에서 결정한 이동(B3 또는 $ARGUMENTS의 정렬 답변)은 노트의 위치를 변경할 뿐, 내용은 변경하지 않으며, confirm.md는 이동을 Tier 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이 이를 건드리지 않는다고 말합니다. 계획의 «not done»에 다시 언급됩니다..claude/para/에 이 플러그인의 설정 파일(areas.md,adapter.md)만 있고vault.md가 없으면 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«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에 직접 배치합니다. 유효:.또는 하나의 폴더 이름 —/없음,.으로 시작하지 않음, PARA 폴더 이름 자체가 아님. -
작업 백엔드 (
TASKS). 선택 사항은todoist,files또는mcp입니다. 첫 번째가 권장됩니다. 각각이 무엇을 의미하는지 한 줄로 말합니다: 앱의 받은 편지함 및 프로젝트; 볼트 내 작업 노트, 앱 없음; MCP를 통해 연결된 다른 할 일 앱. 그런 다음 프로브 — 아래 «백엔드 프로빙». 프로브에 실패한 값은 절대 기록되지 않습니다. -
Areas 모델 (
areas.md). 한 가지 질문: Areas가 그룹화됩니까 —none또는 그룹 이름 (예: Work, Home)? 그 외 모든 것은 파생되어 계획에 표시되며, 사용자가 변경할 수 있습니다:키 그룹화됨 noneGROUPING필드 이름, 사용자가 이름을 지정하지 않은 경우 sphere(시드 템플릿의 키)noneGROUPS지정된 이름 비어 있음 PLACEMENTAreas/<GROUP>/<title>.mdAreas/<title>.mdREVIEW_GROUPING그룹당 하나의 블록, 보고할 내용이 없는 그룹은 생략 하나의 평면 목록 PLACEMENT_CHECK노트의 GROUPING필드는 해당 노트가 속한 최상위 폴더 이름을 지정해야 함noneAREA_TASK_PROJECTSGROUPS이름하나의 이름: 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를 실행합니다. 어댑터의 도구가 이 세션에 없거나 호출이 실패하면: 한 줄로 말하고(tasks.md«Backend missing»), 값을 기록하지 말고,files를 대신 제공하거나 앱을 연결하고/para:init을 다시 실행하도록 제안합니다. 프로브가 성공하지 못한TASKS값을 절대 기록하지 말고, 나중에 전환하겠다고 약속하면서 하나의 값을 기록하지 마십시오.
3단계 — 계획
생성, 병합 또는 변경될 모든 항목의 하나의 목록이며, init.plan.heading 문자열로 시작됩니다. 이는 사용자가 편집하는 제안이지, 공지가 아닙니다. 편집은 새 계획을 만들고, 다시 표시됩니다. init.plan.approve 문자열로 끝나며, '예'(또는 «사전에 제공된 답변»에서 설정한 한도 내에서 사전에 제공된 승인) 전에는 아무것도 적용되지 않습니다.
계획은 다음 순서로 명명합니다:
REPO_ROOT(이 폴더) 및PARA_ROOT.- 생성할 폴더와, 누락된 경우 ID 저널.
- 복사할 템플릿. 각 템플릿은 «Templates»가 적용하는 변경 사항과 함께 표시됩니다.
시나리오 B에서는 여기에: 이동, 프로젝트,
IGNORE, 보류된 중복 및 끊어질 링크(«시나리오 B», «계획의 B 부분»). - 설정:
vault.md및areas.md의 모든 키와 그 값;mcp의 경우 어댑터 테이블(mcp-generic.md7단계 — 계획의 '예'는 해당 테이블의 '예'입니다). 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는 저장할 것이 없으므로 건너뜁니다.