Initial skills documentation — 25 categories, all SKILL.md + references + scripts

This commit is contained in:
root
2026-07-15 17:42:20 -04:00
commit 1b4fcd4427
976 changed files with 188344 additions and 0 deletions
+50
View File
@@ -0,0 +1,50 @@
---
name: project-log
description: Track all completed projects for year-end review
---
# Project Log Maintenance
Keep `/root/.hermes/projects-log.md` updated with every completed project.
## When to update
- At the end of every session where meaningful work was done
- When a task on the todo list gets marked completed
- When a major milestone is reached
## Format
```
## YYYY-MM-DD
- [x] Project name: Brief description of what was accomplished
```
## What to include
- Infrastructure changes (new servers, services, tunnels)
- Portal features built
- Client-specific work (BoxPilot, Apex, etc.)
- Automation / scripts created
- Security improvements
- Any non-trivial task the user would want to remember
## Categories to track
- Infrastructure
- Portal
- Email
- Networking
- Security
- Compliance & Legal (policy manuals, ToS, Privacy Policies, regulatory research)
- Web Research Stack (search/scrape API integrations, data broker removal)
- Client projects (DRE, BoxPilot, Apex, Forefront)
- MCP Servers (database, Google Workspace, etc.)
- Vehicle database updates
- Integrations (Cloudflare, APIs, etc.)
## End of year
When January rolls around, I can summarize the full year by reading this file.
## Retroactive DB Extraction
If the log is incomplete and you need to retroactively inventory projects or deliverables discussed across past sessions (e.g., "what did we work on this week"), FTS5 joins or raw terminal outputs often hit truncation limits due to volume.
Instead, use the included Python script to mine the raw SQLite DB:
`python3 /root/.hermes/skills/productivity/project-log/scripts/mine-state-db.py --since <unix_timestamp> --out /tmp/mentions.txt`
Then use `search_files` or `read_file` to analyze the resulting `/tmp/mentions.txt`.
*(Note: FTS5 tables (`messages_fts`) lack role metadata. If manually querying, always join `messages_fts` on `rowid = messages.id` to filter by `m.role = 'user'`)*
@@ -0,0 +1,11 @@
## 2026-07-07 (Session 4 — Major expansion)
- [x] Home router WireGuard: Validated full MikroTik ROS7 onboarding flow end-to-end (tunnel, SSH key, backup, watchdog)
- [x] Home router watchdog: Converted from L2TP VPN to WireGuard, switched to no_agent (silent ping, no LLM, no typing)
- [x] Service health check: Created 12-service monitoring cron (every 5 min, silent unless down)
- [x] Portal capabilities page: Live at capabilities.html — skills, MCPs, APIs, infrastructure, cron jobs with hover tooltips
- [x] Debt Recovery Experts: Claim submission form + internal AI analysis dashboard + compliance manual + ToS/Privacy drafts
- [x] DocuSeal deployed at sign.itpropartner.com with Caddy HTTPS
- [x] MySQL MCP server: Custom Python MCP with persistent autossh tunnel to wphost02
- [x] Web research stack: Firecrawl + ScrapingAnt + SearXNG — three-tier web scraping configured
- [x] Anita's profile: Web tools enabled, gateway restart fixed
- [x] Memory limits expanded (3500→10000, 2500→5000)
@@ -0,0 +1,63 @@
import sqlite3
import re
from datetime import datetime
import argparse
def mine_projects(db_path, since_timestamp, output_file):
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
query = """
SELECT s.id, s.title, m.content, m.timestamp
FROM messages m
JOIN sessions s ON m.session_id = s.id
WHERE s.id NOT LIKE 'cron_%'
AND s.started_at > ?
AND m.role = 'user'
ORDER BY m.timestamp ASC
"""
cursor.execute(query, (since_timestamp,))
rows = cursor.fetchall()
keywords = ['project', 'deliverable', 'working on', 'migrate', 'build', 'implement']
extracted = []
for row in rows:
session_id, title, content, ts = row
content = str(content)
# find sentences with keywords
sentences = re.split(r'(?<=[.!?])\s+', content)
for s in sentences:
if any(k in s.lower() for k in keywords):
# remove newlines
s_clean = s.replace('\n', ' ').strip()
# truncate if too long
if len(s_clean) > 300:
s_clean = s_clean[:300] + '...'
# format date
dt = datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M')
extracted.append(f"[{dt}] {session_id} ({title}): {s_clean}")
# deduplicate while keeping order
seen = set()
dedup = []
for line in extracted:
if line not in seen:
seen.add(line)
dedup.append(line)
with open(output_file, "w") as f:
for line in dedup:
f.write(line + "\n")
print(f"Extracted {len(dedup)} mentions to {output_file}.")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Extract project mentions from Hermes state.db')
parser.add_argument('--since', type=float, required=True, help='Unix timestamp to start from')
parser.add_argument('--out', type=str, default='/tmp/project_mentions.txt', help='Output file path')
args = parser.parse_args()
mine_projects("/root/.hermes/state.db", args.since, args.out)