{
  "$schema": "https://bestaiskill.com/schemas/agent-install/2.json",
  "skill": "x-article-publisher",
  "built": "2026-10-26",
  "control_level": 4,
  "control_level_label": "L4 高权限",
  "capabilities": [
    "execute_command",
    "network",
    "write_file"
  ],
  "required_controls": {
    "agent": [
      "sandbox_recommended",
      "graded_authorization"
    ],
    "admin": [
      "approval_process",
      "rollback_support",
      "full_audit"
    ]
  },
  "evidence": [
    {
      "file": "scripts/",
      "summary": "Executes local script or command: python3 skills/x-article-publisher/scripts/parse_markdown.py <markdown_file"
    },
    {
      "file": "网络端点",
      "summary": "Declares external network access: Script layer: None—none of the three scripts make requests/urllib.request/httpx/socket calls"
    },
    {
      "file": "本地工作目录",
      "summary": "File read/write and artifact output: /tmp/article_html.html (SKILL.md instructs agent to write via shell redirection)"
    }
  ],
  "verification": {
    "method": "第二遍独立重读 + 换角度找茬：① 用 Python 对每条 evidence.quote 做子串校验（读原文件判 in），任何定位不到的 quote 一律剔除或改写，不硬写；② 对三个脚本与全部文档做 token 反查（requests|urllib|httpx|socket|aiohttp|curl|wget|api.twitter|api.x.com|oauth|Bearer|token|api_key|environ|getenv|.env|cookie|selenium|subprocess|os.system|eval(|exec(|pbcopy|xclip|pbpaste|powershell|clip.exe），逐个看命中行；③ find 全量枚举（含隐藏文件）核对资产面与是否有隐藏脚本，另看 .gitignore 是否掩盖文件；④ 逐个外部依赖反查真实调用点：确认 Pillow 的 import 行、mmdc/pkill 只存在于文档而无代码调用、plugin.json 的 mcp/python 声明；⑤ 功能声明 vs 实际能力对账（frontmatter 的 'Markdown file/URL' 是否真有 URL 分支、README 声称的 block_index 替换文本匹配在 SKILL.md 里是否一致、Linux 支持声明 vs copy_to_clipboard 的 else 分支）；⑥ 版本一致性对账（plugin.json version vs README/changelog 版本号与日期）；⑦ 反向验证『绝不自动发布』是否有反例（grep 发布/Post 相关指令）；⑧ 隐私面复核 SEARCH_DIRS 的搜索范围。",
    "second_pass": [
      {
        "item": "全部 evidence.quote 逐字存在性（Python 子串校验，覆盖 SKILL.md/两个 README/GUIDE/三个脚本/plugin.json/LICENSE）",
        "status": "ok",
        "detail": "所有引用均为原文精确子串，未发现 paraphrase 冒充 quote；含反斜杠的正则引用按源码原样保留。"
      },
      {
        "item": "网络调用反查（requests|urllib|httpx|socket|aiohttp|curl|wget|api.x.com|api.twitter）",
        "status": "ok",
        "detail": "仅 parse_markdown.py 的 `import urllib.parse` 与 `urllib.parse.unquote(img_path)` 命中，用途是 URL 解码文件名；无任何 HTTP 客户端。"
      },
      {
        "item": "凭证/密钥反查（token|api_key|environ|getenv|.env|cookie|oauth|Bearer）",
        "status": "discrepancy",
        "detail": "脚本层零命中，确认无凭证读取；但文档层 docs/GUIDE.md 指示 `cat ~/.claude/settings.json | grep playwright`，会读取可能含 API key 的 Claude Code 配置文件——第一遍未计入，已在 security.credential_reads 补记。"
      },
      {
        "item": "隐藏文件与额外可执行体反查（find 全清单 + .gitignore）",
        "status": "ok",
        "detail": "仓库仅 13 个非 .git 条目：3 个 py 脚本、SKILL.md、GUIDE.md、两个 README、plugin.json、LICENSE、.gitignore、skills/、docs/、.claude-plugin/；无隐藏脚本、无二进制、无混淆内容。"
      },
      {
        "item": "外部依赖调用点复核（Pillow / pyobjc / pywin32 / clip-util / mmdc / pkill / Playwright MCP）",
        "status": "ok",
        "detail": "Pillow 在 copy_to_clipboard.py 与 table_to_image.py 的 import 行可定位；mmdc 与 pkill 只出现在 SKILL.md 文档指令中，仓库无脚本调用它们；Playwright MCP 只在 plugin.json 与 SKILL.md 工具名中出现，skill 不自带驱动。"
      },
      {
        "item": "功能声明 vs 实际能力：frontmatter 宣称 'publish a Markdown file/URL to X Articles'",
        "status": "discrepancy",
        "detail": "夸大：parse_markdown.py 只有 `with open(filepath, 'r', encoding='utf-8') as f:` 与 `os.path.exists(args.file)`，仅接受本地文件，全仓库无 URL 抓取分支。若 agent 照字面接受 URL 输入，会自行引入不受控的网页内容。"
      },
      {
        "item": "定位策略一致性：SKILL.md Step 6 推荐 after_text 文本搜索 vs Critical Rules 第 5 条与 README 声称的 block_index",
        "status": "discrepancy",
        "detail": "SKILL.md 自身矛盾：Step 6 标题写 '(Text Search Positioning)' 且正文称『推荐方法: 使用 after_text 文字搜索定位，比 block_index 更直观可靠』，而同一文件 Critical Rules 写『5. Block index positioning - Use block_index for precise image/divider placement』，README 又称 v1.1 已用 block_index 替换文本匹配。agent 执行时选错策略会导致图片错位。"
      },
      {
        "item": "版本一致性：plugin.json version 与 README/changelog 版本号、日期",
        "status": "discrepancy",
        "detail": "plugin.json 为 version 1.1.0，README 顶部却写 v1.2.0；changelog 条目为 v1.2.0 (2025-01)、v1.1.0 (2025-12)、v1.0.0 (2025-12)，v1.2.0 的月份早于 v1.1.0，与 pin commit 日期 2026-01-25 也对不上，疑为文档笔误。"
      },
      {
        "item": "『绝不自动发布』是否有反例（grep 发布/Post/Publish 点击指令）",
        "status": "ok",
        "detail": "未发现点击发布按钮的指令；相反证据齐全：SKILL.md 的 '1. **NEVER publish** - Only save draft' 与 '4. Report: \"Draft saved. Review and publish manually.\"'、README 的 '- **Safe by Design**: Only saves as draft, never publishes automatically'、GUIDE 的『绝不自动发布：本 Skill 仅将内容保存为草稿，最终发布需要用户手动确认。』。该约束是 prompt 级而非技术强制（无禁用 UI 的代码）。"
      },
      {
        "item": "剪贴板副作用复核",
        "status": "ok",
        "detail": "copy_to_clipboard.py 两个平台分支都先清空剪贴板：macOS `pasteboard.clearContents()`、Windows `win32clipboard.EmptyClipboard()`，属对用户环境的直接改写，已计入 file_writes。"
      },
      {
        "item": "平台支持声明复核（Linux）",
        "status": "ok",
        "detail": "README 承认 'Linux support is still in progress'，代码侧印证：copy_image_to_clipboard / copy_html_to_clipboard 在非 darwin/win32 分支打印 'Error: Unsupported platform: ...' 并返回 False；plugin.json platforms 只有 macos。声明与实现一致。"
      },
      {
        "item": "隐私面：图片回退搜索范围",
        "status": "ok",
        "detail": "SEARCH_DIRS 只含 ~/Downloads、~/Desktop、~/Pictures 三个目录，且仅按 basename 精确匹配同名文件；命中后该文件会被上传到 X，属真实隐私外泄面，已写入 injection_surface。"
      }
    ],
    "level": 1,
    "level_label": "V1 已固定",
    "commit": "eb3197d1d8579556aea5018d5c0b141d55fc2df6",
    "sha256": "61755757ff05c8f7d6a3e10d753b8e59adf4b1cad7e21852bab74625934b16a4",
    "reviewed_by": null,
    "reviewed_at": null
  },
  "assessed_at": "2026-10-25",
  "method_version": "2.0",
  "mirror": {
    "archive": "https://skillpub.pages.dev/r2/v/2026-09-15/x-article-publisher.tar.gz",
    "sha256": "61755757ff05c8f7d6a3e10d753b8e59adf4b1cad7e21852bab74625934b16a4",
    "commit": "eb3197d1d8579556aea5018d5c0b141d55fc2df6"
  },
  "original": {
    "github": "https://github.com/wshuyi/x-article-publisher-skill/tree/main/skills/x-article-publisher",
    "path": "skills/x-article-publisher",
    "commit": "eb3197d1d8579556aea5018d5c0b141d55fc2df6"
  }
}