📝 CLIでZettelkastenを管理する「Zettelkasten-cli」をGoで作ってみた🚀  

こんにちは、最近Zettelkasten（ツェッテルカステン）を使った知識管理にハマっている **@kyooooonaka** です！  
手書きのノートやObsidianのようなGUIツールも良いのですが、  
**CLIで軽量かつ柔軟に管理できるツールが欲しい！** と思い、  
Goで **「Zettelkasten-cli (`zk`)」** を開発しました 💻✨  

この記事では、Zettelkasten-cli の **特徴・機能・実装のポイント** を紹介します！  

---

## **📌 なぜ CLI で Zettelkasten を管理したかったのか？**  

🟢 **軽量 & 高速** → GUI不要、ターミナルから即アクセス  
🟢 **カスタマイズ性** → 設定次第でどんなワークフローにも適用可能  
🟢 **スクリプトやGit管理と相性が良い** → コマンド単位で自動化できる  
🟢 **ObsidianやNotionに依存しない** → 独自の知識管理システムを構築できる  

Zettelkasten のメモは **テキストベース（Markdown）** なので、CLIで操作できると最強！  
「じゃあ **自作してみよう！**」ということで開発を開始しました。  

---

## **💡 Zettelkasten-cli (`zk`) の特徴**  

`zk` は、CLI で **メモ・タスク・プロジェクトを管理** できるツールです。  
**「知識を整理し、リンクでつなぎ、タスクと統合する」** という Zettelkasten の原則を基に設計しました。  

✅ **ノートの作成・編集・検索・整理**（Zettelkasten の 3種類のメモに対応）  
✅ **タスクの管理**（メモ内にタスクを作成、進捗管理）  
✅ **プロジェクトとの関連付け**（タスクとノートをプロジェクト単位で管理）  
✅ **ローカル環境でシンプルに動作**（`fzf` との連携で快適検索）  
✅ **S3連携でデバイス間同期も可能**  

---

## **⚙️ インストール方法**  

### **1️⃣ `go install` でインストール（Go 環境がある場合）**  
```sh
go install github.com/nakachan-ing/Zettelkasten-cli/tree/pre-release
```
`$GOBIN` を `PATH` に追加するのを忘れずに。

### **2️⃣ GitHub Releases からバイナリをダウンロード**  
**Mac/Linux**  
```sh
wget https://github.com/nakachan-ing/Zettelkasten-cli/releases/download/v3.0.0/zk-linux
mv zk-mac /usr/local/bin/zk
chmod +x /usr/local/bin/zk
```
**Windows (PowerShell)**  
```sh
Invoke-WebRequest -Uri "https://github.com/nakachan-ing/Zettelkasten-cli/releases/download/v3.0.0/zk.exe" -OutFile "C:\Program Files\zk.exe"
```

---

## **🚀 `zk` の使い方**

### **📝 1. ノートの作成・管理**
```sh
# 一時的なメモ（Fleeting）
zk fleeting new "GoでCLIツールを作る"

# 永続的なメモ（Permanent）
zk permanent new "CLIの設計パターン"

# 文献メモ（Literature）
zk literature new "『Clean Architecture』の要点"

# 全ての Fleeting Notes を表示
zk fleeting list

# タグを指定して検索
zk fleeting list --tag programming

# 期間を指定して表示
zk permanent list --from 2024-01-01 --to 2024-12-31

# キーワード検索
zk literature list --search "マイクロサービス"

# タグで検索
zk search --tag devops

# タイトルで検索
zk search --title "CLI"

# 文脈を含めて検索
zk search --context 5 --interactive
```

### **✅ 2. タスクの管理**
```sh
# ノート内にタスクを追加
zk task add 123 "GoでZettelkastenを実装する"

# タスクの一覧を取得
zk task list

# タスクのステータスを変更
zk task status 123 Done
```

### **📂 3. プロジェクトと関連付け**
```sh
# プロジェクトを作成
zk project new "Go CLI Development"

# ノートをプロジェクトに追加
zk project add 123 "Go CLI Development"
```

### **🗂 4. ノートの整理**
```sh
# ノートを削除（ゴミ箱へ移動）
zk delete 123

# ノートをアーカイブ
zk archive 123

# ノートを復元
zk restore 123
```

### **🔄 5. ノートの同期**
```sh
# ローカルのメモと zettel.json を同期
zk sync
```

---

## **⚙️ `zk` の設定 (`config.yaml`)**
デフォルトの設定ファイルは以下に配置されます。

- **Mac/Linux:** `~/.config/zettelkasten-cli/config.yaml`
- **Windows:** `~\APPDATA\zettelkasten-cli\config.yaml`

**カスタマイズ例：**
```yaml
note_dir: ~/Zettelkasten
editor: vim
zettel_json: ~/.config/zettelkasten-cli/zettel.json
archive_dir: ~/Zettelkasten/archive
sync:
    enable: true
    platform: s3
    bucket: zettlr
    aws_profile: default
```
設定ファイルを開いて編集：
```sh
zk config
```

---

## **🔍 実装のポイント**
### **1️⃣ `fzf` を使ったノート検索**
検索時に `fzf` を活用することで、インタラクティブな検索を実現。
```go
cmd := exec.Command("fzf")
cmd.Stdin = strings.NewReader(listNotes())
cmd.Stdout = os.Stdout
cmd.Run()
```

### **2️⃣ `zettel.json` を利用したメモのメタデータ管理**
全ノートのメタ情報を JSON に保存し、検索を高速化。
```go
type Zettel struct {
    ID       string   `json:"id"`
    Title    string   `json:"title"`
    Tags     []string `json:"tags"`
}
```

---

## **🎯 まとめ**
✅ **CLI で Zettelkasten を管理できる「zk」を開発！**  
✅ **ノートの作成・検索・リンク・タスク管理がすべてCLIで完結！**  
✅ **シンプルな設定でカスタマイズ性が高い！**  
✅ **fzf を活用した快適なノート検索！**  

🚀 **「GUIよりもCLI派」の人におすすめ！**
「試してみたい！」と思った方は、ぜひ [GitHub](https://github.com/yourname/zettelkasten-cli) からダウンロードしてください！ 🎉

---

## **📢 参考**
- [公式GitHub](https://github.com/nakachan-ing/Zettelkasten-cli)
- [Zettelkastenとは？](https://zettelkasten.de/introduction/)

**「CLIで知識を整理したい！」という方、ぜひ `zk` を試してみてください！** 📝🔥