Initial skills documentation — 25 categories, all SKILL.md + references + scripts
This commit is contained in:
@@ -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)
|
||||
Reference in New Issue
Block a user