12 KiB
12 KiB
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.pyfor non-Bash environments - Key commands:
projects,project-template,detect-project "<prompt>",auto-context "<prompt>" [budget] [project],debug-context,audit-query "<prompt>" [top_k] [project],propose-project ...,register-project ...,update-project <id> "description" ["aliases"],refresh-project <id>,project-state <id> [category],project-state-set <project> <category> <key> <value> [source] [confidence],project-state-invalidate <project> <category> <key>,context-build ... - Fail-open rule: If AtoCore is unavailable, continue normal OpenClaw behavior
Organic Usage Rule
- For normal project knowledge questions, try
auto-contextfirst. - For retrieval complaints or broad-prompt drift, run
audit-querybefore changing ingestion scope. - Use
project-statewhen you want trusted current truth only. - Use
project-state-setfor current status, current decisions, baseline requirements, milestone views, and next actions. - Use
queryfor quick probing/debugging. - Use
context-buildwhen you already know the project and want the exact context pack. - Use
debug-contextright afterauto-contextorcontext-buildif 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/, notDocuments/Receipts/ - Per-year structure:
YYYY/Inbox/— unprocessed incoming receipts/screenshotsYYYY/receipts/— final home for processed raw receipt filesYYYY/expenses_master.csv— main structured expense tableYYYY/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 eventsgog calendar calendars— List calendarsgog 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@dalidouexists 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):
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:
webtomasteon Gitea - Note: I can't push to Gitea directly (no SSH access)
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 receivesantoine@atomaste.caforwardscontact@atomaste.ca— general Atomaste inbox
- Commands:
python3 ~/clawd/scripts/check-email.py --unread— unread from bothpython3 ~/clawd/scripts/check-email.py --account mario --max 10 --days 3python3 ~/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" "<p>Body</p>" --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:
# 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)
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/
- Gitea:
- Atomizer = Legacy/V1 (still has data but NOT the active codebase)
- Atomizer-HQ = HQ agent workspaces
- Always push new tools/features to Atomizer-V2