Files
ATOCore/t420-openclaw/TOOLS.md

280 lines
12 KiB
Markdown
Raw Normal View History

# 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 "<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-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" "<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:
```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**