202 lines
5.9 KiB
Python
202 lines
5.9 KiB
Python
"""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. 标记需要后续呼应的伏笔
|
||
|
||
## 验收
|
||
- [ ] 初稿完成
|
||
- [ ] 字数达标
|
||
- [ ] 剧情连贯性检查通过
|
||
""",
|
||
},
|
||
]
|