skills/skills.netease.im/nos-uploader-skill

nos-uploader-skill

SKILL.md

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:首次配置引导(配置缺失时执行)

逐一向用户提问以下字段,每次只问一个,收集完毕后一次性写入配置文件:

  1. "请提供您的 NOS accessKey:"
  2. "请提供您的 NOS accessSecret:"
  3. "请提供 NOS bucket(桶名):"
  4. "存储目录前缀是什么?(说'跳过'或'默认'则使用默认值 uploads):"
  5. "是否保留原文件名?(说'跳过'或'默认'则使用默认值 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"等时:

  1. 读取 $SKILL_DIR/scripts/nos.config.json,展示给用户确认当前值
  2. 询问用户要修改哪些字段
  3. 逐一收集新值(未修改的字段保留原值)
  4. 写入 $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 目录)
Installs
1
First Seen
Apr 8, 2026