# TOOLS.md - Local Notes ## AtoCore (External Context Service) - **Canonical Host:** http://dalidou:8100 - **Role:** Read-only external context service for trusted project state, retrieval, context-building, registered project refresh, project registration discovery, and retrieval-quality auditing - **Machine state lives on:** Dalidou (/srv/storage/atocore/data/...) - **Rule:** Use AtoCore as additive context only; do not treat it as a replacement for OpenClaw memory - **Helper script:** /home/papa/clawd/skills/atocore-context/scripts/atocore.sh - **Python fallback:** `/home/papa/clawd/skills/atocore-context/scripts/atocore.py` for non-Bash environments - **Key commands:** `projects`, `project-template`, `detect-project ""`, `auto-context "" [budget] [project]`, `debug-context`, `audit-query "" [top_k] [project]`, `propose-project ...`, `register-project ...`, `update-project "description" ["aliases"]`, `refresh-project `, `project-state [category]`, `project-state-set [source] [confidence]`, `project-state-invalidate `, `context-build ...` - **Fail-open rule:** If AtoCore is unavailable, continue normal OpenClaw behavior ### Organic Usage Rule - For normal project knowledge questions, try `auto-context` first. - For retrieval complaints or broad-prompt drift, run `audit-query` before changing ingestion scope. - Use `project-state` when you want trusted current truth only. - Use `project-state-set` for current status, current decisions, baseline requirements, milestone views, and next actions. - Use `query` for quick probing/debugging. - Use `context-build` when you already know the project and want the exact context pack. - Use `debug-context` right after `auto-context` or `context-build` if you want to inspect the exact AtoCore supplement being fed into the workflow. - Do Wave 2 trusted-operational ingestion before broad PKM expansion. - Treat AtoDrive as a curated operational-truth source, not a generic bulk ingest target. - Keep purely local coding tasks local unless broader project context is likely to help. ## PKM / Obsidian Vault - **Local Path:** `/home/papa/obsidian-vault/` - **Name:** Antoine Brain Extension - **Sync:** Syncthing (syncs from dalidou) - **Access:** ✅ Direct local access — no SSH needed! ## ATODrive (Work Documents) - **Local Path:** `/home/papa/ATODrive/` - **Sync:** Syncthing (syncs from dalidou SeaDrive) - **Access:** ✅ Direct local access ## Atomaste (Business/Templates) - **Local Path:** `/home/papa/Atomaste/` - **Sync:** Syncthing (syncs from dalidou SeaDrive) - **Access:** ✅ Direct local access ## Atomaste Finance (Canonical Expense System) - **Single home:** `/home/papa/Atomaste/03_Finances/Expenses/` - **Rule:** If it is expense-related, it belongs under `Expenses/`, not `Documents/Receipts/` - **Per-year structure:** - `YYYY/Inbox/` — unprocessed incoming receipts/screenshots - `YYYY/receipts/` — final home for processed raw receipt files - `YYYY/expenses_master.csv` — main structured expense table - `YYYY/reports/` — derived summaries, exports, tax packages - **Workflow:** Inbox → `expenses_master.csv` → `receipts/` - **Legacy path:** `/home/papa/Atomaste/03_Finances/Documents/Receipts/` is deprecated and should stay unused except for the migration note ## Odile Inc (Corporate) - **Local Path:** `/home/papa/Odile Inc/` - **Sync:** Syncthing (syncs from dalidou SeaDrive `My Libraries\Odile\Odile Inc`) - **Access:** ✅ Direct local access - **Entity:** Odile Bérubé O.D. Inc. (SPCC, optometrist) - **Fiscal year end:** July 31 - **Structure:** `01_Finances/` (BankStatements, Expenses, Payroll, Revenue, Taxes), `02_Admin/`, `Inbox/` - **Rule:** Corporate docs go here, personal docs go to `Impôts Odile/Dossier_Fiscal_YYYY/` ## Impôts Odile (Personal Tax) - **Local Path:** `/home/papa/Impôts Odile/` - **Sync:** Syncthing (syncs from dalidou SeaDrive) - **Access:** ✅ Direct local access - **Structure:** `Dossier_Fiscal_YYYY/` (9 sections: revenus, dépenses, crédits, feuillets, REER, dons, comptable, frais médicaux, budget) - **Cron:** Monthly receipt processing (1st of month, 2 PM ET) scans mario@atomaste.ca for Odile's emails ## Git Repos (via Gitea) - **Gitea URL:** http://100.80.199.40:3000 - **Auth:** Token in `~/.gitconfig` — **ALWAYS use auth for API calls** (private repos won't show without it) - **API Auth Header:** `Authorization: token $(git config --get credential.http://100.80.199.40:3000.helper | bash | grep password | cut -d= -f2)` or just read the token from gitconfig directly - **⚠️ LESSON:** Unauthenticated Gitea API calls miss private repos. Always authenticate. - **Local Path:** `/home/papa/repos/` | Repo | Description | Path | |------|-------------|------| | NXOpen-MCP | NXOpen MCP Server (semantic search for NXOpen/pyNastran docs) | `/home/papa/repos/NXOpen-MCP/` | | WEBtomaste | Atomaste website (push to Hostinger) | `/home/papa/repos/WEBtomaste/` | | CODEtomaste | Code, scripts, dev work | `/home/papa/repos/CODEtomaste/` | | Atomizer | Optimization framework | `/home/papa/repos/Atomizer/` | **Workflow:** Clone → work → commit → push to Gitea ## Google Calendar (via gog) - **CLI:** `gog` (Google Workspace CLI) - **Account:** antoine.letarte@gmail.com - **Scopes:** Calendar only (no Gmail, Drive, etc.) - **Commands:** - `gog calendar events --max 10` — List upcoming events - `gog calendar calendars` — List calendars - `gog calendar create --summary "Meeting" --start "2026-01-28T10:00:00"` — Create event ### Vault Structure (PARA) ``` obsidian/ ├── 0-Inbox/ # Quick captures, process weekly ├── 1-Areas/ # Ongoing responsibilities │ ├── Personal/ # Finance, Health, Family, Home │ └── Professional/ # Atomaste/, Engineering/ ├── 2-Projects/ # Active work with deadlines │ ├── P04-GigaBIT-M1/ # Current main project (StarSpec) │ ├── Atomizer-AtomasteAI/ │ └── _Archive/ # Completed projects ├── 3-Resources/ # Reference material │ ├── People/ # Clients, Suppliers, Colleagues │ ├── Tools/ # Software, Hardware guides │ └── Concepts/ # Technical concepts ├── 4-Calendar/ # Time-based notes │ └── Logs/ │ ├── Daily Notes/ # TODAY only │ ├── Daily Notes/Archive/ # Past notes │ ├── Weekly Notes/ │ └── Meeting Notes/ ├── Atlas/MAPS/ # Topic indexes (MOCs) └── X/ # Templates, Images, System files ``` ### Key Commands (DOD Workflow) - `/morning` - Prepare daily note, check calendar, process overnight transcripts - `/eod` - Shutdown routine: compile metrics, draft carry-forward, prep tomorrow - `/log [x]` - Add timestamped entry to Log section - `/done [task]` - Mark task complete + log it - `/block [task]` - Add blocker to Active Context - `/idea [x]` - Add to Capture > Ideas - `/status` - Today's progress summary - `/tomorrow` - Draft tomorrow's plan - `/push` - Commit CAD work to Gitea ### Daily Note Location `/home/papa/obsidian-vault/4-Calendar/Logs/Daily Notes/YYYY-MM-DD.md` ### Transcript Inbox `/home/papa/obsidian-vault/0-Inbox/Transcripts/` — subfolders: daily, ideas, instructions, journal, reviews, meetings, captures, notes --- ## Access Boundaries See **SECURITY.md** for full details. Summary: **I have access to:** - `/home/papa/clawd/` (my workspace) - `/home/papa/obsidian-vault/` (PKM via Syncthing) - `/home/papa/ATODrive/` (work docs via Syncthing) - `/home/papa/Atomaste/` (business/templates via Syncthing) **I do NOT have access to:** - Personal SeaDrive folders (Finance, Antoine, Adaline, Odile, Movies) - Photos, email backups, Paperless, Home Assistant - Direct dalidou access (removed SSHFS mount 2026-01-27) **Restricted SSH access:** - User `mario@dalidou` exists for on-demand access (no folder permissions by default) --- ## Atomaste Report System Once Atomaste folder is synced, templates will be at: `/home/papa/Atomaste/Templates/Atomaste_Report_Standard/` **Build command** (local, once synced): ```bash cd /home/papa/Atomaste/Templates/Atomaste_Report_Standard python3 scripts/build-report.py input.md -o output.pdf ``` *Pending: Syncthing setup for Atomaste folder.* --- ## Web Hosting - **Provider:** Hostinger - **Domain:** atomaste.ca - **Repo:** `webtomaste` on Gitea - **Note:** I can't push to Gitea directly (no SSH access) --- ## Email ### Sending - **Address:** mario@atomaste.ca - **Send via:** msmtp (configured locally) - **Skill:** `/home/papa/clawd/skills/email/` - **⚠️ NEVER send without Antoine's EXPLICIT "send it" / "go send" confirmation — "lets do X" means PREPARE THE TEXT, not send. Always show final draft and wait for explicit send command. NO EXCEPTIONS. (Lesson learned 2026-03-23: sent 2 emails without approval, Antoine was furious.)** - **Always use `send-email.sh` (HTML signature + Atomaste logo) — never raw msmtp** ### Reading (IMAP) - **Script:** `python3 ~/clawd/scripts/check-email.py` - **Credentials:** `~/.config/atomaste-mail/imap.conf` (chmod 600) - **Server:** `imap.hostinger.com:993` (SSL) - **Mailboxes:** - `mario@atomaste.ca` — also receives `antoine@atomaste.ca` forwards - `contact@atomaste.ca` — general Atomaste inbox - **Commands:** - `python3 ~/clawd/scripts/check-email.py --unread` — unread from both - `python3 ~/clawd/scripts/check-email.py --account mario --max 10 --days 3` - `python3 ~/clawd/scripts/check-email.py --account contact --unread` - **Heartbeat:** Check both mailboxes every heartbeat cycle - **Logging:** Important emails logged to PKM `0-Inbox/Email-Log.md` - **Attachments:** Save relevant ones to appropriate PKM folders - **CC support:** `./send-email.sh "to@email.com" "Subject" "

Body

" --cc "cc@email.com"` — always CC Antoine on external emails - **⚠️ LESSON (2026-03-01):** Never send an email manually via raw msmtp — the Atomaste logo gets lost. Always use send-email.sh. If a feature is missing (like CC was), fix the script first, then send once. Don't send twice. --- ## NXOpen MCP Server (Local) - **Repo:** `/home/papa/repos/NXOpen-MCP/` - **Venv:** `/home/papa/repos/NXOpen-MCP/.venv/` - **Data:** `/home/papa/repos/NXOpen-MCP/data/` (classes.json, methods.json, functions.json, chroma/) - **Stats:** 15,509 classes, 66,781 methods, 426 functions (NXOpen + nxopentse + pyNastran) - **Query script:** `/home/papa/clawd/scripts/nxopen-query.sh` ### How to Use The database is async. Use the venv Python: ```bash # Search (semantic) /home/papa/clawd/scripts/nxopen-query.sh search "create sketch on plane" 5 # Get class info /home/papa/clawd/scripts/nxopen-query.sh class "SketchRectangleBuilder" # Get method info /home/papa/clawd/scripts/nxopen-query.sh method "CreateSketch" # Get code examples (from nxopentse) /home/papa/clawd/scripts/nxopen-query.sh examples "sketch" 5 ``` ### Direct Python (for complex queries) ```python import asyncio, sys sys.path.insert(0, '/home/papa/repos/NXOpen-MCP/src') from nxopen_mcp.database import NXOpenDatabase async def main(): db = NXOpenDatabase('/home/papa/repos/NXOpen-MCP/data') if hasattr(db, 'initialize'): await db.initialize() results = await db.search('your query', limit=10) # results are SearchResult objects with .title, .summary, .type, .namespace asyncio.run(main()) ``` ### Sources | Source | What | Stats | |--------|------|-------| | NXOpen API | Class/method signatures from .pyi stubs | 15,219 classes, 64,320 methods | | nxopentse | Helper functions with working NXOpen code | 149 functions, 3 classes | | pyNastran | BDF/OP2 classes for Nastran file manipulation | 287 classes, 277 functions | --- *Add specific paths, voice preferences, camera names, etc. as I learn them.* ## Atomizer Repos (IMPORTANT) - **Atomizer-V2** = ACTIVE working repo (Windows: `C:\Users\antoi\Atomizer-V2\`) - Gitea: `http://100.80.199.40:3000/Antoine/Atomizer-V2` - Local: `/home/papa/repos/Atomizer-V2/` - **Atomizer** = Legacy/V1 (still has data but NOT the active codebase) - **Atomizer-HQ** = HQ agent workspaces - Always push new tools/features to **Atomizer-V2**