Files
김경종 72dad72703
Tests / Hermetic test suite (push) Has been cancelled
Tests / Skill frontmatter validation (push) Has been cancelled
add claude-obsidian
2026-05-28 10:57:16 +09:00

143 lines
5.2 KiB
Bash

#!/usr/bin/env bash
# setup-mode.sh — interactive methodology mode selector (v1.8+).
#
# Sets the vault's .vault-meta/mode.json and optionally seeds template
# folders for the chosen mode. Idempotent — safe to re-run to switch modes.
# Existing files are NOT auto-migrated; the new mode only affects future
# filing operations.
#
# Usage:
# bash bin/setup-mode.sh # interactive
# bash bin/setup-mode.sh --mode lyt # non-interactive (CI / scripts)
# bash bin/setup-mode.sh --mode generic --no-seed
# bash bin/setup-mode.sh --check # diagnostics only, no write
#
# Flags:
# --mode MODE Skip the interactive prompt; pick MODE directly.
# Valid: generic | lyt | para | zettelkasten
# --no-seed Skip the optional folder-seeding step
# --check Print current mode + diagnostics; write nothing
#
# Exit codes:
# 0 — success
# 2 — usage error
# 3 — invalid mode string
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
VAULT="$(dirname "$SCRIPT_DIR")"
WM="$VAULT/scripts/wiki-mode.py"
REQUESTED_MODE=""
NO_SEED=false
CHECK_ONLY=false
while [ $# -gt 0 ]; do
case "$1" in
--mode) REQUESTED_MODE="${2:-}"; shift 2 ;;
--no-seed) NO_SEED=true; shift ;;
--check) CHECK_ONLY=true; shift ;;
-h|--help)
sed -n '2,25p' "$0" | sed 's/^# \{0,1\}//'
exit 0
;;
*) echo "ERR: unknown flag: $1" >&2; exit 2 ;;
esac
done
say() { printf '%s\n' "$@"; }
warn() { printf 'WARN: %s\n' "$@" >&2; }
say "═══ wiki-mode setup (v1.8+) ═══"
say "Vault: $VAULT"
say ""
# ── Sanity check ────────────────────────────────────────────────────────────
if [ ! -x "$WM" ]; then
warn "scripts/wiki-mode.py not found or not executable: $WM"
exit 3
fi
# ── Diagnostics ─────────────────────────────────────────────────────────────
CURRENT=$(python3 "$WM" get 2>/dev/null || echo "generic")
say "Current mode: $CURRENT"
if $CHECK_ONLY; then
say ""
python3 "$WM" config
exit 0
fi
# ── Mode selection ──────────────────────────────────────────────────────────
if [ -z "$REQUESTED_MODE" ]; then
say ""
say "Pick a methodology mode for this vault:"
say " 1) generic — v1.7 default; wiki/sources/, entities/, concepts/"
say " 2) lyt — Linking Your Thinking (MOCs + atomic notes flat under wiki/notes/)"
say " 3) para — Projects / Areas / Resources / Archives"
say " 4) zettelkasten — timestamped IDs, flat under wiki/, dense linking"
say ""
printf "Pick [1-4, default 1]: "
read -r choice || choice="1"
case "${choice:-1}" in
1|generic) REQUESTED_MODE="generic" ;;
2|lyt) REQUESTED_MODE="lyt" ;;
3|para) REQUESTED_MODE="para" ;;
4|zettelkasten) REQUESTED_MODE="zettelkasten" ;;
*) warn "invalid choice: $choice"; exit 3 ;;
esac
fi
case "$REQUESTED_MODE" in
generic|lyt|para|zettelkasten) ;;
*) warn "invalid mode: $REQUESTED_MODE (valid: generic|lyt|para|zettelkasten)"; exit 3 ;;
esac
# ── Write the mode ──────────────────────────────────────────────────────────
python3 "$WM" set "$REQUESTED_MODE"
# ── Seed template folders (optional) ────────────────────────────────────────
if ! $NO_SEED; then
if [ -t 0 ]; then
say ""
printf "Seed template folders for %s? [y/N]: " "$REQUESTED_MODE"
read -r seed || seed="n"
else
seed="n"
fi
case "${seed:-n}" in
[yY]|[yY][eE][sS])
case "$REQUESTED_MODE" in
lyt)
mkdir -p "$VAULT/wiki/mocs" "$VAULT/wiki/notes"
say "✓ Created wiki/mocs/ and wiki/notes/"
;;
para)
mkdir -p "$VAULT/wiki/projects/inbox" "$VAULT/wiki/areas" \
"$VAULT/wiki/resources/incoming" "$VAULT/wiki/resources/people" \
"$VAULT/wiki/resources/concepts" "$VAULT/wiki/archives"
say "✓ Created PARA folder structure: projects/{inbox}/, areas/, resources/{incoming,people,concepts}/, archives/"
;;
zettelkasten)
say "✓ Zettelkasten uses no subfolders; all notes file flat under wiki/"
;;
generic)
mkdir -p "$VAULT/wiki/sources" "$VAULT/wiki/entities" \
"$VAULT/wiki/concepts" "$VAULT/wiki/sessions"
say "✓ Created generic folders: sources/, entities/, concepts/, sessions/"
;;
esac
;;
*) say "(skipped folder seeding)" ;;
esac
fi
say ""
say "═══ Done. Mode is: $REQUESTED_MODE ═══"
say ""
say "Other skills (wiki-ingest, save, autoresearch) will consult this mode automatically."
say "Existing files are NOT auto-migrated. New files will follow the new mode's conventions."
say ""
say "To switch modes later: re-run \`bash bin/setup-mode.sh\`."