Skip to content

feat: config wizard + 4 reference architectures + CI + outreach drafts + 4 new skills + i18n#8

Merged
OnlyTerp merged 9 commits intomainfrom
devin/1776401488-phase4
Apr 17, 2026
Merged

feat: config wizard + 4 reference architectures + CI + outreach drafts + 4 new skills + i18n#8
OnlyTerp merged 9 commits intomainfrom
devin/1776401488-phase4

Conversation

@OnlyTerp
Copy link
Copy Markdown
Owner

@OnlyTerp OnlyTerp commented Apr 17, 2026

Summary

Phase 4: highest-leverage follow-ups after PR #7. Moves the guide from comprehensive to canonical by adding an interactive config wizard, four detailed reference architectures, CI that actually enforces repo quality, launch-ready outreach drafts, four more installable skills, and entry-level localized READMEs in Chinese and Japanese.

Everything is still zero-dep / no-frameworks: the wizard is a single static HTML file, CI uses off-the-shelf actions plus one small Python validator, localized READMEs are just markdown.

Type

  • Docs / content update
  • New skill (skills/)
  • New config template (templates/config/) — only fixed quoting
  • Benchmark addition
  • Ecosystem entry
  • Infra template (.github/workflows/ci.yml, validator script)
  • Fix / typo / link

What landed

Interactive config wizard — docs/wizard/

Static HTML page, no frameworks. 8 questions (persona, default model, memory backend, gateways, MCP servers, approval layer, observability, cron tasks) → ready-to-drop config.yaml. copyYAML() and downloadYAML() helpers. Runs entirely in the browser; nothing uploaded anywhere. GitHub Pages friendly once enabled.

4 reference architectures — docs/reference-architectures/

Every blueprint has: who it's for, full parts list, install commands, full config.yaml, expected cost/month, scaling ceilings, graduation triggers.

  • homelab.md — privacy-first, on your own hardware, Tailscale mesh, Ollama, ~$0 infra
  • solo-developer.md — VPS + Telegram bot, cost-routed defaults, ~$25–70/mo
  • small-agency.md — 2–6 devs, per-client isolation via templated hermes@<name>.service units, compliance-friendly
  • road-warrior.md — phone-drives-cloud, Modal/Daytona/Fly on-demand, tar-pipe sync from Part 21

CI — .github/workflows/ci.yml

  • markdown-link-check on changed *.md (with .github/markdown-link-check.json allowlisting localhost / dynamic subdomains / example.com)
  • yamllint with a relaxed config (.github/yamllint.yml) that only catches real breakage, not formatting nits
  • validate_skills.py — every SKILL.md must have a valid YAML frontmatter with name, description (≥10 chars), non-empty when_to_use, and toolsets from a known whitelist
  • prettier --check advisory pass (non-blocking) to hint at drift

Ran locally before pushing: all 13 skills pass, yamllint clean.

Outreach drafts — docs/outreach/

Copy for Rob to fire off after this merges. Zero posted without approval.

  • launch-tweet-thread.md — 8-tweet thread + reply-suggestions, receipts-forward, no hype
  • hacker-news-post.md — Show HN title + first self-comment
  • reddit-localllama.md — homelab-angled post
  • nous-upstream-pr-body.mdRob should open this, not me. Proposes a small "Community Guides" (plural) section in the Nous README. Designed to be low-review-burden and leave the door open for other guides to follow.
  • blog-post-long.md — ~1500-word dev.to / Substack format

4 new skills (total 13)

  • ops/daily-inbox-triage — morning sweep across email + Slack + Telegram DMs with classify + draft-reply + approval routing. Gemini Flash by default.
  • ops/hermes-weekly — Friday digest of NousResearch/hermes-agent merged PRs, classified (feature / fix / breaking / chore), ready to pipe to Telegram.
  • security/spam-trap — first-line untrusted-input filter for public channels. Cerebras Llama. Classifies GENUINE / SPAM / INJECTION / AMBIGUOUS and routes ambiguous to a quarantine profile.
  • dev/meeting-prep — 15-min-before-meeting 1-page brief. Pulls calendar + last threads + memory.

i18n — README-zh.md, README-ja.md

Entry-level summaries (the 21 parts themselves stay English). Large Hermes user bases in both communities per the v0.9 release notes. Links from the top of the main README.

Template YAML quoting fix

templates/config/{production,cost-optimized,security-hardened,telegram-bot}.yaml had unquoted ${VAR} substitutions inside flow mappings. yamllint flagged them; now quoted so every template is valid YAML as-is.

README

  • Skills badge 9 → 13
  • New CI badge
  • Language links row
  • Repo-map rows for docs/wizard/, docs/reference-architectures/, docs/outreach/

CHANGELOG + ROADMAP

Updated. The roadmap items "Interactive config wizard", "Reference architectures", "Integration tests", "Translations", "Hermes Weekly" moved from Queued → Done.

Checklist

  • Cross-links are relative (./partN-foo.md) and resolve
  • No secrets in any example — ${VAR} placeholders only
  • Dates / prices / PR numbers are current (marked 2026-04-17 where relevant)
  • For skills: security notes included; trust: posture documented (new skills explicitly set trust: untrusted where applicable and route risky actions through approval)
  • For templates: every non-obvious field is commented
  • CHANGELOG.md updated

After this merges

Things I am not doing without explicit approval:

  • Opening the upstream PR to NousResearch/hermes-agent (that draft is yours to send)
  • Posting to Twitter / HN / Reddit (all drafts are yours to post)

Things still queued on the ROADMAP: Astro Starlight docs site with full-text search, asciinema cast, Langfuse dashboard JSON export, dashboard-screenshots pass on parts 12/17/20.

Link to Devin session: https://app.devin.ai/sessions/42780dee7d0d4798b1910200a1f7280d
Requested by: @OnlyTerp


Open with Devin

… 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>
@devin-ai-integration
Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

devin-ai-integration[bot]

This comment was marked as resolved.

…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>
devin-ai-integration[bot]

This comment was marked as resolved.

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>
devin-ai-integration[bot]

This comment was marked as resolved.

…plate)

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>
devin-ai-integration[bot]

This comment was marked as resolved.

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>
devin-ai-integration[bot]

This comment was marked as resolved.

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>
devin-ai-integration[bot]

This comment was marked as resolved.

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>
devin-ai-integration[bot]

This comment was marked as resolved.

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>
@OnlyTerp OnlyTerp merged commit ca75386 into main Apr 17, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant