Not in the top 1,000 by GitHub stars

grenbel/autodl-autogpu

由 AI 自动完成 AutoDL 实例开关机的 Claude Code 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 Nov 2, 2026 · +0 / −0 lines

Before Network or broad shell → After Network or broad shell

5cd650f72fea → 5cd650f72fea

Compare on GitHub

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 5cd650f72fea

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 5cd650f72fea3793357b15e3e8618cb10fc41d83

95GitHub stars
-1star in 7 days
1skill in this repository
0commits in 30 days

Heat

0.2
  • 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, 2026Nov 3, 202696

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

Individual skills in this repository

How it works

autodl-autogpu

When your agent uses it

Use when work in any project needs an AutoDL instance powered on or off in GPU mode (有卡) or non-GPU mode (无卡), switched between them, checked (status, balance, billing, free GPUs), or kept from burning GPU time while idle or after the session ends (空转, 忘关机, 自动关机); also, where the project's GPU is an AutoDL instance, before experiments, training or data transfer run on it, e.g. in an automated research or experiment pipeline, under another experiment skill, or on a request like 按计划自动跑实验 (自动科研).

What it loads into context

Frontmatter

136 tokens

Always available to the agent

SKILL.md

11,437 tokens

When the skill is activated

Reference documents

70,160 tokens

Loaded on request

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

The playbook

  1. 平台事实
  2. 必须遵守
  3. 怎么调用 ctl
  4. 开始时要确定的信息
  5. 开机流程
  6. 接手已经开着的实例
  7. 跑任务
  8. 关机
  9. 切换模式
  10. 汇报
  11. 用量与预算
  12. 出错处理
  13. 没有浏览器工具时
  14. 第一次使用
  15. 容易做错的地方
  16. 细节在哪

Scripts executed separately

  • dev/analyze_samples.py
  • reference/clone-page.js
  • reference/clone-page.min.js
  • reference/console-clone.min.js
  • reference/console.js
  • reference/console.min.js
  • scripts/autodl_ctl.py
  • scripts/autodl_guard.sh
  • scripts/ctl
  • tests/conftest.py
  • tests/console/clone_fixtures.js
  • tests/console/clone_run.js
  • tests/console/fixtures.js
  • tests/console/fn_digest.py
  • tests/console/paste_copy.py
  • tests/console/run.js
  • tests/console/run_headless.py
  • tests/console/skeleton.js
  • tests/console/skeleton_test.js
  • tests/fixtures/autodl_guard_0.7.1.sh
  • tests/live/check_ini.py
  • tests/live/cpu_duty.py
  • tests/live/disk_write.sh
  • tests/live/export_logs.py
  • tests/live/fingerprint.sh
  • tests/live/gpu_duty.py
  • tests/live/gpu_load.sh
  • tests/live/jobs_done.py
  • tests/live/probe_state.py
  • tests/live/queries.sh
  • tests/live/sshread.sh
  • tests/live/ticket_probe.py
  • tests/local_tools.py
  • tests/store_posix_check.py
  • tests/stubs/fake-screen
  • tests/stubs/nvidia-smi
  • tests/stubs/screen
  • tests/stubs/shutdown
  • tests/stubs/sync
  • tests/stubs/tmux
  • tests/test_analyze_samples.py
  • tests/test_clone.py
  • tests/test_clone_remote.py
  • tests/test_console_static.py
  • tests/test_ctl.py
  • tests/test_docs_static.py
  • tests/test_guard.sh
  • tests/test_live_scripts.py
  • tests/test_local_tools.py
  • tests/test_store.py
  • tests/test_ticket.py
  • tests/test_transfer_wsl.py

Files

  • .gitattributesasset217 bytes
  • .gitignoreasset28 bytes
  • LICENSEasset1,064 bytes
  • README.cn.mddoc15,433 bytes
  • README.mddoc18,751 bytes
  • SKILL.mdcore38,972 bytes
  • SKILL.mdcore38,972 bytes
  • SKILL.mdcore38,972 bytes
  • SKILL.mdcore38,972 bytes
  • SKILL.mdcore38,972 bytes
  • assets/demo.cn.svgasset9,004 bytes
  • assets/demo.svgasset9,007 bytes
  • assets/hero.cn.svgasset9,557 bytes
  • assets/hero.svgasset9,551 bytes
  • assets/nogpu.cn.svgasset11,036 bytes
  • assets/nogpu.svgasset11,040 bytes
  • assets/parts.cn.svgasset15,119 bytes
  • assets/parts.svgasset15,127 bytes
  • assets/safety.cn.svgasset7,538 bytes
  • assets/safety.svgasset7,531 bytes
  • dev/analyze_samples.pyruns11,763 bytes
  • reference/clone-page.jsruns41,163 bytes
  • reference/clone-page.min.jsruns29,693 bytes
  • reference/clone.mddoc44,999 bytes
  • reference/console-clone.min.jsruns45,885 bytes
  • reference/console-more.mddoc12,676 bytes
  • reference/console.jsruns65,033 bytes
  • reference/console.mddoc42,580 bytes
  • reference/console.min.jsruns34,098 bytes
  • reference/guard.mddoc39,302 bytes
  • reference/ledger.mddoc36,544 bytes
  • reference/ssh.mddoc29,928 bytes
  • scripts/autodl_ctl.pyruns277,989 bytes
  • scripts/autodl_guard.shruns134,251 bytes
  • scripts/ctlruns1,437 bytes
  • tests/README.mddoc3,163 bytes
  • tests/conftest.pyruns1,728 bytes
  • tests/console/clone_fixtures.jsruns33,097 bytes
  • tests/console/clone_run.jsruns54,387 bytes
  • tests/console/fixtures.jsruns46,994 bytes
  • tests/console/fn_digest.pyruns1,222 bytes
  • tests/console/paste_copy.pyruns4,064 bytes
  • tests/console/run.htmlasset1,293 bytes
  • tests/console/run.jsruns105,453 bytes
  • tests/console/run_headless.pyruns7,845 bytes
  • tests/console/skeleton.jsruns23,549 bytes
  • tests/console/skeleton_test.jsruns36,560 bytes
  • tests/fixtures/autodl_guard_0.7.1.shruns57,950 bytes
  • tests/live/autostart_probe.conf.inasset269 bytes
  • tests/live/autostart_probe.profile.inasset701 bytes
  • tests/live/check_ini.pyruns764 bytes
  • tests/live/cpu_duty.pyruns995 bytes
  • tests/live/disk_write.shruns1,551 bytes
  • tests/live/export_logs.pyruns3,028 bytes
  • tests/live/fingerprint.shruns1,247 bytes
  • tests/live/gpu_duty.pyruns1,219 bytes
  • tests/live/gpu_load.shruns295 bytes
  • tests/live/jobs_done.pyruns592 bytes
  • tests/live/probe_state.pyruns2,076 bytes
  • tests/live/queries.shruns3,343 bytes
  • tests/live/sshread.shruns2,723 bytes
  • tests/live/ticket_probe.pyruns6,309 bytes
  • tests/local_tools.pyruns2,017 bytes
  • tests/store_posix_check.pyruns6,203 bytes
  • tests/stubs/fake-screenruns1,331 bytes
  • tests/stubs/nvidia-smiruns1,770 bytes
  • tests/stubs/screenruns539 bytes
  • tests/stubs/shutdownruns703 bytes
  • tests/stubs/syncruns954 bytes
  • tests/stubs/tmuxruns268 bytes
  • tests/test_analyze_samples.pyruns9,381 bytes
  • tests/test_clone.pyruns65,275 bytes
  • tests/test_clone_remote.pyruns29,051 bytes
  • tests/test_console_static.pyruns25,195 bytes
  • tests/test_ctl.pyruns111,125 bytes
  • tests/test_docs_static.pyruns40,467 bytes
  • tests/test_guard.shruns236,995 bytes
  • tests/test_live_scripts.pyruns29,136 bytes
  • tests/test_local_tools.pyruns5,644 bytes
  • tests/test_store.pyruns96,931 bytes
  • tests/test_ticket.pyruns28,786 bytes
  • tests/test_transfer_wsl.pyruns20,442 bytes
Read SKILL.md

# AutoDL 开关机

本 skill 让当前对话里的 AI 自己完成 AutoDL 普通容器实例的有卡开机、无卡开机、关机与模式切换,不用人去点。它只提供方法。什么时候开、开哪种模式、什么时候关,由你按任务和用户的习惯决定,文中的例子只作参考。三样东西配合着用。

- **你是主控。** 开机在控制台网页上做,照 `reference/console.md`(下称手册;第 13、15、16、17 节在 `reference/console-more.md`)一步步来;其余经本机助手 `ctl` 走 SSH
- **守护程序兜底。** 实例上的守护按实际占用判断空闲,空闲满用户定的时长就关机。你的会话断了或忘了关,它照样关
- **控制台定时关机是可选的硬上限。** 用户选了才设,到点由平台直接关机,会切断任务。不由用户选的只有开机流程第 2 步的临时定时

对用户少打扰,只汇报结果(见"汇报")。不要另写守护脚本或 `sleep; shutdown` 之类的兜底。

## 平台事实
- 普通容器实例没有开机 API,开机只能在控制台网页上点。不用任何令牌或非公开接口;只有用户开启了自动克隆时,页面脚本才从页面自己的数据里读新实例的 SSH 主机与端口,不读密码
- 在实例里执行 `/usr/bin/shutdown` 就关机并停止计费,由守护程序与 ctl 调用
- 按量计费从开机到关机按秒算,与是否用 GPU 无关。关机后 GPU 不预留,再开有卡时主机可能没有空闲 GPU。数据保留到实例被释放
View the complete source on GitHub

Skills included

  • autodl-autogpu

Repository facts

License
MIT
Created
Oct 2, 2026
Last pushed
Oct 7, 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 4 notes
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
Show all 276 signals by file

README.cn.md

  • Network accessline 76
    git clone https://github.com/grenbel/autodl-autogpu ~/.claude/skills/autodl-autogpu

README.md

  • Network accessline 76
    git clone https://github.com/grenbel/autodl-autogpu ~/.claude/skills/autodl-autogpu

SKILL.md

  • Access to secretsline 63
    [Credential-related source omitted]
  • Access to secretsline 73
    [Credential-related source omitted]
  • Access to secretsline 177
    [Credential-related source omitted]

assets/demo.cn.svg

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

assets/demo.svg

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

assets/hero.cn.svg

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

assets/hero.svg

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

assets/nogpu.cn.svg

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

assets/nogpu.svg

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

assets/parts.cn.svg

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

assets/parts.svg

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

assets/safety.cn.svg

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

assets/safety.svg

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

dev/analyze_samples.py

  • Executable scriptline 1
    #!/usr/bin/env python3

reference/clone-page.js

  • Network accessline 1
    // reference/clone-page.js: the page script for the AutoDL console's page that creates a cloned instance // (https://www.autodl.com/cloneInstance?...), which the clone dialog of the instance list leads to. It is used only when
  • Executable scriptline 1
    Executable file
  • Network accessline 2
    // (https://www.autodl.com/cloneInstance?...), which the clone dialog of the instance list leads to. It is used only when
  • Network accessline 30
    var HOST_SHAPE = TEST ? /^(abcd|wxyz|mnop|qrst|efgh)\d{6}$/ : /^[0-9a-z]{10}$/;   var modeError = mode !== undefined && !TEST ? 'unknown mode'     : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'te
  • Network accessline 31
    var modeError = mode !== undefined && !TEST ? 'unknown mode'     : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'test mode works only on the offline test page'     : '';
  • Network accessline 32
    : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'test mode works only on the offline test page'
  • Network accessline 133
    function onConsole() {     return TEST ? location.origin === 'https://example.com' || location.protocol === 'file:' : location.origin === 'https://www.autodl.com';
  • Network accessline 134
    return TEST ? location.origin === 'https://example.com' || location.protocol === 'file:' : location.origin === 'https://www.autodl.com';

reference/clone-page.min.js

  • Executable scriptline 1
    Executable file
  • Network accessline 7
    var HOST_SHAPE = TEST ? /^(abcd|wxyz|mnop|qrst|efgh)\d{6}$/ : /^[0-9a-z]{10}$/; var modeError = mode !== undefined && !TEST ? 'unknown mode' : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'test mod
  • Network accessline 8
    var modeError = mode !== undefined && !TEST ? 'unknown mode' : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'test mode works only on the offline test page' : '';
  • Network accessline 9
    : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'test mode works only on the offline test page'
  • Network accessline 96
    function whole(x, min) { return typeof x === 'number' && x % 1 === 0 && x >= min && x < 100000; } function onConsole() { return TEST ? location.origin === 'https://example.com' || location.protocol === 'file:' : location.origin === 'https:/
  • Network accessline 97
    function onConsole() { return TEST ? location.origin === 'https://example.com' || location.protocol === 'file:' : location.origin === 'https://www.autodl.com'; }
  • Network accessline 98
    return TEST ? location.origin === 'https://example.com' || location.protocol === 'file:' : location.origin === 'https://www.autodl.com';

reference/clone.md

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

reference/console-clone.min.js

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    var ID_SHAPE = TEST ? /^(abcd|wxyz|mnop|qrst|efgh)\d{6}-\d{4}[a-z]{4}$/ : /^[0-9a-z]{10}-[0-9a-z]{8}$/; var modeError = mode !== undefined && !TEST ? 'unknown mode' : TEST && !(location.origin === 'https://example.com' || location.protocol 
  • Network accessline 7
    var modeError = mode !== undefined && !TEST ? 'unknown mode' : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'test mode works only on the offline test page' : '';
  • Network accessline 8
    : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'test mode works only on the offline test page'
  • Network accessline 81
    } function urlOk() { if (TEST) return location.origin === 'https://example.com' || location.protocol === 'file:';
  • Network accessline 82
    function urlOk() { if (TEST) return location.origin === 'https://example.com' || location.protocol === 'file:'; return location.origin === 'https://www.autodl.com' && /^\/console\/instance\/list\/?$/.test(location.pathname);
  • Network accessline 83
    if (TEST) return location.origin === 'https://example.com' || location.protocol === 'file:';
  • Network accessline 84
    return location.origin === 'https://www.autodl.com' && /^\/console\/instance\/list\/?$/.test(location.pathname);

reference/console.js

  • Network accessline 1
    // reference/console.js: the page script for the AutoDL console's instance list (https://www.autodl.com/console/instance/list).
  • Executable scriptline 1
    Executable file
  • Network accessline 37
    var ID_SHAPE = TEST ? /^(abcd|wxyz|mnop|qrst|efgh)\d{6}-\d{4}[a-z]{4}$/ : /^[0-9a-z]{10}-[0-9a-z]{8}$/;   var modeError = mode !== undefined && !TEST ? 'unknown mode'     : TEST && !(location.origin === 'https://example.com' || location.pro
  • Network accessline 38
    var modeError = mode !== undefined && !TEST ? 'unknown mode'     : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'test mode works only on the offline test page'     : '';
  • Network accessline 39
    : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'test mode works only on the offline test page'
  • Network accessline 125
    function urlOk() {     if (TEST) return location.origin === 'https://example.com' || location.protocol === 'file:';
  • Network accessline 126
    if (TEST) return location.origin === 'https://example.com' || location.protocol === 'file:';
  • Network accessline 127
    return location.origin === 'https://www.autodl.com' && /^\/console\/instance\/list\/?$/.test(location.pathname);

reference/console.md

  • Network accessline 25
    1. 用浏览器工具的 `navigate` 打开或刷新实例列表 `https://www.autodl.com/console/instance/list`。用哪个标签页都行,在后台、面板隐藏着也行;已有开着 AutoDL 的标签页就用它,里面可能还存着核对过的脚本。每次来用控制台、开始一串操作之前刷新一次(一串里上一个操作结算完了接着做下一个,不用再刷新),因为开得久的页面上数据可能是旧的(实测旧过约 2.5 小时),刷新也会清掉上次的脚本和残留的框。刷新后表格可能还在加载
  • Network accessline 95
    - `rows()` 读所有行,`snapshot()` 读所有行的稳定部分(ID、状态、模式、定时、按钮),`dialog()` 读当前可见的框与选择器。 - 释放倒计时剩不到 3 天就提醒用户。 - 余额在控制台主页 `https://www.autodl.com/console/homepage/personal` 的"费用信息"里("我的余额"的"可用"),用 `get_page_text` 读,只取这一个数。读余额要离开实例列表,页面脚本会跟着丢掉,所以放在第 2 
  • Network accessline 96
    - 释放倒计时剩不到 3 天就提醒用户。 - 余额在控制台主页 `https://www.autodl.com/console/homepage/personal` 的"费用信息"里("我的余额"的"可用"),用 `get_page_text` 读,只取这一个数。读余额要离开实例列表,页面脚本会跟着丢掉,所以放在第 2 节之前读;读完回到实例列表,从第 2 节做起。 - 欠费、余额不足与维护的提醒没有实测过,它们的位置与原文本手册给不出。读主页时(`get_page_text
  • Network accessline 97
    - 余额在控制台主页 `https://www.autodl.com/console/homepage/personal` 的"费用信息"里("我的余额"的"可用"),用 `get_page_text` 读,只取这一个数。读余额要离开实例列表,页面脚本会跟着丢掉,所以放在第 2 节之前读;读完回到实例列表,从第 2 节做起。
  • Network accessline 222
    - 收支明细在 `https://www.autodl.com/console/cost/incomeExpend`(左侧菜单"费用"展开后的"收支明细"),只读,用 `get_page_text`(`max_chars` 给够,一页 100 行约一万多字;`find` 最多只回 20 条,行多时会漏)。
  • Network accessline 223
    - 它每页默认只有 10 行,账号下所有实例的行混在一起、按时间倒排,表格下面的"共 N 条"是总行数。别的实例也在扣费时,要找的行很快就不在第一页了。翻页不点页面上的任何东西,直接用 `navigate` 打开带参数的地址 `https://www.autodl.com/console/cost/incomeExpend?page_size=100&page_index=<页码>`(2026-10-02 实测,每页 100 行可用),从第 1 页读起,读到要找的那一笔,或读

reference/console.min.js

  • Executable scriptline 1
    Executable file
  • Network accessline 6
    var ID_SHAPE = TEST ? /^(abcd|wxyz|mnop|qrst|efgh)\d{6}-\d{4}[a-z]{4}$/ : /^[0-9a-z]{10}-[0-9a-z]{8}$/; var modeError = mode !== undefined && !TEST ? 'unknown mode' : TEST && !(location.origin === 'https://example.com' || location.protocol 
  • Network accessline 7
    var modeError = mode !== undefined && !TEST ? 'unknown mode' : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'test mode works only on the offline test page' : '';
  • Network accessline 8
    : TEST && !(location.origin === 'https://example.com' || location.protocol === 'file:') ? 'test mode works only on the offline test page'
  • Network accessline 81
    } function urlOk() { if (TEST) return location.origin === 'https://example.com' || location.protocol === 'file:';
  • Network accessline 82
    function urlOk() { if (TEST) return location.origin === 'https://example.com' || location.protocol === 'file:'; return location.origin === 'https://www.autodl.com' && /^\/console\/instance\/list\/?$/.test(location.pathname);
  • Network accessline 83
    if (TEST) return location.origin === 'https://example.com' || location.protocol === 'file:';
  • Network accessline 84
    return location.origin === 'https://www.autodl.com' && /^\/console\/instance\/list\/?$/.test(location.pathname);

reference/ssh.md

  • Access to secretsline 6
    [Credential-related source omitted]
  • Access to secretsline 50
    [Credential-related source omitted]
  • Access to secretsline 52
    [Credential-related source omitted]
  • Access to secretsline 53
    [Credential-related source omitted]
  • Access to secretsline 60
    [Credential-related source omitted]
  • Access to secretsline 82
    [Credential-related source omitted]

scripts/autodl_ctl.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 164
    [Credential-related source omitted]
  • Access to secretsline 178
    [Credential-related source omitted]
  • Access to secretsline 203
    [Credential-related source omitted]
  • Access to secretsline 433
    [Credential-related source omitted]
  • Dangerous shell operationline 2999
    trap 'rm -f -- "$tmp"' EXIT
  • Dangerous shell operationline 3042
    trap 'rm -f -- "$tmp"' EXIT
  • Dangerous shell operationline 3092
    rm -f -- "$T"
  • Dangerous shell operationline 3109
    rm -f -- "$T"
  • Access to secretsline 3783
    [Credential-related source omitted]
  • Dangerous shell operationline 3867
    "trap 'rm -f -- \"$T\"' EXIT && cat > \"$T\" && "
  • Dangerous shell operationline 4380
    "rm -rf -- \"$T\"' EXIT",
  • Access to secretsline 4764
    [Credential-related source omitted]
  • Access to secretsline 5042
    [Credential-related source omitted]

scripts/autodl_guard.sh

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Network accessline 3
    # # It only decides WHEN to call AutoDL's official shutdown command # (/usr/bin/shutdown, see https://www.autodl.com/docs/save_money/). It runs inside the
  • Network accessline 4
    # It only decides WHEN to call AutoDL's official shutdown command # (/usr/bin/shutdown, see https://www.autodl.com/docs/save_money/). It runs inside the # instance, so it does not depend on SSH, whose connections AutoDL's public ports
  • Network accessline 5
    # (/usr/bin/shutdown, see https://www.autodl.com/docs/save_money/). It runs inside the
  • Access to secretsline 675
    [Credential-related source omitted]
  • Dangerous shell operationline 676
    nolock rm -f "$ST/prep" || log "cannot remove the off-now preparation; it is void once over ${PREP_MAX}s old (counted on the uptime)"
  • Access to secretsline 702
    [Credential-related source omitted]
  • Dangerous shell operationline 898
    if [ "$PREP_STATE" = void ] && nolock rm -f "$ST/prep"; then
  • Access to secretsline 899
    [Credential-related source omitted]
  • Dangerous shell operationline 1309
    nolock rm -f "$ST/boot.${f[2]}" || die "arm: cannot drop the settings kept by an arm cut short"
  • Dangerous shell operationline 1311
    nolock rm -f "$ST/boot.gpu" "$ST/boot.nogpu" || die "arm: cannot drop the settings kept by an arm cut short"
  • Dangerous shell operationline 1358
    nolock rm -f "$ST/signals" "$ST/dry_run_fired" || die "arm: cannot remove the last check's results"
  • Dangerous shell operationline 1369
    nolock rm -f "$ST/arm_incomplete" || die "cannot finish the arm: $ST/arm_incomplete cannot be removed"
  • Dangerous shell operationline 1851
    nolock rm -f "$OLD_HOOK" 2> /dev/null
  • Dangerous shell operationline 1918
    nolock rm -f "$tmp"
  • Dangerous shell operationline 1950
    nolock rm -f "$HOOK" 2> /dev/null
  • Dangerous shell operationline 1986
    rm -f "$tmp"
  • Dangerous shell operationline 1990
    rm -f "$tmp"
  • Access to secretsline 2311
    [Credential-related source omitted]
  • Access to secretsline 2312
    [Credential-related source omitted]
  • Access to secretsline 2332
    [Credential-related source omitted]
  • Access to secretsline 2342
    [Credential-related source omitted]
  • Access to secretsline 2346
    [Credential-related source omitted]
  • Access to secretsline 2360
    [Credential-related source omitted]
  • Access to secretsline 2372
    [Credential-related source omitted]

scripts/ctl

  • Executable scriptline 1
    #!/usr/bin/env bash

tests/conftest.py

  • Executable scriptline 1
    Executable file

tests/console/clone_fixtures.js

  • Executable scriptline 1
    Executable file

tests/console/clone_run.js

  • Network accessline 1
    // Offline test for reference/clone-page.js on the fake page of tests/console/clone_fixtures.js. The short way is // python tests/console/run_headless.py, which runs it in headless Edge or Chrome, once focused and once as in a hidden // pan
  • Executable scriptline 1
    Executable file
  • Network accessline 2
    // python tests/console/run_headless.py, which runs it in headless Edge or Chrome, once focused and once as in a hidden // pane. By hand it runs on https://example.com (or a file:// page), in three calls: //   1. paste tests/console/clone_f
  • Network accessline 3
    // pane. By hand it runs on https://example.com (or a file:// page), in three calls:

tests/console/fixtures.js

  • Executable scriptline 1
    Executable file

tests/console/fn_digest.py

  • Executable scriptline 1
    Executable file

tests/console/paste_copy.py

  • Executable scriptline 1
    Executable file

tests/console/run.js

  • Network accessline 1
    // Offline test for reference/console.js on the fake pages of tests/console/fixtures.js. The short way is // python tests/console/run_headless.py, which runs it in headless Edge or Chrome, once focused and once as in a hidden // pane. By ha
  • Executable scriptline 1
    Executable file
  • Network accessline 2
    // python tests/console/run_headless.py, which runs it in headless Edge or Chrome, once focused and once as in a hidden // pane. By hand it runs on https://example.com (or a file:// page such as tests/console/run.html), in three calls: //  
  • Network accessline 3
    // pane. By hand it runs on https://example.com (or a file:// page such as tests/console/run.html), in three calls:

tests/console/run_headless.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 64
    [Credential-related source omitted]
  • Access to secretsline 79
    [Credential-related source omitted]
  • Access to secretsline 80
    [Credential-related source omitted]

tests/console/skeleton.js

  • Executable scriptline 1
    Executable file
  • Network accessline 8
    // output, only counted. Full scans stop at a budget of elements read, so a huge page cannot stall the console. // It reads the DOM only: no writes, no events, no network, no storage, no navigation. // The second argument exists only for th
  • Network accessline 10
    // The second argument exists only for the offline decoy test (tests/console/skeleton_test.js) on https://example.com.
  • Network accessline 16
    if (typeof targetId !== 'string' || !ID_RE.test(targetId)) throw new Error('not an instance ID');   if (mode === 'offline-decoy-test') {     if (location.origin !== 'https://example.com' || targetId !== TEST_ID) {
  • Network accessline 17
    if (mode === 'offline-decoy-test') {     if (location.origin !== 'https://example.com' || targetId !== TEST_ID) {       throw new Error('the test mode runs only on https://example.com with the fake ID');
  • Network accessline 18
    if (location.origin !== 'https://example.com' || targetId !== TEST_ID) {
  • Network accessline 19
    throw new Error('the test mode runs only on https://example.com with the fake ID');
  • Network accessline 21
    } else if (mode !== undefined) {     throw new Error('unknown mode');   } else if (location.origin !== 'https://www.autodl.com' || location.pathname !== '/console/instance/list') {
  • Network accessline 22
    throw new Error('unknown mode');   } else if (location.origin !== 'https://www.autodl.com' || location.pathname !== '/console/instance/list') {     throw new Error('not the instance list');
  • Network accessline 23
    } else if (location.origin !== 'https://www.autodl.com' || location.pathname !== '/console/instance/list') {

tests/console/skeleton_test.js

  • Network accessline 1
    // Offline test for tests/console/skeleton.js, run on https://example.com (a static page without scripts).
  • Executable scriptline 1
    Executable file
  • Network accessline 241
    '<input class="el-input__inner" value="DECOY-ALPHA" placeholder="DECOY-XI" aria-label="DECOY-OMICRON" ' +       'role="private-name" aria-expanded="Alice" type="secretname">' +       '<a href="https://decoy.example/DECOY-BETA">查看详情</a><img 
  • Network accessline 242
    'role="private-name" aria-expanded="Alice" type="secretname">' +       '<a href="https://decoy.example/DECOY-BETA">查看详情</a><img src="data:,DECOY-GAMMA" alt="DECOY-ZETA">' +       '<iframe srcdoc="DECOY-RHO"></iframe><script>var DECOY_THETA 
  • Network accessline 243
    '<a href="https://decoy.example/DECOY-BETA">查看详情</a><img src="data:,DECOY-GAMMA" alt="DECOY-ZETA">' +

tests/fixtures/autodl_guard_0.7.1.sh

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Network accessline 3
    # # It only decides WHEN to call AutoDL's official shutdown command # (/usr/bin/shutdown, see https://www.autodl.com/docs/save_money/). It runs inside the
  • Network accessline 4
    # It only decides WHEN to call AutoDL's official shutdown command # (/usr/bin/shutdown, see https://www.autodl.com/docs/save_money/). It runs inside the # instance, so it does not depend on SSH, whose connections AutoDL's public ports
  • Network accessline 5
    # (/usr/bin/shutdown, see https://www.autodl.com/docs/save_money/). It runs inside the
  • Dangerous shell operationline 691
    nolock rm -f "$ST/dry_run_fired"
  • Dangerous shell operationline 694
    nolock rm -f "$ST/arm_incomplete" || die "cannot finish the arm: $ST/arm_incomplete cannot be removed"
  • Dangerous shell operationline 743
    rm -f "$tmp"
  • Dangerous shell operationline 747
    rm -f "$tmp"

tests/live/check_ini.py

  • Executable scriptline 1
    Executable file

tests/live/cpu_duty.py

  • Executable scriptline 1
    Executable file

tests/live/disk_write.sh

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 22
    trap 'rm -f "$f"' EXIT
  • Dangerous shell operationline 31
    rm -f "$f"

tests/live/export_logs.py

  • Executable scriptline 1
    Executable file

tests/live/fingerprint.sh

  • Executable scriptline 1
    Executable file

tests/live/gpu_duty.py

  • Executable scriptline 1
    Executable file

tests/live/gpu_load.sh

  • Executable scriptline 1
    Executable file

tests/live/jobs_done.py

  • Executable scriptline 1
    Executable file

tests/live/probe_state.py

  • Executable scriptline 1
    Executable file

tests/live/queries.sh

  • Executable scriptline 1
    Executable file

tests/live/sshread.sh

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 42
    3) rm -f "$out.tmp"; exit 3 ;;
  • Dangerous shell operationline 43
    124 | 255) rm -f "$out.tmp"; echo "sshread: try $i of $tries: ssh failed or timed out (exit $rc)" >&2 ;;
  • Dangerous shell operationline 44
    *) rm -f "$out.tmp"; echo "sshread: the remote command exited $rc" >&2; exit 1 ;;

tests/live/ticket_probe.py

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 43
    rm -f -- "$T"

tests/local_tools.py

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

tests/store_posix_check.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 25
    [Credential-related source omitted]
  • Access to secretsline 30
    [Credential-related source omitted]
  • Access to secretsline 77
    [Credential-related source omitted]
  • Access to secretsline 91
    [Credential-related source omitted]
  • Access to secretsline 102
    [Credential-related source omitted]
  • Access to secretsline 110
    [Credential-related source omitted]
  • Access to secretsline 182
    [Credential-related source omitted]
  • Access to secretsline 193
    [Credential-related source omitted]
  • Access to secretsline 195
    [Credential-related source omitted]

tests/stubs/fake-screen

  • Executable scriptline 1
    #!/usr/bin/env bash

tests/stubs/nvidia-smi

  • Executable scriptline 1
    #!/usr/bin/env bash

tests/stubs/screen

  • Executable scriptline 1
    #!/usr/bin/env bash

tests/stubs/shutdown

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Dangerous shell operationline 13
    rm -f "$STUB_DIR/shutdown_fail"

tests/stubs/sync

  • Executable scriptline 1
    #!/usr/bin/env bash

tests/stubs/tmux

  • Executable scriptline 1
    #!/usr/bin/env bash

tests/test_analyze_samples.py

  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 89
    h.write_text("<U+FEFF>" + f.read_text(encoding="utf-8"), encoding="utf-8")
  • Possible obfuscationline 137
    (tmp_path / "bom.log").write_bytes("<U+FEFF>LOAD START 1 10.00\r\nLOAD END 2 20.00\r\n".encode("utf-8"))

tests/test_clone.py

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

tests/test_clone_remote.py

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 183
    inst.drive('printf changed > "$B/data/proj/sub/b.txt"; rm "$B/data/keep"; : > "$B/data/.autodl-guard/state2/more"')

tests/test_console_static.py

  • Executable scriptline 1
    Executable file

tests/test_ctl.py

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 189
    reason = "it's a \"test\" $HOME; rm -rf /"
  • Access to secretsline 516
    [Credential-related source omitted]
  • Access to secretsline 528
    [Credential-related source omitted]
  • Access to secretsline 541
    [Credential-related source omitted]
  • Access to secretsline 883
    [Credential-related source omitted]
  • Access to secretsline 1050
    [Credential-related source omitted]
  • Access to secretsline 1751
    [Credential-related source omitted]
  • Access to secretsline 1769
    [Credential-related source omitted]

tests/test_docs_static.py

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

tests/test_guard.sh

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Dangerous shell operationline 79
    rm -rf "$T" 2> /dev/null && return 0
  • Dangerous shell operationline 82
    rm -rf "$T"
  • Dangerous shell operationline 652
    rm -f "$STUB_DIR/shutdown_fail_always"
  • Dangerous shell operationline 690
    rm -f "$STUB_DIR/hang"
  • Dangerous shell operationline 1126
    rm -f "$STUB_DIR/shutdown_hang"
  • Dangerous shell operationline 1145
    rm -f "$STUB_DIR/hang"
  • Dangerous shell operationline 1269
    for n in cat date mv rm mkdir dirname sleep seq sed tr grep tail head awk cut timeout sync env setsid nohup \
  • Dangerous shell operationline 1343
    rm -f "$STUB_DIR/cg/cpu.stat" "$STUB_DIR/cg/io.stat"
  • Dangerous shell operationline 1461
    rm -f "$STUB_DIR/hang"
  • Dangerous shell operationline 1473
    rm -f "$STUB_DIR/uptime"
  • Dangerous shell operationline 1511
    rm -f "$AUTODL_GUARD_HOME/state2/daemon_pid"   # the pid is fake: teardown must not signal it
  • Dangerous shell operationline 1530
    rm -f "$STUB_DIR/sync_hang"   # the stub still waiting in the background ends
  • Dangerous shell operationline 1570
    rm -f "$STUB_DIR/sync_hang"
  • Dangerous shell operationline 1586
    rm -f "$STUB_DIR/sync_hang"
  • Dangerous shell operationline 1605
    rm -f "$STUB_DIR/sync_hang" "$STUB_DIR/shutdown_fail_always"
  • Dangerous shell operationline 1723
    rm -f "$AUTODL_GUARD_HOME/state2/schema"   # what a 0.7 state looks like to 0.8
  • Dangerous shell operationline 1835
    rm -f "$STUB_DIR/cg/cpu.stat"
  • Dangerous shell operationline 1889
    rm -f "$STUB_DIR/hang"
  • Dangerous shell operationline 2118
    rm -f "$STUB_DIR/shutdown_fail"
  • Dangerous shell operationline 2158
    rm -f "$AUTODL_GUARD_HOME/state2/schema"
  • Dangerous shell operationline 2230
    rm -f "$AUTODL_GUARD_HOME/state2/shutdown_boot"   # as 0.7 left it: the arm's boot stands in
  • Dangerous shell operationline 2538
    rm -f "$STUB_DIR/hang"
  • Dangerous shell operationline 2627
    rm -f "$STUB_DIR/hang"
  • Dangerous shell operationline 3547
    missing) rm -f "$AUTODL_GUARD_HOME/state2/arm_gen" ;;
  • Dangerous shell operationline 3580
    rm -f "$STUB_DIR/hang"
  • Dangerous shell operationline 3700
    rm -f "$STUB_DIR/hang"
  • Dangerous shell operationline 3783
    mkdir "$AUTODL_GUARD_HOME/state2/arm_incomplete"   # mv puts the new marker inside it, rm -f cannot remove it
  • Dangerous shell operationline 3917
    rm -f "$STUB_DIR/shutdown_fail_always"
  • Dangerous shell operationline 4011
    rm -f "$STUB_DIR/hang"   # status asks nvidia-smi too
  • Dangerous shell operationline 4019
    rm -f "$STUB_DIR/hang"
  • Dangerous shell operationline 4104
    rm -f "$AUTODL_TEST_UPTIME"   # the uptime cannot be read
  • Dangerous shell operationline 4139
    mkdir "$AUTODL_GUARD_HOME/state2/arm_incomplete"   # mv puts the new marker inside it, rm -f cannot remove it
  • Dangerous shell operationline 4232
    rm -f "$STUB_DIR/shutdown_fail_always"
  • Dangerous shell operationline 4252
    rm -f "$AUTODL_GUARD_HOME/state2/prep"
  • Dangerous shell operationline 4271
    rm -rf "$T/bb"   # a fresh barrier: an earlier boot's go marker must not let this one through
  • Dangerous shell operationline 4298
    rm -f "$STUB_DIR/shutdown_fail_always"
  • Dangerous shell operationline 4307
    rm -rf "$T/bb"
  • Dangerous shell operationline 4323
    rm -f "$AUTODL_GUARD_HOME/state2/prep"
  • Dangerous shell operationline 4338
    rm -f "$STUB_DIR/shutdown_fail_always"
  • Dangerous shell operationline 4774
    rm -f "$T/done" "$T/returned"
  • Dangerous shell operationline 4777
    rm -f "$T/g.sh"
  • Dangerous shell operationline 4821
    rm -f "$STUB_DIR/shutdown_fail_always"
  • Dangerous shell operationline 4845
    rm -f "$AUTODL_TEST_UPTIME"
  • Dangerous shell operationline 5027
    rm -f "$STUB_DIR/cg/cpu.stat"
  • Dangerous shell operationline 5094
    rm -f "$AUTODL_GUARD_HOME/state2/schema"   # from here on the state cannot be used
  • Dangerous shell operationline 5117
    rm -f "$AUTODL_GUARD_HOME/state2/schema"
  • Dangerous shell operationline 5130
    rm -f "$AUTODL_GUARD_HOME/state2/schema"
  • Dangerous shell operationline 5167
    rm -f "$AUTODL_GUARD_HOME/state2/schema"
  • Dangerous shell operationline 5182
    rm -f "$AUTODL_GUARD_HOME/state2/schema"
  • Dangerous shell operationline 5206
    rm -f "$AUTODL_GUARD_HOME/state2/schema"
  • Dangerous shell operationline 5244
    rm -f "$AUTODL_GUARD_HOME/state2/schema"
  • Dangerous shell operationline 5245
    rm -f "$AUTODL_GUARD_HOME/state2/dry_run_fired"

tests/test_live_scripts.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 190
    [Credential-related source omitted]
  • Dangerous shell operationline 499
    f"rm -rf -- {d}")

tests/test_local_tools.py

  • Executable scriptline 1
    Executable file

tests/test_store.py

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

tests/test_ticket.py

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 105
    f"rm -rf -- {d}")
  • Dangerous shell operationline 192
    got = box.drive('loop; LP=$!; sleep 1.5; rm -f "$T"; sleep 2.5; ' + ALIVE + HELD + CALLS)
  • Dangerous shell operationline 240
    'rm -f "$T"; flock -u 5; sleep 2.5; ' + ALIVE + CALLS)

tests/test_transfer_wsl.py

  • Executable scriptline 1
    Executable file
  • Dangerous shell operationline 146
    f"printf x > {root}/src/code/sub/run.sh && chmod 777 {root}/src/code/sub && chmod 666 {root}/src/code/a.txt && "
  • Dangerous shell operationline 289
    remote.sh(f"rm {m.g}/cg/cpu.stat")
  • Dangerous shell operationline 293
    remote.sh(f"rm -rf {m.g}")
  • Network accessline 307
    def test_off_raw_keeps_the_script_from_what_its_checks_start(remote):     greedy = "#!/bin/sh\ncat > /dev/null\necho 'No Sockets found in /run/screen/S-root.'\nexit 1\n"   # it reads its stdin
  • Network accessline 308
    greedy = "#!/bin/sh\ncat > /dev/null\necho 'No Sockets found in /run/screen/S-root.'\nexit 1\n"   # it reads its stdin
  • Network accessline 336
    path = remote.root + "/screen_out"     subprocess.run([*WSL, "bash", "-c", f"cat > {path}"], input=out, check=True)     return f"#!/bin/sh\ncat {path}\nexit {rc}\n"
  • Network accessline 338
    return f"#!/bin/sh\ncat {path}\nexit {rc}\n"

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.

Combined signals: 1 fact
  • Reads SSH keys, and the same file sends data over the network or runs a command (line 2999)scripts/autodl_ctl.py:178High confidence
Declared and executed: 8 facts
Signal confidence: 266 facts

and 216 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.