diff --git a/README.md b/README.md index 0b31edb..f01fdea 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ ```powershell # 1) 建环境(两条路选一条) .\scripts\setup-venv.ps1 # venv,零下载,复用 Anaconda base 的科学栈 -.\scripts\setup-conda.ps1 # conda 环境 mcm-toolkit(clone base,离线) +.\scripts\setup-conda.ps1 # conda 环境 mcm-toolkit(精准包列表,走代理下载) # 2) 自检 .\scripts\doctor.ps1 @@ -30,6 +30,8 @@ print(r.params["low"], r.params["high"]) ## 当前状态(v0.0.1) +本地 git 仓库已初始化(`main`,首次提交 `5319589`),远程 Gitea 待配置。 + **接口已定,实现未填。** 所有函数体是 `raise NotImplementedError` + `TODO(L0/L1/v0.2)` 标记, 按 [docs/03-roadmap.md](docs/03-roadmap.md) 的 L0 → L1 顺序填。 diff --git a/STATUS.md b/STATUS.md index 634d104..c28b9b6 100644 --- a/STATUS.md +++ b/STATUS.md @@ -4,9 +4,9 @@ ## 本次任务 -审查并精简 ChatGPT 的建库建议 → 生成骨架文件 → 配置 conda 与 venv 环境。 +审查并精简 ChatGPT 的建库建议 → 生成骨架文件 → 配置 conda 与 venv 环境 → 初始化 git 仓库。 -**结论:全部完成。** 两套环境均已建成并通过验证。 +**结论:全部完成。** 两套环境均已建成并通过验证;本地仓库已初始化并完成首次提交。 ## 任务清单 @@ -20,20 +20,21 @@ - 逐项给出"砍什么 / 为什么 / 替代什么",并补上原文缺失的六件事 (论文产出链路、指标方向与量纲、时间预算、可复现性、测试测什么、离线约束) -**B. 骨架文件生成**(78 个文件,约 6500 行) +**B. 骨架文件生成**(76 个文件,约 6800 行) - [x] `docs/02-architecture.md` 架构、`docs/03-roadmap.md` 路线图与**永久不做清单** - [x] `docs/04-environment.md` 环境文档、`docs/dev/function-card-template.md` 卡片模板 - [x] `src/mcm_toolkit/` 7 个包 23 个模块(**只有签名 + docstring + `NotImplementedError`**) - [x] `tests/` 9 个文件、`examples/` 4 个、`problems/` `notebooks/` `figures/` `tables/` - [x] `pyproject.toml`(核心依赖 4 个 + 6 组 extras)、`environment.yml` -- [x] `.gitignore` `.editorconfig` `LICENSE` `CHANGELOG.md` `README.md` +- [x] `.gitignore` `.gitattributes` `.editorconfig` `LICENSE` `CHANGELOG.md` `README.md` - [x] 脚本 `scripts/setup-venv.ps1` `setup-conda.ps1` `doctor.ps1` **C. 环境配置** -- [x] **venv 已建好**:`.venv`(10.5 MB,Anaconda base 3.13.9 + `--system-site-packages`) +- [x] **venv 已建好**:`.venv`(10.5 MB,Anaconda base + `--system-site-packages`) + `pip install -e . --no-deps --no-build-isolation`; - 可直接导入 numpy 2.3.5 / scipy 1.16.3 / pandas 2.3.3 / matplotlib 3.10.6 / - sklearn 1.7.2 / statsmodels 0.14.5 / networkx 3.5 / sympy 1.14.0 + 可直接导入 numpy 2.4.6 / scipy 1.18.1 / pandas 3.0.6 / matplotlib 3.11.2 / + sklearn 1.9.1 / statsmodels 0.15.0 / networkx 3.6.1 / sympy 1.14.0 + (版本随 base 走,base 升级后自动同步) - [x] **conda 环境已建好**:`D:\anaconda\envs\mcm-toolkit`(1.55 GB,Python 3.13.15) - 科学栈:numpy 2.4.6 / scipy 1.18.1 / pandas 3.0.6 / matplotlib 3.11.2 / sklearn 1.9.1 / statsmodels 0.15.0 / networkx 3.6.1 / sympy 1.14.0(MKL 后端) @@ -41,12 +42,18 @@ - 已在本项目中可编辑安装 - 实测耗时 868 秒,下载约 3 GB - [x] **Anaconda base 已升级** 2025.12 → **2026.07**(365 个包,下载 638 MB,耗时 1033 秒) - - conda 自身 25.11.1 → **26.7.3** + - conda 自身 25.11.1 → **26.7.3**(实测复核) - 并把项目环境 numpy 对齐到 base 的 2.4.6,**两套环境数值栈现已完全一致**(MKL 后端) - 升级前已用 `conda list -n base --revisions` 留了回滚点 - [x] 环境脚本按实测结果重写:`setup-conda.ps1` 默认改为**精准包列表** (`--clone base` 实测会走完整下载安装,不再是"离线快捷方式") +**D. Git 仓库** +- [x] `git init -b main`,`core.autocrlf=false`,首次提交 + `5319589`(76 文件 / 6812 行),工作区干净 +- [x] `git ls-files --eol` 复核:**全部 LF**,`.gitattributes` 生效 +- [x] 仓库由**本人账户 guzhu** 创建(见决策 17) + ### 验证结果 | 检查 | venv | conda `mcm-toolkit` | @@ -57,20 +64,27 @@ | `scripts/doctor.ps1` | 跑通 | — | | SALib / pymoo / pyright | 缺失 | 已装 | +- base 亦已复核:numpy 2.4.6 / scipy 1.18.1 / pandas 3.0.6(与两套环境一致) - skip 的都是等实现的算法行为测试;通过的 20 条是 `tests/test_api_surface.py` 的公开 API 契约测试 - 三个 `.ps1` 通过 PowerShell AST 语法解析 ### ⚠️ 需要注意 / 遗留 -- [x] ~~两套环境版本不一致~~ → **已解决**:base 升级到 2026.07 后,两套的 +- [x] ~~两套环境版本不一致~~ → **已解决**:base 升级到 2026.07 后, numpy/scipy/pandas/matplotlib/sklearn/statsmodels/networkx/sympy 版本完全一致, 只差 Python 补丁号(3.13.9 vs 3.13.15)。详见 `docs/04-environment.md` §5。 +- [ ] **Gitea 远程尚未配置**:本地仓库已就绪(`main` / `5319589`), + 只差你自己的 Gitea 地址。命令见 `docs/05-git-workflow.md` §3。 - [ ] 所有函数实现尚未开始(按 L0 → L1 顺序,见 `docs/03-roadmap.md`) -- [ ] Gitea 远程尚未配置(本地仓库已初始化并完成首次提交,推送步骤见 `docs/05-git-workflow.md`) -- [ ] 本次执行环境的 `exec_command` 在沙箱模式下**完全不可用** - (`helper_unknown_error: setup refresh had errors`), - 只有提权(`require_escalated`)模式可用。沙箱模式只允许写 - `D:\MCM&ICM_Toolkit`,因此前面一轮只能用 Node 子进程作为执行通道。 +- [ ] 本机 `exec_command` 在沙箱模式下**完全不可用** + (`helper_unknown_error: setup refresh had errors`),只有提权 + (`require_escalated`)模式可用。沙箱模式只允许写 `D:\MCM&ICM_Toolkit`。 +- [ ] **副作用**:沙箱通道(Node 子进程)以 `CodexSandboxOffline` 账户运行, + 它写出的文件 Owner 是沙箱账户而非 `guzhu`。 + 实测 `guzhu` 对这些文件仍有 Modify 权限(继承自 `Authenticated Users`), + 读写不受影响;但 git 的 **dubious ownership** 检查会因此误报, + 所以 `.git` 必须由本人账户创建(见决策 17)。 + 若以后再用沙箱通道写文件,注意同一问题。 ## 决策记录 @@ -92,11 +106,13 @@ | 14 | base 升级用 `conda update -n base --all`,而不是装新 conda | 计划干净(365 更新 / 0 删除 / 0 冲突),且能保留既有的 `lingbot-map` 环境 | | 15 | 项目环境 numpy **降**到 base 的 2.4.6 | 升 base 的 numpy 会连带把 BLAS 从 MKL 换成 OpenBLAS;宁可降一个 minor,也不动整套线性代数后端 | | 16 | 新增 `.gitattributes` 强制 LF | 仓库要给队友在 Windows/WSL/Linux 上 clone,不固定行尾会产生"整文件都变了"的假 diff | +| 17 | `.git` 由**本人账户 guzhu** 重建,不做 `safe.directory` 豁免 | 沙箱通道建的 `.git` Owner 是 `CodexSandboxOffline`,git 会报 dubious ownership。加全局豁免是把问题藏起来;直接以本人账户重建,仓库和远程(Gitea)身份一致 | +| 18 | `core.autocrlf=false`(仓库级) | 配合 `.gitattributes` 的 LF 策略,避免 Windows 上 checkout 又转成 CRLF | ## 下一步 -1. 按 `docs/03-roadmap.md` 的 **L0(12 个函数)** 顺序填实现,先写测试再写代码。 -2. 每写完一个函数,在 `examples/` 里加一行最小用法,并更新本文件。 -3. 在 Gitea 建空仓库 → `git remote add origin ...` → `git push -u origin main` - (命令见 `docs/05-git-workflow.md`)。 +1. 在 Gitea 建**空**仓库(不要初始化)→ `git remote add origin ...` → `git push -u origin main` + (命令见 `docs/05-git-workflow.md` §3,HTTPS 与 SSH 两版都有)。 +2. 按 `docs/03-roadmap.md` 的 **L0(12 个函数)** 顺序填实现,先写测试再写代码。 +3. 每写完一个函数,在 `examples/` 里加一行最小用法,并更新本文件。 4. L0 跑通后,找一道真题(建议 2025 C)走完整流程,反向沉淀函数。 diff --git a/docs/05-git-workflow.md b/docs/05-git-workflow.md index 3932731..45b2910 100644 --- a/docs/05-git-workflow.md +++ b/docs/05-git-workflow.md @@ -1,6 +1,7 @@ # Git 工作流与远程托管 -> 本仓库目前是**本地仓库**,之后托管到你自己的 Gitea。 +> 本仓库**已初始化**:分支 `main`,首次提交 `5319589`(76 文件),工作区干净。 +> 尚未配置远程,之后托管到你自己的 Gitea。 --- @@ -99,7 +100,25 @@ git remote set-url origin git@git.你的域名:用户名/mcm-icm-toolkit.git git push -u origin main ``` -### 4. 如果不想公开 +### 4. 仓库归属注意(重要) + +`.git` 必须是**你自己的账户**创建的。若用沙箱化的 AI agent 通道代跑 `git init`, +它可能以别的账户身份创建 `.git`,之后你自己跑 git 就会报: + + fatal: detected dubious ownership in repository + +正确做法是删掉重建(以本人账户): + + Remove-Item -LiteralPath .git -Recurse -Force + git init -b main + +**不要**用 `git config --global --add safe.directory` 绕过——那只是把问题藏起来, +而且会让 git 在真正的归属异常时也不再警告。 + +同理,沙箱通道写出的文件 Owner 会是沙箱账户,但权限继承自 +`Authenticated Users`(Modify),读写不受影响,只有 git 的归属检查会误报。 + +### 5. 如果不想公开 Gitea 建仓库时选 **Private**。队友通过 仓库设置 → 协作者 → 添加成员 授权。