Skip to content

Commit ca75386

Browse files
Merge pull request #8 from OnlyTerp/devin/1776401488-phase4
* feat: config wizard + reference architectures + CI + outreach + 4 new skills + i18n - docs/wizard/ — interactive static config-builder (HTML+JS, GitHub Pages friendly) - docs/reference-architectures/ — 4 full blueprints (homelab, solo-dev, small-agency, road-warrior) - docs/outreach/ — launch drafts (tweet, HN, Reddit, upstream-Nous PR, long blog) - .github/workflows/ci.yml + validate_skills.py — markdown-link-check, yamllint, skill frontmatter linter, prettier advisory - skills/ — +4 (daily-inbox-triage, hermes-weekly, spam-trap, meeting-prep) — total 13 - README-zh.md, README-ja.md — localized entry summaries - templates/config/*.yaml — quoted ${VAR} inside flow mappings (valid YAML) - README: skills 9→13, language links, wizard/ref-arch/outreach rows, CI badge - CHANGELOG + ROADMAP updated Co-Authored-By: Rob <onerobby@gmail.com> * fix: correct relative path from daily-inbox-triage to spam-trap skill Co-Authored-By: Rob <onerobby@gmail.com> * wizard: persona selection now drives form presets + persona-specific YAML blocks Addresses Devin Review comment: the persona radio (Question 1) was only emitted as a YAML comment. Now it actually configures the starting state. - onchange="applyPersona(value)" on each persona radio - PERSONA_PRESETS mirrors templates/config/<persona>.yaml shape: minimum / telegram-bot / production / cost-optimized / security-hardened - applyPersona() sets default_model, memory, gateways, mcps, approval, obs, crons — then re-generates YAML automatically - generate() now emits persona-specific blocks: - security-hardened: security.mcp.{default_trust,require_allowlist,allow_sampling} - security-hardened + production: webhook require_signature + max_body_bytes, redaction.{memory_write,log}, quarantine profile - cost-optimized: routing.rules (5-rule cost ladder) Co-Authored-By: Rob <onerobby@gmail.com> * wizard: align persona presets with templates/config/<persona>.yaml Devin Review flagged four mismatches between the PERSONA_PRESETS and the actual reference templates. Fixed: - minimum: memory none -> vector (templates/config/minimum.yaml:25 uses vector) - telegram-bot: memory vector -> lightrag (telegram-bot.yaml:43 uses lightrag) - cost-optimized: memory vector -> lightrag (cost-optimized.yaml:66 uses lightrag) - cost-optimized: obs helicone -> none (cost-optimized.yaml has no exporters; it's telemetry + alerts only) Now each preset actually mirrors its template, which is what the code comment at line 185-187 claims. Co-Authored-By: Rob <onerobby@gmail.com> * wizard: cost-optimized routing uses cerebras/llama-3.1-70b (match template) templates/config/cost-optimized.yaml uses llama-3.1-70b in all three places (classification, triage model, compress_model). The wizard was emitting llama-3.3-70b. Align. Co-Authored-By: Rob <onerobby@gmail.com> * outreach + i18n: update skill count from 9 to 13 All 5 outreach drafts and both i18n READMEs referenced the old count of 9 skills. This PR added 4 new skills (daily-inbox-triage, hermes-weekly, spam-trap, meeting-prep) bringing the total to 13. Updated files: - README-zh.md, README-ja.md (count + skill name list) - docs/outreach/blog-post-long.md - docs/outreach/hacker-news-post.md (count + enumerated list) - docs/outreach/launch-tweet-thread.md - docs/outreach/nous-upstream-pr-body.md - docs/outreach/reddit-localllama.md (count + enumerated list) Co-Authored-By: Rob <onerobby@gmail.com> * fix: preserve integer type for Telegram allowed_user_ids Devin Review caught a red issue: quoting ${TELEGRAM_OWNER_ID} inside a flow sequence (e.g. ["${TELEGRAM_OWNER_ID}"]) makes the YAML valid but changes the parsed type from int to str after env-var substitution. Telegram user IDs are numeric and Hermes compares them with strict type matching, so a string-typed list would reject all messages. Switched all 4 templates + 2 reference architectures + the wizard generator to block-sequence style: allowed_user_ids: - ${TELEGRAM_OWNER_ID} Verified with PyYAML that post-substitution type is int across all 4 templates. Also: localized READMEs (zh + ja) now use 'sudo bash' to match the main README, since vps-bootstrap.sh requires root. Co-Authored-By: Rob <onerobby@gmail.com> * wizard: emit all providers referenced by persona routing rules Devin Review (red): the wizard previously emitted only the provider derived from the default model. But cost-optimized routing references cerebras, moonshot, and anthropic too — a wizard-generated config would fail at runtime when routing picked one of those. Refactored to a data-driven `EXTRA_PROVIDERS` map so each persona declares which providers its routing rules need. The generator then emits the union of (default-model provider, extra persona providers). - cost-optimized: anthropic, google, moonshot, cerebras - production: anthropic, google - security-hardened: anthropic (for the quarantine fallback) Also added cerebras to the providerKeys map (CEREBRAS_API_KEY). Co-Authored-By: Rob <onerobby@gmail.com> * fix: skills catalog + wizard lightrag provider coverage Two Devin Review findings addressed: 1. skills/README.md catalog listed only 9 skills; PR added 4 new ones (daily-inbox-triage, hermes-weekly, spam-trap, meeting-prep). Appended rows for all 4 so the catalog matches the 13-skill count now quoted in README / CHANGELOG / outreach docs. 2. Wizard generator: when memory=lightrag is selected, the generated config references google/gemini-2.5-flash (LLM) and openai/text-embedding-3-small (embedding), but the provider-emission set only accounted for the default-model provider + routing-rule providers. For 3 of 5 personas this produced broken configs with missing embedding provider credentials. Added a lightrag branch that injects google + openai into providersToEmit. Co-Authored-By: Rob <onerobby@gmail.com> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2 parents 1098306 + 6dea1d7 commit ca75386

32 files changed

Lines changed: 2181 additions & 19 deletions

.github/markdown-link-check.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"ignorePatterns": [
3+
{ "pattern": "^https://t.me/" },
4+
{ "pattern": "^https://example.com/" },
5+
{ "pattern": "^https://install.hermes.nous.ai" },
6+
{ "pattern": "^https://langfuse.yourdomain.com" },
7+
{ "pattern": "^https://hermes.yourdomain.com" },
8+
{ "pattern": "^https://hooks.yourdomain.com" },
9+
{ "pattern": "^http://localhost" },
10+
{ "pattern": "^http://127.0.0.1" }
11+
],
12+
"httpHeaders": [
13+
{
14+
"urls": ["https://github.com/", "https://raw.githubusercontent.com/"],
15+
"headers": { "User-Agent": "markdown-link-check" }
16+
}
17+
],
18+
"retryOn429": true,
19+
"retryCount": 3,
20+
"fallbackRetryDelay": "30s",
21+
"aliveStatusCodes": [200, 206, 429, 403]
22+
}

.github/scripts/validate_skills.py

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#!/usr/bin/env python3
2+
"""Validate every skills/**/SKILL.md has correct frontmatter.
3+
4+
Run via: python .github/scripts/validate_skills.py
5+
Exit code 0 = all pass; 1 = any fail. Each failing file is listed with reason.
6+
"""
7+
from __future__ import annotations
8+
9+
import pathlib
10+
import re
11+
import sys
12+
13+
import yaml
14+
15+
REQUIRED_KEYS = {"name", "description", "when_to_use", "toolsets"}
16+
ALLOWED_TOOLSETS = {
17+
"terminal",
18+
"file",
19+
"github",
20+
"delegate_task",
21+
"classify",
22+
"telegram",
23+
"web",
24+
"browser",
25+
"email",
26+
"discord",
27+
"slack",
28+
"memory",
29+
}
30+
31+
FRONTMATTER_RE = re.compile(r"^---\n(.*?)\n---", re.DOTALL)
32+
33+
34+
def extract_frontmatter(p: pathlib.Path) -> dict | None:
35+
text = p.read_text(encoding="utf-8")
36+
m = FRONTMATTER_RE.match(text)
37+
if not m:
38+
return None
39+
try:
40+
return yaml.safe_load(m.group(1)) or {}
41+
except yaml.YAMLError as e:
42+
print(f" yaml parse error: {e}")
43+
return None
44+
45+
46+
def validate(p: pathlib.Path) -> list[str]:
47+
errs: list[str] = []
48+
fm = extract_frontmatter(p)
49+
if fm is None:
50+
return ["missing or unparseable frontmatter"]
51+
52+
missing = REQUIRED_KEYS - set(fm.keys())
53+
if missing:
54+
errs.append(f"missing required keys: {sorted(missing)}")
55+
56+
toolsets = fm.get("toolsets", [])
57+
if not isinstance(toolsets, list):
58+
errs.append("toolsets must be a list")
59+
else:
60+
unknown = [t for t in toolsets if t not in ALLOWED_TOOLSETS]
61+
if unknown:
62+
errs.append(f"unknown toolsets: {unknown} (allowed: {sorted(ALLOWED_TOOLSETS)})")
63+
64+
when = fm.get("when_to_use", [])
65+
if not isinstance(when, list) or not when:
66+
errs.append("when_to_use must be a non-empty list of triggers")
67+
68+
desc = fm.get("description", "")
69+
if not isinstance(desc, str) or len(desc) < 10:
70+
errs.append("description must be a >=10-char string")
71+
72+
return errs
73+
74+
75+
def main() -> int:
76+
root = pathlib.Path(__file__).resolve().parents[2] / "skills"
77+
if not root.is_dir():
78+
print(f"::error::no skills/ dir at {root}")
79+
return 1
80+
81+
skills = sorted(root.rglob("SKILL.md"))
82+
if not skills:
83+
print(f"::warning::no SKILL.md files found under {root}")
84+
return 0
85+
86+
total_fails = 0
87+
for p in skills:
88+
rel = p.relative_to(root.parent)
89+
errs = validate(p)
90+
if errs:
91+
total_fails += 1
92+
print(f"::error file={rel}::{'; '.join(errs)}")
93+
else:
94+
print(f"ok {rel}")
95+
96+
if total_fails:
97+
print(f"\n{total_fails}/{len(skills)} skill(s) failed validation", file=sys.stderr)
98+
return 1
99+
100+
print(f"\nAll {len(skills)} skill(s) passed.")
101+
return 0
102+
103+
104+
if __name__ == "__main__":
105+
sys.exit(main())

.github/workflows/ci.yml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
jobs:
10+
markdown-links:
11+
name: markdown-link-check
12+
runs-on: ubuntu-latest
13+
steps:
14+
- uses: actions/checkout@v4
15+
- name: Check markdown links
16+
uses: gaurav-nelson/github-action-markdown-link-check@v1
17+
with:
18+
config-file: '.github/markdown-link-check.json'
19+
folder-path: '.'
20+
use-quiet-mode: 'yes'
21+
check-modified-files-only: 'yes'
22+
base-branch: 'main'
23+
24+
yaml-lint:
25+
name: yamllint
26+
runs-on: ubuntu-latest
27+
steps:
28+
- uses: actions/checkout@v4
29+
- name: Install yamllint
30+
run: pip install yamllint
31+
- name: Run yamllint
32+
run: yamllint -c .github/yamllint.yml templates/ benchmarks/ skills/
33+
34+
skill-frontmatter:
35+
name: skill frontmatter
36+
runs-on: ubuntu-latest
37+
steps:
38+
- uses: actions/checkout@v4
39+
- uses: actions/setup-python@v5
40+
with:
41+
python-version: '3.11'
42+
- name: Install deps
43+
run: pip install pyyaml
44+
- name: Validate every SKILL.md frontmatter
45+
run: python .github/scripts/validate_skills.py
46+
47+
prettier-check:
48+
name: prettier (soft)
49+
runs-on: ubuntu-latest
50+
continue-on-error: true
51+
steps:
52+
- uses: actions/checkout@v4
53+
- name: Prettier check (advisory only)
54+
run: npx -y prettier --check "**/*.md" || echo "::warning::prettier formatting drift (non-blocking)"

.github/yamllint.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
extends: default
2+
3+
# Goal: catch real syntax errors in template YAMLs, not formatting nits.
4+
# Templates often align values / use flow-mapping shorthand for cron/approval rules;
5+
# those are legit, so we relax those rules.
6+
7+
rules:
8+
line-length: disable
9+
document-start: disable
10+
comments: disable
11+
comments-indentation: disable
12+
colons: disable
13+
commas: disable
14+
indentation: disable
15+
truthy:
16+
allowed-values: ['true', 'false', 'on', 'off', 'yes', 'no']
17+
check-keys: false
18+
braces:
19+
max-spaces-inside: 2
20+
brackets:
21+
max-spaces-inside: 2
22+
23+
ignore: |
24+
node_modules/
25+
.venv/
26+
templates/compose/.env.langfuse.example

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@
22

33
Dated list of meaningful guide updates. Roughly [Keep a Changelog](https://keepachangelog.com) flavored.
44

5+
## 2026-04-17 — Wizard + Reference Architectures + CI
6+
7+
### Added
8+
- **`docs/wizard/index.html`** — interactive static config wizard; 8 questions → ready-to-drop `config.yaml`, runs entirely in the browser (GitHub Pages friendly)
9+
- **`docs/reference-architectures/`** — 4 full blueprints: Homelab, Solo Developer, Small Agency, Road Warrior
10+
- **`docs/outreach/`** — launch-ready drafts: launch tweet thread, Hacker News post, r/LocalLLaMA post, upstream PR body to `NousResearch/hermes-agent`, long-form blog post
11+
- **4 new skills**: `ops/daily-inbox-triage`, `ops/hermes-weekly`, `security/spam-trap`, `dev/meeting-prep` (total skills: 13)
12+
- **CI**`.github/workflows/ci.yml`: markdown-link-check, yamllint, skill-frontmatter validator (`validate_skills.py`), prettier advisory
13+
- **Localized READMEs**[`README-zh.md`](./README-zh.md), [`README-ja.md`](./README-ja.md) (entry-level summaries)
14+
15+
### Changed
16+
- README: skills badge 9→13, language links, repo map rows for wizard + reference architectures + outreach, CI badge
17+
- `templates/config/*.yaml` — quoted `${VAR}` env-var substitutions inside flow mappings so every template is valid YAML
18+
519
## 2026-04-17 — Installable Artifacts
620

721
### Added

README-ja.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Hermes 最適化ガイド(日本語ショート版)
2+
3+
> [英語版はこちら](./README.md) · このページは入口の要約。本文の章は英語のまま。
4+
5+
[NousResearch/hermes-agent](https://github.com/NousResearch/hermes-agent)(v0.10.0+)向けの実戦ガイド + インストール可能な成果物(Skills・設定テンプレ・インフラスクリプト)。
6+
7+
## ワンコマンドで起動
8+
9+
```bash
10+
# 新しい Debian 12 / Ubuntu 24.04 VPS で実行
11+
curl -sSL https://raw.githubusercontent.com/OnlyTerp/hermes-optimization-guide/main/scripts/vps-bootstrap.sh | sudo bash
12+
```
13+
14+
もしくは [docs/quickstart.md](./docs/quickstart.md)(5 分で Telegram Bot)を参照。
15+
16+
## 主なコンテンツ
17+
18+
- **21 章の本文**`part1``part21`) — LightRAG、Telegram、MCP、セキュリティ、可観測性、リモートサンドボックス
19+
- **13 個のインストール可能 Skill**`skills/`) — 監査、バックアップ、依存スキャン、コストレポート、Telegram トリアージ、PR レビュー、受信トレイ整理、Hermes 週報、スパムフィルタ、会議準備 など
20+
- **5 つのプロダクション設定テンプレ**`templates/config/`) — minimum / telegram-bot / production / cost-optimized / security-hardened
21+
- **インフラ一式**`templates/compose/`, `templates/caddy/`, `templates/systemd/`, `scripts/`) — Langfuse セルフホスト、Caddy リバースプロキシ、systemd 強化、VPS ブートストラップ
22+
- **Mermaid アーキテクチャ図**`diagrams/`
23+
- **再現可能なベンチマーク**`benchmarks/`) — 12 モデル × 5 タスク、手法込み
24+
- **エコシステム目録**[`ECOSYSTEM.md`](./ECOSYSTEM.md)) — MCP サーバ、コーディングエージェント、ダッシュボード拡張
25+
- **対話式設定ウィザード**[`docs/wizard/`](./docs/wizard/)) — ブラウザ内で `config.yaml` を生成
26+
27+
## 読む順番の目安
28+
29+
1. 最速で Telegram Bot を動かしたい → [docs/quickstart.md](./docs/quickstart.md)
30+
2. アーキテクチャを把握したい → [diagrams/architecture.md](./diagrams/architecture.md)
31+
3. コストを下げたい → [part20-observability.md](./part20-observability.md) の "Cost-routing playbook"
32+
4. 本番運用したい → [docs/reference-architectures/](./docs/reference-architectures/) から近いものを選ぶ
33+
5. 公開エンドポイント → [part19-security-playbook.md](./part19-security-playbook.md) を必ず読む
34+
35+
## ライセンス・貢献
36+
37+
MIT。Issue / PR 歓迎。[CONTRIBUTING.md](./CONTRIBUTING.md) を参照。

README-zh.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Hermes 优化指南(中文简版)
2+
3+
> [English 完整版](./README.md) · 本页是入口摘要,章节正文仍为英文。
4+
5+
实用指南 + 可安装制品(Skills、配置模板、基础设施脚本),针对 [NousResearch/hermes-agent](https://github.com/NousResearch/hermes-agent)(v0.10.0+)。
6+
7+
## 一键起步
8+
9+
```bash
10+
# 新建 Debian 12 / Ubuntu 24.04 VPS 上运行
11+
curl -sSL https://raw.githubusercontent.com/OnlyTerp/hermes-optimization-guide/main/scripts/vps-bootstrap.sh | sudo bash
12+
```
13+
14+
或阅读 [docs/quickstart.md](./docs/quickstart.md)(5 分钟 Telegram 机器人)。
15+
16+
## 内容一览
17+
18+
- **21 章中文正文**(见 `part1``part21`) — LightRAG、Telegram、MCP、安全、可观测性、远程沙箱
19+
- **13 个可安装 Skill**`skills/`) — 审计、备份、依赖扫描、成本报告、Telegram 分类、PR 审查、收件箱分类、Hermes 周报、垃圾过滤、会议准备 等
20+
- **5 套生产配置模板**`templates/config/`) — minimum / telegram-bot / production / cost-optimized / security-hardened
21+
- **基础设施**`templates/compose/`, `templates/caddy/`, `templates/systemd/`, `scripts/`) — Langfuse 自托管、Caddy 反代、systemd 硬化、VPS 引导脚本
22+
- **Mermaid 架构图**`diagrams/`
23+
- **可复现基准测试**`benchmarks/`) — 12 个模型 × 5 个任务,含方法论
24+
- **生态目录**[`ECOSYSTEM.md`](./ECOSYSTEM.md)) — MCP 服务器、编码代理、仪表板插件
25+
- **交互式配置向导**[`docs/wizard/`](./docs/wizard/)) — 浏览器内生成 `config.yaml`
26+
27+
## 推荐阅读顺序
28+
29+
1. 想最快跑通 Telegram 机器人 → [docs/quickstart.md](./docs/quickstart.md)
30+
2. 想了解架构 → [diagrams/architecture.md](./diagrams/architecture.md)
31+
3. 想省钱 → [part20-observability.md](./part20-observability.md) 的 "Cost-routing playbook"
32+
4. 想上生产 → [docs/reference-architectures/](./docs/reference-architectures/) 选一个最接近的
33+
5. 用户面公开部署 → [part19-security-playbook.md](./part19-security-playbook.md) 必看
34+
35+
## 许可与贡献
36+
37+
MIT。欢迎 Issue / PR,详见 [CONTRIBUTING.md](./CONTRIBUTING.md)

README.md

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
[![Hermes](https://img.shields.io/badge/Hermes-v0.10.0%20%28main%29-9146FF)](https://github.com/NousResearch/hermes-agent)
55
[![Last updated](https://img.shields.io/badge/Last%20updated-2026--04--17-brightgreen)](./CHANGELOG.md)
66
[![Parts](https://img.shields.io/badge/parts-21-blue)](#table-of-contents)
7-
[![Skills](https://img.shields.io/badge/installable%20skills-9-blue)](./skills/)
7+
[![Skills](https://img.shields.io/badge/installable%20skills-13-blue)](./skills/)
88
[![Configs](https://img.shields.io/badge/config%20templates-5-blue)](./templates/config/)
9+
[![CI](https://github.com/OnlyTerp/hermes-optimization-guide/actions/workflows/ci.yml/badge.svg)](./.github/workflows/ci.yml)
910
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](./CONTRIBUTING.md)
1011

11-
> **Tested on Hermes Agent v0.10.0 (v2026.4.16)** with post-release tracking for `main` · **21 parts, 9 installable skills, 5 opinionated configs, one-command VPS bootstrap** · Battle-tested on a live production deployment
12+
> **Tested on Hermes Agent v0.10.0 (v2026.4.16)** with post-release tracking for `main` · **21 parts, 13 installable skills, 5 opinionated configs, 4 reference architectures, one-command VPS bootstrap** · Battle-tested on a live production deployment
13+
>
14+
> Other languages: [中文](./README-zh.md) · [日本語](./README-ja.md)
1215
1316
### The End-to-End Hermes Guide — docs + runnable artifacts
1417
Every part you need to go from fresh install to a production Hermes deployment that talks on 16 platforms, orchestrates Claude Code / Codex / Gemini CLI, plugs into any MCP server, traces every call in Langfuse, and runs heavy work on disposable Modal/Daytona sandboxes — without burning $100/day on Opus tokens.
@@ -37,7 +40,7 @@ Prefer a 5-minute local-only setup? → **[docs/quickstart.md](./docs/quickstart
3740

3841
| Folder | What's in it |
3942
|---|---|
40-
| [`skills/`](./skills) | **9 installable `SKILL.md`** files. `ln -s` into `~/.hermes/skills/` and they're live. |
43+
| [`skills/`](./skills) | **13 installable `SKILL.md`** files. `ln -s` into `~/.hermes/skills/` and they're live. |
4144
| [`templates/config/`](./templates/config) | **5 opinionated `config.yaml`** — minimum, telegram-bot, production, cost-optimized, security-hardened. |
4245
| [`templates/compose/`](./templates/compose) | Self-hosted Langfuse v3 stack (ClickHouse + MinIO + Redis). |
4346
| [`templates/caddy/`](./templates/caddy) | Caddyfile reference (reverse proxy + auto TLS + HSTS). |
@@ -46,6 +49,9 @@ Prefer a 5-minute local-only setup? → **[docs/quickstart.md](./docs/quickstart
4649
| [`scripts/vps-bootstrap.sh`](./scripts/vps-bootstrap.sh) | One-command fresh VPS → production Hermes. |
4750
| [`diagrams/`](./diagrams) | 6 Mermaid diagrams (architecture, MCP flow, delegation, sandbox sync, observability, security layers). |
4851
| [`benchmarks/`](./benchmarks) | Reproducible cost + latency table across 12 models × 5 tasks. |
52+
| [`docs/wizard/`](./docs/wizard) | **Interactive config wizard** — 8 questions → ready-to-drop `config.yaml`. Runs in your browser. |
53+
| [`docs/reference-architectures/`](./docs/reference-architectures) | **4 blueprints** — Homelab, Solo Dev, Small Agency, Road Warrior. Full parts list + cost + install. |
54+
| [`docs/outreach/`](./docs/outreach) | Launch tweet, HN post, upstream-PR body drafts (for people linking to this guide). |
4955
| [`docs/quickstart.md`](./docs/quickstart.md) | 5-minute zero-to-Telegram-bot. |
5056
| [`ECOSYSTEM.md`](./ECOSYSTEM.md) | Curated directory of MCP servers, coding agents, dashboard plugins. |
5157
| [`ROADMAP.md`](./ROADMAP.md) · [`CHANGELOG.md`](./CHANGELOG.md) · [`CONTRIBUTING.md`](./CONTRIBUTING.md) | The usual suspects. |

ROADMAP.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,17 @@ What's landing next. PRs welcome.
44

55
## In progress
66

7-
- [ ] **Interactive config wizard** — a static page that asks 8 questions and emits a `config.yaml` + systemd unit. Hosted via GitHub Pages.
87
- [ ] **GitHub Pages docs site** — Astro Starlight with full-text search across all parts + skills.
98
- [ ] **Asciinema cast** — 60-second "zero to working Telegram bot" recording embedded in the README.
109
- [ ] **Langfuse dashboard JSON** — importable ready-made dashboard for Hermes traces.
10+
- [ ] **Upstream PR** to `NousResearch/hermes-agent` README — add Community Guides section (draft in `docs/outreach/nous-upstream-pr-body.md`).
1111

1212
## Queued
1313

1414
- [ ] **Skill templates**`hermes skills new <name>` scaffolding generator
15-
- [ ] **Reference architectures** — homelab / single-user SaaS / small-team / agency, each with every file needed
16-
- [ ] **Integration tests** — GitHub Actions job that lints every SKILL.md frontmatter + validates YAML configs
17-
- [ ] **Cross-link checker** — CI check that fails if any `[...](./...)` link 404s
18-
- [ ] **Translations** — Chinese + Japanese (large Hermes user base in both communities per v0.9 release notes)
19-
- [ ] **"Hermes Weekly"** — markdown-first week-in-review section auto-generated from Hermes-agent merged PRs
15+
- [ ] **Cross-link checker** — CI check that fails if any `[...](./...)` link 404s (partial: markdown-link-check on modified files is live)
2016
- [ ] **Security CVE feed**`.github/workflows/cve-watch.yml` that monitors OSV for relevant advisories
17+
- [ ] **Dashboard screenshots pass** — embed actual screens in parts 12 / 17 / 20
2118

2219
## Under consideration
2320

@@ -27,6 +24,11 @@ What's landing next. PRs welcome.
2724

2825
## Done (recent)
2926

27+
- ✅ 2026-04-17 — Interactive config wizard (`docs/wizard/`)
28+
- ✅ 2026-04-17 — 4 reference architectures (homelab / solo-dev / small-agency / road-warrior)
29+
- ✅ 2026-04-17 — CI (markdown-link-check + yamllint + skill frontmatter validator)
30+
- ✅ 2026-04-17 — Chinese + Japanese README entry pages
31+
- ✅ 2026-04-17 — Outreach drafts (tweet, HN, Reddit, upstream PR, blog post)
3032
- ✅ 2026-04-17 — Installable skill library + templates + bootstrap script
3133
- ✅ 2026-04-17 — MCP / coding-agent / security / observability / sandbox parts (17–21)
3234
- ✅ 2026-04-16 — v0.9 + v0.10 refresh (parts 12–16)

docs/outreach/README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Outreach Drafts
2+
3+
Copy-ready materials for announcing / linking / promoting the guide. Keep these **out** of `README.md` — they're for posting, not for the repo front.
4+
5+
- [`launch-tweet-thread.md`](./launch-tweet-thread.md) — X/Twitter launch thread, 8 tweets
6+
- [`hacker-news-post.md`](./hacker-news-post.md) — HN "Show HN" post + self-comment
7+
- [`reddit-localllama.md`](./reddit-localllama.md) — r/LocalLLaMA post
8+
- [`nous-upstream-pr-body.md`](./nous-upstream-pr-body.md) — body for a PR to `NousResearch/hermes-agent` README
9+
- [`blog-post-long.md`](./blog-post-long.md) — long-form blog post / Substack draft
10+
11+
All drafts are **suggestions**. Fork the tone to yours before posting.

0 commit comments

Comments
 (0)