Skip to content

Releases: Aetherialter/leetcode-local-cli

v0.11.0 — 用户状态解耦与安全分层

Choose a tag to compare

@github-actions github-actions released this 05 Sep 01:32

leetcode-local-cli 0.11.0 将登录凭据与刷题工作区分离,收紧 HTTP 凭据边界,并按模型、存储、外部集成和本地执行重组源码。本项目仍处于内测阶段,不兼容旧状态路径或旧内部 Python 导入路径。

用户体验

  • loginstatusprofileshowgetcheck 和默认 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 — 可靠提交与结果重查

Choose a tag to compare

@github-actions github-actions released this 09 Aug 06:32

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 浏览器授权自动登录

Choose a tag to compare

@github-actions github-actions released this 31 Jul 22:18

leetcode-local-cli 0.9.0 完整实现日常 Chrome 与 Edge 的显式授权自动登录闭环,并集中发布本地测试、编码边界和提交退出码的可靠性改进。

自动化登录

  • lc login 默认依次尝试日常 Chrome、日常 Edge 和隐藏输入的手动 Cookie;--browser chrome|edge 可以固定单一浏览器。
  • CLI 自动打开 chrome://inspect/#remote-debuggingedge://inspect/#remote-debugging 与 LeetCode,等待用户明确允许当前浏览器实例调试。
  • 浏览器未运行、DevToolsActivePort 指向已关闭实例、浏览器正在启动或后台实例返回 403 时,CLI 自动打开一次可见窗口,并在 180 秒总时限内恢复连接,不会因第一次启动竞态提前切换浏览器。
  • Chrome 与 Edge 共用受限的 approval-only WebSocket 实现;连接前验证浏览器身份与本机回环端点,只请求 https://leetcode.cn/ 的 Cookie,并只保留 LEETCODE_SESSIONcsrftoken
  • 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;testdoctorsubmit 对非法编码返回受控错误,不展示 UnicodeDecodeError traceback。
  • 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 与 Edge 150.0.4078.105 均完成用户明确授权的真实登录验收,Cookie 值未进入输出或报告。

v0.8.0 — 显式工作区与安装后初始化

Choose a tag to compare

@github-actions github-actions released this 29 Jul 23:55

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 — 安全边界与诊断流程加固

Choose a tag to compare

@github-actions github-actions released this 25 Jul 14:22

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 — 修正安装版命令提示

Choose a tag to compare

@github-actions github-actions released this 18 Jul 10:49

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 正式发布与一键安装

Choose a tag to compare

@github-actions github-actions released this 18 Jul 09:09

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 Changelogv0.6.0...v0.7.0

v0.6.0 - Diagnostics and stability

Choose a tag to compare

@Aetherialter Aetherialter released this 17 Jul 06:17

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

Choose a tag to compare

@Aetherialter Aetherialter released this 14 Jul 14:30

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

文档

  • README 当前版本更新为 v0.5.7
  • 环境要求从仅 Windows 更新为 Windows / Linux / macOS。
  • 补充 lc solve 生成模板后会尝试打开 solution.py 的跨平台说明。

验证

  • uv run lc --help
  • uv run ruff check src pyproject.toml tests
  • uv run pytest

测试结果:12 passed

v0.5.6 - Show pagination validation

Choose a tag to compare

@Aetherialter Aetherialter released this 11 Jun 14:46

更新内容

  • lc show 增加本地分页参数校验。
  • limit 必须为正整数。
  • limit 单次最大为 100。
  • skip 必须为非负整数。
  • 非法参数会在本地直接退出,不再请求 LeetCode。
  • 补充 service 层测试,覆盖 limit=0limit>100skip<0

验证命令

uv run ruff format src tests
uv run ruff check src pyproject.toml tests
uv run pytest
uv run lc --help