nos-uploader-skill
NOS 文件上传
技能安装路径约定
本 skill 的所有脚本和配置文件均位于技能安装目录下。
技能安装目录即 SKILL.md 所在的目录,以下用 $SKILL_DIR 表示。
在执行任何命令前,先通过以下方式确定 $SKILL_DIR:
# Claude Code 会将 skill 安装到 ~/.claude/skills/<skill-name>/ 目录
# 以下命令可动态获取实际路径(取 SKILL.md 的父目录)
SKILL_DIR=$(dirname "$(find ~/.claude/skills -name 'SKILL.md' -path '*/nos-uploader*' 2>/dev/null | head -1)")
echo "SKILL_DIR=$SKILL_DIR"
若输出为空或路径不存在,说明 skill 尚未安装,告知用户重新安装后重试。
配置文件路径
配置文件固定存放在 skill 目录下:
$SKILL_DIR/scripts/nos.config.json
不需要用户手动复制或在工作目录创建配置文件。
配置字段说明
| 字段 | 必填 | 默认值 | 说明 |
|---|---|---|---|
accessKey |
✅ | - | NOS Access Key |
accessSecret |
✅ | - | NOS Access Secret |
bucket |
✅ | - | NOS 桶名 |
endpoint |
否 | http://nos.netease.com |
NOS 接入点 |
baseNosUrl |
否 | https://yx-web-nosdn.netease.im/ |
CDN 域名前缀 |
directory |
否 | uploads |
存储目录前缀 |
useCustomFilename |
否 | true |
true=保留原文件名,false=只用扩展名 |
工作流
步骤 1:检查依赖
1.1 检查 node 环境:
node -v 2>/dev/null || echo "NODE_MISSING"
若输出 NODE_MISSING,立即告知用户:
❌ 未检测到 Node.js 环境,请先安装 Node.js(https://nodejs.org)后重试。
然后退出工作流,不再继续后续步骤。
1.2 检查 npm 命令:
npm -v 2>/dev/null || echo "NPM_MISSING"
若输出 NPM_MISSING,立即告知用户:
❌ 未检测到 npm 命令,请确认 Node.js 已正确安装并将 npm 加入 PATH(https://nodejs.org)。
然后退出工作流,不再继续后续步骤。
1.3 检查 SDK 是否已安装:
node -e "require('$SKILL_DIR/scripts/node_modules/@xgheaven/nos-node-sdk')" 2>/dev/null || echo "SDK_MISSING"
若输出 SDK_MISSING,在 skill 目录下自动安装依赖(使用 package.json 中锁定的版本):
cd "$SKILL_DIR/scripts" && npm install
安装完成后继续后续步骤;若安装失败,将错误信息展示给用户并退出工作流。
安装后
scripts/目录会生成node_modules/和package-lock.json,属正常现象,无需关心。
步骤 2:检查配置
读取 $SKILL_DIR/scripts/nos.config.json:
- 文件不存在 → 进入首次配置引导
- 文件存在但必填项(accessKey / accessSecret / bucket)为空 → 进入首次配置引导
- 文件存在且必填项完整 → 跳过,直接执行上传
可用以下命令检查配置文件是否存在及必填项是否完整:
CONFIG_FILE="$SKILL_DIR/scripts/nos.config.json"
if [ ! -f "$CONFIG_FILE" ]; then
echo "CONFIG_MISSING"
else
node -e "
const c = require('$CONFIG_FILE');
const missing = ['accessKey','accessSecret','bucket'].filter(k => !c[k]);
console.log(missing.length ? 'CONFIG_INCOMPLETE:' + missing.join(',') : 'CONFIG_OK');
"
fi
步骤 3:首次配置引导(配置缺失时执行)
逐一向用户提问以下字段,每次只问一个,收集完毕后一次性写入配置文件:
- "请提供您的 NOS accessKey:"
- "请提供您的 NOS accessSecret:"
- "请提供 NOS bucket(桶名):"
- "存储目录前缀是什么?(说'跳过'或'默认'则使用默认值
uploads):" - "是否保留原文件名?(说'跳过'或'默认'则使用默认值
true,即保留原文件名):"
收集完成后,将数据写入配置文件:
cat > "$SKILL_DIR/scripts/nos.config.json" << 'EOF'
{收集到的 JSON 内容}
EOF
写入后告知用户:"✅ 配置已保存,继续上传。"
步骤 4:执行上传
# 单文件
node "$SKILL_DIR/scripts/nos_upload.js" <文件路径>
# 批量上传
node "$SKILL_DIR/scripts/nos_upload.js" --files <f1> <f2> ...
# 覆盖目录(临时)
node "$SKILL_DIR/scripts/nos_upload.js" <文件路径> --directory <dir>
⚠️ 若文件路径或目录名中包含空格,请用引号包裹,例如:
node "$SKILL_DIR/scripts/nos_upload.js" "/path/to/my file.png" node "$SKILL_DIR/scripts/nos_upload.js" --files "/path/a b.png" "/path/c d.jpg"
脚本会输出每个文件的 NOS URL。
步骤 5:修改配置(用户主动触发)
当用户说"修改 NOS 配置"、"更新 accessKey"等时:
- 读取
$SKILL_DIR/scripts/nos.config.json,展示给用户确认当前值 - 询问用户要修改哪些字段
- 逐一收集新值(未修改的字段保留原值)
- 写入
$SKILL_DIR/scripts/nos.config.json,告知用户修改成功
文件路径规则
useCustomFilename = true → {baseNosUrl}/{directory}/{md5}/{filename}
useCustomFilename = false → {baseNosUrl}/{directory}/{md5}{ext}
示例:https://yx-web-nosdn.netease.im/uploads/47df6f623cfe3321c78be4c56e7d6cc4/logo.png
脚本选项说明
| 选项 | 说明 |
|---|---|
--files <f1> <f2>... |
批量上传多个文件 |
--directory <dir> |
临时覆盖配置中的 directory |
--use-custom-filename |
临时覆盖,强制保留原文件名 |
--config <path> |
指定配置文件路径(通常不需要,已固定在 skill 目录) |