| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>skill-storage · 对象存储与文件传输技能 — 未来飞马 FmodeAgent</title>
- <style>
- :root{
- --ink:#1B2559; --sub:#64748B; --line:#E2E8F0; --card:#fff; --bg:#F5F8FF;
- --accent:#5B5BD6; --accent-soft:#EEF0FF; --accent-line:#D5D9F5;
- --accent2:#7C6FF0; --grad:linear-gradient(135deg,#5B5BD6,#7C6FF0 60%,#9BB8F5);
- --ok:#1E7A46; --ok-soft:#EAF6EF; --radius:16px;
- --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
- }
- *{box-sizing:border-box}
- html,body{margin:0;padding:0}
- body{background:var(--bg);color:var(--ink);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;line-height:1.6;-webkit-font-smoothing:antialiased}
- .hero{background:var(--grad);color:#fff;padding:48px 20px 64px;text-align:center;position:relative;overflow:hidden}
- .hero::after{content:"";position:absolute;inset:0;background:radial-gradient(600px 200px at 80% 0%,rgba(255,255,255,.18),transparent 60%),radial-gradient(500px 180px at 10% 100%,rgba(255,255,255,.14),transparent 60%)}
- .hero>*{position:relative;z-index:1}
- .brand{display:flex;align-items:center;justify-content:center;gap:8px;margin-bottom:14px;font-weight:800;font-size:14px}
- .logo{width:30px;height:30px;border-radius:9px;background:rgba(255,255,255,.22);display:inline-flex;align-items:center;justify-content:center;font-size:16px}
- .hero h1{font-size:34px;margin:0 0 10px;letter-spacing:.5px}
- .hero .tag{display:inline-block;background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.3);border-radius:99px;padding:4px 16px;font-size:13px;font-weight:600}
- .hero p.sub{max-width:640px;margin:14px auto 0;font-size:15px;opacity:.92}
- .wrap{max-width:1060px;margin:-34px auto 60px;padding:0 20px;position:relative;z-index:2}
- .cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:18px;margin-top:18px}
- .card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:22px;box-shadow:0 4px 16px rgba(27,37,89,.06)}
- .card .ic{width:42px;height:42px;border-radius:12px;background:var(--accent-soft);display:flex;align-items:center;justify-content:center;font-size:20px;margin-bottom:12px;border:1px solid var(--accent-line)}
- .card h3{margin:0 0 8px;font-size:17px}
- .card p{margin:0;font-size:13.5px;color:var(--sub)}
- .card .meta{font-family:var(--mono);font-size:12px;color:var(--accent);margin-top:10px;display:block}
- .sec{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:24px;margin-top:18px;box-shadow:0 4px 16px rgba(27,37,89,.06)}
- .sec h2{margin:0 0 6px;font-size:20px}
- .sec .lead{color:var(--sub);font-size:14px;margin:0 0 16px}
- .steps{display:flex;flex-direction:column;gap:12px}
- .step{display:flex;gap:14px;align-items:flex-start}
- .step .no{flex:0 0 30px;height:30px;border-radius:9px;background:var(--grad);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:14px}
- .step b{display:block}
- .step span{color:var(--sub);font-size:13px}
- code,pre{font-family:var(--mono)}
- pre{background:#101A3A;color:#E8EDFF;border-radius:12px;padding:16px 18px;font-size:12.8px;overflow-x:auto;line-height:1.7;margin:10px 0}
- pre b{color:#A5B4FC}
- .grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:18px;margin-top:18px}
- .tool-table{width:100%;border-collapse:collapse;margin-top:12px;font-size:13px}
- .tool-table th,.tool-table td{border-bottom:1px solid var(--line);padding:10px 12px;text-align:left}
- .tool-table th{background:var(--accent-soft);color:var(--accent);font-weight:700;font-size:12px}
- .tool-table td code{background:var(--accent-soft);border-radius:5px;padding:1px 6px;font-size:12px;color:var(--accent)}
- .badge{display:inline-block;background:var(--ok-soft);color:var(--ok);border-radius:99px;padding:2px 12px;font-size:12px;font-weight:700}
- .note{background:var(--accent-soft);border:1px solid var(--accent-line);border-radius:12px;padding:14px 16px;margin-top:16px;font-size:13px;color:#3B3F76}
- footer{text-align:center;color:#94A3B8;font-size:12px;padding:8px 20px 44px}
- footer b{color:var(--accent)}
- @media(max-width:680px){.hero h1{font-size:26px}.wrap{margin-top:-24px}}
- </style>
- </head>
- <body>
- <div class="hero">
- <div class="brand"><span class="logo">F</span> 未来飞马 FmodeAgent · skill-storage</div>
- <div class="tag">AI Agent 的对象存储技能</div>
- <h1>对象存储 · 公开分享 · 大文件传输</h1>
- <p class="sub">个人级云存储 · 企业级云存储 · 大文件网关 —— 一个技能,三套能力。零配置、开箱即用、密钥永不落盘。</p>
- </div>
- <div class="wrap">
- <div class="cards">
- <div class="card">
- <div class="ic">☁️</div>
- <h3>个人级云存储</h3>
- <p>任何二进制文件(图片/音视频/HTML 报告)一键上传对象存储,拿到公网 URL 即分享即嵌入。本地零长期占用。</p>
- <span class="meta">user/<你的ID>/… → https://s3.fmode.cn/…</span>
- </div>
- <div class="card">
- <div class="ic">🏢</div>
- <h3>企业级云存储</h3>
- <p>项目级 Storage:注册项目后签发项目专属 STS,发布到 app.fmode.cn/dev/<项目>/,项目间隔离、权限收敛。</p>
- <span class="meta">dev/<ProjectID>/… → https://app.fmode.cn/…</span>
- </div>
- <div class="card">
- <div class="ic">📦</div>
- <h3>大文件传输网关</h3>
- <p>当通道限制挡住大文件(如企微 20MB),生成接收页让用户拖拽直传对象存储,再用 collect 取回。</p>
- <span class="meta">拖拽直传 · 进度条 · 槽位取回</span>
- </div>
- </div>
- <div class="sec">
- <h2>🚀 三行命令跑通</h2>
- <p class="lead">安装 skill-storage 后,无需任何 AK/SK 配置(依赖登录态,云函数签发临时上传地址):</p>
- <pre><b># 1. 自检通道</b>
- node uploader.mjs test
- <b># 2. 上传任意文件 → 拿公开 URL</b>
- node uploader.mjs put ./report.html --key report/202610/report.html
- <b># → https://s3.fmode.cn/user/<你的ID>/report/202610/report.html</b>
- <b># 3. 大文件被通道挡住?生成接收网关页发给对方</b>
- node uploader.mjs gateway ./out # 自动部署 → 输出页面 URL</pre>
- <div class="note">💡 上传即 public-read;可用 <code>--mime</code> 指定类型(HTML 直接浏览器渲染);覆盖同名 key 后 CDN 缓存 30 天,建议换新路径发布。</div>
- </div>
- <div class="sec">
- <h2>📦 一键全局安装(npm)</h2>
- <p class="lead">技能已发布到 npm,装一次即可在任何工具里调用;也支持从 Gogs 仓库直接 clone。</p>
- <pre><b># npm 全局安装</b>
- npm i -g @fmode/skill-storage
- <b># 或从仓库获取(fmode/skill-storage · Gogs)</b>
- git clone https://git.fmode.cn/fmode/skill-storage</pre>
- </div>
- <div class="sec">
- <h2>🔧 切换不同工具,让 AI 自主安装</h2>
- <p class="lead">把下面任意一段提示词丢给对应工具,它会自己为当前工具全局安装并验证 skill-storage:</p>
- <table class="tool-table">
- <tr><th>工具</th><th>提示词</th></tr>
- <tr><td><b>FmodeCode / Claude Code</b></td><td>请安装 skill-storage 技能到全局(npm i -g @fmode/skill-storage),并把它的 SKILL.md 与 scripts/ 放入你读取技能的全局位置,然后运行自检 node …/uploader.mjs test 确认通道可用,再告诉我安装结果。</td></tr>
- <tr><td><b>Codex CLI</b></td><td>请把 @fmode/skill-storage 的全局技能安装到我的 Codex 技能目录(npm 包解包后放入 ~/.codex/skills 或对应 AGENTS.md 引用),并执行 test 自检,汇报总 URL 能力。</td></tr>
- <tr><td><b>WorkBuddy / Trae / 千问</b></td><td>请在我的工作台安装 skill-storage 技能:从 https://git.fmode.cn/fmode/skill-storage 获取,把它注册为全局技能,并跑通「上传一个测试文件拿到公开 URL」的完整实测。</td></tr>
- <tr><td><b>FmodeAgent / Hermes</b></td><td>请把 /opt/data/skills/fmode-storage 或 npm 包 @fmode/skill-storage 加入我的全局技能库(skills/ 目录),并执行 node …/uploader.mjs test 自检,汇报 ok/via。</td></tr>
- <tr><td><b>Gemini CLI / 其他</b></td><td>请安装 skill-storage(npm i -g @fmode/skill-storage),将该技能的 SKILL.md 按你的技能格式注册,并用 uploader.mjs 上传一个小文件验证公开链接可访问。</td></tr>
- </table>
- <div class="note">🎯 技巧:让 AI 自安装时,告诉它「完成后自己实测一次(上传小文件拿 URL)」——它会自己验证而不是假装成功,避免装了个空壳。</div>
- </div>
- <div class="sec">
- <h2>🛡️ 安全边界</h2>
- <div class="grid2">
- <div><b>密钥零落盘</b><p style="color:var(--sub);font-size:13px">AK/SK/sessionToken/STS 永不进仓库、日志、对话。第 0 级通道由云函数保管密钥,容器只拿 5 分钟预签名地址。</p></div>
- <div><b>权限收敛</b><p style="color:var(--sub);font-size:13px">个人级强制 user/<你的ID>/ 前缀;项目级 STS 作用域仅 dev/<ProjectID>/,禁止 List/Delete。</p></div>
- <div><b>大文件网关安全</b><p style="color:var(--sub);font-size:13px">接收页不含任何密钥;每个文件独立槽位、独立预签名 URL;STS 1h 过期后页面自动失效,不沿用旧页。</p></div>
- <div><b>诚实失败</b><p style="color:var(--sub);font-size:13px">通道全失败时打印初始化向导并 exit 2,绝不伪装成功;生成页面后必须实测一次再发用户。</p></div>
- </div>
- </div>
- <div class="sec">
- <h2>📖 大文件网关:什么时候用、怎么用</h2>
- <p class="lead">平时完全不需要;只有「通过当前通道发文件被上限挡住」时才触发。</p>
- <div class="steps">
- <div class="step"><div class="no">1</div><div><b>识别触发</b><span>主通道报超限(如企微入站 20MB / 出站文件 20MB)→ 启用网关。</span></div></div>
- <div class="step"><div class="no">2</div><div><b>生成接收页</b><span><code>node uploader.mjs gateway ./out</code> → 自动部署,输出页面 URL(含当次 1h 授权)。</span></div></div>
- <div class="step"><div class="no">3</div><div><b>发给对方</b><span>把 URL 发给对方,对方浏览器拖拽/选择文件直传 OBS(不占聊天通道)。</span></div></div>
- <div class="step"><div class="no">4</div><div><b>取回</b><span><code>bash collect.sh --list</code> 看槽位;<code>--out ~/inbox</code> 下载并登记台账。</span></div></div>
- </div>
- </div>
- <div class="sec">
- <h2>🔗 相关链接</h2>
- <table class="tool-table">
- <tr><th>资源</th><th>地址</th></tr>
- <tr><td>技能仓库(Gogs)</td><td><code>https://git.fmode.cn/fmode/skill-storage</code></td></tr>
- <tr><td>npm 包</td><td><code>@fmode/skill-storage</code></td></tr>
- <tr><td>大文件网关经验页</td><td><code>https://app.fmode.cn/dev/GErSoNNP6j/bigfile-gateway.html</code></td></tr>
- <tr><td>本技能官方页</td><td><code>https://fmode.cn/skills/skill-storage/</code></td></tr>
- </table>
- </div>
- </div>
- <footer>由 <b>未来飞马 FmodeAgent</b> 提供技术支持 · <b>fmode.cn</b> · skill-storage v1.2.0</footer>
- </body>
- </html>
|