manmankan 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,39 @@
1
+ ---
2
+ name: 🐛 Bug 上报
3
+ about: 报告慢慢看的 bug · 中文优先
4
+ title: "[Bug] "
5
+ labels: bug
6
+ assignees: ""
7
+ ---
8
+
9
+ ## 现象
10
+
11
+ <!-- 你看到了什么?最好贴 terminal 完整输出(敏感信息脱敏)-->
12
+
13
+ ## 复现步骤
14
+
15
+ 1.
16
+ 2.
17
+ 3.
18
+
19
+ ## 期望行为
20
+
21
+ <!-- 你认为应该是什么样? -->
22
+
23
+ ## 环境
24
+
25
+ - 操作系统(macOS / Linux / Windows):
26
+ - Python 版本(`python --version`):
27
+ - manmankan 版本(`kan --version`):
28
+ - 终端宽度(列数 · 影响表格渲染):
29
+ - 终端类型(iTerm / Terminal.app / Windows Terminal / VS Code 等):
30
+
31
+ ## 数据相关
32
+
33
+ - 你跑的命令:
34
+ - 自选股池大小(`kan list | wc -l`):约 N 只
35
+ - 数据是今天的吗(看 `kan scan` 标题"X 更新")?
36
+
37
+ ## 其他线索
38
+
39
+ <!-- 截图 / 异常 traceback / 你的推测 -->
@@ -0,0 +1,30 @@
1
+ ---
2
+ name: ✨ 功能建议
3
+ about: 建议新功能或改进
4
+ title: "[Feature] "
5
+ labels: enhancement
6
+ assignees: ""
7
+ ---
8
+
9
+ ## 你想解决什么问题?
10
+
11
+ <!-- 不要直接说"加 X 功能" · 先描述使用场景和痛点 -->
12
+
13
+ ## 你的建议
14
+
15
+ <!-- 想要什么样的解决方案?怎么个调用方式? -->
16
+
17
+ ## 替代方案
18
+
19
+ <!-- 有其他可能的实现方式吗?为什么这个更好? -->
20
+
21
+ ## 合规自检(金融工具必须)
22
+
23
+ 慢慢看的设计哲学:**位置感入口 ≠ 决策出口**。新功能必须满足:
24
+
25
+ - [ ] 不涉及「建议买卖」「推荐持仓」「目标价」等决策性输出
26
+ - [ ] 不涉及预测涨跌 / 选股推荐 / AI 选股
27
+ - [ ] 仅展示客观数据 + 让用户自行判断
28
+ - [ ] 措辞严守「位置 / 区间 / 触及 / 共振」等中性词
29
+
30
+ 如果建议本身违反上述任一条 · 请理解我们不会接受(参见 README §法律免责)。
@@ -0,0 +1,34 @@
1
+ ## 概述
2
+
3
+ <!-- 1-2 句话说清楚改了什么 / 为什么 -->
4
+
5
+ ## 类型
6
+
7
+ - [ ] 🐛 bug 修复
8
+ - [ ] ✨ 新功能
9
+ - [ ] ♻️ 重构(不改行为)
10
+ - [ ] 📝 文档
11
+ - [ ] ✅ 测试
12
+ - [ ] ⚠️ Breaking change(必填 Migration guide)
13
+
14
+ ## 验证
15
+
16
+ - [ ] `uv run pytest` 全绿
17
+ - [ ] `uv run ruff check kan/ tests/` 无新增 F/E/B/N 类真技术债
18
+ - [ ] **实际跑过 CLI** 验证(不仅看代码 · 见 CONTRIBUTING.md)
19
+
20
+ ## 合规自检(金融工具必须)
21
+
22
+ - [ ] 不涉及买卖建议 / 选股推荐
23
+ - [ ] 输出严守「位置 / 区间 / 触及 / 共振」中性措辞
24
+ - [ ] 风险提示完整保留(不可关闭)
25
+
26
+ ## 相关 issue
27
+
28
+ Closes #
29
+
30
+ ## Migration(如 Breaking change)
31
+
32
+ | v0.x 写法 | v0.y 写法 |
33
+ |---|---|
34
+ | | |
@@ -0,0 +1,24 @@
1
+ name: Release to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags: ['v*']
6
+
7
+ jobs:
8
+ build-and-publish:
9
+ name: Build and publish to PyPI
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ id-token: write # trusted publisher OIDC
13
+ contents: read
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ - uses: astral-sh/setup-uv@v4
17
+ with:
18
+ python-version: '3.12'
19
+ - name: Build
20
+ run: uv build
21
+ - name: Publish to PyPI
22
+ uses: pypa/gh-action-pypi-publish@release/v1
23
+ with:
24
+ packages-dir: dist/
@@ -0,0 +1,34 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - 'feat/**'
8
+ - 'fix/**'
9
+ paths-ignore:
10
+ - '**.md'
11
+ - 'docs/**'
12
+ pull_request:
13
+ branches: [main]
14
+
15
+ jobs:
16
+ test:
17
+ runs-on: ${{ matrix.os }}
18
+ strategy:
19
+ fail-fast: false
20
+ matrix:
21
+ os: [ubuntu-latest, macos-latest]
22
+ python-version: ['3.11', '3.12']
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - uses: astral-sh/setup-uv@v4
26
+ with:
27
+ python-version: ${{ matrix.python-version }}
28
+ enable-cache: true
29
+ - name: Install dependencies
30
+ run: uv sync --all-extras
31
+ - name: Run tests
32
+ run: uv run pytest -q
33
+ - name: Lint
34
+ run: uv run ruff check kan/
@@ -0,0 +1,50 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg
6
+ *.egg-info/
7
+ dist/
8
+ build/
9
+ .eggs/
10
+
11
+ # Virtual env
12
+ .venv/
13
+ venv/
14
+ .uv/
15
+
16
+ # Environment variables
17
+ .env
18
+ .env.local
19
+
20
+ # Database / Data
21
+ *.db
22
+ *.sqlite
23
+ data/
24
+ *.parquet
25
+
26
+ # Testing
27
+ .pytest_cache/
28
+ .mypy_cache/
29
+ .ruff_cache/
30
+ htmlcov/
31
+ .coverage
32
+ .coverage.*
33
+ .tox/
34
+
35
+ # IDE
36
+ .idea/
37
+ .vscode/
38
+ *.swp
39
+ *.swo
40
+ *~
41
+
42
+ # OS
43
+ .DS_Store
44
+ Thumbs.db
45
+
46
+ # Local / private (any user-private files we don't want to track)
47
+ *.local
48
+ *.private
49
+ *.secret
50
+ *.bak
@@ -0,0 +1,157 @@
1
+ # Changelog
2
+
3
+ 本项目所有重大变更记录在此文件中。格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/)。
4
+
5
+ ## [0.3.0] - 2026-05-08
6
+
7
+ > v0.2 全功能体验 review 驱动 · 聚焦 80 列终端适配(P0 痛点)+ 自选股名称搜索 + 竞品学习。
8
+
9
+ ### Added
10
+
11
+ - **`kan add` 支持名称搜索** · `kan add 茅台` 自动查找代码并添加
12
+ - 精确匹配 1 只 → 直接添加
13
+ - 多只匹配 → 展示候选前 10 只 + 提示用代码添加
14
+ - **`kan remove` 支持名称 + 批量** · `kan remove 茅台 五粮液` 一次删多只
15
+ - **`kan list` 显示总数** · 标题 "自选股列表 · 共 N 只"
16
+ - **终端宽度自适应** · scan 表根据终端宽度自动选择周期子集
17
+ - 130+ 列:全部 10 周期 · 100 列:6 周期 · 90 列:5 周期 · 80 列:4 周期
18
+ - 共振列在任何宽度下始终可见(v0.2 80 列下被完全截断)
19
+ - 窄屏时底部提示 "显示 N/10 周期 · 加宽终端可见全部"
20
+ - **trend --latest 宽度自适应** · 日期列数量根据终端宽度自动调整
21
+ - 80 列约 3 天 · 120 列约 7 天 · 列头和数值不再截断为 "…"
22
+ - **版本体验 review 机制** · `docs/reviews/` 存档 + 流程模板(每版本迭代前 AI 自动执行)
23
+ - 新增 15 项测试 · 93 → 108 项全绿(终端宽度 11 + 名称搜索 4)
24
+
25
+ ### Changed
26
+
27
+ - **info 表移除空"状态"列** · 位置列 `[x%]` 颜色已传达触及信息 · 表格更紧凑
28
+ - **trend 范围校验中文化** · `--down 1` 从 typer 英文 "Invalid value" 改为中文 "❌ 值必须在 2-30 之间"
29
+ - **数据目录迁移到 XDG 规范** · `~/.kan/` → `~/.local/share/kan/`(`$XDG_DATA_HOME/kan/`)
30
+ - 首次运行自动从旧路径迁移 · 旧目录留 `_MIGRATED.txt` 标记
31
+ - 新增 `kan/paths.py` 集中管理所有路径
32
+ - **渲染逻辑拆分到 `kan/render.py`** · cli.py 803 → 752 行
33
+ - 周期选择 / 百分比格式化 / 日期列数计算独立为 render 模块
34
+
35
+ ### Fixed
36
+
37
+ - v0.2 P0-1: scan 表 80 列截断 · 共振列不可见 → 自适应周期选择
38
+ - v0.2 P0-2: trend --latest 列头截断 "现…" "连…" "累…" → 日期列数量自适应
39
+ - v0.2 P3-1: 数据目录 `~/.kan/` 不符合 XDG 规范 → 迁移到 `~/.local/share/kan/`
40
+ - v0.2 P3-2: cli.py 720 行未拆模块 → 渲染逻辑拆分到 render.py
41
+ - v0.2 P3-3: scan 标题日期被截断 → 表格宽度自适应后标题自然完整
42
+
43
+ ### Migration Guide (v0.2 → v0.3)
44
+
45
+ **数据目录自动迁移**:v0.3 起数据目录从 `~/.kan/` 迁移到 `~/.local/share/kan/`(XDG Base Directory 规范)。首次运行 `kan` 时自动迁移,旧目录留 `_MIGRATED.txt` 标记,确认数据无误后可手动删除旧 `~/.kan/`。
46
+
47
+ **v0.2 移除项已稳定**:`--streak` / `kan scan -p N` 在 v0.2 已移除,v0.3 不再相关。详见 [v0.2 Migration Guide](#migration-guide-v01--v02)(如有)。
48
+
49
+ ## [0.2.0] - 2026-05-08
50
+
51
+ > v0.1 早期使用反馈驱动迭代 · 聚焦 `kan trend` + `kan scan` 体验 + 排序逻辑重设计。
52
+
53
+ ### Changed (BREAKING)
54
+
55
+ - **`kan --help` 走中文速记** · 与 `kan` / `kan help` 等价(v0.1 走 typer 默认英文混杂)
56
+ - 反 UNIX 习惯 · 但早期用户基数小 + 慢慢看是 CN-only CLI · 一致性 > 习惯
57
+ - 子命令 `--help` 不影响(如 `kan scan --help` 仍走 typer 默认)
58
+ - v0.1 用户脚本/别名/muscle memory 中 `kan --help | grep ...` 输出会变
59
+ - **`kan scan -p / --period N` 选项已移除**(maintainer 拍板 · 站在用户角度判断 -p N 多余 · 与 `kan low/high N` 重叠)
60
+ - 想看单周期触及极值 → `kan low N` / `kan high N`
61
+ - 想看自选股全周期位置 → `kan scan`
62
+ - **`kan scan` 排序重设计 · 共振优先 + PERIODS 字典序 tie-break**
63
+ - low:`-low_resonance` → 3 日 pct 升序 → 5 日 → ... → 180 日
64
+ - high:`-high_resonance` → 3 日 pct 降序 → 5 日 → ... → 180 日
65
+ - v0.1 行为:共振优先 → 任意周期 max/min(tie-break 不区分周期)
66
+ - **`kan trend` 排序加二级 tie-break · 同天数按累计幅度 abs 降序**
67
+ - 5 天连跌 -15% 排在 5 天连跌 -3% 之前(同天数下幅度大的在前)
68
+ - v0.1 行为:仅按天数 abs 排序 · 同天数顺序随机
69
+ - **`kan scan` 表格列宽修复(v0.1 真截断 bug)**
70
+ - 周期列 `min_width` 5 → 6(容纳 [100%] 6 chars · 之前显示 [100…)
71
+ - 现价/N日最低/N日最高/位置列加 `min_width=8`(容纳 4 位数股价 1371.05 + [100.0%] 8 chars)
72
+ - 涉及 scan / low / high / info 共 4 命令
73
+ - `--streak` 选项移除(语义合并到 `--down N` / `--up N`)
74
+
75
+ ### Added
76
+
77
+ - `kan trend --up N` 短写(与 `--down N` 对称)
78
+ - `kan help` 文案明确标注「以上参数可任意组合」+ 给出组合示例
79
+ - sys.argv 预处理逻辑(`kan.cli._normalize_streak_args`)· 让 `--down`/`--up` 不带值时注入默认 3 · 兼容 v0.1 调用方式
80
+ - 测试覆盖大幅提升:v0.1 baseline 46 → v0.2 87+ 项(trend CLI 19 + scan 列宽 8 + 排序逻辑 11)
81
+ - `tests/test_trend_cli.py` · trend CLI 集成测试
82
+ - `tests/test_scan_cli.py` · scan/low/high/info 列宽回归测试
83
+ - `tests/test_sort_logic.py` · scan/trend 排序逻辑测试
84
+
85
+ ### Migration Guide
86
+
87
+ | v0.1 写法 | v0.2 写法 |
88
+ |---|---|
89
+ | `kan trend` | `kan trend`(不变) |
90
+ | `kan trend --down` | `kan trend --down`(不变) |
91
+ | `kan trend --up` | `kan trend --up`(不变) |
92
+ | `kan trend --down --streak 5` | `kan trend --down 5` |
93
+ | `kan trend --up --streak 7` | `kan trend --up 7` |
94
+ | `kan scan -p 60` | `kan low 60` 或 `kan high 60`(视场景) |
95
+ | `kan scan --period 60` | 同上 |
96
+ | `kan --help` | 输出从 typer 默认变中文速记(与 `kan` / `kan help` 等价) |
97
+
98
+ ### Internal
99
+
100
+ - entry_point 从 `kan.cli:app` 改为 `kan.cli:cli_main`(包了一层 sys.argv 预处理)
101
+ - `kan.scanner._period_pct_key` 新增 · 字典序排序辅助
102
+ - `kan.cli._normalize_help_args` 新增 · root-level `--help` 重定向到 `help` 子命令
103
+ - pytest: 46 → **93** 项(+47 · trend CLI 19 + scan 列宽 8 + 排序逻辑 11 + help 一致性 9)
104
+ - 代码质量门禁:__version__ 同步 · F811 重命名 · F821 import · B904 chaining (3) · B905 strict zip · JSON utf-8 (6)
105
+
106
+ [0.2.0]: https://github.com/piklen/manmankan/releases/tag/v0.2.0
107
+
108
+ ## [0.1.0] - 2026-05-05
109
+
110
+ 首次开源发布。
111
+
112
+ ### Added
113
+
114
+ **位置扫描**
115
+ - `kan scan` 全景扫描自选股 10 周期位置(3/5/7/10/15/30/60/90/120/180 日)
116
+ - `kan scan --high` 高点模式
117
+ - `kan scan -S` / `--signal` 仅显示有共振信号的股票
118
+ - `kan scan --diff` 增量模式(与上次扫描对比)
119
+ - `kan scan -p N` 单周期模式
120
+ - `kan scan --exclude-st` 排除 ST/*ST 股票
121
+ - 多周期共振信号自动高亮(×N 标记)
122
+
123
+ **筛选模式**
124
+ - `kan low N [N2 N3...]` 筛选 N 日低点(支持多周期)
125
+ - `kan high N [N2 N3...]` 筛选 N 日高点
126
+ - 触及阈值:≤5% 低点 / ≥95% 高点
127
+
128
+ **连续涨跌看板**
129
+ - `kan trend` 连续涨跌天数 + 累计涨跌幅
130
+ - `kan trend --latest N` 展示近 N 天走势详情
131
+ - `kan trend --down` / `--up` 筛选连续涨/跌
132
+ - `kan trend --streak N` 自定义最少连续天数
133
+ - `kan trend --candle` 阳线阴线口径
134
+ - 涨跌停自动标记
135
+ - 平盘穿透不断连续(行业惯例)
136
+
137
+ **单只详情**
138
+ - `kan info <代码>` 单只股票全周期位置 + 涨跌 + 共振统计
139
+
140
+ **自选股管理**
141
+ - `kan add` / `kan remove` / `kan list` / `kan import` / `kan clear`
142
+ - 支持 6 位代码 / 带交易所前缀(sh600519 / sz000858)
143
+ - A 股代码-名称本地缓存(7 天有效期)
144
+
145
+ **数据层**
146
+ - AKShare 直调获取前复权日 K 线
147
+ - 本地 Parquet 缓存(`~/.kan/data/`)
148
+ - 数据过期自动更新(无感)
149
+ - `kan fetch [--force]` 手动刷新
150
+
151
+ **合规**
152
+ - 每次输出强制风险提示
153
+ - 关键词黑名单
154
+ - ST/*ST 涨跌停按 2026-07-06 政策日期切换(5% → 10%)
155
+ - 板块差异化涨跌停限制(主板/科创创业/北交所/ST)
156
+
157
+ [0.1.0]: https://github.com/piklen/manmankan/releases/tag/v0.1.0
@@ -0,0 +1,66 @@
1
+ # 贡献指南
2
+
3
+ 感谢你对慢慢看的兴趣!
4
+
5
+ ## 开发环境
6
+
7
+ 要求 Python 3.11+,推荐使用 [uv](https://docs.astral.sh/uv/):
8
+
9
+ ```bash
10
+ git clone https://github.com/piklen/manmankan.git
11
+ cd manmankan
12
+ uv sync
13
+ ```
14
+
15
+ ## 运行测试
16
+
17
+ ```bash
18
+ uv run pytest
19
+ uv run pytest --cov=kan # 带覆盖率
20
+ ```
21
+
22
+ ## 代码风格
23
+
24
+ - 使用 [ruff](https://docs.astral.sh/ruff/) 做 lint 和格式化:`uv run ruff check kan/`
25
+ - 类型注解:所有公开函数应有类型注解
26
+ - 命名:小写 + 下划线
27
+ - Pydantic v2 用于数据模型
28
+
29
+ ## 合规红线(重要)
30
+
31
+ 本项目严格定位为**行情数据展示工具**,PR 不应引入任何形式的:
32
+
33
+ - 买卖建议 / 评分评级 / 策略推荐
34
+ - 涨跌预测 / 目标价
35
+ - "建议关注 / 低估 / 见底 / 抄底"等暗示性词汇
36
+
37
+ 详见 [`docs/compliance.md`](docs/compliance.md)。
38
+
39
+ ## 提交流程
40
+
41
+ 1. Fork 本仓库
42
+ 2. 创建功能分支:`git checkout -b feat/your-feature`
43
+ 3. 提交改动:`git commit -m "feat: ..."`
44
+ 4. 推送到 fork:`git push origin feat/your-feature`
45
+ 5. 在 GitHub 上发起 Pull Request
46
+
47
+ ## Commit Message 规范
48
+
49
+ ```
50
+ feat: 新功能
51
+ fix: 修复 bug
52
+ docs: 文档变更
53
+ refactor: 重构(不改变功能)
54
+ test: 测试相关
55
+ chore: 构建/依赖等杂项
56
+ ```
57
+
58
+ ## 报告问题
59
+
60
+ 通过 [GitHub Issues](https://github.com/piklen/manmankan/issues) 报告 bug 或提出功能建议。
61
+
62
+ 请提供:
63
+ - 复现步骤
64
+ - 期望行为 vs 实际行为
65
+ - Python 版本、操作系统
66
+ - 相关日志或截图
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 piklen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.