"""Configuration for hermes-dashboard. All values can be overridden via environment variables (HERMES_DASHBOARD_* prefix). """ import os from typing import TypedDict BASE_DIR = os.path.dirname(os.path.abspath(__file__)) # Database paths KANBAN_DB_PATH = os.environ.get( "HERMES_DASHBOARD_KANBAN_DB", "/home/yi/.hermes/kanban.db" ) # Gitea configuration GITEA_API_URL = os.environ.get("HERMES_DASHBOARD_GITEA_URL", "http://localhost:3000/api/v1") GITEA_TOKEN_PATH = os.environ.get( "HERMES_DASHBOARD_GITEA_TOKEN_PATH", "/home/yi/gitea/.admin_token" ) # Worker SOUL.md path SOUL_MD_PATH = os.environ.get( "HERMES_DASHBOARD_SOUL_MD", "/home/yi/.hermes/profiles/omo-pm/SOUL.md" ) # Config file paths OPENCODE_CONFIG_PATH = "/home/yi/.config/opencode/opencode.jsonc" OMO_CONFIG_PATH = "/home/yi/.omo/omo.jsonc" # Server port PORT = int(os.environ.get("HERMES_DASHBOARD_PORT", "8092")) # Flask secret key SECRET_KEY = os.environ.get("FLASK_SECRET_KEY", "dev-hermes-dashboard-secret-change-me") class ProjectConfig(TypedDict): """Type definition for managed project configuration.""" name: str path: str gitea_repo: str # Managed projects to monitor MANAGED_PROJECTS: list[ProjectConfig] = [ {"name": "blog-app", "path": "/home/yi/opencode-blog-showcase/blog-app", "gitea_repo": "blog-app"}, {"name": "novel-app", "path": "/home/yi/novel-workspace/novel-app", "gitea_repo": "novel-app"}, {"name": "hermes-dashboard", "path": "/home/yi/hermes-dashboard", "gitea_repo": "hermes-dashboard"}, {"name": "omo-openagent", "path": "/home/yi/.cache/opencode/packages/oh-my-openagent@latest", "gitea_repo": "omo-openagent-config"}, {"name": "omo-config", "path": "/home/yi/.config/opencode", "gitea_repo": "omo-config"}, ] # Dispatch templates for kanban task creation DISPATCH_TEMPLATES: list[dict] = [ { "name": "fix-csrf-blog-app", "description": "修复 blog-app 的 CSRF token 验证问题", "default_body": """## 背景 blog-app 在 POST 请求时 CSRF token 验证失败,导致用户无法提交表单。 需要检查 token 生成和验证逻辑是否一致。 ## 任务 1. 检查 `security.py` 中 `validate_csrf()` 的实现 2. 确认前端表单是否正确传递 `csrf_token` 字段 3. 检查 session 配置是否正确 4. 添加单元测试覆盖 CSRF 场景 ## 验收 - [ ] POST 请求能正常通过 CSRF 验证 - [ ] 无效 token 返回 403 - [ ] 测试覆盖率 > 80% """, }, { "name": "refactor-module", "description": "重构指定模块,提升代码质量和可维护性", "default_body": """## 背景 目标模块代码复杂度高,需要重构以降低维护成本。 当前存在重复逻辑、过长函数、缺少类型注解等问题。 ## 任务 1. 分析模块依赖关系,画出调用图 2. 提取公共逻辑到 utils/helper 模块 3. 添加完整的类型注解和 docstring 4. 拆分超过 250 行的函数 5. 确保所有现有测试通过 ## 验收 - [ ] 无函数超过 250 行 - [ ] 所有函数有类型注解 - [ ] 现有测试全部通过 - [ ] 代码审查通过 """, }, { "name": "research-npm-package", "description": "调研 npm 包的功能、API 和集成方案", "default_body": """## 背景 需要评估目标 npm 包是否适合集成到当前项目。 重点关注 API 设计、bundle size、维护状态。 ## 任务 1. 查阅官方文档,总结核心 API 2. 检查 GitHub 仓库:star 数、最近提交、issue 处理速度 3. 对比同类替代方案(至少 2 个) 4. 写一个最小集成 demo 5. 记录潜在的 breaking changes 风险 ## 验收 - [ ] 输出调研报告(Markdown 格式) - [ ] 包含 API 示例代码 - [ ] 明确推荐/不推荐及理由 - [ ] demo 可运行 """, }, { "name": "fix-omo-task", "description": "修复 omo-pm worker 任务执行异常", "default_body": """## 背景 omo-pm 在执行某类任务时出现异常退出或结果不符合预期。 需要排查 worker 日志和任务状态。 ## 任务 1. 查看 `~/.hermes/logs/` 下相关日志 2. 检查 kanban.db 中失败任务的 status 和 result 字段 3. 复现问题场景 4. 定位根因并修复 5. 添加回归测试 ## 验收 - [ ] 问题任务能正常完成 - [ ] 日志无异常堆栈 - [ ] 回归测试通过 """, }, { "name": "daily-blog-post", "description": "生成并发布每日博客文章", "default_body": """## 背景 每日博客更新任务,需要生成一篇高质量文章并发布到 blog-app。 ## 任务 1. 从主题列表选择一个话题 2. 撰写文章(800-1500 字) 3. 生成配图(如有需要) 4. 通过 blog-app API 发布 5. 验证文章页面可访问 ## 验收 - [ ] 文章已发布且可访问 - [ ] 无错别字和格式问题 - [ ] 标签分类正确 """, }, { "name": "security-audit", "description": "对项目进行安全审计,检查常见漏洞", "default_body": """## 背景 定期安全审计,确保项目没有明显的安全漏洞。 重点关注 OWASP Top 10 中的常见风险。 ## 任务 1. 检查 SQL 注入风险(参数化查询) 2. 检查 XSS 风险(输出编码) 3. 检查认证/授权逻辑 4. 检查敏感信息泄露(日志、错误信息) 5. 检查依赖包已知漏洞 6. 输出安全审计报告 ## 验收 - [ ] 审计报告包含发现和建议 - [ ] 高危问题已修复 - [ ] 中低危问题有修复计划 """, }, { "name": "novel-chapter-draft", "description": "起草小说新章节", "default_body": """## 背景 继续小说创作,完成新章节的初稿。 需要保持与前文风格一致,推进剧情发展。 ## 任务 1. 回顾上一章内容和伏笔 2. 规划本章剧情节点 3. 撰写初稿(3000-5000 字) 4. 检查人物对话是否符合人设 5. 标记需要后续呼应的伏笔 ## 验收 - [ ] 初稿完成 - [ ] 字数达标 - [ ] 剧情连贯性检查通过 """, }, ]