Files
cryptoHermes/AGENTS.md
dela cc7f5a4f32 feat: 初始化 cryptoHermes 行情网关 v1 MVP + harness 工程文档
Binance USDⓈ-M Futures 行情网关,给上游 Hermes 量化分析引擎提供单一聚合
接口 /v1/market/context(K 线 + funding + OI + 多空比 + taker volume)。
只读公共行情,不下单、不接私钥、不查账户。

## v1 实现范围(Milestone 1-5)

- Clean Architecture 4 层(controller/usecase/repo/entity),接口边界在
  internal/usecase/ports.go
- Binance Futures REST client(K 线 / ticker24h / funding / OI / 多空比
  / taker volume 共 9 个接口),全链路 string 价格避免 float64 精度问题
- TimescaleDB 5 张 hypertable(market_klines / funding_rates /
  open_interest / long_short_ratio / taker_buy_sell_volume),主键含
  时间维度,UpsertMany 幂等
- robfig/cron 定时采集(15m/1h/4h/1d/1w 多周期 K 线 + 衍生品 15 分钟
  落库),未收线 K 线 (close_time > now) 由 mapper/repo 双重过滤
- pkg/httpclient 统一限流(默认 20 req/s, burst 40)+ 重试,避免触发
  Binance 2400 weight/min IP 上限
- /v1/market/context 聚合接口:errgroup 并发拉 snapshot/funding/OI,DB
  K 线不足 200 根回源 Binance 异步补
- cmd/backfill CLI 支持指定 from/to 大段回填(Binance 历史 OI / 多空比
  官方只保留 30 天,必须自己存)
- Docker Compose + Makefile + golang-migrate,本地一键启

技术指标(support/resistance/Vegas/箱体)留待 v2,技术段返回空对象 +
warning 占位。

## Harness 工程文档

- AGENTS.md — AI agent 工作速查(10 个章节)
- ai/project-map.md — 仓库结构、扩展点、控制流
- ai/risk-guardrails.md — G1-G10 守卫规则(每条带可机械验证命令)
- ai/adr/0001-architecture-foundations.md — 9 条架构基础决策
- ai/task-templates.md — 6 种任务契约模板
- ai/harness-health.md — 当前 harness 健康度评估

3 个 grep 守卫已验证通过:controller / usecase 无具体实现依赖,全项目
无私钥/签名字段。
2026-05-24 17:20:51 +08:00

157 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# AGENTS.md — cryptoHermes 操作指南
本文件是 AI 编码代理在此仓库工作的最小操作手册。完整项目设计见 `docs/dev.md`,用户向文档见 `README.md`
---
## 1. 项目定位(必读,决定可做与不可做)
cryptoHermes 是给上游 Hermes 量化分析引擎用的 **Binance Futures 行情网关**
**只做**
- 从 Binance USDⓈ-M Futures 公共接口拉行情、衍生品数据
- 落库到 TimescaleDB
- 通过 REST 把聚合后的市场上下文给 Hermes
**绝不做**(详见 `ai/risk-guardrails.md`
- 下单、撤单、查持仓
- 接入 API Key / Secret
- 任何账户级私有接口(签名请求)
- 钱包、托管、转账
- WebSocket 推送v1 范围外)
---
## 2. 当前状态
- v1 MVP 已完成Milestone 1-5可启动、可采集、可返回完整 `/v1/market/context`
- Technical 指标计算Milestone 6留待 v2
- 详细路线图见 `docs/dev.md` 第 19 章和 README "路线图"段
---
## 3. 技术栈
| 类别 | 选型 |
|---|---|
| Go | 1.23(见 `go.mod` |
| HTTP | Fiber v2 |
| DB | TimescaleDB on PG 16 |
| DB Driver | pgx v5 (pgxpool) |
| Scheduler | robfig/cron v3 |
| Config | cleanenvyaml + env |
| 限流 | `golang.org/x/time/rate` |
| Migration | golang-migrate CLI |
为什么是这套选型见 `ai/adr/0001-architecture-foundations.md`
---
## 4. 仓库结构(参见 `ai/project-map.md`
```
cmd/ 二进制入口app / backfill
config/ cleanenv 配置加载
internal/ 业务代码(不可被外部 import
app/ 装配 DI、cron、graceful shutdown
controller/ Fiber 路由层
entity/ 纯业务实体
usecase/ 业务接口与编排ports.go 是接口边界)
repo/ 外部依赖实现
webapi/binance/ Binance HTTP client
persistent/postgres/ 5 个 repository
worker/ collector 实现
migrations/ SQL含 hypertable 转换)
pkg/ 项目内可复用基础设施logger/httpclient/postgres
docs/ 设计文档
ai/ harness 工程文档(本目录及子目录)
```
---
## 5. 验证命令(必做:改完代码至少跑前两个)
```bash
# 编译(最快反馈)
go build ./...
# 静态分析
go vet ./...
# 单包测试
go test ./internal/<pkg>/...
# 全部测试
make test # 等价于 go test ./...
# 启动(需要先 make docker-up && make migrate-up
make run
```
**触碰 binance/mapper.go 或 entity/kline.go 之后**:必须确保对接 `Binance K线数组按下标解析` 的代码不被破坏dev.md 第 9.2 节)。
**触碰任何 SQL migration 后**:本地必须重跑 `make migrate-down && make migrate-up` 验证 down/up 互逆。
---
## 6. Clean Architecture 边界(自动可验证)
```bash
# controller 不可直接 import binance/postgres
grep -r "repo/webapi/binance\|repo/persistent" internal/controller # 必须无输出
# usecase 不可直接 import binance/postgres
grep -r "repo/webapi/binance\|repo/persistent" internal/usecase # 必须无输出
# 全项目不可出现签名 / 私钥相关字段
grep -ri "apikey\|x-mbx-apikey\|hmac\|secret_key\|api_secret" --include="*.go" . # 必须无输出(不算注释/文档里的"不接入"说明)
```
任何 PR 都应该满足以上三条。
---
## 7. 关键技术约束(容易犯错)
1. **价格精度**:全链路用 `string`,落库时由 PG 转 `NUMERIC(36,18)`。**禁止用 `float64` 存储或传递价格、成交量**。
2. **K线未收线丢弃**:从 Binance 拉到的最新一根 K 线如果 `close_time > now()` 就不能入库。Repo 的 `UpsertMany` 会过滤 `IsClosed=false`,新代码也必须遵守。
3. **Binance 历史 OI / 多空比官方只保留 30 天**:必须依赖 collector 持续落库才能拿到长历史。
4. **Rate limit**:默认 20 req/s`config.Binance.RPS`)。新增 collector 任务前估算 weight 预算Binance 2400 weight/min IP 上限)。
5. **国内网络**`fapi.binance.com` 直连不稳定,通过 `HTTPS_PROXY` 环境变量挂代理。
6. **Upsert 幂等**5 张表的主键都包含时间维度,所有 repo 的 `UpsertMany` 使用 `ON CONFLICT DO UPDATE`,可安全重复执行。
---
## 8. 任务模式
任何非平凡修改,建议先写一份微型任务契约(参见 `ai/task-templates.md`
```
objective: 要做的事,一句话
scope: 会改的文件 / 目录
out-of-scope: 不会动的范围
constraints: 受 ai/risk-guardrails.md 约束的哪几条
validation: 要跑哪些命令证明通过
acceptance: 如何判断完成
```
对于跨多个 Milestone 或需要新增数据源CoinGlass、ETF Flow的任务必须先写 `ai/specs/<task>.md`
---
## 9. 提交规范
- 一个 PR 改一类事。Repo 层、Binance 适配、usecase 编排不要混在一个 commit。
- Commit message 用中文或英文都行,但要写"为什么"。
- 不要在没有跑 `go build ./...``go vet ./...` 的情况下提交。
- `go.mod` 改动必须配套 `go.sum`(运行 `make tidy`)。
---
## 10. 何时升级 harness
- 同一类错误第二次出现 → 写进 `ai/risk-guardrails.md`
- 重大架构决策(换 HTTP 框架、引入消息队列、跨服务通信)→ 写 ADR
- 新增数据源CoinGlass / ETF / CME→ 必须有 `ai/specs/<source>.md` 才动手
- 跨多次会话的长任务 → 写 `ai/work-status.md`