Not in the top 1,000 by GitHub stars

zhutoumeme/mcd-git

用 git 命令点麦当劳:add 放购物车,rebase 凑最省,push 确认后才下单;card 生成 1024 吃麦贡献图(3D 汉堡天际线 / 年度小票)。基于麦当劳 MCP Server,附 --demo 无 Token 试玩和 Agent Skill。非官方参赛作品。

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → cb1601dad6dc

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit cb1601dad6dc2ed44034fd15bb8dbccaf9d438af

85GitHub stars
0stars in 7 days
1skill in this repository
76commits in 30 days

Heat

1.8
  • Star growth, last 7 daysNot available
  • Star growth, last 24 hoursNot available
  • Rank movement, last 7 daysNot available
  • Commits, last 30 daysNot available
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekNot available

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Oct 25, 2026Oct 25, 202685

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

mcd-git

When your agent uses it

用本地命令行 mcd-git(git mcd --json)帮用户点麦当劳:选门店、看菜单、加购物车(去酸黄瓜、少冰、套餐换搭)、自动凑套餐挑最省的券、核价、下单拿支付链接、查取餐码、再来一单、取消订单、领券(pull,先确认),以及生成 1024 吃麦贡献图(card)。用户提到点麦当劳、麦当劳到店 / 得来速 / 麦乐送、取餐码、再来一单、取消麦当劳订单、领麦当劳的券、吃麦贡献图时使用。下单、取消和领券都必须先把确认摘要给用户看,用户明确同意后才能带 --confirm 执行。

What it loads into context

Frontmatter

191 tokens

Always available to the agent

SKILL.md

4,367 tokens

When the skill is activated

Reference documents

20,934 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. 前提
  2. 必须遵守的规则
  3. 常用流程
  4. 一个完整例子

Scripts executed separately

  • scripts/make_screenshots.py
  • src/mcd_git/__init__.py
  • src/mcd_git/__main__.py
  • src/mcd_git/api.py
  • src/mcd_git/card.py
  • src/mcd_git/card_receipt.py
  • src/mcd_git/card_skyline.py
  • src/mcd_git/cart.py
  • src/mcd_git/cli.py
  • src/mcd_git/commands/__init__.py
  • src/mcd_git/commands/card.py
  • src/mcd_git/commands/cherry_pick.py
  • src/mcd_git/commands/commit.py
  • src/mcd_git/commands/common.py
  • src/mcd_git/commands/completion.py
  • src/mcd_git/commands/diff.py
  • src/mcd_git/commands/fetch.py
  • src/mcd_git/commands/help.py
  • src/mcd_git/commands/init.py
  • src/mcd_git/commands/log.py
  • src/mcd_git/commands/log_stat.py
  • src/mcd_git/commands/pull.py
  • src/mcd_git/commands/push.py
  • src/mcd_git/commands/rebase.py
  • src/mcd_git/commands/revert.py
  • src/mcd_git/commands/stage.py
  • src/mcd_git/commands/status.py
  • src/mcd_git/complete.py
  • src/mcd_git/completion.py
  • src/mcd_git/context.py
  • src/mcd_git/demo/__init__.py
  • src/mcd_git/demo/client.py
  • src/mcd_git/demo/world.py
  • src/mcd_git/entry.py
  • src/mcd_git/errors.py
  • src/mcd_git/gate.py
  • src/mcd_git/history.py
  • src/mcd_git/ledger.py
  • src/mcd_git/mcp_client.py
  • src/mcd_git/menucache.py
  • src/mcd_git/money.py
  • src/mcd_git/optimizer.py
  • src/mcd_git/render.py
  • src/mcd_git/state.py
  • src/mcd_git/stats.py
  • src/mcd_git/textnorm.py
  • tests/__init__.py
  • tests/conftest.py
  • tests/test_card.py
  • tests/test_card_styles.py
  • tests/test_cart_state.py
  • tests/test_cli_ux.py
  • tests/test_client.py
  • tests/test_complete.py
  • tests/test_completion.py
  • tests/test_completion_e2e.py
  • tests/test_demo_e2e.py
  • tests/test_ledger.py
  • tests/test_log_stat.py
  • tests/test_menu_cache.py
  • tests/test_menu_cart.py
  • tests/test_optimizer.py
  • tests/test_parsing.py
  • tests/test_paths.py
  • tests/test_pull_gate.py
  • tests/test_push_gate.py
  • tests/test_qr.py

Files

  • .gitignoreasset138 bytes
  • CHANGELOG.mddoc16,583 bytes
  • CONTEST_DECLARATION.mddoc1,522 bytes
  • LICENSEasset1,067 bytes
  • MCP_INTEGRATION.mddoc17,669 bytes
  • README.mddoc33,245 bytes
  • SKILL.mdcore14,385 bytes
  • SKILL.mdcore14,385 bytes
  • assets/add.svgasset4,683 bytes
  • assets/badges/demo.svgasset728 bytes
  • assets/badges/license.svgasset700 bytes
  • assets/badges/mcp.svgasset720 bytes
  • assets/badges/python.svgasset700 bytes
  • assets/badges/unofficial.svgasset725 bytes
  • assets/card-demo.svgasset26,921 bytes
  • assets/card-grid-demo.svgasset26,916 bytes
  • assets/card-receipt-demo.svgasset27,273 bytes
  • assets/card-receipt.svgasset111,082 bytes
  • assets/card.svgasset61,885 bytes
  • assets/cherry-pick.svgasset4,760 bytes
  • assets/commit.svgasset4,648 bytes
  • assets/demo.gifasset380,447 bytes
  • assets/diff.svgasset7,349 bytes
  • assets/help.svgasset24,715 bytes
  • assets/init.svgasset8,954 bytes
  • assets/log-graph.svgasset12,106 bytes
  • assets/log-stat.svgasset18,698 bytes
  • assets/pull.svgasset11,956 bytes
  • assets/push.svgasset161,936 bytes
  • assets/rebase.svgasset8,617 bytes
  • assets/show.svgasset11,891 bytes
  • assets/status.svgasset7,452 bytes
  • mcp-config.example.jsonasset194 bytes
  • pyproject.tomlasset1,127 bytes
  • scripts/demo.tapeasset1,584 bytes
  • scripts/make_screenshots.pyruns8,131 bytes
  • src/mcd_git/__init__.pyruns119 bytes
  • src/mcd_git/__main__.pyruns50 bytes
  • src/mcd_git/api.pyruns25,652 bytes
  • src/mcd_git/card.pyruns14,399 bytes
  • src/mcd_git/card_receipt.pyruns13,180 bytes
  • src/mcd_git/card_skyline.pyruns13,204 bytes
  • src/mcd_git/cart.pyruns11,657 bytes
  • src/mcd_git/cli.pyruns11,195 bytes
  • src/mcd_git/commands/__init__.pyruns98 bytes
  • src/mcd_git/commands/card.pyruns7,483 bytes
  • src/mcd_git/commands/cherry_pick.pyruns6,179 bytes
  • src/mcd_git/commands/commit.pyruns5,305 bytes
  • src/mcd_git/commands/common.pyruns5,364 bytes
  • src/mcd_git/commands/completion.pyruns1,133 bytes
  • src/mcd_git/commands/diff.pyruns7,794 bytes
  • src/mcd_git/commands/fetch.pyruns2,526 bytes
  • src/mcd_git/commands/help.pyruns3,277 bytes
  • src/mcd_git/commands/init.pyruns12,125 bytes
  • src/mcd_git/commands/log.pyruns17,011 bytes
  • src/mcd_git/commands/log_stat.pyruns8,508 bytes
  • src/mcd_git/commands/pull.pyruns13,128 bytes
  • src/mcd_git/commands/push.pyruns24,011 bytes
  • src/mcd_git/commands/rebase.pyruns6,442 bytes
  • src/mcd_git/commands/revert.pyruns9,160 bytes
  • src/mcd_git/commands/stage.pyruns13,984 bytes
  • src/mcd_git/commands/status.pyruns7,275 bytes
  • src/mcd_git/complete.pyruns4,236 bytes
  • src/mcd_git/completion.pyruns29,775 bytes
  • src/mcd_git/context.pyruns6,325 bytes
  • src/mcd_git/demo/__init__.pyruns288 bytes
  • src/mcd_git/demo/client.pyruns22,882 bytes
  • src/mcd_git/demo/world.pyruns26,423 bytes
  • src/mcd_git/entry.pyruns570 bytes
  • src/mcd_git/errors.pyruns2,649 bytes
  • src/mcd_git/gate.pyruns2,994 bytes
  • src/mcd_git/history.pyruns4,586 bytes
  • src/mcd_git/ledger.pyruns9,982 bytes
  • src/mcd_git/mcp_client.pyruns17,115 bytes
  • src/mcd_git/menucache.pyruns9,238 bytes
  • src/mcd_git/money.pyruns2,119 bytes
  • src/mcd_git/optimizer.pyruns12,889 bytes
  • src/mcd_git/render.pyruns18,106 bytes
  • src/mcd_git/state.pyruns8,253 bytes
  • src/mcd_git/stats.pyruns2,784 bytes
  • src/mcd_git/textnorm.pyruns1,654 bytes
  • tests/__init__.pyruns0 bytes
  • tests/conftest.pyruns5,556 bytes
  • tests/test_card.pyruns27,253 bytes
  • tests/test_card_styles.pyruns26,507 bytes
  • tests/test_cart_state.pyruns6,938 bytes
  • tests/test_cli_ux.pyruns16,016 bytes
  • tests/test_client.pyruns16,827 bytes
  • tests/test_complete.pyruns9,831 bytes
  • tests/test_completion.pyruns18,472 bytes
  • tests/test_completion_e2e.pyruns15,465 bytes
  • tests/test_demo_e2e.pyruns15,929 bytes
  • tests/test_ledger.pyruns10,338 bytes
  • tests/test_log_stat.pyruns10,438 bytes
  • tests/test_menu_cache.pyruns9,634 bytes
  • tests/test_menu_cart.pyruns18,526 bytes
  • tests/test_optimizer.pyruns4,101 bytes
  • tests/test_parsing.pyruns6,232 bytes
  • tests/test_paths.pyruns2,358 bytes
  • tests/test_pull_gate.pyruns27,066 bytes
  • tests/test_push_gate.pyruns23,743 bytes
  • tests/test_qr.pyruns23,448 bytes
Read SKILL.md

# mcd-git:用 git 命令点麦当劳

mcd-git 把麦当劳中国 MCP Server 包装成 git 风格的命令:`add` 放进购物车,`rebase` 凑最省,`commit` 锁单,`push` 才真正下单。你通过 `git mcd … --json` 操作它,读 JSON 结果,再用自然语言告诉用户。

## 前提

- **需要能在用户本机执行命令。** 只能对话、不能跑命令的环境用不了这个 Skill。
- **安装**(没装时):
  ```bash
  uv tool install git+https://github.com/zhutoumeme/mcd-git
  # 没有 uv:
  pip install "git+https://github.com/zhutoumeme/mcd-git"
  ```
  装好后运行 `git mcd help` 确认(也可以用等价的 `mcd-git help`)。看命令对照表一律用 `git mcd help`;不要在 `mcd` 后面直接跟 `--help`,那样会被 git 拦截去找 man 手册。单个子命令的帮助用 `git mcd <命令> -h`。**人工在终端操作和补全时优先用 `mcd-git`;Agent 自动化仍走 `git mcd --json`。**真人用户需要 TAB 补全时,按 README 的平台说明运行 `mcd-git completion powershell` / `bash` / `zsh` / `fish`,再重载对应 shell;Agent 不需要安装或调用补全脚本。
View the complete source on GitHub

Skills included

  • mcd-git

Repository facts

License
MIT
Created
Oct 10, 2026
Last pushed
Oct 13, 2026
Forks
0
Open issues
0
Project activity
Active

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 5, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 24 notes
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • assets/card-receipt.svg:166 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card-receipt.svg:165 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card-receipt.svg:183 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card-receipt.svg:181 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card-receipt.svg:184 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card-receipt.svg:182 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card-receipt.svg:185 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card-receipt.svg:186 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card-receipt.svg:187 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card-receipt.svg:188 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card-receipt.svg:189 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card.svg:115 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card.svg:113 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card.svg:116 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card.svg:114 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card.svg:117 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card.svg:118 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card.svg:119 Analysis incomplete: physical or joined line exceeds character limit
  • assets/card.svg:120 Analysis incomplete: physical or joined line exceeds character limit
Show all 266 signals by file

.gitignore

  • Access to secretsline 4
    [Credential-related source omitted]

CHANGELOG.md

  • Dangerous shell operationline 21
    - `mcd-git completion bash|zsh|fish`:打印命令补全脚本,子命令、选项、`--qr` / `--style` 等取值都能补,zsh 候选带中文说明。安装:`eval "$(mcd-git completion zsh)"`(或 `bash`,macOS 自带 bash 3.2 可用);fish 写进 `~/.config/fish/completions/`。脚本由 argparse 的定义自动导出,以后加命令不用另改。
  • Access to secretsline 39
    [Credential-related source omitted]
  • Network accessline 91
    - `push`(create-order)和 `revert`(cancel-order)走确认闸:先出摘要,用户同意后 `--confirm` 执行;commit、参数、重新算出的价格和下单指纹任何一项对不上都拒绝;结果未知不重试。 - `--demo` 合成数据全流程离线可玩;`--json` 输出 + SKILL.md 给 Agent 用。 - 终端里直接出支付二维码;只连 `https://mcp.mcd.cn`,不跟随重定向。
  • Network accessline 93
    - 终端里直接出支付二维码;只连 `https://mcp.mcd.cn`,不跟随重定向。

MCP_INTEGRATION.md

  • Network accessline 8
    |---|---| | Server | 麦当劳中国 MCP Server(`serverInfo`:`mcd-mcp` 1.0.0) | | 地址 | `https://mcp.mcd.cn`(写死在代码里,不读环境变量;别的协议或主机在发请求前就拒绝;不跟随重定向,服务端回 30x 直接报错,Token 不会被带去别处) |
  • Network accessline 9
    | Server | 麦当劳中国 MCP Server(`serverInfo`:`mcd-mcp` 1.0.0) | | 地址 | `https://mcp.mcd.cn`(写死在代码里,不读环境变量;别的协议或主机在发请求前就拒绝;不跟随重定向,服务端回 30x 直接报错,Token 不会被带去别处) | | 传输 | Streamable HTTP,JSON-RPC 2.0,协议版本 `2025-06-18`;兼容 `application/json` 和 SSE 两种
  • Network accessline 10
    | 地址 | `https://mcp.mcd.cn`(写死在代码里,不读环境变量;别的协议或主机在发请求前就拒绝;不跟随重定向,服务端回 30x 直接报错,Token 不会被带去别处) |
  • Access to secretsline 13
    [Credential-related source omitted]

README.md

  • Network accessline 35
    Agent:(git mcd push --at 12:20 --locker --no-tableware --confirm bfc651c --json)        下好了,请在 12:05 前打开这个链接付款:https://example.com/mcd-git-demo/pay?orderId=1024…
  • Network accessline 36
    下好了,请在 12:05 前打开这个链接付款:https://example.com/mcd-git-demo/pay?orderId=1024…
  • Network accessline 124
    uvx --from git+https://github.com/zhutoumeme/mcd-git mcd-git --demo status
  • Network accessline 130
    pip install "git+https://github.com/zhutoumeme/mcd-git"   # 或 uv tool install git+https://github.com/zhutoumeme/mcd-git
  • Dangerous shell operationline 306
    sudo apt-get update && sudo apt-get install -y bash-completion  # 只需安装一次
  • Network accessline 353
    1. **申请 Token**:在 [麦当劳 MCP 开放平台](https://open.mcd.cn/mcp) 登录控制台,激活并复制 MCP Token。
  • Access to secretsline 361
    [Credential-related source omitted]
  • Access to secretsline 369
    [Credential-related source omitted]
  • Access to secretsline 377
    [Credential-related source omitted]
  • Access to secretsline 386
    [Credential-related source omitted]
  • Network accessline 395
    请帮我安装 mcd-git 这个点麦当劳的 Skill: 1. 运行 uv tool install git+https://github.com/zhutoumeme/mcd-git(没有 uv 就用 pip install "git+https://github.com/zhutoumeme/mcd-git"),然后运行 `mcd-git help` 确认装好了;
  • Network accessline 396
    1. 运行 uv tool install git+https://github.com/zhutoumeme/mcd-git(没有 uv 就用 pip install "git+https://github.com/zhutoumeme/mcd-git"),然后运行 `mcd-git help` 确认装好了;
  • Network accessline 397
    2. 把 https://github.com/zhutoumeme/mcd-git 仓库根目录的 SKILL.md 装进你的 Skill 目录(Claude Code 是 ~/.claude/skills/mcd-git/SKILL.md,Kiro 是 ~/.kiro/skills/mcd-git/SKILL.md,WorkBuddy 在「技能」里导入);
  • Network accessline 406
    - **结果未知不重试**:网络超时、响应不完整、返回看不懂、按了 Ctrl+C,这些情况都不会自动重发 `create-order`,会提示先 `mcd-git log` 核对,避免重复下单;`pull` 同样不会重发 `auto-bind-coupons`,会提示先 `mcd-git status` 或 `mcd-git fetch` 核对。 - **低频、手动**:每条命令由你触发;领券每次都由你手动触发,只领你自己账户的券,不做定时或循环领取;`calculate-p
  • Network accessline 408
    - **隐私**:Token 只在请求头里,只发给 `https://mcp.mcd.cn`(地址写死在代码里,不能用环境变量改);收货地址只保留 addressId 和打码提示;状态文件在 `~/.config/mcd-git/`(目录 700、文件 600),本机订单账本 `ledger.json` 也在这里,只存贡献图要用的字段(见「1024 特别版」);给命令补全用的菜单缓存 `menu-cache.json` 也在这里,只有餐品 code、名称、类型和门店,按 TA

SKILL.md

  • Network accessline 15
    uv tool install git+https://github.com/zhutoumeme/mcd-git
  • Network accessline 17
    pip install "git+https://github.com/zhutoumeme/mcd-git"

assets/add.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 147.6" xmlns="http://www.w3.org/2000/svg">

assets/badges/demo.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" width="156" height="20" role="img" aria-label="try: --demo 无需 Token"><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/><

assets/badges/license.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" width="90" height="20" role="img" aria-label="license: MIT"><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGr

assets/badges/mcp.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" width="146" height="20" role="img" aria-label="MCP: streamable http"><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/><

assets/badges/python.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" width="90" height="20" role="img" aria-label="python: 3.9+"><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGr

assets/badges/unofficial.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" width="104" height="20" role="img" aria-label="非官方: 参赛作品"><linearGradient id="s" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGrad

assets/card-demo.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" width="1200" height="624" viewBox="0 0 1200 624" role="img" aria-labelledby="t d">

assets/card-grid-demo.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" width="750" height="288" viewBox="0 0 750 288" role="img" aria-labelledby="t d">

assets/card-receipt-demo.svg

  • Network accessline 1
    <svg xmlns="http://www.w3.org/2000/svg" width="480" height="778" viewBox="-20 -20 480 778" role="img" aria-labelledby="t d">

assets/card-receipt.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 1074.8" xmlns="http://www.w3.org/2000/svg">

assets/card.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 586.8" xmlns="http://www.w3.org/2000/svg">

assets/cherry-pick.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 172.0" xmlns="http://www.w3.org/2000/svg">

assets/commit.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 172.0" xmlns="http://www.w3.org/2000/svg">

assets/diff.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 318.4" xmlns="http://www.w3.org/2000/svg">

assets/help.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 708.8" xmlns="http://www.w3.org/2000/svg">

assets/init.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 318.4" xmlns="http://www.w3.org/2000/svg">

assets/log-graph.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 269.6" xmlns="http://www.w3.org/2000/svg">

assets/log-stat.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 1074.8" xmlns="http://www.w3.org/2000/svg">

assets/pull.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 440.4" xmlns="http://www.w3.org/2000/svg">

assets/push.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 1489.6" xmlns="http://www.w3.org/2000/svg">
  • Network accessline 270
    </text><text class="terminal-3550284747-r3" x="1171.2" y="1288.8" textLength="12.2" clip-path="url(#terminal-3550284747-line-52)"> </text><text class="terminal-3550284747-r3" x="1171.2" y="1313.2" textLength="12.2" clip-path="url(#terminal-
  • Network accessline 271
    </text><text class="terminal-3550284747-r3" x="1171.2" y="1313.2" textLength="12.2" clip-path="url(#terminal-3550284747-line-53)"> </text><text class="terminal-3550284747-r3" x="0" y="1337.6" textLength="122.0" clip-path="url(#terminal-3550
  • Network accessline 272
    </text><text class="terminal-3550284747-r3" x="0" y="1337.6" textLength="122.0" clip-path="url(#terminal-3550284747-line-54)">支付链接:</text><text class="terminal-3550284747-r8" x="122" y="1337.6" textLength="890.6" clip-path="url(#terminal-35

assets/rebase.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 318.4" xmlns="http://www.w3.org/2000/svg">

assets/show.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 513.5999999999999" xmlns="http://www.w3.org/2000/svg">
  • Network accessline 113
    </text><text class="terminal-745004022-r9" x="0" y="312.8" textLength="158.6" clip-path="url(#terminal-745004022-line-12)">╰───────────╯</text><text class="terminal-745004022-r3" x="1171.2" y="312.8" textLength="12.2" clip-path="url(#termin
  • Network accessline 114
    </text><text class="terminal-745004022-r3" x="0" y="337.2" textLength="73.2" clip-path="url(#terminal-745004022-line-13)">取餐柜</text><text class="terminal-745004022-r2" x="73.2" y="337.2" textLength="134.2" clip-path="url(#terminal-745004022
  • Network accessline 115
    </text><text class="terminal-745004022-r10" x="0" y="361.6" textLength="878.4" clip-path="url(#terminal-745004022-line-14)">https://example.com/mcd-git-demo/locker/1024202610241150000000000001.png</text><text class="terminal-745004022-r3" x

assets/status.svg

  • Network accessline 1
    <svg class="rich-terminal" viewBox="0 0 1190 342.79999999999995" xmlns="http://www.w3.org/2000/svg">

mcp-config.example.json

  • Network accessline 3
    "mcd-mcp": {       "type": "streamablehttp",       "url": "https://mcp.mcd.cn",
  • Network accessline 4
    "type": "streamablehttp",       "url": "https://mcp.mcd.cn",       "headers": {
  • Network accessline 5
    "url": "https://mcp.mcd.cn",
  • Access to secretsline 7
    [Credential-related source omitted]

pyproject.toml

  • Network accessline 31
    [project.urls] Homepage = "https://github.com/zhutoumeme/mcd-git"
  • Network accessline 32
    Homepage = "https://github.com/zhutoumeme/mcd-git"

scripts/make_screenshots.py

  • Executable scriptline 1
    Executable file
  • Network accessline 108
    BADGE = (     '<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="20" role="img" aria-label="{label}: {value}">'
  • Network accessline 109
    '<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="20" role="img" aria-label="{label}: {value}">'
  • Access to secretsline 142
    [Credential-related source omitted]
  • Access to secretsline 144
    [Credential-related source omitted]

src/mcd_git/__init__.py

  • Executable scriptline 1
    Executable file

src/mcd_git/__main__.py

  • Executable scriptline 1
    Executable file

src/mcd_git/api.py

  • Executable scriptline 1
    Executable file

src/mcd_git/card.py

  • Executable scriptline 1
    Executable file
  • Network accessline 207
    def render_svg(model: Dict[str, Any]) -> str:     out = [         f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria-labelledby="t d">',
  • Network accessline 208
    out = [         f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria-labelledby="t d">',         f'<title id="t">{_esc(model["title"])}</title>',
  • Network accessline 209
    f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria-labelledby="t d">',

src/mcd_git/card_receipt.py

  • Executable scriptline 1
    Executable file
  • Network accessline 213
    title = f"年度吃麦小票:{model['span']['label']} {model['total']} 单"     head = [         f'<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="{h}" viewBox="-{MARGIN} -{MARGIN} {w} {h}" role="img" aria-labelledby="t d">',
  • Network accessline 214
    head = [         f'<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="{h}" viewBox="-{MARGIN} -{MARGIN} {w} {h}" role="img" aria-labelledby="t d">',         f'<title id="t">{_esc(title)}</title>',
  • Network accessline 215
    f'<svg xmlns="http://www.w3.org/2000/svg" width="{w}" height="{h}" viewBox="-{MARGIN} -{MARGIN} {w} {h}" role="img" aria-labelledby="t d">',

src/mcd_git/card_skyline.py

  • Executable scriptline 1
    Executable file
  • Network accessline 192
    desc = model["desc"] + "每天吃了几次就叠几层汉堡" + (",10-24 插了一面 0x400 小旗。" if model["mark_date"] else "。")     out = [         f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria-
  • Network accessline 193
    out = [         f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria-labelledby="t d">',         f'<title id="t">{_esc(title)}</title>',
  • Network accessline 194
    f'<svg xmlns="http://www.w3.org/2000/svg" width="{WIDTH}" height="{HEIGHT}" viewBox="0 0 {WIDTH} {HEIGHT}" role="img" aria-labelledby="t d">',

src/mcd_git/cart.py

  • Executable scriptline 1
    Executable file

src/mcd_git/cli.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 178
    [Credential-related source omitted]

src/mcd_git/commands/__init__.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/card.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/cherry_pick.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/commit.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/common.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/completion.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/diff.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/fetch.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/help.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/init.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/log.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/log_stat.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/pull.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/push.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/rebase.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/revert.py

  • Executable scriptline 1
    Executable file

src/mcd_git/commands/stage.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 276
    [Credential-related source omitted]

src/mcd_git/commands/status.py

  • Executable scriptline 1
    Executable file

src/mcd_git/complete.py

  • Executable scriptline 1
    Executable file

src/mcd_git/completion.py

  • Executable scriptline 1
    Executable file

src/mcd_git/context.py

  • Executable scriptline 1
    Executable file

src/mcd_git/demo/__init__.py

  • Executable scriptline 1
    Executable file

src/mcd_git/demo/client.py

  • Executable scriptline 1
    Executable file

src/mcd_git/demo/world.py

  • Executable scriptline 1
    Executable file
  • Network accessline 16
    DEMO_LINK = "https://example.com/mcd-git-demo"

src/mcd_git/entry.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 15
    [Credential-related source omitted]

src/mcd_git/errors.py

  • Executable scriptline 1
    Executable file

src/mcd_git/gate.py

  • Executable scriptline 1
    Executable file

src/mcd_git/history.py

  • Executable scriptline 1
    Executable file

src/mcd_git/ledger.py

  • Executable scriptline 1
    Executable file

src/mcd_git/mcp_client.py

  • Executable scriptline 1
    Executable file
  • Network accessline 5
    ~/.config/mcd-mcp/token(所有平台保留,向后兼容)。Token 只放进请求头,   不打印、不写日志、不出现在异常信息和 repr 里。 - 地址写死为 https://mcp.mcd.cn,不读任何环境变量;别的协议或主机在发请求前就拒绝,也不跟随重定向,Token 不会被带去别处。
  • Network accessline 6
    不打印、不写日志、不出现在异常信息和 repr 里。 - 地址写死为 https://mcp.mcd.cn,不读任何环境变量;别的协议或主机在发请求前就拒绝,也不跟随重定向,Token 不会被带去别处。 - 写操作 tool(下单、取消、领券……)默认拒绝;只有 push / revert / pull 的确认闸会带 allow_write=True,
  • Network accessline 7
    - 地址写死为 https://mcp.mcd.cn,不读任何环境变量;别的协议或主机在发请求前就拒绝,也不跟随重定向,Token 不会被带去别处。
  • Network accessline 14
    import http.client
  • Network accessline 29
    DEFAULT_URL = "https://mcp.mcd.cn"
  • Access to secretsline 68
    [Credential-related source omitted]
  • Access to secretsline 107
    [Credential-related source omitted]
  • Access to secretsline 110
    [Credential-related source omitted]
  • Access to secretsline 121
    [Credential-related source omitted]
  • Access to secretsline 122
    [Credential-related source omitted]
  • Network accessline 220
    """请求头里带着 Token,所以只允许 https://mcp.mcd.cn(默认端口、不带用户名密码),否则直接 fatal。"""
  • Network accessline 250
    def _default_opener(request: urllib.request.Request, timeout: float):
  • Network accessline 251
    return _OPENER.open(request, timeout=timeout)  # noqa: S310(地址经 check_url 校验,只会是 https://mcp.mcd.cn;不跟随重定向)
  • Network accessline 324
    self._sleep(wait)             self._last_sent = time.monotonic()             request = urllib.request.Request(self.url, data=body, headers=self._headers(), method="POST")
  • Network accessline 325
    self._last_sent = time.monotonic()             request = urllib.request.Request(self.url, data=body, headers=self._headers(), method="POST")             try:
  • Network accessline 326
    request = urllib.request.Request(self.url, data=body, headers=self._headers(), method="POST")
  • Network accessline 340
    reason = getattr(err, "reason", None) or err.__class__.__name__                 raise McdError(f"网络错误:{self._scrub(str(reason))}", transport=True) from None             except http.client.HTTPException as err:
  • Network accessline 342
    except http.client.HTTPException as err:

src/mcd_git/menucache.py

  • Executable scriptline 1
    Executable file

src/mcd_git/money.py

  • Executable scriptline 1
    Executable file

src/mcd_git/optimizer.py

  • Executable scriptline 1
    Executable file

src/mcd_git/render.py

  • Executable scriptline 1
    Executable file
  • Network accessline 232
    """把 payH5Url(https://m.mcd.cn/mcp/scanToPay?orderId=…)换成麦当劳收银页里那个二维码的内容。
  • Network accessline 248
    if not _ORDER_ID.fullmatch(order_id):         return None     url = f"https://{parts.hostname}/mcp/jumpToApp?orderId={order_id}"
  • Network accessline 249
    return None     url = f"https://{parts.hostname}/mcp/jumpToApp?orderId={order_id}"     if (query.get("orderCategory") or [""])[0] == "ECS":
  • Network accessline 250
    url = f"https://{parts.hostname}/mcp/jumpToApp?orderId={order_id}"

src/mcd_git/state.py

  • Executable scriptline 1
    Executable file

src/mcd_git/stats.py

  • Executable scriptline 1
    Executable file

src/mcd_git/textnorm.py

  • Executable scriptline 1
    Executable file

tests/__init__.py

  • Executable scriptline 1
    Executable file

tests/conftest.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 112
    [Credential-related source omitted]

tests/test_card.py

  • Executable scriptline 1
    Executable file
  • Network accessline 23
    ROOT = Path(__file__).resolve().parents[1] SVG = "{http://www.w3.org/2000/svg}"
  • Network accessline 24
    SVG = "{http://www.w3.org/2000/svg}"
  • Network accessline 294
    for banned in ("<script", "<image", "<foreignObject", "@import", "url(", "href", "@font-face"):         assert banned not in svg     assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg  # 除了 x
  • Network accessline 295
    assert banned not in svg     assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg  # 除了 xmlns 没有任何外部地址     assert len(svg.encode("utf-8")) < 40 * 1024 and svg.endswith("</svg>\n")
  • Network accessline 296
    assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg  # 除了 xmlns 没有任何外部地址

tests/test_card_styles.py

  • Executable scriptline 1
    Executable file
  • Network accessline 22
    ROOT = Path(__file__).resolve().parents[1] SVG = "{http://www.w3.org/2000/svg}"
  • Network accessline 23
    SVG = "{http://www.w3.org/2000/svg}"
  • Network accessline 47
    for banned in ("<script", "<image", "<foreignObject", "@import", "@font-face", "xlink"):         assert banned not in svg     assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg  # 除了 xmlns 没有
  • Network accessline 48
    assert banned not in svg     assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg  # 除了 xmlns 没有任何外部地址     assert all(ref.startswith("#") for ref in re.findall(r'href="([^"]*)"', svg))  # <use>
  • Network accessline 49
    assert re.findall(r"https?://", svg) == ["http://"] and 'xmlns="http://www.w3.org/2000/svg"' in svg  # 除了 xmlns 没有任何外部地址

tests/test_cart_state.py

  • Executable scriptline 1
    Executable file

tests/test_cli_ux.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 52
    [Credential-related source omitted]

tests/test_client.py

  • Executable scriptline 1
    Executable file
  • Network accessline 4
    import http.client
  • Network accessline 37
    def read(self, *args: Any) -> bytes:  # type: ignore[override]         raise http.client.IncompleteRead(b'{"jsonrpc": "2.0", "id"', 200)
  • Network accessline 38
    raise http.client.IncompleteRead(b'{"jsonrpc": "2.0", "id"', 200)
  • Network accessline 48
    def __call__(self, request: Any, timeout: float) -> Any:         payload = json.loads(request.data.decode("utf-8"))         self.requests.append({"url": request.full_url, "method": payload.get("method"), "headers": dict(request.header_items
  • Network accessline 49
    payload = json.loads(request.data.decode("utf-8"))         self.requests.append({"url": request.full_url, "method": payload.get("method"), "headers": dict(request.header_items()), "payload": payload})         if payload.get("method") == "in
  • Network accessline 50
    self.requests.append({"url": request.full_url, "method": payload.get("method"), "headers": dict(request.header_items()), "payload": payload})
  • Network accessline 63
    def _http_error(code: int, body: bytes = b"") -> urllib.error.HTTPError:     return urllib.error.HTTPError("https://example.invalid", code, "x", {}, io.BytesIO(body))  # type: ignore[arg-type]
  • Network accessline 64
    return urllib.error.HTTPError("https://example.invalid", code, "x", {}, io.BytesIO(body))  # type: ignore[arg-type]
  • Network accessline 265
    def test_mcp_url_env_is_ignored(monkeypatch: pytest.MonkeyPatch) -> None:     monkeypatch.setenv("MCD_MCP_URL", "https://attacker.example/mcp")
  • Network accessline 266
    monkeypatch.setenv("MCD_MCP_URL", "https://attacker.example/mcp")
  • Network accessline 275
    "url",     [         "https://attacker.example",
  • Network accessline 276
    [         "https://attacker.example",         "http://mcp.mcd.cn",
  • Network accessline 277
    "https://attacker.example",
  • Network accessline 278
    "http://mcp.mcd.cn",
  • Network accessline 279
    "https://mcp.mcd.cn.attacker.example",
  • Network accessline 280
    "https://mcp.mcd.cn@attacker.example",
  • Network accessline 281
    "https://user:pw@mcp.mcd.cn",
  • Network accessline 282
    "https://mcp.mcd.cn:8443",
  • Network accessline 283
    "https://mcp.mcd.cn:bad",
  • Network accessline 294
    def test_official_url_variants_are_accepted() -> None:     for url in ("https://mcp.mcd.cn", "https://mcp.mcd.cn/", "https://MCP.mcd.cn:443"):
  • Network accessline 295
    for url in ("https://mcp.mcd.cn", "https://mcp.mcd.cn/", "https://MCP.mcd.cn:443"):
  • Network accessline 319
    if self.path == "/mcp":             self.send_response(server.status)             self.send_header("Location", f"http://127.0.0.1:{server.server_port}/elsewhere")
  • Network accessline 320
    self.send_response(server.status)             self.send_header("Location", f"http://127.0.0.1:{server.server_port}/elsewhere")         else:
  • Network accessline 321
    self.send_header("Location", f"http://127.0.0.1:{server.server_port}/elsewhere")
  • Network accessline 346
    def _local_url(server: Any) -> str:     return f"http://127.0.0.1:{server.server_port}/mcp"
  • Network accessline 347
    return f"http://127.0.0.1:{server.server_port}/mcp"
  • Network accessline 350
    def _post(server: Any) -> urllib.request.Request:
  • Network accessline 352
    return urllib.request.Request(_local_url(server), data=b"{}", headers=headers, method="POST")
  • Network accessline 376
    def to_local(request: urllib.request.Request, timeout: float) -> Any:
  • Network accessline 377
    # 客户端地址只能是 https://mcp.mcd.cn:把同一个请求(请求头、body 都不变)改发到本地服务,仍走默认 opener
  • Network accessline 378
    local = urllib.request.Request(_local_url(redirector), data=request.data, headers=dict(request.header_items()), method="POST")

tests/test_complete.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 47
    [Credential-related source omitted]
  • Network accessline 127
    "from mcd_git.entry import main; main(); "     "bad=[m for m in sys.modules if m.split('.')[0] in ('rich','qrcode') or m in "     "('mcd_git.api','mcd_git.mcp_client','mcd_git.cli','mcd_git.context','http.client','urllib.request')]; "
  • Network accessline 128
    "bad=[m for m in sys.modules if m.split('.')[0] in ('rich','qrcode') or m in "     "('mcd_git.api','mcd_git.mcp_client','mcd_git.cli','mcd_git.context','http.client','urllib.request')]; "     "sys.stderr.write(repr(bad)); sys.exit(1 if bad 
  • Network accessline 129
    "('mcd_git.api','mcd_git.mcp_client','mcd_git.cli','mcd_git.context','http.client','urllib.request')]; "
  • Access to secretsline 135
    [Credential-related source omitted]

tests/test_completion.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 122
    [Credential-related source omitted]
  • Access to secretsline 165
    [Credential-related source omitted]
  • Dangerous shell operationline 308
    'eval "$(mcd-git completion zsh)"; eval "$(mcd-git completion zsh)"; '

tests/test_completion_e2e.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 33
    [Credential-related source omitted]
  • Access to secretsline 180
    [Credential-related source omitted]

tests/test_demo_e2e.py

  • Executable scriptline 1
    Executable file
  • Network accessline 52
    assert code == 0     assert "To mcd.cn:演示·代码港店" in out and "* [new order]      lunch -> 巨无霸套餐" in out     assert "请在 12:05 前付款" in out and "https://example.com/mcd-git-demo/pay?orderId=1024" in out
  • Network accessline 53
    assert "To mcd.cn:演示·代码港店" in out and "* [new order]      lunch -> 巨无霸套餐" in out     assert "请在 12:05 前付款" in out and "https://example.com/mcd-git-demo/pay?orderId=1024" in out     assert "▀" in out or "█" in out  # 终端二维码
  • Network accessline 54
    assert "请在 12:05 前付款" in out and "https://example.com/mcd-git-demo/pay?orderId=1024" in out
  • Access to secretsline 285
    [Credential-related source omitted]

tests/test_ledger.py

  • Executable scriptline 1
    Executable file

tests/test_log_stat.py

  • Executable scriptline 1
    Executable file

tests/test_menu_cache.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 23
    [Credential-related source omitted]

tests/test_menu_cart.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 84
    [Credential-related source omitted]
  • Access to secretsline 179
    [Credential-related source omitted]
  • Access to secretsline 246
    [Credential-related source omitted]

tests/test_optimizer.py

  • Executable scriptline 1
    Executable file

tests/test_parsing.py

  • Executable scriptline 1
    Executable file

tests/test_paths.py

  • Executable scriptline 1
    Executable file

tests/test_pull_gate.py

  • Executable scriptline 1
    Executable file
  • Network accessline 5
    import http.client
  • Network accessline 111
    "totalCount": 3,         "successCoupons": [             {"couponId": "cid-1", "couponName": "A", "couponCode": "CODE-1", "couponImage": "https://example.com/a.png"},
  • Network accessline 112
    "successCoupons": [             {"couponId": "cid-1", "couponName": "A", "couponCode": "CODE-1", "couponImage": "https://example.com/a.png"},             {"couponId": "cid-2", "couponName": " B ", "couponCode": "CODE-2"},
  • Network accessline 113
    {"couponId": "cid-1", "couponName": "A", "couponCode": "CODE-1", "couponImage": "https://example.com/a.png"},
  • Access to secretsline 184
    [Credential-related source omitted]
  • Network accessline 324
    pytest.param(McdError("网络错误:timed out", transport=True), 1, id="timeout"),         pytest.param(_truncated("auto-bind-coupons"), 1, id="truncated-response"),         pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id="
  • Network accessline 325
    pytest.param(_truncated("auto-bind-coupons"), 1, id="truncated-response"),         pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id="raw-incomplete-read"),         pytest.param(McdError("服务端返回 HTTP 302", http_status=
  • Network accessline 326
    pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id="raw-incomplete-read"),
  • Network accessline 397
    payload = dict(             counts,             successCoupons=[{"couponId": f"cid-{i}", "couponName": n, "couponCode": f"SECRET-{i}", "couponImage": "https://example.com/c.png"} for i, n in enumerate(successes)],
  • Network accessline 398
    counts,             successCoupons=[{"couponId": f"cid-{i}", "couponName": n, "couponCode": f"SECRET-{i}", "couponImage": "https://example.com/c.png"} for i, n in enumerate(successes)],             failedCoupons=[{"couponId": f"cid-f{i}", "
  • Network accessline 399
    successCoupons=[{"couponId": f"cid-{i}", "couponName": n, "couponCode": f"SECRET-{i}", "couponImage": "https://example.com/c.png"} for i, n in enumerate(successes)],

tests/test_push_gate.py

  • Executable scriptline 1
    Executable file
  • Network accessline 4
    import http.client
  • Network accessline 105
    assert code == 0, out     assert "[new order]" in out and "lunch -> 巨无霸套餐" in out     assert "https://example.com/mcd-git-demo/pay?orderId=" in out
  • Network accessline 106
    assert "[new order]" in out and "lunch -> 巨无霸套餐" in out     assert "https://example.com/mcd-git-demo/pay?orderId=" in out     assert runner.count("create-order") == 1
  • Network accessline 107
    assert "https://example.com/mcd-git-demo/pay?orderId=" in out
  • Network accessline 274
    "outcome, exit_code",     [         pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id="truncated-response"),
  • Network accessline 275
    [         pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id="truncated-response"),         pytest.param(_mcp({"success": True, "code": 200, "data": ["not", "a", "dict"]}), 1, id="data-not-a-dict"),
  • Network accessline 276
    pytest.param(http.client.IncompleteRead(b'{"success": true', 300), 1, id="truncated-response"),
  • Network accessline 277
    pytest.param(_mcp({"success": True, "code": 200, "data": ["not", "a", "dict"]}), 1, id="data-not-a-dict"),         pytest.param(_mcp({"success": True, "code": 200, "data": {"payH5Url": "https://example.com/x"}}), 1, id="no-order-id"),      
  • Network accessline 278
    pytest.param(_mcp({"success": True, "code": 200, "data": {"payH5Url": "https://example.com/x"}}), 1, id="no-order-id"),

tests/test_qr.py

  • Network accessline 1
    """终端二维码:0.2.4 起默认整格(静区 2),放不下退回半块并提示;half 可选(静区 4);无颜色 plain;fancy 主题码。 链接是合成的:和真实支付链接同形态(https://m.mcd.cn/mcp/scanToPay?orderId= + 28 位数字,67 字节)。
  • Executable scriptline 1
    Executable file
  • Network accessline 2
    链接是合成的:和真实支付链接同形态(https://m.mcd.cn/mcp/scanToPay?orderId= + 28 位数字,67 字节)。
  • Network accessline 21
    URL = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1024" * 7
  • Network accessline 173
    def test_app_pay_url_matches_the_cashier_page_rule() -> None:     oid = "1030" + "0" * 24     assert R.app_pay_url(f"https://m.mcd.cn/mcp/scanToPay?orderId={oid}") == f"https://m.mcd.cn/mcp/jumpToApp?orderId={oid}"
  • Network accessline 174
    oid = "1030" + "0" * 24     assert R.app_pay_url(f"https://m.mcd.cn/mcp/scanToPay?orderId={oid}") == f"https://m.mcd.cn/mcp/jumpToApp?orderId={oid}"     assert R.app_pay_url(f"https://m.mcd.cn/mcp/scanToPay/?orderId={oid}&orderCategory=ECS"
  • Network accessline 175
    assert R.app_pay_url(f"https://m.mcd.cn/mcp/scanToPay?orderId={oid}") == f"https://m.mcd.cn/mcp/jumpToApp?orderId={oid}"
  • Network accessline 176
    assert R.app_pay_url(f"https://m.mcd.cn/mcp/scanToPay/?orderId={oid}&orderCategory=ECS") == (
  • Network accessline 177
    f"https://m.mcd.cn/mcp/jumpToApp?orderId={oid}&orderCategory=ECS")
  • Network accessline 179
    for bad in (None, "", "https://example.com/mcd-git-demo/pay?orderId=1", f"http://m.mcd.cn/mcp/scanToPay?orderId={oid}",
  • Network accessline 180
    f"https://m.mcd.cn.evil.com/mcp/scanToPay?orderId={oid}", f"https://m.mcd.cn/mcp/other?orderId={oid}",
  • Network accessline 181
    "https://m.mcd.cn/mcp/scanToPay?orderId=", "https://m.mcd.cn/mcp/scanToPay?orderId=a%26b%3D1"):
  • Network accessline 185
    PAY = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" * 7
  • Access to secretsline 247
    [Credential-related source omitted]
  • Network accessline 317
    APP_URL = R.app_pay_url("https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" + "0" * 24)
  • Network accessline 463
    def test_pay_block_fancy_wide_terminal_shows_theme_hint_with_template_name() -> None:     pay = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" * 7
  • Network accessline 464
    pay = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" * 7
  • Network accessline 475
    def test_pay_block_fancy_env_pins_template() -> None:     pay = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" * 7
  • Network accessline 476
    pay = "https://m.mcd.cn/mcp/scanToPay?orderId=" + "1030" * 7

How the signals fit together

Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

Some files could not be read; the facts below still hold.

Declared and executed: 4 facts
Signal confidence: 230 facts

and 180 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.