#!/usr/bin/env bash # kb-init.sh —— 幂等建项目骨架 # 用法: # bash tools/kb-init.sh <代号> # 建 projects/<代号>/ 骨架 + _index.md(type: project, status: seed) # bash tools/kb-init.sh --stats # 打印源计数(更新 meta/stats.md 参考值) # 约束: <代号> 用英文/拼音,禁纯中文目录名(Claude Code 会把中文编码为 - 导致碰撞)。 set -euo pipefail # 定位库根(本脚本在 tools/ 下) ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" usage() { grep '^#' "$0" | sed 's/^# \{0,1\}//'; exit "${1:-0}"; } # ── --stats: 红线观察点 ── if [[ "${1:-}" == "--stats" ]]; then proj=$(find "$ROOT/projects" -mindepth 1 -maxdepth 1 -type d ! -name '_example' 2>/dev/null | wc -l | tr -d ' ') pages=$(grep -rl '^type:' "$ROOT/projects" "$ROOT/entities" "$ROOT/concepts" "$ROOT/questions" 2>/dev/null | wc -l | tr -d ' ') srcs=$(grep -rh '^source_link:' "$ROOT/projects" 2>/dev/null | sort -u | wc -l | tr -d ' ') echo "项目数: $proj | 知识页数: $pages | 外部源数(去重): $srcs" exit 0 fi CODE="${1:-}" [[ -z "$CODE" || "$CODE" == "-h" || "$CODE" == "--help" ]] && usage 0 # 中文目录名保护 if echo "$CODE" | LC_ALL=C grep -q '[^ -~]'; then echo "错误: 代号 '$CODE' 含非 ASCII 字符。请用英文/拼音(禁纯中文目录名)。" >&2 exit 1 fi PDIR="$ROOT/projects/$CODE" if [[ -d "$PDIR" ]]; then echo "项目已存在: projects/$CODE (幂等:不覆盖,仅补齐缺失子目录)" fi mkdir -p "$PDIR"/{docs,decisions,conversations,assets} for sub in docs assets; do [[ -f "$PDIR/$sub/.gitkeep" ]] || touch "$PDIR/$sub/.gitkeep"; done INDEX="$PDIR/_index.md" if [[ -f "$INDEX" ]]; then echo "保留已有 _index.md(幂等): projects/$CODE/_index.md" else TODAY="$(date +%F)" cat > "$INDEX" <