Skip to content
HazelnutParadisePublic

Repository files navigation

Briefast

每日產業與股市新聞報告網站。Claude Cowork 在開盤前蒐集公開新聞、判讀個股多空並推送完整 JSON;Syralit 網站以固定的規線報紙版面顯示最新報告與歷史報告。

運作方式

flowchart LR
    A[Claude Cowork<br>每日排程] --> B[爬取產業與<br>股市新聞]
    B --> C[整理成每日報告]
    C -->|完整報告 JSON<br>POST /api/report| D[Syralit 網站]
    D --> E[(SQLite)]
    D --> F[首頁與歷史頁]
Loading
  • 前台:/ 顯示最新報告,/history/ 每頁列出 10 份歷史報告並可檢視指定日期。報告頁以淡彩報紙插圖導覽產業,比例依該份報告的新聞則數計算。盤前總覽及產業正文可展開閱讀,原文完整保留。
  • 後台:/admin/ 以管理員密碼保護,可建立、完整檢視與撤銷 API key,並查看所有成功與拒絕紀錄。
  • 接收 API:POST /api/report 每次查驗 Bearer key,驗證整份 JSON 後以日期為鍵原子 upsert。其他端點見下方「每日流程」。
  • 持久層:SQLite data/briefast.db,啟動時自動套用 migration,啟用 WAL 與 5 秒 busy timeout。
  • 即時更新:成功 ingest 後透過 sy.Shared 讓已連線頁面 rerun。

網站不使用 Artifact Canvas 或 Artifact DSL。版面與紅漲綠跌語意由程式固定,agent 不能改變 UI 結構。

報告 JSON

{
  "date": "2026-08-07",
  "headline": "美股收紅開盤氣氛偏多,看漲:台積電、緯創",
  "overview_md": "盤前總覽 markdown",
  "market_outlook": {"direction": "up", "summary_md": "開盤受美股收紅與臺指期夜盤偏多影響,傾向在前收上方開出;收盤方向由新聞與前一交易日籌碼偏多支撐,仍須留意相反訊號。"},
  "watch_md": "- 今日觀察 markdown 條列",
  "calls": {
    "short_bull": [{"symbol": "2330", "name": "台積電", "reason": "一句理由"}],
    "short_bear": [],
    "long_bull": [],
    "long_bear": []
  },
  "industries": [{"name": "科技", "events": [{"headline": "產業要聞", "summary_md": "事件摘要"}], "watch_md": "- 追蹤後續訂單"}],
  "stock_news": [
    {
      "symbol": "2330",
      "name": "台積電",
      "call": "short_bull",
      "headline": "公司消息支撐短線動能",
      "watch_md": "- 追蹤營收",
      "summary_md": "摘要段落,可含列點",
      "sources": [{"title": "新聞標題", "url": "https://example.com/news"}]
    }
  ],
  "generated_at": "2026-08-07T07:50:00+08:00"
}

market_outlook 在新每日報告中只填 direction(up、down、range、uncertain)與非空白 summary_md,不填 trajectory_md 與 trajectory_chart。summary_md 分別判斷開盤傾向與收盤方向並交代依據,兩者各自依證據獨立判斷,任一階段證據不足只影響該階段,不影響另一方。方向判斷以報告日加權指數收盤相對前一交易日收盤為準。舊欄位仍相容:舊報告的 trajectory_md 走勢文字與 trajectory_chart(其 open、midday、close 各用 above、near、below 表示相對前收的定性位置;圖示不代表點位或漲跌幅)照原樣儲存、讀回與顯示,舊報告也可省略圖、走勢文字或整個預測,API 對這些欄位的驗證不變。stock_news[].call 只接受 short_bull、short_bear、long_bull、long_bear、none。日期必須是有效的 YYYY-MM-DD;headline、overview_md、watch_md 不得為空;每個 source 必須有 URL;四個 calls 清單中的每個 symbol 必須在 stock_news 有對應條目。none 代表有重大新聞但方向不明,不得放進 calls 清單,前台也不顯示多空標籤。

呼叫範例:

curl --fail-with-body \
  -H "Authorization: Bearer ${BRIEFAST_API_KEY}" \
  -H "Content-Type: application/json" \
  --data-binary @report.json \
  "${BRIEFAST_URL%/}/api/report"

成功回 200 {"ok":true,"date":"2026-08-07"}。Schema 錯誤回 400 與完整 errors 陣列,無效或已撤銷 key 回 401;兩種拒絕都會寫入 update_log,不會寫入報告。

本機開發

需求:Go 1.25.11 以上。

cp .env.example .env
# 編輯 .env,填入 BRIEFAST_ADMIN_PASSWORD
set -a; source .env; set +a
go test ./...
go run .

syralit.toml 已在版控中,clone 後不需要複製或修改。Go 程式不會自己解析 .env,所以本機啟動前要先如上把它載入環境;也可以直接在指令前帶環境變數:

BRIEFAST_ADMIN_PASSWORD='replace-me' go run .

預設網址是 http://localhost:8600/,資料庫是 data/briefast.db。

管理員密碼未設定時,公開頁與 API 仍可服務,但後台會拒絕登入並顯示設定錯誤。API key 依產品需求明文存於 SQLite,請限制 data/ 或 Docker volume 的存取權限。

Docker Compose 部署

cp .env.example .env
# 編輯 .env,填入 BRIEFAST_ADMIN_PASSWORD
docker compose up -d --build

Compose 會自動讀取本目錄的 .env,不需要額外參數。syralit.toml 已包進映像,不必掛載;.env 控制的是管理員密碼、站台對外網址、對外埠與資料庫落地位置(BRIEFAST_DATA,預設為 named volume)。也可以直接注入環境變數:

BRIEFAST_ADMIN_PASSWORD='replace-me' BRIEFAST_PORT=8600 docker compose up -d --build

BRIEFAST_SITE_URL 是站台對外網址,公開頁的 canonical、Open Graph 與 sitemap 用它組出絕對網址。未設定時會依請求的 Host 與 X-Forwarded-Proto 推導;正式部署請務必設定,因為反向代理沒送 X-Forwarded-Proto 時推導結果會退化成 http。

BRIEFAST_PORT 是主機對外 port,容器內固定使用 8600。資料目錄預設掛 briefast-data named volume;在 .env 把 BRIEFAST_DATA 設成主機路徑即改為 bind mount。主機目錄不需要事先建立或調整權限——容器啟動時會自行建立並把擁有者設為應用使用者,再降權執行,應用程序本身不以 root 執行。無論哪種,重建或重啟容器都不會刪除 reports、API keys 或 update log。網域與 HTTPS 應由外部反向代理處理。

每日流程

每日晨報的完整做法由網站本身提供,Cowork 工作區不必安裝 skill。

  • GET /api/guide:流程說明(Markdown),包含交易日檢查、新聞來源、判讀規則、報告 JSON 範例與錯誤處理。需要 Bearer key。
  • GET /api:所有端點的清單。GET /api/openapi.json:參數、請求與回應格式。這兩個不需要 key。
  • /api/ 底下每個 JSON 回應都帶 guide 欄位與 Link: </api/guide>; rel="help" 標頭,提醒 agent 先讀流程說明。

agent 需要網站網址與後台建立的 API key。雲端排程只要設定 BRIEFAST_URL、BRIEFAST_API_KEY 兩個環境變數,每次都從空的工作區開始也沒問題。本機執行則可以在工作區根目錄放一個 .env:

BRIEFAST_URL=https://briefast.example.com
BRIEFAST_API_KEY=brf_...

兩個來源都有時,每一項都以環境變數為準。

Cowork 排程的 prompt 只要一行:

讀取 BRIEFAST_URL 與 BRIEFAST_API_KEY,每一項先看環境變數,沒有再看工作區根目錄的 .env(兩邊都沒有就停止並回報缺少哪一項),帶著 Authorization: Bearer <BRIEFAST_API_KEY> 呼叫 GET <BRIEFAST_URL>/api/guide,完全照說明執行今天的晨報流程。

新聞去重紀錄(/api/seen/*)存在網站的 SQLite,文章保留 90 天、事件保留 30 天。臺指期夜盤由 POST /api/tx-night 解析 agent 上傳的期交所 CSV。

License

GPL-3.0 © 2026 HazelnutParadise

Releases

Packages

Contributors

Languages