e9d6d78032
- 修崩潰:bash 3.2 + set -u 展開空陣列會炸 unbound variable;移除多餘
${SKIPPED[*]} no-op;多位元組字串旁變數改用 ${VAR} 防 curl|bash 串流切斷
- install/update 訊息依 locale 雙語,預設英文(curl|bash 常 LANG=C),zh_TW 切繁中
- 寫進 CLAUDE.md 的 raw source 宣告依 locale 只寫一種語言(不撐爆 context)
- 修措辭:一般開發案不再顯示誤導的「偵測到 vault 類型:docs」
- 新增 README.en.md(繁中↔English 切換)
- gitignore dogfooding 自裝產物(CLAUDE.md/docs 子目錄/.claude/settings*)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
237 lines
13 KiB
Markdown
237 lines
13 KiB
Markdown
# system-dev-template
|
|
|
|
[繁體中文](README.md) | **English**
|
|
|
|
> Turn Claude Code from a "sprinting engineer" into a "disciplined engineer."
|
|
|
|
CC is an excellent engineer, but not a good project manager. It sprints to get work done — great for small projects, but on large ones it tends to:
|
|
- **Fix one thing, break another**: no global view, no SDD constraints
|
|
- **Let docs rot**: its built-in memory is unreliable, knowledge vanishes with the conversation, and it loves writing docs it never reads back — scattering them everywhere
|
|
|
|
This template solves both problems with two systems:
|
|
|
|
| System | What it solves | Core mechanism |
|
|
|--------|----------------|----------------|
|
|
| **SDD system** | Global view, think before doing | No code change without a `design.md` + `tasks.md` first |
|
|
| **LLM Wiki** | Memory that compounds, ordered docs | Two spaces: raw source (human-written) + `.claude/wiki/` (AI-curated) |
|
|
|
|
> **Not just code projects, not just Claude Code.** LLM Wiki now also recognizes **Logseq / Obsidian vaults** —
|
|
> at install time it auto-detects which kind of folder you're in, writes the matching "raw source" into `CLAUDE.md`,
|
|
> reads only from there when curating the wiki, and **never moves your vault structure**
|
|
> (see "Not just code — Logseq / Obsidian vaults too" below).
|
|
> The curator isn't limited to Claude Code either — **claude.ai's Cowork** can use the same rules to scan and
|
|
> curate every wiki on your machine (see "Cowork can curate wikis too" below).
|
|
|
|
- SDD: already popular. The most thorough implementation is probably Amazon Kiro, but it's hard to pay for in Taiwan. This approach beats any flashier method — it forces CC not to do whatever it pleases.
|
|
- LLM Wiki: the latest RAG idea from the legendary Karpathy. It's a *pre-compile* approach — better and less fiddly than the embedding-and-chunk-into-vectors method your company bought, and far easier to run.
|
|
|
|
---
|
|
|
|
## Two ways to use it
|
|
|
|
### Option 1: New project
|
|
|
|
```bash
|
|
git clone https://github.com/uncle6me-web/system-dev-template
|
|
cp -r system-dev-template/template/. your-new-project/
|
|
cd your-new-project
|
|
```
|
|
|
|
Then in a CC conversation:
|
|
```
|
|
/wiki-init
|
|
```
|
|
|
|
### Option 2: Existing project (retrofit)
|
|
|
|
```bash
|
|
cd your-existing-project
|
|
curl -sSL https://raw.githubusercontent.com/uncle6me-web/system-dev-template/main/scripts/install.sh | bash
|
|
```
|
|
|
|
The script only creates what's missing — **it never touches files you already have**.
|
|
|
|
**Just one piece?** The two systems install separately (sometimes you only need the wiki, not SDD):
|
|
|
|
```bash
|
|
# Download, then run with a flag
|
|
curl -sSL .../install.sh -o install.sh && bash install.sh --wiki # LLM Wiki only
|
|
bash install.sh --sdd # SDD only
|
|
bash install.sh --all # both (default)
|
|
```
|
|
|
|
When run directly in a terminal (with a tty), running it without a flag **asks interactively** which piece to install — friendliest for non-engineers. With no tty, `curl | bash` safely defaults to `--all`. The hooks in `settings.json` are assembled automatically based on the modules you choose.
|
|
|
|
After installing, in a CC conversation:
|
|
```
|
|
/wiki-init
|
|
```
|
|
|
|
CC will scan your existing docs, build the wiki, and tidy up the docs structure.
|
|
|
|
> CC loves writing docs and scattering them everywhere; the bigger and older a project gets, the messier its folders — yet it's afraid to move anything. With the folder conventions written down, it can file everything for you in one pass.
|
|
> LLM Wiki won't touch your original files, but it builds a separate wiki and fixes your entry point — which is `CLAUDE.md`. So even though things get reorganized, your documents won't disappear.
|
|
|
|
---
|
|
|
|
## 🔄 Already on an older version? Update with one line
|
|
|
|
Heard there are new features and want the latest? Just run this:
|
|
|
|
```bash
|
|
cd your-project
|
|
curl -sSL https://raw.githubusercontent.com/uncle6me-web/system-dev-template/main/scripts/update.sh | bash
|
|
```
|
|
|
|
It first compares your version with the latest, tells you **which new features you'd gain**, and then:
|
|
|
|
| Action | Target |
|
|
|--------|--------|
|
|
| 🆕 **Add** new features (hooks / commands / templates the old version lacked) | Template files |
|
|
| ⬆️ **Update** template logic (hooks, commands, `TEMPLATE-*` swapped for new versions) | Template files |
|
|
| 🔒 **Never touch** your content and settings | `wiki/status.md`, `mistakes.md`, `decisions-summary.md`, `.wikiignore`, `settings.json`, `CLAUDE.md` |
|
|
|
|
> **Why use curl the first time?** Old installs don't have `update.sh` locally yet, so the first run has to fetch it from the remote.
|
|
> After running, it installs itself to `scripts/update.sh`, so **next time just run** `bash scripts/update.sh` — no more curl.
|
|
|
|
Updates only touch "installed modules" (wiki installed → wiki updated; SDD installed → SDD updated), detected automatically.
|
|
If `settings.json` is missing a hook that only the new version has, it won't change your settings for you — but it will **list them at the end** as a reminder to add them manually (it never edits your settings without asking).
|
|
|
|
📜 Want to know what changed each time and which version you're on? See the **[CHANGELOG](CHANGELOG.md)**.
|
|
|
|
---
|
|
|
|
## Not just code — Logseq / Obsidian vaults too
|
|
|
|
LLM Wiki originally assumed "raw source lives in `docs/`", but note vaults like Logseq and Obsidian have their own directory conventions.
|
|
Now `install.sh` **auto-detects the folder type** before creating `CLAUDE.md`, and writes the matching "raw source" into `CLAUDE.md`:
|
|
|
|
| Detected | Type | Raw source |
|
|
|----------|------|------------|
|
|
| `logseq/` folder | Logseq | `pages/`, `journals/` |
|
|
| `.obsidian/` folder | Obsidian | all `.md` under the root |
|
|
| Neither | Regular project | `docs/` (original behavior) |
|
|
|
|
The declaration written into `CLAUDE.md` is **an instruction for the AI** — it tells the curator "here's where the raw source is, read only from there when curating the wiki",
|
|
and for vaults it **explicitly forbids moving, renaming, or re-classifying `.md` files**; curation output always goes only into `.claude/wiki/`.
|
|
This way, even with a note vault, the original structure stays intact and your notes never become unreadable.
|
|
|
|
> **Already have a `CLAUDE.md`?** It's never overwritten (the "don't touch what exists" principle). Instead, the declaration you should add is **listed at the end** of the install for you to paste manually.
|
|
|
|
---
|
|
|
|
## Cowork can curate wikis too
|
|
|
|
The wiki curator is no longer limited to Claude Code in the terminal — **claude.ai's Cowork** can do it too.
|
|
`docs/SKILL.md` provides a skill for Cowork (`wiki-cowork-scan`) that **shares the same rules** as CC's `/wiki-init` and `/wiki-capture`:
|
|
|
|
- Scans every folder under `~/Documents` that has system-dev-template installed (i.e. has a `.claude/wiki/`)
|
|
- Uses the **same detection logic as `install.sh`** to decide whether each folder is a regular project / Logseq / Obsidian
|
|
- Reads only the raw source and only appends to `.claude/wiki/` (no overwrite, no delete); **never touches** raw source, `CLAUDE.md`, `logseq/`, `.obsidian/`, `assets/`
|
|
|
|
**CC and Cowork share an identical output format**, so whatever one curates, the other sees and skips or supplements — no duplication, no overwriting.
|
|
Great for a scheduled Cowork run that keeps every wiki on your machine up to date automatically.
|
|
|
|
> To use it: give `docs/SKILL.md` to your Cowork as a skill reference, then tell it "curate the wiki".
|
|
|
|
---
|
|
|
|
## Directory guide
|
|
|
|
```
|
|
system-dev-template/
|
|
├── template/ ← skeleton copied into new projects
|
|
│ ├── CLAUDE.md ← fill-in-the-blanks navigation sign
|
|
│ ├── docs/ ← docs structure (six-layer taxonomy)
|
|
│ └── .claude/
|
|
│ ├── wiki/ ← CC's memory space (incl. .wikiignore for sensitive exclusions)
|
|
│ ├── commands/ ← slash commands
|
|
│ ├── hooks/ ← hard interceptors (recall + SDD protocol + wiki secret scan)
|
|
│ └── settings.json ← wires up hooks (install.sh assembles by module)
|
|
│
|
|
├── skills/
|
|
│ └── llm-wiki/ ← copy into Legacy-Workspace/.claude/skills/
|
|
│
|
|
├── scripts/
|
|
│ ├── install.sh ← retrofit script for existing projects
|
|
│ └── update.sh ← one-line update for old versions (swaps templates only, never your data)
|
|
│
|
|
└── docs/ ← this repo's own documentation
|
|
├── why.md ← design philosophy
|
|
├── wishlist.md ← pending features and completed records
|
|
└── SKILL.md ← wiki-curation skill for claude.ai Cowork (wiki-cowork-scan)
|
|
```
|
|
|
|
---
|
|
|
|
## Slash Commands
|
|
|
|
Available in any CC conversation after install:
|
|
|
|
| Command | What it does |
|
|
|---------|--------------|
|
|
| `/wiki-init` | Initialize the wiki (new project or retrofit) |
|
|
| `/wiki-recall` | At session start, manually resume (fallback when the hook doesn't fire) |
|
|
| `/wiki-capture` | Save this conversation's conclusions into the wiki |
|
|
| `/wiki-update` | At session end, update `status.md` |
|
|
| `/sdd-check` | Check whether the current task has a matching SDD |
|
|
| `/issue-handle` | Handle GitHub issues (read back from your own repo / cross-repo posting asks first / no auto-polling) |
|
|
|
|
The naming loop: init (create) → update (save, end of session) ↔ recall (resume, start of session) → capture (save conclusions anytime).
|
|
|
|
---
|
|
|
|
## Hooks (soft norms → hard interception)
|
|
|
|
Norms are no longer just soft reminders in `CLAUDE.md`; there's a backstop:
|
|
|
|
| Hook | Role |
|
|
|------|------|
|
|
| `session-start-recall.sh` | Auto-injects the key points of `status` at session start — doesn't rely on CC remembering |
|
|
| `sdd-guard.sh` | Touching a code file with no SDD → block (exit 2); the automated version of `/sdd-check` |
|
|
| `wiki-secret-scan.sh` | A sensitive value about to be written into `.claude/wiki/` → block (exit 2); a mechanical backstop for passwords/keys/PII |
|
|
| `pre-write-guard.sh` | Skeleton for project-specific bans (disabled by default; takes effect once you fill in a pattern) |
|
|
|
|
---
|
|
|
|
## Wiki secret protection (content you don't want indexed)
|
|
|
|
Like `.gitignore`, it keeps content you don't want in the wiki (passwords, keys, PII) from being indexed. Three layers:
|
|
|
|
| Layer | Mechanism | What it blocks | Nature |
|
|
|-------|-----------|----------------|--------|
|
|
| **L1** | `.claude/wiki/.wikiignore` (glob) | An entire sensitive file is not indexed | Protocol (CC complies) |
|
|
| **L2** | Inline markers `<!-- wiki:ignore -->`…`<!-- wiki:end -->` | A section within a file is not indexed | Protocol (CC complies) |
|
|
| **L3** | `wiki-secret-scan.sh` hook | A sensitive value actually being written into the wiki → exit 2 blocks it | **Hard interception (mechanical detection)** |
|
|
|
|
L1/L2 are markers you set proactively; L3 is the automatic backstop — if CC misses the first two, the moment a secret is written into the wiki it's caught by regex (password assignments, PEM private keys, AWS/GitHub/Slack keys, JWTs, connection-string credentials, national IDs, credit-card numbers).
|
|
|
|
> Honest limits: L1/L2 rely on CC's self-discipline; L3 relies on pattern matching (with false positives/negatives).
|
|
> This is a mechanism to reduce **accidental** leaks, not a vault — real secrets shouldn't be in version control in the first place.
|
|
> On a false positive: add `wiki-secret-ok` at the end of the line to allow it; for a whole sensitive file, add it to `.wikiignore`.
|
|
|
|
> Honest limits: the hook blocks syntactically obvious violations (writing directly to a file); it can't catch detours hidden in helpers / bash.
|
|
> Its value is "trying to skip it gets caught + leaves an auditable trace", not technical tamper-proofing — the docs (mindset) and the hook (backstop) are both indispensable.
|
|
|
|
---
|
|
|
|
## Design principles
|
|
|
|
- **Additive, not destructive**: when retrofitting an existing project, your existing norms stay; the wiki system layers on top
|
|
- **Structure is protocol**: CC and you share the same taxonomy, no need to re-explain every time
|
|
- **`CLAUDE.md` doesn't grow**: past 100 lines is an architecture problem, not a reason to add more content
|
|
- **Capture conclusions on the spot**: after a discussion, use `/wiki-capture` so knowledge stops vanishing
|
|
|
|
---
|
|
|
|
## Acknowledgments
|
|
|
|
This template stands on the shoulders of giants:
|
|
|
|
- **[Andrej Karpathy](https://gist.github.com/karpathy)** — originator of the LLM Wiki concept. This template's two-space memory system comes directly from his April 2026 idea: using an LLM to "pre-compile" knowledge into interlinked markdown, rather than re-running embedding retrieval on every query. One line of his captures the spirit: *"Obsidian is the IDE, the LLM is the programmer, the wiki is the codebase."*
|
|
- Further reading: [The Andrej Karpathy LLM Wiki Idea](https://reliabilitywhisperer.substack.com/p/the-andrej-karpathy-llm-wiki-idea), [Beyond RAG (Level Up Coding)](https://levelup.gitconnected.com/beyond-rag-how-andrej-karpathys-llm-wiki-pattern-builds-knowledge-that-actually-compounds-31a08528665e)
|
|
|
|
- **[Amazon Kiro](https://aws.amazon.com/documentation-overview/kiro/)** — this template's SDD (Spec-Driven Development) approach is learned from Kiro. It takes "have a structured spec before you start" to the furthest extreme; paying for it is inconvenient in Taiwan, but its methodology deserves respect and borrowing.
|
|
|
|
- **Claude (Claude Code / Anthropic)** — this template's hooks, secret protection, modular install, and this very README were all pair-developed with Claude. The template itself exists to turn Claude Code "from a sprinting engineer into a disciplined engineer" — it's both the tool and a co-author.
|