Init
Convierte la carpeta en la que se inició la sesión en un vault PARA conectado a este plugin, y lo mantiene así: una segunda ejecución completa lo que falta y migra un esquema anterior. Es la única habilidad que escribe la configuración del vault, y la única que se ejecuta sin ella.
Lo que escribe
Todo lo siguiente y nada más. REPO_ROOT, PARA_DIR, PARA_ROOT según los define paths.md.
| Qué | Dónde | Cómo |
|---|---|---|
| las carpetas PARA | PARA_ROOT/ + Projects, Areas, Resources, Archive, Inbox, Templates | se crean si faltan |
| las plantillas de notas | PARA_ROOT/Templates/ | se siembran desde el plugin, solo si faltan («Templates») |
| el diario de IDs | PARA_ROOT/Archive/.removed-ids | solo su encabezado, solo si falta (project-id.md «El diario») |
| configuración del vault | REPO_ROOT/.claude/para/vault.md, areas.md; adapter.md solo cuando TASKS es mcp | desde config.example/; nunca se sobrescribe |
| el bloque del plugin | REPO_ROOT/CLAUDE.md | solo entre los marcadores («CLAUDE.md») |
| los permisos de las habilidades | REPO_ROOT/.claude/settings.json | se fusiona, nunca se reemplaza («Settings») |
| configuración de Obsidian | REPO_ROOT/.obsidian/app.json, templates.json | se fusiona («Obsidian») |
| las notas y carpetas del usuario (solo B) | desde donde están hasta las carpetas PARA | se mueven, nunca se editan — solo los movimientos que enumera el plan aprobado («Escenario B») |
| resúmenes de proyectos (solo B) | PARA_ROOT/Projects/PROJ-xxxx <título>/ | nuevos, para una carpeta que el usuario llamó proyecto («Escenario B») |
| la clave de emparejamiento en resúmenes (solo C) | PARA_ROOT/Projects/, PARA_ROOT/Archive/ | solo se renombra un campo de metadatos, nada más (scenario-c.md) |
| el archivo de planificación del vault (solo C) | REPO_ROOT/.claude/local/planning.md | nuevo, extraído de las herramientas antiguas (scenario-c.md) |
| las herramientas antiguas integradas (solo C) | REPO_ROOT/.claude/, CLAUDE.md, la documentación de la plantilla anterior | a la Papelera de macOS, Nivel 2 (scenario-c.md) |
Capa base
Leer antes de actuar, cada uno como ../../para/<archivo>.md relativo al directorio base de esta habilidad
(y ../../config.example/, ../../lang/, ../../templates/ de la misma manera):
../../para/paths.md— siempre: las dos raíces, «Idioma», el adaptador paraTASKS. Todo lo queinitescribe debe coincidir con él.../../para/tasks.md— las operaciones, «Emparejamiento», «Backend faltante»../../para/adapters/mcp-generic.md— cuandoTASKSesmcp; el adaptador para cualquier otro valor lo nombrapaths.md../../para/note-format.md— el esquema de metadatos que deben coincidir las plantillas../../para/migrations.md— elSCHEMAactual del plugin y cómo se ejecuta una migración../../para/claude-md-block.md— el bloque paraCLAUDE.md../../para/confirm.md— los niveles; el plan a continuación es cómoinitlos cumple../../para/project-id.md— «El diario»: el encabezado del diario de IDs (Paso 5.1)../../config.example/vault.md,areas.md,adapter.md— la forma de la configuración- solo escenario B:
../../para/move.md(cómo un movimiento mantiene enlaces),project-id.md(emisión de un ID),../../para/thresholds.md(el umbral de obsolescencia de áreas y «El límite de mtime»),paths.md«IGNORAR» ../../lang/<LANG>.mduna vez que se conoceLANG: las cadenasinit.*- solo escenario C, y los restos de C en una re-ejecución:
scenario-c.mden el directorio base de esta habilidad — todo sobre el diseño antiguo; también../../para/move.md(la Papelera)
SKILL_DIR a continuación es el directorio base de esta habilidad, según lo anuncia el arnés.
Reglas para toda la ejecución
REPO_ROOTes el directorio de trabajo de la sesión, como ruta absoluta (pwd). Este es el único lugar donde el plugin toma una raíz del directorio de trabajo:inites lo que lo escribe para todas las demás habilidades. El plan dice qué carpeta es, para que una sesión iniciada en el lugar equivocado se detecte antes de escribir nada.- No se escribe nada antes del «sí» del plan. Inspeccionar, preguntar y sondear el backend de tareas son solo lectura.
vault.mdse escribe al final. Es lo que marca un vault como configurado; una ejecución interrumpida no dejavault.mdy la siguiente ejecución comienza de nuevo, encontrando el trabajo ya realizado.- Cada paso es idempotente: crear si falta, fusionar si existe, nunca sobrescribir.
Ejecutar
initdos veces seguidas no cambia nada la segunda vez. - Citar cada ruta (
paths.md«Reglas»).REPO_ROOTpuede contener espacios. - Idioma. Hasta que se elija
LANG, hablar el idioma en el que escribió el usuario (inglés cuando no hay nada por lo que guiarse — un/para:initsimple). A partir de entonces, todo está enLANGsegúnpaths.md«Idioma», incluidas las preguntas restantes; los encabezados del plan y del informe son las cadenasinit.*.
Respuestas proporcionadas de antemano
$ARGUMENTS puede contener respuestas: el idioma, PARA_DIR («el predeterminado» significa
el propuesto), el backend de tareas, el modelo de Áreas, en el escenario B las respuestas de ordenación
(por carpeta o nota raíz, y para los nombres duplicados), la respuesta de instantánea y una
aprobación del plan. Tomar cada respuesta dada y no preguntarla de nuevo; preguntar solo
lo que falta. Una respuesta que no es una opción válida se pregunta de nuevo, explicando por qué.
Una aprobación dada de antemano significa: mostrar el plan, luego aplicarlo sin esperar —
pero solo mientras cada línea del plan agregue algo (una carpeta, un archivo, una clave, una
entrada). Una línea que cambia o reemplaza algo que ya existe (un valor de Obsidian diferente,
un bloque CLAUDE.md diferente, una plantilla en una migración, REPO_ROOT en un vault.md
existente) es Nivel 2 (confirm.md): el plan se muestra y init espera un «sí» incluso entonces.
Los movimientos del escenario B son de dos tipos, y esta es la única declaración de cómo una
aprobación previa los cubre. Un movimiento que el usuario decidió en sus propias respuestas (B3, o las
respuestas de ordenación en $ARGUMENTS) cambia dónde está una nota, nunca lo que dice, y
confirm.md coloca el movimiento en el Nivel 1: el «sí» del plan, dado entonces o de antemano, lo cubre.
Un movimiento decidido solo por las reglas (B2: a Archive/ o Resources/) es el propio juicio de
init sobre las notas del usuario: necesita un «sí» en vivo al plan que lo muestra, incluso cuando
se dio una aprobación de antemano. De cualquier manera, la instantánea se ofrece antes de los
movimientos (Paso 4). Una pregunta de ordenación respondida de antemano no se hace; una que queda sin
responder se hace, y no se aplica nada antes de su respuesta, aprobación o no.
Paso 1 — Inspeccionar
Solo lectura. Averiguar qué es la carpeta y nombrar el escenario.
REPO_ROOT=$(pwd)
ls -A "$REPO_ROOT"
ls "$REPO_ROOT/.claude" "$REPO_ROOT/.claude/para" "$REPO_ROOT/.claude/skills" 2>/dev/null
# el diseño antiguo integrado (escenario C): su carpeta de configuración o su capa base
ls -d "$REPO_ROOT/.claude/para/local" "$REPO_ROOT/.claude/para/paths.md" 2>/dev/null # diseño-antiguo
# carpetas de habilidades nombradas como las habilidades antiguas integradas: se informan, nunca C por sí solas
for s in inbox projects areas resources archive remove vault-lint; do
[ -f "$REPO_ROOT/.claude/skills/$s/SKILL.md" ] && echo "habilidad antigua: $s"; done
# notas: cada .md que no esté debajo de una entrada con punto de REPO_ROOT, excepto los archivos propios del repositorio
# y las plantillas (las entradas con punto se podan en relación con REPO_ROOT, por lo que un vault que en sí mismo
# vive debajo de un directorio con punto aún se ve)
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
# un vault por encima de esta carpeta: init se inició en una subcarpeta
d=$(dirname "$REPO_ROOT")
while [ "$d" != "/" ] && [ "$d" != "$HOME" ]; do
{ [ -e "$d/.claude/para/vault.md" ] || [ -d "$d/.obsidian" ]; } && echo "vault por encima: $d"
d=$(dirname "$d")
done
Detenerse antes de cualquier otra cosa cuando:
REPO_ROOTes$HOMEo/— no es un vault; decirlo.- se encontró un vault por encima — decir «ejecuta
/para:initdesde<esa carpeta>» y detenerse; nunca configurar un vault dentro de otro.
Luego decidir, en este orden, y decir qué se encontró y qué caso es:
- Configurar —
.claude/para/vault.mdexiste → «Re-ejecución y migración» a continuación. - Escenario C — las herramientas antiguas integradas, reconocidas por su antigua capa base o configuración
solamente (la línea
diseño-antiguoanterior): su carpeta de configuraciónlocal/o su archivo de capa basepaths.mddentro de.claude/para/. → «Escenario C». Una carpeta de habilidad nombrada como una de las habilidades antiguas (las líneashabilidad antigua:) sin ninguna de ellas no es C: continuar con B o A según las reglas a continuación. Decir qué carpeta se encontró y queinitla deja en paz; el «no hecho» del plan la nombra de nuevo. Un.claude/para/que solo contiene los archivos de configuración de este plugin (areas.md,adapter.md) y ningúnvault.mdno es C: es una primera ejecución deinitque fue interrumpida o rechazada antes devault.md. Continuar con B o A a continuación como si no estuviera allí, excepto que esos archivos son la configuración del vault — nunca sobrescritos — y una pregunta que ya responden (pregunta 4 paraareas.md) no se pregunta de nuevo. La ejecución completa el resto. - Escenario B — se encontraron notas (el
findanterior imprimió algo). → «Escenario B». - Escenario A — de lo contrario: una carpeta vacía, o una que contiene solo archivos que no son notas
(un
.obsidian/de un nuevo vault de Obsidian, unCLAUDE.md). → Paso 2.
Paso 2 — Preguntas
Una a la vez, en este orden, saltándose todas las respondidas de antemano. Cada pregunta muestra sus opciones y, cuando hay una, el valor predeterminado.
-
Idioma (
LANG). Las opciones son los idiomas que incluye el plugin: un código con tantolang/<código>.mdcomotemplates/<código>/(paths.md«Idioma»):for f in "$SKILL_DIR"/../../lang/*.md; do l=$(basename "$f" .md) [ -d "$SKILL_DIR/../../templates/$l" ] && echo "$l"; done -
Carpeta PARA (
PARA_DIR). Valor predeterminado según el escenario: A —PARA, una subcarpeta, para que las herramientas y las notas estén separadas; B —., para que las carpetas PARA estén junto a las carpetas del usuario, excepto según lo que dice «Escenario B»..coloca las carpetas PARA directamente enREPO_ROOT. Válido:.o un nombre de carpeta — sin/, que no comience con., que no sea uno de los nombres de las carpetas PARA. -
Backend de tareas (
TASKS). Las opciones sontodoist,filesomcp; la primera es recomendada. Decir en una línea qué significa cada una: la bandeja de entrada y los proyectos de una app; notas de tareas en el vault, sin app; cualquier otra app de tareas conectada a través de MCP. Luego sondear — «Sondeo del backend» a continuación. Un valor cuyo sondeo falló nunca se registra. -
Modelo de Áreas (
areas.md). Una pregunta: ¿las Áreas están agrupadas —none, o los nombres de los grupos (por ejemplo Trabajo, Hogar)? Todo lo demás se deriva y se muestra en el plan, donde el usuario puede cambiarlo:Clave Agrupado noneGROUPINGel nombre del campo, spherea menos que el usuario haya nombrado uno (la clave de las plantillas semilla)noneGROUPSlos nombres dados vacío PLACEMENTAreas/<GROUP>/<título>.mdAreas/<título>.mdREVIEW_GROUPINGun bloque por grupo, los grupos sin nada que informar se omiten una lista plana PLACEMENT_CHECKel campo GROUPINGde una nota debe nombrar la carpeta de nivel superior bajo la que se encuentranoneAREA_TASK_PROJECTSlos nombres de GROUPSun nombre: la cadena areas.review.heading
Sondeo del backend
El sondeo es inbox.list, ejecutado según el adaptador para el valor elegido (paths.md). Es
solo lectura; una bandeja de entrada vacía es un éxito. Imprimir solo el recuento, nunca las capturas.
files— nada que sondear: el adaptador es el disco, y «Backend faltante» no puede ocurrir (tasks.md).mcp— ejecutar los pasos 1–6 deadapters/mcp-generic.mdahora. El paso 1 que no encuentra herramientas es un sondeo fallido. El paso 6 es el sondeo cuando el usuario acepta y la app tiene una bandeja de entrada; de lo contrario, el plan dice que el mapeo no está verificado. Los pasos 7–8 pertenecen al plan y al «Paso 5» a continuación.- Cualquier otro valor — ejecutar
inbox.listsegún su adaptador. Si las herramientas del adaptador no están en esta sesión, o la llamada falla: decirlo en una línea (tasks.md«Backend faltante»), no registrar el valor, y ofrecerfilesen su lugar — o conectar la app y ejecutar/para:initde nuevo. Nunca escribir un valor deTASKScuyo sondeo no tuvo éxito, y nunca registrar un valor mientras se promete cambiar más tarde.
Paso 3 — El plan
Una lista de todo lo que se creará, fusionará o cambiará, encabezada por la
cadena init.plan.heading. Es una propuesta que el usuario edita, no un anuncio: una
edición genera un nuevo plan, que se muestra de nuevo. Termina con la cadena init.plan.approve, y
no se aplica nada antes de un «sí» (o la aprobación dada de antemano, dentro del límite que
establece «Respuestas proporcionadas de antemano»).
El plan nombra, en este orden:
REPO_ROOT(esta carpeta) yPARA_ROOT.- Las carpetas a crear, y el diario de IDs cuando falte.
- Las plantillas a copiar, cada una con los cambios que «Templates» le hace.
En el escenario B, aquí: los movimientos, los proyectos,
IGNORE, los duplicados retenidos y los enlaces que se romperán («Escenario B», «La parte B del plan»). - La configuración: cada clave de
vault.mdyareas.mdcon su valor; paramcp, la tabla del adaptador (mcp-generic.mdpaso 7 — el «sí» del plan es el «sí» de esa tabla). CLAUDE.md,.claude/settings.json,.obsidian/app.json,.obsidian/templates.json: lo que se agrega a cada uno. Cada valor existente que cambiaría es una línea propia, que muestra el valor antiguo y el nuevo.- El resultado del sondeo: el backend respondió (con el recuento de la bandeja de entrada), o
files. - Lo que no se hará, y por qué (una plantilla ya presente, un valor conservado).
Paso 4 — Instantánea (solo B y C)
Antes de aplicar un plan que toca un vault existente, ofrecer una copia zip a su lado —
siempre se pregunta, el rechazo se acepta, una respuesta dada de antemano se toma. Se pregunta en el mismo
mensaje que la aprobación del plan (la cadena init.snapshot), para que el usuario responda una vez:
zip_path="$(dirname "$REPO_ROOT")/$(basename "$REPO_ROOT")-backup-$(date +%Y-%m-%d).zip"
ditto -c -k --keepParent "$REPO_ROOT" "$zip_path"
El escenario A no tiene nada que guardar y se salta este paso.