326 lines
14 KiB
Markdown
326 lines
14 KiB
Markdown
# Claude Code – Vault Orientation
|
||
|
||
## Who I Am
|
||
I'm Claude Code, acting as Vadym's AI partner for all Oliver Agency projects.
|
||
This vault is my persistent memory. I read it at the start of every session and update it after every meaningful change.
|
||
|
||
## Model for Logging
|
||
**Always use `claude-haiku-4-5-20251001` (Haiku)** for all Obsidian logging and note-writing operations. This keeps costs low and responses fast for pure logging tasks.
|
||
|
||
## Vault Structure
|
||
```
|
||
VadymSamoilenko/
|
||
├── raw/ ← YOUR inbox — dump source material here (articles, PDFs, clips)
|
||
│ └── _processed/ ← Compiled files move here (don't delete)
|
||
├── wiki/ ← LLM's domain — Karpathy-style knowledge base (see Wiki System below)
|
||
│ ├── _master-index.md ← LLM's table of contents — read this first for any query
|
||
│ ├── log.md ← Append-only build log
|
||
│ ├── concepts/ ← Atomic knowledge articles (+ _index.md)
|
||
│ ├── connections/ ← Cross-cutting insights (+ _index.md)
|
||
│ └── qa/ ← Filed query answers (+ _index.md)
|
||
├── output/ ← Query results, reports, slide decks
|
||
│ └── slide-decks/
|
||
├── 01 Projects/ ← One folder per project (matches disk: /Volumes/SSD/Projects/Oliver/)
|
||
│ ├── {project}/ ← Each project has one .md note
|
||
│ ├── Dashboard.md ← Live Dataview dashboard
|
||
│ ├── Projects.base ← Obsidian Bases view
|
||
│ └── Projects Index.md
|
||
├── 02 Areas/
|
||
│ ├── Pending Commands.md ← ⚠️ IMPORTANT: track all server commands given to Vadym
|
||
│ └── Work Tasks.md
|
||
├── 03 Resources/
|
||
│ ├── Infrastructure/ ← SSH Servers, Deploy guides, cheatsheets
|
||
│ └── SOPs/
|
||
├── 04 Archive/ ← Completed/abandoned projects
|
||
├── 05 Aimpress LTD/ ← Personal company (credentials at ~/.secrets/)
|
||
├── 99 Daily/ ← Daily session logs (YYYY-MM-DD.md)
|
||
└── Templates/
|
||
```
|
||
|
||
## obsidian-skills
|
||
Five official skills from Kepano are installed in `.agents/skills/` and symlinked to `.claude/skills/`:
|
||
- **obsidian-cli** — CLI commands for reading/writing notes (requires Obsidian open with CLI enabled)
|
||
- **obsidian-markdown** — Obsidian Flavored Markdown syntax reference
|
||
- **obsidian-bases** — Creating and editing `.base` files
|
||
- **json-canvas** — Creating canvas files
|
||
- **defuddle** — Extract clean markdown from web pages
|
||
|
||
## Project Notes – What to Track
|
||
Each project note lives at `01 Projects/{project-dir}/{Project Name}.md` and must contain:
|
||
- **frontmatter**: name, client, status, tech, local_path, deploy, url, tags
|
||
- **Overview**: what the project does
|
||
- **Tech Stack**: frontend / backend / db / infra
|
||
- **Deployment**: how to run it, where it lives
|
||
- **Sessions**: reverse-chronological log (latest first)
|
||
- **Change Log**: table of date / requested / changed / files
|
||
- **Related**: wikilinks to connected notes
|
||
|
||
## Frontmatter Standard
|
||
```yaml
|
||
name: "Human-readable name"
|
||
client: "Client Name" # or "Oliver Internal"
|
||
status: active # active | production | paused | archived
|
||
tech: [Python, FastAPI, Docker] # array
|
||
local_path: /Users/ai_leed/Documents/Projects/Oliver/{dirname}
|
||
deploy: "docker compose up --build"
|
||
url: https://... # if deployed
|
||
server: GCP | optical-web-1 | TBD
|
||
tags:
|
||
- project
|
||
- client/ford # see Tag Taxonomy below
|
||
created: YYYY-MM-DD
|
||
```
|
||
|
||
## Tag Taxonomy
|
||
Use these tags consistently across all notes:
|
||
|
||
```
|
||
# Client tags
|
||
client/3m, client/barclays, client/ferrero, client/ford,
|
||
client/hm, client/loreal, client/lusa, client/pimco,
|
||
client/solventum, client/dowjones
|
||
|
||
# Status tags
|
||
status/active, status/production, status/paused, status/archived
|
||
|
||
# Tech tags
|
||
tech/fastapi, tech/react, tech/docker, tech/nextjs,
|
||
tech/gemini, tech/claude, tech/python, tech/node
|
||
|
||
# Type tags
|
||
type/project, type/dashboard, type/sop, type/reference,
|
||
type/daily, type/review, type/meeting
|
||
|
||
# Domain tags
|
||
domain/ai, domain/accessibility, domain/devops, domain/analytics
|
||
```
|
||
|
||
## Project Status Lifecycle
|
||
- **`active`** — currently being developed or maintained
|
||
- **`production`** — deployed and stable, not under active development
|
||
- **`paused`** — on hold, may resume
|
||
- **`archived`** — completed or abandoned
|
||
|
||
### Archival workflow
|
||
When a project moves to `archived`:
|
||
1. Update frontmatter `status: archived`
|
||
2. Move folder from `01 Projects/{name}/` → `04 Archive/{name}/`
|
||
3. Update Projects Index.md to remove or annotate the entry
|
||
|
||
## Session Protocol — MANDATORY
|
||
|
||
### Start of every session:
|
||
1. Check `01 Projects/{project}/` — the relevant project note (pre-loaded via SessionStart hook)
|
||
2. Check `02 Areas/Pending Commands.md` — any server commands still outstanding?
|
||
3. If the project note is a **stub** (never had a real session) → read the project's code first and fill in Overview, Tech Stack, Deployment before starting work
|
||
|
||
### During every session:
|
||
- If I give Vadym a **command to run on a server or locally** → immediately add to `02 Areas/Pending Commands.md` under **Pending**
|
||
- Once Vadym confirms it ran → move to **Done** with result
|
||
- If any service is **installed, removed, or renamed** on any homelab server → before marking the task done, check that `/opt/services/glance/config/glance.yml` is up to date: bookmarks URLs, monitor entries, Reference page. Update if anything is missing or stale.
|
||
|
||
### End of every session:
|
||
1. Append to the project's **Sessions** section (latest first): date, what was requested, what was done
|
||
2. Update **Change Log** table: date / requested / changed / files
|
||
3. Update frontmatter if status/tech/url/server changed
|
||
4. The Stop hook auto-writes a timestamp to `99 Daily/YYYY-MM-DD.md`
|
||
5. PostCompact hook auto-writes structured entries on context compaction
|
||
|
||
### Rule: NEVER skip logging
|
||
Even if the session is short. Even if just answering a question. Log it.
|
||
|
||
## All Code Projects Location
|
||
`/Users/ai_leed/Documents/Projects/Oliver/` — this is where all code lives on disk.
|
||
|
||
## Key Facts
|
||
- Vadym = developer at Oliver Agency, building internal tools and client solutions
|
||
- Stack preferences: Python/FastAPI for backends, Docker for deployment, vanilla JS+Tailwind or React for frontends
|
||
- Language for notes: **English**
|
||
- Date format: **YYYY-MM-DD** everywhere
|
||
- Credentials are NOT tracked in vault git — stored at `~/.secrets/` locally
|
||
- `~/.secrets/mailgun.env` — Mailgun shared infra defaults
|
||
- `02 Areas/credentials.md` is gitignored (iCloud-only, never pushed to GitHub)
|
||
|
||
## Two-Tier Daily Log System
|
||
|
||
The system maintains **two separate daily log streams** — do not confuse them:
|
||
|
||
| Location | Written by | Read by | Purpose |
|
||
|----------|-----------|---------|---------|
|
||
| `~/.claude/memory-compiler/daily/YYYY-MM-DD.md` | `flush.py` (SessionEnd hook) | `compile.py` (nightly) | Source material for wiki compilation |
|
||
| `99 Daily/YYYY-MM-DD.md` | `obsidian-session-log.py` (Stop hook) | Human (you) | Human-readable session log |
|
||
|
||
`compile.py` reads ONLY from `memory-compiler/daily/`. It never reads `99 Daily/`.
|
||
Both logs cover the same sessions but in different formats.
|
||
|
||
## raw/ Inbox — How to Use
|
||
|
||
Drop any source material into `raw/` and say "compile raw":
|
||
- Articles, PDFs, transcripts, research notes
|
||
- Screenshots of config files or error messages (describe them as text)
|
||
- Architecture diagrams (describe as text)
|
||
|
||
Claude will extract knowledge into the correct `wiki/` folder, update `_index.md`, and move the file to `raw/_processed/`.
|
||
|
||
**SessionStart auto-detection:** At the start of each session, Claude checks `raw/*.md` for unprocessed files. If any exist, it will notify and offer to process them automatically — no need to say "compile raw" manually.
|
||
|
||
**Do NOT put credentials or sensitive data in raw/.**
|
||
|
||
## Multi-Device Setup
|
||
|
||
When setting up a new machine, run this sequence:
|
||
```bash
|
||
# 1. Clone memory-compiler
|
||
git clone <repo> ~/.claude/memory-compiler
|
||
|
||
# 2. Copy scripts from vault (they sync via iCloud)
|
||
# Scripts live in vault at: 00 Automation/ (if set up)
|
||
# OR copy from another machine's ~/.claude/
|
||
|
||
# 3. Install dependencies
|
||
cd ~/.claude/memory-compiler && uv sync
|
||
|
||
# 4. Create ~/.secrets/ with credentials
|
||
mkdir -p ~/.secrets
|
||
# Copy mailgun.env and other secrets from 1Password / secure source
|
||
|
||
# 5. Register LaunchAgents (edit paths for new machine username first)
|
||
cp ~/path/to/LaunchAgents/*.plist ~/Library/LaunchAgents/
|
||
launchctl load ~/Library/LaunchAgents/com.claude.memory-compiler.plist
|
||
launchctl load ~/Library/LaunchAgents/com.vadym.icloud-dedup.plist
|
||
|
||
# 6. Update settings.json hooks (replace ai_leed with new username)
|
||
sed -i '' 's|/Users/ai_leed/|/Users/NEW_USERNAME/|g' ~/.claude/settings.json
|
||
```
|
||
|
||
**Note:** All hook commands in `settings.json` use hardcoded `/Users/ai_leed/` paths.
|
||
When working on a different machine, update these paths. A machine-agnostic setup
|
||
(using `$HOME`) is a future improvement.
|
||
|
||
## Wiki System — You Are the Librarian
|
||
|
||
`wiki/` is YOUR domain. You write and maintain everything in it. I rarely edit wiki files directly.
|
||
|
||
### Vault Structure (3 zones)
|
||
|
||
| Zone | Path | Owner | Purpose |
|
||
|------|------|-------|---------|
|
||
| Inbox | `raw/` | Me (human) | Dump source material here — articles, PDFs, transcripts |
|
||
| Wiki | `wiki/` | You (LLM) | Compile, maintain, cross-link all knowledge |
|
||
| Output | `output/` | You (LLM) | Query results, reports, slide decks |
|
||
|
||
### Wiki File Structure (Karpathy RAG format)
|
||
|
||
```
|
||
wiki/
|
||
├── _master-index.md ← LLM's table of contents — ALWAYS keep current
|
||
├── log.md ← Append-only build log
|
||
├── {topic}/ ← One folder per knowledge topic
|
||
│ ├── _index.md ← Lists all articles in this topic
|
||
│ └── {article}.md ← Individual knowledge article
|
||
├── concepts/ ← Session-derived atomic knowledge
|
||
├── connections/ ← Cross-cutting insights
|
||
└── qa/ ← Filed query answers
|
||
```
|
||
|
||
### Navigation Pattern (3 hops — no RAG needed)
|
||
|
||
When answering any question against the wiki:
|
||
1. Read `wiki/_master-index.md` — "what topics exist?"
|
||
2. Read that topic's `_index.md` — "what articles exist?"
|
||
3. Read the specific 1–3 articles
|
||
4. Synthesize the answer
|
||
|
||
### Compiling (when I say "compile" or add files to raw/)
|
||
|
||
For each file in `raw/`:
|
||
1. Read it and identify the core topic
|
||
2. Create or find the right topic subfolder in `wiki/`
|
||
3. Write a wiki article with key takeaways and `[[wikilinks]]` to related concepts
|
||
4. Update that topic's `_index.md`
|
||
5. Update `wiki/_master-index.md`
|
||
6. If raw file spans multiple topics — create articles in both, cross-link
|
||
7. Move processed file to a `raw/_processed/` subfolder (don't delete)
|
||
|
||
### Article Conventions
|
||
|
||
- File names: lowercase with hyphens (`ai-agent-patterns.md`)
|
||
- Always use `[[wikilinks]]` when referencing other notes
|
||
- Keep articles concise — bullet points over paragraphs
|
||
- Every article must have a `## Key Takeaways` section
|
||
- Every article must link to at least 2 other articles
|
||
|
||
### Auditing (when I say "audit" or "lint")
|
||
|
||
Review the wiki for:
|
||
- Inconsistent or contradictory information across articles
|
||
- Missing cross-links between related concepts
|
||
- Orphan articles (no one links to them)
|
||
- Topics mentioned but without dedicated articles
|
||
- Suggest 3–5 new articles that would strengthen the knowledge base
|
||
- **Do NOT make changes without confirmation — just report**
|
||
|
||
### Q&A Auto-Save Protocol
|
||
|
||
When answering a **complex technical question** during a session (debugging, architecture, how-to), save the answer to `wiki/qa/`:
|
||
|
||
1. Create `wiki/qa/{topic-slug}.md` with the question as H1, answer as body, `## Key Takeaways` section, and `## Related` wikilinks
|
||
2. Add entry to `wiki/qa/_index.md`
|
||
3. Update `wiki/_master-index.md` count
|
||
|
||
**Threshold for saving:** The answer involves non-obvious reasoning, debugging steps, or knowledge that would take >5 minutes to rediscover. Don't save answers to questions with obvious answers.
|
||
|
||
**Slug format:** `{problem}-{resolution}.md` e.g. `fastapi-cors-docker-fix.md`, `azure-ad-403-wrong-flow.md`
|
||
|
||
### Auto-compilation from Sessions
|
||
|
||
Sessions are captured automatically via Claude Code hooks and compiled to `wiki/concepts/`, `wiki/connections/`, and `wiki/qa/` after 21:00 (9 PM).
|
||
|
||
**Query command:**
|
||
```bash
|
||
cd ~/.claude/memory-compiler && uv run python scripts/query.py "your question"
|
||
```
|
||
|
||
**Manual compile:**
|
||
```bash
|
||
cd ~/.claude/memory-compiler && uv run python scripts/compile.py
|
||
```
|
||
|
||
## Automation Hooks
|
||
Five hooks fire automatically via Claude Code settings (global, from any project):
|
||
|
||
| Event | Script | Purpose |
|
||
|-------|--------|---------|
|
||
| **SessionStart** | obsidian-session-start.py | Loads project note + pending commands + check raw/ inbox |
|
||
| **SessionStart** | memory-compiler/hooks/session-start.py | Injects wiki/index.md + current-state.md + recent daily log |
|
||
| **PreCompact** | memory-compiler/hooks/pre-compact.py | Captures transcript → saves current-state.md → spawns flush.py |
|
||
| **SessionEnd** | memory-compiler/hooks/session-end.py | Captures session transcript → knowledge flush → daily log |
|
||
| **Stop** | time_tracker.py + cc-collector.py + obsidian-session-log.py | Time tracking + CC dashboard + daily note timestamp |
|
||
|
||
**Data flow:**
|
||
```
|
||
PreCompact → flush.py (background) → daily/YYYY-MM-DD.md
|
||
→ current-state.md ← next SessionStart reads this → context restored
|
||
|
||
Session ends → SessionEnd hook → flush.py → daily/YYYY-MM-DD.md
|
||
↓ (after 21:00)
|
||
compile.py → wiki/concepts/ (Obsidian vault)
|
||
```
|
||
|
||
## MCP Servers
|
||
|
||
| MCP | When to use |
|
||
|-----|-------------|
|
||
| `context7` | Live docs for FastAPI, Next.js, React, etc. — use instead of searching Google |
|
||
| `basic-memory` | Store a decision or insight mid-session (`create_entities`) / recall from past sessions (`search_nodes`) — writes `.md` files directly into this vault |
|
||
| `postgres` | Direct SQL queries to project DBs without writing scripts |
|
||
| `redis` | Redis operations for cc-dashboard, ai-cost-tracker, video-accessibility |
|
||
| `sequential-thinking` | Complex multi-step architectural decisions |
|
||
|
||
## My Role
|
||
- Log work clearly so context is never lost between sessions
|
||
- Keep notes accurate and up-to-date — no stale info
|
||
- Link related projects with [[wikilinks]]
|
||
- Never create a note for something already documented — update existing notes
|
||
- Use tag taxonomy consistently
|
||
- Move completed/abandoned projects to 04 Archive
|