Releases: Aetherialter/leetcode-local-cli
Release list
v0.11.0 — 用户状态解耦与安全分层
leetcode-local-cli 0.11.0 将登录凭据与刷题工作区分离,收紧 HTTP 凭据边界,并按模型、存储、外部集成和本地执行重组源码。本项目仍处于内测阶段,不兼容旧状态路径或旧内部 Python 导入路径。
用户体验
login、status、profile、show、get、check和默认doctor不再要求初始化工作区;账号和题目查询仍需有效登录态。- 登录前明确展示 Chrome/Edge 的 Remote debugging 设置地址及勾选步骤,自动打开失败时也可按链接手动操作。
- 新增
lc solve <题号> --no-open,只保存解法。保存成功但系统无法打开文件时只警告,仍返回 0;写入失败返回 1 且不打开文件。 - 新增
lc init <完整路径> --repair,先同目录备份损坏配置的原始字节,再恢复配置;保留已有解法。不支持的版本、站点、语言及不安全目标不会被强制覆盖。 lc test --stdin的运行时启动错误也返回 JSON Lines 和稳定错误码;非法 CLI 参数仍返回用法错误和退出码 2。
安全与结构
- 凭据请求只允许精确
https://leetcode.cn的默认 HTTPS 端口,拒绝 URL 用户信息及全部重定向,避免 Cookie 外发和提交正文重放。 - Session 单次读取并统一校验,默认模型表示不显示凭据;Doctor 与正常命令共用相同校验结果。
- 源码按
commands / use_cases / models / storage / integrations / execution分层,用 AST 测试约束依赖方向。 - 账号、题目分页和详情使用不可变结果模型,错误分类不依赖中文字符串解析。
- 普通 push/PR 新增三平台 Python 3.12 CI;标签工作流继续负责质量门禁、PyPI Trusted Publishing 和 GitHub Release。
- 源码仓库不再跟踪根目录
solution.py,开发者工作区仍可与源码同目录,普通用户可自选目录。
升级说明
uv tool upgrade leetcode-local-cli
lc --version
lc login
lc init <原工作区完整路径> --yes首次安装使用 uv tool install leetcode-local-cli。从旧版本升级时,Session 需重新登录生成,工作区需重新注册;已有普通 solution.py 会保留。旧工作区 Session 和根目录 .leetcode-local-cli.toml 不自动读取、迁移或删除,请自行安全清理旧凭据。若已经使用本次内测的新状态路径,无需重复初始化或登录。
Session 保存在系统用户的本地状态目录,工作区 marker 位于 .leetcode_local_cli/workspace.toml,两者都不得提交或共享。Session 仍为明文,本地 worker 也不是安全沙箱。
验证
- Windows 通过 Ruff format、Ruff lint、Pyright 和 443 passed / 18 skipped 的完整测试;跳过项涉及符号链接权限和仅适用 POSIX/Bash 的检查。
- wheel/sdist 隔离安装验证版本和帮助入口、临时工作区初始化、无工作区 JSON 错误以及 worker 实际调用。
- 发布流程在 Linux、macOS、Windows 执行门禁及安装器验证;通过后才发布 PyPI 和 GitHub Release。
- 本轮未读取真实 Cookie,也未执行真实浏览器登录或 LeetCode 远程提交。
v0.10.1 — 可靠提交与结果重查
leetcode-local-cli 0.10.1 将提交过程改为有明确总预算和结构化结果的可靠流程,并新增已有提交的单次重查命令。CLI 同时完成应用层分离,为后续功能保持清晰依赖方向。
提交可靠性
lc submit取得 Submission ID 后默认等待 30 秒,可通过--wait-timeout设置大于 0 的有限总秒数。- 判题查询使用单调时钟总预算,请求超时和休眠都不会越过预算。
- 初始提交 POST 永不自动重试,避免网络状态不明时产生重复提交。
- 判题 GET 只对网络超时、网络错误、429 和 5xx 做有限重试,并遵守合法的
Retry-After。 - Accepted 返回退出码 0;其他判题、等待超时和查询失败返回 1,同时保留 Submission ID。
结果重查
- 新增
lc check <Submission ID>,只查询一次已有提交,不重新发送代码,也不持续占用终端。 - 已完成判题时展示状态、运行时间、内存和用例数量;仍在判题时提示稍后重试。
- Accepted 返回 0;Pending、非 Accepted 和查询失败返回 1;非法 ID 返回 2。
- 兼容 LeetCode 中文站当前同时返回原始
memory与展示字段status_memory的响应结构。
架构与维护
- CLI 形成
cli.py → commands/ → use_cases/ → core modules的单向依赖。 cli.py只负责应用创建和命令注册,命令层负责终端适配,用例层负责业务编排。- 提交检查、终态、超时、Pending 和查询失败使用不可变结构化结果,不再传播裸字典或
None。 - 维护文档按用户说明、项目状态、架构、产品边界、安全和技术决策拆分职责并完成轻量化。
- CLI 错误输出测试先移除 ANSI 样式再验证公开文本,保证本地与三平台 CI 行为一致。
验证
- Windows 通过 Ruff、Pyright、333 passed/13 skipped 的完整测试、wheel/sdist 构建及两种产物的隔离安装 smoke test。
- 在维护者明确授权下,随机选择 10 道免费 Easy 题完成真实提交,10 次均为 Accepted;随后对全部 Submission ID 执行
lc check,退出码均为 0。 - 真实验收没有输出 Cookie,测试结束后恢复了原有空
solution.py。
兼容性说明
- 当前仍只正式支持 LeetCode 中文站、Python3、单默认工作区和单个
solution.py。 - Session 继续以明文 JSON 保存在默认工作区,不得提交、同步或上传。
v0.9.0 — Chrome/Edge 浏览器授权自动登录
leetcode-local-cli 0.9.0 完整实现日常 Chrome 与 Edge 的显式授权自动登录闭环,并集中发布本地测试、编码边界和提交退出码的可靠性改进。
自动化登录
lc login默认依次尝试日常 Chrome、日常 Edge 和隐藏输入的手动 Cookie;--browser chrome|edge可以固定单一浏览器。- CLI 自动打开
chrome://inspect/#remote-debugging或edge://inspect/#remote-debugging与 LeetCode,等待用户明确允许当前浏览器实例调试。 - 浏览器未运行、
DevToolsActivePort指向已关闭实例、浏览器正在启动或后台实例返回 403 时,CLI 自动打开一次可见窗口,并在 180 秒总时限内恢复连接,不会因第一次启动竞态提前切换浏览器。 - Chrome 与 Edge 共用受限的 approval-only WebSocket 实现;连接前验证浏览器身份与本机回环端点,只请求
https://leetcode.cn/的 Cookie,并只保留LEETCODE_SESSION与csrftoken。 - Cookie 在线验证成功后才原子保存 Session;CLI 不读取或解密浏览器 Cookie 数据库,不创建专用 profile,也不关闭日常浏览器。
- 保留
--devtools-port作为明确浏览器的高级入口;删除无人使用的实验参数--chrome-debug-port。 - 删除旧专用 Chrome 生命周期、固定 9222 自动启动模型、
browser-cookie3及其传递依赖。
本地测试
lc test自动发现Solution的首个公开实例方法,交互接受name = value的安全 Python 字面量参数并展示实际返回值与调用后参数。- 每组使用新的
Solution实例和独立的默认 1 秒超时;异常或超时受控显示,超时后重启 worker。 lc test --stdin提供 JSON Lines 输入输出,便于 AI 与 CI 使用,不创建 cases 文件。- 没有输入、参数错误、执行异常或超时返回退出码 1;正常执行返回 0,但不把“能够运行”描述为算法正确。
可靠性与安全
lc solve生成的待实现方法使用显式NotImplementedError,避免空模板以None假通过并消除缺少返回值的类型错误。solution.py只接受 UTF-8/UTF-8 BOM;test、doctor、submit对非法编码返回受控错误,不展示UnicodeDecodeErrortraceback。lc submit只有明确 Accepted 返回退出码 0;Wrong Answer、Time Limit Exceeded、未知状态和轮询超时返回 1。- 浏览器、远端和本地的不可信文本继续按纯文本渲染,Cookie 不进入终端、测试报告或仓库。
兼容性说明
- 当前仍只正式支持 LeetCode 中文站和 Python3 提交。
- Session 继续保存在默认工作区的
.leetcode_local_cli/session.json,它包含明文 Cookie,不能提交、同步或上传。 - 原
--chrome-debug-port使用者应改为--browser chrome --devtools-port <端口>。
验证
- Windows 完成 Ruff、Pyright、288 passed/13 skipped 的完整测试、wheel/sdist 构建和 CLI 入口检查。
- Chrome
150.0.7871.187与 Edge150.0.4078.105均完成用户明确授权的真实登录验收,Cookie 值未进入输出或报告。
v0.8.0 — 显式工作区与安装后初始化
leetcode-local-cli 0.8.0 引入显式默认工作区、版本化配置和安装后初始化。
新增
- 新增跨平台用户配置、版本化工作区配置和不可变
AppPaths运行上下文。 - 新增
lc init [path];支持交互选择父目录,也支持lc init <完整路径> --yes自动验收。 - 官方 uv 安装脚本在可交互终端继续配置工作区;非交互环境安全跳过并给出手动命令。
改进
- 普通命令从任意目录运行时都使用明确的默认工作区,不再依赖模块导入时的当前目录。
lc init保留已有普通solution.py,重复执行幂等;版本更新直接复用有效工作区。solution.py、Session 和用户配置使用随机同目录临时文件与原子替换,写入失败时保护旧文件。- 符号链接、断链、目录、junction、Windows reparse point 和损坏配置会被明确拒绝。
兼容性与安全
- 当前仍采用单工作区、单个
solution.py、LeetCode 中文站和 Python3 提交。 - Session 暂时保存在默认工作区的
.leetcode_local_cli/session.json,不会迁移旧.aether_lc/session.json;升级后请重新执行lc login。 - Session 是明文秘密,不能输出、提交、同步或上传。CI 仍只使用假 Cookie,不执行真实远程提交。
- 直接执行
uv tool install leetcode-local-cli后需要手动运行lc init。
v0.7.2 — 安全边界与诊断流程加固
v0.7.2 是安全性和可诊断性补丁版本,保持现有单题工作流不变。
修复
lc doctor默认不再执行solution.py;需要执行解题文件时必须显式传入--run-solution。- 转义来自远端接口和本地文件的 Rich markup 与控制字符,避免终端显示内容注入。
- Cookie 域名改用标签边界匹配,不再接受仅以
leetcode.cn结尾的非目标域名。 - 远端响应边界改用显式类型检查,确保在 Python 优化模式下仍返回结构化错误。
- 浏览器 Cookie 读取只忽略已知环境异常,使意外程序错误保留 traceback。
- 安装器不再自动下载和执行 uv 远端安装脚本;未检测到 uv 时仅提示官方文档。
文档
- 新增长期项目设计手册与源码安全审计清单。
- 明确当前单文件
solution.py覆盖行为与链接目标风险的区别。
升级
uv tool upgrade leetcode-local-cli
lc --version预期版本:
leetcode-local-cli 0.7.2
Full Changelog: v0.7.1...v0.7.2
v0.7.1 — 修正安装版命令提示
v0.7.1 是针对 PyPI 安装体验的补丁版本。
修复
lc doctor的建议命令从源码开发模式的uv run lc ...改为安装后可直接执行的lc ...。- 登录态失效、Cookie 缺失和提交凭证缺失时的建议同步改为
lc login。 - 增加对安装版命令提示的回归测试。
升级
uv tool upgrade leetcode-local-cli
lc --version预期版本:
leetcode-local-cli 0.7.1
Full Changelog: v0.7.0...v0.7.1
v0.7.0 — PyPI 正式发布与一键安装
v0.7.0 将项目从“需要克隆源码运行”升级为可通过 PyPI 直接安装的正式 CLI 工具,并完成项目命名、配置目录和发布流程的
标准化。
新增功能
-
正式发布至 PyPI:
uv tool install leetcode-local-cli
-
新增 Linux/macOS 一键安装脚本。
-
新增 Windows PowerShell 一键安装脚本。
-
未安装 uv 时,通过 uv 官方 HTTPS 安装脚本自动完成引导。
-
安装完成后自动验证
lc --version。 -
完善
lc doctor的 Session、网络、登录态和工作区诊断。 -
建立 GitHub Actions 自动发布流程:
- Linux、macOS、Windows 三平台验证
- Ruff 格式与静态检查
- Pyright 类型检查
- Pytest 自动测试
- wheel 与源码包构建及冒烟测试
- PyPI Trusted Publishing
- GitHub Release 自动创建
命名标准化
- PyPI 发行包:
leetcode-local-cli - Python 模块:
leetcode_local_cli - CLI 命令:
lc - 配置目录:
.leetcode_local_cli - 环境变量前缀:
LEETCODE_LOCAL_CLI_* - GitHub 仓库:
leetcode-local-cli
旧版 .aether_lc/session.json 会在首次使用时自动迁移到 .leetcode_local_cli/session.json,无需手动复制 Cookie。
Windows 兼容性
- Windows 使用独立 PowerShell 安装器进行真实安装验证。
- CLI 输出统一使用 UTF-8,解决非 UTF-8 Windows 环境中中文输出触发的
UnicodeEncodeError。
安装与升级
uv tool install --force leetcode-local-cli
lc --version
lc --help预期版本:
leetcode-local-cli 0.7.0
Full Changelog:v0.6.0...v0.7.0
v0.6.0 - Diagnostics and stability
v0.6.0
新增
- 新增
lc doctor,一次检查 Session 文件、LeetCode 中文站连通性、Cookie 登录态和solution.py。 solution.py诊断覆盖文件状态、Python 语法、提交元数据和本地运行,运行检查最长 10 秒。lc submit提交前展示题号、标题和title_slug,帮助确认提交目标。
稳定性
- 统一 HTTP 请求边界,区分网络、HTTP、JSON、接口结构、登录态和 CSRF 错误。
- 加强用户状态、题目列表、题目详情、统计、提交和判题响应的结构校验,避免异常响应触发 traceback。
lc test增加文件缺失、空文件、读取失败和语法错误提示。- 修复生成模板时可能产生
pass pass的问题,并改用当前 Python 解释器运行本地解法。 - 加强题目数据标准化,对异常标签、代码模板和字段类型安全降级。
安全与工程质量
- 手动粘贴 Cookie 时不再回显输入。
- Session 改为原子写入,并在支持的平台设置为仅当前用户可读写。
- 移除未使用的
requests依赖,将 Pyright 固定为开发依赖。 - 更新 README、ROADMAP、项目版本和锁文件。
验证
- 93 项自动化测试全部通过。
- Ruff 格式与静态检查通过。
- Pyright:0 errors、0 warnings。
- 源码包和 wheel 构建通过。
- 真实
lc doctor网络与登录态验证通过。
Full Changelog: v0.5.7...v0.6.0
v0.5.7 - Fix non-Windows CLI startup
v0.5.7
修复
- 修复 Linux/macOS 等非 Windows 环境下启动 CLI 失败的问题。
- 原因是
workspace.py顶层导入了 Windows 专属的os.startfile,导致在 Linux 上执行uv run lc --help时直
接抛出ImportError。 - 现在改为按平台选择打开方式:
- Windows:
os.startfile - macOS:
open - Linux:
xdg-open
- Windows:
文档
- README 当前版本更新为
v0.5.7。 - 环境要求从仅 Windows 更新为 Windows / Linux / macOS。
- 补充
lc solve生成模板后会尝试打开solution.py的跨平台说明。
验证
uv run lc --helpuv run ruff check src pyproject.toml testsuv run pytest
测试结果:12 passed
v0.5.6 - Show pagination validation
更新内容
- 为
lc show增加本地分页参数校验。 limit必须为正整数。limit单次最大为 100。skip必须为非负整数。- 非法参数会在本地直接退出,不再请求 LeetCode。
- 补充 service 层测试,覆盖
limit=0、limit>100和skip<0。
验证命令
uv run ruff format src tests
uv run ruff check src pyproject.toml tests
uv run pytest
uv run lc --help