本人一直想要搭建一个中转站,偶然看见sub2api,故使用它搭建了一个,以下是步骤: 先约定 3 个你要替换的值: api.example.com :改成你的域名 [email protected] :改成你的管理员邮箱 CHANGE_ME... :改成你自己生成的随机密钥 1)登录服务器并更新系统 ssh root@你的服务器IP apt update apt -y upgrade timedatectl 这一步是基础准备,先把系统更新到当前仓库版本,并确认时间正常。时间不准会影响 HTTPS、登录态和支付回调之类的功能。Docker 官方当前 Ubuntu 安装文档仍然建议使用官方 apt 仓库安装 Docker Engine。 2)安装 Docker Engine 和 Docker Compose v2 先卸载可能冲突的旧包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do apt-get remove -y $pkg done 安装 Docker 官方仓库: apt-get update apt-get install -y ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \ > /etc/apt/sources.list.d/docker.list 安装 Docker 和 Compose 插件: apt-get update apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 检查版本: docker --version docker compose version systemctl enable docker systemctl start docker systemctl status docker --no-pager Docker 官方当前安装文档给出的推荐安装包名就是 docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 。另外,Docker 也明确提醒:如果你用 UFW 或 firewalld,Docker 暴露出来的端口可能绕过防火墙表面规则,所以正式环境尽量只暴露 80/443,把 8080 留给本机反代。 3)安装 Git、openssl 和基础工具 apt-get install -y git curl wget nano openssl ufw 这些工具后面都会用到: git 拉仓库 openssl 生成密钥 nano 编辑配置 ufw 放行 80/443/22 4)准备部署目录并拉取官方文件 mkdir -p /opt/sub2api cd /opt/sub2api git clone https://github.com/Wei-Shaw/sub2api.git source cp source/deploy/docker-compose.local.yml . cp source/deploy/.env.example .env cp source/deploy/config.example.yaml config.yaml Sub2API 官方部署说明里,手动部署路径就是:克隆仓库、复制 .env.example 、创建 data postgres_data redis_data ,再用 docker-compose.local.yml 启动;并且官方明确把 local 版描述为“本地目录、易迁移”。 5)生成生产环境密钥 先生成三个随机值: openssl rand -hex 32 openssl rand -hex 32 openssl rand -hex 32 把输出保存下来,分别用于: POSTGRES_PASSWORD JWT_SECRET TOTP_ENCRYPTION_KEY 官方 .env 模板和部署说明都强调: POSTGRES_PASSWORD 必填,而 JWT_SECRET 和 TOTP_ENCRYPTION_KEY 最好固定,否则会影响持久登录态和 2FA。 6)写入最终版 .env cat > /opt/sub2api/.env <<'EOF' BIND_HOST=127.0.0.1 SERVER_PORT=8080 SERVER_MODE=release RUN_MODE=standard TZ=Asia/Shanghai POSTGRES_USER=sub2api POSTGRES_PASSWORD=CHANGE_ME_TO_A_LONG_RANDOM_PASSWORD POSTGRES_DB=sub2api DATABASE_MAX_OPEN_CONNS=50 DATABASE_MAX_IDLE_CONNS=10 DATABASE_CONN_MAX_LIFETIME_MINUTES=30 DATABASE_CONN_MAX_IDLE_TIME_MINUTES=5 REDIS_PASSWORD= REDIS_DB=0 REDIS_POOL_SIZE=1024 REDIS_MIN_IDLE_CONNS=10 REDIS_ENABLE_TLS=false [email protected] ADMIN_PASSWORD= JWT_SECRET=CHANGE_ME_TO_A_LONG_RANDOM_HEX_STRING JWT_EXPIRE_HOUR=24 JWT_ACCESS_TOKEN_EXPIRE_MINUTES=0 TOTP_ENCRYPTION_KEY=CHANGE_ME_TO_ANOTHER_LONG_RANDOM_HEX_STRING GEMINI_OAUTH_CLIENT_ID= GEMINI_OAUTH_CLIENT_SECRET= GEMINI_OAUTH_SCOPES= GEMINI_QUOTA_POLICY= GEMINI_CLI_OAUTH_CLIENT_SECRET= ANTIGRAVITY_OAUTH_CLIENT_SECRET= SECURITY_URL_ALLOWLIST_ENABLED=true SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP=false SECURITY_URL_ALLOWLIST_ALLOW_PRIVATE_HOSTS=false SECURITY_URL_ALLOWLIST_UPSTREAM_HOSTS= UPDATE_PROXY_URL= EOF 然后编辑,把占位符改成你自己的值: nano /opt/sub2api/.env 这里我保留了 .env 里的基础白名单开关,但把域名清单放到 config.yaml 里统一管理,因为官方 config.example.yaml 里真正完整的 URL 白名单字段在 security.url_allowlist 下。 7)写入最终版 config.yaml cat > /opt/sub2api/config.yaml <<'EOF' server: host: "0.0.0.0" port: 8080 mode: "release" frontend_url: "https://api.example.com" trusted_proxies: [] max_request_body_size: 268435456 h2c: enabled: true max_concurrent_streams: 50 idle_timeout: 75 max_read_frame_size: 1048576 max_upload_buffer_per_connection: 2097152 max_upload_buffer_per_stream: 524288 run_mode: "standard" cors: allowed_origins: - "https://api.example.com" allow_credentials: true security: url_allowlist: enabled: true upstream_hosts: - "api.openai.com" - "api.anthropic.com" - "generativelanguage.googleapis.com" - "cloudcode-pa.googleapis.com" - "*.openai.azure.com" pricing_hosts: - "raw.githubusercontent.com" crs_hosts: [] allow_private_hosts: false allow_insecure_http: false response_headers: enabled: true additional_allowed: [] force_remove: [] csp: enabled: true policy: "default-src 'self'; script-src 'self' __CSP_NONCE__ https://challenges.cloudflare.com https://static.cloudflareinsights.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; img-src 'self' data: https:; font-src 'self' data: https://fonts.gstatic.com; connect-src 'self' https:; frame-src https://challenges.cloudflare.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self'" proxy_probe: insecure_skip_verify: false proxy_fallback: allow_direct_on_error: false EOF 改域名: nano /opt/sub2api/config.yaml 官方当前配置示例里, frontend_url 用于生成邮件等外部链接;URL 白名单示例里也明确列出了 upstream_hosts 、 pricing_hosts 、 crs_hosts 、 allow_private_hosts 、 allow_insecure_http 。我这里把样例里的 allow_private_hosts 和 allow_insecure_http 从 true 收紧成了更适合公网生产的 false 。 8)写入最终版 docker-compose.local.yml cat > /opt/sub2api/docker-compose.local.yml <<'EOF' services: sub2api: image: weishaw/sub2api:latest container_name: sub2api restart: unless-stopped ulimits: nofile: soft: 100000 hard: 100000 ports: - "${BIND_HOST:-127.0.0.1}:${SERVER_PORT:-8080}:8080" volumes: - ./data:/app/data - ./config.yaml:/app/data/config.yaml:ro environment: - AUTO_SETUP=true - SERVER_HOST=0.0.0.0 - SERVER_PORT=8080 - SERVER_MODE=${SERVER_MODE:-release} - RUN_MODE=${RUN_MODE:-standard} - DATABASE_HOST=postgres - DATABASE_PORT=5432 - DATABASE_USER=${POSTGRES_USER:-sub2api} - DATABASE_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} - DATABASE_DBNAME=${POSTGRES_DB:-sub2api} - DATABASE_SSLMODE=disable - DATABASE_MAX_OPEN_CONNS=${DATABASE_MAX_OPEN_CONNS:-50} - DATABASE_MAX_IDLE_CONNS=${DATABASE_MAX_IDLE_CONNS:-10} - DATABASE_CONN_MAX_LIFETIME_MINUTES=${DATABASE_CONN_MAX_LIFETIME_MINUTES:-30} - DATABASE_CONN_MAX_IDLE_TIME_MINUTES=${DATABASE_CONN_MAX_IDLE_TIME_MINUTES:-5} - REDIS_HOST=redis - REDIS_PORT=6379 - REDIS_PASSWORD=${REDIS_PASSWORD:-} - REDIS_DB=${REDIS_DB:-0} - REDIS_POOL_SIZE=${REDIS_POOL_SIZE:-1024} - REDIS_MIN_IDLE_CONNS=${REDIS_MIN_IDLE_CONNS:-10} - REDIS_ENABLE_TLS=${REDIS_ENABLE_TLS:-false} - ADMIN_EMAIL=${ADMIN_EMAIL:[email protected]} - ADMIN_PASSWORD=${ADMIN_PASSWORD:-} - JWT_SECRET=${JWT_SECRET:-} - JWT_EXPIRE_HOUR=${JWT_EXPIRE_HOUR:-24} - JWT_ACCESS_TOKEN_EXPIRE_MINUTES=${JWT_ACCESS_TOKEN_EXPIRE_MINUTES:-0} - TOTP_ENCRYPTION_KEY=${TOTP_ENCRYPTION_KEY:-} - TZ=${TZ:-Asia/Shanghai} - GEMINI_OAUTH_CLIENT_ID=${GEMINI_OAUTH_CLIENT_ID:-} - GEMINI_OAUTH_CLIENT_SECRET=${GEMINI_OAUTH_CLIENT_SECRET:-} - GEMINI_OAUTH_SCOPES=${GEMINI_OAUTH_SCOPES:-} - GEMINI_QUOTA_POLICY=${GEMINI_QUOTA_POLICY:-} - GEMINI_CLI_OAUTH_CLIENT_SECRET=${GEMINI_CLI_OAUTH_CLIENT_SECRET:-} - ANTIGRAVITY_OAUTH_CLIENT_SECRET=${ANTIGRAVITY_OAUTH_CLIENT_SECRET:-} - SECURITY_URL_ALLOWLIST_ENABLED=${SECURITY_URL_ALLOWLIST_ENABLED:-true} - SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP=${SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP:-false} - SECURITY_URL_ALLOWLIST_ALLOW_PRIVATE_HOSTS=${SECURITY_URL_ALLOWLIST_ALLOW_PRIVATE_HOSTS:-false} - SECURITY_URL_ALLOWLIST_UPSTREAM_HOSTS=${SECURITY_URL_ALLOWLIST_UPSTREAM_HOSTS:-} - UPDATE_PROXY_URL=${UPDATE_PROXY_URL:-} depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - sub2api-network healthcheck: test: ["CMD", "wget", "-q", "-T", "5", "-O", "/dev/null", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 30s postgres: image: postgres:18-alpine container_name: sub2api-postgres restart: unless-stopped ulimits: nofile: soft: 100000 hard: 100000 volumes: - ./postgres_data:/var/lib/postgresql/data environment: - POSTGRES_USER=${POSTGRES_USER:-sub2api} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required} - POSTGRES_DB=${POSTGRES_DB:-sub2api} - PGDATA=/var/lib/postgresql/data - TZ=${TZ:-Asia/Shanghai} networks: - sub2api-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-sub2api} -d ${POSTGRES_DB:-sub2api}"] interval: 10s timeout: 5s retries: 5 start_period: 10s redis: image: redis:8-alpine container_name: sub2api-redis restart: unless-stopped ulimits: nofile: soft: 100000 hard: 100000 volumes: - ./redis_data:/data command: > sh -c ' redis-server --save 60 1 --appendonly yes --appendfsync everysec ${REDIS_PASSWORD:+--requirepass "$REDIS_PASSWORD"} ' environment: - TZ=${TZ:-Asia/Shanghai} - REDISCLI_AUTH=${REDIS_PASSWORD:-} networks: - sub2api-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 start_period: 5s networks: sub2api-network: driver: bridge EOF 这份 compose 依然遵循官方 local 版思路:本地目录持久化、 weishaw/sub2api:latest + postgres:18-alpine + redis:8-alpine 、 /health 健康检查;另外我把 config.yaml 的挂载打开了,因为官方默认是注释状态。 9)创建数据目录并启动容器 cd /opt/sub2api mkdir -p data postgres_data redis_data docker compose -f docker-compose.local.yml up -d docker compose -f docker-compose.local.yml ps 如果一切正常,再看日志: docker compose -f docker-compose.local.yml logs -f sub2api Sub2API 官方说明里写得很明确:Compose 模式下 AUTO_SETUP=true 时,首次启动会自动连接 PostgreSQL 和 Redis、执行数据库迁移、创建管理员账号、在未提供时自动生成管理员密码。 10)取出管理员密码并做健康检查 如果你在 .env 里把 ADMIN_PASSWORD= 留空,就执行: docker compose -f docker-compose.local.yml logs sub2api | grep -i "admin password" 本机健康检查: curl http://127.0.0.1:8080/health 官方手动部署说明和命令示例里都给了从日志里查自动生成管理员密码的方法。( GitHub ) 11)安装 Caddy 并启用自动 HTTPS 先安装 Caddy 官方仓库: apt install -y debian-keyring debian-archive-keyring apt-transport-https curl curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg chmod o+r /etc/apt/sources.list.d/caddy-stable.list apt update apt install -y caddy 这正是 Caddy 官方当前给出的 Debian/Ubuntu stable 安装路径。( Caddy Web Server ) 12)写入 Caddyfile cat > /etc/caddy/Caddyfile <<'EOF' api.example.com { @static { path /assets/* path /logo.png path /favicon.ico } header @static { Cache-Control "public, max-age=31536000, immutable" -Pragma -Expires } tls { protocols tls1.2 tls1.3 } reverse_proxy 127.0.0.1:8080 { health_uri /health health_interval 30s health_timeout 10s health_status 200 header_up X-Real-IP {remote_host} header_up X-Forwarded-For {remote_host} header_up X-Forwarded-Proto {scheme} header_up X-Forwarded-Host {host} header_up CF-Connecting-IP {http.request.header.CF-Connecting-IP} } encode { zstd gzip 6 minimum_length 256 } request_body { max_size 100MB } log { output file /var/log/caddy/sub2api.log { roll_size 50mb roll_keep 10 roll_keep_for 720h } format json level INFO } handle_errors { respond "{err.status_code} {err.status_text}" } } EOF 检查并重载: caddy fmt --overwrite /etc/caddy/Caddyfile caddy validate --config /etc/caddy/Caddyfile systemctl enable caddy systemctl restart caddy systemctl status caddy --no-pager 官方仓库当前确实自带 deploy/Caddyfile ,里面已经包含 TLS、 reverse_proxy localhost:8080 、 /health 健康检查、转发真实 IP 头和日志滚动思路,所以这条路线最省心。 13)放行防火墙 ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp ufw enable ufw status verbose 不要开放 8080 给公网,因为你已经通过 BIND_HOST=127.0.0.1 把应用只绑在本机,再让 Caddy 反代它。这样也符合 Docker 官方对防火墙的安全提醒。 14)最终验证 先本机验证: curl http://127.0.0.1:8080/health curl -I https://api.example.com 然后浏览器访问: https://api.example.com 用管理员邮箱和日志里拿到的密码登录。 15)部署完成后立刻执行的 5 个检查 登录后台,确认能打开首页。 到设置里确认站点 URL 是否正确。 frontend_url 如果没配对,后面邮件链接和支付回调会出错。 如果你要启用 URL 白名单,只保留自己真的要用的上游域名。官方样例里带了 OpenAI、Anthropic、Gemini、Azure OpenAI 等域名,但生产上不建议全开。 如果要开支付,后台路径是 设置 → 支付设置 ,官方当前支持 EasyPay、支付宝官方、微信官方、Stripe;多实例分流支持 round-robin 和 least-amount ,回调地址会按你的域名自动拼接。 如果你用 Stripe,记得订阅 payment_intent.succeeded 和 payment_intent.payment_failed 。 16)后续最常用的运维命令 cd /opt/sub2api # 看状态 docker compose -f docker-compose.local.yml ps # 看日志 docker compose -f docker-compose.local.yml logs -f sub2api # 重启应用 docker compose -f docker-compose.local.yml restart sub2api # 更新镜像 docker compose -f docker-compose.local.yml pull docker compose -f docker-compose.local.yml up -d # 停服务 docker compose -f docker-compose.local.yml down 官方部署说明里也给了 local 版这组常用命令,并强调 local 版最方便整目录迁移和备份。 4 个帖子 - 4 位参与者 阅读完整话题
正常模式下 左侧是文件目录树,右侧是AI对话。 SOLO模式下 非要把这俩反过来,还不能手动改。 5 个帖子 - 4 位参与者 阅读完整话题
今天用 ccs 配置了geminicli,但是运行的时候发现一个问题,一旦根目录有.env这种环境变量的文件,他就跟卡死了一样,半天不回答。但是把.env文件删掉就可以正常使用,这个要怎么弄呢,捣鼓了半天,一直以为是我的配置问题,geminicli来回卸载安装,搞了半天 2 个帖子 - 2 位参与者 阅读完整话题
Windows Terminal 设置保留上次的 tab, settings.json 根级加: { "firstWindowPreference": "persistedWindowLayout" } 或者设置 查看 PowerShell 的配置文件位置,在 PoweShell 里执行: echo $PROFILE 输出: C:\Users\xxxx\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 把这段放进 $PROFILE ,让终端记住当前目录: # 首次使用时创建 PowerShell 配置文件 if (-not (Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force | Out-Null } # 仅在 Windows Terminal 启动时清屏 if ($env:WT_SESSION) { Clear-Host } # 保存当前已有的 prompt,后面继续沿用原来的提示符样式 if (-not $Global:__OriginalPrompt) { $Global:__OriginalPrompt = $function:prompt } function prompt { # 读取当前目录 $loc = $executionContext.SessionState.Path.CurrentLocation # 通过 OSC 9;9 把当前目录发给 Windows Terminal # 这样恢复窗口布局时,每个 tab 可以回到上次目录 [char]27 + ']9;9;' + [char]34 + $loc + [char]34 + [char]7 + (& $Global:__OriginalPrompt) } 之后正常关闭 Terminal,重开会恢复窗口布局、tab 和目录。 1 个帖子 - 1 位参与者 阅读完整话题
自Anthropic发明skills以来,我发现大家对skills是越来越青睐了,原先skills用来辅助工作 开发,后来进化出了不少新玩法啊, 什么 同事.skill , 前任.skill ,更有甚者: 张雪峰.skill (尊重逝者 ) 这些都是蒸馏玩法,属实是被玩出花来了 玩归玩,不要把这些 玩意放到工作和开发的skills目录里,因为这会增加你的skills数量,增加无用上下文,降低ai使用skills的 命中率 。 有篇paper专门分析了skills的数量-内容与准确性的关系: When Single-Agent with Skills Replace Multi-Agent Systems and When They Fail 论文用gpt-4o和gpt-4o-mini做了skills数量与选择准确率关系的实验,实验结果放在这个表里 skills数量 选择准确率 ≤ 10 > 97% 10 ~ 30 90% ~ 97% 30 ~ 50 85% ~ 93% 50 ~ 80 60% ~ 85% 80 ~ 100 45% ~ 55% 100 ~ 150 15% ~ 40% ≥ 150 < 15% 也有拟合曲线: skills数量在50个以内,选择准确率都是比较高的(当然,不同AI跑出来的结果必然不同,这里的结果仅做参考),尤其是skills在25个以内时,命中率是相当高的 我在开发中也有类似的感受,曾经我在全局skills目录里塞了不少五花八门的skills,打开cc后一问才知道,总skills数量有60+,怪不得ai经常不选我希望ai用的skills。 后来我去繁从简,精挑细选,屎里淘金,把skills数量压到了40以内。按实验结果,我为什么没有压倒20-30呢,因为上文也说了,这个实验是基于gpt-4o系列ai做的,我用的ai性能比4o强,不必对号入座。 不只是数量, 相似的skills 也会大大降低选择准确率 论文做的实验,每个skills有一个相似的“竞争者”,准确率降到~82%,有两个相似的“竞争者”,准确率骤降到 ~52%。如果有从几个功能很相似的skills里选,ai往往会遮着眼睛瞎选(ai没眼睛 说是)。 打个比方 你和你老婆晚上准备双排了,你老婆的双胞胎妹妹趁着黑灯瞎火,悄无声息地摸进来,你能分清谁是谁吗? 如果你硬上的话,我打赌要出事故的 所以, 功能相似的skills只保留一个 如果skills实在是多,怎么办呢,论文里给出了层级路由的选法,简单来说就是**“先选类别,再选skills”** 比如开发会用到 code-review , test-dirven-development , subagent-driven-development ……那么就把这些归为“开发类”,依次类推还有“写作类”,“设计类”等等。ai选择使用skills的时候,就先判别应该用什么类别,再选择具体的skills。 论文里的层级路由的实验结果显示,这个方法在大数量skills的情况下会把准确率提高小几十个百分点。 当然嘛,据我所知 claude code 现在是没有“层级路由”的实现的,只是单纯的把skills全部平铺开来,让ai选。 不过没关系,我自己对于不同类别的skills是这样处理的:建立不同的skills仓库,把杂乱的skills给划分到不同的局部仓库里,让全局skills保持简洁,装你必备的,常用的;局部仓库里装其他类别的skills,分开使用。 比如我开一个名为“WPS-skills”的仓库,wps的skills就安装在这里面,要编辑WPS的文件的时候,就在这个仓库里工作;其他仓库是没有wps的skills的。 那我说白了,总的来说就是:降低skills数量,不要出现太相似的几个skills,skills分类管理。 skills不在于多,而在于精,选择最常用的,最适合自己的skills就是 The best。 3 个帖子 - 3 位参与者 阅读完整话题
佬友们,见过个吗,今天电脑上突然多了一个这个东西, 在claude code目录下,也不敢卸载 1 个帖子 - 1 位参与者 阅读完整话题
看到 .openclaw 目录下屎山般的脚本,json,markdown,想着重新安装一遍清一清,没想到新版本引导设置添加 channel 直接出错,还得手打 channel 和 binding。 佬们,能用别更新,能用别清理。 4 个帖子 - 3 位参与者 阅读完整话题
codex没有文件目录,感觉没有cursor、antigravity好用啊,可以直接拖拽文件到会话里,直接修改调整代码,是我不太会有codex吗。求各位佬赐教一些使用技巧 17 个帖子 - 11 位参与者 阅读完整话题
我在cc中接入了qwen3.6,让他在当前目录下写代码,为啥他只是在当前对话上下文把代码写出来,让我手动创建代码文件。 7 个帖子 - 5 位参与者 阅读完整话题
就 “C:\Users\micro” 目录是歪的, 变成right对齐了 最近刚重装到 Win11 25H2, 前两天都还好的, 也没改过语言啥的 4 个帖子 - 4 位参与者 阅读完整话题
在 cli 目录下新建 update-cli.sh chmod +x update-cli.sh ./update-cli.sh 总结 (点击了解更多详细信息) 3 个帖子 - 2 位参与者 阅读完整话题
本帖使用社区开源推广,符合推广要求。我申明并遵循社区要求的以下内容: 我的帖子已经打上 开源推广 标签: 是 我的开源项目完整开源,无未开源部分: 是 我的开源项目已链接认可 LINUX DO 社区: 是 我帖子内的项目介绍,AI生成、润色内容部分已截图发出: 是 以上选择我承诺是永久有效的,接受社区和佬友监督: 是 痛点 用 Claude Code / Codex 写代码时经常碰到一个问题:想让 Agent 帮我操作某个桌面软件,但不知道它有没有 CLI,也不知道怎么装。 Agent 不能点按钮,它需要 CLI。但 CLI 的信息散落在各个官网、npm、brew 里,搜起来很累。 doesitcli.com 一个社区维护的桌面应用 CLI 目录。每个条目包含: 安装命令(官方 / 社区) Agent Skill 安装(如果有的话) 使用场景(用户能用它做什么) 开源链接、文档链接 目前收录了 35 个应用,涵盖 IDE、API 客户端、协作工具、密码管理、数据库、部署平台等。 Agent 友好 整个站为 AI Agent 优化了渐进式信息披露: 端点 大小 用途 /agent-prompt ~90 tok Agent 决策树 /llms.txt ~1.3k tok 按 category 索引 /llms-coding.txt - 只拉一个 category /cursor.md ~300 tok 单个 app 完整详情 Agent 最短路径 3 次 fetch,总共约 600 tokens 就能回答用户问题。 一行命令安装 CLI 技能(支持 Claude Code / Codex / Cursor): curl -fsSL https://doesitcli.com/install | sh 缺人贡献 YAML 目前 35 个 app 远远不够。贡献方式极简: 复制 _template.yaml 填好字段(每个字段都有注释说明) 提 PR PR 样例: #3 — add Bruno 不需要写代码,只需要填一个 YAML 文件。AI Agent 也可以提 PR(CONTRIBUTING 里有专门的 agent 规则),Merge 前会人工审核真实性。 Schema 示例: displayName: OBS Studio homepage: https://obsproject.com cliType: standalone cliInstall: - command: brew install --cask obs official: true openSourceDocsUrl: https://github.com/obsproject/obs-studio status: active categories: [media] tags: [streaming, recording, video] oneLiner: Free and open-source software for live streaming and recording. intents: - start a recording session from a shell script - configure streaming scenes programmatically 链接 GitHub: VIKI623/doesitcli 站点: doesitcli.com 全静态,CI/CD 自动部署,PR 合并即上线。MIT 协议。 布道文章: 为什么下一代 Agent OS 会以 CLI + Skills 为核心 1 个帖子 - 1 位参与者 阅读完整话题
影视资源分享(链接转自第三方金山文档) 说明:下方链接为网络公开的金山文档, 非本人创建 ,仅作资源线索分享,请自行判断内容有效性。 资源索引链接 https://www.kdocs.cn/l/ca8TvxInxpg1 链接内可能包含 影视资源名称、格式、分辨率 网盘链接及提取码(通常为阿里云盘、夸克、百度等) 解压密码或使用说明 有效期 未知(文档非本人维护,如失效请见谅) 免责与提醒 本链接仅作信息分享,不保证资源长期有效或无毒。 下载后请于24小时内删除,勿用于商业用途。 如涉及版权或侵权,请联系论坛管理员删除本贴。 1 个帖子 - 1 位参与者 阅读完整话题