387 lines
12 KiB
Markdown
387 lines
12 KiB
Markdown
# TOOLS.md - Local Notes
|
||
|
||
Skills define _how_ tools work. This file is for _your_ specifics — the stuff that's unique to your setup.
|
||
|
||
## Why Separate?
|
||
|
||
Skills are shared. Your setup is yours. Keeping them apart means you can update skills without losing your notes, and share skills without leaking your infrastructure.
|
||
|
||
---
|
||
## Gitea (Git Server - DO NOT INSTALL LOCALLY)
|
||
|
||
**⚠️ CRITICAL:** Gitea runs on a SEPARATE MACHINE (192.168.1.128). Do NOT install it on Matt's Mac.
|
||
|
||
**Server Location:** http://192.168.1.128:3000 (NOT localhost:3000)
|
||
- **Login:** ai-agent / !7883Gitea
|
||
- **Organization:** TopDogLabs
|
||
- **All repos go under:** http://192.168.1.128:3000/TopDogLabs/
|
||
|
||
### Backup Rule - MANDATORY
|
||
|
||
**ALWAYS push to Gitea after significant changes:**
|
||
```bash
|
||
cd /Users/mattbruce/.openclaw/workspace
|
||
git add -A
|
||
git commit -m "Description of changes"
|
||
git push origin master
|
||
```
|
||
|
||
**Push after:**
|
||
- New skills or agent profiles created
|
||
- TOOLS.md, SOUL.md, AGENTS.md updates
|
||
- New cron jobs or automation
|
||
- Significant memory/documentation changes
|
||
- New project scaffolding
|
||
|
||
**Why:** Ensures continuity if local workspace is lost/corrupted.
|
||
|
||
### Using Gitea
|
||
|
||
**Clone existing repo:**
|
||
```bash
|
||
git clone http://192.168.1.128:3000/TopDogLabs/repo-name.git
|
||
```
|
||
|
||
**Push to Gitea:**
|
||
```bash
|
||
git push origin main
|
||
# Enter username: ai-agent
|
||
# Enter password: !7883Gitea
|
||
```
|
||
|
||
**Create new repo via web:**
|
||
1. Go to http://192.168.1.128:3000
|
||
2. Login as ai-agent
|
||
3. Click + → New Repository
|
||
4. Owner: TopDogLabs
|
||
5. Name: [project-name]
|
||
|
||
**NEVER do this:**
|
||
- ❌ `brew install gitea` on Matt's Mac
|
||
- ❌ Run `gitea web` locally
|
||
- ❌ Use port 3000 for anything (it's for Next.js dev)
|
||
|
||
## Folders for All Content/Projects
|
||
- **Location:** /Users/mattbruce/Documents/Projects/OpenClaw
|
||
- **Documents:** /Users/mattbruce/Documents/Projects/OpenClaw/Documents
|
||
- **iOS:** /Users/mattbruce/Documents/Projects/OpenClaw/iOS
|
||
- **Web:** /Users/mattbruce/Documents/Projects/OpenClaw/Web
|
||
|
||
## Blog Backup
|
||
- **Location:** /Users/mattbruce/Documents/Projects/OpenClaw/Web/blog-backup
|
||
- **Live URL:** https://blog-backup-two.vercel.app
|
||
- **Local Dev:** http://localhost:3002
|
||
- **Stack:** Next.js + Supabase + Vercel
|
||
- **Deploy:** `npm run build && vercel --prod` (no GitHub, CLI only)
|
||
- **Features:** Daily digest blog with tag filtering, search, responsive design
|
||
|
||
## Mission Control
|
||
- **Location:** /Users/mattbruce/Documents/Projects/OpenClaw/Web/mission-control
|
||
- **Live URL:** https://mission-control-rho-pink.vercel.app/
|
||
- **API:** https://mission-control-rho-pink.vercel.app/api
|
||
- **Local Dev:** http://localhost:3001
|
||
- **Stack:** Next.js + Vercel
|
||
- **Deploy:** `npm run build && vercel --prod` (no GitHub, CLI only)
|
||
|
||
## Gantt Board
|
||
- **Location:** /Users/mattbruce/Documents/Projects/OpenClaw/Web/gantt-board
|
||
- **Live URL:** https://gantt-board.vercel.app
|
||
- **API:** https://gantt-board.vercel.app/api
|
||
- **Login:** mbruce+max@topdoglabs.com / !7883Gantt
|
||
- **Local Dev:** http://localhost:3000
|
||
- **Stack:** Next.js + Supabase + Vercel
|
||
- **Deploy:** `npm run build && vercel --prod` (no GitHub, CLI only)
|
||
|
||
### CLI Access (Full CRUD)
|
||
|
||
**Location:** `/Users/mattbruce/Documents/Projects/OpenClaw/Web/gantt-board/scripts/`
|
||
|
||
**Scripts:**
|
||
- `task.sh` - Task management (create, list, get, update, delete, bulk-create)
|
||
- `project.sh` - Project management (create, list, get, update, delete)
|
||
- `sprint.sh` - Sprint management (create, list, get, close)
|
||
|
||
**Quick Examples:**
|
||
```bash
|
||
cd /Users/mattbruce/Documents/Projects/OpenClaw/Web/gantt-board/scripts
|
||
|
||
# Create task with all fields
|
||
./task.sh create --title "Fix bug" --description "Details" --type bug \
|
||
--priority high --project "Gantt Board" --sprint "current" --assignee "Max" \
|
||
--due-date "2026-03-01" --tags "urgent,backend"
|
||
|
||
# List tasks with filters
|
||
./task.sh list --status todo --priority high --project "Gantt Board"
|
||
|
||
# Update task
|
||
./task.sh update <task-id> --status in-progress --add-comment "Starting work"
|
||
|
||
# Create project
|
||
./project.sh create --name "New Project" --description "Project details"
|
||
|
||
# Create sprint
|
||
./sprint.sh create --name "Sprint 1" --project "Gantt Board" \
|
||
--start-date 2026-02-24 --end-date 2026-03-07
|
||
|
||
# Bulk create from JSON
|
||
./task.sh bulk-create tasks.json --auto-create
|
||
```
|
||
|
||
**Features:**
|
||
- Auto-resolves names to IDs ("Gantt Board" → project UUID, "Max" → user UUID)
|
||
- Use "current" for the most recent active sprint
|
||
- JSON file input with `--file` and `--auto-create` for projects
|
||
- Interactive mode with `--interactive`
|
||
|
||
**Full Documentation:** See `scripts/README.md` in the gantt-board directory.
|
||
|
||
## Supabase for Gantt Board
|
||
|
||
- **URL:** https://qnatchrjlpehiijwtreh.supabase.co
|
||
- **Project ID:** qnatchrjlpehiijwtreh
|
||
|
||
## User IDs for Gantt Board
|
||
|
||
- **Matt:** 0a3e400c-3932-48ae-9b65-f3f9c6f26fe9
|
||
- **Max:** 9c29cc99-81a1-4e75-8dff-cd7cc5ceb5aa
|
||
|
||
---
|
||
|
||
## 🔄 Automated Task Worker (24/7)
|
||
|
||
**CRITICAL:** This is the PRIMARY workflow for all task work. Read this every session.
|
||
|
||
### Cron Job
|
||
- **Job ID:** `b9f3bbe6-bcb5-4483-8816-d044fd91c58a`
|
||
- **Schedule:** Every hour (24/7)
|
||
- **Scope:** Current sprint ONLY (ignores backlog/future sprints)
|
||
- **Statuses:** `open`, `todo`, `in-progress`
|
||
- **Assignee:** Max (9c29cc99-81a1-4e75-8dff-cd7cc5ceb5aa)
|
||
|
||
### Authentication
|
||
The Gantt Board API uses cookie-based auth. For server-to-server calls from this cron job, use the service role token:
|
||
|
||
```bash
|
||
# Set the token (already configured in environment)
|
||
export GANTT_MACHINE_TOKEN="50cd5e8fe3f895353f97c9ee64052c0b689b4eedf79259746413734d0a163cf8"
|
||
```
|
||
|
||
**Always use API endpoints via CLI tools or direct curl with the token. NEVER use direct Supabase REST calls.**
|
||
|
||
### When User Says "Create a Task"
|
||
1. Immediately add to Gantt Board via CLI: `./scripts/gantt-task-crud.sh create "Title" todo high ...`
|
||
2. Assign to current sprint
|
||
3. Do NOT create separate files (unless specifically asked)
|
||
|
||
### Reading Full Task Details (REQUIRED)
|
||
**CRITICAL: Use API endpoints, NOT direct Supabase.**
|
||
|
||
**Get current sprint via API:**
|
||
```bash
|
||
# Get current sprint ID (today's date)
|
||
TODAY=$(date +%Y-%m-%d)
|
||
curl -s "http://localhost:3000/api/sprints" \
|
||
-H "Authorization: Bearer ${GANTT_MACHINE_TOKEN}" \
|
||
-H "Content-Type: application/json" | jq '.sprints[] | select(.startDate <= '"$TODAY"' and .endDate >= '"$TODAY"')'
|
||
```
|
||
|
||
**Fetch tasks for current sprint via API:**
|
||
```bash
|
||
curl -s "http://localhost:3000/api/tasks?sprintId={current_sprint_id}&status=open,todo,in-progress" \
|
||
-H "Authorization: Bearer ${GANTT_MACHINE_TOKEN}" \
|
||
-H "Content-Type: application/json"
|
||
```
|
||
|
||
**Use CLI tools (API passthrough):**
|
||
```bash
|
||
cd /Users/mattbruce/Documents/Projects/OpenClaw/Web/gantt-board
|
||
|
||
# Get current sprint
|
||
./scripts/sprint.sh list --active --json
|
||
|
||
# List tasks in current sprint
|
||
./scripts/task.sh list --sprint current --status open,todo,in-progress --json
|
||
|
||
# Get full task details including comments
|
||
./scripts/task.sh get {task_id} --json
|
||
```
|
||
|
||
**READ in this order:**
|
||
1. **Title** - High-level goal
|
||
2. **Description** - Implementation details, steps
|
||
3. **Comments** (ALL of them) - What's done? What's next? What's left?
|
||
|
||
### Task Comment Format (APPEND to existing)
|
||
```json
|
||
{
|
||
"id": "{timestamp}-{random}",
|
||
"text": "[YYYY-MM-DD HH:MM] 🔄 In Progress\n\n**What was just done:**\n- Step completed\n\n**What is next:**\n- Next action\n\n**What is left to do:**\n- Remaining work",
|
||
"replies": [],
|
||
"createdAt": "YYYY-MM-DDTHH:MM:SSZ",
|
||
"commentAuthorId": "9c29cc99-81a1-4e75-8dff-cd7cc5ceb5aa"
|
||
}
|
||
```
|
||
|
||
### Status Flow
|
||
```
|
||
open/todo → in-progress → review → (user validates) → done
|
||
↑
|
||
Add progress comment at EACH step
|
||
```
|
||
|
||
### Updating Tasks via CLI (API passthrough)
|
||
```bash
|
||
cd /Users/mattbruce/Documents/Projects/OpenClaw/Web/gantt-board
|
||
|
||
./scripts/task.sh update {task_id} --status in-progress --comment "[YYYY-MM-DD HH:MM] 🔄 In Progress
|
||
|
||
**What was just done:**
|
||
- Step completed
|
||
|
||
**What is next:**
|
||
- Next action
|
||
|
||
**What is left to do:**
|
||
- Remaining work"
|
||
```
|
||
|
||
**Direct API (if needed):**
|
||
```bash
|
||
curl -s -X PATCH "http://localhost:3000/api/tasks/{task_id}" \
|
||
-H "Authorization: Bearer ${GANTT_MACHINE_TOKEN}" \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"status": "in-progress",
|
||
"comments": [EXISTING_COMMENTS_PLUS_NEW_ONE]
|
||
}'
|
||
```
|
||
|
||
### Subagent Coordination
|
||
- Spawn subagents for parallel work
|
||
- Subagents READ same full task details
|
||
- Subagents REPORT back with progress
|
||
- YOU update task comments with their work
|
||
|
||
### User Workflow
|
||
- User creates task in Gantt Board
|
||
- Cron/auto picks it up hourly
|
||
- I work on it, log everything in comments
|
||
- Move to `review` when complete
|
||
- User validates, moves to `done`
|
||
|
||
## 👥 Subagent Team (Alice, Bob, Charlie)
|
||
|
||
**Location:** `/Users/mattbruce/.openclaw/workspace/agents/`
|
||
|
||
**Full Registry:** `agents/TEAM-REGISTRY.md`
|
||
|
||
### Team Members
|
||
|
||
| Name | Role | When to Spawn |
|
||
|------|------|---------------|
|
||
| **Alice-Researcher** | Research & tech evaluation | Need to choose technology, compare options, assess risks |
|
||
| **Bob-Implementer** | Code implementation | Requirements clear, ready to build |
|
||
| **Charlie-Tester** | Testing & code review | Implementation done, need quality gate |
|
||
|
||
### Standard Workflow
|
||
|
||
```
|
||
Complex Task: Alice → Bob → Charlie → Done
|
||
15m 30m 10m
|
||
|
||
Simple Task: Bob → Charlie → Done
|
||
20m 10m
|
||
|
||
Research Only: Alice → Report
|
||
15m
|
||
```
|
||
|
||
### How to Spawn
|
||
|
||
**Alice (Research):**
|
||
```javascript
|
||
sessions_spawn({
|
||
task: `Research: [question]\n\nContext: [background]\n\nRead your SOUL.md at: /Users/mattbruce/.openclaw/workspace/agents/alice-researcher/SOUL.md`,
|
||
label: "Alice-Researcher",
|
||
agentId: "main"
|
||
})
|
||
```
|
||
|
||
**Bob (Implement):**
|
||
```javascript
|
||
sessions_spawn({
|
||
task: `Implement: [feature]\n\nBased on: [research/spec]\n\nRead your SOUL.md at: /Users/mattbruce/.openclaw/workspace/agents/bob-implementer/SOUL.md`,
|
||
label: "Bob-Implementer",
|
||
agentId: "main"
|
||
})
|
||
```
|
||
|
||
**Charlie (Test):**
|
||
```javascript
|
||
sessions_spawn({
|
||
task: `Test: [feature]\n\nCode: [files]\n\nRead your SOUL.md at: /Users/mattbruce/.openclaw/workspace/agents/charlie-tester/SOUL.md`,
|
||
label: "Charlie-Tester",
|
||
agentId: "main"
|
||
})
|
||
```
|
||
|
||
### Each Agent Has
|
||
- **SOUL.md** - Personality, rules, boundaries
|
||
- **AGENTS.md** - Role definition, skills, typical tasks
|
||
|
||
### Announcement Format
|
||
- **Alice:** "Alice-Researcher ✅ 5 options evaluated – Recommended: X – Ready for Bob"
|
||
- **Bob:** "Bob-Implementer ✅ [feature] implemented – Ready for Charlie"
|
||
- **Charlie:** "Charlie-Tester ✅ 12 tests passed – 2 bugs found – Recommendation"
|
||
|
||
---
|
||
|
||
## Tavily AI Search (Configured)
|
||
|
||
**API Key:** Stored in `.env.tavily` (auto-loaded)
|
||
|
||
**Quick Commands:**
|
||
```bash
|
||
# Search
|
||
cd ~/.openclaw/workspace && ./tavily-search.sh "query" -n 5
|
||
|
||
# Extract URL content
|
||
cd ~/.openclaw/workspace && ./tavily-extract.sh "https://example.com"
|
||
|
||
# Deep research
|
||
cd ~/.openclaw/workspace && ./tavily-search.sh "query" --deep
|
||
```
|
||
|
||
**Note:** API key is automatically loaded from `.env.tavily`. No need to export manually.
|
||
|
||
---
|
||
|
||
## Daily Digest Failsafe System
|
||
|
||
**Cron Job:** Daily Digest - 7am CST (America/Chicago)
|
||
**Status:** ✅ Fixed and monitored
|
||
**Last Posted:** 2026-02-23
|
||
|
||
**What I Fixed:**
|
||
- ✅ Wrong API key in cron job (was `cron_daily_digest_2025`, now `daily-digest-2026-secure-key`)
|
||
- ✅ Added retry logic (3 attempts with 30s delay)
|
||
- ✅ Enabled notifications on failure
|
||
- ✅ Added backup file creation on failure (`memory/YYYY-MM-DD-digest-failed.md`)
|
||
|
||
**If It Fails:**
|
||
1. You will get notified immediately
|
||
2. Digest content saved to `memory/` folder
|
||
3. Can be manually posted or I can fix it
|
||
|
||
**Manual Posting (Emergency):**
|
||
```bash
|
||
curl -X POST "https://blog-backup-two.vercel.app/api/digest" \
|
||
-H "Content-Type: application/json" \
|
||
-H "x-api-key: daily-digest-2026-secure-key" \
|
||
-d '{"date": "2026-02-23", "content": "...", "tags": [...]}'
|
||
```
|
||
|
||
---
|
||
|
||
Add whatever helps you do your job. This is your cheat sheet.
|