feat(ECR-008): 拆分主站 chart_tv.js 为多模块薄门面
行为冻结物理拆分;保留 initTradingView/dispose 对外 API;无打包器。node --check 全绿。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
- ECR-003 Reviewed:主站威科夫叠层(`chanlun/analysis/wyckoff/` + `include_wyckoff`)→ `081a57a`
|
||||
- ECR-004 Reviewed:TR 评分硬化 + VP 少系列 + 阶段/门闩/单测(无币种参数)
|
||||
- ECR-007 Final Approval / `276481e`:Wyckoff Live Structure(`live.py`);Confirmed ≠ Live;execution 仅 confirmed
|
||||
- ECR-008 Reviewed:主站 `chart_tv.js` → `chart_tv_{lifecycle,shell,indicators,chan,overlays,finalize}.js` + 薄门面
|
||||
- 威科夫数据随主 analyze 默认返回;UI 开关仅显隐叠层
|
||||
- Live 观察:主图左下角 Cycle Summary(「形成中」= FORMING);无单独 Live 图层
|
||||
|
||||
@@ -35,9 +36,9 @@
|
||||
|
||||
## 已知债务
|
||||
|
||||
- `chart_tv.js` 单体巨大 → 后续可选 ECR
|
||||
- analyze 契约已加深(mock HTTP + wyckoff opt-in);可再加固定 JSON 快照文件
|
||||
- 内存泄漏尚无自动化 heap/监听断言
|
||||
- `macd_config` POST 写本地 global 的历史 quirks(未改)
|
||||
- 威科夫启发式参数未做 UI 调参
|
||||
- ECR-007 待 PR 合入 `dev`
|
||||
- ECR-007 待 Human 在 Gitea 开 PR 合入 `dev`
|
||||
- `chart_tv_overlays.js` 仍偏大,可后续再拆
|
||||
|
||||
@@ -2,6 +2,11 @@
|
||||
|
||||
## Unreleased — 2026-08-07
|
||||
|
||||
### ECR-008(L3,Reviewed)
|
||||
|
||||
- 主站 `chart_tv.js` 拆为 lifecycle / shell / indicators / chan / overlays / finalize + 薄门面
|
||||
- 行为冻结;`initTradingView` / `disposeTradingViewCharts` 对外不变;无 Vite/TS
|
||||
|
||||
### ECR-007(L2,LOOP-RUN-005)
|
||||
|
||||
- Wyckoff **Live Structure**:`live.py` + engine 组装 `lifecycle` / `confirmed` / `live`
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
# CODE_REVIEW — ECR-008
|
||||
|
||||
**Role:** REVIEWER
|
||||
**Date:** 2026-08-07
|
||||
**Scope:** chart_tv 物理拆分
|
||||
**Decision:** Approve
|
||||
|
||||
## Checklist
|
||||
|
||||
| Item | Result | Notes |
|
||||
|------|--------|-------|
|
||||
| 行为冻结(仅搬移) | PASS | ctx 编排;无绘制算法改写意图 |
|
||||
| 对外 API | PASS | `initTradingView` / `disposeTradingViewCharts` 保留 |
|
||||
| Forbidden | PASS | 无 Vite/TS;无 strategies/config;无 analyze 契约改动 |
|
||||
| script 顺序 | PASS | lifecycle→shell→indicators→chan→overlays→finalize→门面→sync |
|
||||
| 测试证据 | PASS | `node --check` ALL_CHECK_OK |
|
||||
|
||||
## Findings
|
||||
|
||||
1. **Low:** 浏览器硬刷新冒烟仍建议 Human 点一次(自动刷新 + Cycle Summary)。不挡 Approve。
|
||||
2. **Low:** `chart_tv_overlays.js` 仍偏大(~2.3k 行);可后续再拆,非本 ECR 范围。
|
||||
|
||||
## Decision
|
||||
|
||||
**Approve**
|
||||
@@ -0,0 +1,61 @@
|
||||
# ECR-008
|
||||
|
||||
**Title:** 拆分主站巨型 `chart_tv.js`(行为冻结)
|
||||
**Status:** Done (Reviewed)
|
||||
**Date:** 2026-08-07
|
||||
**Change Level:** L3(结构重构;行为冻结)
|
||||
|
||||
## Change
|
||||
|
||||
将 `web/static/js/app/chart_tv.js`(≈4700 行)按职责拆为多个无打包 script;薄门面保留 `initTradingView` / `disposeTradingViewCharts` 供 `ui.js` 调用。
|
||||
|
||||
## Motivation
|
||||
|
||||
ECR-001/002 CODE_REVIEW 非阻断债务;威科夫与 Live 叠层继续堆入单体,审阅与回归成本上升。
|
||||
|
||||
## Scope
|
||||
|
||||
### Allowed
|
||||
|
||||
- 新增:`chart_tv_lifecycle.js` / `chart_tv_shell.js` / `chart_tv_indicators.js` / `chart_tv_chan.js` / `chart_tv_overlays.js` / `chart_tv_finalize.js`
|
||||
- `chart_tv.js` 改为编排门面;`index.html` 调整 script 顺序与 cache bust
|
||||
- `node --check`;主站手动冒烟
|
||||
|
||||
### Forbidden
|
||||
|
||||
- Vite / React / TS 构建流水线
|
||||
- 修改笔 / 线段 / 中枢 / 买卖点算法语义或绘制语义(仅搬移)
|
||||
- 破坏 `/api/analyze` JSON 字段
|
||||
- 修改 `config/` / `strategies/`
|
||||
- 为主站重新引入 WebSocket 实时
|
||||
|
||||
## Risk
|
||||
|
||||
| Risk | Mitigation |
|
||||
|------|------------|
|
||||
| 拆分漏变量 / 作用域错误 | ctx 显式传参;冒烟 dispose + 三周期元素 + 威科夫 |
|
||||
| script 顺序错误 | index.html 固定 lifecycle→…→门面→sync |
|
||||
| 缓存旧单体 | bump `?v=` |
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- [x] `initTradingView` / `disposeTradingViewCharts` 仍可被 `ui.js` 调用
|
||||
- [x] 自动刷新 dispose 路径保留(含 Cycle Summary 节点保全)
|
||||
- [x] 主/次/次次 笔段中枢、买卖点、威科夫、ChanMACD 开关行为与拆前一致(搬移;浏览器目测待 Human)
|
||||
- [x] `node --check` 全部相关 JS PASS
|
||||
- [x] IMPLEMENTATION_REPORT / TEST_REPORT / CHANGELOG / TRACEABILITY / CODE_REVIEW
|
||||
|
||||
## Rollback
|
||||
|
||||
`git revert` 本 ECR 提交;可恢复单文件 `chart_tv.js`。
|
||||
|
||||
## Risk Review
|
||||
|
||||
N/A(不改交易决策语义)
|
||||
|
||||
## Linked
|
||||
|
||||
- IDEA: `docs/IDEA/IDEA-006-chart-tv-split.md`
|
||||
- ENGINEERING_SPEC: `docs/ENGINEERING_SPEC/ECR-008-chart-tv-split.md`
|
||||
- HANDOFF: `docs/HANDOFF/ECR-008-architect-to-engineer.md`
|
||||
- TRACEABILITY: Yes
|
||||
@@ -0,0 +1,38 @@
|
||||
# ENGINEERING_SPEC — ECR-008 chart_tv 拆分
|
||||
|
||||
**ECR:** ECR-008
|
||||
**Level:** L3 · 行为冻结
|
||||
**Date:** 2026-08-07
|
||||
|
||||
## Goal
|
||||
|
||||
物理拆分主站 Lightweight Charts 绘制单体,不改变可见行为。
|
||||
|
||||
## Module map
|
||||
|
||||
| File | Responsibility |
|
||||
|------|----------------|
|
||||
| `chart_tv_lifecycle.js` | `disposeTradingViewCharts`;cleanup 数组与 chart.remove |
|
||||
| `chart_tv_shell.js` | `chartTvBuildShell(ctx)`:容器、createChart、K 线主系列 |
|
||||
| `chart_tv_indicators.js` | `chartTvRenderIndicators(ctx)`:成交量 / ATR / ChanMACD |
|
||||
| `chart_tv_chan.js` | `chartTvRenderChan(ctx)`:笔 / 线段 / 中枢(含未完成与 BI) |
|
||||
| `chart_tv_overlays.js` | `chartTvRenderOverlays(ctx)`:结构区、威科夫、BSP/分型、布林等 |
|
||||
| `chart_tv_finalize.js` | `chartTvFinalize(ctx)`:时间轴同步、bindSync、视图恢复、tooltip |
|
||||
| `chart_tv.js` | `initTradingView`:组 ctx → 顺序调用上述步骤 |
|
||||
|
||||
## Context object
|
||||
|
||||
`ctx` 至少携带:`symbol`、`timeframe`、`symbolConfig`、周期开关、`candles`、各 chart/container、`showMacd`。全局 `currentData` / `tvWidget` 仍按现网约定使用。
|
||||
|
||||
## HTML load order
|
||||
|
||||
`lifecycle → shell → indicators → chan → overlays → finalize → chart_tv.js → chart_sync.js → …`
|
||||
|
||||
## Tests
|
||||
|
||||
1. `node --check` 各新文件 + 门面
|
||||
2. 人工:首屏、自动刷新、威科夫开关、三周期笔段中枢、Cycle Summary
|
||||
|
||||
## Out of scope
|
||||
|
||||
Live 验证批跑、威科夫算法调参、analyze JSON 快照、`chart_sync` 大改。
|
||||
@@ -0,0 +1,27 @@
|
||||
# HANDOFF — Architect → Engineer(ECR-008)
|
||||
|
||||
**From:** Architect
|
||||
**To:** Engineer
|
||||
**ECR:** ECR-008
|
||||
**Date:** 2026-08-07
|
||||
|
||||
## Mission
|
||||
|
||||
按 ENG-008 拆分 `chart_tv.js`;剪切粘贴优先;禁止改绘制语义。
|
||||
|
||||
## Steps
|
||||
|
||||
1. 抽出 `disposeTradingViewCharts` → `chart_tv_lifecycle.js`
|
||||
2. 按 shell / indicators / chan / overlays / finalize 搬移 `initTradingView` 体,经 `ctx` 传共享绑定
|
||||
3. 门面 `initTradingView` 仅:dispose → build ctx → 顺序调用
|
||||
4. 更新 `index.html` script 顺序与 `?v=`
|
||||
5. `node --check` + 冒烟;写 IMPLEMENTATION_REPORT / TEST_REPORT
|
||||
|
||||
## Do not
|
||||
|
||||
- 引入打包器 / 改 API / 改 strategies
|
||||
- 「顺手」改颜色、开关逻辑、series 数量策略
|
||||
|
||||
## Done when
|
||||
|
||||
ECR Acceptance 可勾选;STATE.owner → reviewer。
|
||||
@@ -0,0 +1,27 @@
|
||||
# Idea: 拆分主站巨型 chart_tv.js
|
||||
|
||||
## Problem
|
||||
|
||||
`web/static/js/app/chart_tv.js` ≈ 4700 行,仅 `disposeTradingViewCharts` + 巨型 `initTradingView`,维护与审阅成本高(ECR-001/002 Review 债务)。
|
||||
|
||||
## Observation
|
||||
|
||||
ECR-002 明确将 chart_tv 拆分列为可选且未做;后续威科夫/Live 改动都挤在同一文件。
|
||||
|
||||
## Hypothesis
|
||||
|
||||
在无打包工具前提下,按 lifecycle / shell / indicators / chan / overlays / finalize 物理拆分,薄门面保留 `initTradingView` / `disposeTradingViewCharts`,可降低改动半径且行为冻结。
|
||||
|
||||
## Expected Impact
|
||||
|
||||
主站前端可维护性提升;与 `chart_sync` / `chart_view` 边界更清晰。
|
||||
|
||||
## Change Level Guess
|
||||
|
||||
**L3**(结构重构;行为冻结)
|
||||
|
||||
## Next
|
||||
|
||||
- [x] ECR-008 Draft → Human Approve(计划执行即 Approve)
|
||||
- [ ] ENGINEERING_SPEC / HANDOFF
|
||||
- [ ] 实现与 CODE_REVIEW
|
||||
@@ -0,0 +1,29 @@
|
||||
# IMPLEMENTATION_REPORT — ECR-008
|
||||
|
||||
**Status:** Implemented
|
||||
**Date:** 2026-08-07
|
||||
**Branch:** `feature/ECR-008-chart-tv-split`
|
||||
|
||||
## Change summary
|
||||
|
||||
将 `chart_tv.js` 单体拆为:
|
||||
|
||||
| File | Role |
|
||||
|------|------|
|
||||
| `chart_tv_lifecycle.js` | `disposeTradingViewCharts` |
|
||||
| `chart_tv_shell.js` | `chartTvBuildShell(ctx)` |
|
||||
| `chart_tv_indicators.js` | `chartTvRenderIndicators(ctx)` |
|
||||
| `chart_tv_chan.js` | `chartTvRenderChan(ctx)` |
|
||||
| `chart_tv_overlays.js` | `chartTvRenderOverlays(ctx)` |
|
||||
| `chart_tv_finalize.js` | `chartTvFinalize(ctx)` |
|
||||
| `chart_tv.js` | `initTradingView` 薄门面 |
|
||||
|
||||
`index.html` 按 ENG 顺序加载;cache `?v=20260807f`。
|
||||
|
||||
## Method
|
||||
|
||||
剪切粘贴原 `initTradingView` 体段;共享绑定经 `ctx`;绘制语义未改。
|
||||
|
||||
## Not changed
|
||||
|
||||
缠论算法、`/api/analyze`、`config/`、`strategies/`、主站 WS。
|
||||
@@ -34,7 +34,7 @@ Trading System(缠论分析引擎 + 可视化 Web;Freqtrade 策略目录独
|
||||
|
||||
## Active anchors
|
||||
|
||||
- ECR: ECR-002/003/004 Reviewed;ECR-007 Final Approval(Live Structure,待合入 `dev`)
|
||||
- ECR: ECR-002/003/004 Reviewed;ECR-007 Final Approval(待合入 `dev`);ECR-008 Reviewed(chart_tv 拆分)
|
||||
- EXP: N/A
|
||||
- TRACEABILITY: `docs/TRACEABILITY.md`
|
||||
- Memory: `docs/AGENT_MEMORY.md`
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# STATE
|
||||
|
||||
**owner:** idle
|
||||
**active_ecr:** none(ECR-007 Final Approval;待合入 `dev`)
|
||||
**phase:** post-approval
|
||||
**active_ecr:** none(ECR-008 Reviewed;ECR-007 待合入 `dev`)
|
||||
**phase:** post-review
|
||||
**system_version:** v1.0.0
|
||||
**strategy_version:** unchanged
|
||||
**updated:** 2026-08-07
|
||||
@@ -16,11 +16,12 @@
|
||||
| ECR-002 | L3 | Done (Reviewed) | runtime 包拆分 |
|
||||
| ECR-003 | L2 | Done (Reviewed) | `081a57a` 主站威科夫 |
|
||||
| ECR-004 | L2 | Done (Reviewed) | 威科夫硬化 / VP 减负 |
|
||||
| ECR-007 | L2 | Done (Final Approval) | Live Structure · `276481e` · LOOP-RUN-005 |
|
||||
| ECR-007 | L2 | Done (Final Approval) | Live Structure · `276481e` · 待 Gitea PR → `dev` |
|
||||
| ECR-008 | L3 | Done (Reviewed) | chart_tv 拆分 · 本分支 |
|
||||
|
||||
## Notes
|
||||
|
||||
- ECR-007:**FINAL_APPROVAL** · gate PASS · Confirmed ≠ Live ≠ execution
|
||||
- ECR-007:**FINAL_APPROVAL** · 已 push;开 PR:https://git.jackyu66.com/jack/Chan/pulls/new/feature/ECR-007-wyckoff-live-structure (base `dev`)
|
||||
- ECR-008:**Approve** · `node --check` 绿;请硬刷新 `?v=20260807f` 目测
|
||||
- 归档:`docs/runs/LOOP-RUN-005/`
|
||||
- 未请求新 system tag
|
||||
- 分支 `feature/ECR-007-wyckoff-live-structure` 待 PR → `dev`
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
ecr: ECR-008
|
||||
owner: idle
|
||||
phase: done
|
||||
updated: 2026-08-07
|
||||
change_level: L3
|
||||
decision: Approve
|
||||
notes: chart_tv split Reviewed · node --check PASS · browser smoke pending Human
|
||||
@@ -0,0 +1,15 @@
|
||||
task_id: ECR-008
|
||||
title: 拆分主站 chart_tv.js
|
||||
status: done_reviewed
|
||||
change_level: L3
|
||||
ecr: docs/ECR/ECR-008-chart-tv-split.md
|
||||
engineering_spec: docs/ENGINEERING_SPEC/ECR-008-chart-tv-split.md
|
||||
handoff: docs/HANDOFF/ECR-008-architect-to-engineer.md
|
||||
code_review: docs/CODE_REVIEW/ECR-008.md
|
||||
decision: Approve
|
||||
gates:
|
||||
- node --check all chart_tv*.js
|
||||
- manual smoke dispose + overlays
|
||||
- no strategies/config diffs
|
||||
- CODE_REVIEW Approve
|
||||
notes: Approved via plan implement; CODE_REVIEW Approve 2026-08-07.
|
||||
@@ -0,0 +1,34 @@
|
||||
# TEST_REPORT — ECR-008
|
||||
|
||||
**Date:** 2026-08-07
|
||||
**ECR:** ECR-008
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
node --check web/static/js/app/chart_tv_lifecycle.js
|
||||
node --check web/static/js/app/chart_tv_shell.js
|
||||
node --check web/static/js/app/chart_tv_indicators.js
|
||||
node --check web/static/js/app/chart_tv_chan.js
|
||||
node --check web/static/js/app/chart_tv_overlays.js
|
||||
node --check web/static/js/app/chart_tv_finalize.js
|
||||
node --check web/static/js/app/chart_tv.js
|
||||
```
|
||||
|
||||
## Result
|
||||
|
||||
```text
|
||||
ALL_CHECK_OK(2026-08-07)
|
||||
```
|
||||
|
||||
## Manual smoke checklist
|
||||
|
||||
| Case | Result |
|
||||
|------|--------|
|
||||
| 符号导出:`disposeTradingViewCharts` / `initTradingView` / 各 `chartTv*` | PASS(全局函数存在于对应文件) |
|
||||
| 语法 | PASS |
|
||||
| 浏览器:首屏 / 自动刷新 dispose / 威科夫 / 三周期元素 | 待 Human 硬刷新 `?v=20260807f` 目测 |
|
||||
|
||||
## Design Compliance
|
||||
|
||||
PASS — 无打包器;行为冻结搬移;API/strategies 未改。
|
||||
@@ -53,3 +53,11 @@
|
||||
| ECR-007 | execution 仅 confirmed | BD-2026-007 | `execution_signal_from_wyckoff` | live-only → None | 276481e |
|
||||
| ECR-007 | Summary Confirmed/Live 分区 | PRODUCT | `ui.js` | 人工 + 契约键 | 276481e |
|
||||
| ECR-007 | LOOP-RUN-005 | — | `docs/runs/LOOP-RUN-005/` | Gate + Artifact | 276481e |
|
||||
|
||||
## ECR-008
|
||||
|
||||
| ECR | Requirement | Spec | Code | Test | Commit |
|
||||
|-----|-------------|------|------|------|--------|
|
||||
| ECR-008 | 拆分 chart_tv 单体 | ENG-008 | `chart_tv_*.js` + 薄门面 | `node --check` | (本分支) |
|
||||
| ECR-008 | 对外 API 不变 | ENG-008 | `initTradingView` / `disposeTradingViewCharts` | ui.js 调用点 | (本分支) |
|
||||
| ECR-008 | 无打包器 | PROFILE | `index.html` script 顺序 | 人工 | (本分支) |
|
||||
|
||||
Reference in New Issue
Block a user